libminizinc-2.5.3/0000755000175000017500000000000013760261440012471 5ustar kaolkaollibminizinc-2.5.3/.clang-format0000644000175000017500000000073413757304533015057 0ustar kaolkaol--- BasedOnStyle: Google ColumnLimit: 100 DerivePointerAlignment: false AccessModifierOffset: -2 IncludeBlocks: Regroup IncludeCategories: - Regex: '^( */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include #include #ifdef HAS_PIDPATH #include #include #include #include #include #elif defined(HAS_GETMODULEFILENAME) || defined(HAS_GETFILEATTRIBUTES) #define NOMINMAX // Ensure the words min/max remain available #include #undef ERROR #else #include #endif #include #include #ifdef _MSC_VER #include "Shlwapi.h" #pragma comment(lib, "Shlwapi.lib") #include "Shlobj.h" #include #else #include #include #include #endif namespace MiniZinc { namespace FileUtils { #ifdef HAS_PIDPATH std::string progpath() { pid_t pid = getpid(); char path[PROC_PIDPATHINFO_MAXSIZE]; int ret = proc_pidpath(pid, path, sizeof(path)); if (ret <= 0) { return ""; } std::string p(path); size_t slash = p.find_last_of('/'); if (slash != std::string::npos) { p = p.substr(0, slash); } return p; } #elif defined(HAS_GETMODULEFILENAME) std::string progpath() { wchar_t path[MAX_PATH]; int ret = GetModuleFileNameW(nullptr, path, MAX_PATH); if (ret <= 0) { return ""; } std::string p = wide_to_utf8(path); size_t slash = p.find_last_of("/\\"); if (slash != std::string::npos) { p = p.substr(0, slash); } return p; } #else std::string progpath() { const int bufsz = 2000; char path[bufsz + 1]; ssize_t sz = readlink("/proc/self/exe", path, bufsz); if (sz < 0) { return ""; } path[sz] = '\0'; std::string p(path); size_t slash = p.find_last_of('/'); if (slash != std::string::npos) { p = p.substr(0, slash); } return p; } #endif bool file_exists(const std::string& filename) { #if defined(HAS_GETFILEATTRIBUTES) DWORD dwAttrib = GetFileAttributesW(utf8_to_wide(filename).c_str()); return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) == 0; #else struct stat info; return stat(filename.c_str(), &info) == 0 && ((info.st_mode & S_IFREG) != 0); #endif } bool directory_exists(const std::string& dirname) { #if defined(HAS_GETFILEATTRIBUTES) DWORD dwAttrib = GetFileAttributesW(utf8_to_wide(dirname).c_str()); return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0; #else struct stat info; return stat(dirname.c_str(), &info) == 0 && ((info.st_mode & S_IFDIR) != 0); #endif } std::string file_path(const std::string& filename, const std::string& basePath) { #ifdef _MSC_VER LPWSTR lpFilePart; DWORD nBufferLength = GetFullPathNameW(utf8_to_wide(filename).c_str(), 0, nullptr, &lpFilePart); auto lpBuffer = static_cast(LocalAlloc(LMEM_FIXED, sizeof(WCHAR) * nBufferLength)); if (lpBuffer == nullptr) { return ""; } std::string ret; DWORD error = GetFullPathNameW(utf8_to_wide(filename).c_str(), nBufferLength, lpBuffer, &lpFilePart); DWORD fileAttr = GetFileAttributesW(lpBuffer); DWORD lastError = GetLastError(); if (error == 0 || (fileAttr == INVALID_FILE_ATTRIBUTES && lastError != NO_ERROR)) { ret = basePath.empty() ? filename : file_path(basePath + "/" + filename); } else { ret = wide_to_utf8(lpBuffer); } LocalFree(lpBuffer); return ret; #else char* rp = realpath(filename.c_str(), nullptr); if (rp == nullptr) { if (basePath.empty()) { return filename; } return file_path(basePath + "/" + filename); } std::string rp_s(rp); free(rp); return rp_s; #endif } std::string dir_name(const std::string& filename) { #ifdef _MSC_VER size_t pos = filename.find_last_of("\\/"); return (pos == std::string::npos) ? "" : filename.substr(0, pos); #else char* fn = strdup(filename.c_str()); char* dn = dirname(fn); std::string ret(dn); free(fn); return ret; #endif } std::string base_name(const std::string& filename) { #ifdef _MSC_VER size_t pos = filename.find_last_of("\\/"); return (pos == std::string::npos) ? filename : filename.substr(pos + 1); #else char* fn = strdup(filename.c_str()); char* dn = basename(fn); std::string ret(dn); free(fn); return ret; #endif } bool is_absolute(const std::string& path) { #ifdef _MSC_VER if (path.size() > 2 && ((path[0] == '\\' && path[1] == '\\') || (path[0] == '/' && path[1] == '/'))) { return true; } return PathIsRelativeW(utf8_to_wide(path).c_str()) == FALSE; #else return path.empty() ? false : (path[0] == '/'); #endif } std::string find_executable(const std::string& filename) { if (is_absolute(filename)) { if (file_exists(filename)) { return filename; } #ifdef _MSC_VER if (FileUtils::file_exists(filename + ".exe")) { return filename + ".exe"; } if (FileUtils::file_exists(filename + ".bat")) { return filename + ".bat"; } #endif return ""; } char* path_c = getenv("PATH"); #ifdef _MSC_VER char pathsep = ';'; #else char pathsep = ':'; #endif std::string path; if (path_c != nullptr) { path = path_c; if (!path.empty()) { path += pathsep; } } path += progpath(); std::string pathItem; std::stringstream pathStream(path); while (std::getline(pathStream, pathItem, pathsep)) { std::string fileWithPath = pathItem.append("/").append(filename); if (file_exists(fileWithPath)) { return fileWithPath; } #ifdef _MSC_VER if (FileUtils::file_exists(fileWithPath + ".exe")) { return fileWithPath + ".exe"; } if (FileUtils::file_exists(fileWithPath + ".bat")) { return fileWithPath + ".bat"; } #endif } return ""; } std::vector directory_list(const std::string& dir, const std::string& ext) { std::vector entries; #ifdef _MSC_VER WIN32_FIND_DATAW findData; HANDLE hFind = ::FindFirstFileW(utf8_to_wide(dir + "/*." + ext).c_str(), &findData); if (hFind != INVALID_HANDLE_VALUE) { do { if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { entries.push_back(wide_to_utf8(findData.cFileName)); } } while (::FindNextFileW(hFind, &findData) == TRUE); ::FindClose(hFind); } #else DIR* dirp = opendir(dir.c_str()); if (dirp != nullptr) { struct dirent* dp; while ((dp = readdir(dirp)) != nullptr) { std::string fileName(dp->d_name); struct stat info; if (stat(((dir + "/").append(fileName)).c_str(), &info) == 0 && ((info.st_mode & S_IFREG) != 0)) { if (ext == "*") { entries.push_back(fileName); } else { if (fileName.size() > ext.size() + 2 && fileName.substr(fileName.size() - ext.size() - 1) == "." + ext) { entries.push_back(fileName); } } } } closedir(dirp); } #endif return entries; } std::string working_directory() { #ifdef _MSC_VER wchar_t wd[FILENAME_MAX]; if (_wgetcwd(wd, FILENAME_MAX) == FALSE) { return ""; } return wide_to_utf8(wd); #else char wd[FILENAME_MAX]; if (getcwd(wd, sizeof(wd)) == nullptr) { return ""; } return wd; #endif } std::string share_directory() { #ifdef _WIN32 if (wchar_t* MZNSTDLIBDIR = _wgetenv(L"MZN_STDLIB_DIR")) { return wide_to_utf8(MZNSTDLIBDIR); } #else if (char* MZNSTDLIBDIR = getenv("MZN_STDLIB_DIR")) { return std::string(MZNSTDLIBDIR); } #endif // NOLINTNEXTLINE(readability-redundant-string-init) std::string static_stdlib_dir(MZN_STATIC_STDLIB_DIR); if (FileUtils::file_exists(static_stdlib_dir + "/std/stdlib.mzn")) { return static_stdlib_dir; } std::string mypath = FileUtils::progpath(); int depth = 0; for (char i : mypath) { if (i == '/' || i == '\\') { depth++; } } for (int i = 0; i <= depth; i++) { if (FileUtils::file_exists(mypath + "/share/minizinc/std/stdlib.mzn")) { return mypath + "/share/minizinc"; } mypath += "/.."; } return ""; } std::string user_config_dir() { #ifdef _MSC_VER HRESULT hr; PWSTR pszPath = nullptr; hr = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &pszPath); if (SUCCEEDED(hr)) { auto configPath = wide_to_utf8(pszPath); CoTaskMemFree(pszPath); if (configPath.empty()) { return ""; } return configPath + "/MiniZinc"; } return ""; #else if (const char* hd = getenv("HOME")) { return std::string(hd) + "/.minizinc"; } return ""; #endif } std::string global_config_file() { std::string sd = share_directory(); if (sd.empty()) { return ""; } return sd + "/Preferences.json"; } std::string user_config_file() { return user_config_dir() + "/Preferences.json"; } TmpFile::TmpFile(const std::string& ext) { #ifdef _WIN32 WCHAR szTempFileName[MAX_PATH]; WCHAR lpTempPathBuffer[MAX_PATH]; bool didCopy; do { GetTempPathW(MAX_PATH, lpTempPathBuffer); GetTempFileNameW(lpTempPathBuffer, L"tmp_mzn_", 0, szTempFileName); _name = wide_to_utf8(szTempFileName); _tmpNames.push_back(_name); didCopy = CopyFileW(szTempFileName, utf8_to_wide(_name + ext).c_str(), TRUE) == TRUE; } while (!didCopy); _name += ext; #else _tmpfileDesc = -1; _name = "/tmp/mznfileXXXXXX" + ext; char* tmpfile = strndup(_name.c_str(), _name.size()); _tmpfileDesc = mkstemps(tmpfile, ext.size()); if (_tmpfileDesc == -1) { ::free(tmpfile); throw InternalError("Error occurred when creating temporary file"); } _name = std::string(tmpfile); ::free(tmpfile); #endif } TmpFile::~TmpFile() { #ifdef _WIN32 _wremove(utf8_to_wide(_name).c_str()); // TODO: Is this necessary? for (auto& n : _tmpNames) { _wremove(utf8_to_wide(n).c_str()); } #else remove(_name.c_str()); if (_tmpfileDesc != -1) { close(_tmpfileDesc); } #endif } TmpDir::TmpDir() { #ifdef _WIN32 WCHAR szTempFileName[MAX_PATH]; WCHAR lpTempPathBuffer[MAX_PATH]; GetTempPathW(MAX_PATH, lpTempPathBuffer); GetTempFileNameW(lpTempPathBuffer, L"tmp_mzn_", 0, szTempFileName); _name = wide_to_utf8(szTempFileName); DeleteFileW(szTempFileName); CreateDirectoryW(szTempFileName, nullptr); #else _name = "/tmp/mzndirXXXXXX"; char* tmpfile = strndup(_name.c_str(), _name.size()); if (mkdtemp(tmpfile) == nullptr) { ::free(tmpfile); throw InternalError("Error occurred when creating temporary directory"); } _name = std::string(tmpfile); ::free(tmpfile); #endif } #ifdef _WIN32 namespace { void remove_dir(const std::string& d) { HANDLE dh; WIN32_FIND_DATAW info; auto dw = utf8_to_wide(d); auto pattern = dw + L"\\*.*"; dh = ::FindFirstFileW(pattern.c_str(), &info); if (dh != INVALID_HANDLE_VALUE) { do { if (info.cFileName[0] != L'.') { auto fp = dw + L"\\" + info.cFileName; if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { remove_dir(wide_to_utf8(fp)); } else { ::SetFileAttributesW(fp.c_str(), FILE_ATTRIBUTE_NORMAL); ::DeleteFileW(fp.c_str()); } } } while (::FindNextFileW(dh, &info) == TRUE); } ::FindClose(dh); ::SetFileAttributesW(dw.c_str(), FILE_ATTRIBUTE_NORMAL); ::RemoveDirectoryW(dw.c_str()); } } // namespace #else namespace { int remove_file(const char* fpath, const struct stat* /*s*/, int /*i*/, struct FTW* /*ftw*/) { return unlink(fpath); } } // namespace #endif TmpDir::~TmpDir() { #ifdef _WIN32 remove_dir(_name); #else nftw(_name.c_str(), remove_file, 64, FTW_DEPTH | FTW_PHYS); rmdir(_name.c_str()); #endif } std::vector parse_cmd_line(const std::string& s) { // Break the string up at whitespace, except inside quotes, but ignore escaped quotes std::vector c; size_t cur = 0; size_t l = s.length(); std::ostringstream oss; bool inside_quote = false; bool had_escape = false; for (; cur < l; cur++) { if (inside_quote) { if (s[cur] == '"') { if (had_escape) { oss << "\""; had_escape = false; } else { inside_quote = false; } } else if (s[cur] == '\\') { had_escape = true; } else { if (had_escape) { oss << "\\"; had_escape = false; } oss << s[cur]; } } else { if (s[cur] == ' ') { if (had_escape) { oss << " "; had_escape = false; } else { c.push_back(oss.str()); oss.str(std::string()); } } else if (s[cur] == '\\') { if (had_escape) { oss << "\\"; had_escape = false; } else { had_escape = true; } } else if (s[cur] == '"') { if (had_escape) { oss << "\""; had_escape = false; } else { inside_quote = true; } } else { if (had_escape) { switch (s[cur]) { case 'a': oss << "\a"; break; case 'b': oss << "\b"; break; case 'f': oss << "\f"; break; case 'n': oss << "\n"; break; case 'r': oss << "\r"; break; case 't': oss << "\t"; break; case 'v': oss << "\v"; break; default: oss << "\\" << s[cur]; break; } had_escape = false; } else { oss << s[cur]; } } } } c.push_back(oss.str()); return c; } std::string combine_cmd_line(const std::vector& cmd) { std::ostringstream ret; for (unsigned int i = 0; i < cmd.size(); i++) { const auto& c = cmd[i]; ret << "\""; for (char i : c) { switch (i) { case '\a': ret << "\\a"; break; case '\b': ret << "\\b"; break; case '\f': ret << "\\f"; break; case '\n': ret << "\\n"; break; case '\r': ret << "\\r"; break; case '\t': ret << "\\t"; break; case '\v': ret << "\\v"; break; case '"': ret << "\\\""; break; case '\\': ret << "\\\\"; break; default: ret << i; break; } } ret << "\""; if (i < cmd.size() - 1) { ret << " "; } } return ret.str(); } void inflate_string(std::string& s) { auto* cc = reinterpret_cast(&s[0]); // autodetect compressed string if (s.size() >= 2 && ((cc[0] == 0x1F && cc[1] == 0x8B) // gzip || (cc[0] == 0x78 && (cc[1] == 0x01 // zlib || cc[1] == 0x9C || cc[1] == 0xDA)))) { const int BUF_SIZE = 1024; unsigned char s_outbuf[BUF_SIZE]; z_stream stream; std::memset(&stream, 0, sizeof(stream)); unsigned char* dataStart; int windowBits; size_t dataLen; if (cc[0] == 0x1F && cc[1] == 0x8B) { dataStart = cc + 10; windowBits = -Z_DEFAULT_WINDOW_BITS; if ((cc[3] & 0x4) != 0) { dataStart += 2; if (dataStart >= cc + s.size()) { throw(-1); } } if ((cc[3] & 0x8) != 0) { while (*dataStart != '\0') { dataStart++; if (dataStart >= cc + s.size()) { throw(-1); } } dataStart++; if (dataStart >= cc + s.size()) { throw(-1); } } if ((cc[3] & 0x10) != 0) { while (*dataStart != '\0') { dataStart++; if (dataStart >= cc + s.size()) { throw(-1); } } dataStart++; if (dataStart >= cc + s.size()) { throw(-1); } } if ((cc[3] & 0x2) != 0) { dataStart += 2; if (dataStart >= cc + s.size()) { throw(-1); } } dataLen = s.size() - (dataStart - cc); } else { dataStart = cc; windowBits = Z_DEFAULT_WINDOW_BITS; dataLen = s.size(); } stream.next_in = dataStart; stream.avail_in = static_cast(dataLen); stream.next_out = &s_outbuf[0]; stream.avail_out = BUF_SIZE; int status = inflateInit2(&stream, windowBits); if (status != Z_OK) { throw(status); } std::ostringstream oss; while (true) { status = inflate(&stream, Z_NO_FLUSH); if (status == Z_STREAM_END || (stream.avail_out == 0U)) { // output buffer full or compression finished oss << std::string(reinterpret_cast(s_outbuf), BUF_SIZE - stream.avail_out); stream.next_out = &s_outbuf[0]; stream.avail_out = BUF_SIZE; } if (status == Z_STREAM_END) { break; } if (status != Z_OK) { throw(status); } } status = inflateEnd(&stream); if (status != Z_OK) { throw(status); } s = oss.str(); } } std::string deflate_string(const std::string& s) { mz_ulong compressedLength = compressBound(static_cast(s.size())); auto* cmpr = static_cast(::malloc(compressedLength * sizeof(unsigned char))); int status = compress(cmpr, &compressedLength, reinterpret_cast(&s[0]), static_cast(s.size())); if (status != Z_OK) { ::free(cmpr); throw(status); } std::string ret(reinterpret_cast(cmpr), compressedLength); ::free(cmpr); return ret; } std::string encode_base64(const std::string& s) { base64::encoder E; std::ostringstream oss; oss << "@"; // add leading "@" to distinguish from valid MiniZinc code std::istringstream iss(s); E.encode(iss, oss); return oss.str(); } std::string decode_base64(const std::string& s) { if (s.empty() || s[0] != '@') { throw InternalError("string is not base64 encoded"); } base64::decoder D; std::ostringstream oss; std::istringstream iss(s); (void)iss.get(); // remove leading "@" D.decode(iss, oss); return oss.str(); } #ifdef _WIN32 std::string wide_to_utf8(const wchar_t* str, int size) { int buffer_size = WideCharToMultiByte(CP_UTF8, 0, str, size, nullptr, 0, nullptr, nullptr); if (buffer_size == 0) { return ""; } std::string result(buffer_size - 1, '\0'); WideCharToMultiByte(CP_UTF8, 0, str, size, &result[0], buffer_size, nullptr, nullptr); return result; } std::string wide_to_utf8(const std::wstring& str) { return wide_to_utf8(str.c_str(), -1); } std::wstring utf8_to_wide(const std::string& str) { int buffer_size = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0); if (buffer_size == 0) { return L""; } std::wstring result(buffer_size - 1, '\0'); MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &result[0], buffer_size); return result; } #endif } // namespace FileUtils } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/0000755000175000017500000000000013757304533014703 5ustar kaolkaollibminizinc-2.5.3/lib/flatten/flatten_par.cpp0000644000175000017500000000720113757304533017706 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_par(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { EE ret; if (e->type().cv()) { Ctx nctx; nctx.b = ctx.b == C_ROOT ? C_ROOT : C_MIX; try { KeepAlive ka = flat_cv_exp(env, nctx, e); ret.r = bind(env, ctx, r, ka()); ret.b = bind(env, Ctx(), b, constants().literalTrue); } catch (ResultUndefinedError&) { if (e->type().isbool()) { ret.r = bind(env, ctx, r, constants().literalFalse); ret.b = bind(env, Ctx(), b, constants().literalTrue); } else { ret.r = create_dummy_value(env, e->type()); ret.b = bind(env, Ctx(), b, constants().literalFalse); } } return ret; } if (e->type().dim() > 0) { EnvI::CSEMap::iterator it; Id* id = e->dynamicCast(); if ((id != nullptr) && (id->decl()->flat() == nullptr || id->decl()->toplevel())) { VarDecl* vd = id->decl()->flat(); if (vd == nullptr) { vd = flat_exp(env, Ctx(), id->decl(), nullptr, constants().varTrue).r()->cast()->decl(); id->decl()->flat(vd); auto* al = follow_id(vd->id())->cast(); if (al->size() == 0) { if (r == nullptr) { ret.r = al; } else { ret.r = bind(env, ctx, r, al); } ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } } ret.r = bind(env, ctx, r, e->cast()->decl()->flat()->id()); ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } if ((it = env.cseMapFind(e)) != env.cseMapEnd()) { ret.r = bind(env, ctx, r, it->second.r()->cast()->id()); ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } GCLock lock; auto* al = follow_id(eval_par(env, e))->cast(); if (al->size() == 0 || ((r != nullptr) && r->e() == nullptr)) { if (r == nullptr) { ret.r = al; } else { ret.r = bind(env, ctx, r, al); } ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } if ((it = env.cseMapFind(al)) != env.cseMapEnd()) { ret.r = bind(env, ctx, r, it->second.r()->cast()->id()); ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } std::vector ranges(al->dims()); for (unsigned int i = 0; i < ranges.size(); i++) { ranges[i] = new TypeInst(e->loc(), Type(), new SetLit(Location().introduce(), IntSetVal::a(al->min(i), al->max(i)))); } ASTExprVec ranges_v(ranges); assert(!al->type().isbot()); auto* ti = new TypeInst(e->loc(), al->type(), ranges_v, nullptr); VarDecl* vd = new_vardecl(env, ctx, ti, nullptr, nullptr, al); EE ee(vd, nullptr); env.cseMapInsert(al, ee); env.cseMapInsert(vd->e(), ee); ret.r = bind(env, ctx, r, vd->id()); ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } GCLock lock; try { ret.r = bind(env, ctx, r, eval_par(env, e)); ret.b = bind(env, Ctx(), b, constants().literalTrue); } catch (ResultUndefinedError&) { ret.r = create_dummy_value(env, e->type()); ret.b = bind(env, Ctx(), b, constants().literalFalse); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_call.cpp0000644000175000017500000013725313757304533020052 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { std::vector to_exp_vec(std::vector& v) { std::vector r(v.size()); for (auto i = static_cast(v.size()); (i--) != 0U;) { r[i] = v[i](); } return r; } bool is_total(FunctionI* fi) { return fi->ann().contains(constants().ann.promise_total); } Call* same_call(EnvI& env, Expression* e, const ASTString& id) { assert(GC::locked()); Expression* ce = follow_id(e); Call* c = Expression::dynamicCast(ce); if (c != nullptr) { if (c->id() == id) { return ce->cast(); } if (c->id() == constants().ids.int2float) { Expression* i2f = follow_id(c->arg(0)); Call* i2fc = Expression::dynamicCast(i2f); if ((i2fc != nullptr) && i2fc->id() == id && id == constants().ids.lin_exp) { ArrayLit* coeffs = eval_array_lit(env, i2fc->arg(0)); std::vector ncoeff_v(coeffs->size()); for (unsigned int i = 0; i < coeffs->size(); i++) { ncoeff_v[i] = FloatLit::a(eval_int(env, (*coeffs)[i])); } auto* ncoeff = new ArrayLit(coeffs->loc().introduce(), ncoeff_v); ncoeff->type(Type::parfloat(1)); ArrayLit* vars = eval_array_lit(env, i2fc->arg(1)); std::vector n_vars_v(vars->size()); for (unsigned int i = 0; i < vars->size(); i++) { Call* f2i = new Call((*vars)[i]->loc().introduce(), constants().ids.int2float, {(*vars)[i]}); f2i->decl(env.model->matchFn(env, f2i, false)); assert(f2i->decl()); f2i->type(Type::varfloat()); EE ee = flat_exp(env, Ctx(), f2i, nullptr, constants().varTrue); n_vars_v[i] = ee.r(); } auto* nvars = new ArrayLit(vars->loc().introduce(), n_vars_v); nvars->type(Type::varfloat(1)); FloatVal c = eval_int(env, i2fc->arg(2)); Call* nlinexp = new Call(i2fc->loc().introduce(), constants().ids.lin_exp, {ncoeff, nvars, FloatLit::a(c)}); nlinexp->decl(env.model->matchFn(env, nlinexp, false)); assert(nlinexp->decl()); nlinexp->type(Type::varfloat()); return nlinexp; } } } return nullptr; } class CmpExp { public: bool operator()(const KeepAlive& i, const KeepAlive& j) const { if (Expression::equal(i(), j())) { return false; } return i() < j(); } }; bool remove_dups(std::vector& x, bool identity) { for (auto& i : x) { i = follow_id_to_value(i()); } std::sort(x.begin(), x.end(), CmpExp()); int ci = 0; Expression* prev = nullptr; for (unsigned int i = 0; i < x.size(); i++) { if (!Expression::equal(x[i](), prev)) { prev = x[i](); if (x[i]()->isa()) { if (x[i]()->cast()->v() == identity) { // skip } else { return true; } } else { x[ci++] = x[i]; } } } x.resize(ci); return false; } bool contains_dups(std::vector& x, std::vector& y) { if (x.empty() || y.empty()) { return false; } unsigned int ix = 0; unsigned int iy = 0; for (;;) { if (x[ix]() == y[iy]()) { return true; } if (x[ix]() < y[iy]()) { ix++; } else { iy++; } if (ix == x.size() || iy == y.size()) { return false; } } } template void flatten_linexp_call(EnvI& env, Ctx ctx, const Ctx& nctx, ASTString& cid, Call* c, EE& ret, VarDecl* b, VarDecl* r, std::vector& args_ee, std::vector& args) { typedef typename LinearTraits::Val Val; Expression* al_arg = (cid == constants().ids.sum ? args_ee[0].r() : args_ee[1].r()); EE flat_al = flat_exp(env, nctx, al_arg, nullptr, nullptr); auto* al = follow_id(flat_al.r())->template cast(); KeepAlive al_ka = al; if (al->dims() > 1) { Type alt = al->type(); alt.dim(1); GCLock lock; al = new ArrayLit(al->loc(), *al); al->type(alt); al_ka = al; } Val d = (cid == constants().ids.sum ? Val(0) : LinearTraits::eval(env, args_ee[2].r())); std::vector c_coeff(al->size()); if (cid == constants().ids.sum) { for (unsigned int i = al->size(); i--;) { c_coeff[i] = 1; } } else { EE flat_coeff = flat_exp(env, nctx, args_ee[0].r(), nullptr, nullptr); auto* coeff = follow_id(flat_coeff.r())->template cast(); for (unsigned int i = coeff->size(); i--;) { c_coeff[i] = LinearTraits::eval(env, (*coeff)[i]); } } cid = constants().ids.lin_exp; std::vector coeffv; std::vector alv; for (unsigned int i = 0; i < al->size(); i++) { GCLock lock; if (Call* sc = Expression::dynamicCast(same_call(env, (*al)[i], cid))) { if (auto* alvi_decl = follow_id_to_decl((*al)[i])->template dynamicCast()) { if (alvi_decl->ti()->domain()) { // Test if the variable has tighter declared bounds than what can be inferred // from its RHS. If yes, keep the variable (don't aggregate), because the tighter // bounds are actually a constraint typename LinearTraits::Domain sc_dom = LinearTraits::evalDomain(env, alvi_decl->ti()->domain()); typename LinearTraits::Bounds sc_bounds = LinearTraits::computeBounds(env, sc); if (LinearTraits::domainTighter(sc_dom, sc_bounds)) { coeffv.push_back(c_coeff[i]); alv.emplace_back((*al)[i]); continue; } } } Val cd = c_coeff[i]; ArrayLit* sc_coeff = eval_array_lit(env, sc->arg(0)); ArrayLit* sc_al = eval_array_lit(env, sc->arg(1)); Val sc_d = LinearTraits::eval(env, sc->arg(2)); assert(sc_coeff->size() == sc_al->size()); for (unsigned int j = 0; j < sc_coeff->size(); j++) { coeffv.push_back(cd * LinearTraits::eval(env, (*sc_coeff)[j])); alv.emplace_back((*sc_al)[j]); } d += cd * sc_d; } else { coeffv.push_back(c_coeff[i]); alv.emplace_back((*al)[i]); } } simplify_lin(coeffv, alv, d); if (coeffv.empty()) { GCLock lock; ret.b = conj(env, b, Ctx(), args_ee); ret.r = bind(env, ctx, r, LinearTraits::newLit(d)); return; } if (coeffv.size() == 1 && coeffv[0] == 1 && d == 0) { ret.b = conj(env, b, Ctx(), args_ee); ret.r = bind(env, ctx, r, alv[0]()); return; } GCLock lock; std::vector coeff_ev(coeffv.size()); for (auto i = static_cast(coeff_ev.size()); i--;) { coeff_ev[i] = LinearTraits::newLit(coeffv[i]); } auto* ncoeff = new ArrayLit(Location().introduce(), coeff_ev); Type t = coeff_ev[0]->type(); t.dim(1); ncoeff->type(t); args.emplace_back(ncoeff); std::vector alv_e(alv.size()); bool al_same_as_before = alv.size() == al->size(); for (auto i = static_cast(alv.size()); i--;) { alv_e[i] = alv[i](); al_same_as_before = al_same_as_before && Expression::equal(alv_e[i], (*al)[i]); } if (al_same_as_before) { Expression* rd = follow_id_to_decl(flat_al.r()); if (rd->isa()) { rd = rd->cast()->id(); } if (rd->type().dim() > 1) { ArrayLit* al = eval_array_lit(env, rd); std::vector > dims(1); dims[0].first = 1; dims[0].second = al->size(); rd = new ArrayLit(al->loc(), *al, dims); Type t = al->type(); t.dim(1); rd->type(t); } args.emplace_back(rd); } else { auto* nal = new ArrayLit(al->loc(), alv_e); nal->type(al->type()); args.emplace_back(nal); } Lit* il = LinearTraits::newLit(d); args.push_back(il); } /// Special form of disjunction for SCIP bool is_totaladd_bounds_disj(EnvI& env, Expression* arg, Call* c_orig) { auto* pArrayLit = arg->dynamicCast(); if (nullptr == pArrayLit) { return false; } // integer bounds and vars std::vector isUBI; std::vector bndI; std::vector varI; // float bounds and vars std::vector isUBF; std::vector bndF; std::vector varF; for (unsigned int i = pArrayLit->size(); (i--) != 0U;) { auto* pId = pArrayLit->operator[](i)->dynamicCast(); if (nullptr == pId) { return false; } auto* pDecl = follow_id_to_decl(pId)->dynamicCast(); /// Checking the rhs auto* pRhs = pDecl->e(); if (nullptr == pRhs) { return false; // not checking this boolean } auto* pCall = pRhs->dynamicCast(); if (nullptr == pCall) { return false; } if (constants().ids.int_.le != pCall->id() && constants().ids.float_.le != pCall->id()) { return false; } /// See if one is a constant and one a variable Expression* pConst = nullptr; Expression* pVar = nullptr; bool fFloat = false; bool isUB = false; for (unsigned int j = pCall->argCount(); (j--) != 0U;) { if (auto* pF = pCall->arg(j)->dynamicCast()) { pConst = pF; fFloat = true; isUB = (1 == j); } else if (auto* pF = pCall->arg(j)->dynamicCast()) { pConst = pF; fFloat = false; isUB = (1 == j); } else if (auto* pId = pCall->arg(j)->dynamicCast()) { if (nullptr != pVar) { return false; // 2 variables, exit } pVar = pId; } } /// All good, add them if (fFloat) { isUBF.push_back(constants().boollit(isUB)); bndF.push_back(pConst); varF.push_back(pVar); } else { isUBI.push_back(constants().boollit(isUB)); bndI.push_back(pConst); varI.push_back(pVar); } } /// Create new call GCLock lock; auto loc = c_orig->loc().introduce(); std::vector args = {new ArrayLit(loc, isUBI), new ArrayLit(loc, bndI), new ArrayLit(loc, varI), new ArrayLit(loc, isUBF), new ArrayLit(loc, bndF), new ArrayLit(loc, varF)}; Call* c = new Call(c_orig->loc().introduce(), env.model->getFnDecls().boundsDisj.second->id(), args); c->type(Type::varbool()); c->decl(env.model->getFnDecls().boundsDisj.second); env.flatAddItem(new ConstraintI(c_orig->loc().introduce(), c)); return true; } class IgnorePartial { public: EnvI& env; bool ignorePartial; IgnorePartial(EnvI& env0, Call* c) : env(env0), ignorePartial(env.ignorePartial) { if (c->id().endsWith("_reif") || c->id().endsWith("_imp")) { env.ignorePartial = true; } } ~IgnorePartial() { env.ignorePartial = ignorePartial; } }; // NOLINTNEXTLINE(readability-function-size): TODO?? EE flatten_call(EnvI& env, const Ctx& input_ctx, Expression* e, VarDecl* r, VarDecl* b) { EE ret; Call* c = e->cast(); IgnorePartial ignorePartial(env, c); if (c->id().endsWith("_reif")) { env.counters.reifConstraints++; } else if (c->id().endsWith("_imp")) { env.counters.impConstraints++; } FunctionI* decl = env.model->matchFn(env, c, false); if (decl == nullptr) { std::ostringstream ss; ss << "undeclared function or predicate " << c->id(); throw InternalError(ss.str()); } Ctx ctx = input_ctx; Ctx nctx = ctx; nctx.neg = false; ASTString cid = c->id(); CallStackItem _csi(env, e); if (cid == constants().ids.bool2int && c->type().dim() == 0) { if (ctx.neg) { ctx.neg = false; nctx.neg = true; nctx.b = -ctx.i; } else { nctx.b = ctx.i; } } else if (cid == constants().ids.forall) { nctx.b = +nctx.b; if (ctx.neg) { ctx.neg = false; nctx.neg = true; cid = constants().ids.exists; } } else if (cid == constants().ids.exists) { nctx.b = +nctx.b; if (ctx.neg) { ctx.neg = false; nctx.neg = true; cid = constants().ids.forall; } } else if (decl->e() == nullptr && (cid == constants().ids.assert || cid == constants().ids.trace || cid == constants().ids.mzn_symmetry_breaking_constraint || cid == constants().ids.mzn_redundant_constraint || cid == constants().ids.mzn_deprecate)) { if (cid == constants().ids.assert && c->argCount() == 2) { (void)decl->builtins.b(env, c); ret = flat_exp(env, ctx, constants().literalTrue, r, b); } else { KeepAlive callres = decl->builtins.e(env, c); ret = flat_exp(env, ctx, callres(), r, b); // This is all we need to do for assert, so break out of the E_CALL } return ret; } else if ((decl->e() != nullptr) && ctx.b == C_ROOT && decl->e()->isa() && eval_bool(env, decl->e())) { bool allBool = true; for (unsigned int i = 0; i < c->argCount(); i++) { if (c->arg(i)->type().bt() != Type::BT_BOOL) { allBool = false; break; } } if (allBool) { ret.r = bind(env, ctx, r, constants().literalTrue); ret.b = bind(env, ctx, b, constants().literalTrue); return ret; } } if (ctx.b == C_ROOT && decl->e() == nullptr && cid == constants().ids.forall && r == constants().varTrue) { ret.b = bind(env, ctx, b, constants().literalTrue); ArrayLit* al; if (c->arg(0)->isa()) { al = c->arg(0)->cast(); } else { EE flat_al = flat_exp(env, Ctx(), c->arg(0), constants().varIgnore, constants().varTrue); al = follow_id(flat_al.r())->cast(); } nctx.b = C_ROOT; for (unsigned int i = 0; i < al->size(); i++) { (void)flat_exp(env, nctx, (*al)[i], r, b); } ret.r = bind(env, ctx, r, constants().literalTrue); } else { if ((decl->e() != nullptr) && decl->params().size() == 1 && decl->e()->isa() && decl->params()[0]->ti()->domain() == nullptr && decl->e()->cast()->decl() == decl->params()[0]) { Expression* arg = c->arg(0); for (ExpressionSetIter esi = decl->e()->ann().begin(); esi != decl->e()->ann().end(); ++esi) { arg->addAnnotation(*esi); } for (ExpressionSetIter esi = c->ann().begin(); esi != c->ann().end(); ++esi) { arg->addAnnotation(*esi); } ret = flat_exp(env, ctx, c->arg(0), r, b); return ret; } std::vector args_ee(c->argCount()); bool isPartial = false; if (cid == constants().ids.lin_exp && c->type().isint()) { // Linear expressions need special context handling: // the context of a variable expression depends on the corresponding coefficient // flatten the coefficient array Expression* tmp = follow_id_to_decl(c->arg(0)); ArrayLit* coeffs; if (auto* vd = tmp->dynamicCast()) { tmp = vd->id(); } { CallArgItem cai(env); args_ee[0] = flat_exp(env, nctx, tmp, nullptr, nullptr); isPartial |= isfalse(env, args_ee[0].b()); coeffs = eval_array_lit(env, args_ee[0].r()); } ArrayLit* vars = eval_array_lit(env, c->arg(1)); if (vars->flat()) { args_ee[1].r = vars; args_ee[1].b = constants().varTrue; } else { CallArgItem cai(env); CallStackItem _csi(env, c->arg(1)); std::vector elems_ee(vars->size()); for (unsigned int i = vars->size(); (i--) != 0U;) { Ctx argctx = nctx; argctx.i = eval_int(env, (*coeffs)[i]) < 0 ? -nctx.i : +nctx.i; elems_ee[i] = flat_exp(env, argctx, (*vars)[i], nullptr, nullptr); } std::vector elems(elems_ee.size()); for (auto i = static_cast(elems.size()); (i--) != 0U;) { elems[i] = elems_ee[i].r(); } KeepAlive ka; { GCLock lock; auto* alr = new ArrayLit(Location().introduce(), elems); alr->type(vars->type()); alr->flat(true); ka = alr; } args_ee[1].r = ka(); args_ee[1].b = conj(env, b, Ctx(), elems_ee); } { Expression* constant = follow_id_to_decl(c->arg(2)); if (auto* vd = constant->dynamicCast()) { constant = vd->id(); } CallArgItem cai(env); args_ee[2] = flat_exp(env, nctx, constant, nullptr, nullptr); isPartial |= isfalse(env, args_ee[2].b()); } } else { bool mixContext = (cid != constants().ids.forall && cid != constants().ids.exists && (cid != constants().ids.bool2int || c->type().dim() > 0) && cid != constants().ids.sum && cid != "assert" && cid != constants().varRedef->id() && cid != "mzn_reverse_map_var"); if (cid == "mzn_reverse_map_var") { env.inReverseMapVar = true; } if (cid == constants().ids.clause && c->arg(0)->isa() && c->arg(1)->isa()) { Ctx argctx = nctx; // handle negated args first, try to make them positive if (mixContext) { argctx.b = -nctx.b; } std::vector neg_args; std::vector pos_args; std::vector newPositives; bool is_subsumed = false; auto* al_neg = c->arg(1)->cast(); { CallArgItem cai(env); for (unsigned int i = 0; i < al_neg->size(); i++) { auto* bo = (*al_neg)[i]->dynamicCast(); Call* co = (*al_neg)[i]->dynamicCast(); if ((bo != nullptr) || ((co != nullptr) && (co->id() == constants().ids.forall || co->id() == constants().ids.exists || co->id() == constants().ids.clause))) { GCLock lock; UnOp* notBoe0 = new UnOp(Location().introduce(), UOT_NOT, (*al_neg)[i]); notBoe0->type(Type::varbool()); newPositives.emplace_back(notBoe0); } else { EE res = flat_exp(env, argctx, (*al_neg)[i], nullptr, constants().varTrue); if (res.r()->type().isPar()) { if (eval_bool(env, res.r())) { // this element is irrelevant } else { // this element subsumes all other elements neg_args = {res.r()}; pos_args = {}; is_subsumed = true; break; } } else { neg_args.emplace_back(res.r()); } } } } // Now process new and previous positive arguments if (mixContext) { argctx.b = +nctx.b; } auto* al_pos = c->arg(0)->cast(); for (unsigned int i = 0; i < al_pos->size(); i++) { newPositives.emplace_back((*al_pos)[i]); } { CallArgItem cai(env); for (auto& newPositive : newPositives) { EE res = flat_exp(env, argctx, newPositive(), nullptr, constants().varTrue); if (res.r()->type().isPar()) { if (!eval_bool(env, res.r())) { // this element is irrelevant } else { // this element subsumes all other elements pos_args = {res.r()}; neg_args = {}; is_subsumed = true; break; } } else { pos_args.emplace_back(res.r()); } } } GCLock lock; auto* al_new_pos = new ArrayLit(al_pos->loc(), to_exp_vec(pos_args)); al_new_pos->type(Type::varbool(1)); al_new_pos->flat(true); args_ee[0] = EE(al_new_pos, constants().literalTrue); auto* al_new_neg = new ArrayLit(al_neg->loc(), to_exp_vec(neg_args)); al_new_neg->flat(true); al_new_neg->type(Type::varbool(1)); args_ee[1] = EE(al_new_neg, constants().literalTrue); } else if ((cid == constants().ids.forall || cid == constants().ids.exists) && c->arg(0)->isa()) { bool is_conj = (cid == constants().ids.forall); Ctx argctx = nctx; if (mixContext) { argctx.b = C_MIX; } auto* al = c->arg(0)->cast(); ArrayLit* al_new; if (al->flat()) { al_new = al; } else { std::vector flat_args; CallArgItem cai(env); for (unsigned int i = 0; i < al->size(); i++) { EE res = flat_exp(env, argctx, (*al)[i], nullptr, constants().varTrue); if (res.r()->type().isPar()) { if (eval_bool(env, res.r()) == is_conj) { // this element is irrelevant } else { // this element subsumes all other elements flat_args = {res.r()}; break; } } else { flat_args.emplace_back(res.r()); } } GCLock lock; al_new = new ArrayLit(al->loc(), to_exp_vec(flat_args)); al_new->type(Type::varbool(1)); al_new->flat(true); } args_ee[0] = EE(al_new, constants().literalTrue); } else { for (unsigned int i = c->argCount(); (i--) != 0U;) { Ctx argctx = nctx; if (mixContext) { if (cid == constants().ids.clause) { argctx.b = (i == 0 ? +nctx.b : -nctx.b); } else if (c->arg(i)->type().bt() == Type::BT_BOOL) { argctx.b = C_MIX; } else if (c->arg(i)->type().bt() == Type::BT_INT) { argctx.i = C_MIX; } } else if (cid == constants().ids.sum && c->arg(i)->type().bt() == Type::BT_BOOL) { argctx.b = argctx.i; } Expression* tmp = follow_id_to_decl(c->arg(i)); if (auto* vd = tmp->dynamicCast()) { tmp = vd->id(); } CallArgItem cai(env); args_ee[i] = flat_exp(env, argctx, tmp, nullptr, nullptr); isPartial |= isfalse(env, args_ee[i].b()); } } } if (isPartial && c->type().isbool() && !c->type().isOpt()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); args_ee.resize(1); args_ee[0] = EE(nullptr, constants().literalFalse); ret.r = conj(env, r, ctx, args_ee); return ret; } std::vector args; if (decl->e() == nullptr && (cid == constants().ids.exists || cid == constants().ids.clause)) { std::vector pos_alv; std::vector neg_alv; std::vector pos_stack; std::vector neg_stack; auto* al_pos = follow_id(args_ee[0].r())->cast(); for (unsigned int i = 0; i < al_pos->size(); i++) { pos_stack.push_back((*al_pos)[i]); } if (cid == constants().ids.clause) { auto* al_neg = follow_id(args_ee[1].r())->cast(); for (unsigned int i = 0; i < al_neg->size(); i++) { neg_stack.push_back((*al_neg)[i]); } } std::unordered_set seen; while (!pos_stack.empty() || !neg_stack.empty()) { while (!pos_stack.empty()) { Expression* cur = pos_stack.back(); pos_stack.pop_back(); if (cur->isa() && seen.find(cur) != seen.end()) { pos_alv.emplace_back(cur); } else { seen.insert(cur); GCLock lock; if (Call* sc = Expression::dynamicCast(same_call(env, cur, constants().ids.exists))) { GCLock lock; ArrayLit* sc_c = eval_array_lit(env, sc->arg(0)); for (unsigned int j = 0; j < sc_c->size(); j++) { pos_stack.push_back((*sc_c)[j]); } } else if (Call* sc = Expression::dynamicCast( same_call(env, cur, constants().ids.clause))) { GCLock lock; ArrayLit* sc_c = eval_array_lit(env, sc->arg(0)); for (unsigned int j = 0; j < sc_c->size(); j++) { pos_stack.push_back((*sc_c)[j]); } sc_c = eval_array_lit(env, sc->arg(1)); for (unsigned int j = 0; j < sc_c->size(); j++) { neg_stack.push_back((*sc_c)[j]); } } else { Call* eq_call = Expression::dynamicCast(same_call(env, cur, constants().ids.bool_eq)); Call* not_call = Expression::dynamicCast(same_call(env, cur, constants().ids.bool_not)); if ((eq_call != nullptr) && Expression::equal(eq_call->arg(1), constants().literalFalse)) { neg_stack.push_back(eq_call->arg(0)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(0), constants().literalFalse)) { neg_stack.push_back(eq_call->arg(1)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(1), constants().literalTrue)) { pos_stack.push_back(eq_call->arg(0)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(0), constants().literalTrue)) { pos_stack.push_back(eq_call->arg(1)); } else if ((not_call != nullptr) && not_call->argCount() == 1) { neg_stack.push_back(not_call->arg(0)); } else if (Id* ident = cur->dynamicCast()) { if (ident->decl()->ti()->domain() != constants().literalFalse) { pos_alv.emplace_back(ident); } } else { pos_alv.emplace_back(cur); } } } } while (!neg_stack.empty()) { GCLock lock; Expression* cur = neg_stack.back(); neg_stack.pop_back(); if (cur->isa() && seen.find(cur) != seen.end()) { neg_alv.emplace_back(cur); } else { seen.insert(cur); if (Call* sc = Expression::dynamicCast(same_call(env, cur, constants().ids.forall))) { GCLock lock; ArrayLit* sc_c = eval_array_lit(env, sc->arg(0)); for (unsigned int j = 0; j < sc_c->size(); j++) { neg_stack.push_back((*sc_c)[j]); } } else { Call* eq_call = Expression::dynamicCast(same_call(env, cur, constants().ids.bool_eq)); Call* not_call = Expression::dynamicCast(same_call(env, cur, constants().ids.bool_not)); if ((eq_call != nullptr) && Expression::equal(eq_call->arg(1), constants().literalFalse)) { pos_stack.push_back(eq_call->arg(0)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(0), constants().literalFalse)) { pos_stack.push_back(eq_call->arg(1)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(1), constants().literalTrue)) { neg_stack.push_back(eq_call->arg(0)); } else if ((eq_call != nullptr) && Expression::equal(eq_call->arg(0), constants().literalTrue)) { neg_stack.push_back(eq_call->arg(1)); } else if ((not_call != nullptr) && not_call->argCount() == 1) { pos_stack.push_back(not_call->arg(0)); } else if (Id* ident = cur->dynamicCast()) { if (ident->decl()->ti()->domain() != constants().literalTrue) { neg_alv.emplace_back(ident); } } else { neg_alv.emplace_back(cur); } } } } } bool subsumed = remove_dups(pos_alv, false); subsumed = subsumed || remove_dups(neg_alv, true); subsumed = subsumed || contains_dups(pos_alv, neg_alv); if (subsumed) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalTrue); return ret; } if (neg_alv.empty()) { if (pos_alv.empty()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalFalse); return ret; } if (pos_alv.size() == 1) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, pos_alv[0]()); return ret; } GCLock lock; auto* nal = new ArrayLit(Location().introduce(), to_exp_vec(pos_alv)); nal->type(Type::varbool(1)); args.emplace_back(nal); cid = constants().ids.exists; } else { if (pos_alv.empty() && neg_alv.size() == 1) { ret.b = bind(env, Ctx(), b, constants().literalTrue); Ctx nctx = ctx; nctx.neg = !nctx.neg; nctx.b = -nctx.b; ret.r = bind(env, nctx, r, neg_alv[0]()); return ret; } GCLock lock; auto* pos_al = new ArrayLit(Location().introduce(), to_exp_vec(pos_alv)); pos_al->type(Type::varbool(1)); auto* neg_al = new ArrayLit(Location().introduce(), to_exp_vec(neg_alv)); neg_al->type(Type::varbool(1)); cid = constants().ids.clause; args.emplace_back(pos_al); args.emplace_back(neg_al); } if (C_ROOT == ctx.b && cid == constants().ids.exists) { /// Check the special bounds disjunction for SCIP /// Only in root context if (!env.model->getFnDecls().boundsDisj.first) { env.model->getFnDecls().boundsDisj.first = true; std::vector bj_t = {Type::parbool(1), Type::parint(1), Type::varint(1), Type::parbool(1), Type::parfloat(1), Type::varfloat(1)}; GCLock lock; env.model->getFnDecls().boundsDisj.second = env.model->matchFn(env, ASTString("bounds_disj"), bj_t, false); } /// When the SCIP predicate is declared only bool fBoundsDisj_Maybe = (nullptr != env.model->getFnDecls().boundsDisj.second); if (fBoundsDisj_Maybe) { if (is_totaladd_bounds_disj(env, args[0](), c)) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalTrue); return ret; } } } } else if (decl->e() == nullptr && cid == constants().ids.forall) { auto* al = follow_id(args_ee[0].r())->cast(); std::vector alv; for (unsigned int i = 0; i < al->size(); i++) { GCLock lock; if (Call* sc = Expression::dynamicCast(same_call(env, (*al)[i], cid))) { GCLock lock; ArrayLit* sc_c = eval_array_lit(env, sc->arg(0)); for (unsigned int j = 0; j < sc_c->size(); j++) { alv.emplace_back((*sc_c)[j]); } } else { alv.emplace_back((*al)[i]); } } bool subsumed = remove_dups(alv, true); if (subsumed) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalFalse); return ret; } if (alv.empty()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalTrue); return ret; } if (alv.size() == 1) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, alv[0]()); return ret; } GCLock lock; auto* nal = new ArrayLit(al->loc(), to_exp_vec(alv)); nal->type(al->type()); args.emplace_back(nal); } else if (decl->e() == nullptr && (cid == constants().ids.lin_exp || cid == constants().ids.sum)) { if (e->type().isint()) { flatten_linexp_call(env, ctx, nctx, cid, c, ret, b, r, args_ee, args); } else { flatten_linexp_call(env, ctx, nctx, cid, c, ret, b, r, args_ee, args); } if (args.empty()) { return ret; } } else { for (auto& i : args_ee) { args.emplace_back(i.r()); } } bool hadImplementation = (decl->e() != nullptr); KeepAlive cr; { GCLock lock; std::vector e_args = to_exp_vec(args); Call* cr_c = new Call(c->loc().introduce(), cid, e_args); decl = env.model->matchFn(env, cr_c, false); if (decl == nullptr) { throw FlatteningError(env, cr_c->loc(), "cannot find matching declaration"); } cr_c->type(decl->rtype(env, e_args, false)); assert(decl); cr_c->decl(decl); cr = cr_c; } if (hadImplementation && decl->e() == nullptr && (cid == constants().ids.lin_exp || cid == constants().ids.sum)) { args.clear(); if (e->type().isint()) { flatten_linexp_call(env, ctx, nctx, cid, cr()->cast(), ret, b, r, args_ee, args); } else { flatten_linexp_call(env, ctx, nctx, cid, cr()->cast(), ret, b, r, args_ee, args); } if (args.empty()) { return ret; } GCLock lock; std::vector e_args = to_exp_vec(args); Call* cr_c = new Call(c->loc().introduce(), cid, e_args); decl = env.model->matchFn(env, cr_c, false); if (decl == nullptr) { throw FlatteningError(env, cr_c->loc(), "cannot find matching declaration"); } cr_c->type(decl->rtype(env, e_args, false)); assert(decl); cr_c->decl(decl); cr = cr_c; } auto cit = env.cseMapFind(cr()); if (cit != env.cseMapEnd()) { if (env.ignorePartial) { ret.b = bind(env, Ctx(), b, constants().literalTrue); } else { args_ee.emplace_back(nullptr, cit->second.b()); ret.b = conj(env, b, Ctx(), args_ee); } ret.r = bind(env, ctx, r, cit->second.r()); } else { for (unsigned int i = 0; i < decl->params().size(); i++) { if (decl->params()[i]->type().dim() > 0) { // Check array index sets auto* al = follow_id(args[i]())->cast(); VarDecl* pi = decl->params()[i]; for (unsigned int j = 0; j < pi->ti()->ranges().size(); j++) { TypeInst* range_ti = pi->ti()->ranges()[j]; if ((range_ti->domain() != nullptr) && !range_ti->domain()->isa()) { GCLock lock; IntSetVal* isv = eval_intset(env, range_ti->domain()); if (isv->min() != al->min(j) || isv->max() != al->max(j)) { std::ostringstream oss; oss << "array index set " << (j + 1) << " of argument " << (i + 1) << " does not match declared index set"; throw FlatteningError(env, e->loc(), oss.str()); } } } } if (Expression* dom = decl->params()[i]->ti()->domain()) { if (!dom->isa()) { // May have to constrain actual argument if (args[i]()->type().bt() == Type::BT_INT) { GCLock lock; IntSetVal* isv = eval_intset(env, dom); BinOpType bot; bool needToConstrain; if (args[i]()->type().st() == Type::ST_SET) { bot = BOT_SUBSET; needToConstrain = true; } else { bot = BOT_IN; if (args[i]()->type().dim() > 0) { needToConstrain = true; } else { IntBounds ib = compute_int_bounds(env, args[i]()); needToConstrain = !ib.valid || isv->size() == 0 || ib.l < isv->min(0) || ib.u > isv->max(isv->size() - 1); } } if (needToConstrain) { GCLock lock; Expression* domconstraint; if (args[i]()->type().dim() > 0) { std::vector domargs(2); domargs[0] = args[i](); domargs[1] = dom; Call* c = new Call(Location().introduce(), "var_dom", domargs); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw InternalError("no matching declaration found for var_dom"); } domconstraint = c; } else { domconstraint = new BinOp(Location().introduce(), args[i](), bot, dom); } domconstraint->type(args[i]()->type().isPar() ? Type::parbool() : Type::varbool()); if (ctx.b == C_ROOT) { (void)flat_exp(env, Ctx(), domconstraint, constants().varTrue, constants().varTrue); } else { EE ee = flat_exp(env, Ctx(), domconstraint, nullptr, constants().varTrue); ee.b = ee.r; args_ee.push_back(ee); } } } else if (args[i]()->type().bt() == Type::BT_FLOAT) { GCLock lock; FloatSetVal* fsv = eval_floatset(env, dom); bool needToConstrain; if (args[i]()->type().dim() > 0) { needToConstrain = true; } else { FloatBounds fb = compute_float_bounds(env, args[i]()); needToConstrain = !fb.valid || fsv->size() == 0 || fb.l < fsv->min(0) || fb.u > fsv->max(fsv->size() - 1); } if (needToConstrain) { GCLock lock; Expression* domconstraint; if (args[i]()->type().dim() > 0) { std::vector domargs(2); domargs[0] = args[i](); domargs[1] = dom; Call* c = new Call(Location().introduce(), "var_dom", domargs); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw InternalError("no matching declaration found for var_dom"); } domconstraint = c; } else { domconstraint = new BinOp(Location().introduce(), args[i](), BOT_IN, dom); } domconstraint->type(args[i]()->type().isPar() ? Type::parbool() : Type::varbool()); if (ctx.b == C_ROOT) { (void)flat_exp(env, Ctx(), domconstraint, constants().varTrue, constants().varTrue); } else { EE ee = flat_exp(env, Ctx(), domconstraint, nullptr, constants().varTrue); ee.b = ee.r; args_ee.push_back(ee); } } } else if (args[i]()->type().bt() == Type::BT_BOT) { // Nothing to be done for empty arrays/sets } else { throw EvalError(env, decl->params()[i]->loc(), "domain restrictions other than int and float not supported yet"); } } } } if (cr()->type().isbool() && !cr()->type().isPar() && !cr()->type().isOpt() && (ctx.b != C_ROOT || r != constants().varTrue)) { std::vector argtypes(args.size()); for (unsigned int i = 0; i < args.size(); i++) { argtypes[i] = args[i]()->type(); } argtypes.push_back(Type::varbool()); GCLock lock; ASTString r_cid = env.reifyId(cid); FunctionI* reif_decl = env.model->matchFn(env, r_cid, argtypes, false); if ((reif_decl != nullptr) && (reif_decl->e() != nullptr)) { add_path_annotation(env, reif_decl->e()); VarDecl* reif_b; if (r == nullptr || (r != nullptr && r->e() != nullptr)) { reif_b = new_vardecl(env, Ctx(), new TypeInst(Location().introduce(), Type::varbool()), nullptr, nullptr, nullptr); add_ctx_ann(reif_b, ctx.b); if (reif_b->ti()->domain() != nullptr) { if (reif_b->ti()->domain() == constants().literalTrue) { bind(env, ctx, r, constants().literalTrue); r = constants().varTrue; ctx.b = C_ROOT; goto call_nonreif; } else { std::vector args_e(args.size() + 1); for (unsigned int i = 0; i < args.size(); i++) { args_e[i] = args[i](); } args_e[args.size()] = constants().literalFalse; Call* reif_call = new Call(Location().introduce(), r_cid, args_e); reif_call->type(Type::varbool()); reif_call->decl(reif_decl); flat_exp(env, Ctx(), reif_call, constants().varTrue, constants().varTrue); args_ee.emplace_back(nullptr, constants().literalFalse); ret.r = conj(env, r, ctx, args_ee); ret.b = bind(env, ctx, b, constants().literalTrue); return ret; } } } else { reif_b = r; } // Annotate cr() with get_path() add_path_annotation(env, cr()); reif_b->e(cr()); if (r != nullptr && r->e() != nullptr) { Ctx reif_ctx; reif_ctx.neg = ctx.neg; bind(env, reif_ctx, r, reif_b->id()); } env.voAddExp(reif_b); ret.b = bind(env, Ctx(), b, constants().literalTrue); args_ee.emplace_back(nullptr, reif_b->id()); ret.r = conj(env, nullptr, ctx, args_ee); if (!ctx.neg && !cr()->type().isAnn()) { env.cseMapInsert(cr(), ret); } return ret; } } call_nonreif: if (decl->e() == nullptr || (cr()->type().isPar() && !cr()->type().isAnn() && !decl->e()->type().cv())) { Call* cr_c = cr()->cast(); /// All builtins are total std::vector argt(cr_c->argCount()); for (auto i = static_cast(argt.size()); (i--) != 0U;) { argt[i] = cr_c->arg(i)->type(); } Type callt = decl->rtype(env, argt, false); if (callt.isPar() && callt.bt() != Type::BT_ANN) { GCLock lock; try { ret.r = bind(env, ctx, r, eval_par(env, cr_c)); ret.b = conj(env, b, Ctx(), args_ee); } catch (ResultUndefinedError&) { ret.r = create_dummy_value(env, cr_c->type()); ret.b = bind(env, Ctx(), b, constants().literalFalse); return ret; } // Do not insert into map, since par results will quickly become // garbage anyway and then disappear from the map } else if (decl->builtins.e != nullptr) { KeepAlive callres; { GCLock lock; callres = decl->builtins.e(env, cr_c); } EE res = flat_exp(env, ctx, callres(), r, b); args_ee.push_back(res); ret.b = conj(env, b, Ctx(), args_ee); add_path_annotation(env, res.r()); ret.r = bind(env, ctx, r, res.r()); if (!ctx.neg && !cr_c->type().isAnn()) { env.cseMapInsert(cr_c, ret); } } else { GCLock lock; ret.b = conj(env, b, Ctx(), args_ee); add_path_annotation(env, cr_c); ret.r = bind(env, ctx, r, cr_c); if (!ctx.neg && !cr_c->type().isAnn()) { env.cseMapInsert(cr_c, ret); } } } else { std::vector previousParameters(decl->params().size()); for (unsigned int i = decl->params().size(); (i--) != 0U;) { VarDecl* vd = decl->params()[i]; previousParameters[i] = vd->e(); vd->flat(vd); vd->e(args[i]()); } if (decl->e()->type().isbool() && !decl->e()->type().isOpt()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); if (ctx.b == C_ROOT && r == constants().varTrue) { (void)flat_exp(env, Ctx(), decl->e(), r, constants().varTrue); } else { Ctx nctx; if (!is_total(decl)) { nctx = ctx; nctx.neg = false; } EE ee = flat_exp(env, nctx, decl->e(), nullptr, constants().varTrue); ee.b = ee.r; args_ee.push_back(ee); } ret.r = conj(env, r, ctx, args_ee); } else { if (is_total(decl)) { EE ee = flat_exp(env, Ctx(), decl->e(), r, constants().varTrue); ret.r = bind(env, ctx, r, ee.r()); } else { ret = flat_exp(env, ctx, decl->e(), r, nullptr); args_ee.push_back(ret); if (decl->e()->type().dim() > 0) { auto* al = follow_id(ret.r())->cast(); assert(al->dims() == decl->e()->type().dim()); for (unsigned int i = 0; i < decl->ti()->ranges().size(); i++) { if ((decl->ti()->ranges()[i]->domain() != nullptr) && !decl->ti()->ranges()[i]->domain()->isa()) { GCLock lock; IntSetVal* isv = eval_intset(env, decl->ti()->ranges()[i]->domain()); if (al->min(i) != isv->min() || al->max(i) != isv->max()) { EE ee; ee.b = constants().literalFalse; args_ee.push_back(ee); } } } } if ((decl->ti()->domain() != nullptr) && !decl->ti()->domain()->isa()) { BinOpType bot; if (ret.r()->type().st() == Type::ST_SET) { bot = BOT_SUBSET; } else { bot = BOT_IN; } KeepAlive domconstraint; if (decl->e()->type().dim() > 0) { GCLock lock; std::vector domargs(2); domargs[0] = ret.r(); domargs[1] = decl->ti()->domain(); Call* c = new Call(Location().introduce(), "var_dom", domargs); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw InternalError("no matching declaration found for var_dom"); } domconstraint = c; } else { GCLock lock; domconstraint = new BinOp(Location().introduce(), ret.r(), bot, decl->ti()->domain()); } domconstraint()->type(ret.r()->type().isPar() ? Type::parbool() : Type::varbool()); if (ctx.b == C_ROOT) { (void)flat_exp(env, Ctx(), domconstraint(), constants().varTrue, constants().varTrue); } else { EE ee = flat_exp(env, Ctx(), domconstraint(), nullptr, constants().varTrue); ee.b = ee.r; args_ee.push_back(ee); } } } ret.b = conj(env, b, Ctx(), args_ee); } if (!ctx.neg && !cr()->type().isAnn()) { env.cseMapInsert(cr(), ret); } // Restore previous mapping for (unsigned int i = decl->params().size(); (i--) != 0U;) { VarDecl* vd = decl->params()[i]; vd->e(previousParameters[i]()); vd->flat(vd->e() != nullptr ? vd : nullptr); } } } } if (cid == "mzn_reverse_map_var") { env.inReverseMapVar = false; } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_arraylit.cpp0000644000175000017500000000275113757304533020760 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_arraylit(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; auto* al = e->cast(); if (al->flat()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, Ctx(), r, al); } else { std::vector elems_ee(al->size()); for (unsigned int i = al->size(); (i--) != 0U;) { elems_ee[i] = flat_exp(env, ctx, (*al)[i], nullptr, nullptr); } std::vector elems(elems_ee.size()); for (auto i = static_cast(elems.size()); (i--) != 0U;) { elems[i] = elems_ee[i].r(); } std::vector > dims(al->dims()); for (unsigned int i = al->dims(); (i--) != 0U;) { dims[i] = std::pair(al->min(i), al->max(i)); } KeepAlive ka; { GCLock lock; auto* alr = new ArrayLit(Location().introduce(), elems, dims); alr->type(al->type()); alr->flat(true); ka = alr; } ret.b = conj(env, b, Ctx(), elems_ee); ret.r = bind(env, Ctx(), r, ka()); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_vardecl.cpp0000644000175000017500000000476113757304533020554 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_vardecl(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; GCLock lock; if (ctx.b != C_ROOT) { throw FlatteningError(env, e->loc(), "not in root context"); } auto* v = e->cast(); VarDecl* it = v->flat(); if (it == nullptr) { TypeInst* ti = eval_typeinst(env, ctx, v); if ((ti->domain() != nullptr) && ti->domain()->isa()) { if (ti->type().bt() == Type::BT_INT && ti->type().st() == Type::ST_PLAIN) { if (eval_intset(env, ti->domain())->size() == 0) { env.fail("domain is empty"); } } else if (ti->type().bt() == Type::BT_FLOAT) { if (eval_floatset(env, ti->domain())->size() == 0) { env.fail("domain is empty"); } } } bool reuseVarId = v->type().isAnn() || (v->toplevel() && v->id()->idn() == -1 && v->id()->v().c_str()[0] != '\'' && v->id()->v().c_str()[0] != '_'); VarDecl* vd = new_vardecl(env, ctx, ti, reuseVarId ? v->id() : nullptr, v, nullptr); v->flat(vd); Ctx nctx; if ((v->e() != nullptr) && v->e()->type().bt() == Type::BT_BOOL) { nctx.b = C_MIX; } if (v->e() != nullptr) { (void)flat_exp(env, nctx, v->e(), vd, constants().varTrue); if (v->e()->type().dim() > 0) { Expression* ee = follow_id_to_decl(vd->e()); if (ee->isa()) { ee = ee->cast()->e(); } assert(ee && ee->isa()); auto* al = ee->cast(); if (vd->ti()->domain() != nullptr) { for (unsigned int i = 0; i < al->size(); i++) { if (Id* ali_id = (*al)[i]->dynamicCast()) { if (ali_id != constants().absent && ali_id->decl()->ti()->domain() == nullptr) { ali_id->decl()->ti()->domain(vd->ti()->domain()); } } } } } } ret.r = bind(env, Ctx(), r, vd->id()); } else { ret.r = bind(env, Ctx(), r, it); } ret.b = bind(env, Ctx(), b, constants().literalTrue); return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_comp.cpp0000644000175000017500000002210313757304533020060 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_comp(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; auto* c = e->cast(); KeepAlive c_ka(c); bool isvarset = false; if (c->set()) { for (int i = 0; i < c->numberOfGenerators(); i++) { Expression* g_in = c->in(i); if (g_in != nullptr) { const Type& ty_in = g_in->type(); if (ty_in == Type::varsetint()) { isvarset = true; break; } if (c->where(i) != nullptr) { if (c->where(i)->type() == Type::varbool()) { isvarset = true; break; } } } } } if (c->type().isOpt() || isvarset) { std::vector in(c->numberOfGenerators()); std::vector orig_where(c->numberOfGenerators()); std::vector where; GCLock lock; for (int i = 0; i < c->numberOfGenerators(); i++) { if (c->in(i) == nullptr) { in[i] = nullptr; orig_where[i] = c->where(i); } else { if (c->in(i)->type().isvar() && c->in(i)->type().dim() == 0) { std::vector args(1); args[0] = c->in(i); Call* ub = new Call(Location().introduce(), "ub", args); ub->type(Type::parsetint()); ub->decl(env.model->matchFn(env, ub, false)); in[i] = ub; for (int j = 0; j < c->numberOfDecls(i); j++) { auto* bo = new BinOp(Location().introduce(), c->decl(i, j)->id(), BOT_IN, c->in(i)); bo->type(Type::varbool()); where.push_back(bo); } } else { in[i] = c->in(i); } if ((c->where(i) != nullptr) && c->where(i)->type().isvar()) { // This is a generalised where clause. Split into par and var part. // The par parts can remain in where clause. The var parts are translated // into optionality constraints. if (c->where(i)->isa() && c->where(i)->cast()->op() == BOT_AND) { std::vector parWhere; std::vector todo; todo.push_back(c->where(i)->cast()); while (!todo.empty()) { BinOp* bo = todo.back(); todo.pop_back(); if (bo->rhs()->type().isPar()) { parWhere.push_back(bo->rhs()); } else if (bo->rhs()->isa() && bo->rhs()->cast()->op() == BOT_AND) { todo.push_back(bo->rhs()->cast()); } else { where.push_back(bo->rhs()); } if (bo->lhs()->type().isPar()) { parWhere.push_back(bo->lhs()); } else if (bo->lhs()->isa() && bo->lhs()->cast()->op() == BOT_AND) { todo.push_back(bo->lhs()->cast()); } else { where.push_back(bo->lhs()); } } switch (parWhere.size()) { case 0: orig_where[i] = nullptr; break; case 1: orig_where[i] = parWhere[0]; break; case 2: orig_where[i] = new BinOp(c->where(i)->loc(), parWhere[0], BOT_AND, parWhere[1]); orig_where[i]->type(Type::parbool()); break; default: { auto* parWhereAl = new ArrayLit(c->where(i)->loc(), parWhere); parWhereAl->type(Type::parbool(1)); Call* forall = new Call(c->where(i)->loc(), constants().ids.forall, {parWhereAl}); forall->type(Type::parbool()); forall->decl(env.model->matchFn(env, forall, false)); orig_where[i] = forall; break; } } } else { orig_where[i] = nullptr; where.push_back(c->where(i)); } } else { orig_where[i] = c->where(i); } } } if (!where.empty()) { Generators gs; for (int i = 0; i < c->numberOfGenerators(); i++) { std::vector vds(c->numberOfDecls(i)); for (int j = 0; j < c->numberOfDecls(i); j++) { vds[j] = c->decl(i, j); } gs.g.emplace_back(vds, in[i], orig_where[i]); } Expression* cond; if (where.size() > 1) { auto* al = new ArrayLit(Location().introduce(), where); al->type(Type::varbool(1)); std::vector args(1); args[0] = al; Call* forall = new Call(Location().introduce(), constants().ids.forall, args); forall->type(Type::varbool()); forall->decl(env.model->matchFn(env, forall, false)); cond = forall; } else { cond = where[0]; } Expression* new_e; Call* surround = env.surroundingCall(); Type ntype = c->type(); if ((surround != nullptr) && surround->id() == constants().ids.forall) { new_e = new BinOp(Location().introduce(), cond, BOT_IMPL, c->e()); new_e->type(Type::varbool()); ntype.ot(Type::OT_PRESENT); } else if ((surround != nullptr) && surround->id() == constants().ids.exists) { new_e = new BinOp(Location().introduce(), cond, BOT_AND, c->e()); new_e->type(Type::varbool()); ntype.ot(Type::OT_PRESENT); } else if ((surround != nullptr) && surround->id() == constants().ids.sum) { ITE* if_b_else_zero = new ITE(c->loc().introduce(), {cond, c->e()}, IntLit::a(0)); Type tt; tt = c->e()->type(); tt.ti(Type::TI_VAR); tt.ot(Type::OT_PRESENT); if_b_else_zero->type(tt); new_e = if_b_else_zero; ntype.ot(Type::OT_PRESENT); } else { ITE* if_b_else_absent = new ITE(c->loc().introduce(), {cond, c->e()}, constants().absent); Type tt; tt = c->e()->type(); tt.ti(Type::TI_VAR); tt.ot(Type::OT_OPTIONAL); if_b_else_absent->type(tt); new_e = if_b_else_absent; } auto* nc = new Comprehension(c->loc(), new_e, gs, c->set()); nc->type(ntype); c = nc; c_ka = c; } } class EvalF : public EvalBase { public: Ctx ctx; EvalF(const Ctx& ctx0) : ctx(ctx0) {} typedef EE ArrayVal; EE e(EnvI& env, Expression* e0) const { VarDecl* b = ctx.b == C_ROOT ? constants().varTrue : nullptr; VarDecl* r = (ctx.b == C_ROOT && e0->type().isbool() && !e0->type().isOpt()) ? constants().varTrue : nullptr; return flat_exp(env, ctx, e0, r, b); } static Expression* flatten(EnvI& env, Expression* e0) { return flat_exp(env, Ctx(), e0, nullptr, constants().varTrue).r(); } } _evalf(ctx); std::vector elems_ee; bool wasUndefined = false; try { elems_ee = eval_comp(env, _evalf, c); } catch (ResultUndefinedError&) { wasUndefined = true; } std::vector elems(elems_ee.size()); Type elemType = Type::bot(); bool allPar = true; bool someOpt = false; for (auto i = static_cast(elems.size()); (i--) != 0U;) { elems[i] = elems_ee[i].r(); if (elemType == Type::bot()) { elemType = elems[i]->type(); } if (!elems[i]->type().isPar()) { allPar = false; } if (elems[i]->type().isOpt()) { someOpt = true; } } if (elemType.isbot()) { elemType = c->type(); elemType.ti(Type::TI_PAR); } if (!allPar) { elemType.ti(Type::TI_VAR); } if (someOpt) { elemType.ot(Type::OT_OPTIONAL); } if (c->set()) { elemType.st(Type::ST_SET); } else { elemType.dim(c->type().dim()); } KeepAlive ka; { GCLock lock; if (c->set()) { if (c->type().isPar() && allPar) { auto* sl = new SetLit(c->loc(), elems); sl->type(elemType); Expression* slr = eval_par(env, sl); slr->type(elemType); ka = slr; } else { auto* alr = new ArrayLit(Location().introduce(), elems); elemType.st(Type::ST_PLAIN); elemType.dim(1); alr->type(elemType); alr->flat(true); Call* a2s = new Call(Location().introduce(), "array2set", {alr}); a2s->decl(env.model->matchFn(env, a2s, false)); a2s->type(a2s->decl()->rtype(env, {alr}, false)); EE ee = flat_exp(env, Ctx(), a2s, nullptr, constants().varTrue); ka = ee.r(); } } else { auto* alr = new ArrayLit(Location().introduce(), elems); alr->type(elemType); alr->flat(true); ka = alr; } } assert(!ka()->type().isbot()); if (wasUndefined) { ret.b = bind(env, Ctx(), b, constants().literalFalse); } else { ret.b = conj(env, b, Ctx(), elems_ee); } ret.r = bind(env, Ctx(), r, ka()); return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_id.cpp0000644000175000017500000002172513757304533017527 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_id(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b, bool doNotFollowChains) { CallStackItem _csi(env, e); EE ret; Id* id = e->cast(); if (id->decl() == nullptr) { if (id->type().isAnn()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, e); return ret; } throw FlatteningError(env, e->loc(), "undefined identifier"); } if (!doNotFollowChains) { Expression* id_f = follow_id_to_decl(id); if (id_f == constants().absent) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, id_f); } else { id = id_f->cast()->id(); } } if (ctx.neg && id->type().dim() > 0) { if (id->type().dim() > 1) { throw InternalError("multi-dim arrays in negative positions not supported yet"); } KeepAlive ka; { GCLock lock; std::vector gen_id(1); gen_id[0] = new VarDecl(id->loc(), new TypeInst(id->loc(), Type::parint()), env.genId(), IntLit::a(0)); /// TODO: support arbitrary dimensions std::vector idxsetargs(1); idxsetargs[0] = id; Call* idxset = new Call(id->loc().introduce(), "index_set", idxsetargs); idxset->decl(env.model->matchFn(env, idxset, false)); idxset->type(idxset->decl()->rtype(env, idxsetargs, false)); Generator gen(gen_id, idxset, nullptr); std::vector idx(1); Generators gens; gens.g.push_back(gen); UnOp* aanot = new UnOp(id->loc(), UOT_NOT, nullptr); auto* cp = new Comprehension(id->loc(), aanot, gens, false); Id* bodyidx = cp->decl(0, 0)->id(); idx[0] = bodyidx; auto* aa = new ArrayAccess(id->loc(), id, idx); aanot->e(aa); Type tt = id->type(); tt.dim(0); aa->type(tt); aanot->type(aa->type()); cp->type(id->type()); ka = cp; } Ctx nctx = ctx; nctx.neg = false; ret = flat_exp(env, nctx, ka(), r, b); } else { GCLock lock; VarDecl* vd = id->decl()->flat(); Expression* rete = nullptr; if (vd == nullptr) { if (id->decl()->e() == nullptr || id->decl()->e()->type().isAnn() || id->decl()->e()->type().isvar() || id->decl()->e()->type().cv() || id->decl()->e()->type().dim() > 0) { // New top-level id, need to copy into env.m vd = flat_exp(env, Ctx(), id->decl(), nullptr, constants().varTrue).r()->cast()->decl(); } else { vd = id->decl(); } } ret.b = bind(env, Ctx(), b, constants().literalTrue); if (vd->e() != nullptr) { if (vd->e()->type().isPar() && vd->e()->type().dim() == 0) { rete = eval_par(env, vd->e()); if (vd->toplevel() && (vd->ti()->domain() != nullptr) && !vd->ti()->computedDomain()) { // need to check if domain includes RHS value if (vd->type() == Type::varbool()) { if (!Expression::equal(rete, vd->ti()->domain())) { env.fail(); } vd->ti()->domain(rete); } else if (vd->type() == Type::varint()) { IntSetVal* isv = eval_intset(env, vd->ti()->domain()); IntVal v = eval_int(env, rete); if (!isv->contains(v)) { env.fail(); } vd->ti()->domain(new SetLit(Location().introduce(), IntSetVal::a(v, v))); } else if (vd->type() == Type::varfloat()) { FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); FloatVal v = eval_float(env, rete); if (!fsv->contains(v)) { env.fail(); } vd->ti()->domain(new SetLit(Location().introduce(), FloatSetVal::a(v, v))); } else if (vd->type() == Type::varsetint()) { IntSetVal* isv = eval_intset(env, vd->ti()->domain()); IntSetVal* v = eval_intset(env, rete); IntSetRanges isv_r(isv); IntSetRanges v_r(v); if (!Ranges::subset(v_r, isv_r)) { env.fail(); } vd->ti()->domain(new SetLit(Location().introduce(), v)); } // If we made it to here, the new domain is equal to the RHS vd->ti()->setComputedDomain(true); } } else if (vd->e()->isa()) { rete = vd->e(); } } else if (vd->ti()->ranges().size() == 0 && (vd->ti()->domain() != nullptr) && vd->type().st() == Type::ST_PLAIN && vd->type().ot() == Type::OT_PRESENT) { if (vd->type().bt() == Type::BT_BOOL) { rete = vd->ti()->domain(); } else if (vd->type().bt() == Type::BT_INT && vd->ti()->domain()->isa() && (vd->ti()->domain()->cast()->isv() != nullptr) && vd->ti()->domain()->cast()->isv()->card() == 1) { rete = IntLit::a(vd->ti()->domain()->cast()->isv()->min()); } } else if (vd->ti()->ranges().size() > 0) { // create fresh variables and array literal std::vector > dims; IntVal asize = 1; for (unsigned int i = 0; i < vd->ti()->ranges().size(); i++) { TypeInst* ti = vd->ti()->ranges()[i]; if (ti->domain() == nullptr) { throw FlatteningError(env, ti->loc(), "array dimensions unknown"); } IntSetVal* isv = eval_intset(env, ti->domain()); if (isv->size() == 0) { dims.emplace_back(1, 0); asize = 0; } else { if (isv->size() != 1) { throw FlatteningError(env, ti->loc(), "invalid array index set"); } asize *= (isv->max(0) - isv->min(0) + 1); dims.emplace_back(static_cast(isv->min(0).toInt()), static_cast(isv->max(0).toInt())); } } Type tt = vd->ti()->type(); tt.dim(0); if (asize > Constants::max_array_size) { std::ostringstream oss; oss << "array size (" << asize << ") exceeds maximum allowed size (" << Constants::max_array_size << ")"; throw FlatteningError(env, vd->loc(), oss.str()); } std::vector elems(static_cast(asize.toInt())); for (int i = 0; i < static_cast(asize.toInt()); i++) { CallStackItem csi(env, IntLit::a(i)); auto* vti = new TypeInst(Location().introduce(), tt, vd->ti()->domain()); VarDecl* nvd = new_vardecl(env, Ctx(), vti, nullptr, vd, nullptr); elems[i] = nvd->id(); } // After introducing variables for each array element, the original domain can be // set to "computed" (since it is a consequence of the individual variable domains) vd->ti()->setComputedDomain(true); auto* al = new ArrayLit(Location().introduce(), elems, dims); al->type(vd->type()); vd->e(al); env.voAddExp(vd); EE ee; ee.r = vd; env.cseMapInsert(vd->e(), ee); } if (rete == nullptr) { if (!vd->toplevel()) { // create new VarDecl in toplevel, if decl doesnt exist yet auto it = env.cseMapFind(vd->e()); if (it == env.cseMapEnd()) { Expression* vde = follow_id(vd->e()); ArrayLit* vdea = vde != nullptr ? vde->dynamicCast() : nullptr; if ((vdea != nullptr) && vdea->size() == 0) { // Do not create names for empty arrays but return array literal directly rete = vdea; } else { VarDecl* nvd = new_vardecl(env, ctx, eval_typeinst(env, ctx, vd), nullptr, vd, nullptr); if (vd->e() != nullptr) { (void)flat_exp(env, Ctx(), vd->e(), nvd, constants().varTrue); } vd = nvd; EE ee(vd, nullptr); if (vd->e() != nullptr) { env.cseMapInsert(vd->e(), ee); } } } else { if (it->second.r()->isa()) { vd = it->second.r()->cast(); } else { rete = it->second.r(); } } } if (rete == nullptr) { if (id->type().bt() == Type::BT_ANN && (vd->e() != nullptr)) { rete = vd->e(); } else { auto* vda = vd->dynamicCast(); if ((vda != nullptr) && vda->size() == 0) { // Do not create names for empty arrays but return array literal directly rete = vda; } else { rete = vd->id(); } } } } ret.r = bind(env, ctx, r, rete); } return ret; } EE flatten_id(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { return flatten_id(env, ctx, e, r, b, false); } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_setlit.cpp0000644000175000017500000000375113757304533020436 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_setlit(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; auto* sl = e->cast(); assert(sl->isv() == nullptr && sl->fsv() == nullptr); std::vector elems_ee(sl->v().size()); for (unsigned int i = sl->v().size(); (i--) != 0U;) { elems_ee[i] = flat_exp(env, ctx, sl->v()[i], nullptr, nullptr); } std::vector elems(elems_ee.size()); bool allPar = true; bool hadOpt = false; for (auto i = static_cast(elems.size()); (i--) != 0U;) { elems[i] = elems_ee[i].r(); allPar = allPar && elems[i]->type().isPar(); hadOpt = hadOpt || elems[i]->type().isOpt(); } ret.b = conj(env, b, Ctx(), elems_ee); if (allPar) { GCLock lock; Expression* ee = eval_set_lit(env, e); ret.r = bind(env, Ctx(), r, ee); } else { GCLock lock; auto* al = new ArrayLit(sl->loc(), elems); Type al_t = Type::varint(1); if (hadOpt) { al_t.ot(Type::OT_OPTIONAL); } al->type(al_t); std::vector args(1); args[0] = al; Call* cc = new Call(sl->loc().introduce(), "array2set", args); cc->type(Type::varsetint()); FunctionI* fi = env.model->matchFn(env, cc->id(), args, false); if (fi == nullptr) { throw FlatteningError(env, cc->loc(), "cannot find matching declaration"); } assert(fi); assert(env.isSubtype(fi->rtype(env, args, false), cc->type(), false)); cc->decl(fi); EE ee = flat_exp(env, Ctx(), cc, nullptr, constants().varTrue); ret.r = bind(env, Ctx(), r, ee.r()); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_arrayaccess.cpp0000644000175000017500000002277713757304533021443 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_arrayaccess(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; auto* aa = e->cast(); KeepAlive aa_ka = aa; Ctx nctx = ctx; nctx.b = +nctx.b; nctx.neg = false; EE eev = flat_exp(env, nctx, aa->v(), nullptr, nullptr); std::vector ees; start_flatten_arrayaccess: for (unsigned int i = 0; i < aa->idx().size(); i++) { Expression* tmp = follow_id_to_decl(aa->idx()[i]); if (auto* vd = tmp->dynamicCast()) { tmp = vd->id(); } if (tmp->type().isPar()) { ArrayLit* al; if (eev.r()->isa()) { al = eev.r()->cast(); } else { Id* id = eev.r()->cast(); if (id->decl() == nullptr) { throw InternalError("undefined identifier"); } if (id->decl()->e() == nullptr) { throw InternalError("array without initialiser not supported"); } Expression* id_e = follow_id(id); if (id_e->isa()) { al = id_e->cast(); } else { throw InternalError("builtin function returning array not supported"); } } std::vector elems; std::vector idx(aa->idx().size()); std::vector > dims; std::vector newaccess; std::vector nonpar; std::vector stack; for (unsigned int j = 0; j < aa->idx().size(); j++) { Expression* tmp = follow_id_to_decl(aa->idx()[j]); if (auto* vd = tmp->dynamicCast()) { tmp = vd->id(); } if (tmp->type().isPar()) { GCLock lock; idx[j] = eval_int(env, tmp).toInt(); } else { idx[j] = al->min(j); stack.push_back(static_cast(nonpar.size())); nonpar.push_back(j); dims.emplace_back(al->min(j), al->max(j)); newaccess.push_back(aa->idx()[j]); } } if (stack.empty()) { bool success; KeepAlive ka; { GCLock lock; ka = eval_arrayaccess(env, al, idx, success); if (!success && env.inMaybePartial == 0) { ResultUndefinedError warning(env, al->loc(), "array access out of bounds"); } } ees.emplace_back(nullptr, constants().boollit(success)); ees.emplace_back(nullptr, eev.b()); if (aa->type().isbool() && !aa->type().isOpt()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ees.emplace_back(nullptr, ka()); ret.r = conj(env, r, ctx, ees); } else { ret.b = conj(env, b, ctx, ees); ret.r = bind(env, ctx, r, ka()); } return ret; } while (!stack.empty()) { int cur = stack.back(); if (cur == nonpar.size() - 1) { stack.pop_back(); for (int i = al->min(nonpar[cur]); i <= al->max(nonpar[cur]); i++) { idx[nonpar[cur]] = i; bool success; GCLock lock; Expression* al_idx = eval_arrayaccess(env, al, idx, success); if (!success) { if (env.inMaybePartial == 0) { ResultUndefinedError warning(env, al->loc(), "array access out of bounds"); } ees.emplace_back(nullptr, constants().literalFalse); ees.emplace_back(nullptr, eev.b()); if (aa->type().isbool() && !aa->type().isOpt()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = conj(env, r, ctx, ees); } else { ret.b = conj(env, b, ctx, ees); ret.r = bind(env, ctx, r, al_idx); } return ret; } elems.emplace_back(al_idx); } } else { if (idx[nonpar[cur]].toInt() == al->max(nonpar[cur])) { idx[nonpar[cur]] = al->min(nonpar[cur]); stack.pop_back(); } else { idx[nonpar[cur]]++; for (unsigned int j = cur + 1; j < nonpar.size(); j++) { stack.push_back(j); } } } } std::vector elems_e(elems.size()); for (unsigned int i = 0; i < elems.size(); i++) { elems_e[i] = elems[i](); } { GCLock lock; Expression* newal = new ArrayLit(al->loc(), elems_e, dims); Type t = al->type(); t.dim(static_cast(dims.size())); newal->type(t); eev.r = newal; auto* n_aa = new ArrayAccess(aa->loc(), newal, newaccess); n_aa->type(aa->type()); aa = n_aa; aa_ka = aa; } } } if (aa->idx().size() == 1 && aa->idx()[0]->isa()) { auto* aa_inner = aa->idx()[0]->cast(); ArrayLit* al; if (eev.r()->isa()) { al = eev.r()->cast(); } else { Id* id = eev.r()->cast(); if (id->decl() == nullptr) { throw InternalError("undefined identifier"); } if (id->decl()->e() == nullptr) { throw InternalError("array without initialiser not supported"); } al = follow_id(id)->cast(); } if (aa_inner->v()->type().isPar()) { KeepAlive ka_al_inner = flat_cv_exp(env, ctx, aa_inner->v()); auto* al_inner = ka_al_inner()->cast(); std::vector composed_e(al_inner->size()); for (unsigned int i = 0; i < al_inner->size(); i++) { GCLock lock; IntVal inner_idx = eval_int(env, (*al_inner)[i]); if (inner_idx < al->min(0) || inner_idx > al->max(0)) { goto flatten_arrayaccess; } composed_e[i] = (*al)[static_cast(inner_idx.toInt()) - al->min(0)]; } std::vector > dims(al_inner->dims()); for (int i = 0; i < al_inner->dims(); i++) { dims[i] = std::make_pair(al_inner->min(i), al_inner->max(i)); } { GCLock lock; Expression* newal = new ArrayLit(al->loc(), composed_e, dims); Type t = al->type(); t.dim(static_cast(dims.size())); newal->type(t); eev.r = newal; auto* n_aa = new ArrayAccess(aa->loc(), newal, aa_inner->idx()); n_aa->type(aa->type()); aa = n_aa; aa_ka = aa; goto start_flatten_arrayaccess; } } } flatten_arrayaccess: Ctx dimctx = ctx; dimctx.neg = false; for (unsigned int i = 0; i < aa->idx().size(); i++) { Expression* tmp = follow_id_to_decl(aa->idx()[i]); if (auto* vd = tmp->dynamicCast()) { tmp = vd->id(); } ees.push_back(flat_exp(env, dimctx, tmp, nullptr, nullptr)); } ees.emplace_back(nullptr, eev.b()); bool parAccess = true; for (unsigned int i = 0; i < aa->idx().size(); i++) { if (!ees[i].r()->type().isPar()) { parAccess = false; break; } } if (parAccess) { ArrayLit* al; if (eev.r()->isa()) { al = eev.r()->cast(); } else { Id* id = eev.r()->cast(); if (id->decl() == nullptr) { throw InternalError("undefined identifier"); } if (id->decl()->e() == nullptr) { throw InternalError("array without initialiser not supported"); } al = follow_id(id)->cast(); } KeepAlive ka; bool success; { GCLock lock; std::vector dims(aa->idx().size()); for (unsigned int i = aa->idx().size(); (i--) != 0U;) { dims[i] = eval_int(env, ees[i].r()); } ka = eval_arrayaccess(env, al, dims, success); } if (!success && env.inMaybePartial == 0) { ResultUndefinedError warning(env, al->loc(), "array access out of bounds"); } ees.emplace_back(nullptr, constants().boollit(success)); if (aa->type().isbool() && !aa->type().isOpt()) { ret.b = bind(env, Ctx(), b, constants().literalTrue); ees.emplace_back(nullptr, ka()); ret.r = conj(env, r, ctx, ees); } else { ret.b = conj(env, b, ctx, ees); ret.r = bind(env, ctx, r, ka()); } } else { std::vector args(aa->idx().size() + 1); for (unsigned int i = aa->idx().size(); (i--) != 0U;) { args[i] = ees[i].r(); } args[aa->idx().size()] = eev.r(); KeepAlive ka; { GCLock lock; Call* cc = new Call(e->loc().introduce(), constants().ids.element, args); cc->type(aa->type()); FunctionI* fi = env.model->matchFn(env, cc->id(), args, false); if (fi == nullptr) { throw FlatteningError(env, cc->loc(), "cannot find matching declaration"); } assert(fi); assert(env.isSubtype(fi->rtype(env, args, false), cc->type(), false)); cc->decl(fi); ka = cc; } Ctx elemctx = ctx; elemctx.neg = false; EE ee = flat_exp(env, elemctx, ka(), nullptr, nullptr); ees.push_back(ee); if (aa->type().isbool() && !aa->type().isOpt()) { ee.b = ee.r; ees.push_back(ee); ret.r = conj(env, r, ctx, ees); ret.b = bind(env, ctx, b, constants().boollit(!ctx.neg)); } else { ret.r = bind(env, ctx, r, ee.r()); ret.b = conj(env, b, ctx, ees); } } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_binop.cpp0000644000175000017500000014753713757304533020254 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { ASTString op_to_builtin(Expression* op_lhs, Expression* op_rhs, BinOpType bot) { std::string builtin; if (op_rhs->type().isint()) { switch (bot) { case BOT_PLUS: return constants().ids.int_.plus; case BOT_MINUS: return constants().ids.int_.minus; case BOT_MULT: return constants().ids.int_.times; case BOT_POW: return constants().ids.pow; case BOT_IDIV: return constants().ids.int_.div; case BOT_MOD: return constants().ids.int_.mod; case BOT_LE: return constants().ids.int_.lt; case BOT_LQ: return constants().ids.int_.le; case BOT_GR: return constants().ids.int_.gt; case BOT_GQ: return constants().ids.int_.ge; case BOT_EQ: return constants().ids.int_.eq; case BOT_NQ: return constants().ids.int_.ne; default: throw InternalError("not yet implemented"); } } else if (op_rhs->type().isbool()) { if (bot == BOT_EQ || bot == BOT_EQUIV) { return constants().ids.bool_eq; } builtin = "bool_"; } else if (op_rhs->type().isSet()) { builtin = "set_"; } else if (op_rhs->type().isfloat()) { switch (bot) { case BOT_PLUS: return constants().ids.float_.plus; case BOT_MINUS: return constants().ids.float_.minus; case BOT_MULT: return constants().ids.float_.times; case BOT_POW: return constants().ids.pow; case BOT_DIV: return constants().ids.float_.div; case BOT_MOD: return constants().ids.float_.mod; case BOT_LE: return constants().ids.float_.lt; case BOT_LQ: return constants().ids.float_.le; case BOT_GR: return constants().ids.float_.gt; case BOT_GQ: return constants().ids.float_.ge; case BOT_EQ: return constants().ids.float_.eq; case BOT_NQ: return constants().ids.float_.ne; default: throw InternalError("not yet implemented"); } } else if (op_rhs->type().isOpt() && (bot == BOT_EQUIV || bot == BOT_EQ)) { /// TODO: extend to all option type operators switch (op_lhs->type().bt()) { case Type::BT_BOOL: return constants().ids.bool_eq; case Type::BT_FLOAT: return constants().ids.float_.eq; case Type::BT_INT: if (op_lhs->type().st() == Type::ST_PLAIN) { return constants().ids.int_.eq; } else { return constants().ids.set_eq; } default: throw InternalError("not yet implemented"); } } else { throw InternalError("Operator not yet implemented"); } switch (bot) { case BOT_PLUS: return builtin + "plus"; case BOT_MINUS: return builtin + "minus"; case BOT_MULT: return builtin + "times"; case BOT_DIV: case BOT_IDIV: return builtin + "div"; case BOT_MOD: return builtin + "mod"; case BOT_LE: return builtin + "lt"; case BOT_LQ: return builtin + "le"; case BOT_GR: return builtin + "gt"; case BOT_GQ: return builtin + "ge"; case BOT_EQ: return builtin + "eq"; case BOT_NQ: return builtin + "ne"; case BOT_IN: return constants().ids.set_in; case BOT_SUBSET: return builtin + "subset"; case BOT_SUPERSET: return builtin + "superset"; case BOT_UNION: return builtin + "union"; case BOT_DIFF: return builtin + "diff"; case BOT_SYMDIFF: return builtin + "symdiff"; case BOT_INTERSECT: return builtin + "intersect"; case BOT_PLUSPLUS: case BOT_DOTDOT: throw InternalError("not yet implemented"); case BOT_EQUIV: return builtin + "eq"; case BOT_IMPL: return builtin + "le"; case BOT_RIMPL: return builtin + "ge"; case BOT_OR: return builtin + "or"; case BOT_AND: return builtin + "and"; case BOT_XOR: return constants().ids.bool_xor; default: assert(false); return ASTString(); } } ASTString op_to_id(BinOpType bot) { switch (bot) { case BOT_PLUS: return ASTString("'+'"); case BOT_MINUS: return ASTString("'-'"); case BOT_MULT: return ASTString("'*'"); case BOT_DIV: return ASTString("'/'"); case BOT_IDIV: return ASTString("'div'"); case BOT_MOD: return ASTString("'mod'"); case BOT_LE: return ASTString("'<'"); case BOT_LQ: return ASTString("'<='"); case BOT_GR: return ASTString("'>'"); case BOT_GQ: return ASTString("'>='"); case BOT_EQ: return ASTString("'='"); case BOT_NQ: return ASTString("'!='"); case BOT_IN: return ASTString("'in'"); case BOT_SUBSET: return ASTString("'subset'"); case BOT_SUPERSET: return ASTString("'superset'"); case BOT_UNION: return ASTString("'union'"); case BOT_DIFF: return ASTString("'diff'"); case BOT_SYMDIFF: return ASTString("'symdiff'"); case BOT_INTERSECT: return ASTString("'intersect'"); case BOT_PLUSPLUS: return ASTString("'++'"); case BOT_DOTDOT: return ASTString("'..'"); case BOT_EQUIV: return ASTString("'<->'"); case BOT_IMPL: return ASTString("'->'"); case BOT_RIMPL: return ASTString("'<-'"); case BOT_OR: return ASTString("'\\/'"); case BOT_AND: return ASTString("'/\\'"); case BOT_XOR: return ASTString("'xor'"); default: assert(false); return ASTString(""); } } bool is_reverse_map(BinOp* e) { return e->ann().contains(constants().ann.is_reverse_map); } template void collect_linexps(EnvI& env, typename LinearTraits::Val in_c, Expression* exp, std::vector::Val>& coeffs, std::vector& vars, typename LinearTraits::Val& constval) { typedef typename LinearTraits::Val Val; struct StackItem { Expression* e; Val c; StackItem(Expression* e0, Val c0) : e(e0), c(c0) {} }; std::vector stack; stack.push_back(StackItem(exp, in_c)); while (!stack.empty()) { Expression* e = stack.back().e; Val c = stack.back().c; stack.pop_back(); if (e == nullptr) { continue; } if (e->type().isPar()) { constval += c * LinearTraits::eval(env, e); } else if (Lit* l = e->dynamicCast()) { constval += c * l->v(); } else if (auto* bo = e->dynamicCast()) { switch (bo->op()) { case BOT_PLUS: stack.push_back(StackItem(bo->lhs(), c)); stack.push_back(StackItem(bo->rhs(), c)); break; case BOT_MINUS: stack.push_back(StackItem(bo->lhs(), c)); stack.push_back(StackItem(bo->rhs(), -c)); break; case BOT_MULT: if (bo->lhs()->type().isPar()) { stack.push_back(StackItem(bo->rhs(), c * LinearTraits::eval(env, bo->lhs()))); } else if (bo->rhs()->type().isPar()) { stack.push_back(StackItem(bo->lhs(), c * LinearTraits::eval(env, bo->rhs()))); } else { coeffs.push_back(c); vars.emplace_back(e); } break; case BOT_DIV: if (bo->rhs()->isa() && bo->rhs()->cast()->v() == 1.0) { stack.push_back(StackItem(bo->lhs(), c)); } else { coeffs.push_back(c); vars.emplace_back(e); } break; case BOT_IDIV: if (bo->rhs()->isa() && bo->rhs()->cast()->v() == 1) { stack.push_back(StackItem(bo->lhs(), c)); } else { coeffs.push_back(c); vars.emplace_back(e); } break; default: coeffs.push_back(c); vars.emplace_back(e); break; } // } else if (Call* call = e->dynamicCast()) { // /// TODO! Handle sum, lin_exp (maybe not that important?) } else { coeffs.push_back(c); vars.emplace_back(e); } } } template KeepAlive mklinexp(EnvI& env, typename LinearTraits::Val c0, typename LinearTraits::Val c1, Expression* e0, Expression* e1) { typedef typename LinearTraits::Val Val; GCLock lock; std::vector coeffs; std::vector vars; Val constval = 0; collect_linexps(env, c0, e0, coeffs, vars, constval); collect_linexps(env, c1, e1, coeffs, vars, constval); simplify_lin(coeffs, vars, constval); KeepAlive ka; if (coeffs.empty()) { ka = LinearTraits::newLit(constval); } else if (coeffs.size() == 1 && coeffs[0] == 1 && constval == 0) { ka = vars[0]; } else { std::vector coeffs_e(coeffs.size()); for (auto i = static_cast(coeffs.size()); i--;) { if (!LinearTraits::finite(coeffs[i])) { throw FlatteningError( env, e0->loc(), "unbounded coefficient in linear expression." " Make sure variables involved in non-linear/logical expressions have finite bounds" " in their definition or via constraints"); } coeffs_e[i] = LinearTraits::newLit(coeffs[i]); } std::vector vars_e(vars.size()); for (auto i = static_cast(vars.size()); i--;) { vars_e[i] = vars[i](); } std::vector args(3); args[0] = new ArrayLit(e0->loc(), coeffs_e); Type t = coeffs_e[0]->type(); t.dim(1); args[0]->type(t); args[1] = new ArrayLit(e0->loc(), vars_e); Type tt = vars_e[0]->type(); tt.dim(1); args[1]->type(tt); args[2] = LinearTraits::newLit(constval); Call* c = new Call(e0->loc().introduce(), constants().ids.lin_exp, args); add_path_annotation(env, c); tt = args[1]->type(); tt.dim(0); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw FlatteningError(env, c->loc(), "cannot find matching declaration"); } c->type(c->decl()->rtype(env, args, false)); ka = c; } assert(ka()); return ka; } Call* aggregate_and_or_ops(EnvI& env, BinOp* bo, bool negateArgs, BinOpType bot) { assert(bot == BOT_AND || bot == BOT_OR); BinOpType negbot = (bot == BOT_AND ? BOT_OR : BOT_AND); typedef std::pair arg_literal; typedef std::list arg_literal_l; arg_literal_l bo_args({arg_literal(bo->lhs(), !negateArgs), arg_literal(bo->rhs(), !negateArgs)}); std::vector output_pos; std::vector output_neg; auto i = bo_args.begin(); while (i != bo_args.end()) { auto* bo_arg = i->first->dynamicCast(); UnOp* uo_arg = i->first->dynamicCast(); bool positive = i->second; if ((bo_arg != nullptr) && positive && bo_arg->op() == bot) { i->first = bo_arg->lhs(); i++; bo_args.insert(i, arg_literal(bo_arg->rhs(), true)); i--; i--; } else if ((bo_arg != nullptr) && !positive && bo_arg->op() == negbot) { i->first = bo_arg->lhs(); i++; bo_args.insert(i, arg_literal(bo_arg->rhs(), false)); i--; i--; } else if ((uo_arg != nullptr) && !positive && uo_arg->op() == UOT_NOT) { i->first = uo_arg->e(); i->second = true; } else if (bot == BOT_OR && (uo_arg != nullptr) && positive && uo_arg->op() == UOT_NOT) { output_neg.push_back(uo_arg->e()); i++; } else { if (positive) { output_pos.push_back(i->first); } else { output_neg.push_back(i->first); } i++; } } Call* c; std::vector c_args(1); if (bot == BOT_AND) { for (auto& i : output_neg) { UnOp* neg_arg = new UnOp(i->loc(), UOT_NOT, i); neg_arg->type(i->type()); output_pos.push_back(neg_arg); } auto* al = new ArrayLit(bo->loc().introduce(), output_pos); Type al_t = bo->type(); al_t.dim(1); al->type(al_t); env.annotateFromCallStack(al); c_args[0] = al; c = new Call(bo->loc().introduce(), bot == BOT_AND ? constants().ids.forall : constants().ids.exists, c_args); } else { auto* al_pos = new ArrayLit(bo->loc().introduce(), output_pos); Type al_t = bo->type(); al_t.dim(1); al_pos->type(al_t); env.annotateFromCallStack(al_pos); c_args[0] = al_pos; if (!output_neg.empty()) { auto* al_neg = new ArrayLit(bo->loc().introduce(), output_neg); al_neg->type(al_t); env.annotateFromCallStack(al_neg); c_args.push_back(al_neg); } c = new Call(bo->loc().introduce(), output_neg.empty() ? constants().ids.exists : constants().ids.clause, c_args); } c->decl(env.model->matchFn(env, c, false)); assert(c->decl()); Type t = c->decl()->rtype(env, c_args, false); t.cv(bo->type().cv()); c->type(t); return c; } /// Return a lin_exp or id if \a e is a lin_exp or id template Expression* get_linexp(Expression* e) { for (;;) { if (e && e->eid() == Expression::E_ID && e != constants().absent) { if (e->cast()->decl()->e()) { e = e->cast()->decl()->e(); } else { break; } } else { break; } } if (e && (e->isa() || e->isa() || (e->isa() && e->cast()->id() == constants().ids.lin_exp))) { return e; } return nullptr; } template void flatten_linexp_binop(EnvI& env, const Ctx& ctx, VarDecl* r, VarDecl* b, EE& ret, Expression* le0, Expression* le1, BinOpType& bot, bool doubleNeg, std::vector& ees, std::vector& args, ASTString& callid) { typedef typename LinearTraits::Val Val; std::vector coeffv; std::vector alv; Val d = 0; Expression* le[2] = {le0, le1}; // Assign linear expression directly if one side is an Id. Id* assignTo = nullptr; if (bot == BOT_EQ && ctx.b == C_ROOT) { if (le0->isa()) { assignTo = le0->cast(); } else if (le1->isa()) { assignTo = le1->cast(); } } for (unsigned int i = 0; i < 2; i++) { Val sign = (i == 0 ? 1 : -1); if (Lit* l = le[i]->dynamicCast()) { try { d += sign * l->v(); } catch (ArithmeticError& e) { throw EvalError(env, l->loc(), e.msg()); } } else if (le[i]->isa()) { coeffv.push_back(sign); alv.emplace_back(le[i]); } else if (Call* sc = le[i]->dynamicCast()) { GCLock lock; ArrayLit* sc_coeff = eval_array_lit(env, sc->arg(0)); ArrayLit* sc_al = eval_array_lit(env, sc->arg(1)); try { d += sign * LinearTraits::eval(env, sc->arg(2)); for (unsigned int j = 0; j < sc_coeff->size(); j++) { coeffv.push_back(sign * LinearTraits::eval(env, (*sc_coeff)[j])); alv.emplace_back((*sc_al)[j]); } } catch (ArithmeticError& e) { throw EvalError(env, sc->loc(), e.msg()); } } else { throw EvalError(env, le[i]->loc(), "Internal error, unexpected expression inside linear expression"); } } simplify_lin(coeffv, alv, d); if (coeffv.empty()) { bool result; switch (bot) { case BOT_LE: result = (0 < -d); break; case BOT_LQ: result = (0 <= -d); break; case BOT_GR: result = (0 > -d); break; case BOT_GQ: result = (0 >= -d); break; case BOT_EQ: result = (0 == -d); break; case BOT_NQ: result = (0 != -d); break; default: assert(false); break; } if (doubleNeg) { result = !result; } ees[2].b = constants().boollit(result); ret.r = conj(env, r, ctx, ees); return; } if (coeffv.size() == 1 && std::abs(coeffv[0]) == 1) { if (coeffv[0] == -1) { switch (bot) { case BOT_LE: bot = BOT_GR; break; case BOT_LQ: bot = BOT_GQ; break; case BOT_GR: bot = BOT_LE; break; case BOT_GQ: bot = BOT_LQ; break; default: break; } } else { d = -d; } typename LinearTraits::Bounds ib = LinearTraits::computeBounds(env, alv[0]()); if (ib.valid) { bool failed = false; bool subsumed = false; switch (bot) { case BOT_LE: subsumed = ib.u < d; failed = ib.l >= d; break; case BOT_LQ: subsumed = ib.u <= d; failed = ib.l > d; break; case BOT_GR: subsumed = ib.l > d; failed = ib.u <= d; break; case BOT_GQ: subsumed = ib.l >= d; failed = ib.u < d; break; case BOT_EQ: subsumed = ib.l == d && ib.u == d; failed = ib.u < d || ib.l > d; break; case BOT_NQ: subsumed = ib.u < d || ib.l > d; failed = ib.l == d && ib.u == d; break; default: break; } if (doubleNeg) { std::swap(subsumed, failed); } if (subsumed) { ees[2].b = constants().literalTrue; ret.r = conj(env, r, ctx, ees); return; } if (failed) { ees[2].b = constants().literalFalse; ret.r = conj(env, r, ctx, ees); return; } } if (ctx.b == C_ROOT && alv[0]()->isa() && bot == BOT_EQ) { GCLock lock; VarDecl* vd = alv[0]()->cast()->decl(); if (vd->ti()->domain()) { typename LinearTraits::Domain domain = LinearTraits::evalDomain(env, vd->ti()->domain()); if (LinearTraits::domainContains(domain, d)) { if (!LinearTraits::domainEquals(domain, d)) { set_computed_domain(env, vd, LinearTraits::newDomain(d), false); } ret.r = bind(env, ctx, r, constants().literalTrue); } else { ret.r = bind(env, ctx, r, constants().literalFalse); } } else { set_computed_domain(env, vd, LinearTraits::newDomain(d), false); ret.r = bind(env, ctx, r, constants().literalTrue); } } else { GCLock lock; Expression* e0; Expression* e1; BinOpType old_bot = bot; Val old_d = d; switch (bot) { case BOT_LE: e0 = alv[0](); if (e0->type().isint()) { d--; bot = BOT_LQ; } e1 = LinearTraits::newLit(d); break; case BOT_GR: e1 = alv[0](); if (e1->type().isint()) { d++; bot = BOT_LQ; } else { bot = BOT_LE; } e0 = LinearTraits::newLit(d); break; case BOT_GQ: e0 = LinearTraits::newLit(d); e1 = alv[0](); bot = BOT_LQ; break; default: e0 = alv[0](); e1 = LinearTraits::newLit(d); } if (ctx.b == C_ROOT && alv[0]()->isa() && !env.hasReverseMapper(alv[0]()->cast()) && alv[0]()->cast()->decl()->ti()->domain()) { VarDecl* vd = alv[0]()->cast()->decl(); typename LinearTraits::Domain domain = LinearTraits::evalDomain(env, vd->ti()->domain()); typename LinearTraits::Domain ndomain = LinearTraits::limitDomain(old_bot, domain, old_d); if (domain && ndomain) { if (LinearTraits::domainEmpty(ndomain)) { ret.r = bind(env, ctx, r, constants().literalFalse); return; } if (!LinearTraits::domainEquals(domain, ndomain)) { ret.r = bind(env, ctx, r, constants().literalTrue); set_computed_domain(env, vd, LinearTraits::newDomain(ndomain), false); if (r == constants().varTrue) { auto* bo = new BinOp(Location().introduce(), e0, bot, e1); bo->type(Type::varbool()); std::vector boargs(2); boargs[0] = e0; boargs[1] = e1; Call* c = new Call(Location(), op_to_builtin(e0, e1, bot), boargs); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); auto it = env.cseMapFind(c); if (it != env.cseMapEnd()) { if (Id* ident = it->second.r()->template dynamicCast()) { bind(env, Ctx(), ident->decl(), constants().literalTrue); it->second.r = constants().literalTrue; } if (Id* ident = it->second.b()->template dynamicCast()) { bind(env, Ctx(), ident->decl(), constants().literalTrue); it->second.b = constants().literalTrue; } } } } return; } } args.emplace_back(e0); args.emplace_back(e1); } } else if (bot == BOT_EQ && coeffv.size() == 2 && coeffv[0] == -coeffv[1] && d == 0) { Id* id0 = alv[0]()->cast(); Id* id1 = alv[1]()->cast(); if (ctx.b == C_ROOT && r == constants().varTrue && (id0->decl()->e() == nullptr || id1->decl()->e() == nullptr)) { if (id0->decl()->e()) { (void)bind(env, ctx, id1->decl(), id0); } else { (void)bind(env, ctx, id0->decl(), id1); } } else { callid = LinearTraits::id_eq(); args.emplace_back(alv[0]()); args.emplace_back(alv[1]()); } } else { GCLock lock; if (assignTo != nullptr) { Val resultCoeff = 0; typename LinearTraits::Bounds bounds(d, d, true); for (auto i = static_cast(coeffv.size()); i--;) { if (alv[i]() == assignTo) { resultCoeff = coeffv[i]; continue; } typename LinearTraits::Bounds bound = LinearTraits::computeBounds(env, alv[i]()); if (bound.valid && LinearTraits::finite(bound)) { if (coeffv[i] > 0) { bounds.l += coeffv[i] * bound.l; bounds.u += coeffv[i] * bound.u; } else { bounds.l += coeffv[i] * bound.u; bounds.u += coeffv[i] * bound.l; } } else { bounds.valid = false; break; } } if (bounds.valid && resultCoeff != 0) { if (resultCoeff < 0) { bounds.l = LinearTraits::floorDiv(bounds.l, -resultCoeff); bounds.u = LinearTraits::ceilDiv(bounds.u, -resultCoeff); } else { Val bl = bounds.l; bounds.l = LinearTraits::ceilDiv(bounds.u, -resultCoeff); bounds.u = LinearTraits::floorDiv(bl, -resultCoeff); } VarDecl* vd = assignTo->decl(); if (vd->ti()->domain()) { typename LinearTraits::Domain domain = LinearTraits::evalDomain(env, vd->ti()->domain()); if (LinearTraits::domainIntersects(domain, bounds.l, bounds.u)) { typename LinearTraits::Domain new_domain = LinearTraits::intersectDomain(domain, bounds.l, bounds.u); if (!LinearTraits::domainEquals(domain, new_domain)) { set_computed_domain(env, vd, LinearTraits::newDomain(new_domain), false); } } else { ret.r = bind(env, ctx, r, constants().literalFalse); } } else { set_computed_domain(env, vd, LinearTraits::newDomain(bounds.l, bounds.u), true); } } } int coeff_sign; LinearTraits::constructLinBuiltin(bot, callid, coeff_sign, d); std::vector coeff_ev(coeffv.size()); for (auto i = static_cast(coeff_ev.size()); i--;) { coeff_ev[i] = LinearTraits::newLit(coeff_sign * coeffv[i]); } auto* ncoeff = new ArrayLit(Location().introduce(), coeff_ev); Type t = coeff_ev[0]->type(); t.dim(1); ncoeff->type(t); args.emplace_back(ncoeff); std::vector alv_e(alv.size()); Type tt = alv[0]()->type(); tt.dim(1); for (auto i = static_cast(alv.size()); i--;) { if (alv[i]()->type().isvar()) { tt.ti(Type::TI_VAR); } alv_e[i] = alv[i](); } auto* nal = new ArrayLit(Location().introduce(), alv_e); nal->type(tt); args.emplace_back(nal); Lit* il = LinearTraits::newLit(-d); args.push_back(il); } } EE flatten_binop(EnvI& env, const Ctx& input_ctx, Expression* e, VarDecl* r, VarDecl* b) { Ctx ctx = input_ctx; CallStackItem _csi(env, e); EE ret; auto* bo = e->cast(); if (is_reverse_map(bo)) { CallArgItem cai(env); Id* id = bo->lhs()->dynamicCast(); if (id == nullptr) { throw EvalError(env, bo->lhs()->loc(), "Reverse mappers are only defined for identifiers"); } if (bo->op() != BOT_EQ && bo->op() != BOT_EQUIV) { throw EvalError(env, bo->loc(), "Reverse mappers have to use `=` as the operator"); } Call* c = bo->rhs()->dynamicCast(); if (c == nullptr) { throw EvalError(env, bo->rhs()->loc(), "Reverse mappers require call on right hand side"); } std::vector args(c->argCount()); for (unsigned int i = 0; i < c->argCount(); i++) { Id* idi = c->arg(i)->dynamicCast(); if (idi == nullptr) { throw EvalError(env, c->arg(i)->loc(), "Reverse mapper calls require identifiers as arguments"); } EE ee = flat_exp(env, Ctx(), idi, nullptr, constants().varTrue); args[i] = ee.r(); } EE ee = flat_exp(env, Ctx(), id, nullptr, constants().varTrue); GCLock lock; Call* revMap = new Call(Location().introduce(), c->id(), args); args.push_back(ee.r()); Call* keepAlive = new Call(Location().introduce(), constants().varRedef->id(), args); keepAlive->type(Type::varbool()); keepAlive->decl(constants().varRedef); ret = flat_exp(env, Ctx(), keepAlive, constants().varTrue, constants().varTrue); if (ee.r()->isa()) { env.reverseMappers.insert(ee.r()->cast(), revMap); } return ret; } if ((bo->op() == BOT_EQ || bo->op() == BOT_EQUIV) && (bo->lhs() == constants().absent || bo->rhs() == constants().absent)) { GCLock lock; std::vector args(1); args[0] = bo->lhs() == constants().absent ? bo->rhs() : bo->lhs(); if (args[0] != constants().absent) { Call* cr = new Call(bo->loc().introduce(), "absent", args); cr->decl(env.model->matchFn(env, cr, false)); cr->type(cr->decl()->rtype(env, args, false)); ret = flat_exp(env, ctx, cr, r, b); } else { ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, constants().literalTrue); } return ret; } Ctx ctx0 = ctx; ctx0.neg = false; Ctx ctx1 = ctx; ctx1.neg = false; BinOpType bot = bo->op(); if (bo->lhs()->type().isbool()) { switch (bot) { case BOT_EQ: bot = BOT_EQUIV; break; case BOT_NQ: bot = BOT_XOR; break; case BOT_LQ: bot = BOT_IMPL; break; case BOT_GQ: bot = BOT_RIMPL; break; default: break; } } bool negArgs = false; bool doubleNeg = false; if (ctx.neg) { switch (bot) { case BOT_AND: ctx.b = -ctx.b; ctx.neg = false; negArgs = true; bot = BOT_OR; break; case BOT_OR: ctx.b = -ctx.b; ctx.neg = false; negArgs = true; bot = BOT_AND; break; default: break; } } Expression* boe0 = bo->lhs(); Expression* boe1 = bo->rhs(); bool isBuiltin = bo->decl() == nullptr || bo->decl()->e() == nullptr; switch (bot) { case BOT_AND: if (isBuiltin) { if (r == constants().varTrue) { Ctx nctx; nctx.neg = negArgs; nctx.b = negArgs ? C_NEG : C_ROOT; std::vector todo; todo.push_back(boe1); todo.push_back(boe0); while (!todo.empty()) { Expression* e_todo = todo.back(); todo.pop_back(); auto* e_bo = e_todo->dynamicCast(); if ((e_bo != nullptr) && e_bo->op() == (negArgs ? BOT_OR : BOT_AND)) { todo.push_back(e_bo->rhs()); todo.push_back(e_bo->lhs()); } else { (void)flat_exp(env, nctx, e_todo, constants().varTrue, constants().varTrue); } } ret.r = bind(env, ctx, r, constants().literalTrue); break; } GC::lock(); Call* c = aggregate_and_or_ops(env, bo, negArgs, bot); KeepAlive ka(c); GC::unlock(); ret = flat_exp(env, ctx, c, r, b); if (Id* id = ret.r()->dynamicCast()) { add_ctx_ann(id->decl(), ctx.b); } break; } case BOT_OR: if (isBuiltin) { GC::lock(); Call* c = aggregate_and_or_ops(env, bo, negArgs, bot); KeepAlive ka(c); GC::unlock(); ret = flat_exp(env, ctx, c, r, b); if (Id* id = ret.r()->dynamicCast()) { add_ctx_ann(id->decl(), ctx.b); } break; } case BOT_PLUS: if (isBuiltin) { KeepAlive ka; if (boe0->type().isint()) { ka = mklinexp(env, 1, 1, boe0, boe1); } else { ka = mklinexp(env, 1.0, 1.0, boe0, boe1); } ret = flat_exp(env, ctx, ka(), r, b); break; } case BOT_MINUS: if (isBuiltin) { KeepAlive ka; if (boe0->type().isint()) { ka = mklinexp(env, 1, -1, boe0, boe1); } else { ka = mklinexp(env, 1.0, -1.0, boe0, boe1); } ret = flat_exp(env, ctx, ka(), r, b); break; } case BOT_MULT: case BOT_IDIV: case BOT_MOD: case BOT_POW: case BOT_DIV: case BOT_UNION: case BOT_DIFF: case BOT_SYMDIFF: case BOT_INTERSECT: case BOT_DOTDOT: { assert(!ctx0.neg); assert(!ctx1.neg); EE e0 = flat_exp(env, ctx0, boe0, nullptr, b); EE e1 = flat_exp(env, ctx1, boe1, nullptr, b); if (e0.r()->type().isPar() && e1.r()->type().isPar()) { GCLock lock; auto* parbo = new BinOp(bo->loc(), e0.r(), bo->op(), e1.r()); std::vector args(2); args[0] = e0.r(); args[1] = e1.r(); FunctionI* fi = env.model->matchFn(env, bo->opToString(), args, false); parbo->decl(fi); Type tt = fi->rtype(env, {e0.r()->type(), e1.r()->type()}, false); assert(tt.isPar()); parbo->type(tt); try { Expression* res = eval_par(env, parbo); assert(!res->type().isunknown()); ret.r = bind(env, ctx, r, res); std::vector ees(2); ees[0].b = e0.b; ees[1].b = e1.b; ret.b = conj(env, b, Ctx(), ees); } catch (ResultUndefinedError&) { ret.r = create_dummy_value(env, e->type()); ret.b = bind(env, Ctx(), b, constants().literalFalse); } break; } if (isBuiltin && bot == BOT_MULT) { Expression* e0r = e0.r(); Expression* e1r = e1.r(); if (e0r->type().isPar()) { std::swap(e0r, e1r); } if (e1r->type().isPar() && e1r->type().isint()) { IntVal coeff = eval_int(env, e1r); KeepAlive ka = mklinexp(env, coeff, 0, e0r, nullptr); ret = flat_exp(env, ctx, ka(), r, b); break; } if (e1r->type().isPar() && e1r->type().isfloat()) { FloatVal coeff = eval_float(env, e1r); KeepAlive ka = mklinexp(env, coeff, 0.0, e0r, nullptr); ret = flat_exp(env, ctx, ka(), r, b); break; } } else if (isBuiltin && (bot == BOT_DIV || bot == BOT_IDIV)) { Expression* e0r = e0.r(); Expression* e1r = e1.r(); if (e1r->type().isPar() && e1r->type().isint()) { IntVal coeff = eval_int(env, e1r); if (coeff == 1) { ret = flat_exp(env, ctx, e0r, r, b); break; } } else if (e1r->type().isPar() && e1r->type().isfloat()) { FloatVal coeff = eval_float(env, e1r); if (coeff == 1.0) { ret = flat_exp(env, ctx, e0r, r, b); break; } KeepAlive ka = mklinexp(env, 1.0 / coeff, 0.0, e0r, nullptr); ret = flat_exp(env, ctx, ka(), r, b); break; } } GC::lock(); std::vector args(2); args[0] = e0.r(); args[1] = e1.r(); Call* cc; if (!isBuiltin) { cc = new Call(bo->loc().introduce(), bo->opToString(), args); } else { cc = new Call(bo->loc().introduce(), op_to_builtin(args[0], args[1], bot), args); } cc->type(bo->type()); EnvI::CSEMap::iterator cit; if ((cit = env.cseMapFind(cc)) != env.cseMapEnd()) { ret.b = bind(env, Ctx(), b, env.ignorePartial ? constants().literalTrue : cit->second.b()); ret.r = bind(env, ctx, r, cit->second.r()); } else { if (FunctionI* fi = env.model->matchFn(env, cc->id(), args, false)) { assert(cc->type() == fi->rtype(env, args, false)); cc->decl(fi); cc->type(cc->decl()->rtype(env, args, false)); KeepAlive ka(cc); GC::unlock(); EE ee = flat_exp(env, ctx, cc, r, nullptr); GC::lock(); ret.r = ee.r; std::vector ees(3); ees[0].b = e0.b; ees[1].b = e1.b; ees[2].b = ee.b; ret.b = conj(env, b, Ctx(), ees); } else { add_path_annotation(env, cc); ret.r = bind(env, ctx, r, cc); std::vector ees(2); ees[0].b = e0.b; ees[1].b = e1.b; ret.b = conj(env, b, Ctx(), ees); if (!ctx.neg) { env.cseMapInsert(cc, ret); } } } } GC::unlock(); break; case BOT_RIMPL: { std::swap(boe0, boe1); } // fall through case BOT_IMPL: { if (ctx.b == C_ROOT && r == constants().varTrue && boe0->type().isPar()) { bool bval; { GCLock lock; bval = eval_bool(env, boe0); } if (bval) { Ctx nctx = ctx; nctx.neg = negArgs; nctx.b = negArgs ? C_NEG : C_ROOT; ret = flat_exp(env, nctx, boe1, constants().varTrue, constants().varTrue); } else { Ctx nctx = ctx; nctx.neg = negArgs; nctx.b = negArgs ? C_NEG : C_ROOT; ret = flat_exp(env, nctx, constants().literalTrue, constants().varTrue, constants().varTrue); } break; } if (ctx.b == C_ROOT && r == constants().varTrue && boe1->type().isPar()) { bool bval; { GCLock lock; bval = eval_bool(env, boe1); } if (bval) { Ctx nctx = ctx; nctx.neg = negArgs; nctx.b = negArgs ? C_NEG : C_ROOT; ret = flat_exp(env, nctx, constants().literalTrue, constants().varTrue, constants().varTrue); break; } Ctx nctx = ctx; nctx.neg = !negArgs; nctx.b = !negArgs ? C_NEG : C_ROOT; ret = flat_exp(env, nctx, boe0, constants().varTrue, constants().varTrue); break; } GC::lock(); std::vector args; ASTString id; if (ctx.neg) { std::vector bo_args(2); bo_args[0] = boe0; bo_args[1] = new UnOp(bo->loc(), UOT_NOT, boe1); bo_args[1]->type(boe1->type()); id = constants().ids.forall; args.push_back(new ArrayLit(bo->loc(), bo_args)); args[0]->type(Type::varbool(1)); } else { std::vector clause_pos(1); clause_pos[0] = boe1; std::vector clause_neg(1); clause_neg[0] = boe0; args.push_back(new ArrayLit(boe1->loc().introduce(), clause_pos)); Type t0 = boe1->type(); t0.dim(1); args[0]->type(t0); args.push_back(new ArrayLit(boe0->loc().introduce(), clause_neg)); Type t1 = boe0->type(); t1.dim(1); args[1]->type(t1); id = constants().ids.clause; } ctx.neg = false; Call* c = new Call(bo->loc().introduce(), id, args); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw FlatteningError(env, c->loc(), "cannot find matching declaration"); } c->type(c->decl()->rtype(env, args, false)); KeepAlive ka(c); GC::unlock(); ret = flat_exp(env, ctx, c, r, b); if (Id* id = ret.r()->dynamicCast()) { add_ctx_ann(id->decl(), ctx.b); } } break; case BOT_EQUIV: if (ctx.neg) { ctx.neg = false; ctx.b = -ctx.b; bot = BOT_XOR; ctx0.b = ctx1.b = C_MIX; goto flatten_bool_op; } if (!boe1->type().isOpt() && istrue(env, boe0)) { return flat_exp(env, ctx, boe1, r, b); } if (!boe0->type().isOpt() && istrue(env, boe1)) { return flat_exp(env, ctx, boe0, r, b); } if (!boe0->type().isOpt() && !boe1->type().isOpt() && (r != nullptr) && r == constants().varTrue) { if (boe1->type().isPar() || boe1->isa()) { std::swap(boe0, boe1); } if (istrue(env, boe0)) { return flat_exp(env, ctx1, boe1, r, b); } if (isfalse(env, boe0)) { ctx1.neg = true; ctx1.b = -ctx1.b; return flat_exp(env, ctx1, boe1, r, b); } ctx0.b = C_MIX; EE e0 = flat_exp(env, ctx0, boe0, nullptr, nullptr); if (istrue(env, e0.r())) { return flat_exp(env, ctx1, boe1, r, b); } if (isfalse(env, e0.r())) { ctx1.neg = true; ctx1.b = -ctx1.b; return flat_exp(env, ctx1, boe1, r, b); } Id* id = e0.r()->cast(); ctx1.b = C_MIX; (void)flat_exp(env, ctx1, boe1, id->decl(), constants().varTrue); add_ctx_ann(id->decl(), ctx1.b); ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, Ctx(), r, constants().literalTrue); break; } ctx0.b = ctx1.b = C_MIX; goto flatten_bool_op; case BOT_XOR: if (ctx.neg) { ctx.neg = false; ctx.b = -ctx.b; bot = BOT_EQUIV; } ctx0.b = ctx1.b = C_MIX; goto flatten_bool_op; case BOT_LE: if (ctx.neg) { doubleNeg = true; bot = BOT_GQ; if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = +ctx0.b; ctx1.b = -ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = +ctx0.b; ctx1.i = -ctx1.b; } } else { if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = -ctx0.b; ctx1.b = +ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = -ctx0.b; ctx1.i = +ctx1.b; } } goto flatten_bool_op; case BOT_LQ: if (ctx.neg) { doubleNeg = true; bot = BOT_GR; if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = +ctx0.b; ctx1.b = -ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = +ctx0.b; ctx1.i = -ctx1.b; } } else { if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = -ctx0.b; ctx1.b = +ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = -ctx0.b; ctx1.i = +ctx1.b; } } goto flatten_bool_op; case BOT_GR: if (ctx.neg) { doubleNeg = true; bot = BOT_LQ; if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = -ctx0.b; ctx1.b = +ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = -ctx0.b; ctx1.i = +ctx1.b; } } else { if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = +ctx0.b; ctx1.b = -ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = +ctx0.b; ctx1.i = -ctx1.b; } } goto flatten_bool_op; case BOT_GQ: if (ctx.neg) { doubleNeg = true; bot = BOT_LE; if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = -ctx0.b; ctx1.b = +ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = -ctx0.b; ctx1.i = +ctx1.b; } } else { if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = +ctx0.b; ctx1.b = -ctx1.b; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = +ctx0.b; ctx1.i = -ctx1.b; } } goto flatten_bool_op; case BOT_EQ: if (ctx.neg) { doubleNeg = true; bot = BOT_NQ; } if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = ctx1.b = C_MIX; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = ctx1.i = C_MIX; } goto flatten_bool_op; case BOT_NQ: if (ctx.neg) { doubleNeg = true; bot = BOT_EQ; } if (boe0->type().bt() == Type::BT_BOOL) { ctx0.b = ctx1.b = C_MIX; } else if (boe0->type().bt() == Type::BT_INT) { ctx0.i = ctx1.i = C_MIX; } goto flatten_bool_op; case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: ctx0.i = ctx1.i = C_MIX; flatten_bool_op : { bool inRootCtx = (ctx0.b == ctx1.b && ctx0.b == C_ROOT && b == constants().varTrue); EE e0 = flat_exp(env, ctx0, boe0, nullptr, inRootCtx ? b : nullptr); EE e1 = flat_exp(env, ctx1, boe1, nullptr, inRootCtx ? b : nullptr); ret.b = bind(env, Ctx(), b, constants().literalTrue); std::vector ees(3); ees[0].b = e0.b; ees[1].b = e1.b; if (isfalse(env, e0.b()) || isfalse(env, e1.b())) { ees.resize(2); ret.r = conj(env, r, ctx, ees); break; } if (e0.r()->type().isPar() && e1.r()->type().isPar()) { GCLock lock; auto* bo_par = new BinOp(e->loc(), e0.r(), bot, e1.r()); std::vector args({e0.r(), e1.r()}); bo_par->decl(env.model->matchFn(env, bo_par->opToString(), args, false)); if (bo_par->decl() == nullptr) { throw FlatteningError(env, bo_par->loc(), "cannot find matching declaration"); } bo_par->type(Type::parbool()); bool bo_val = eval_bool(env, bo_par); if (doubleNeg) { bo_val = !bo_val; } ees[2].b = constants().boollit(bo_val); ret.r = conj(env, r, ctx, ees); break; } if (e0.r()->type().bt() == Type::BT_INT && e1.r()->type().isPar() && e0.r()->isa() && (bot == BOT_IN || bot == BOT_SUBSET)) { VarDecl* vd = e0.r()->cast()->decl(); Id* ident = vd->id(); if (ctx.b == C_ROOT && r == constants().varTrue) { if (vd->ti()->domain() == nullptr) { vd->ti()->domain(e1.r()); } else { GCLock lock; IntSetVal* newdom = eval_intset(env, e1.r()); while (ident != nullptr) { bool changeDom = false; if (ident->decl()->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, ident->decl()->ti()->domain()); IntSetRanges dr(domain); IntSetRanges ibr(newdom); Ranges::Inter i(dr, ibr); IntSetVal* newibv = IntSetVal::ai(i); if (domain->card() != newibv->card()) { newdom = newibv; changeDom = true; } } else { changeDom = true; } if (ident->type().st() == Type::ST_PLAIN && newdom->size() == 0) { env.fail(); } else if (changeDom) { set_computed_domain(env, ident->decl(), new SetLit(Location().introduce(), newdom), false); if (ident->decl()->e() == nullptr && newdom->min() == newdom->max() && !vd->type().isSet()) { ident->decl()->e(IntLit::a(newdom->min())); } } ident = ident->decl()->e() != nullptr ? ident->decl()->e()->dynamicCast() : nullptr; } } ret.r = bind(env, ctx, r, constants().literalTrue); break; } if (vd->ti()->domain() != nullptr) { // check if current domain is already subsumed or falsified by this constraint GCLock lock; IntSetVal* check_dom = eval_intset(env, e1.r()); IntSetVal* domain = eval_intset(env, ident->decl()->ti()->domain()); { IntSetRanges cdr(check_dom); IntSetRanges dr(domain); if (Ranges::subset(dr, cdr)) { // the constraint is subsumed ret.r = bind(env, ctx, r, constants().literalTrue); break; } } if (vd->type().st() == Type::ST_PLAIN) { // only for var int (for var set of int, subset can never fail because of the domain) IntSetRanges cdr(check_dom); IntSetRanges dr(domain); if (Ranges::disjoint(cdr, dr)) { // the constraint is false ret.r = bind(env, ctx, r, constants().literalFalse); break; } } } } std::vector args; ASTString callid; Expression* le0 = nullptr; Expression* le1 = nullptr; if (boe0->type().isint() && !boe0->type().isOpt() && bot != BOT_IN) { le0 = get_linexp(e0.r()); } else if (boe0->type().isfloat() && !boe0->type().isOpt() && bot != BOT_IN) { le0 = get_linexp(e0.r()); } if (le0 != nullptr) { if (boe0->type().isint() && boe1->type().isint() && !boe1->type().isOpt()) { le1 = get_linexp(e1.r()); } else if (boe0->type().isfloat() && boe1->type().isfloat() && !boe1->type().isOpt()) { le1 = get_linexp(e1.r()); } } if (le1 != nullptr) { if (boe0->type().isint()) { flatten_linexp_binop(env, ctx, r, b, ret, le0, le1, bot, doubleNeg, ees, args, callid); } else { flatten_linexp_binop(env, ctx, r, b, ret, le0, le1, bot, doubleNeg, ees, args, callid); } } else { switch (bot) { case BOT_GR: std::swap(e0, e1); bot = BOT_LE; break; case BOT_GQ: std::swap(e0, e1); bot = BOT_LQ; break; default: break; } args.push_back(e0.r); args.push_back(e1.r); } if (!args.empty()) { GC::lock(); bool idIsOp = false; if (callid == "") { assert(args.size() == 2); if (!isBuiltin) { callid = op_to_id(bot); idIsOp = true; } else { callid = op_to_builtin(args[0](), args[1](), bot); } } std::vector args_e(args.size()); for (auto i = static_cast(args.size()); (i--) != 0U;) { args_e[i] = args[i](); } Call* cc = new Call(e->loc().introduce(), callid, args_e); cc->decl(env.model->matchFn(env, cc->id(), args_e, false)); if (cc->decl() == nullptr) { throw FlatteningError(env, cc->loc(), "cannot find matching declaration"); } if (idIsOp && cc->decl()->e() == nullptr) { // This is in fact a built-in operator, but we only found out after // constructing the call cc = new Call(e->loc().introduce(), op_to_builtin(args[0](), args[1](), bot), args_e); cc->decl(env.model->matchFn(env, cc->id(), args_e, false)); if (cc->decl() == nullptr) { throw FlatteningError(env, cc->loc(), "cannot find matching declaration"); } } cc->type(cc->decl()->rtype(env, args_e, false)); // add defines_var annotation if applicable Id* assignTo = nullptr; if (bot == BOT_EQ && ctx.b == C_ROOT) { if ((le0 != nullptr) && le0->isa()) { assignTo = le0->cast(); } else if ((le1 != nullptr) && le1->isa()) { assignTo = le1->cast(); } if (assignTo != nullptr) { make_defined_var(assignTo->decl()->flat(), cc); } } auto cit = env.cseMapFind(cc); if (cit != env.cseMapEnd()) { ees[2].b = cit->second.r(); if (doubleNeg) { Type t = ees[2].b()->type(); ees[2].b = new UnOp(Location().introduce(), UOT_NOT, ees[2].b()); ees[2].b()->type(t); } if (Id* id = ees[2].b()->dynamicCast()) { add_ctx_ann(id->decl(), ctx.b); } ret.r = conj(env, r, ctx, ees); GC::unlock(); } else { bool singleExp = true; for (auto& ee : ees) { if (!istrue(env, ee.b())) { singleExp = false; break; } } KeepAlive ka(cc); GC::unlock(); if (singleExp) { if (doubleNeg) { ctx.b = -ctx.b; ctx.neg = !ctx.neg; } ret.r = flat_exp(env, ctx, cc, r, nullptr).r; } else { ees[2].b = flat_exp(env, Ctx(), cc, nullptr, nullptr).r; if (doubleNeg) { GCLock lock; Type t = ees[2].b()->type(); ees[2].b = new UnOp(Location().introduce(), UOT_NOT, ees[2].b()); ees[2].b()->type(t); } if (Id* id = ees[2].b()->dynamicCast()) { add_ctx_ann(id->decl(), ctx.b); } ret.r = conj(env, r, ctx, ees); } } } else { ret.r = conj(env, r, ctx, ees); } } break; case BOT_PLUSPLUS: { std::vector ee(2); EE eev = flat_exp(env, ctx, boe0, nullptr, nullptr); ee[0] = eev; ArrayLit* al; if (eev.r()->isa()) { al = eev.r()->cast(); } else { Id* id = eev.r()->cast(); if (id->decl() == nullptr) { throw InternalError("undefined identifier"); } if (id->decl()->e() == nullptr) { throw InternalError("array without initialiser not supported"); } al = follow_id(id)->cast(); } ArrayLit* al0 = al; eev = flat_exp(env, ctx, boe1, nullptr, nullptr); ee[1] = eev; if (eev.r()->isa()) { al = eev.r()->cast(); } else { Id* id = eev.r()->cast(); if (id->decl() == nullptr) { throw InternalError("undefined identifier"); } if (id->decl()->e() == nullptr) { throw InternalError("array without initialiser not supported"); } al = follow_id(id)->cast(); } ArrayLit* al1 = al; std::vector v(al0->size() + al1->size()); for (unsigned int i = al0->size(); (i--) != 0U;) { v[i] = (*al0)[i]; } for (unsigned int i = al1->size(); (i--) != 0U;) { v[al0->size() + i] = (*al1)[i]; } GCLock lock; auto* alret = new ArrayLit(e->loc(), v); alret->type(e->type()); ret.b = conj(env, b, Ctx(), ee); ret.r = bind(env, ctx, r, alret); } break; } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_anon.cpp0000644000175000017500000000170013757304533020055 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_anon(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; auto* av = e->cast(); if (av->type().isbot()) { throw InternalError("type of anonymous variable could not be inferred"); } GCLock lock; VarDecl* vd = new_vardecl(env, Ctx(), new TypeInst(Location().introduce(), av->type()), nullptr, nullptr, nullptr); ret.b = bind(env, Ctx(), b, constants().literalTrue); ret.r = bind(env, ctx, r, vd->id()); return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_ite.cpp0000644000175000017500000004615313757304533017716 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { std::vector get_conjuncts(Expression* start) { std::vector conj_stack; std::vector conjuncts; conj_stack.push_back(start); while (!conj_stack.empty()) { Expression* e = conj_stack.back(); conj_stack.pop_back(); if (auto* bo = e->dynamicCast()) { if (bo->op() == BOT_AND) { conj_stack.push_back(bo->rhs()); conj_stack.push_back(bo->lhs()); } else { conjuncts.push_back(e); } } else { conjuncts.push_back(e); } } return conjuncts; } void classify_conjunct(Expression* e, IdMap& eq_occurrences, IdMap>& eq_branches, std::vector& other_branches) { if (auto* bo = e->dynamicCast()) { if (bo->op() == BOT_EQ) { if (Id* ident = bo->lhs()->dynamicCast()) { if (eq_branches.find(ident) == eq_branches.end()) { auto it = eq_occurrences.find(ident); if (it == eq_occurrences.end()) { eq_occurrences.insert(ident, 1); } else { eq_occurrences.get(ident)++; } eq_branches.insert(ident, std::make_pair(bo->rhs(), bo)); return; } } else if (Id* ident = bo->rhs()->dynamicCast()) { if (eq_branches.find(ident) == eq_branches.end()) { auto it = eq_occurrences.find(ident); if (it == eq_occurrences.end()) { eq_occurrences.insert(ident, 1); } else { eq_occurrences.get(ident)++; } eq_branches.insert(ident, std::make_pair(bo->lhs(), bo)); return; } } } } other_branches.push_back(e); } EE flatten_ite(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); ITE* ite = e->cast(); // The conditions of each branch of the if-then-else std::vector conditions; // Whether the right hand side of each branch is defined std::vector> defined; // The right hand side of each branch std::vector> branches; // Whether all branches are fixed std::vector allBranchesPar; // Compute bounds of result as union bounds of all branches std::vector> r_bounds_int; std::vector r_bounds_valid_int; std::vector> r_bounds_set; std::vector r_bounds_valid_set; std::vector> r_bounds_float; std::vector r_bounds_valid_float; bool allConditionsPar = true; bool allDefined = true; // The result variables of each generated conditional std::vector results; // The then-expressions of each generated conditional std::vector> e_then; // The else-expressions of each generated conditional std::vector e_else; bool noOtherBranches = true; if (ite->type() == Type::varbool() && ctx.b == C_ROOT && r == constants().varTrue) { // Check if all branches are of the form x1=e1 /\ ... /\ xn=en IdMap eq_occurrences; std::vector>> eq_branches(ite->size() + 1); std::vector> other_branches(ite->size() + 1); for (int i = 0; i < ite->size(); i++) { auto conjuncts = get_conjuncts(ite->thenExpr(i)); for (auto* c : conjuncts) { classify_conjunct(c, eq_occurrences, eq_branches[i], other_branches[i]); } noOtherBranches = noOtherBranches && other_branches[i].empty(); } { auto conjuncts = get_conjuncts(ite->elseExpr()); for (auto* c : conjuncts) { classify_conjunct(c, eq_occurrences, eq_branches[ite->size()], other_branches[ite->size()]); } noOtherBranches = noOtherBranches && other_branches[ite->size()].empty(); } for (auto& eq : eq_occurrences) { if (eq.second >= ite->size()) { // Any identifier that occurs in all or all but one branch gets its own conditional results.push_back(eq.first->decl()); e_then.emplace_back(); for (int i = 0; i < ite->size(); i++) { auto it = eq_branches[i].find(eq.first); if (it == eq_branches[i].end()) { // not found, simply push x=x e_then.back().push_back(eq.first); } else { e_then.back().push_back(it->second.first); } } { auto it = eq_branches[ite->size()].find(eq.first); if (it == eq_branches[ite->size()].end()) { // not found, simply push x=x e_else.emplace_back(eq.first); } else { e_else.emplace_back(it->second.first); } } } else { // All other identifiers are put in the vector of "other" branches for (int i = 0; i <= ite->size(); i++) { auto it = eq_branches[i].find(eq.first); if (it != eq_branches[i].end()) { other_branches[i].push_back(it->second.second); noOtherBranches = false; eq_branches[i].remove(eq.first); } } } } if (!noOtherBranches) { results.push_back(r); e_then.emplace_back(); for (int i = 0; i < ite->size(); i++) { if (eq_branches[i].size() == 0) { e_then.back().push_back(ite->thenExpr(i)); } else if (other_branches[i].empty()) { e_then.back().push_back(constants().literalTrue); } else if (other_branches[i].size() == 1) { e_then.back().push_back(other_branches[i][0]); } else { GCLock lock; auto* al = new ArrayLit(Location().introduce(), other_branches[i]); al->type(Type::varbool(1)); Call* forall = new Call(Location().introduce(), constants().ids.forall, {al}); forall->decl(env.model->matchFn(env, forall, false)); forall->type(forall->decl()->rtype(env, {al}, false)); e_then.back().push_back(forall); } } { if (eq_branches[ite->size()].size() == 0) { e_else.emplace_back(ite->elseExpr()); } else if (other_branches[ite->size()].empty()) { e_else.emplace_back(constants().literalTrue); } else if (other_branches[ite->size()].size() == 1) { e_else.emplace_back(other_branches[ite->size()][0]); } else { GCLock lock; auto* al = new ArrayLit(Location().introduce(), other_branches[ite->size()]); al->type(Type::varbool(1)); Call* forall = new Call(Location().introduce(), constants().ids.forall, {al}); forall->decl(env.model->matchFn(env, forall, false)); forall->type(forall->decl()->rtype(env, {al}, false)); e_else.emplace_back(forall); } } } } else { noOtherBranches = false; results.push_back(r); e_then.emplace_back(); for (int i = 0; i < ite->size(); i++) { e_then.back().push_back(ite->thenExpr(i)); } e_else.emplace_back(ite->elseExpr()); } allBranchesPar.resize(results.size()); r_bounds_valid_int.resize(results.size()); r_bounds_int.resize(results.size()); r_bounds_valid_float.resize(results.size()); r_bounds_float.resize(results.size()); r_bounds_valid_set.resize(results.size()); r_bounds_set.resize(results.size()); defined.resize(results.size()); branches.resize(results.size()); for (unsigned int i = 0; i < results.size(); i++) { allBranchesPar[i] = true; r_bounds_valid_int[i] = true; r_bounds_valid_float[i] = true; r_bounds_valid_set[i] = true; } Ctx cmix; cmix.b = C_MIX; cmix.i = C_MIX; cmix.neg = ctx.neg; bool foundTrueBranch = false; for (int i = 0; i < ite->size() && !foundTrueBranch; i++) { bool cond = true; EE e_if; if (ite->ifExpr(i)->isa() && ite->ifExpr(i)->cast()->id() == "mzn_in_root_context") { e_if = EE(constants().boollit(ctx.b == C_ROOT), constants().literalTrue); } else { Ctx cmix_not_negated; cmix_not_negated.b = C_MIX; cmix_not_negated.i = C_MIX; e_if = flat_exp(env, cmix_not_negated, ite->ifExpr(i), nullptr, constants().varTrue); } if (e_if.r()->type() == Type::parbool()) { { GCLock lock; cond = eval_bool(env, e_if.r()); } if (cond) { if (allConditionsPar) { // no var conditions before this one, so we can simply emit // the then branch return flat_exp(env, ctx, ite->thenExpr(i), r, b); } // had var conditions, so we have to take them into account // and emit new conditional clause // add another condition and definedness variable conditions.emplace_back(constants().literalTrue); for (unsigned int j = 0; j < results.size(); j++) { EE ethen = flat_exp(env, cmix, e_then[j][i](), nullptr, nullptr); assert(ethen.b()); defined[j].push_back(ethen.b); allDefined = allDefined && (ethen.b() == constants().literalTrue); branches[j].push_back(ethen.r); if (ethen.r()->type().isvar()) { allBranchesPar[j] = false; } } foundTrueBranch = true; } else { GCLock lock; conditions.emplace_back(constants().literalFalse); for (unsigned int j = 0; j < results.size(); j++) { defined[j].push_back(constants().literalTrue); branches[j].push_back(create_dummy_value(env, e_then[j][i]()->type())); } } } else { allConditionsPar = false; // add current condition and definedness variable conditions.push_back(e_if.r); for (unsigned int j = 0; j < results.size(); j++) { // flatten the then branch EE ethen = flat_exp(env, cmix, e_then[j][i](), nullptr, nullptr); assert(ethen.b()); defined[j].push_back(ethen.b); allDefined = allDefined && (ethen.b() == constants().literalTrue); branches[j].push_back(ethen.r); if (ethen.r()->type().isvar()) { allBranchesPar[j] = false; } } } // update bounds if (cond) { for (unsigned int j = 0; j < results.size(); j++) { if (r_bounds_valid_int[j] && e_then[j][i]()->type().isint()) { GCLock lock; IntBounds ib_then = compute_int_bounds(env, branches[j][i]()); if (ib_then.valid) { r_bounds_int[j].push_back(ib_then); } r_bounds_valid_int[j] = r_bounds_valid_int[j] && ib_then.valid; } else if (r_bounds_valid_set[j] && e_then[j][i]()->type().isIntSet()) { GCLock lock; IntSetVal* isv = compute_intset_bounds(env, branches[j][i]()); if (isv != nullptr) { r_bounds_set[j].push_back(isv); } r_bounds_valid_set[j] = r_bounds_valid_set[j] && (isv != nullptr); } else if (r_bounds_valid_float[j] && e_then[j][i]()->type().isfloat()) { GCLock lock; FloatBounds fb_then = compute_float_bounds(env, branches[j][i]()); if (fb_then.valid) { r_bounds_float[j].push_back(fb_then); } r_bounds_valid_float[j] = r_bounds_valid_float[j] && fb_then.valid; } } } } if (allConditionsPar) { // no var condition, and all par conditions were false, // so simply emit else branch return flat_exp(env, ctx, ite->elseExpr(), r, b); } for (auto& result : results) { if (result == nullptr) { // need to introduce new result variable GCLock lock; auto* ti = new TypeInst(Location().introduce(), ite->type(), nullptr); result = new_vardecl(env, Ctx(), ti, nullptr, nullptr, nullptr); } } if (conditions.back()() != constants().literalTrue) { // The last condition wasn't fixed to true, we need to look at the else branch conditions.emplace_back(constants().literalTrue); for (unsigned int j = 0; j < results.size(); j++) { // flatten else branch EE eelse = flat_exp(env, cmix, e_else[j](), nullptr, nullptr); assert(eelse.b()); defined[j].push_back(eelse.b); allDefined = allDefined && (eelse.b() == constants().literalTrue); branches[j].push_back(eelse.r); if (eelse.r()->type().isvar()) { allBranchesPar[j] = false; } if (r_bounds_valid_int[j] && e_else[j]()->type().isint()) { GCLock lock; IntBounds ib_else = compute_int_bounds(env, eelse.r()); if (ib_else.valid) { r_bounds_int[j].push_back(ib_else); } r_bounds_valid_int[j] = r_bounds_valid_int[j] && ib_else.valid; } else if (r_bounds_valid_set[j] && e_else[j]()->type().isIntSet()) { GCLock lock; IntSetVal* isv = compute_intset_bounds(env, eelse.r()); if (isv != nullptr) { r_bounds_set[j].push_back(isv); } r_bounds_valid_set[j] = r_bounds_valid_set[j] && (isv != nullptr); } else if (r_bounds_valid_float[j] && e_else[j]()->type().isfloat()) { GCLock lock; FloatBounds fb_else = compute_float_bounds(env, eelse.r()); if (fb_else.valid) { r_bounds_float[j].push_back(fb_else); } r_bounds_valid_float[j] = r_bounds_valid_float[j] && fb_else.valid; } } } // update domain of result variable with bounds from all branches for (unsigned int j = 0; j < results.size(); j++) { VarDecl* nr = results[j]; GCLock lock; if (r_bounds_valid_int[j] && ite->type().isint()) { IntVal lb = IntVal::infinity(); IntVal ub = -IntVal::infinity(); for (auto& i : r_bounds_int[j]) { lb = std::min(lb, i.l); ub = std::max(ub, i.u); } if (nr->ti()->domain() != nullptr) { IntSetVal* isv = eval_intset(env, nr->ti()->domain()); Ranges::Const ite_r(lb, ub); IntSetRanges isv_r(isv); Ranges::Inter, IntSetRanges> inter(ite_r, isv_r); IntSetVal* isv_new = IntSetVal::ai(inter); if (isv_new->card() != isv->card()) { auto* r_dom = new SetLit(Location().introduce(), isv_new); nr->ti()->domain(r_dom); } } else { auto* r_dom = new SetLit(Location().introduce(), IntSetVal::a(lb, ub)); nr->ti()->domain(r_dom); nr->ti()->setComputedDomain(true); } } else if (r_bounds_valid_set[j] && ite->type().isIntSet()) { IntSetVal* isv_branches = IntSetVal::a(); for (auto& i : r_bounds_set[j]) { IntSetRanges i0(isv_branches); IntSetRanges i1(i); Ranges::Union u(i0, i1); isv_branches = IntSetVal::ai(u); } if (nr->ti()->domain() != nullptr) { IntSetVal* isv = eval_intset(env, nr->ti()->domain()); IntSetRanges isv_r(isv); IntSetRanges isv_branches_r(isv_branches); Ranges::Inter inter(isv_branches_r, isv_r); IntSetVal* isv_new = IntSetVal::ai(inter); if (isv_new->card() != isv->card()) { auto* r_dom = new SetLit(Location().introduce(), isv_new); nr->ti()->domain(r_dom); } } else { auto* r_dom = new SetLit(Location().introduce(), isv_branches); nr->ti()->domain(r_dom); nr->ti()->setComputedDomain(true); } } else if (r_bounds_valid_float[j] && ite->type().isfloat()) { FloatVal lb = FloatVal::infinity(); FloatVal ub = -FloatVal::infinity(); for (auto& i : r_bounds_float[j]) { lb = std::min(lb, i.l); ub = std::max(ub, i.u); } if (nr->ti()->domain() != nullptr) { FloatSetVal* isv = eval_floatset(env, nr->ti()->domain()); Ranges::Const ite_r(lb, ub); FloatSetRanges isv_r(isv); Ranges::Inter, FloatSetRanges> inter(ite_r, isv_r); FloatSetVal* fsv_new = FloatSetVal::ai(inter); auto* r_dom = new SetLit(Location().introduce(), fsv_new); nr->ti()->domain(r_dom); } else { auto* r_dom = new SetLit(Location().introduce(), FloatSetVal::a(lb, ub)); nr->ti()->domain(r_dom); nr->ti()->setComputedDomain(true); } } } // Create ite predicate calls GCLock lock; auto* al_cond = new ArrayLit(Location().introduce(), conditions); al_cond->type(Type::varbool(1)); for (unsigned int j = 0; j < results.size(); j++) { auto* al_branches = new ArrayLit(Location().introduce(), branches[j]); Type branches_t = results[j]->type(); branches_t.dim(1); branches_t.ti(allBranchesPar[j] ? Type::TI_PAR : Type::TI_VAR); al_branches->type(branches_t); Call* ite_pred = new Call(ite->loc().introduce(), ASTString("if_then_else"), {al_cond, al_branches, results[j]->id()}); ite_pred->decl(env.model->matchFn(env, ite_pred, false)); ite_pred->type(Type::varbool()); (void)flat_exp(env, Ctx(), ite_pred, constants().varTrue, constants().varTrue); } EE ret; if (noOtherBranches) { ret.r = constants().varTrue->id(); } else { ret.r = results.back()->id(); } if (allDefined) { bind(env, Ctx(), b, constants().literalTrue); ret.b = constants().literalTrue; } else { // Otherwise, constraint linking conditions, b and the definedness variables if (b == nullptr) { CallStackItem _csi(env, new StringLit(Location().introduce(), "b")); b = new_vardecl(env, Ctx(), new TypeInst(Location().introduce(), Type::varbool()), nullptr, nullptr, nullptr); } ret.b = b->id(); std::vector defined_conjunctions(ite->size() + 1); for (unsigned int i = 0; i < ite->size() + 1; i++) { std::vector def_i; for (auto& j : defined) { assert(j.size() > i); if (j[i]() != constants().literalTrue) { def_i.push_back(j[i]()); } } if (def_i.empty()) { defined_conjunctions[i] = constants().literalTrue; } else if (def_i.size() == 1) { defined_conjunctions[i] = def_i[0]; } else { auto* al = new ArrayLit(Location().introduce(), def_i); al->type(Type::varbool(1)); Call* forall = new Call(Location().introduce(), constants().ids.forall, {al}); forall->decl(env.model->matchFn(env, forall, false)); forall->type(forall->decl()->rtype(env, {al}, false)); defined_conjunctions[i] = forall; } } auto* al_defined = new ArrayLit(Location().introduce(), defined_conjunctions); al_defined->type(Type::varbool(1)); Call* ite_defined_pred = new Call(ite->loc().introduce(), ASTString("if_then_else_partiality"), {al_cond, al_defined, b->id()}); ite_defined_pred->decl(env.model->matchFn(env, ite_defined_pred, false)); ite_defined_pred->type(Type::varbool()); (void)flat_exp(env, Ctx(), ite_defined_pred, constants().varTrue, constants().varTrue); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flat_exp.cpp0000644000175000017500000001126513757304533017216 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { CallArgItem::CallArgItem(EnvI& env0) : env(env0) { env.idStack.push_back(static_cast(env.callStack.size())); } CallArgItem::~CallArgItem() { env.idStack.pop_back(); } Expression* create_dummy_value(EnvI& env, const Type& t) { if (t.dim() > 0) { Expression* ret = new ArrayLit(Location().introduce(), std::vector()); Type ret_t = t; ret_t.ti(Type::TI_PAR); ret->type(ret_t); return ret; } if (t.st() == Type::ST_SET) { Expression* ret = new SetLit(Location().introduce(), std::vector()); Type ret_t = t; ret_t.ti(Type::TI_PAR); ret->type(ret_t); return ret; } switch (t.bt()) { case Type::BT_INT: return IntLit::a(0); case Type::BT_BOOL: return constants().boollit(false); case Type::BT_FLOAT: return FloatLit::a(0); case Type::BT_STRING: return new StringLit(Location().introduce(), ""); case Type::BT_ANN: return constants().ann.promise_total; default: return nullptr; } } EE flatten_error(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { throw InternalError("invalid expression encountered during compilation"); } #ifndef NDEBUG void mzn_break_here(Expression* e) { std::cerr << "% mzn_break_here: " << *e << "\n"; } #endif typedef EE (*ExprFlattener)(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_setlit(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_id(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_anon(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_arraylit(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_arrayaccess(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_comp(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_ite(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_binop(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_unop(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_call(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_vardecl(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_let(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_par(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flat_exp(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { if (e == nullptr) { return EE(); } #ifndef NDEBUG Annotation& e_ann = e->ann(); if (e_ann.contains(constants().ann.mzn_break_here)) { mzn_break_here(e); } #endif assert(!e->type().isunknown()); static const ExprFlattener flattener_dispatch[] = { &flatten_par, // par expressions &flatten_error, // E_INTLIT &flatten_error, // E_FLOATLIT &flatten_setlit, // E_SETLIT &flatten_error, // E_BOOLLIT &flatten_error, // E_STRINGLIT &flatten_id, // E_ID &flatten_anon, // E_ANON &flatten_arraylit, // E_ARRAYLIT &flatten_arrayaccess, // E_ARRAYACCESS &flatten_comp, // E_COMP &flatten_ite, // E_ITE &flatten_binop, // E_BINOP &flatten_unop, // E_UNOP &flatten_call, // E_CALL &flatten_vardecl, // E_VARDECL &flatten_let, // E_LET &flatten_error, // E_TI &flatten_error // E_TIID }; bool is_par = e->type().isPar() && (!e->type().cv() || !e->type().isbool() || ctx.b != C_ROOT || e->isa()) && !e->isa() && !e->isa() && e->type().bt() != Type::BT_ANN; #ifdef OUTPUT_CALLTREE if (auto* call = e->dynamicCast()) { for (int i = 0; i < env.callDepth; ++i) { std::cerr << "──"; } std::cerr << *call << std::endl; env.callDepth++; EE ee = flatten_call(env, ctx, e, r, b); env.callDepth--; return ee; } #endif int dispatch = is_par ? 0 : e->eid() - Expression::E_INTLIT + 1; return flattener_dispatch[dispatch](env, ctx, e, r, b); } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_let.cpp0000644000175000017500000001055013757304533017711 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_let(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; Let* let = e->cast(); std::vector cs; std::vector flatmap; let->pushbindings(); for (unsigned int i = 0; i < let->let().size(); i++) { Expression* le = let->let()[i]; if (auto* vd = le->dynamicCast()) { Expression* let_e = nullptr; if (vd->e() != nullptr) { Ctx nctx = ctx; nctx.neg = false; if (vd->e()->type().bt() == Type::BT_BOOL) { nctx.b = C_MIX; } EE ee = flat_exp(env, nctx, vd->e(), nullptr, nullptr); let_e = ee.r(); cs.push_back(ee); if (vd->ti()->domain() != nullptr) { GCLock lock; std::vector domargs(2); domargs[0] = ee.r(); if (vd->ti()->type().isfloat()) { FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); if (fsv->size() == 1) { domargs[1] = FloatLit::a(fsv->min()); domargs.push_back(FloatLit::a(fsv->max())); } else { domargs[1] = vd->ti()->domain(); } } else { domargs[1] = vd->ti()->domain(); } Call* c = new Call(vd->ti()->loc().introduce(), "var_dom", domargs); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); if (c->decl() == nullptr) { throw InternalError("no matching declaration found for var_dom"); } VarDecl* b_b = (nctx.b == C_ROOT && b == constants().varTrue) ? b : nullptr; VarDecl* r_r = (nctx.b == C_ROOT && b == constants().varTrue) ? b : nullptr; ee = flat_exp(env, nctx, c, r_r, b_b); cs.push_back(ee); ee.b = ee.r; cs.push_back(ee); } if (vd->type().dim() > 0) { check_index_sets(env, vd, let_e); } } else { if ((ctx.b == C_NEG || ctx.b == C_MIX) && !vd->ann().contains(constants().ann.promise_total)) { CallStackItem csi_vd(env, vd); throw FlatteningError(env, vd->loc(), "free variable in non-positive context"); } CallStackItem csi_vd(env, vd); GCLock lock; TypeInst* ti = eval_typeinst(env, ctx, vd); VarDecl* nvd = new_vardecl(env, ctx, ti, nullptr, vd, nullptr); let_e = nvd->id(); } vd->e(let_e); flatmap.emplace_back(vd->flat()); if (Id* id = Expression::dynamicCast(let_e)) { vd->flat(id->decl()); } else { vd->flat(vd); } } else { if (ctx.b == C_ROOT || le->ann().contains(constants().ann.promise_total)) { (void)flat_exp(env, Ctx(), le, constants().varTrue, constants().varTrue); } else { EE ee = flat_exp(env, ctx, le, nullptr, constants().varTrue); ee.b = ee.r; cs.push_back(ee); } } } if (r == constants().varTrue && ctx.b == C_ROOT && !ctx.neg) { ret.b = bind(env, Ctx(), b, constants().literalTrue); (void)flat_exp(env, ctx, let->in(), r, b); ret.r = conj(env, r, Ctx(), cs); } else { Ctx nctx = ctx; nctx.neg = false; VarDecl* bb = b; for (EE& ee : cs) { if (ee.b() != constants().literalTrue) { bb = nullptr; break; } } EE ee = flat_exp(env, nctx, let->in(), nullptr, bb); if (let->type().isbool() && !let->type().isOpt()) { ee.b = ee.r; cs.push_back(ee); ret.r = conj(env, r, ctx, cs); ret.b = bind(env, Ctx(), b, constants().literalTrue); } else { cs.push_back(ee); ret.r = bind(env, Ctx(), r, ee.r()); ret.b = conj(env, b, Ctx(), cs); } } let->popbindings(); // Restore previous mapping for (unsigned int i = 0; i < let->let().size(); i++) { if (auto* vd = let->let()[i]->dynamicCast()) { vd->flat(Expression::cast(flatmap.back()())); flatmap.pop_back(); } } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten/flatten_unop.cpp0000644000175000017500000000354713757304533020116 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { EE flatten_unop(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b) { CallStackItem _csi(env, e); EE ret; UnOp* uo = e->cast(); bool isBuiltin = uo->decl() == nullptr || uo->decl()->e() == nullptr; if (isBuiltin) { switch (uo->op()) { case UOT_NOT: { Ctx nctx = ctx; nctx.b = -nctx.b; nctx.neg = !nctx.neg; ret = flat_exp(env, nctx, uo->e(), r, b); } break; case UOT_PLUS: ret = flat_exp(env, ctx, uo->e(), r, b); break; case UOT_MINUS: { GC::lock(); if (UnOp* uo_inner = uo->e()->dynamicCast()) { if (uo_inner->op() == UOT_MINUS) { ret = flat_exp(env, ctx, uo_inner->e(), r, b); break; } } Expression* zero; if (uo->e()->type().bt() == Type::BT_INT) { zero = IntLit::a(0); } else { zero = FloatLit::a(0.0); } auto* bo = new BinOp(Location().introduce(), zero, BOT_MINUS, uo->e()); bo->type(uo->type()); KeepAlive ka(bo); GC::unlock(); ret = flat_exp(env, ctx, ka(), r, b); } break; default: break; } } else { GC::lock(); Call* c = new Call(uo->loc().introduce(), uo->opToString(), {uo->e()}); c->decl(env.model->matchFn(env, c, false)); c->type(uo->type()); KeepAlive ka(c); GC::unlock(); ret = flat_exp(env, ctx, c, r, b); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/MIPdomains.cpp0000644000175000017500000026750513757304533015771 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was ! distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include // temporary #include //#include #include #include #include /// TODOs /// TODO Not going to work for float vars because of round-offs in the domain interval sorting... /// set_in etc. are ! propagated between views /// CLEANUP after work: ~destructor /// Also check initexpr of all vars? DONE /// In case of only_range_domains we'd need to register inequalities /// - so better turn that off TODO /// CSE for lineq coefs TODO /// TODO use integer division instead of INT_EPS #define INT_EPS 1e-5 // the absolute epsilon for integrality of integer vars. #define __MZN__MIPDOMAINS__PRINTMORESTATS #define MZN_DBG_CHECK_ITER_CUTOUT // #define __MZN__DBGOUT__MIPDOMAINS__ #ifdef __MZN__DBGOUT__MIPDOMAINS__ #define DBGOUT_MIPD(s) std::cerr << s << std::endl #define DBGOUT_MIPD__(s) std::cerr << s << std::flush #define DBGOUT_MIPD_SELF(op) op #else #define DBGOUT_MIPD(s) \ do { \ } while (false) #define DBGOUT_MIPD__(s) \ do { \ } while (false) #define DBGOUT_MIPD_SELF(op) \ do { \ } while (false) #endif namespace MiniZinc { enum EnumStatIdx__MIPD { N_POSTs__all, // N all POSTs in the model N_POSTs__intCmpReif, N_POSTs__floatCmpReif, // in detail N_POSTs__intNE, N_POSTs__floatNE, N_POSTs__setIn, N_POSTs__domain, N_POSTs__setInReif, N_POSTs__eq_encode, N_POSTs__intAux, N_POSTs__floatAux, // Kind of equality connections between involved variables N_POSTs__eq2intlineq, N_POSTs__eq2floatlineq, N_POSTs__int2float, N_POSTs__internalvarredef, N_POSTs__initexpr1id, N_POSTs__initexpr1linexp, N_POSTs__initexprN, N_POSTs__eqNlineq, N_POSTs__eqNmapsize, // other N_POSTs__varsDirect, N_POSTs__varsInvolved, N_POSTs__NSubintvMin, N_POSTs__NSubintvSum, N_POSTs__NSubintvMax, // as N subintervals N_POSTs__SubSizeMin, N_POSTs__SubSizeSum, N_POSTs__SubSizeMax, // subintv. size N_POSTs__linCoefMin, N_POSTs__linCoefMax, N_POSTs__cliquesWithEqEncode, N_POSTs__clEEEnforced, N_POSTs__clEEFound, N_POSTs__size }; extern std::vector MIPD__stats; enum EnumReifType { RIT_None, RIT_Static, RIT_Reif, RIT_Halfreif }; enum EnumConstrType { CT_None, CT_Comparison, CT_SetIn, CT_Encode }; enum EnumCmpType { CMPT_None = 0, CMPT_LE = -4, CMPT_GE = 4, CMPT_EQ = 1, CMPT_NE = 3, CMPT_LT = -5, CMPT_GT = 5, CMPT_LE_0 = -6, CMPT_GE_0 = 6, CMPT_EQ_0 = 2, CMPT_LT_0 = -7, CMPT_GT_0 = 7 }; enum EnumVarType { VT_None, VT_Int, VT_Float }; /// struct DomainCallType describes & characterizes a possible domain constr call struct DCT { const char* sFuncName = nullptr; const std::vector& aParams; // unsigned iItem; // call's item number in the flat EnumReifType nReifType = RIT_None; // 0/static/halfreif/reif EnumConstrType nConstrType = CT_None; // EnumCmpType nCmpType = CMPT_None; EnumVarType nVarType = VT_None; FunctionI*& pfi; // double dEps = -1.0; DCT(const char* fn, const std::vector& prm, EnumReifType er, EnumConstrType ec, EnumCmpType ecmp, EnumVarType ev, FunctionI*& pfi__) : sFuncName(fn), aParams(prm), nReifType(er), nConstrType(ec), nCmpType(ecmp), nVarType(ev), pfi(pfi__) {} }; template struct Interval { N left = infMinus(), right = infPlus(); mutable VarDecl* varFlag = nullptr; /*constexpr*/ static N infMinus() { return (std::numeric_limits::has_infinity) ? -std::numeric_limits::infinity() : std::numeric_limits::lowest(); } /*constexpr*/ static N infPlus() { return (std::numeric_limits::has_infinity) ? std::numeric_limits::infinity() : std::numeric_limits::max(); } Interval(N a = infMinus(), N b = infPlus()) : left(a), right(b) {} bool operator<(const Interval& intv) const { return left < intv.left; } }; typedef Interval IntvReal; template std::ostream& operator<<(std::ostream& os, const Interval& ii) { os << "[ " << ii.left << ", " << ii.right << " ] "; return os; } template class SetOfIntervals : public std::multiset > { public: using Intv = Interval; typedef std::multiset > Base; typedef typename Base::iterator iterator; SetOfIntervals() : Base() {} SetOfIntervals(std::initializer_list > il) : Base(il) {} template SetOfIntervals(Iter i1, Iter i2) : Base(i1, i2) {} /// Number of integer values in all the intervals /// Assumes the interval bounds are ints int cardInt() const; /// Max interval length N maxInterval() const; /// Special insert function: check if interval is ok iterator insert(const Interval& iv) { if (iv.left > iv.right) { DBGOUT_MIPD("Interval " << iv.left << ".." << iv.right << " is empty, difference: " << (iv.right - iv.left) << ". Skipping"); return Base::end(); } return Base::insert(iv); } template void intersect(const SetOfIntervals& s2); /// Assumes open intervals to cut out from closed template void cutDeltas(const SetOfIntervals& s2, N1 delta); template void cutDeltas(N1 left, N1 right, N1 delta) { SetOfIntervals soi; soi.insert(Interval(left, right)); cutDeltas(soi, delta); } /// Cut out an open interval from a set of closed ones (except for infinities) void cutOut(const Interval& intv); typedef std::pair SplitResult; SplitResult split(iterator& it, N pos); bool checkFiniteBounds(); /// Check there are no useless interval splittings bool checkDisjunctStrict(); Interval getBounds() const; /// Split domain into the integer values /// May assume integer bounds void split2Bits(); }; // class SetOfIntervals typedef SetOfIntervals SetOfIntvReal; template std::ostream& operator<<(std::ostream& os, const SetOfIntervals& soi) { os << "[[ "; for (auto& ii : soi) { os << "[ " << ii.left << ", " << ii.right; if (ii.varFlag) { os << " @" << ii.varFlag; } os << " ] "; } os << "]]"; return os; } template class LinEqHelper { public: Coefs coefs; Vars vd; double rhs; }; template static std::ostream& operator<<(std::ostream& os, LinEqHelper& led) { os << "( ["; for (auto c : led.coefs) { os << c << ' '; } os << " ] * [ "; for (auto v : led.vd) { os << v->id()->str() << ' '; } os << " ] ) == " << led.rhs; return os; } typedef LinEqHelper, std::array > LinEq2Vars; typedef LinEqHelper, std::vector > LinEq; // struct LinEq2Vars { // std::array coefs; // std::array vd = { { 0, 0 } }; // double rhs; // }; // // struct LinEq { // std::vector coefs; // std::vector vd; // double rhs; // }; std::vector MIPD__stats(N_POSTs__size); template static std::vector make_vec(T t1, T t2) { T c_array[] = {t1, t2}; std::vector result(c_array, c_array + sizeof(c_array) / sizeof(c_array[0])); return result; } template static std::vector make_vec(T t1, T t2, T t3) { T c_array[] = {t1, t2, t3}; std::vector result(c_array, c_array + sizeof(c_array) / sizeof(c_array[0])); return result; } template static std::vector make_vec(T t1, T t2, T t3, T t4) { T c_array[] = {t1, t2, t3, t4}; std::vector result(c_array, c_array + sizeof(c_array) / sizeof(c_array[0])); return result; } class MIPD { public: MIPD(Env* env, bool fV, int nmi, double dmd) : nMaxIntv2Bits(nmi), dMaxNValueDensity(dmd), _env(env) { getEnv(); fVerbose = fV; } static bool fVerbose; const int nMaxIntv2Bits = 0; // Maximal interval length to enforce equality encoding const double dMaxNValueDensity = 3.0; // Maximal ratio cardInt() / size() of a domain // to enforce ee bool doMIPdomains() { MIPD__stats[N_POSTs__NSubintvMin] = 1e100; MIPD__stats[N_POSTs__SubSizeMin] = 1e100; if (!registerLinearConstraintDecls()) { return true; } if (!registerPOSTConstraintDecls()) { // not declared => no conversions return true; } registerPOSTVariables(); if (_vVarDescr.empty()) { return true; } constructVarViewCliques(); if (!decomposeDomains()) { return false; } if (fVerbose) { printStats(std::cerr); } return true; } private: Env* _env = nullptr; Env* getEnv() { MZN_MIPD__assert_hard(_env); return _env; } typedef VarDecl* PVarDecl; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_lin_eq; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_lin_le; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_lin_eq; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_lin_le; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int2float; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* lin_exp_int; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* lin_exp_float; // NOLINTNEXTLINE(readability-identifier-naming) std::vector int_lin_eq_t = make_vec(Type::parint(1), Type::varint(1), Type::parint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector float_lin_eq_t = make_vec(Type::parfloat(1), Type::varfloat(1), Type::parfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VIVF = make_vec(Type::varint(), Type::varfloat()); // double float_lt_EPS_coef__ = 1e-5; bool registerLinearConstraintDecls() { EnvI& env = getEnv()->envi(); GCLock lock; int_lin_eq = env.model->matchFn(env, constants().ids.int_.lin_eq, int_lin_eq_t, false); DBGOUT_MIPD(" int_lin_eq = " << int_lin_eq); // MZN_MIPD__assert_hard(fi); // int_lin_eq = (fi && fi->e()) ? fi : NULL; int_lin_le = env.model->matchFn(env, constants().ids.int_.lin_le, int_lin_eq_t, false); float_lin_eq = env.model->matchFn(env, constants().ids.float_.lin_eq, float_lin_eq_t, false); float_lin_le = env.model->matchFn(env, constants().ids.float_.lin_le, float_lin_eq_t, false); int2float = env.model->matchFn(env, constants().ids.int2float, t_VIVF, false); lin_exp_int = env.model->matchFn(env, constants().ids.lin_exp, int_lin_eq_t, false); lin_exp_float = env.model->matchFn(env, constants().ids.lin_exp, float_lin_eq_t, false); return (int_lin_eq != nullptr) && (int_lin_le != nullptr) && (float_lin_eq != nullptr) && (float_lin_le != nullptr); // say something... // std::cerr << " lin_exp_int=" << lin_exp_int << std::endl; // std::cerr << " lin_exp_float=" << lin_exp_float << std::endl; // For this to work, need to define a function, see mzn_only_range_domains() // { // GCLock lock; // Call* call_EPS_for_LT = // new Call(Location(),"mzn_float_lt_EPS_coef__", std::vector()); // call_EPS_for_LT->type(Type::parfloat()); // call_EPS_for_LT->decl(env.model->matchFn(getEnv()->envi(), call_EPS_for_LT)); // float_lt_EPS_coef__ = eval_float(getEnv()->envi(), call_EPS_for_LT); // } } // bool matchAndMarkFunction(); // std::set funcs; /// Possible function param sets // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VII = make_vec(Type::varint(), Type::parint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VIVI = make_vec(Type::varint(), Type::varint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VIIVI = make_vec(Type::varint(), Type::parint(), Type::varint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVI = make_vec(Type::varfloat(), Type::varint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVF = make_vec(Type::varfloat(), Type::varfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFFVI = make_vec(Type::varfloat(), Type::parfloat(), Type::varint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFFVIF = make_vec(Type::varfloat(), Type::parfloat(), Type::varint(), Type::parfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVIF = make_vec(Type::varfloat(), Type::varint(), Type::parfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVIVF = make_vec(Type::varfloat(), Type::varint(), Type::varfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVIVFF = make_vec(Type::varfloat(), Type::varint(), Type::varfloat(), Type::parfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFVFF = make_vec(Type::varfloat(), Type::varfloat(), Type::parfloat()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VFFF = make_vec(Type::varfloat(), Type::parfloat(), Type::parfloat()); // std::vector t_VFVFVIF({ Type::varfloat(), Type::varfloat(), Type::varint(), // Type::parfloat() }); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VIAVI = make_vec(Type::varint(), Type::varint(1)); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VISI = make_vec(Type::varint(), Type::parsetint()); // NOLINTNEXTLINE(readability-identifier-naming) std::vector t_VISIVI = make_vec(Type::varint(), Type::parsetint(), Type::varint()); // std::vector t_intarray(1); // t_intarray[0] = Type::parint(-1); typedef std::unordered_map M__POSTCallTypes; M__POSTCallTypes _mCallTypes; // actually declared in the input std::vector _aCT; // all possible // Fails: // DomainCallType a = { NULL, t_VII, RIT_Halfreif, CT_Comparison, CMPT_EQ, VT_Float }; /// struct VarDescr stores some info about variables involved in domain constr struct VarDescr { typedef unsigned char boolShort; VarDescr(VarDecl* vd_, boolShort fi, double l_ = 0.0, double u_ = 0.0) : lb(l_), ub(u_), vd(vd_), fInt(fi) {} double lb, ub; VarDecl* vd = nullptr; int nClique = -1; // clique number // std::vector aCalls; std::vector aCalls; boolShort fInt = 0; ConstraintI* pEqEncoding = nullptr; boolShort fDomainConstrProcessed = 0; // boolShort fPropagatedViews=0; // boolShort fPropagatedLargerEqns=0; }; std::vector _vVarDescr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_le_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_ge_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_eq_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* int_ne__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_le_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_ge_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* aux_float_lt_zero_iff_1__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_eq_reif__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* float_ne__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* aux_float_eq_zero_if_1__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* aux_int_le_zero_if_1__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* aux_float_le_zero_if_1__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* aux_float_lt_zero_if_1__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* equality_encoding__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* set_in__POST = nullptr; // NOLINTNEXTLINE(readability-identifier-naming) FunctionI* set_in_reif__POST = nullptr; bool registerPOSTConstraintDecls() { EnvI& env = getEnv()->envi(); GCLock lock; _aCT.clear(); _aCT.emplace_back("int_le_reif__POST", t_VIIVI, RIT_Reif, CT_Comparison, CMPT_LE, VT_Int, int_le_reif__POST); _aCT.emplace_back("int_ge_reif__POST", t_VIIVI, RIT_Reif, CT_Comparison, CMPT_GE, VT_Int, int_ge_reif__POST); _aCT.emplace_back("int_eq_reif__POST", t_VIIVI, RIT_Reif, CT_Comparison, CMPT_EQ, VT_Int, int_eq_reif__POST); _aCT.emplace_back("int_ne__POST", t_VII, RIT_Static, CT_Comparison, CMPT_NE, VT_Int, int_ne__POST); _aCT.emplace_back("float_le_reif__POST", t_VFFVIF, RIT_Reif, CT_Comparison, CMPT_LE, VT_Float, float_le_reif__POST); _aCT.emplace_back("float_ge_reif__POST", t_VFFVIF, RIT_Reif, CT_Comparison, CMPT_GE, VT_Float, float_ge_reif__POST); _aCT.emplace_back("aux_float_lt_zero_iff_1__POST", t_VFVIF, RIT_Reif, CT_Comparison, CMPT_LT, VT_Float, aux_float_lt_zero_iff_1__POST); _aCT.emplace_back("float_eq_reif__POST", t_VFFVIF, RIT_Reif, CT_Comparison, CMPT_EQ, VT_Float, float_eq_reif__POST); _aCT.emplace_back("float_ne__POST", t_VFFF, RIT_Static, CT_Comparison, CMPT_NE, VT_Float, float_ne__POST); _aCT.emplace_back("aux_float_eq_zero_if_1__POST", t_VFVIVF, RIT_Halfreif, CT_Comparison, CMPT_EQ_0, VT_Float, aux_float_eq_zero_if_1__POST); _aCT.emplace_back("aux_int_le_zero_if_1__POST", t_VIVI, RIT_Halfreif, CT_Comparison, CMPT_LE_0, VT_Int, aux_int_le_zero_if_1__POST); _aCT.emplace_back("aux_float_le_zero_if_1__POST", t_VFVIVF, RIT_Halfreif, CT_Comparison, CMPT_LE_0, VT_Float, aux_float_le_zero_if_1__POST); _aCT.emplace_back("aux_float_lt_zero_if_1__POST", t_VFVIVFF, RIT_Halfreif, CT_Comparison, CMPT_LT_0, VT_Float, aux_float_lt_zero_if_1__POST); _aCT.emplace_back("equality_encoding__POST", t_VIAVI, RIT_Static, CT_Encode, CMPT_None, VT_Int, equality_encoding__POST); _aCT.emplace_back("set_in__POST", t_VISI, RIT_Static, CT_SetIn, CMPT_None, VT_Int, set_in__POST); _aCT.emplace_back("set_in_reif__POST", t_VISIVI, RIT_Reif, CT_SetIn, CMPT_None, VT_Int, set_in_reif__POST); /// Registering all declared & compatible __POST constraints /// (First, cleanup FunctionIs' payload: -- ! doing now) for (int i = 0; i < _aCT.size(); ++i) { FunctionI* fi = env.model->matchFn(env, ASTString(_aCT[i].sFuncName), _aCT[i].aParams, false); if (fi != nullptr) { _mCallTypes[fi] = _aCT.data() + i; _aCT[i].pfi = fi; // fi->pPayload = (void*)this; // std::cerr << " FOund declaration: " << _aCT[i].sFuncName << std::endl; } else { _aCT[i].pfi = nullptr; DBGOUT_MIPD(" MIssing declaration: " << _aCT[i].sFuncName); return false; } } return true; } /// Registering all __POST calls' domain-constrained variables void registerPOSTVariables() { EnvI& env = getEnv()->envi(); GCLock lock; Model& mFlat = *getEnv()->flat(); // First, cleanup VarDecls' payload which stores index in _vVarDescr for (VarDeclIterator ivd = mFlat.vardecls().begin(); ivd != mFlat.vardecls().end(); ++ivd) { ivd->e()->payload(-1); } // Now add variables with non-contiguous domain for (VarDeclIterator ivd = mFlat.vardecls().begin(); ivd != mFlat.vardecls().end(); ++ivd) { VarDecl* vd0 = ivd->e(); bool fNonCtg = false; if (vd0->type().isint()) { // currently only for int vars TODO if (Expression* eDom = vd0->ti()->domain()) { IntSetVal* dom = eval_intset(env, eDom); fNonCtg = (dom->size() > 1); } } if (fNonCtg) { DBGOUT_MIPD(" Variable " << vd0->id()->str() << ": non-contiguous domain " << (*(vd0->ti()->domain()))); if (vd0->payload() == -1) { // ! yet visited vd0->payload(static_cast(_vVarDescr.size())); _vVarDescr.emplace_back(vd0, vd0->type().isint()); // can use /prmTypes/ as well if (vd0->e() != nullptr) { checkInitExpr(vd0); } } else { DBGOUT_MIPD__(" (already touched)"); } ++MIPD__stats[N_POSTs__domain]; ++MIPD__stats[N_POSTs__all]; } } // Iterate thru original __POST constraints to mark constrained vars: for (ConstraintIterator ic = mFlat.constraints().begin(); ic != mFlat.constraints().end(); ++ic) { if (ic->removed()) { continue; } if (Call* c = ic->e()->dynamicCast()) { auto ipct = _mCallTypes.find(c->decl()); if (ipct != _mCallTypes.end()) { // No ! here because might be deleted immediately in later versions. // ic->remove(); // mark removed at once MZN_MIPD__assert_hard(c->argCount() > 1); ++MIPD__stats[N_POSTs__all]; VarDecl* vd0 = expr2VarDecl(c->arg(0)); if (nullptr == vd0) { DBGOUT_MIPD__(" Call " << *c << ": 1st arg not a VarDecl, removing if eq_encoding..."); /// Only allow literals as main argument for equality_encoding if (equality_encoding__POST == ipct->first) { // was MZN_MIPD__assert_hard before MZN 2017 ic->remove(); } continue; // ignore this call } DBGOUT_MIPD__(" Call " << c->id().str() << " uses variable " << vd0->id()->str()); if (vd0->payload() == -1) { // ! yet visited vd0->payload(static_cast(_vVarDescr.size())); _vVarDescr.emplace_back(vd0, vd0->type().isint()); // can use /prmTypes/ as well // bounds/domains later for each involved var TODO if (vd0->e() != nullptr) { checkInitExpr(vd0); } } else { DBGOUT_MIPD__(" (already touched)"); } DBGOUT_MIPD(""); if (equality_encoding__POST == c->decl()) { MZN_MIPD__assert_hard(!_vVarDescr[vd0->payload()].pEqEncoding); _vVarDescr[vd0->payload()].pEqEncoding = &*ic; DBGOUT_MIPD(" Variable " << vd0->id()->str() << " has eq_encode."); } // + if has aux_ constraints? else { _vVarDescr[vd0->payload()].aCalls.push_back(&*ic); } } } } MIPD__stats[N_POSTs__varsDirect] = static_cast(_vVarDescr.size()); } // Should only be called on a newly added variable // OR when looking thru all non-touched vars /// Checks init expr of a variable /// Return true IFF new connection /// The bool param requires RHS to be POST-touched // Guido: can! be recursive in FZN bool checkInitExpr(VarDecl* vd, bool fCheckArg = false) { MZN_MIPD__assert_hard(vd->e()); if (!vd->type().isint() && !vd->type().isfloat()) { return false; } if (!fCheckArg) { MZN_MIPD__assert_hard(vd->payload() >= 0); } if (Id* id = vd->e()->dynamicCast()) { // const int f1 = ( vd->payload()>=0 ); // const int f2 = ( id->decl()->payload()>=0 ); if (!fCheckArg || (id->decl()->payload() >= 0)) { DBGOUT_MIPD__(" Checking init expr "); DBGOUT_MIPD_SELF(debugprint(vd)); LinEq2Vars led; // FAILS: // led.vd = { vd, expr2VarDecl(id->decl()->e()) }; led.vd = {{vd, expr2VarDecl(vd->e())}}; led.coefs = {{1.0, -1.0}}; led.rhs = 0.0; put2VarsConnection(led, false); ++MIPD__stats[N_POSTs__initexpr1id]; if (id->decl()->e() != nullptr) { // no initexpr for initexpr FAILS on cc-base.mzn checkInitExpr(id->decl()); } return true; // in any case } } else if (Call* c = vd->e()->dynamicCast()) { if (lin_exp_int == c->decl() || lin_exp_float == c->decl()) { // std::cerr << " !E call " << std::flush; // debugprint(c); MZN_MIPD__assert_hard(c->argCount() == 3); // ArrayLit* al = c->args()[1]->dynamicCast(); auto* al = follow_id(c->arg(1))->cast(); MZN_MIPD__assert_hard(al); MZN_MIPD__assert_hard(al->size() >= 1); if (al->size() == 1) { // 1-term scalar product in the rhs LinEq2Vars led; led.vd = {{vd, expr2VarDecl((*al)[0])}}; // const int f1 = ( vd->payload()>=0 ); // const int f2 = ( led.vd[1]->payload()>=0 ); if (!fCheckArg || (led.vd[1]->payload() >= 0)) { // Can use a!her map here: // if ( _sCallLinEq2.end() != _sCallLinEq2.find(c) ) // continue; // _sCallLinEq2.insert(c); // memorize this call DBGOUT_MIPD__(" REG 1-LINEXP "); DBGOUT_MIPD_SELF(debugprint(vd)); std::array coef0; expr2Array(c->arg(0), coef0); led.coefs = {{-1.0, coef0[0]}}; led.rhs = -expr2Const(c->arg(2)); // MINUS put2VarsConnection(led, false); ++MIPD__stats[N_POSTs__initexpr1linexp]; if (led.vd[1]->e() != nullptr) { // no initexpr for initexpr FAILS TODO checkInitExpr(led.vd[1]); } return true; // in any case } } else if (true) { // NOLINT: check larger views always. OK? TODO // if ( vd->payload()>=0 ) { // larger views // TODO should be here? // std::cerr << " LE_" << al->v().size() << ' ' << std::flush; DBGOUT_MIPD(" REG N-LINEXP "); DBGOUT_MIPD_SELF(debugprint(vd)); // Checking all but adding only touched defined vars? return findOrAddDefining(vd->id(), c); } } } return false; } /// Build var cliques (i.e. of var pairs viewing each other) void constructVarViewCliques() { // std::cerr << " Model: " << std::endl; // debugprint(getEnv()->flat()); // TAgenda agenda(_vVarDescr.size()), agendaNext; // for ( int i=0; i(_vVarDescr.size()); } void propagateViews(bool& fChanges) { // EnvI& env = getEnv()->envi(); GCLock lock; // Iterate thru original 2-variable equalities to mark views: Model& mFlat = *getEnv()->flat(); DBGOUT_MIPD(" CHECK ALL INITEXPR if they access a touched variable:"); for (VarDeclIterator ivd = mFlat.vardecls().begin(); ivd != mFlat.vardecls().end(); ++ivd) { if (ivd->removed()) { continue; } if ((ivd->e()->e() != nullptr) && ivd->e()->payload() < 0 // untouched && (ivd->e()->type().isint() || ivd->e()->type().isfloat())) { // scalars if (checkInitExpr(ivd->e(), true)) { fChanges = true; } } } DBGOUT_MIPD(" CHECK ALL CONSTRAINTS for 2-var equations:"); for (ConstraintIterator ic = mFlat.constraints().begin(); ic != mFlat.constraints().end(); ++ic) { // std::cerr << " SEE constraint: " << " "; // debugprint(&*ic); // debugprint(c->decl()); if (ic->removed()) { continue; } if (Call* c = ic->e()->dynamicCast()) { const bool fIntLinEq = int_lin_eq == c->decl(); const bool fFloatLinEq = float_lin_eq == c->decl(); if (fIntLinEq || fFloatLinEq) { // std::cerr << " !E call " << std::flush; // debugprint(c); MZN_MIPD__assert_hard(c->argCount() == 3); auto* al = follow_id(c->arg(1))->cast(); MZN_MIPD__assert_hard(al); if (al->size() == 2) { // 2-term eqn LinEq2Vars led; expr2DeclArray(c->arg(1), led.vd); // At least 1 touched var: if (nullptr != led.vd[0] && nullptr != led.vd[1]) { if (led.vd[0]->payload() >= 0 || led.vd[1]->payload() >= 0) { if (_sCallLinEq2.end() != _sCallLinEq2.find(c)) { continue; } _sCallLinEq2.insert(c); // memorize this call DBGOUT_MIPD(" REG 2-call "); DBGOUT_MIPD_SELF(debugprint(c)); led.rhs = expr2Const(c->arg(2)); expr2Array(c->arg(0), led.coefs); MZN_MIPD__assert_hard(2 == led.coefs.size()); fChanges = true; put2VarsConnection(led); ++MIPD__stats[fIntLinEq ? N_POSTs__eq2intlineq : N_POSTs__eq2floatlineq]; } } } else if (al->size() == 1) { static int nn = 0; if (++nn <= 7) { std::cerr << " MIPD: LIN_EQ with 1 variable::: " << std::flush; std::cerr << (*c) << std::endl; } } else { // larger eqns // TODO should be here? auto* eVD = get_annotation(c->ann(), constants().ann.defines_var); if (eVD != nullptr) { if (_sCallLinEqN.end() != _sCallLinEqN.find(c)) { continue; } _sCallLinEqN.insert(c); // memorize this call DBGOUT_MIPD(" REG N-call "); DBGOUT_MIPD_SELF(debugprint(c)); Call* pC = eVD->dynamicCast(); MZN_MIPD__assert_hard(pC); MZN_MIPD__assert_hard(pC->argCount()); // Checking all but adding only touched defined vars? Seems too long. VarDecl* vd = expr2VarDecl(pC->arg(0)); if ((vd != nullptr) && vd->payload() >= 0) { // only if touched if (findOrAddDefining(pC->arg(0), c)) { fChanges = true; } } } } } else // const bool fI2F = (int2float==c->decl()); // const bool fIVR = (constants().varRedef==c->decl()); // if ( fI2F || fIVR ) { if (int2float == c->decl() || constants().varRedef == c->decl()) { // std::cerr << " !E call " << std::flush; // debugprint(c); MZN_MIPD__assert_hard(c->argCount() == 2); LinEq2Vars led; // led.vd.resize(2); led.vd[0] = expr2VarDecl(c->arg(0)); led.vd[1] = expr2VarDecl(c->arg(1)); // At least 1 touched var: if (led.vd[0]->payload() >= 0 || led.vd[1]->payload() >= 0) { if (_sCallInt2Float.end() != _sCallInt2Float.find(c)) { continue; } _sCallInt2Float.insert(c); // memorize this call DBGOUT_MIPD(" REG call "); DBGOUT_MIPD_SELF(debugprint(c)); led.rhs = 0.0; led.coefs = {{1.0, -1.0}}; fChanges = true; put2VarsConnection(led); ++MIPD__stats[int2float == c->decl() ? N_POSTs__int2float : N_POSTs__internalvarredef]; } } } } } /// This vector stores the linear part of a general view /// x = + rhs typedef std::vector > TLinExpLin; /// This struct has data describing the rest of a general view struct NViewData { VarDecl* pVarDefined = nullptr; double coef0 = 1.0; double rhs; }; typedef std::map NViewMap; NViewMap _mNViews; /// compare to an existing defining linexp, || just add it to the map /// adds only touched defined vars /// return true iff new linear connection // linexp: z = a^T x+b // _lin_eq: a^T x == b bool findOrAddDefining(Expression* exp, Call* pC) { Id* pId = exp->dynamicCast(); MZN_MIPD__assert_hard(pId); VarDecl* vd = pId->decl(); MZN_MIPD__assert_hard(vd); MZN_MIPD__assert_hard(pC->argCount() == 3); TLinExpLin rhsLin; NViewData nVRest; nVRest.pVarDefined = vd; nVRest.rhs = expr2Const(pC->arg(2)); std::vector vars; expr2DeclArray(pC->arg(1), vars); std::vector coefs; expr2Array(pC->arg(0), coefs); MZN_MIPD__assert_hard(vars.size() == coefs.size()); int nVD = 0; for (int i = 0; i < vars.size(); ++i) { // MZN_MIPD__assert_hard( 0.0!=std::fabs if (vd == vars[i]) { // when int/float_lin_eq :: defines_var(vd) "Recursive definition of " << *vd nVRest.coef0 = -coefs[i]; nVRest.rhs = -nVRest.rhs; ++nVD; } else { rhsLin.push_back(std::make_pair(vars[i], coefs[i])); } } MZN_MIPD__assert_hard(1 >= nVD); std::sort(rhsLin.begin(), rhsLin.end()); // Divide the equation by the 1st coef const double coef1 = rhsLin.begin()->second; MZN_MIPD__assert_hard(0.0 != std::fabs(coef1)); nVRest.coef0 /= coef1; nVRest.rhs /= coef1; for (auto& rhsL : rhsLin) { rhsL.second /= coef1; } auto it = _mNViews.find(rhsLin); if (_mNViews.end() != it && nVRest.pVarDefined != it->second.pVarDefined) { // don't connect to itself LinEq2Vars leq; leq.vd = {{nVRest.pVarDefined, it->second.pVarDefined}}; leq.coefs = {{nVRest.coef0, -it->second.coef0}}; // +, - leq.rhs = nVRest.rhs - it->second.rhs; put2VarsConnection(leq, false); ++MIPD__stats[nVD != 0 ? N_POSTs__eqNlineq : N_POSTs__initexprN]; return true; } if (vd->payload() >= 0) { // only touched _mNViews[rhsLin] = nVRest; return true; // can lead to a new connection } return false; } static void propagateImplViews(bool& fChanges) { // EnvI& env = getEnv()->envi(); GCLock lock; // TODO } /// Could be better to mark the calls instead: std::unordered_set _sCallLinEq2, _sCallInt2Float, _sCallLinEqN; class TClique : public std::vector { // need more info? public: /// This function takes the 1st variable && relates all to it /// Return false if contrad / disconnected graph // bool findRelations0() { // return true; // } }; typedef std::vector TCLiqueList; TCLiqueList _aCliques; /// register a 2-variable lin eq /// add it to the var clique, joining the participants' cliques if needed void put2VarsConnection(LinEq2Vars& led, bool fCheckinitExpr = true) { MZN_MIPD__assert_hard(led.coefs.size() == led.vd.size()); MZN_MIPD__assert_hard(led.vd.size() == 2); DBGOUT_MIPD__(" Register 2-var connection: " << led); /// Check it's not same 2 vars if (led.vd[0] == led.vd[1]) { MZN_MIPD__assert_soft( 0, "MIPD: STRANGE: registering var connection to itself: " << led << ", skipping"); MZN_MIPD__ASSERT_FOR_SAT(fabs(led.coefs[0] + led.coefs[1]) < 1e-6, // TODO param getEnv()->envi(), led.vd[0]->loc(), "Var connection to itself seems to indicate UNSAT: " << led); return; } // register if new variables // std::vector fHaveClq(led.vd.size(), false); int nCliqueAvailable = -1; for (auto* vd : led.vd) { if (vd->payload() < 0) { // ! yet visited vd->payload(static_cast(_vVarDescr.size())); _vVarDescr.emplace_back(vd, vd->type().isint()); // can use /prmTypes/ as well if (fCheckinitExpr && (vd->e() != nullptr)) { checkInitExpr(vd); } } else { int nMaybeClq = _vVarDescr[vd->payload()].nClique; if (nMaybeClq >= 0) { nCliqueAvailable = nMaybeClq; } // MZN_MIPD__assert_hard( nCliqueAvailable>=0 ); // fHaveClq[i] = true; } } if (nCliqueAvailable < 0) { // no clique found nCliqueAvailable = static_cast(_aCliques.size()); _aCliques.resize(_aCliques.size() + 1); } DBGOUT_MIPD(" ...adding to clique " << nCliqueAvailable << " of size " << _aCliques[nCliqueAvailable].size()); TClique& clqNew = _aCliques[nCliqueAvailable]; clqNew.push_back(led); for (auto* vd : led.vd) { // merging cliques int& nMaybeClq = _vVarDescr[vd->payload()].nClique; if (nMaybeClq >= 0 && nMaybeClq != nCliqueAvailable) { TClique& clqOld = _aCliques[nMaybeClq]; MZN_MIPD__assert_hard(clqOld.size()); for (auto& eq2 : clqOld) { for (auto* vd : eq2.vd) { // point all the variables to the new clique _vVarDescr[vd->payload()].nClique = nCliqueAvailable; } } clqNew.insert(clqNew.end(), clqOld.begin(), clqOld.end()); clqOld.clear(); // Can use C++11 move TODO DBGOUT_MIPD(" +++ Joining cliques"); } nMaybeClq = nCliqueAvailable; // Could mark as 'unused' TODO } } /// Finds a clique variable to which all domain constr are related class TCliqueSorter { MIPD& _mipd; const int _iVarStart; // this is the first var to which all others are related public: // VarDecl* varRef0=0; // this is the first var to which all others are related VarDecl* varRef1 = nullptr; // this is the 2nd main reference. // it is a var with eq_encode, || // an (integer if any) variable with the least rel. factor bool fRef1HasEqEncode = false; /// This map stores the relations y = ax+b of all the clique's vars to y typedef std::unordered_map > TMapVars; TMapVars mRef0, mRef1; // to the main var 0, 1 class TMatrixVars : public std::unordered_map { public: /// Check existing connection template bool checkExistingArc(IVarDecl begV, double A, double B, bool fReportRepeat = true) { auto it1 = this->find(*begV); if (this->end() != it1) { auto it2 = it1->second.find(*(begV + 1)); if (it1->second.end() != it2) { MZN_MIPD__assert_hard(std::fabs(it2->second.first - A) < 1e-6 * std::max(std::fabs(it2->second.first), std::fabs(A))); MZN_MIPD__assert_hard(std::fabs(it2->second.second - B) < 1e-6 * std::max(std::fabs(it2->second.second), std::fabs(B)) + 1e-6); MZN_MIPD__assert_hard(std::fabs(A) != 0.0); MZN_MIPD__assert_soft(!fVerbose || std::fabs(A) > 1e-12, " Very small coef: " << (*begV)->id()->str() << " = " << A << " * " << (*(begV + 1))->id()->str() << " + " << B); if (fReportRepeat) { MZN_MIPD__assert_soft(!fVerbose, "LinEqGraph: eqn between " << (*begV)->id()->str() << " && " << (*(begV + 1))->id()->str() << " is repeated. "); } return true; } } return false; } }; class LinEqGraph : public TMatrixVars { public: static double dCoefMin, dCoefMax; /// Stores the arc (x1, x2) as x1 = a*x2 + b /// so that a constraint on x2, say x2<=c <-> f, /// is equivalent to one for x1: x1 <=/>= a*c+b <-> f //// ( the other way involves division: //// so that a constraint on x1, say x1<=c <-> f, //// can easily be converted into one for x2 as a*x2 <= c-b <-> f //// <=> x2 (care for sign) (c-b)/a <-> f ) template void addArc(ICoef begC, IVarDecl begV, double rhs) { MZN_MIPD__assert_soft(!fVerbose || std::fabs(*begC) >= 1e-10, " Vars " << (*begV)->id()->str() << " to " << (*(begV + 1))->id()->str() << ": coef=" << (*begC)); // Transform Ax+By=C into x = -B/Ay+C/A const double negBA = -(*(begC + 1)) / (*begC); const double CA = rhs / (*begC); checkExistingArc(begV, negBA, CA); (*this)[*begV][*(begV + 1)] = std::make_pair(negBA, CA); const double dCoefAbs = std::fabs(negBA); if (dCoefAbs < dCoefMin) { dCoefMin = dCoefAbs; } if (dCoefAbs > dCoefMax) { dCoefMax = dCoefAbs; } } void addEdge(const LinEq2Vars& led) { addArc(led.coefs.begin(), led.vd.begin(), led.rhs); addArc(led.coefs.rbegin(), led.vd.rbegin(), led.rhs); } /// Propagate linear relations from the given variable void propagate(iterator itStart, TMapVars& mWhereStore) { MZN_MIPD__assert_hard(this->end() != itStart); TMatrixVars mTemp; mTemp[itStart->first] = itStart->second; // init with existing DBGOUT_MIPD("Propagation started from " << itStart->first->id()->str() << " having " << itStart->second.size() << " connections"); propagate2(itStart, itStart, std::make_pair(1.0, 0.0), mTemp); mWhereStore = mTemp.begin()->second; MZN_MIPD__assert_hard_msg( mWhereStore.size() == this->size() - 1, "Variable " << (*(mTemp.begin()->first)) << " should be connected to all others in the clique, but " << "|edges|==" << mWhereStore.size() << ", |all nodes|==" << this->size()); } /// Propagate linear relations from it1 via it2 void propagate2(iterator itSrc, iterator itVia, std::pair rel, TMatrixVars& mWhereStore) { for (auto itDst = itVia->second.begin(); itDst != itVia->second.end(); ++itDst) { // Transform x1=A1x2+B1, x2=A2x3+B2 into x1=A1A2x3+A1B2+B1 if (itDst->first == itSrc->first) { continue; } const double A1A2 = rel.first * itDst->second.first; const double A1B2plusB1 = rel.first * itDst->second.second + rel.second; bool fDive = true; if (itSrc != itVia) { PVarDecl vd[2] = {itSrc->first, itDst->first}; if (!mWhereStore.checkExistingArc(vd, A1A2, A1B2plusB1, false)) { mWhereStore[vd[0]][vd[1]] = std::make_pair(A1A2, A1B2plusB1); DBGOUT_MIPD(" PROPAGATING: " << vd[0]->id()->str() << " = " << A1A2 << " * " << vd[1]->id()->str() << " + " << A1B2plusB1); } else { fDive = false; } } if (fDive) { auto itDST = this->find(itDst->first); MZN_MIPD__assert_hard(this->end() != itDST); propagate2(itSrc, itDST, std::make_pair(A1A2, A1B2plusB1), mWhereStore); } } } }; LinEqGraph leg; TCliqueSorter(MIPD* pm, int iv) : _mipd(*pm), _iVarStart(iv) {} void doRelate() { MZN_MIPD__assert_hard(_mipd._vVarDescr[_iVarStart].nClique >= 0); const TClique& clq = _mipd._aCliques[_mipd._vVarDescr[_iVarStart].nClique]; for (const auto& eq2 : clq) { leg.addEdge(eq2); } DBGOUT_MIPD(" Clique " << _mipd._vVarDescr[_iVarStart].nClique << ": " << leg.size() << " variables, " << clq.size() << " connections."); for (auto& it1 : leg) { _mipd._vVarDescr[it1.first->payload()].fDomainConstrProcessed = 1U; } // Propagate the 1st var's relations: leg.propagate(leg.begin(), mRef0); // Find a best main variable according to: // 1. isInt 2. hasEqEncode 3. abs linFactor to ref0 varRef1 = leg.begin()->first; std::array aCrit = { {(double)_mipd._vVarDescr[varRef1->payload()].fInt, static_cast(_mipd._vVarDescr[varRef1->payload()].pEqEncoding != nullptr), 1.0}}; for (auto& it2 : mRef0) { VarDescr& vard = _mipd._vVarDescr[it2.first->payload()]; std::array aCrit1 = {{(double)vard.fInt, static_cast(vard.pEqEncoding != nullptr), std::fabs(it2.second.first)}}; if (aCrit1 > aCrit) { varRef1 = it2.first; aCrit = aCrit1; } } leg.propagate(leg.find(varRef1), mRef1); } }; // class TCliqueSorter /// Build a domain decomposition for a clique /// a clique can consist of just 1 var without a clique object class DomainDecomp { public: MIPD& mipd; const int iVarStart; TCliqueSorter cls; SetOfIntvReal sDomain; DomainDecomp(MIPD* pm, int iv) : mipd(*pm), iVarStart(iv), cls(pm, iv) { sDomain.insert(IntvReal()); // the decomposed domain. Init to +-inf } void doProcess() { // Choose the main variable && relate all others to it const int nClique = mipd._vVarDescr[iVarStart].nClique; if (nClique >= 0) { cls.doRelate(); } else { cls.varRef1 = mipd._vVarDescr[iVarStart].vd; } // Adding itself: cls.mRef1[cls.varRef1] = std::make_pair(1.0, 0.0); int iVarRef1 = cls.varRef1->payload(); MZN_MIPD__assert_hard(nClique == mipd._vVarDescr[iVarRef1].nClique); cls.fRef1HasEqEncode = (mipd._vVarDescr[iVarRef1].pEqEncoding != nullptr); // First, construct the domain decomposition in any case // projectVariableConstr( cls.varRef1, std::make_pair(1.0, 0.0) ); // if ( nClique >= 0 ) { for (auto& iRef1 : cls.mRef1) { projectVariableConstr(iRef1.first, iRef1.second); } DBGOUT_MIPD("Clique " << nClique << ": main ref var " << cls.varRef1->id()->str() << ", domain dec: " << sDomain); MZN_MIPD__ASSERT_FOR_SAT(!sDomain.empty(), mipd.getEnv()->envi(), cls.varRef1->loc(), "clique " << nClique << ": main ref var " << *cls.varRef1->id() << ", domain decomposition seems empty: " << sDomain); MZN_MIPD__FLATTENING_ERROR__IF_NOT(sDomain.checkFiniteBounds(), mipd.getEnv()->envi(), cls.varRef1->loc(), "variable " << *cls.varRef1->id() << " needs finite bounds for linearisation." " Or, use indicator constraints. " << "Current domain is " << sDomain); MZN_MIPD__assert_hard(sDomain.checkDisjunctStrict()); makeRangeDomains(); // Then, use equality_encoding if available if (cls.fRef1HasEqEncode) { syncWithEqEncoding(); syncOtherEqEncodings(); } else { // ! cls.fRef1HasEqEncode if (sDomain.size() >= 2) { // need to simplify stuff otherwise considerDenseEncoding(); createDomainFlags(); } } implementPOSTs(); // Statistics if (sDomain.size() < MIPD__stats[N_POSTs__NSubintvMin]) { MIPD__stats[N_POSTs__NSubintvMin] = static_cast(sDomain.size()); } MIPD__stats[N_POSTs__NSubintvSum] += sDomain.size(); if (sDomain.size() > MIPD__stats[N_POSTs__NSubintvMax]) { MIPD__stats[N_POSTs__NSubintvMax] = static_cast(sDomain.size()); } for (const auto& intv : sDomain) { const auto nSubSize = intv.right - intv.left; if (nSubSize < MIPD__stats[N_POSTs__SubSizeMin]) { MIPD__stats[N_POSTs__SubSizeMin] = nSubSize; } MIPD__stats[N_POSTs__SubSizeSum] += nSubSize; if (nSubSize > MIPD__stats[N_POSTs__SubSizeMax]) { MIPD__stats[N_POSTs__SubSizeMax] = nSubSize; } } if (cls.fRef1HasEqEncode) { ++MIPD__stats[N_POSTs__cliquesWithEqEncode]; } } /// Project the domain-related constraints of a variable into the clique /// Deltas should be scaled but to a minimum of the target's discr /// COmparison sense changes on negated vars void projectVariableConstr(VarDecl* vd, std::pair eq1) { DBGOUT_MIPD__(" MIPD: projecting variable "); DBGOUT_MIPD_SELF(debugprint(vd)); // Always check if domain becomes empty? TODO const double A = eq1.first; // vd = A*arg + B. conversion const double B = eq1.second; // process domain info double lb = B; double ub = A + B; // projected bounds for bool if (vd->ti()->domain() != nullptr) { if (vd->type().isint() || vd->type().isfloat()) { // INT VAR OR FLOAT VAR SetOfIntvReal sD1; convertIntSet(vd->ti()->domain(), sD1, cls.varRef1, A, B); sDomain.intersect(sD1); DBGOUT_MIPD(" Clique domain after proj of the init. domain " << sD1 << " of " << (vd->type().isint() ? "varint" : "varfloat") << A << " * " << vd->id()->str() << " + " << B << ": " << sDomain); auto bnds = sD1.getBounds(); lb = bnds.left; ub = bnds.right; } else { MZN_MIPD__FLATTENING_ERROR__IF_NOT(0, mipd.getEnv()->envi(), cls.varRef1->loc(), "Variable " << vd->id()->str() << " of type " << vd->type().toString(mipd._env->envi()) << " has a domain."); } // /// Deleting var domain: // vd->ti()->domain( NULL ); } else { if (nullptr == vd->ti()->domain() && !vd->type().isbool()) { lb = IntvReal::infMinus(); ub = IntvReal::infPlus(); } } auto bnds = sDomain.getBounds(); // can change TODO // process calls. Can use the constr type info. auto& aCalls = mipd._vVarDescr[vd->payload()].aCalls; for (Item* pItem : aCalls) { auto* pCI = pItem->dynamicCast(); MZN_MIPD__assert_hard(pCI != nullptr); Call* pCall = pCI->e()->dynamicCast(); MZN_MIPD__assert_hard(pCall != nullptr); DBGOUT_MIPD__("PROPAG CALL "); DBGOUT_MIPD_SELF(debugprint(pCall)); // check the bounds for bool in reifs? TODO auto ipct = mipd._mCallTypes.find(pCall->decl()); MZN_MIPD__assert_hard(mipd._mCallTypes.end() != ipct); const DCT& dct = *ipct->second; int nCmpType_ADAPTED = dct.nCmpType; if (A < 0.0) { // negative factor if (std::abs(nCmpType_ADAPTED) >= 4) { // inequality nCmpType_ADAPTED = -nCmpType_ADAPTED; } } switch (dct.nConstrType) { case CT_SetIn: { SetOfIntvReal SS; convertIntSet(pCall->arg(1), SS, cls.varRef1, A, B); if (RIT_Static == dct.nReifType) { sDomain.intersect(SS); ++MIPD__stats[N_POSTs__setIn]; } else { sDomain.cutDeltas(SS, std::max(1.0, std::fabs(A))); // deltas to scale ++MIPD__stats[N_POSTs__setInReif]; } } break; case CT_Comparison: if (RIT_Reif == dct.nReifType) { const double rhs = (mipd.aux_float_lt_zero_iff_1__POST == pCall->decl()) ? B /* + A*0.0, relating to 0 */ // The 2nd argument is constant: : A * MIPD::expr2Const(pCall->arg(1)) + B; const double rhsUp = rndUpIfInt(cls.varRef1, rhs); const double rhsDown = rndDownIfInt(cls.varRef1, rhs); const double rhsRnd = rndIfInt(cls.varRef1, rhs); /// Strictly, for delta we should finish domain reductions first... TODO? const double delta = computeDelta(cls.varRef1, vd, bnds, A, pCall, 3); switch (nCmpType_ADAPTED) { case CMPT_LE: sDomain.cutDeltas(IntvReal::infMinus(), rhsDown, delta); break; case CMPT_GE: sDomain.cutDeltas(rhsUp, IntvReal::infPlus(), delta); break; case CMPT_LT_0: sDomain.cutDeltas(IntvReal::infMinus(), rhsDown - delta, delta); break; case CMPT_GT_0: sDomain.cutDeltas(rhsUp + delta, IntvReal::infPlus(), delta); break; case CMPT_EQ: if (!(cls.varRef1->type().isint() && // skip if int target var std::fabs(rhs - rhsRnd) > INT_EPS)) { // && fract value sDomain.cutDeltas(rhsRnd, rhsRnd, delta); } break; default: MZN_MIPD__assert_hard_msg(0, " No other reified cmp type "); } ++MIPD__stats[(vd->ti()->type().isint()) ? N_POSTs__intCmpReif : N_POSTs__floatCmpReif]; } else if (RIT_Static == dct.nReifType) { // _ne, later maybe static ineq TODO MZN_MIPD__assert_hard(CMPT_NE == dct.nCmpType); const double rhs = A * MIPD::expr2Const(pCall->arg(1)) + B; const double rhsRnd = rndIfInt(cls.varRef1, rhs); bool fSkipNE = (cls.varRef1->type().isint() && std::fabs(rhs - rhsRnd) > INT_EPS); if (!fSkipNE) { const double delta = computeDelta(cls.varRef1, vd, bnds, A, pCall, 2); sDomain.cutOut({rhsRnd - delta, rhsRnd + delta}); } ++MIPD__stats[(vd->ti()->type().isint()) ? N_POSTs__intNE : N_POSTs__floatNE]; } else { // aux_ relate to 0.0 // But we don't modify domain splitting for them currently ++MIPD__stats[(vd->ti()->type().isint()) ? N_POSTs__intAux : N_POSTs__floatAux]; MZN_MIPD__assert_hard(RIT_Halfreif == dct.nReifType); // const double rhs = B; // + A*0 // const double delta = vd->type().isint() ? 1.0 : 1e-5; // // TODO : eps } break; case CT_Encode: // See if any further constraints here? TODO ++MIPD__stats[N_POSTs__eq_encode]; break; default: MZN_MIPD__assert_hard_msg(0, "Unknown constraint type"); } } DBGOUT_MIPD(" Clique domain after proj of " << A << " * " << vd->id()->str() << " + " << B << ": " << sDomain); } static double rndIfInt(VarDecl* vdTarget, double v) { return vdTarget->type().isint() ? std::round(v) : v; } static double rndIfBothInt(VarDecl* vdTarget, double v) { if (!vdTarget->type().isint()) { return v; } const double vRnd = std::round(v); return (fabs(v - vRnd) < INT_EPS) ? vRnd : v; } static double rndUpIfInt(VarDecl* vdTarget, double v) { return vdTarget->type().isint() ? std::ceil(v - INT_EPS) : v; } static double rndDownIfInt(VarDecl* vdTarget, double v) { return vdTarget->type().isint() ? std::floor(v + INT_EPS) : v; } void makeRangeDomains() { auto bnds = sDomain.getBounds(); for (auto& iRef1 : cls.mRef1) { VarDecl* vd = iRef1.first; // projecting the bounds back: double lb0 = (bnds.left - iRef1.second.second) / iRef1.second.first; double ub0 = (bnds.right - iRef1.second.second) / iRef1.second.first; if (lb0 > ub0) { MZN_MIPD__assert_hard(iRef1.second.first < 0.0); std::swap(lb0, ub0); } if (vd->type().isint()) { lb0 = rndUpIfInt(vd, lb0); ub0 = rndDownIfInt(vd, ub0); } setVarDomain(vd, lb0, ub0); } } /// tightens element bounds in the existing eq_encoding of varRef1 /// necessary because if one exists, int_ne is not translated into it /// Can also back-check from there? TODO /// And further checks TODO void syncWithEqEncoding() { std::vector pp; auto bnds = sDomain.getBounds(); const long long iMin = mipd.expr2ExprArray( mipd._vVarDescr[cls.varRef1->payload()].pEqEncoding->e()->dynamicCast()->arg(1), pp); MZN_MIPD__assert_hard(pp.size() >= bnds.right - bnds.left + 1); MZN_MIPD__assert_hard(iMin <= bnds.left); long long vEE = iMin; DBGOUT_MIPD__( " SYNC EQ_ENCODE( " << (*cls.varRef1) << ", bitflags: " << *(mipd._vVarDescr[cls.varRef1->payload()].pEqEncoding->e()->dynamicCast()->arg( 1)) << " ): SETTING 0 FLAGS FOR VALUES: "); for (const auto& intv : sDomain) { for (; static_cast(vEE) < intv.left; ++vEE) { if (vEE >= static_cast(iMin + pp.size())) { return; } if (pp[vEE - iMin]->isa()) { if (pp[vEE - iMin]->dynamicCast()->decl()->type().isvar()) { DBGOUT_MIPD__(vEE << ", "); setVarDomain(pp[vEE - iMin]->dynamicCast()->decl(), 0.0, 0.0); } } } vEE = static_cast(intv.right + 1); } for (; vEE < static_cast(iMin + pp.size()); ++vEE) { if (pp[vEE - iMin]->isa()) { if (pp[vEE - iMin]->dynamicCast()->decl()->type().isvar()) { DBGOUT_MIPD__(vEE << ", "); setVarDomain(pp[vEE - iMin]->dynamicCast()->decl(), 0.0, 0.0); } } } DBGOUT_MIPD(""); } /// sync varRef1's eq_encoding with those of other variables void syncOtherEqEncodings() { // TODO This could be in the var projection? No, need the final domain } /// Depending on params, /// create an equality encoding for an integer variable /// TODO What if a float's domain is discrete? void considerDenseEncoding() { if (cls.varRef1->id()->type().isint()) { if (sDomain.maxInterval() <= mipd.nMaxIntv2Bits || sDomain.cardInt() <= mipd.dMaxNValueDensity * sDomain.size()) { sDomain.split2Bits(); ++MIPD__stats[N_POSTs__clEEEnforced]; } } } /// if ! eq_encoding, creates a flag for each subinterval in the domain /// && constrains sum(flags)==1 void createDomainFlags() { std::vector vVars(sDomain.size()); // flags for each subinterval std::vector vIntvLB(sDomain.size() + 1); std::vector vIntvUB__(sDomain.size() + 1); int i = 0; double dMaxIntv = -1.0; for (const auto& intv : sDomain) { intv.varFlag = addIntVar(0.0, 1.0); vVars[i] = intv.varFlag->id(); vIntvLB[i] = intv.left; vIntvUB__[i] = -intv.right; dMaxIntv = std::max(dMaxIntv, intv.right - intv.left); ++i; } // Sum of flags == 1 std::vector ones(sDomain.size(), 1.0); addLinConstr(ones, vVars, CMPT_EQ, 1.0); // Domain decomp vVars.push_back(cls.varRef1->id()); vIntvLB[i] = -1.0; // var1 >= sum(LBi*flagi) /// STRICT equality encoding if small intervals if (dMaxIntv > 1e-6) { // EPS = param? TODO vIntvUB__[i] = 1.0; // var1 <= sum(UBi*flagi) addLinConstr(vIntvLB, vVars, CMPT_LE, 0.0); addLinConstr(vIntvUB__, vVars, CMPT_LE, 0.0); } else { ++MIPD__stats[N_POSTs__clEEFound]; addLinConstr(vIntvLB, vVars, CMPT_EQ, 0.0); } } /// deletes them as well void implementPOSTs() { auto bnds = sDomain.getBounds(); for (auto& iRef1 : cls.mRef1) { // DBGOUT_MIPD__( " MIPD: implementing constraints of variable " ); // DBGOUT_MIPD_SELF( debugprint(vd) ); VarDecl* vd = iRef1.first; auto eq1 = iRef1.second; const double A = eq1.first; // vd = A*arg + B. conversion const double B = eq1.second; // process calls. Can use the constr type info. auto& aCalls = mipd._vVarDescr[vd->payload()].aCalls; for (Item* pItem : aCalls) { auto* pCI = pItem->dynamicCast(); MZN_MIPD__assert_hard(pCI); Call* pCall = pCI->e()->dynamicCast(); MZN_MIPD__assert_hard(pCall); DBGOUT_MIPD__("IMPL CALL "); DBGOUT_MIPD_SELF(debugprint(pCall)); // check the bounds for bool in reifs? TODO auto ipct = mipd._mCallTypes.find(pCall->decl()); MZN_MIPD__assert_hard(mipd._mCallTypes.end() != ipct); const DCT& dct = *ipct->second; int nCmpType_ADAPTED = dct.nCmpType; if (A < 0.0) { // negative factor if (std::abs(nCmpType_ADAPTED) >= 4) { // inequality nCmpType_ADAPTED = -nCmpType_ADAPTED; } } switch (dct.nConstrType) { case CT_SetIn: if (RIT_Reif == dct.nReifType) { SetOfIntvReal SS; convertIntSet(pCall->arg(1), SS, cls.varRef1, A, B); relateReifFlag(pCall->arg(2), SS); } break; case CT_Comparison: if (RIT_Reif == dct.nReifType) { const double rhs = (mipd.aux_float_lt_zero_iff_1__POST == pCall->decl()) ? B /* + A*0.0, relating to 0 */ // The 2nd argument is constant: : A * MIPD::expr2Const(pCall->arg(1)) + B; const double rhsUp = rndUpIfInt(cls.varRef1, rhs); const double rhsDown = rndDownIfInt(cls.varRef1, rhs); const double rhsRnd = rndIfBothInt( cls.varRef1, rhs); // if the ref var is int, need to round almost-int values const double delta = computeDelta(cls.varRef1, vd, bnds, A, pCall, 3); switch (nCmpType_ADAPTED) { case CMPT_LE: relateReifFlag(pCall->arg(2), {{IntvReal::infMinus(), rhsDown}}); break; case CMPT_GE: relateReifFlag(pCall->arg(2), {{rhsUp, IntvReal::infPlus()}}); break; case CMPT_LT_0: relateReifFlag(pCall->arg(1), {{IntvReal::infMinus(), rhsDown - delta}}); break; case CMPT_GT_0: relateReifFlag(pCall->arg(1), {{rhsUp + delta, IntvReal::infPlus()}}); break; case CMPT_EQ: relateReifFlag(pCall->arg(2), {{rhsRnd, rhsRnd}}); break; // ... but if the value is sign. fractional for an int var, the flag is // set=0 default: break; } } else if (RIT_Static == dct.nReifType) { // !hing here for NE MZN_MIPD__assert_hard(CMPT_NE == nCmpType_ADAPTED); } else { // aux_ relate to 0.0 // But we don't modify domain splitting for them currently MZN_MIPD__assert_hard(RIT_Halfreif == dct.nReifType); double rhs = B; // + A*0 const double rhsUp = rndUpIfInt(cls.varRef1, rhs); const double rhsDown = rndDownIfInt(cls.varRef1, rhs); const double rhsRnd = rndIfInt(cls.varRef1, rhs); double delta = 0.0; if (mipd.aux_float_lt_zero_if_1__POST == pCall->decl()) { // only float && lt delta = computeDelta(cls.varRef1, vd, bnds, A, pCall, 3); } if (nCmpType_ADAPTED < 0) { delta = -delta; } if (cls.varRef1->type().isint() && CMPT_EQ_0 != nCmpType_ADAPTED) { if (nCmpType_ADAPTED < 0) { rhs = rhsDown; } else { rhs = rhsUp; } } else { rhs += delta; } // Now we need rhs ! to be in the inner of the domain bool fUseDD = true; if (!cls.fRef1HasEqEncode) { switch (nCmpType_ADAPTED) { case CMPT_EQ_0: { auto itLB = sDomain.lower_bound(rhsRnd); fUseDD = (itLB->left == rhsRnd && itLB->right == rhsRnd); // exactly } break; case CMPT_LT_0: case CMPT_LE_0: { auto itUB = sDomain.upper_bound(rhsUp); bool fInner = false; if (sDomain.begin() != itUB) { --itUB; if (itUB->right > rhs) { fInner = true; } } fUseDD = !fInner; } break; case CMPT_GT_0: case CMPT_GE_0: { auto itLB = sDomain.lower_bound(rhsDown); bool fInner = false; if (sDomain.begin() != itLB) { --itLB; if (itLB->right >= rhs) { fInner = true; } } fUseDD = !fInner; } break; default: MZN_MIPD__assert_hard_msg(0, "Unknown halfreif cmp type"); } } if (fUseDD) { // use sDomain if (CMPT_EQ_0 == nCmpType_ADAPTED) { relateReifFlag(pCall->arg(1), {{rhsRnd, rhsRnd}}, RIT_Halfreif); } else if (nCmpType_ADAPTED < 0) { relateReifFlag(pCall->arg(1), {{IntvReal::infMinus(), rhsDown}}, RIT_Halfreif); } else { relateReifFlag(pCall->arg(1), {{rhsUp, IntvReal::infPlus()}}, RIT_Halfreif); } } else { // use big-M DBGOUT_MIPD(" AUX BY BIG-Ms: "); const bool fLE = (CMPT_EQ_0 == nCmpType_ADAPTED || 0 > nCmpType_ADAPTED); const bool fGE = (CMPT_EQ_0 == nCmpType_ADAPTED || 0 < nCmpType_ADAPTED); // Take integer || float indicator version, depending on the constrained var: const int nIdxInd = // (VT_Int==dct.nVarType) ? // No: vd->ti()->type().isint() ? 1 : 2; cls.varRef1->ti()->type().isint() ? 1 : 2; // need the type of the variable to be constr MZN_MIPD__assert_hard(static_cast(nIdxInd) < pCall->argCount()); Expression* pInd = pCall->arg(nIdxInd); if (fLE && rhs < bnds.right) { if (rhs >= bnds.left) { std::vector coefs = {1.0, bnds.right - rhs}; // Use the float version of indicator: std::vector vars = {cls.varRef1->id(), pInd}; addLinConstr(coefs, vars, CMPT_LE, bnds.right); } else { setVarDomain(MIPD::expr2VarDecl(pInd), 0.0, 0.0); } } if (fGE && rhs > bnds.left) { if (rhs <= bnds.right) { std::vector coefs = {-1.0, rhs - bnds.left}; std::vector vars = {cls.varRef1->id(), pInd}; addLinConstr(coefs, vars, CMPT_LE, -bnds.left); } else { setVarDomain(MIPD::expr2VarDecl(pInd), 0.0, 0.0); } } } } break; case CT_Encode: // See if any further constraints here? TODO break; default: MZN_MIPD__assert_hard_msg(0, "Unknown constraint type"); } pItem->remove(); // removing the call } // removing the eq_encoding call if (mipd._vVarDescr[vd->payload()].pEqEncoding != nullptr) { mipd._vVarDescr[vd->payload()].pEqEncoding->remove(); } } } /// sets varFlag = || <= sum( intv.varFlag : SS ) void relateReifFlag(Expression* expFlag, const SetOfIntvReal& SS, EnumReifType nRT = RIT_Reif) { MZN_MIPD__assert_hard(RIT_Reif == nRT || RIT_Halfreif == nRT); // MZN_MIPD__assert_hard( sDomain.size()>=2 ); VarDecl* varFlag = MIPD::expr2VarDecl(expFlag); std::vector vIntvFlags; if (cls.fRef1HasEqEncode) { // use eq_encoding MZN_MIPD__assert_hard(varFlag->type().isint()); std::vector pp; auto bnds = sDomain.getBounds(); const long long iMin = mipd.expr2ExprArray( mipd._vVarDescr[cls.varRef1->payload()].pEqEncoding->e()->dynamicCast()->arg(1), pp); MZN_MIPD__assert_hard(pp.size() >= bnds.right - bnds.left + 1); MZN_MIPD__assert_hard(iMin <= bnds.left); for (const auto& intv : SS) { for (long long vv = (long long)std::max(double(iMin), ceil(intv.left)); vv <= (long long)std::min(double(iMin) + pp.size() - 1, floor(intv.right)); ++vv) { vIntvFlags.push_back(pp[vv - iMin]); } } } else { MZN_MIPD__assert_hard(varFlag->type().isint()); for (const auto& intv : SS) { auto it1 = sDomain.lower_bound(intv.left); auto it2 = sDomain.upper_bound(intv.right); auto it11 = it1; // Check that we are looking ! into a subinterval: if (sDomain.begin() != it11) { --it11; MZN_MIPD__assert_hard(it11->right < intv.left); } auto it12 = it2; if (sDomain.begin() != it12) { --it12; MZN_MIPD__assert_hard_msg(it12->right <= intv.right, " relateReifFlag for " << intv << " in " << sDomain); } for (it12 = it1; it12 != it2; ++it12) { if (it12->varFlag != nullptr) { vIntvFlags.push_back(it12->varFlag->id()); } else { MZN_MIPD__assert_hard(1 == sDomain.size()); vIntvFlags.push_back(IntLit::a(1)); // just a constant then } } } } if (!vIntvFlags.empty()) { // Could find out if reif is true -- TODO && see above for 1 subinterval std::vector onesm(vIntvFlags.size(), -1.0); onesm.push_back(1.0); vIntvFlags.push_back(varFlag->id()); EnumCmpType nCmpType = (RIT_Reif == nRT) ? CMPT_EQ : CMPT_LE; addLinConstr(onesm, vIntvFlags, nCmpType, 0.0); } else { // the reif is false setVarDomain(varFlag, 0.0, 0.0); } } static void setVarDomain(VarDecl* vd, double lb, double ub) { // need to check if the new range is in the previous bounds... TODO if (vd->type().isfloat()) { // if ( 0.0==lb && 0.0==ub ) { auto* newDom = new BinOp(Location().introduce(), FloatLit::a(lb), BOT_DOTDOT, FloatLit::a(ub)); vd->ti()->domain(newDom); DBGOUT_MIPD(" NULL OUT: " << vd->id()->str()); // } } else if (vd->type().isint() || vd->type().isbool()) { auto* newDom = new SetLit( Location().introduce(), IntSetVal::a(static_cast(lb), static_cast(ub))); // TypeInst* nti = copy(mipd.getEnv()->envi(),varFlag->ti())->cast(); // nti->domain(newDom); vd->ti()->domain(newDom); } else { MZN_MIPD__assert_hard_msg(0, "Unknown var type "); } } VarDecl* addIntVar(double LB, double UB) { // GCLock lock; // Cache them? Only location can be different TODO auto* newDom = new SetLit(Location().introduce(), IntSetVal::a(static_cast(LB), static_cast(UB))); auto* ti = new TypeInst(Location().introduce(), Type::varint(), newDom); auto* newVar = new VarDecl(Location().introduce(), ti, mipd.getEnv()->envi().genId()); newVar->flat(newVar); mipd.getEnv()->envi().flatAddItem(new VarDeclI(Location().introduce(), newVar)); return newVar; } void addLinConstr(std::vector& coefs, std::vector& vars, EnumCmpType nCmpType, double rhs) { std::vector args(3); MZN_MIPD__assert_hard(vars.size() >= 2); for (auto* v : vars) { MZN_MIPD__assert_hard(&v); // throw std::string("addLinConstr: &var=NULL"); MZN_MIPD__assert_hard_msg(v->isa() || v->isa() || v->isa(), " expression at " << (&v) << " eid = " << v->eid() << " while E_INTLIT=" << Expression::E_INTLIT); // throw std::string("addLinConstr: only id's as variables allowed"); } MZN_MIPD__assert_hard(coefs.size() == vars.size()); MZN_MIPD__assert_hard(CMPT_EQ == nCmpType || CMPT_LE == nCmpType); DBGOUT_MIPD_SELF( // LinEq leq; leq.coefs=coefs; leq.vd=vars; leq.rhs=rhs; DBGOUT_MIPD__(" ADDING " << (CMPT_EQ == nCmpType ? "LIN_EQ" : "LIN_LE") << ": [ "); for (auto c : coefs) DBGOUT_MIPD__(c << ','); DBGOUT_MIPD__(" ] * [ "); for (auto v : vars) { MZN_MIPD__assert_hard(!v->isa()); if (v->isa()) DBGOUT_MIPD__(v->dynamicCast()->str() << ','); // else if ( v->isa() ) // MZN_MIPD__assert_hard ("addLinConstr: only id's as variables allowed"); else DBGOUT_MIPD__(mipd.expr2Const(v) << ','); } DBGOUT_MIPD(" ] " << (CMPT_EQ == nCmpType ? "== " : "<= ") << rhs);); std::vector nc_c; std::vector nx; bool fFloat = false; for (auto* v : vars) { if (!v->type().isint()) { fFloat = true; break; } } auto sName = constants().ids.float_.lin_eq; // "int_lin_eq"; FunctionI* fDecl = mipd.float_lin_eq; if (fFloat) { // MZN_MIPD__assert_hard all vars of same type TODO for (int i = 0; i < vars.size(); ++i) { if (fabs(coefs[i]) > 1e-8) /// Only add terms with non-0 coefs. TODO Eps=param { nc_c.push_back(FloatLit::a(coefs[i])); if (vars[i]->type().isint()) { std::vector i2f_args(1); i2f_args[0] = vars[i]; Call* i2f = new Call(Location().introduce(), constants().ids.int2float, i2f_args); i2f->type(Type::varfloat()); i2f->decl(mipd.getEnv()->model()->matchFn(mipd.getEnv()->envi(), i2f, false)); EE ret = flat_exp(mipd.getEnv()->envi(), Ctx(), i2f, nullptr, constants().varTrue); nx.push_back(ret.r()); } else { nx.push_back(vars[i]); // ->id(); once passing a general expression } } } args[2] = FloatLit::a(rhs); args[2]->type(Type::parfloat(0)); args[0] = new ArrayLit(Location().introduce(), nc_c); args[0]->type(Type::parfloat(1)); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(Type::varfloat(1)); if (CMPT_LE == nCmpType) { sName = constants().ids.float_.lin_le; // "float_lin_le"; fDecl = mipd.float_lin_le; } } else { for (int i = 0; i < vars.size(); ++i) { if (fabs(coefs[i]) > 1e-8) /// Only add terms with non-0 coefs. TODO Eps=param { nc_c.push_back(IntLit::a(static_cast(coefs[i]))); nx.push_back(vars[i]); //->id(); } } args[2] = IntLit::a(static_cast(rhs)); args[2]->type(Type::parint(0)); args[0] = new ArrayLit(Location().introduce(), nc_c); args[0]->type(Type::parint(1)); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(Type::varint(1)); if (CMPT_LE == nCmpType) { sName = constants().ids.int_.lin_le; // "int_lin_le"; fDecl = mipd.int_lin_le; } else { sName = constants().ids.int_.lin_eq; // "int_lin_eq"; fDecl = mipd.int_lin_eq; } } if (mipd.getEnv()->envi().cseMapEnd() != mipd.getEnv()->envi().cseMapFind(args[0])) { DBGOUT_MIPD__(" Found expr "); DBGOUT_MIPD_SELF(debugprint(args[0])); } auto* nc = new Call(Location().introduce(), ASTString(sName), args); nc->type(Type::varbool()); nc->decl(fDecl); mipd.getEnv()->envi().flatAddItem(new ConstraintI(Location().introduce(), nc)); } /// domain / reif set of one variable into that for a!her void convertIntSet(Expression* e, SetOfIntvReal& s, VarDecl* varTarget, double A, double B) { MZN_MIPD__assert_hard(A != 0.0); if (e->type().isIntSet()) { IntSetVal* S = eval_intset(mipd.getEnv()->envi(), e); IntSetRanges domr(S); for (; domr(); ++domr) { // * A + B IntVal mmin = domr.min(); IntVal mmax = domr.max(); if (A < 0.0) { std::swap(mmin, mmax); } s.insert(IntvReal( // * A + B mmin.isFinite() ? rndUpIfInt(varTarget, (static_cast(mmin.toInt()) * A + B)) : IntvReal::infMinus(), mmax.isFinite() ? rndDownIfInt(varTarget, (static_cast(mmax.toInt()) * A + B)) : IntvReal::infPlus())); } } else { assert(e->type().isFloatSet()); FloatSetVal* S = eval_floatset(mipd.getEnv()->envi(), e); FloatSetRanges domr(S); for (; domr(); ++domr) { // * A + B FloatVal mmin = domr.min(); FloatVal mmax = domr.max(); if (A < 0.0) { std::swap(mmin, mmax); } s.insert(IntvReal( // * A + B mmin.isFinite() ? rndUpIfInt(varTarget, (mmin.toDouble() * A + B)) : IntvReal::infMinus(), mmax.isFinite() ? rndDownIfInt(varTarget, (mmax.toDouble() * A + B)) : IntvReal::infPlus())); } } } /// compute the delta for float strict ineq static double computeDelta(VarDecl* var, VarDecl* varOrig, IntvReal bnds, double A, Call* pCall, int nArg) { double delta = varOrig->type().isfloat() ? MIPD::expr2Const(pCall->arg(nArg)) // * ( bnds.right-bnds.left ) ABANDONED 12.4.18 due to #207 : std::fabs(A); // delta should be scaled as well if (var->type().isint()) { // the projected-onto variable delta = std::max(1.0, delta); } return delta; } }; // class DomainDecomp /// Vars without explicit clique still need a decomposition. /// Have !iced all __POSTs, set_in's && eq_encode's to it BEFORE /// In each clique, relate all vars to one chosen /// Find all "smallest rel. factor" variables, integer && with eq_encode if avail /// Re-relate all vars to it /// Refer all __POSTs && dom() to it /// build domain decomposition /// Implement all domain constraints, incl. possible corresp, of eq_encode's /// /// REMARKS. /// ! impose effects of integrality scaling (e.g., int v = int k/3) /// BUT when using k's eq_encode? /// And when subdividing into intervals bool decomposeDomains() { // for (int iClq=0; iClq<_aCliques.size(); ++iClq ) { // TClique& clq = _aCliques[iClq]; // } bool fRetTrue = true; for (int iVar = 0; iVar < _vVarDescr.size(); ++iVar) { // VarDescr& var = _vVarDescr[iVar]; if (_vVarDescr[iVar].fDomainConstrProcessed == 0U) { GCLock lock; DomainDecomp dd(this, iVar); dd.doProcess(); _vVarDescr[iVar].fDomainConstrProcessed = 1U; } } // Clean up __POSTs: for (auto& vVar : _vVarDescr) { for (auto* pCallI : vVar.aCalls) { pCallI->remove(); } if (vVar.pEqEncoding != nullptr) { vVar.pEqEncoding->remove(); } } return fRetTrue; } static VarDecl* expr2VarDecl(Expression* arg) { // The requirement to have actual variable objects // might be a limitation if more optimizations are done before... // Might need to flexibilize this TODO // MZN_MIPD__assert_hard_msg( ! arg->dynamicCast(), // "Expression " << *arg << " is an IntLit!" ); // MZN_MIPD__assert_hard( ! arg->dynamicCast() ); // MZN_MIPD__assert_hard( ! arg->dynamicCast() ); Id* id = arg->dynamicCast(); // MZN_MIPD__assert_hard(id); if (nullptr == id) { return nullptr; // the call using this should be ignored? } VarDecl* vd = id->decl(); MZN_MIPD__assert_hard(vd); return vd; } /// Fills the vector of vardecls && returns the least index of the array template long long expr2DeclArray(Expression* arg, Array& aVD) { ArrayLit* al = eval_array_lit(getEnv()->envi(), arg); checkOrResize(aVD, al->size()); for (unsigned int i = 0; i < al->size(); i++) { aVD[i] = expr2VarDecl((*al)[i]); } return al->min(0); } /// Fills the vector of expressions && returns the least index of the array template long long expr2ExprArray(Expression* arg, Array& aVD) { ArrayLit* al = eval_array_lit(getEnv()->envi(), arg); checkOrResize(aVD, al->size()); for (unsigned int i = 0; i < al->size(); i++) { aVD[i] = ((*al)[i]); } return al->min(0); } static double expr2Const(Expression* arg) { if (auto* il = arg->dynamicCast()) { return (static_cast(il->v().toInt())); } if (auto* fl = arg->dynamicCast()) { return (fl->v().toDouble()); } if (auto* bl = arg->dynamicCast()) { return static_cast(bl->v()); } MZN_MIPD__assert_hard_msg(0, "unexpected expression instead of an int/float/bool literal: eid=" << arg->eid() << " while E_INTLIT=" << Expression::E_INTLIT); return 0.0; } template void checkOrResize(Container& cnt, size_t sz) { cnt.resize(sz); } template void checkOrResize(std::array& cnt, size_t sz) { MZN_MIPD__assert_hard(cnt.size() == sz); } template void expr2Array(Expression* arg, Array& vals) { ArrayLit* al = eval_array_lit(getEnv()->envi(), arg); // if ( typeid(typename Array::pointer) == typeid(typename Array::iterator) ) // fixed // array // MZN_MIPD__assert_hard( vals.size() == al->v().size() ); // else // vals.resize( al->v().size() ); checkOrResize(vals, al->size()); for (unsigned int i = 0; i < al->size(); i++) { vals[i] = expr2Const((*al)[i]); } } void printStats(std::ostream& os) { // if ( _aCliques.empty() ) // return; if (_vVarDescr.empty()) { return; } int nc = 0; for (auto& cl : _aCliques) { if (!cl.empty()) { ++nc; } } for (auto& var : _vVarDescr) { if (0 > var.nClique) { ++nc; // 1-var cliques } } // os << "N cliques " << _aCliques.size() << " total, " // << nc << " final" << std::endl; MZN_MIPD__assert_hard(nc); MIPD__stats[N_POSTs__eqNmapsize] = static_cast(_mNViews.size()); double nSubintvAve = MIPD__stats[N_POSTs__NSubintvSum] / nc; MZN_MIPD__assert_hard(MIPD__stats[N_POSTs__NSubintvSum]); double dSubSizeAve = MIPD__stats[N_POSTs__SubSizeSum] / MIPD__stats[N_POSTs__NSubintvSum]; os << MIPD__stats[N_POSTs__all] << " POSTs" #ifdef __MZN__MIPDOMAINS__PRINTMORESTATS " [ "; for (int i = N_POSTs__intCmpReif; i <= N_POSTs__floatAux; ++i) { os << MIPD__stats[i] << ','; } os << " ], LINEQ [ "; for (int i = N_POSTs__eq2intlineq; i <= N_POSTs__eqNmapsize; ++i) { os << MIPD__stats[i] << ','; } os << " ]" #endif ", " << MIPD__stats[N_POSTs__varsDirect] << " / " << MIPD__stats[N_POSTs__varsInvolved] << " vars, " << nc << " cliques, " << MIPD__stats[N_POSTs__NSubintvMin] << " / " << nSubintvAve << " / " << MIPD__stats[N_POSTs__NSubintvMax] << " NSubIntv m/a/m, " << MIPD__stats[N_POSTs__SubSizeMin] << " / " << dSubSizeAve << " / " << MIPD__stats[N_POSTs__SubSizeMax] << " SubIntvSize m/a/m, " << MIPD__stats[N_POSTs__cliquesWithEqEncode] << "+" << MIPD__stats[N_POSTs__clEEEnforced] << "(" << MIPD__stats[N_POSTs__clEEFound] << ")" << " clq eq_encoded "; // << std::flush if (TCliqueSorter::LinEqGraph::dCoefMax > 1.0) { os << TCliqueSorter::LinEqGraph::dCoefMin << "--" << TCliqueSorter::LinEqGraph::dCoefMax << " abs coefs"; } os << " ... "; } }; // namespace MiniZinc template template void SetOfIntervals::intersect(const SetOfIntervals& s2) { if (s2.empty()) { this->clear(); return; } this->cutOut(Interval(Interval::infMinus(), (N)s2.begin()->left)); for (auto is2 = s2.begin(); is2 != s2.end(); ++is2) { auto is2next = is2; ++is2next; this->cutOut( Interval(is2->right, s2.end() == is2next ? Interval::infPlus() : (N)is2next->left)); } } template template void SetOfIntervals::cutDeltas(const SetOfIntervals& s2, N1 delta) { if (this->empty()) { return; } // What if distance < delta? TODO for (auto is2 : s2) { if (is2.left > Interval::infMinus()) { this->cutOut(Interval(is2.left - delta, is2.left)); } if (is2.right < Interval::infPlus()) { this->cutOut(Interval(is2.right, is2.right + delta)); } } } template void SetOfIntervals::cutOut(const Interval& intv) { DBGOUT_MIPD__("Cutting " << intv << " from " << (*this)); if (this->empty()) { return; } auto it1 = (Interval::infMinus() == intv.left) ? this->lower_bound(Interval(intv.left, intv.right)) : this->upper_bound(Interval(intv.left, intv.right)); auto it2Del1 = it1; // from which to delete if (this->begin() != it1) { --it1; const N it1l = it1->left; MZN_MIPD__assert_hard(it1l <= intv.left); if (it1->right > intv.left) { // split it it2Del1 = split(it1, intv.left).second; // it1->right = intv.left; READ-ONLY // this->erase(it1); // it1 = this->end(); // auto iR = this->insert( Interval( it1l, intv.left ) ); // MZN_MIPD__assert_hard( iR.second ); } } DBGOUT_MIPD__("; after split 1: " << (*this)); // Processing the right end: auto it2 = this->lower_bound(Interval(intv.right, intv.right + 1)); auto it2Del2 = it2; if (this->begin() != it2) { --it2; MZN_MIPD__assert_hard(it2->left < intv.right); const N it2r = it2->right; if ((Interval::infPlus() == intv.right) ? (it2r > intv.right) : (it2r >= intv.right)) { // >=: split it // it2Del2 = split( it2, intv.right ).second; const bool fEEE = (it2Del1 == it2); this->erase(it2); it2 = this->end(); it2Del2 = this->insert(Interval(intv.right, it2r)); if (fEEE) { it2Del1 = it2Del2; } } } DBGOUT_MIPD__("; after split 2: " << (*this)); DBGOUT_MIPD__("; cutting out: " << SetOfIntervals(it2Del1, it2Del2)); #ifdef MZN_DBG_CHECK_ITER_CUTOUT { auto it = this->begin(); int nO = 0; do { if (it == it2Del1) { MZN_MIPD__assert_hard(!nO); ++nO; } if (it == it2Del2) { MZN_MIPD__assert_hard(1 == nO); ++nO; } if (this->end() == it) { break; } ++it; } while (true); MZN_MIPD__assert_hard(2 == nO); } #endif this->erase(it2Del1, it2Del2); DBGOUT_MIPD(" ... gives " << (*this)); } template typename SetOfIntervals::SplitResult SetOfIntervals::split(iterator& it, N pos) { MZN_MIPD__assert_hard(pos >= it->left); MZN_MIPD__assert_hard(pos <= it->right); Interval intvOld = *it; this->erase(it); auto it_01 = this->insert(Interval(intvOld.left, pos)); auto it_02 = this->insert(Interval(pos, intvOld.right)); it = this->end(); return std::make_pair(it_01, it_02); } template Interval SetOfIntervals::getBounds() const { if (this->empty()) { return Interval(Interval::infPlus(), Interval::infMinus()); } auto it2 = this->end(); --it2; return Interval(this->begin()->left, it2->right); } template bool SetOfIntervals::checkFiniteBounds() { if (this->empty()) { return false; } auto bnds = getBounds(); return bnds.left > Interval::infMinus() && bnds.right < Interval::infPlus(); } template bool SetOfIntervals::checkDisjunctStrict() { for (auto it = this->begin(); it != this->end(); ++it) { if (it->left > it->right) { return false; } if (this->begin() != it) { auto it_1 = it; --it_1; if (it_1->right >= it->left) { return false; } } } return true; } /// Assumes integer interval bounds template int SetOfIntervals::cardInt() const { int nn = 0; for (auto it = this->begin(); it != this->end(); ++it) { ++nn; nn += int(round(it->right - it->left)); } return nn; } template N SetOfIntervals::maxInterval() const { N ll = -1; for (auto it = this->begin(); it != this->end(); ++it) { ll = std::max(ll, it->right - it->left); } return ll; } /// Assumes integer interval bounds template void SetOfIntervals::split2Bits() { Base bsNew; for (auto it = this->begin(); it != this->end(); ++it) { for (int v = static_cast(round(it->left)); v <= round(it->right); ++v) { bsNew.insert(Intv(v, v)); } } *(Base*)this = std::move(bsNew); } bool MIPD::fVerbose = false; void mip_domains(Env& env, bool fVerbose, int nmi, double dmd) { MIPD mipd(&env, fVerbose, nmi, dmd); if (!mipd.doMIPdomains()) { GCLock lock; env.envi().fail(); } } double MIPD::TCliqueSorter::LinEqGraph::dCoefMin = +1e100; double MIPD::TCliqueSorter::LinEqGraph::dCoefMax = -1e100; } // namespace MiniZinc libminizinc-2.5.3/lib/prettyprinter.cpp0000644000175000017500000016327013757304533016716 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Pierre Wilke * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { int precedence(const Expression* e) { if (const auto* bo = e->dynamicCast()) { switch (bo->op()) { case BOT_EQUIV: return 1200; case BOT_IMPL: case BOT_RIMPL: return 1100; case BOT_OR: case BOT_XOR: return 1000; case BOT_AND: return 900; case BOT_LE: case BOT_LQ: case BOT_GR: case BOT_GQ: case BOT_EQ: case BOT_NQ: return 800; case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: return 700; case BOT_UNION: case BOT_DIFF: case BOT_SYMDIFF: return 600; case BOT_DOTDOT: return 500; case BOT_PLUS: case BOT_MINUS: return 400; case BOT_MULT: case BOT_IDIV: case BOT_MOD: case BOT_DIV: case BOT_INTERSECT: return 300; case BOT_POW: case BOT_PLUSPLUS: return 200; default: assert(false); return -1; } } else if (e->isa()) { return 1300; } else { return 0; } } enum Assoc { AS_LEFT, AS_RIGHT, AS_NONE }; Assoc assoc(const BinOp* bo) { switch (bo->op()) { case BOT_LE: case BOT_LQ: case BOT_GR: case BOT_GQ: case BOT_NQ: case BOT_EQ: case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: case BOT_DOTDOT: return AS_NONE; case BOT_PLUSPLUS: return AS_RIGHT; default: return AS_LEFT; } } enum Parentheses { PN_LEFT = 1, PN_RIGHT = 2 }; Parentheses need_parentheses(const BinOp* bo, const Expression* left, const Expression* right) { int pbo = precedence(bo); int pl = precedence(left); int pr = precedence(right); int ret = static_cast((pbo < pl) || (pbo == pl && assoc(bo) != AS_LEFT)); ret += 2 * static_cast((pbo < pr) || (pbo == pr && assoc(bo) != AS_RIGHT)); return static_cast(ret); } void pp_floatval(std::ostream& os, const FloatVal& fv, bool hexFloat) { std::ostringstream oss; if (fv.isFinite()) { if (hexFloat) { throw InternalError("disabled due to hexfloat being not supported by g++ 4.9"); // std::hexfloat(oss); oss << fv.toDouble(); os << oss.str(); } oss << std::setprecision(std::numeric_limits::digits10 + 1); oss << fv; if (oss.str().find('e') == std::string::npos && oss.str().find('.') == std::string::npos) { oss << ".0"; } os << oss.str(); } else { if (fv.isPlusInfinity()) { os << "infinity"; } else { os << "-infinity"; } } } class PlainPrinter { private: bool _flatZinc; EnvI* _env; std::ostream& _os; public: PlainPrinter(std::ostream& os, bool flatZinc, EnvI* env) : _env(env), _os(os), _flatZinc(flatZinc) {} void p(const Type& type, const Expression* e) { switch (type.ti()) { case Type::TI_PAR: break; case Type::TI_VAR: _os << "var "; break; } if (type.ot() == Type::OT_OPTIONAL) { _os << "opt "; } if (type.st() == Type::ST_SET) { _os << "set of "; } if (e == nullptr) { switch (type.bt()) { case Type::BT_INT: _os << "int"; break; case Type::BT_BOOL: _os << "bool"; break; case Type::BT_FLOAT: _os << "float"; break; case Type::BT_STRING: _os << "string"; break; case Type::BT_ANN: _os << "ann"; break; case Type::BT_BOT: _os << "bot"; break; case Type::BT_TOP: _os << "top"; break; case Type::BT_UNKNOWN: _os << "???"; break; } } else { p(e); } } void p(const Annotation& ann) { for (ExpressionSetIter it = ann.begin(); it != ann.end(); ++it) { _os << ":: "; p(*it); } } void p(const Expression* e) { if (e == nullptr) { return; } switch (e->eid()) { case Expression::E_INTLIT: _os << e->cast()->v(); break; case Expression::E_FLOATLIT: { pp_floatval(_os, e->cast()->v()); } break; case Expression::E_SETLIT: { const SetLit& sl = *e->cast(); if (sl.isv() != nullptr) { if (sl.type().bt() == Type::BT_BOOL) { if (sl.isv()->size() == 0) { _os << (_flatZinc ? "true..false" : "{}"); } else { _os << "{"; if (sl.isv()->min() == 0) { if (sl.isv()->max() == 0) { _os << "false"; } else { _os << "false,true"; } } else { _os << "true"; } _os << "}"; } } else { if (sl.isv()->size() == 0) { _os << (_flatZinc ? "1..0" : "{}"); } else if (sl.isv()->size() == 1) { _os << sl.isv()->min(0) << ".." << sl.isv()->max(0); } else { if (!sl.isv()->min(0).isFinite()) { _os << sl.isv()->min(0) << ".." << sl.isv()->max(0) << " union "; } _os << "{"; bool first = true; for (IntSetRanges isr(sl.isv()); isr(); ++isr) { if (isr.min().isFinite() && isr.max().isFinite()) { for (IntVal i = isr.min(); i <= isr.max(); i++) { if (!first) { _os << ","; } first = false; _os << i; } } } _os << "}"; if (!sl.isv()->max(sl.isv()->size() - 1).isFinite()) { _os << " union " << sl.isv()->min(sl.isv()->size() - 1) << ".." << sl.isv()->max(sl.isv()->size() - 1); } } } } else if (sl.fsv() != nullptr) { if (sl.fsv()->size() == 0) { _os << (_flatZinc ? "1.0..0.0" : "{}"); } else if (sl.fsv()->size() == 1) { pp_floatval(_os, sl.fsv()->min(0)); _os << ".."; pp_floatval(_os, sl.fsv()->max(0)); } else { bool allSingleton = true; for (FloatSetRanges isr(sl.fsv()); isr(); ++isr) { if (isr.min() != isr.max()) { allSingleton = false; break; } } if (allSingleton) { _os << "{"; bool first = true; for (FloatSetRanges isr(sl.fsv()); isr(); ++isr) { if (!first) { _os << ","; } first = false; pp_floatval(_os, isr.min()); } _os << "}"; } else { bool first = true; for (FloatSetRanges isr(sl.fsv()); isr(); ++isr) { if (!first) { _os << " union "; } first = false; pp_floatval(_os, isr.min()); _os << ".."; pp_floatval(_os, isr.max()); } } } } else { _os << "{"; for (unsigned int i = 0; i < sl.v().size(); i++) { p(sl.v()[i]); if (i < sl.v().size() - 1) { _os << ","; } } _os << "}"; } } break; case Expression::E_BOOLLIT: _os << (e->cast()->v() ? "true" : "false"); break; case Expression::E_STRINGLIT: _os << "\"" << Printer::escapeStringLit(e->cast()->v()) << "\""; break; case Expression::E_ID: { if (e == constants().absent) { _os << "<>"; } else { const Id* id = e->cast(); if (id->decl() != nullptr) { id = id->decl()->id(); } if (id->idn() == -1) { _os << id->v(); } else { _os << "X_INTRODUCED_" << id->idn() << "_"; } } } break; case Expression::E_TIID: _os << "$" << e->cast()->v(); break; case Expression::E_ANON: _os << "_"; break; case Expression::E_ARRAYLIT: { const ArrayLit& al = *e->cast(); unsigned int n = al.dims(); if (n == 1 && al.min(0) == 1) { _os << "["; for (unsigned int i = 0; i < al.size(); i++) { p(al[i]); if (i < al.size() - 1) { _os << ","; } } _os << "]"; } else if (n == 2 && al.min(0) == 1 && al.min(1) == 1 && al.max(1) != 0) { _os << "[|"; for (int i = 0; i < al.max(0); i++) { for (int j = 0; j < al.max(1); j++) { p(al[i * al.max(1) + j]); if (j < al.max(1) - 1) { _os << ","; } } if (i < al.max(0) - 1) { _os << "|"; } } _os << "|]"; } else { _os << "array" << n << "d("; for (int i = 0; i < al.dims(); i++) { _os << al.min(i) << ".." << al.max(i); _os << ","; } _os << "["; for (unsigned int i = 0; i < al.size(); i++) { p(al[i]); if (i < al.size() - 1) { _os << ","; } } _os << "])"; } } break; case Expression::E_ARRAYACCESS: { const ArrayAccess& aa = *e->cast(); p(aa.v()); _os << "["; for (unsigned int i = 0; i < aa.idx().size(); i++) { p(aa.idx()[i]); if (i < aa.idx().size() - 1) { _os << ","; } } _os << "]"; } break; case Expression::E_COMP: { const Comprehension& c = *e->cast(); _os << (c.set() ? "{" : "["); p(c.e()); _os << " | "; for (int i = 0; i < c.numberOfGenerators(); i++) { for (int j = 0; j < c.numberOfDecls(i); j++) { auto* ident = c.decl(i, j)->id(); if (ident->idn() == -1) { _os << ident->v(); } else { _os << "X_INTRODUCED_" << ident->idn() << "_"; } if (j < c.numberOfDecls(i) - 1) { _os << ","; } } if (c.in(i) == nullptr) { _os << " = "; p(c.where(i)); } else { _os << " in "; p(c.in(i)); if (c.where(i) != nullptr) { _os << " where "; p(c.where(i)); } } if (i < c.numberOfGenerators()) { _os << ", "; } } _os << (c.set() ? "}" : "]"); } break; case Expression::E_ITE: { const ITE& ite = *e->cast(); for (int i = 0; i < ite.size(); i++) { _os << (i == 0 ? "if " : " elseif "); p(ite.ifExpr(i)); _os << " then "; p(ite.thenExpr(i)); } if (ite.elseExpr() != nullptr) { _os << " else "; p(ite.elseExpr()); } _os << " endif"; } break; case Expression::E_BINOP: { const BinOp& bo = *e->cast(); Parentheses ps = need_parentheses(&bo, bo.lhs(), bo.rhs()); if ((ps & PN_LEFT) != 0) { _os << "("; } p(bo.lhs()); if ((ps & PN_LEFT) != 0) { _os << ")"; } switch (bo.op()) { case BOT_PLUS: _os << "+"; break; case BOT_MINUS: _os << "-"; break; case BOT_MULT: _os << "*"; break; case BOT_POW: _os << "^"; break; case BOT_DIV: _os << "/"; break; case BOT_IDIV: _os << " div "; break; case BOT_MOD: _os << " mod "; break; case BOT_LE: _os << " < "; break; case BOT_LQ: _os << "<="; break; case BOT_GR: _os << " > "; break; case BOT_GQ: _os << ">="; break; case BOT_EQ: _os << "=="; break; case BOT_NQ: _os << "!="; break; case BOT_IN: _os << " in "; break; case BOT_SUBSET: _os << " subset "; break; case BOT_SUPERSET: _os << " superset "; break; case BOT_UNION: _os << " union "; break; case BOT_DIFF: _os << " diff "; break; case BOT_SYMDIFF: _os << " symdiff "; break; case BOT_INTERSECT: _os << " intersect "; break; case BOT_PLUSPLUS: _os << "++"; break; case BOT_EQUIV: _os << " <-> "; break; case BOT_IMPL: _os << " -> "; break; case BOT_RIMPL: _os << " <- "; break; case BOT_OR: _os << " \\/ "; break; case BOT_AND: _os << " /\\ "; break; case BOT_XOR: _os << " xor "; break; case BOT_DOTDOT: _os << ".."; break; default: assert(false); break; } if ((ps & PN_RIGHT) != 0) { _os << "("; } p(bo.rhs()); if ((ps & PN_RIGHT) != 0) { _os << ")"; } } break; case Expression::E_UNOP: { const UnOp& uo = *e->cast(); switch (uo.op()) { case UOT_NOT: _os << "not "; break; case UOT_PLUS: _os << "+"; break; case UOT_MINUS: _os << "-"; break; default: assert(false); break; } bool needParen = (uo.e()->isa() || uo.e()->isa() || !uo.ann().isEmpty()); if (needParen) { _os << "("; } p(uo.e()); if (needParen) { _os << ")"; } } break; case Expression::E_CALL: { const Call& c = *e->cast(); _os << c.id() << "("; for (unsigned int i = 0; i < c.argCount(); i++) { p(c.arg(i)); if (i < c.argCount() - 1) { _os << ","; } } _os << ")"; } break; case Expression::E_VARDECL: { const VarDecl& vd = *e->cast(); p(vd.ti()); if (!vd.ti()->isEnum() && (vd.id()->idn() != -1 || vd.id()->v().size() > 0)) { _os << ":"; } if (vd.id()->idn() != -1) { _os << " X_INTRODUCED_" << vd.id()->idn() << "_"; } else if (vd.id()->v().size() != 0) { _os << " " << vd.id()->v(); } if (vd.introduced()) { _os << " ::var_is_introduced "; } p(vd.ann()); if (vd.e() != nullptr) { _os << " = "; p(vd.e()); } } break; case Expression::E_LET: { const Let& l = *e->cast(); _os << "let {"; for (unsigned int i = 0; i < l.let().size(); i++) { const Expression* li = l.let()[i]; if (!li->isa()) { _os << "constraint "; } p(li); if (i < l.let().size() - 1) { _os << ", "; } } _os << "} in ("; p(l.in()); _os << ")"; } break; case Expression::E_TI: { const TypeInst& ti = *e->cast(); if (ti.isEnum()) { _os << "enum"; } else if (_env != nullptr) { _os << ti.type().toString(*_env); } else { if (ti.isarray()) { _os << "array ["; for (unsigned int i = 0; i < ti.ranges().size(); i++) { p(Type::parint(), ti.ranges()[i]); if (i < ti.ranges().size() - 1) { _os << ","; } } _os << "] of "; } p(ti.type(), ti.domain()); } } } if (!e->isa()) { p(e->ann()); } } void p(const Item* i) { if (i == nullptr) { return; } if (i->removed()) { _os << "% "; } switch (i->iid()) { case Item::II_INC: _os << "include \"" << i->cast()->f() << "\""; break; case Item::II_VD: p(i->cast()->e()); break; case Item::II_ASN: _os << i->cast()->id() << " = "; p(i->cast()->e()); break; case Item::II_CON: _os << "constraint "; p(i->cast()->e()); break; case Item::II_SOL: { const auto* si = i->cast(); _os << "solve "; p(si->ann()); switch (si->st()) { case SolveI::ST_SAT: _os << " satisfy"; break; case SolveI::ST_MIN: _os << " minimize "; p(si->e()); break; case SolveI::ST_MAX: _os << " maximize "; p(si->e()); break; } } break; case Item::II_OUT: _os << "output "; p(i->cast()->e()); break; case Item::II_FUN: { const FunctionI& fi = *i->cast(); if (fi.ti()->type().isAnn() && fi.e() == nullptr) { _os << "annotation "; } else if (fi.ti()->type() == Type::parbool()) { _os << "test "; } else if (fi.ti()->type() == Type::varbool()) { _os << "predicate "; } else { _os << "function "; p(fi.ti()); _os << " : "; } _os << fi.id(); if (fi.params().size() > 0) { _os << "("; for (unsigned int j = 0; j < fi.params().size(); j++) { p(fi.params()[j]); if (j < fi.params().size() - 1) { _os << ","; } } _os << ")"; } p(fi.ann()); if (fi.e() != nullptr) { _os << " = "; p(fi.e()); } } break; } _os << ";" << std::endl; } }; template class ExpressionMapper { protected: T& _t; public: ExpressionMapper(T& t) : _t(t) {} typename T::ret map(const Expression* e) { switch (e->eid()) { case Expression::E_INTLIT: return _t.mapIntLit(*e->cast()); case Expression::E_FLOATLIT: return _t.mapFloatLit(*e->cast()); case Expression::E_SETLIT: return _t.mapSetLit(*e->cast()); case Expression::E_BOOLLIT: return _t.mapBoolLit(*e->cast()); case Expression::E_STRINGLIT: return _t.mapStringLit(*e->cast()); case Expression::E_ID: return _t.mapId(*e->cast()); case Expression::E_ANON: return _t.mapAnonVar(*e->cast()); case Expression::E_ARRAYLIT: return _t.mapArrayLit(*e->cast()); case Expression::E_ARRAYACCESS: return _t.mapArrayAccess(*e->cast()); case Expression::E_COMP: return _t.mapComprehension(*e->cast()); case Expression::E_ITE: return _t.mapITE(*e->cast()); case Expression::E_BINOP: return _t.mapBinOp(*e->cast()); case Expression::E_UNOP: return _t.mapUnOp(*e->cast()); case Expression::E_CALL: return _t.mapCall(*e->cast()); case Expression::E_VARDECL: return _t.mapVarDecl(*e->cast()); case Expression::E_LET: return _t.mapLet(*e->cast()); case Expression::E_TI: return _t.mapTypeInst(*e->cast()); case Expression::E_TIID: return _t.mapTIId(*e->cast()); default: assert(false); return typename T::ret(); break; } } }; class Document { private: int _level; public: Document() : _level(0) {} virtual ~Document() {} int getLevel() const { return _level; } // Make this object a child of "d". virtual void setParent(Document* d) { _level = d->_level + 1; } }; class BreakPoint : public Document { private: bool _dontSimplify; public: BreakPoint() { _dontSimplify = false; } BreakPoint(bool ds) { _dontSimplify = ds; } ~BreakPoint() override {} void setDontSimplify(bool b) { _dontSimplify = b; } bool getDontSimplify() const { return _dontSimplify; } }; class StringDocument : public Document { private: std::string _stringDocument; public: StringDocument() {} ~StringDocument() override {} StringDocument(std::string s) : _stringDocument(std::move(s)) {} std::string getString() { return _stringDocument; } void setString(std::string s) { _stringDocument = std::move(s); } }; class DocumentList : public Document { private: std::vector _docs; std::string _beginToken; std::string _separator; std::string _endToken; bool _unbreakable; bool _alignment; public: ~DocumentList() override { std::vector::iterator it; for (it = _docs.begin(); it != _docs.end(); it++) { delete *it; } } DocumentList(std::string beginToken = "", std::string separator = "", std::string endToken = "", bool alignment = true); void addDocumentToList(Document* d) { _docs.push_back(d); d->setParent(this); } void setParent(Document* d) override { Document::setParent(d); std::vector::iterator it; for (it = _docs.begin(); it != _docs.end(); it++) { (*it)->setParent(this); } } void addStringToList(std::string s) { addDocumentToList(new StringDocument(std::move(s))); } void addBreakPoint(bool b = false) { addDocumentToList(new BreakPoint(b)); } std::vector getDocs() { return _docs; } void setList(std::vector ld) { _docs = std::move(ld); } std::string getBeginToken() { return _beginToken; } std::string getEndToken() { return _endToken; } std::string getSeparator() { return _separator; } bool getUnbreakable() const { return _unbreakable; } void setUnbreakable(bool b) { _unbreakable = b; } bool getAlignment() const { return _alignment; } }; DocumentList::DocumentList(std::string beginToken, std::string separator, std::string endToken, bool alignment) { _beginToken = std::move(beginToken); _separator = std::move(separator); _endToken = std::move(endToken); _alignment = alignment; _unbreakable = false; } class Line { private: int _indentation; int _lineLength; std::vector _text; public: Line() : _indentation(0), _lineLength(0), _text(0) {} Line(const Line&) = default; Line(const int indent) : _indentation(indent), _lineLength(0), _text(0) {} Line& operator=(const Line&) = default; bool operator==(const Line& l) { return &l == this; } void setIndentation(int i) { _indentation = i; } int getLength() const { return _lineLength; } int getIndentation() const { return _indentation; } int getSpaceLeft(int maxwidth) const; void addString(const std::string& s); void concatenateLines(Line& l); void print(std::ostream& os) const { for (int i = 0; i < getIndentation(); i++) { os << " "; } std::vector::const_iterator it; for (it = _text.begin(); it != _text.end(); it++) { os << (*it); } os << "\n"; } }; int Line::getSpaceLeft(int maxwidth) const { return maxwidth - _lineLength - _indentation; } void Line::addString(const std::string& s) { _lineLength += static_cast(s.size()); _text.push_back(s); } void Line::concatenateLines(Line& l) { _text.insert(_text.end(), l._text.begin(), l._text.end()); _lineLength += l._lineLength; } class LinesToSimplify { private: std::map > _lines; // (i,j) in parent <=> j can only be simplified if i is simplified std::vector > _parent; /* * if i can't simplify, remove j and his parents */ // mostRecentlyAdded[level] = line of the most recently added std::map _mostRecentlyAdded; public: std::vector* getLinesForPriority(int p) { std::map >::iterator it; for (it = _lines.begin(); it != _lines.end(); it++) { if (it->first == p) { return &(it->second); } } return nullptr; } void addLine(int p, int l, int par = -1) { if (par == -1) { for (int i = p - 1; i >= 0; i--) { auto it = _mostRecentlyAdded.find(i); if (it != _mostRecentlyAdded.end()) { par = it->second; break; } } } if (par != -1) { _parent.emplace_back(l, par); } _mostRecentlyAdded.insert(std::pair(p, l)); std::map >::iterator it; for (it = _lines.begin(); it != _lines.end(); it++) { if (it->first == p) { it->second.push_back(l); return; } } std::vector v; v.push_back(l); _lines.insert(std::pair >(p, v)); } void decrementLine(std::vector* vec, int l) { std::vector::iterator vit; if (vec != nullptr) { for (vit = vec->begin(); vit != vec->end(); vit++) { if (*vit >= l) { *vit = *vit - 1; } } } // Now the map std::map >::iterator it; for (it = _lines.begin(); it != _lines.end(); it++) { for (vit = it->second.begin(); vit != it->second.end(); vit++) { if (*vit >= l) { *vit = *vit - 1; } } } // And the parent table std::vector >::iterator vpit; for (vpit = _parent.begin(); vpit != _parent.end(); vpit++) { if (vpit->first >= l) { vpit->first--; } if (vpit->second >= l) { vpit->second--; } } } void remove(LinesToSimplify& lts) { std::map >::iterator it; for (it = lts._lines.begin(); it != lts._lines.end(); it++) { std::vector::iterator vit; for (vit = it->second.begin(); vit != it->second.end(); vit++) { remove(nullptr, *vit, false); } } } void remove(std::vector* v, int i, bool success = true) { if (v != nullptr) { v->erase(std::remove(v->begin(), v->end(), i), v->end()); } for (auto& line : _lines) { std::vector& l = line.second; l.erase(std::remove(l.begin(), l.end(), i), l.end()); } // Call on its parent if (!success) { std::vector >::iterator vpit; for (vpit = _parent.begin(); vpit != _parent.end(); vpit++) { if (vpit->first == i && vpit->second != i && vpit->second != -1) { remove(v, vpit->second, false); } } } } std::vector* getLinesToSimplify() { auto* vec = new std::vector(); std::map >::iterator it; for (it = _lines.begin(); it != _lines.end(); it++) { std::vector& svec = it->second; vec->insert(vec->begin(), svec.begin(), svec.end()); } return vec; } }; Document* expression_to_document(const Expression* e); Document* annotation_to_document(const Annotation& ann); Document* tiexpression_to_document(const Type& type, const Expression* e) { auto* dl = new DocumentList("", "", "", false); switch (type.ti()) { case Type::TI_PAR: break; case Type::TI_VAR: dl->addStringToList("var "); break; } if (type.ot() == Type::OT_OPTIONAL) { dl->addStringToList("opt "); } if (type.st() == Type::ST_SET) { dl->addStringToList("set of "); } if (e == nullptr) { switch (type.bt()) { case Type::BT_INT: dl->addStringToList("int"); break; case Type::BT_BOOL: dl->addStringToList("bool"); break; case Type::BT_FLOAT: dl->addStringToList("float"); break; case Type::BT_STRING: dl->addStringToList("string"); break; case Type::BT_ANN: dl->addStringToList("ann"); break; case Type::BT_BOT: dl->addStringToList("bot"); break; case Type::BT_TOP: dl->addStringToList("top"); break; case Type::BT_UNKNOWN: dl->addStringToList("???"); break; } } else { dl->addDocumentToList(expression_to_document(e)); } return dl; } class ExpressionDocumentMapper { public: typedef Document* ret; static ret mapIntLit(const IntLit& il) { std::ostringstream oss; oss << il.v(); return new StringDocument(oss.str()); } static ret mapFloatLit(const FloatLit& fl) { std::ostringstream oss; pp_floatval(oss, fl.v()); return new StringDocument(oss.str()); } static ret mapSetLit(const SetLit& sl) { DocumentList* dl; if (sl.isv() != nullptr) { if (sl.type().bt() == Type::BT_BOOL) { if (sl.isv()->size() == 0) { dl = new DocumentList("true..false", "", ""); } else { if (sl.isv()->min() == 0) { if (sl.isv()->max() == 0) { dl = new DocumentList("{false}", "", ""); } else { dl = new DocumentList("{false,true}", "", ""); } } else { dl = new DocumentList("{true}", "", ""); } } } else { if (sl.isv()->size() == 0) { dl = new DocumentList("1..0", "", ""); } else if (sl.isv()->size() == 1) { dl = new DocumentList("", "..", ""); { std::ostringstream oss; oss << sl.isv()->min(0); dl->addDocumentToList(new StringDocument(oss.str())); } { std::ostringstream oss; oss << sl.isv()->max(0); dl->addDocumentToList(new StringDocument(oss.str())); } } else { dl = new DocumentList("{", ", ", "}", true); IntSetRanges isr(sl.isv()); for (Ranges::ToValues isv(isr); isv(); ++isv) { std::ostringstream oss; oss << isv.val(); dl->addDocumentToList(new StringDocument(oss.str())); } } } } else if (sl.fsv() != nullptr) { if (sl.fsv()->size() == 0) { dl = new DocumentList("1.0..0.0", "", ""); } else if (sl.fsv()->size() == 1) { dl = new DocumentList("", "..", ""); { std::ostringstream oss; pp_floatval(oss, sl.fsv()->min(0)); dl->addDocumentToList(new StringDocument(oss.str())); } { std::ostringstream oss; pp_floatval(oss, sl.fsv()->max(0)); dl->addDocumentToList(new StringDocument(oss.str())); } } else { dl = new DocumentList("", " union ", "", true); FloatSetRanges fsr(sl.fsv()); for (; fsr(); ++fsr) { std::ostringstream oss; pp_floatval(oss, fsr.min()); oss << ".."; pp_floatval(oss, fsr.max()); dl->addDocumentToList(new StringDocument(oss.str())); } } } else { dl = new DocumentList("{", ", ", "}", true); for (unsigned int i = 0; i < sl.v().size(); i++) { dl->addDocumentToList(expression_to_document((sl.v()[i]))); } } return dl; } static ret mapBoolLit(const BoolLit& bl) { return new StringDocument(std::string(bl.v() ? "true" : "false")); } static ret mapStringLit(const StringLit& sl) { std::ostringstream oss; oss << "\"" << Printer::escapeStringLit(sl.v()) << "\""; return new StringDocument(oss.str()); } static ret mapId(const Id& id) { if (&id == constants().absent) { return new StringDocument("<>"); } if (id.idn() == -1) { return new StringDocument(std::string(id.v().c_str(), id.v().size())); } std::ostringstream oss; oss << "X_INTRODUCED_" << id.idn() << "_"; return new StringDocument(oss.str()); } static ret mapTIId(const TIId& id) { std::ostringstream ss; ss << "$" << id.v(); return new StringDocument(ss.str()); } static ret mapAnonVar(const AnonVar& /*v*/) { return new StringDocument("_"); } static ret mapArrayLit(const ArrayLit& al) { /// TODO: test multi-dimensional arrays handling DocumentList* dl; unsigned int n = al.dims(); if (n == 1 && al.min(0) == 1) { dl = new DocumentList("[", ", ", "]"); for (unsigned int i = 0; i < al.size(); i++) { dl->addDocumentToList(expression_to_document(al[i])); } } else if (n == 2 && al.min(0) == 1 && al.min(1) == 1) { dl = new DocumentList("[| ", " | ", " |]"); for (int i = 0; i < al.max(0); i++) { auto* row = new DocumentList("", ", ", ""); for (int j = 0; j < al.max(1); j++) { row->addDocumentToList(expression_to_document(al[i * al.max(1) + j])); } dl->addDocumentToList(row); if (i != al.max(0) - 1) { dl->addBreakPoint(true); // dont simplify } } } else { dl = new DocumentList("", "", ""); std::stringstream oss; oss << "array" << n << "d"; dl->addStringToList(oss.str()); auto* args = new DocumentList("(", ", ", ")"); for (int i = 0; i < al.dims(); i++) { oss.str(""); oss << al.min(i) << ".." << al.max(i); args->addStringToList(oss.str()); } auto* array = new DocumentList("[", ", ", "]"); for (unsigned int i = 0; i < al.size(); i++) { array->addDocumentToList(expression_to_document(al[i])); } args->addDocumentToList(array); dl->addDocumentToList(args); } return dl; } static ret mapArrayAccess(const ArrayAccess& aa) { auto* dl = new DocumentList("", "", ""); dl->addDocumentToList(expression_to_document(aa.v())); auto* args = new DocumentList("[", ", ", "]"); for (unsigned int i = 0; i < aa.idx().size(); i++) { args->addDocumentToList(expression_to_document(aa.idx()[i])); } dl->addDocumentToList(args); return dl; } static ret mapComprehension(const Comprehension& c) { std::ostringstream oss; DocumentList* dl; if (c.set()) { dl = new DocumentList("{ ", " | ", " }"); } else { dl = new DocumentList("[ ", " | ", " ]"); } dl->addDocumentToList(expression_to_document(c.e())); auto* head = new DocumentList("", " ", ""); auto* generators = new DocumentList("", ", ", ""); for (int i = 0; i < c.numberOfGenerators(); i++) { auto* gen = new DocumentList("", "", ""); auto* idents = new DocumentList("", ", ", ""); for (int j = 0; j < c.numberOfDecls(i); j++) { std::ostringstream ss; Id* ident = c.decl(i, j)->id(); if (ident->idn() == -1) { ss << ident->v(); } else { ss << "X_INTRODUCED_" << ident->idn() << "_"; } idents->addStringToList(ss.str()); } gen->addDocumentToList(idents); if (c.in(i) == nullptr) { gen->addStringToList(" = "); gen->addDocumentToList(expression_to_document(c.where(i))); } else { gen->addStringToList(" in "); gen->addDocumentToList(expression_to_document(c.in(i))); if (c.where(i) != nullptr) { gen->addStringToList(" where "); gen->addDocumentToList(expression_to_document(c.where(i))); } } generators->addDocumentToList(gen); } head->addDocumentToList(generators); dl->addDocumentToList(head); return dl; } static ret mapITE(const ITE& ite) { auto* dl = new DocumentList("", "", ""); for (int i = 0; i < ite.size(); i++) { std::string beg = (i == 0 ? "if " : " elseif "); dl->addStringToList(beg); dl->addDocumentToList(expression_to_document(ite.ifExpr(i))); dl->addStringToList(" then "); auto* ifdoc = new DocumentList("", "", "", false); ifdoc->addBreakPoint(); ifdoc->addDocumentToList(expression_to_document(ite.thenExpr(i))); dl->addDocumentToList(ifdoc); dl->addStringToList(" "); } dl->addBreakPoint(); dl->addStringToList("else "); auto* elsedoc = new DocumentList("", "", "", false); elsedoc->addBreakPoint(); elsedoc->addDocumentToList(expression_to_document(ite.elseExpr())); dl->addDocumentToList(elsedoc); dl->addStringToList(" "); dl->addBreakPoint(); dl->addStringToList("endif"); return dl; } static ret mapBinOp(const BinOp& bo) { Parentheses ps = need_parentheses(&bo, bo.lhs(), bo.rhs()); DocumentList* opLeft; DocumentList* dl; DocumentList* opRight; bool linebreak = false; if ((ps & PN_LEFT) != 0) { opLeft = new DocumentList("(", " ", ")"); } else { opLeft = new DocumentList("", " ", ""); } opLeft->addDocumentToList(expression_to_document(bo.lhs())); std::string op; switch (bo.op()) { case BOT_PLUS: op = "+"; break; case BOT_MINUS: op = "-"; break; case BOT_MULT: op = "*"; break; case BOT_POW: op = "^"; break; case BOT_DIV: op = "/"; break; case BOT_IDIV: op = " div "; break; case BOT_MOD: op = " mod "; break; case BOT_LE: op = " < "; break; case BOT_LQ: op = "<="; break; case BOT_GR: op = " > "; break; case BOT_GQ: op = ">="; break; case BOT_EQ: op = "=="; break; case BOT_NQ: op = "!="; break; case BOT_IN: op = " in "; break; case BOT_SUBSET: op = " subset "; break; case BOT_SUPERSET: op = " superset "; break; case BOT_UNION: op = " union "; break; case BOT_DIFF: op = " diff "; break; case BOT_SYMDIFF: op = " symdiff "; break; case BOT_INTERSECT: op = " intersect "; break; case BOT_PLUSPLUS: op = "++"; linebreak = true; break; case BOT_EQUIV: op = " <-> "; break; case BOT_IMPL: op = " -> "; break; case BOT_RIMPL: op = " <- "; break; case BOT_OR: op = " \\/ "; linebreak = true; break; case BOT_AND: op = " /\\ "; linebreak = true; break; case BOT_XOR: op = " xor "; break; case BOT_DOTDOT: op = ".."; break; default: assert(false); break; } dl = new DocumentList("", op, ""); if ((ps & PN_RIGHT) != 0) { opRight = new DocumentList("(", " ", ")"); } else { opRight = new DocumentList("", "", ""); } opRight->addDocumentToList(expression_to_document(bo.rhs())); dl->addDocumentToList(opLeft); if (linebreak) { dl->addBreakPoint(); } dl->addDocumentToList(opRight); return dl; } static ret mapUnOp(const UnOp& uo) { auto* dl = new DocumentList("", "", ""); std::string op; switch (uo.op()) { case UOT_NOT: op = "not "; break; case UOT_PLUS: op = "+"; break; case UOT_MINUS: op = "-"; break; default: assert(false); break; } dl->addStringToList(op); DocumentList* unop; bool needParen = (uo.e()->isa() || uo.e()->isa()); if (needParen) { unop = new DocumentList("(", " ", ")"); } else { unop = new DocumentList("", " ", ""); } unop->addDocumentToList(expression_to_document(uo.e())); dl->addDocumentToList(unop); return dl; } static ret mapCall(const Call& c) { if (c.argCount() == 1) { /* * if we have only one argument, and this is an array comprehension, * we convert it into the following syntax * forall (f(i,j) | i in 1..10) * --> * forall (i in 1..10) (f(i,j)) */ const Expression* e = c.arg(0); if (e->isa()) { const auto* com = e->cast(); if (!com->set()) { auto* dl = new DocumentList("", " ", ""); dl->addStringToList(std::string(c.id().c_str(), c.id().size())); auto* args = new DocumentList("", " ", "", false); auto* generators = new DocumentList("", ", ", ""); for (int i = 0; i < com->numberOfGenerators(); i++) { auto* gen = new DocumentList("", "", ""); auto* idents = new DocumentList("", ", ", ""); for (int j = 0; j < com->numberOfDecls(i); j++) { idents->addStringToList(std::string(com->decl(i, j)->id()->v().c_str(), com->decl(i, j)->id()->v().size())); } gen->addDocumentToList(idents); if (com->in(i) == nullptr) { gen->addStringToList(" = "); gen->addDocumentToList(expression_to_document(com->where(i))); } else { gen->addStringToList(" in "); gen->addDocumentToList(expression_to_document(com->in(i))); if (com->where(i) != nullptr) { gen->addStringToList(" where "); gen->addDocumentToList(expression_to_document(com->where(i))); } } generators->addDocumentToList(gen); } args->addStringToList("("); args->addDocumentToList(generators); args->addStringToList(")"); args->addStringToList("("); args->addBreakPoint(); args->addDocumentToList(expression_to_document(com->e())); dl->addDocumentToList(args); dl->addBreakPoint(); dl->addStringToList(")"); return dl; } } } std::ostringstream beg; beg << c.id() << "("; auto* dl = new DocumentList(beg.str(), ", ", ")"); for (unsigned int i = 0; i < c.argCount(); i++) { dl->addDocumentToList(expression_to_document(c.arg(i))); } return dl; } static ret mapVarDecl(const VarDecl& vd) { std::ostringstream oss; auto* dl = new DocumentList("", "", ""); dl->addDocumentToList(expression_to_document(vd.ti())); if (vd.id()->idn() == -1) { if (vd.id()->v().size() != 0) { oss << ": " << vd.id()->v().c_str(); } } else { oss << ": X_INTRODUCED_" << vd.id()->idn() << "_"; } dl->addStringToList(oss.str()); if (vd.introduced()) { dl->addStringToList(" ::var_is_introduced "); } if (!vd.ann().isEmpty()) { dl->addDocumentToList(annotation_to_document(vd.ann())); } if (vd.e() != nullptr) { dl->addStringToList(" = "); dl->addDocumentToList(expression_to_document(vd.e())); } return dl; } static ret mapLet(const Let& l) { auto* letin = new DocumentList("", "", "", false); auto* lets = new DocumentList("", " ", "", true); auto* inexpr = new DocumentList("", "", ""); bool ds = l.let().size() > 1; for (unsigned int i = 0; i < l.let().size(); i++) { if (i != 0) { lets->addBreakPoint(ds); } auto* exp = new DocumentList("", " ", ","); const Expression* li = l.let()[i]; if (!li->isa()) { exp->addStringToList("constraint"); } exp->addDocumentToList(expression_to_document(li)); lets->addDocumentToList(exp); } inexpr->addDocumentToList(expression_to_document(l.in())); letin->addBreakPoint(ds); letin->addDocumentToList(lets); auto* letin2 = new DocumentList("", "", "", false); letin2->addBreakPoint(); letin2->addDocumentToList(inexpr); auto* dl = new DocumentList("", "", ""); dl->addStringToList("let {"); dl->addDocumentToList(letin); dl->addBreakPoint(ds); dl->addStringToList("} in ("); dl->addDocumentToList(letin2); // dl->addBreakPoint(); dl->addStringToList(")"); return dl; } static ret mapTypeInst(const TypeInst& ti) { auto* dl = new DocumentList("", "", ""); if (ti.isarray()) { dl->addStringToList("array ["); auto* ran = new DocumentList("", ", ", ""); for (unsigned int i = 0; i < ti.ranges().size(); i++) { ran->addDocumentToList(tiexpression_to_document(Type::parint(), ti.ranges()[i])); } dl->addDocumentToList(ran); dl->addStringToList("] of "); } dl->addDocumentToList(tiexpression_to_document(ti.type(), ti.domain())); return dl; } }; Document* annotation_to_document(const Annotation& ann) { auto* dl = new DocumentList(" :: ", " :: ", ""); for (ExpressionSetIter it = ann.begin(); it != ann.end(); ++it) { dl->addDocumentToList(expression_to_document(*it)); } return dl; } Document* expression_to_document(const Expression* e) { if (e == nullptr) { return new StringDocument("NULL"); } ExpressionDocumentMapper esm; ExpressionMapper em(esm); auto* dl = new DocumentList("", "", ""); Document* s = em.map(e); dl->addDocumentToList(s); if (!e->isa() && !e->ann().isEmpty()) { dl->addDocumentToList(annotation_to_document(e->ann())); } return dl; } class ItemDocumentMapper { public: typedef Document* ret; static ret mapIncludeI(const IncludeI& ii) { std::ostringstream oss; oss << "include \"" << ii.f() << "\";"; return new StringDocument(oss.str()); } static ret mapVarDeclI(const VarDeclI& vi) { auto* dl = new DocumentList("", " ", ";"); dl->addDocumentToList(expression_to_document(vi.e())); return dl; } static ret mapAssignI(const AssignI& ai) { auto* dl = new DocumentList("", " = ", ";"); dl->addStringToList(std::string(ai.id().c_str(), ai.id().size())); dl->addDocumentToList(expression_to_document(ai.e())); return dl; } static ret mapConstraintI(const ConstraintI& ci) { auto* dl = new DocumentList("constraint ", " ", ";"); dl->addDocumentToList(expression_to_document(ci.e())); return dl; } static ret mapSolveI(const SolveI& si) { auto* dl = new DocumentList("", "", ";"); dl->addStringToList("solve"); if (!si.ann().isEmpty()) { dl->addDocumentToList(annotation_to_document(si.ann())); } switch (si.st()) { case SolveI::ST_SAT: dl->addStringToList(" satisfy"); break; case SolveI::ST_MIN: dl->addStringToList(" minimize "); dl->addDocumentToList(expression_to_document(si.e())); break; case SolveI::ST_MAX: dl->addStringToList(" maximize "); dl->addDocumentToList(expression_to_document(si.e())); break; } return dl; } static ret mapOutputI(const OutputI& oi) { auto* dl = new DocumentList("output ", " ", ";"); dl->addDocumentToList(expression_to_document(oi.e())); return dl; } static ret mapFunctionI(const FunctionI& fi) { DocumentList* dl; if (fi.ti()->type().isAnn() && fi.e() == nullptr) { dl = new DocumentList("annotation ", " ", ";", false); } else if (fi.ti()->type() == Type::parbool()) { dl = new DocumentList("test ", "", ";", false); } else if (fi.ti()->type() == Type::varbool()) { dl = new DocumentList("predicate ", "", ";", false); } else { dl = new DocumentList("function ", "", ";", false); dl->addDocumentToList(expression_to_document(fi.ti())); dl->addStringToList(": "); } dl->addStringToList(std::string(fi.id().c_str(), fi.id().size())); if (fi.params().size() > 0) { auto* params = new DocumentList("(", ", ", ")"); for (unsigned int i = 0; i < fi.params().size(); i++) { auto* par = new DocumentList("", "", ""); par->setUnbreakable(true); par->addDocumentToList(expression_to_document(fi.params()[i])); params->addDocumentToList(par); } dl->addDocumentToList(params); } if (!fi.ann().isEmpty()) { dl->addDocumentToList(annotation_to_document(fi.ann())); } if (fi.e() != nullptr) { dl->addStringToList(" = "); dl->addBreakPoint(); dl->addDocumentToList(expression_to_document(fi.e())); } return dl; } }; class PrettyPrinter { public: /* * \brief Constructor for class Pretty Printer * \param maxwidth (default 80) : number of rows * \param indentationBase : spaces that represent the atomic number of spaces * \param sim : whether we want to simplify the result * \param deepSimp : whether we want to simplify at each breakpoint or not */ PrettyPrinter(int _maxwidth = 80, int _indentationBase = 4, bool sim = false, bool deepSimp = false); void print(Document* d); void print(std::ostream& os) const; private: int _maxwidth; int _indentationBase; int _currentLine; int _currentItem; std::vector > _items; std::vector _linesToSimplify; std::vector _linesNotToSimplify; bool _simp; bool _deeplySimp; void addItem(); void addLine(int indentation, bool bp = false, bool simpl = false, int level = 0); static std::string printSpaces(int n); const std::vector& getCurrentItemLines() const; void printDocument(Document* d, bool alignment, int alignmentCol, const std::string& before = "", const std::string& after = ""); void printDocList(DocumentList* d, int alignmentCol, const std::string& before = "", const std::string& after = ""); void printStringDoc(StringDocument* d, bool alignment, int alignmentCol, const std::string& before = "", const std::string& after = ""); void printString(const std::string& s, bool alignment, int alignmentCol); bool simplify(int item, int line, std::vector* vec); void simplifyItem(int item); }; void PrettyPrinter::print(Document* d) { addItem(); addLine(0); printDocument(d, true, 0); if (_simp) { simplifyItem(_currentItem); } } PrettyPrinter::PrettyPrinter(int maxwidth, int indentationBase, bool sim, bool deepsim) { _maxwidth = maxwidth; _indentationBase = indentationBase; _currentLine = -1; _currentItem = -1; _simp = sim; _deeplySimp = deepsim; } const std::vector& PrettyPrinter::getCurrentItemLines() const { return _items[_currentItem]; } void PrettyPrinter::addLine(int indentation, bool bp, bool simpl, int level) { _items[_currentItem].push_back(Line(indentation)); _currentLine++; if (bp && _deeplySimp) { _linesToSimplify[_currentItem].addLine(level, _currentLine); if (!simpl) { _linesNotToSimplify[_currentItem].addLine(0, _currentLine); } } } void PrettyPrinter::addItem() { _items.emplace_back(); _linesToSimplify.emplace_back(); _linesNotToSimplify.emplace_back(); _currentItem++; _currentLine = -1; } void PrettyPrinter::print(std::ostream& os) const { std::vector::const_iterator it; int nItems = static_cast(_items.size()); for (int item = 0; item < nItems; item++) { for (it = _items[item].begin(); it != _items[item].end(); it++) { it->print(os); } // os << std::endl; } } std::string PrettyPrinter::printSpaces(int n) { std::string result; for (int i = 0; i < n; i++) { result += " "; } return result; } void PrettyPrinter::printDocument(Document* d, bool alignment, int alignmentCol, const std::string& before, const std::string& after) { if (auto* dl = dynamic_cast(d)) { printDocList(dl, alignmentCol, before, after); } else if (auto* sd = dynamic_cast(d)) { printStringDoc(sd, alignment, alignmentCol, before, after); } else if (auto* bp = dynamic_cast(d)) { printString(before, alignment, alignmentCol); addLine(alignmentCol, _deeplySimp, !bp->getDontSimplify(), d->getLevel()); printString(after, alignment, alignmentCol); } else { throw InternalError("PrettyPrinter::print : Wrong type of document"); } } void PrettyPrinter::printStringDoc(StringDocument* d, bool alignment, int alignmentCol, const std::string& before, const std::string& after) { std::string s; if (d != nullptr) { s = d->getString(); } s = before + s + after; printString(s, alignment, alignmentCol); } void PrettyPrinter::printString(const std::string& s, bool alignment, int alignmentCol) { Line& l = _items[_currentItem][_currentLine]; int size = static_cast(s.size()); if (size <= l.getSpaceLeft(_maxwidth)) { l.addString(s); } else { int col = alignment && _maxwidth - alignmentCol >= size ? alignmentCol : _indentationBase; addLine(col); _items[_currentItem][_currentLine].addString(s); } } void PrettyPrinter::printDocList(DocumentList* d, int alignmentCol, const std::string& super_before, const std::string& super_after) { std::vector ld = d->getDocs(); std::string beginToken = d->getBeginToken(); std::string separator = d->getSeparator(); std::string endToken = d->getEndToken(); bool _alignment = d->getAlignment(); if (d->getUnbreakable()) { addLine(alignmentCol); } int currentCol = _items[_currentItem][_currentLine].getIndentation() + _items[_currentItem][_currentLine].getLength(); int newAlignmentCol = _alignment ? currentCol + static_cast(beginToken.size()) : alignmentCol; int vectorSize = static_cast(ld.size()); int lastVisibleElementIndex; for (int i = 0; i < vectorSize; i++) { if (dynamic_cast(ld[i]) == nullptr) { lastVisibleElementIndex = i; } } if (vectorSize == 0) { printStringDoc(nullptr, true, newAlignmentCol, super_before + beginToken, endToken + super_after); } for (int i = 0; i < vectorSize; i++) { Document* subdoc = ld[i]; bool bp = false; if (dynamic_cast(subdoc) != nullptr) { if (!_alignment) { newAlignmentCol += _indentationBase; } bp = true; } std::string af; std::string be; if (i != vectorSize - 1) { if (bp || lastVisibleElementIndex <= i) { af = ""; } else { af = separator; } } else { af = endToken + super_after; } if (i == 0) { be = super_before + beginToken; } else { be = ""; } printDocument(subdoc, _alignment, newAlignmentCol, be, af); } if (d->getUnbreakable()) { simplify(_currentItem, _currentLine, nullptr); } } void PrettyPrinter::simplifyItem(int item) { _linesToSimplify[item].remove(_linesNotToSimplify[item]); std::vector* vec = (_linesToSimplify[item].getLinesToSimplify()); while (!vec->empty()) { if (!simplify(item, (*vec)[0], vec)) { break; } } delete vec; } bool PrettyPrinter::simplify(int item, int line, std::vector* vec) { if (line == 0) { _linesToSimplify[item].remove(vec, line, false); return false; } if (_items[item][line].getLength() > _items[item][line - 1].getSpaceLeft(_maxwidth)) { _linesToSimplify[item].remove(vec, line, false); return false; } _linesToSimplify[item].remove(vec, line, true); _items[item][line - 1].concatenateLines(_items[item][line]); _items[item].erase(_items[item].begin() + line); _linesToSimplify[item].decrementLine(vec, line); _currentLine--; return true; } Printer::Printer(std::ostream& os, int width, bool flatZinc, EnvI* env) : _env(env), _ism(nullptr), _printer(nullptr), _os(os), _width(width), _flatZinc(flatZinc) {} void Printer::init() { if (_ism == nullptr) { _ism = new ItemDocumentMapper(); _printer = new PrettyPrinter(_width, 4, true, true); } } Printer::~Printer() { delete _printer; delete _ism; } void Printer::p(Document* d) { _printer->print(d); _printer->print(_os); delete _printer; _printer = new PrettyPrinter(_width, 4, true, true); } void Printer::p(const Item* i) { Document* d; switch (i->iid()) { case Item::II_INC: d = ItemDocumentMapper::mapIncludeI(*i->cast()); break; case Item::II_VD: d = ItemDocumentMapper::mapVarDeclI(*i->cast()); break; case Item::II_ASN: d = ItemDocumentMapper::mapAssignI(*i->cast()); break; case Item::II_CON: d = ItemDocumentMapper::mapConstraintI(*i->cast()); break; case Item::II_SOL: d = ItemDocumentMapper::mapSolveI(*i->cast()); break; case Item::II_OUT: d = ItemDocumentMapper::mapOutputI(*i->cast()); break; case Item::II_FUN: d = ItemDocumentMapper::mapFunctionI(*i->cast()); break; } p(d); delete d; } void Printer::print(const Expression* e) { if (_width == 0) { PlainPrinter p(_os, _flatZinc, _env); p.p(e); } else { init(); Document* d = expression_to_document(e); p(d); delete d; } } void Printer::print(const Item* i) { if (_width == 0) { PlainPrinter p(_os, _flatZinc, _env); p.p(i); } else { init(); p(i); } } void Printer::print(const Model* m) { if (_width == 0) { PlainPrinter p(_os, _flatZinc, _env); for (auto* i : *m) { p.p(i); } } else { init(); for (auto* i : *m) { p(i); } } } } // namespace MiniZinc void debugprint(MiniZinc::Expression* e) { std::cerr << *e << "\n"; } void debugprint(MiniZinc::Item* i) { std::cerr << *i; } void debugprint(MiniZinc::Model* m) { MiniZinc::Printer p(std::cerr, 0); p.print(m); } void debugprint(const MiniZinc::Location& loc) { std::cerr << loc << std::endl; } libminizinc-2.5.3/lib/thirdparty/0000755000175000017500000000000013757304533015440 5ustar kaolkaollibminizinc-2.5.3/lib/thirdparty/miniz.c0000644000175000017500000114415613757304533016746 0ustar kaolkaol/************************************************************************** * * Copyright 2013-2014 RAD Game Tools and Valve Software * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * **************************************************************************/ #include typedef unsigned char mz_validate_uint16[sizeof(mz_uint16) == 2 ? 1 : -1]; typedef unsigned char mz_validate_uint32[sizeof(mz_uint32) == 4 ? 1 : -1]; typedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1]; #ifdef __cplusplus extern "C" { #endif /* ------------------- zlib-style API's */ mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) { mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552; if (!ptr) return MZ_ADLER32_INIT; while (buf_len) { for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; } for (; i < block_len; ++i) s1 += *ptr++, s2 += s1; s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; } return (s2 << 16) + s1; } /* Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ */ #if 0 mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) { static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; mz_uint32 crcu32 = (mz_uint32)crc; if (!ptr) return MZ_CRC32_INIT; crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; } return ~crcu32; } #else /* Faster, but larger CPU cache footprint. */ mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) { static const mz_uint32 s_crc_table[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; mz_uint32 crc32 = (mz_uint32)crc ^ 0xFFFFFFFF; const mz_uint8 *pByte_buf = (const mz_uint8 *)ptr; while (buf_len >= 4) { crc32 = (crc32 >> 8) ^ s_crc_table[(crc32 ^ pByte_buf[0]) & 0xFF]; crc32 = (crc32 >> 8) ^ s_crc_table[(crc32 ^ pByte_buf[1]) & 0xFF]; crc32 = (crc32 >> 8) ^ s_crc_table[(crc32 ^ pByte_buf[2]) & 0xFF]; crc32 = (crc32 >> 8) ^ s_crc_table[(crc32 ^ pByte_buf[3]) & 0xFF]; pByte_buf += 4; buf_len -= 4; } while (buf_len) { crc32 = (crc32 >> 8) ^ s_crc_table[(crc32 ^ pByte_buf[0]) & 0xFF]; ++pByte_buf; --buf_len; } return ~crc32; } #endif void mz_free(void *p) { MZ_FREE(p); } void *miniz_def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); } void miniz_def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); } void *miniz_def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); } const char *mz_version(void) { return MZ_VERSION; } #ifndef MINIZ_NO_ZLIB_APIS int mz_deflateInit(mz_streamp pStream, int level) { return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); } int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) { tdefl_compressor *pComp; mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); if (!pStream) return MZ_STREAM_ERROR; if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR; pStream->data_type = 0; pStream->adler = MZ_ADLER32_INIT; pStream->msg = NULL; pStream->reserved = 0; pStream->total_in = 0; pStream->total_out = 0; if (!pStream->zalloc) pStream->zalloc = miniz_def_alloc_func; if (!pStream->zfree) pStream->zfree = miniz_def_free_func; pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); if (!pComp) return MZ_MEM_ERROR; pStream->state = (struct mz_internal_state *)pComp; if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) { mz_deflateEnd(pStream); return MZ_PARAM_ERROR; } return MZ_OK; } int mz_deflateReset(mz_streamp pStream) { if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR; pStream->total_in = pStream->total_out = 0; tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL, ((tdefl_compressor *)pStream->state)->m_flags); return MZ_OK; } int mz_deflate(mz_streamp pStream, int flush) { size_t in_bytes, out_bytes; mz_ulong orig_total_in, orig_total_out; int mz_status = MZ_OK; if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR; if (!pStream->avail_out) return MZ_BUF_ERROR; if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; if (((tdefl_compressor *)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; orig_total_in = pStream->total_in; orig_total_out = pStream->total_out; for (;;) { tdefl_status defl_status; in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; defl_status = tdefl_compress((tdefl_compressor *)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state); pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; if (defl_status < 0) { mz_status = MZ_STREAM_ERROR; break; } else if (defl_status == TDEFL_STATUS_DONE) { mz_status = MZ_STREAM_END; break; } else if (!pStream->avail_out) break; else if ((!pStream->avail_in) && (flush != MZ_FINISH)) { if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) break; return MZ_BUF_ERROR; /* Can't make forward progress without some input. */ } } return mz_status; } int mz_deflateEnd(mz_streamp pStream) { if (!pStream) return MZ_STREAM_ERROR; if (pStream->state) { pStream->zfree(pStream->opaque, pStream->state); pStream->state = NULL; } return MZ_OK; } mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) { (void)pStream; /* This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) */ return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); } int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) { int status; mz_stream stream; memset(&stream, 0, sizeof(stream)); /* In case mz_ulong is 64-bits (argh I hate longs). */ if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; stream.next_in = pSource; stream.avail_in = (mz_uint32)source_len; stream.next_out = pDest; stream.avail_out = (mz_uint32)*pDest_len; status = mz_deflateInit(&stream, level); if (status != MZ_OK) return status; status = mz_deflate(&stream, MZ_FINISH); if (status != MZ_STREAM_END) { mz_deflateEnd(&stream); return (status == MZ_OK) ? MZ_BUF_ERROR : status; } *pDest_len = stream.total_out; return mz_deflateEnd(&stream); } int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) { return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); } mz_ulong mz_compressBound(mz_ulong source_len) { return mz_deflateBound(NULL, source_len); } typedef struct { tinfl_decompressor m_decomp; mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits; mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; tinfl_status m_last_status; } inflate_state; int mz_inflateInit2(mz_streamp pStream, int window_bits) { inflate_state *pDecomp; if (!pStream) return MZ_STREAM_ERROR; if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR; pStream->data_type = 0; pStream->adler = 0; pStream->msg = NULL; pStream->total_in = 0; pStream->total_out = 0; pStream->reserved = 0; if (!pStream->zalloc) pStream->zalloc = miniz_def_alloc_func; if (!pStream->zfree) pStream->zfree = miniz_def_free_func; pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); if (!pDecomp) return MZ_MEM_ERROR; pStream->state = (struct mz_internal_state *)pDecomp; tinfl_init(&pDecomp->m_decomp); pDecomp->m_dict_ofs = 0; pDecomp->m_dict_avail = 0; pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; pDecomp->m_first_call = 1; pDecomp->m_has_flushed = 0; pDecomp->m_window_bits = window_bits; return MZ_OK; } int mz_inflateInit(mz_streamp pStream) { return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); } int mz_inflate(mz_streamp pStream, int flush) { inflate_state *pState; mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; size_t in_bytes, out_bytes, orig_avail_in; tinfl_status status; if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; pState = (inflate_state *)pStream->state; if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; orig_avail_in = pStream->avail_in; first_call = pState->m_first_call; pState->m_first_call = 0; if (pState->m_last_status < 0) return MZ_DATA_ERROR; if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; pState->m_has_flushed |= (flush == MZ_FINISH); if ((flush == MZ_FINISH) && (first_call)) { /* MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. */ decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); pState->m_last_status = status; pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; if (status < 0) return MZ_DATA_ERROR; else if (status != TINFL_STATUS_DONE) { pState->m_last_status = TINFL_STATUS_FAILED; return MZ_BUF_ERROR; } return MZ_STREAM_END; } /* flush != MZ_FINISH then we must assume there's more input. */ if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; if (pState->m_dict_avail) { n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; } for (;;) { in_bytes = pStream->avail_in; out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); pState->m_last_status = status; pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); pState->m_dict_avail = (mz_uint)out_bytes; n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); if (status < 0) return MZ_DATA_ERROR; /* Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). */ else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) return MZ_BUF_ERROR; /* Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. */ else if (flush == MZ_FINISH) { /* The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. */ if (status == TINFL_STATUS_DONE) return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; /* status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. */ else if (!pStream->avail_out) return MZ_BUF_ERROR; } else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) break; } return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; } int mz_inflateEnd(mz_streamp pStream) { if (!pStream) return MZ_STREAM_ERROR; if (pStream->state) { pStream->zfree(pStream->opaque, pStream->state); pStream->state = NULL; } return MZ_OK; } int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) { mz_stream stream; int status; memset(&stream, 0, sizeof(stream)); /* In case mz_ulong is 64-bits (argh I hate longs). */ if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; stream.next_in = pSource; stream.avail_in = (mz_uint32)source_len; stream.next_out = pDest; stream.avail_out = (mz_uint32)*pDest_len; status = mz_inflateInit(&stream); if (status != MZ_OK) return status; status = mz_inflate(&stream, MZ_FINISH); if (status != MZ_STREAM_END) { mz_inflateEnd(&stream); return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; } *pDest_len = stream.total_out; return mz_inflateEnd(&stream); } const char *mz_error(int err) { static struct { int m_err; const char *m_pDesc; } s_error_descs[] = { { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } }; mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; return NULL; } #endif /*MINIZ_NO_ZLIB_APIS */ #ifdef __cplusplus } #endif /* This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to */ /************************************************************************** * * Copyright 2013-2014 RAD Game Tools and Valve Software * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * **************************************************************************/ #ifdef __cplusplus extern "C" { #endif /* ------------------- Low-level Compression (independent from all decompression API's) */ /* Purposely making these tables static for faster init and thread safety. */ static const mz_uint16 s_tdefl_len_sym[256] = { 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268, 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285 }; static const mz_uint8 s_tdefl_len_extra[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0 }; static const mz_uint8 s_tdefl_small_dist_sym[512] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; static const mz_uint8 s_tdefl_small_dist_extra[512] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; static const mz_uint8 s_tdefl_large_dist_sym[128] = { 0, 0, 18, 19, 20, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; static const mz_uint8 s_tdefl_large_dist_extra[128] = { 0, 0, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 }; /* Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. */ typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq *pSyms0, tdefl_sym_freq *pSyms1) { mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist); for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; } while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) { const mz_uint32 *pHist = &hist[pass << 8]; mz_uint offsets[256], cur_ofs = 0; for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; { tdefl_sym_freq *t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; } } return pCur_syms; } /* tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. */ static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) { int root, leaf, next, avbl, used, dpth; if (n == 0) return; else if (n == 1) { A[0].m_key = 1; return; } A[0].m_key += A[1].m_key; root = 0; leaf = 2; for (next = 1; next < n - 1; next++) { if (leaf >= n || A[root].m_key < A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = (mz_uint16)next; } else A[next].m_key = A[leaf++].m_key; if (leaf >= n || (root < next && A[root].m_key < A[leaf].m_key)) { A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); A[root++].m_key = (mz_uint16)next; } else A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key); } A[n - 2].m_key = 0; for (next = n - 3; next >= 0; next--) A[next].m_key = A[A[next].m_key].m_key + 1; avbl = 1; used = dpth = 0; root = n - 2; next = n - 1; while (avbl > 0) { while (root >= 0 && (int)A[root].m_key == dpth) { used++; root--; } while (avbl > used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; } avbl = 2 * used; dpth++; used = 0; } } /* Limits canonical Huffman code table's max code size. */ enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) { int i; mz_uint32 total = 0; if (code_list_len <= 1) return; for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); while (total != (1UL << max_code_size)) { pNum_codes[max_code_size]--; for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } total--; } } static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) { int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes); if (static_table) { for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++; } else { tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; int num_used_syms = 0; const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; } pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); for (i = 1, j = num_used_syms; i <= code_size_limit; i++) for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); } next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1); for (i = 0; i < table_len; i++) { mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1); d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; } } #define TDEFL_PUT_BITS(b, l) \ do \ { \ mz_uint bits = b; \ mz_uint len = l; \ MZ_ASSERT(bits <= ((1U << len) - 1U)); \ d->m_bit_buffer |= (bits << d->m_bits_in); \ d->m_bits_in += len; \ while (d->m_bits_in >= 8) \ { \ if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ d->m_bit_buffer >>= 8; \ d->m_bits_in -= 8; \ } \ } \ MZ_MACRO_END #define TDEFL_RLE_PREV_CODE_SIZE() \ { \ if (rle_repeat_count) \ { \ if (rle_repeat_count < 3) \ { \ d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ while (rle_repeat_count--) \ packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ } \ else \ { \ d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); \ packed_code_sizes[num_packed_code_sizes++] = 16; \ packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ } \ rle_repeat_count = 0; \ } \ } #define TDEFL_RLE_ZERO_CODE_SIZE() \ { \ if (rle_z_count) \ { \ if (rle_z_count < 3) \ { \ d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); \ while (rle_z_count--) \ packed_code_sizes[num_packed_code_sizes++] = 0; \ } \ else if (rle_z_count <= 10) \ { \ d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); \ packed_code_sizes[num_packed_code_sizes++] = 17; \ packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ } \ else \ { \ d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); \ packed_code_sizes[num_packed_code_sizes++] = 18; \ packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ } \ rle_z_count = 0; \ } \ } static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; static void tdefl_start_dynamic_block(tdefl_compressor *d) { int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; d->m_huff_count[0][256] = 1; tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0; memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); for (i = 0; i < total_code_sizes_to_pack; i++) { mz_uint8 code_size = code_sizes_to_pack[i]; if (!code_size) { TDEFL_RLE_PREV_CODE_SIZE(); if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); } } else { TDEFL_RLE_ZERO_CODE_SIZE(); if (code_size != prev_code_size) { TDEFL_RLE_PREV_CODE_SIZE(); d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size; } else if (++rle_repeat_count == 6) { TDEFL_RLE_PREV_CODE_SIZE(); } } prev_code_size = code_size; } if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); } tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); TDEFL_PUT_BITS(2, 2); TDEFL_PUT_BITS(num_lit_codes - 257, 5); TDEFL_PUT_BITS(num_dist_codes - 1, 5); for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break; num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4); for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes;) { mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); } } static void tdefl_start_static_block(tdefl_compressor *d) { mz_uint i; mz_uint8 *p = &d->m_huff_code_sizes[0][0]; for (i = 0; i <= 143; ++i) *p++ = 8; for (; i <= 255; ++i) *p++ = 9; for (; i <= 279; ++i) *p++ = 7; for (; i <= 287; ++i) *p++ = 8; memset(d->m_huff_code_sizes[1], 5, 32); tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); TDEFL_PUT_BITS(1, 2); } static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { mz_uint flags; mz_uint8 *pLZ_codes; mz_uint8 *pOutput_buf = d->m_pOutput_buf; mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; mz_uint64 bit_buffer = d->m_bit_buffer; mz_uint bits_in = d->m_bits_in; #define TDEFL_PUT_BITS_FAST(b, l) \ { \ bit_buffer |= (((mz_uint64)(b)) << bits_in); \ bits_in += (l); \ } flags = 1; for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) { if (flags == 1) flags = *pLZ_codes++ | 0x100; if (flags & 1) { mz_uint s0, s1, n0, n1, sym, num_extra_bits; mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3; MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); /* This sequence coaxes MSVC into using cmov's vs. jmp's. */ s0 = s_tdefl_small_dist_sym[match_dist & 511]; n0 = s_tdefl_small_dist_extra[match_dist & 511]; s1 = s_tdefl_large_dist_sym[match_dist >> 8]; n1 = s_tdefl_large_dist_extra[match_dist >> 8]; sym = (match_dist < 512) ? s0 : s1; num_extra_bits = (match_dist < 512) ? n0 : n1; MZ_ASSERT(d->m_huff_code_sizes[1][sym]); TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); } else { mz_uint lit = *pLZ_codes++; MZ_ASSERT(d->m_huff_code_sizes[0][lit]); TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { flags >>= 1; lit = *pLZ_codes++; MZ_ASSERT(d->m_huff_code_sizes[0][lit]); TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { flags >>= 1; lit = *pLZ_codes++; MZ_ASSERT(d->m_huff_code_sizes[0][lit]); TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); } } } if (pOutput_buf >= d->m_pOutput_buf_end) return MZ_FALSE; *(mz_uint64 *)pOutput_buf = bit_buffer; pOutput_buf += (bits_in >> 3); bit_buffer >>= (bits_in & ~7); bits_in &= 7; } #undef TDEFL_PUT_BITS_FAST d->m_pOutput_buf = pOutput_buf; d->m_bits_in = 0; d->m_bit_buffer = 0; while (bits_in) { mz_uint32 n = MZ_MIN(bits_in, 16); TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); bit_buffer >>= n; bits_in -= n; } TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); return (d->m_pOutput_buf < d->m_pOutput_buf_end); } #else static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { mz_uint flags; mz_uint8 *pLZ_codes; flags = 1; for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) { if (flags == 1) flags = *pLZ_codes++ | 0x100; if (flags & 1) { mz_uint sym, num_extra_bits; mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3; MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); if (match_dist < 512) { sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist]; } else { sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; } MZ_ASSERT(d->m_huff_code_sizes[1][sym]); TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); } else { mz_uint lit = *pLZ_codes++; MZ_ASSERT(d->m_huff_code_sizes[0][lit]); TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); } } TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); return (d->m_pOutput_buf < d->m_pOutput_buf_end); } #endif /* MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS */ static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) { if (static_block) tdefl_start_static_block(d); else tdefl_start_dynamic_block(d); return tdefl_compress_lz_codes(d); } static int tdefl_flush_block(tdefl_compressor *d, int flush) { mz_uint saved_bit_buf, saved_bits_in; mz_uint8 *pSaved_output_buf; mz_bool comp_block_succeeded = MZ_FALSE; int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; d->m_pOutput_buf = pOutput_buf_start; d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; MZ_ASSERT(!d->m_output_flush_remaining); d->m_output_flush_ofs = 0; d->m_output_flush_remaining = 0; *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) { TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8); } TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in; if (!use_raw_block) comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); /* If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. */ if (((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size)) { mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; TDEFL_PUT_BITS(0, 2); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) { TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); } for (i = 0; i < d->m_total_lz_bytes; ++i) { TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); } } /* Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. */ else if (!comp_block_succeeded) { d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; tdefl_compress_block(d, MZ_TRUE); } if (flush) { if (flush == TDEFL_FINISH) { if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } } } else { mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); } } } MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++; if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) { if (d->m_pPut_buf_func) { *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); } else if (pOutput_buf_start == d->m_output_buf) { int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); d->m_out_buf_ofs += bytes_to_copy; if ((n -= bytes_to_copy) != 0) { d->m_output_flush_ofs = bytes_to_copy; d->m_output_flush_remaining = n; } } else { d->m_out_buf_ofs += n; } } return d->m_output_flush_remaining; } #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES #ifdef MINIZ_UNALIGNED_USE_MEMCPY static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD(const mz_uint8* p) { mz_uint16 ret; memcpy(&ret, p, sizeof(mz_uint16)); return ret; } static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD2(const mz_uint16* p) { mz_uint16 ret; memcpy(&ret, p, sizeof(mz_uint16)); return ret; } #else #define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p) #define TDEFL_READ_UNALIGNED_WORD2(p) *(const mz_uint16 *)(p) #endif static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q; mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD2(s); MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; for (;;) { for (;;) { if (--num_probes_left == 0) return; #define TDEFL_PROBE \ next_probe_pos = d->m_next[probe_pos]; \ if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \ return; \ probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \ break; TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; } if (!dist) break; q = (const mz_uint16 *)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD2(q) != s01) continue; p = s; probe_len = 32; do { } while ((TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (--probe_len > 0)); if (!probe_len) { *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, (mz_uint)TDEFL_MAX_MATCH_LEN); break; } else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q)) > match_len) { *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break; c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); } } } #else static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; const mz_uint8 *s = d->m_dict + pos, *p, *q; mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; for (;;) { for (;;) { if (--num_probes_left == 0) return; #define TDEFL_PROBE \ next_probe_pos = d->m_next[probe_pos]; \ if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \ return; \ probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) \ break; TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; } if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; if (probe_len > match_len) { *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1]; } } } #endif /* #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES */ #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN static mz_bool tdefl_compress_fast(tdefl_compressor *d) { /* Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. */ mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) { const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); d->m_src_buf_left -= num_bytes_to_process; lookahead_size += num_bytes_to_process; while (num_bytes_to_process) { mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); memcpy(d->m_dict + dst_pos, d->m_pSrc, n); if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); d->m_pSrc += n; dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; num_bytes_to_process -= n; } dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break; while (lookahead_size >= 4) { mz_uint cur_match_dist, cur_match_len = 1; mz_uint8 *pCur_dict = d->m_dict + cur_pos; mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; mz_uint probe_pos = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)lookahead_pos; if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) { const mz_uint16 *p = (const mz_uint16 *)pCur_dict; const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); mz_uint32 probe_len = 32; do { } while ((TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (--probe_len > 0)); cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); if (!probe_len) cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U * 1024U))) { cur_match_len = 1; *pLZ_code_buf++ = (mz_uint8)first_trigram; *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); d->m_huff_count[0][(mz_uint8)first_trigram]++; } else { mz_uint32 s0, s1; cur_match_len = MZ_MIN(cur_match_len, lookahead_size); MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); cur_match_dist--; pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; pLZ_code_buf += 3; *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; } } else { *pLZ_code_buf++ = (mz_uint8)first_trigram; *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); d->m_huff_count[0][(mz_uint8)first_trigram]++; } if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } total_lz_bytes += cur_match_len; lookahead_pos += cur_match_len; dict_size = MZ_MIN(dict_size + cur_match_len, (mz_uint)TDEFL_LZ_DICT_SIZE); cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; MZ_ASSERT(lookahead_size >= cur_match_len); lookahead_size -= cur_match_len; if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { int n; d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; if ((n = tdefl_flush_block(d, 0)) != 0) return (n < 0) ? MZ_FALSE : MZ_TRUE; total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; } } while (lookahead_size) { mz_uint8 lit = d->m_dict[cur_pos]; total_lz_bytes++; *pLZ_code_buf++ = lit; *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } d->m_huff_count[0][lit]++; lookahead_pos++; dict_size = MZ_MIN(dict_size + 1, (mz_uint)TDEFL_LZ_DICT_SIZE); cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; lookahead_size--; if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { int n; d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; if ((n = tdefl_flush_block(d, 0)) != 0) return (n < 0) ? MZ_FALSE : MZ_TRUE; total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; } } } d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; return MZ_TRUE; } #endif /* MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN */ static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) { d->m_total_lz_bytes++; *d->m_pLZ_code_buf++ = lit; *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } d->m_huff_count[0][lit]++; } static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) { mz_uint32 s0, s1; MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); d->m_total_lz_bytes += match_len; d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); match_dist -= 1; d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3; *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127]; d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; } static mz_bool tdefl_compress_normal(tdefl_compressor *d) { const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left; tdefl_flush flush = d->m_flush; while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) { mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; /* Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. */ if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) { mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; src_buf_left -= num_bytes_to_process; d->m_lookahead_size += num_bytes_to_process; while (pSrc != pSrc_end) { mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++; } } else { while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) { mz_uint8 c = *pSrc++; mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; src_buf_left--; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) { mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); } } } d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) break; /* Simple lazy/greedy parsing state machine. */ len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) { if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) { mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; } if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1; } } else { tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); } if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U * 1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) { cur_match_dist = cur_match_len = 0; } if (d->m_saved_match_len) { if (cur_match_len > d->m_saved_match_len) { tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); if (cur_match_len >= 128) { tdefl_record_match(d, cur_match_len, cur_match_dist); d->m_saved_match_len = 0; len_to_move = cur_match_len; } else { d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; } } else { tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0; } } else if (!cur_match_dist) tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]); else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) { tdefl_record_match(d, cur_match_len, cur_match_dist); len_to_move = cur_match_len; } else { d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; } /* Move the lookahead forward by len_to_move bytes. */ d->m_lookahead_pos += len_to_move; MZ_ASSERT(d->m_lookahead_size >= len_to_move); d->m_lookahead_size -= len_to_move; d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, (mz_uint)TDEFL_LZ_DICT_SIZE); /* Check if it's time to flush the current LZ codes to the internal output buffer. */ if ((d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || ((d->m_total_lz_bytes > 31 * 1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))) { int n; d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; if ((n = tdefl_flush_block(d, 0)) != 0) return (n < 0) ? MZ_FALSE : MZ_TRUE; } } d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; return MZ_TRUE; } static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) { if (d->m_pIn_buf_size) { *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; } if (d->m_pOut_buf_size) { size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); d->m_output_flush_ofs += (mz_uint)n; d->m_output_flush_remaining -= (mz_uint)n; d->m_out_buf_ofs += n; *d->m_pOut_buf_size = d->m_out_buf_ofs; } return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; } tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) { if (!d) { if (pIn_buf_size) *pIn_buf_size = 0; if (pOut_buf_size) *pOut_buf_size = 0; return TDEFL_STATUS_BAD_PARAM; } d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size; d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size; d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; d->m_out_buf_ofs = 0; d->m_flush = flush; if (((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf)) { if (pIn_buf_size) *pIn_buf_size = 0; if (pOut_buf_size) *pOut_buf_size = 0; return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); } d->m_wants_to_finish |= (flush == TDEFL_FINISH); if ((d->m_output_flush_remaining) || (d->m_finished)) return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) { if (!tdefl_compress_fast(d)) return d->m_prev_return_status; } else #endif /* #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN */ { if (!tdefl_compress_normal(d)) return d->m_prev_return_status; } if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) { if (tdefl_flush_block(d, flush) < 0) return d->m_prev_return_status; d->m_finished = (flush == TDEFL_FINISH); if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; } } return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); } tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) { MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); } tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user; d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY; d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1; d->m_pIn_buf = NULL; d->m_pOut_buf = NULL; d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL; d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0; if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_dict); memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); return TDEFL_STATUS_OKAY; } tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) { return d->m_prev_return_status; } mz_uint32 tdefl_get_adler32(tdefl_compressor *d) { return d->m_adler32; } mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE; succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); MZ_FREE(pComp); return succeeded; } typedef struct { size_t m_size, m_capacity; mz_uint8 *m_pBuf; mz_bool m_expandable; } tdefl_output_buffer; static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) { tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; size_t new_size = p->m_size + len; if (new_size > p->m_capacity) { size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE; do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity); pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE; p->m_pBuf = pNew_buf; p->m_capacity = new_capacity; } memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size; return MZ_TRUE; } void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) { tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); if (!pOut_len) return MZ_FALSE; else *pOut_len = 0; out_buf.m_expandable = MZ_TRUE; if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL; *pOut_len = out_buf.m_size; return out_buf.m_pBuf; } size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) { tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); if (!pOut_buf) return 0; out_buf.m_pBuf = (mz_uint8 *)pOut_buf; out_buf.m_capacity = out_buf_len; if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0; return out_buf.m_size; } static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; /* level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). */ mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) { mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES; else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK; else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES; return comp_flags; } #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4204) /* nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) */ #endif /* Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck. */ void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip) { /* Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined. */ static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0; if (!pComp) return NULL; MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57 + MZ_MAX(64, (1 + bpl) * h); if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; } /* write dummy header */ for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); /* compress image data */ tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER); for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); } if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } /* write real header */ *pLen_out = out_buf.m_size - 41; { static const mz_uint8 chans[] = { 0x00, 0x00, 0x04, 0x02, 0x06 }; mz_uint8 pnghdr[41] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x44, 0x41, 0x54 }; pnghdr[18] = (mz_uint8)(w >> 8); pnghdr[19] = (mz_uint8)w; pnghdr[22] = (mz_uint8)(h >> 8); pnghdr[23] = (mz_uint8)h; pnghdr[25] = chans[num_chans]; pnghdr[33] = (mz_uint8)(*pLen_out >> 24); pnghdr[34] = (mz_uint8)(*pLen_out >> 16); pnghdr[35] = (mz_uint8)(*pLen_out >> 8); pnghdr[36] = (mz_uint8)*pLen_out; c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr + 12, 17); for (i = 0; i < 4; ++i, c <<= 8) ((mz_uint8 *)(pnghdr + 29))[i] = (mz_uint8)(c >> 24); memcpy(out_buf.m_pBuf, pnghdr, 41); } /* write footer (IDAT CRC-32, followed by IEND chunk) */ if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf + 41 - 4, *pLen_out + 4); for (i = 0; i < 4; ++i, c <<= 8) (out_buf.m_pBuf + out_buf.m_size - 16)[i] = (mz_uint8)(c >> 24); /* compute final size of file, grab compressed data buffer and return */ *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf; } void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) { /* Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out) */ return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE); } /* Allocate the tdefl_compressor and tinfl_decompressor structures in C so that */ /* non-C language bindings to tdefL_ and tinfl_ API don't need to worry about */ /* structure size and allocation mechanism. */ tdefl_compressor *tdefl_compressor_alloc() { return (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); } void tdefl_compressor_free(tdefl_compressor *pComp) { MZ_FREE(pComp); } #ifdef _MSC_VER #pragma warning(pop) #endif #ifdef __cplusplus } #endif /************************************************************************** * * Copyright 2013-2014 RAD Game Tools and Valve Software * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * **************************************************************************/ #ifdef __cplusplus extern "C" { #endif /* ------------------- Low-level Decompression (completely independent from all compression API's) */ #define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) #define TINFL_MEMSET(p, c, l) memset(p, c, l) #define TINFL_CR_BEGIN \ switch (r->m_state) \ { \ case 0: #define TINFL_CR_RETURN(state_index, result) \ do \ { \ status = result; \ r->m_state = state_index; \ goto common_exit; \ case state_index:; \ } \ MZ_MACRO_END #define TINFL_CR_RETURN_FOREVER(state_index, result) \ do \ { \ for (;;) \ { \ TINFL_CR_RETURN(state_index, result); \ } \ } \ MZ_MACRO_END #define TINFL_CR_FINISH } #define TINFL_GET_BYTE(state_index, c) \ do \ { \ while (pIn_buf_cur >= pIn_buf_end) \ { \ TINFL_CR_RETURN(state_index, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); \ } \ c = *pIn_buf_cur++; \ } \ MZ_MACRO_END #define TINFL_NEED_BITS(state_index, n) \ do \ { \ mz_uint c; \ TINFL_GET_BYTE(state_index, c); \ bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \ num_bits += 8; \ } while (num_bits < (mz_uint)(n)) #define TINFL_SKIP_BITS(state_index, n) \ do \ { \ if (num_bits < (mz_uint)(n)) \ { \ TINFL_NEED_BITS(state_index, n); \ } \ bit_buf >>= (n); \ num_bits -= (n); \ } \ MZ_MACRO_END #define TINFL_GET_BITS(state_index, b, n) \ do \ { \ if (num_bits < (mz_uint)(n)) \ { \ TINFL_NEED_BITS(state_index, n); \ } \ b = bit_buf & ((1 << (n)) - 1); \ bit_buf >>= (n); \ num_bits -= (n); \ } \ MZ_MACRO_END /* TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. */ /* It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a */ /* Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the */ /* bit buffer contains >=15 bits (deflate's max. Huffman code size). */ #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ do \ { \ temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ if (temp >= 0) \ { \ code_len = temp >> 9; \ if ((code_len) && (num_bits >= code_len)) \ break; \ } \ else if (num_bits > TINFL_FAST_LOOKUP_BITS) \ { \ code_len = TINFL_FAST_LOOKUP_BITS; \ do \ { \ temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ } while ((temp < 0) && (num_bits >= (code_len + 1))); \ if (temp >= 0) \ break; \ } \ TINFL_GET_BYTE(state_index, c); \ bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \ num_bits += 8; \ } while (num_bits < 15); /* TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read */ /* beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully */ /* decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. */ /* The slow path is only executed at the very end of the input buffer. */ /* v1.16: The original macro handled the case at the very end of the passed-in input buffer, but we also need to handle the case where the user passes in 1+zillion bytes */ /* following the deflate data and our non-conservative read-ahead path won't kick in here on this code. This is much trickier. */ #define TINFL_HUFF_DECODE(state_index, sym, pHuff) \ do \ { \ int temp; \ mz_uint code_len, c; \ if (num_bits < 15) \ { \ if ((pIn_buf_end - pIn_buf_cur) < 2) \ { \ TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ } \ else \ { \ bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); \ pIn_buf_cur += 2; \ num_bits += 16; \ } \ } \ if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ code_len = temp >> 9, temp &= 511; \ else \ { \ code_len = TINFL_FAST_LOOKUP_BITS; \ do \ { \ temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ } while (temp < 0); \ } \ sym = temp; \ bit_buf >>= code_len; \ num_bits -= code_len; \ } \ MZ_MACRO_END tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) { static const int s_length_base[31] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 }; static const int s_length_extra[31] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 }; static const int s_dist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 }; static const int s_dist_extra[32] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }; static const mz_uint8 s_length_dezigzag[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; static const int s_min_table_sizes[3] = { 257, 1, 4 }; tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; /* Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). */ if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; TINFL_CR_BEGIN bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } } do { TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; if (r->m_type == 0) { TINFL_SKIP_BITS(5, num_bits & 7); for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } while ((counter) && (num_bits)) { TINFL_GET_BITS(51, dist, 8); while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } *pOut_buf_cur++ = (mz_uint8)dist; counter--; } while (counter) { size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } while (pIn_buf_cur >= pIn_buf_end) { TINFL_CR_RETURN(38, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); } n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; } } else if (r->m_type == 3) { TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); } else { if (r->m_type == 1) { mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); for (i = 0; i <= 143; ++i) *p++ = 8; for (; i <= 255; ++i) *p++ = 9; for (; i <= 279; ++i) *p++ = 7; for (; i <= 287; ++i) *p++ = 8; } else { for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } r->m_table_sizes[2] = 19; } for (; (int)r->m_type >= 0; r->m_type--) { int tree_next, tree_cur; tinfl_huff_table *pTable; mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } if ((65536 != total) && (used_syms > 1)) { TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); } for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) { mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) { tree_cur -= ((rev_code >>= 1) & 1); if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; } tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; } if (r->m_type == 2) { for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]);) { mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } if ((dist == 16) && (!counter)) { TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); } num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; } if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) { TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); } TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); } } for (;;) { mz_uint8 *pSrc; for (;;) { if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) { TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); if (counter >= 256) break; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } *pOut_buf_cur++ = (mz_uint8)counter; } else { int sym2; mz_uint code_len; #if TINFL_USE_64BIT_BITBUF if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } #else if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } #endif if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) code_len = sym2 >> 9; else { code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); } counter = sym2; bit_buf >>= code_len; num_bits -= code_len; if (counter & 256) break; #if !TINFL_USE_64BIT_BITBUF if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } #endif if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) code_len = sym2 >> 9; else { code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); } bit_buf >>= code_len; num_bits -= code_len; pOut_buf_cur[0] = (mz_uint8)counter; if (sym2 & 256) { pOut_buf_cur++; counter = sym2; break; } pOut_buf_cur[1] = (mz_uint8)sym2; pOut_buf_cur += 2; } } if ((counter &= 511) == 256) break; num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) { TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); } pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) { while (counter--) { while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; } continue; } #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES else if ((counter >= 9) && (counter <= dist)) { const mz_uint8 *pSrc_end = pSrc + (counter & ~7); do { ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; pOut_buf_cur += 8; } while ((pSrc += 8) < pSrc_end); if ((counter &= 7) < 3) { if (counter) { pOut_buf_cur[0] = pSrc[0]; if (counter > 1) pOut_buf_cur[1] = pSrc[1]; pOut_buf_cur += counter; } continue; } } #endif do { pOut_buf_cur[0] = pSrc[0]; pOut_buf_cur[1] = pSrc[1]; pOut_buf_cur[2] = pSrc[2]; pOut_buf_cur += 3; pSrc += 3; } while ((int)(counter -= 3) > 2); if ((int)counter > 0) { pOut_buf_cur[0] = pSrc[0]; if ((int)counter > 1) pOut_buf_cur[1] = pSrc[1]; pOut_buf_cur += counter; } } } } while (!(r->m_final & 1)); /* Ensure byte alignment and put back any bytes from the bitbuf if we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data. */ /* I'm being super conservative here. A number of simplifications can be made to the byte alignment part, and the Adler32 check shouldn't ever need to worry about reading from the bitbuf now. */ TINFL_SKIP_BITS(32, num_bits & 7); while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } bit_buf &= (tinfl_bit_buf_t)((((mz_uint64)1) << num_bits) - (mz_uint64)1); MZ_ASSERT(!num_bits); /* if this assert fires then we've read beyond the end of non-deflate/zlib streams with following data (such as gzip streams). */ if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } } TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); TINFL_CR_FINISH common_exit: /* As long as we aren't telling the caller that we NEED more input to make forward progress: */ /* Put back any bytes from the bitbuf in case we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data. */ /* We need to be very careful here to NOT push back any bytes we definitely know we need to make forward progress, though, or we'll lock the caller up into an inf loop. */ if ((status != TINFL_STATUS_NEEDS_MORE_INPUT) && (status != TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS)) { while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } } r->m_num_bits = num_bits; r->m_bit_buf = bit_buf & (tinfl_bit_buf_t)((((mz_uint64)1) << num_bits) - (mz_uint64)1); r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) { const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; while (buf_len) { for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; } for (; i < block_len; ++i) s1 += *ptr++, s2 += s1; s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; } r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH; } return status; } /* Higher level helper functions. */ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) { tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; *pOut_len = 0; tinfl_init(&decomp); for (;;) { size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) { MZ_FREE(pBuf); *pOut_len = 0; return NULL; } src_buf_ofs += src_buf_size; *pOut_len += dst_buf_size; if (status == TINFL_STATUS_DONE) break; new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); if (!pNew_buf) { MZ_FREE(pBuf); *pOut_len = 0; return NULL; } pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; } return pBuf; } size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) { tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len, (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; } int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { int result = 0; tinfl_decompressor decomp; mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; if (!pDict) return TINFL_STATUS_FAILED; tinfl_init(&decomp); for (;;) { size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); in_buf_ofs += in_buf_size; if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) break; if (status != TINFL_STATUS_HAS_MORE_OUTPUT) { result = (status == TINFL_STATUS_DONE); break; } dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); } MZ_FREE(pDict); *pIn_buf_size = in_buf_ofs; return result; } tinfl_decompressor *tinfl_decompressor_alloc() { tinfl_decompressor *pDecomp = (tinfl_decompressor *)MZ_MALLOC(sizeof(tinfl_decompressor)); if (pDecomp) tinfl_init(pDecomp); return pDecomp; } void tinfl_decompressor_free(tinfl_decompressor *pDecomp) { MZ_FREE(pDecomp); } #ifdef __cplusplus } #endif /************************************************************************** * * Copyright 2013-2014 RAD Game Tools and Valve Software * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC * Copyright 2016 Martin Raiber * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * **************************************************************************/ #ifndef MINIZ_NO_ARCHIVE_APIS #ifdef __cplusplus extern "C" { #endif /* ------------------- .ZIP archive reading */ #ifdef MINIZ_NO_STDIO #define MZ_FILE void * #else #include #if defined(_MSC_VER) || defined(__MINGW64__) static FILE *mz_fopen(const char *pFilename, const char *pMode) { FILE *pFile = NULL; fopen_s(&pFile, pFilename, pMode); return pFile; } static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) { FILE *pFile = NULL; if (freopen_s(&pFile, pPath, pMode, pStream)) return NULL; return pFile; } #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN mz_fopen #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #define MZ_FTELL64 _ftelli64 #define MZ_FSEEK64 _fseeki64 #define MZ_FILE_STAT_STRUCT _stat #define MZ_FILE_STAT _stat #define MZ_FFLUSH fflush #define MZ_FREOPEN mz_freopen #define MZ_DELETE_FILE remove #elif defined(__MINGW32__) #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN(f, m) fopen(f, m) #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #define MZ_FTELL64 ftello64 #define MZ_FSEEK64 fseeko64 #define MZ_FILE_STAT_STRUCT _stat #define MZ_FILE_STAT _stat #define MZ_FFLUSH fflush #define MZ_FREOPEN(f, m, s) freopen(f, m, s) #define MZ_DELETE_FILE remove #elif defined(__TINYC__) #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN(f, m) fopen(f, m) #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #define MZ_FTELL64 ftell #define MZ_FSEEK64 fseek #define MZ_FILE_STAT_STRUCT stat #define MZ_FILE_STAT stat #define MZ_FFLUSH fflush #define MZ_FREOPEN(f, m, s) freopen(f, m, s) #define MZ_DELETE_FILE remove #elif defined(__GNUC__) && _LARGEFILE64_SOURCE #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN(f, m) fopen64(f, m) #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #define MZ_FTELL64 ftello64 #define MZ_FSEEK64 fseeko64 #define MZ_FILE_STAT_STRUCT stat64 #define MZ_FILE_STAT stat64 #define MZ_FFLUSH fflush #define MZ_FREOPEN(p, m, s) freopen64(p, m, s) #define MZ_DELETE_FILE remove #elif defined(__APPLE__) #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN(f, m) fopen(f, m) #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #define MZ_FTELL64 ftello #define MZ_FSEEK64 fseeko #define MZ_FILE_STAT_STRUCT stat #define MZ_FILE_STAT stat #define MZ_FFLUSH fflush #define MZ_FREOPEN(p, m, s) freopen(p, m, s) #define MZ_DELETE_FILE remove #else #pragma message("Using fopen, ftello, fseeko, stat() etc. path for file I/O - this path may not support large files.") #ifndef MINIZ_NO_TIME #include #endif #define MZ_FOPEN(f, m) fopen(f, m) #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite #ifdef __STRICT_ANSI__ #define MZ_FTELL64 ftell #define MZ_FSEEK64 fseek #else #define MZ_FTELL64 ftello #define MZ_FSEEK64 fseeko #endif #define MZ_FILE_STAT_STRUCT stat #define MZ_FILE_STAT stat #define MZ_FFLUSH fflush #define MZ_FREOPEN(f, m, s) freopen(f, m, s) #define MZ_DELETE_FILE remove #endif /* #ifdef _MSC_VER */ #endif /* #ifdef MINIZ_NO_STDIO */ #define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) /* Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff. */ enum { /* ZIP archive identifiers and record sizes */ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, /* ZIP64 archive identifier and record sizes */ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06064b50, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG = 0x07064b50, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE = 56, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE = 20, MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID = 0x0001, MZ_ZIP_DATA_DESCRIPTOR_ID = 0x08074b50, MZ_ZIP_DATA_DESCRIPTER_SIZE64 = 24, MZ_ZIP_DATA_DESCRIPTER_SIZE32 = 16, /* Central directory header record offsets */ MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8, MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16, MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, /* Local directory header offsets */ MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10, MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR = 1 << 3, /* End of central directory offsets */ MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, /* ZIP64 End of central directory locator offsets */ MZ_ZIP64_ECDL_SIG_OFS = 0, /* 4 bytes */ MZ_ZIP64_ECDL_NUM_DISK_CDIR_OFS = 4, /* 4 bytes */ MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS = 8, /* 8 bytes */ MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS = 16, /* 4 bytes */ /* ZIP64 End of central directory header offsets */ MZ_ZIP64_ECDH_SIG_OFS = 0, /* 4 bytes */ MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS = 4, /* 8 bytes */ MZ_ZIP64_ECDH_VERSION_MADE_BY_OFS = 12, /* 2 bytes */ MZ_ZIP64_ECDH_VERSION_NEEDED_OFS = 14, /* 2 bytes */ MZ_ZIP64_ECDH_NUM_THIS_DISK_OFS = 16, /* 4 bytes */ MZ_ZIP64_ECDH_NUM_DISK_CDIR_OFS = 20, /* 4 bytes */ MZ_ZIP64_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 24, /* 8 bytes */ MZ_ZIP64_ECDH_CDIR_TOTAL_ENTRIES_OFS = 32, /* 8 bytes */ MZ_ZIP64_ECDH_CDIR_SIZE_OFS = 40, /* 8 bytes */ MZ_ZIP64_ECDH_CDIR_OFS_OFS = 48, /* 8 bytes */ MZ_ZIP_VERSION_MADE_BY_DOS_FILESYSTEM_ID = 0, MZ_ZIP_DOS_DIR_ATTRIBUTE_BITFLAG = 0x10, MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED = 1, MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG = 32, MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION = 64, MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_LOCAL_DIR_IS_MASKED = 8192, MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8 = 1 << 11 }; typedef struct { void *m_p; size_t m_size, m_capacity; mz_uint m_element_size; } mz_zip_array; struct mz_zip_internal_state_tag { mz_zip_array m_central_dir; mz_zip_array m_central_dir_offsets; mz_zip_array m_sorted_central_dir_offsets; /* The flags passed in when the archive is initially opened. */ uint32_t m_init_flags; /* MZ_TRUE if the archive has a zip64 end of central directory headers, etc. */ mz_bool m_zip64; /* MZ_TRUE if we found zip64 extended info in the central directory (m_zip64 will also be slammed to true too, even if we didn't find a zip64 end of central dir header, etc.) */ mz_bool m_zip64_has_extended_info_fields; /* These fields are used by the file, FILE, memory, and memory/heap read/write helpers. */ MZ_FILE *m_pFile; mz_uint64 m_file_archive_start_ofs; void *m_pMem; size_t m_mem_size; size_t m_mem_capacity; }; #define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size #if defined(DEBUG) || defined(_DEBUG) || defined(NDEBUG) static MZ_FORCEINLINE mz_uint mz_zip_array_range_check(const mz_zip_array *pArray, mz_uint index) { MZ_ASSERT(index < pArray->m_size); return index; } #define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[mz_zip_array_range_check(array_ptr, index)] #else #define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index] #endif static MZ_FORCEINLINE void mz_zip_array_init(mz_zip_array *pArray, mz_uint32 element_size) { memset(pArray, 0, sizeof(mz_zip_array)); pArray->m_element_size = element_size; } static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray) { pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); memset(pArray, 0, sizeof(mz_zip_array)); } static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing) { void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE; if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; } if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE; pArray->m_p = pNew_p; pArray->m_capacity = new_capacity; return MZ_TRUE; } static MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing) { if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; } return MZ_TRUE; } static MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing) { if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; } pArray->m_size = new_size; return MZ_TRUE; } static MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) { return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); } static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n) { size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE; memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); return MZ_TRUE; } #ifndef MINIZ_NO_TIME static MZ_TIME_T mz_zip_dos_to_time_t(int dos_time, int dos_date) { struct tm tm; memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1; tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31; tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62; return mktime(&tm); } #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS static void mz_zip_time_t_to_dos_time(MZ_TIME_T time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) { #ifdef _MSC_VER struct tm tm_struct; struct tm *tm = &tm_struct; errno_t err = localtime_s(tm, &time); if (err) { *pDOS_date = 0; *pDOS_time = 0; return; } #else struct tm *tm = localtime(&time); #endif /* #ifdef _MSC_VER */ *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1)); *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday); } #endif /* MINIZ_NO_ARCHIVE_WRITING_APIS */ #ifndef MINIZ_NO_STDIO #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS static mz_bool mz_zip_get_file_modified_time(const char *pFilename, MZ_TIME_T *pTime) { struct MZ_FILE_STAT_STRUCT file_stat; /* On Linux with x86 glibc, this call will fail on large files (I think >= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh. */ if (MZ_FILE_STAT(pFilename, &file_stat) != 0) return MZ_FALSE; *pTime = file_stat.st_mtime; return MZ_TRUE; } #endif /* #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS*/ static mz_bool mz_zip_set_file_times(const char *pFilename, MZ_TIME_T access_time, MZ_TIME_T modified_time) { struct utimbuf t; memset(&t, 0, sizeof(t)); t.actime = access_time; t.modtime = modified_time; return !utime(pFilename, &t); } #endif /* #ifndef MINIZ_NO_STDIO */ #endif /* #ifndef MINIZ_NO_TIME */ static MZ_FORCEINLINE mz_bool mz_zip_set_error(mz_zip_archive *pZip, mz_zip_error err_num) { if (pZip) pZip->m_last_error = err_num; return MZ_FALSE; } static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint flags) { (void)flags; if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!pZip->m_pAlloc) pZip->m_pAlloc = miniz_def_alloc_func; if (!pZip->m_pFree) pZip->m_pFree = miniz_def_free_func; if (!pZip->m_pRealloc) pZip->m_pRealloc = miniz_def_realloc_func; pZip->m_archive_size = 0; pZip->m_central_directory_file_ofs = 0; pZip->m_total_files = 0; pZip->m_last_error = MZ_ZIP_NO_ERROR; if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); pZip->m_pState->m_init_flags = flags; pZip->m_pState->m_zip64 = MZ_FALSE; pZip->m_pState->m_zip64_has_extended_info_fields = MZ_FALSE; pZip->m_zip_mode = MZ_ZIP_MODE_READING; return MZ_TRUE; } static MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index) { const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); mz_uint8 l = 0, r = 0; pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pE = pL + MZ_MIN(l_len, r_len); while (pL < pE) { if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break; pL++; pR++; } return (pL == pE) ? (l_len < r_len) : (l < r); } #define MZ_SWAP_UINT32(a, b) \ do \ { \ mz_uint32 t = a; \ a = b; \ b = t; \ } \ MZ_MACRO_END /* Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.) */ static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) { mz_zip_internal_state *pState = pZip->m_pState; const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; const mz_zip_array *pCentral_dir = &pState->m_central_dir; mz_uint32 *pIndices; mz_uint32 start, end; const mz_uint32 size = pZip->m_total_files; if (size <= 1U) return; pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); start = (size - 2U) >> 1U; for (;;) { mz_uint64 child, root = start; for (;;) { if ((child = (root << 1U) + 1U) >= size) break; child += (((child + 1U) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1U]))); if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) break; MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; } if (!start) break; start--; } end = size - 1; while (end > 0) { mz_uint64 child, root = 0; MZ_SWAP_UINT32(pIndices[end], pIndices[0]); for (;;) { if ((child = (root << 1U) + 1U) >= end) break; child += (((child + 1U) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1U])); if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) break; MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; } end--; } } static mz_bool mz_zip_reader_locate_header_sig(mz_zip_archive *pZip, mz_uint32 record_sig, mz_uint32 record_size, mz_int64 *pOfs) { mz_int64 cur_file_ofs; mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32; /* Basic sanity checks - reject files which are too small */ if (pZip->m_archive_size < record_size) return MZ_FALSE; /* Find the record by scanning the file from the end towards the beginning. */ cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); for (;;) { int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) return MZ_FALSE; for (i = n - 4; i >= 0; --i) { mz_uint s = MZ_READ_LE32(pBuf + i); if (s == record_sig) { if ((pZip->m_archive_size - (cur_file_ofs + i)) >= record_size) break; } } if (i >= 0) { cur_file_ofs += i; break; } /* Give up if we've searched the entire file, or we've gone back "too far" (~64kb) */ if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (MZ_UINT16_MAX + record_size))) return MZ_FALSE; cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); } *pOfs = cur_file_ofs; return MZ_TRUE; } static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint flags) { mz_uint cdir_size = 0, cdir_entries_on_this_disk = 0, num_this_disk = 0, cdir_disk_index = 0; mz_uint64 cdir_ofs = 0; mz_int64 cur_file_ofs = 0; const mz_uint8 *p; mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32; mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); mz_uint32 zip64_end_of_central_dir_locator_u32[(MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pZip64_locator = (mz_uint8 *)zip64_end_of_central_dir_locator_u32; mz_uint32 zip64_end_of_central_dir_header_u32[(MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pZip64_end_of_central_dir = (mz_uint8 *)zip64_end_of_central_dir_header_u32; mz_uint64 zip64_end_of_central_dir_ofs = 0; /* Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there. */ if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); if (!mz_zip_reader_locate_header_sig(pZip, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE, &cur_file_ofs)) return mz_zip_set_error(pZip, MZ_ZIP_FAILED_FINDING_CENTRAL_DIR); /* Read and verify the end of central directory record. */ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); if (MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); if (cur_file_ofs >= (MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE + MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE)) { if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs - MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE, pZip64_locator, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) == MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) { if (MZ_READ_LE32(pZip64_locator + MZ_ZIP64_ECDL_SIG_OFS) == MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG) { zip64_end_of_central_dir_ofs = MZ_READ_LE64(pZip64_locator + MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS); if (zip64_end_of_central_dir_ofs > (pZip->m_archive_size - MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE)) return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); if (pZip->m_pRead(pZip->m_pIO_opaque, zip64_end_of_central_dir_ofs, pZip64_end_of_central_dir, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) == MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) { if (MZ_READ_LE32(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_SIG_OFS) == MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG) { pZip->m_pState->m_zip64 = MZ_TRUE; } } } } } pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS); cdir_entries_on_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS); num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS); cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); if (pZip->m_pState->m_zip64) { mz_uint32 zip64_total_num_of_disks = MZ_READ_LE32(pZip64_locator + MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS); mz_uint64 zip64_cdir_total_entries = MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_TOTAL_ENTRIES_OFS); mz_uint64 zip64_cdir_total_entries_on_this_disk = MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS); mz_uint64 zip64_size_of_end_of_central_dir_record = MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS); mz_uint64 zip64_size_of_central_directory = MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_SIZE_OFS); if (zip64_size_of_end_of_central_dir_record < (MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE - 12)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (zip64_total_num_of_disks != 1U) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); /* Check for miniz's practical limits */ if (zip64_cdir_total_entries > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); pZip->m_total_files = (mz_uint32)zip64_cdir_total_entries; if (zip64_cdir_total_entries_on_this_disk > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); cdir_entries_on_this_disk = (mz_uint32)zip64_cdir_total_entries_on_this_disk; /* Check for miniz's current practical limits (sorry, this should be enough for millions of files) */ if (zip64_size_of_central_directory > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); cdir_size = (mz_uint32)zip64_size_of_central_directory; num_this_disk = MZ_READ_LE32(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_NUM_THIS_DISK_OFS); cdir_disk_index = MZ_READ_LE32(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_NUM_DISK_CDIR_OFS); cdir_ofs = MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_OFS_OFS); } if (pZip->m_total_files != cdir_entries_on_this_disk) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1))) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); if (cdir_size < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pZip->m_central_directory_file_ofs = cdir_ofs; if (pZip->m_total_files) { mz_uint i, n; /* Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and possibly another to hold the sorted indices. */ if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) || (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); if (sort_central_dir) { if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); /* Now create an index into the central directory file records, do some basic sanity checking on each record */ p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) { mz_uint total_header_size, disk_index, bit_flags, filename_size, ext_data_size; mz_uint64 comp_size, decomp_size, local_header_ofs; if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); if (sort_central_dir) MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i; comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); filename_size = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); ext_data_size = MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS); if ((!pZip->m_pState->m_zip64_has_extended_info_fields) && (ext_data_size) && (MZ_MAX(MZ_MAX(comp_size, decomp_size), local_header_ofs) == MZ_UINT32_MAX)) { /* Attempt to find zip64 extended information field in the entry's extra data */ mz_uint32 extra_size_remaining = ext_data_size; if (extra_size_remaining) { const mz_uint8 *pExtra_data = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size; do { mz_uint32 field_id; mz_uint32 field_data_size; if (extra_size_remaining < (sizeof(mz_uint16) * 2)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); field_id = MZ_READ_LE16(pExtra_data); field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); if ((field_data_size + sizeof(mz_uint16) * 2) > extra_size_remaining) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { /* Ok, the archive didn't have any zip64 headers but it uses a zip64 extended information field so mark it as zip64 anyway (this can occur with infozip's zip util when it reads compresses files from stdin). */ pZip->m_pState->m_zip64 = MZ_TRUE; pZip->m_pState->m_zip64_has_extended_info_fields = MZ_TRUE; break; } pExtra_data += sizeof(mz_uint16) * 2 + field_data_size; extra_size_remaining = extra_size_remaining - sizeof(mz_uint16) * 2 - field_data_size; } while (extra_size_remaining); } } /* I've seen archives that aren't marked as zip64 that uses zip64 ext data, argh */ if ((comp_size != MZ_UINT32_MAX) && (decomp_size != MZ_UINT32_MAX)) { if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); } disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); if ((disk_index == MZ_UINT16_MAX) || ((disk_index != num_this_disk) && (disk_index != 1))) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); if (comp_size != MZ_UINT32_MAX) { if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); } bit_flags = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); if (bit_flags & MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_LOCAL_DIR_IS_MASKED) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); n -= total_header_size; p += total_header_size; } } if (sort_central_dir) mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); return MZ_TRUE; } void mz_zip_zero_struct(mz_zip_archive *pZip) { if (pZip) MZ_CLEAR_OBJ(*pZip); } static mz_bool mz_zip_reader_end_internal(mz_zip_archive *pZip, mz_bool set_last_error) { mz_bool status = MZ_TRUE; if (!pZip) return MZ_FALSE; if ((!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) { if (set_last_error) pZip->m_last_error = MZ_ZIP_INVALID_PARAMETER; return MZ_FALSE; } if (pZip->m_pState) { mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL; mz_zip_array_clear(pZip, &pState->m_central_dir); mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); #ifndef MINIZ_NO_STDIO if (pState->m_pFile) { if (pZip->m_zip_type == MZ_ZIP_TYPE_FILE) { if (MZ_FCLOSE(pState->m_pFile) == EOF) { if (set_last_error) pZip->m_last_error = MZ_ZIP_FILE_CLOSE_FAILED; status = MZ_FALSE; } } pState->m_pFile = NULL; } #endif /* #ifndef MINIZ_NO_STDIO */ pZip->m_pFree(pZip->m_pAlloc_opaque, pState); } pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; return status; } mz_bool mz_zip_reader_end(mz_zip_archive *pZip) { return mz_zip_reader_end_internal(pZip, MZ_TRUE); } mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint flags) { if ((!pZip) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE; pZip->m_zip_type = MZ_ZIP_TYPE_USER; pZip->m_archive_size = size; if (!mz_zip_reader_read_central_dir(pZip, flags)) { mz_zip_reader_end_internal(pZip, MZ_FALSE); return MZ_FALSE; } return MZ_TRUE; } static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) { mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); return s; } mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint flags) { if (!pMem) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE; pZip->m_zip_type = MZ_ZIP_TYPE_MEMORY; pZip->m_archive_size = size; pZip->m_pRead = mz_zip_mem_read_func; pZip->m_pIO_opaque = pZip; pZip->m_pNeeds_keepalive = NULL; #ifdef __cplusplus pZip->m_pState->m_pMem = const_cast(pMem); #else pZip->m_pState->m_pMem = (void *)pMem; #endif pZip->m_pState->m_mem_size = size; if (!mz_zip_reader_read_central_dir(pZip, flags)) { mz_zip_reader_end_internal(pZip, MZ_FALSE); return MZ_FALSE; } return MZ_TRUE; } #ifndef MINIZ_NO_STDIO static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) { mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); file_ofs += pZip->m_pState->m_file_archive_start_ofs; if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) return 0; return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); } mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags) { return mz_zip_reader_init_file_v2(pZip, pFilename, flags, 0, 0); } mz_bool mz_zip_reader_init_file_v2(mz_zip_archive *pZip, const char *pFilename, mz_uint flags, mz_uint64 file_start_ofs, mz_uint64 archive_size) { mz_uint64 file_size; MZ_FILE *pFile; if ((!pZip) || (!pFilename) || ((archive_size) && (archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pFile = MZ_FOPEN(pFilename, "rb"); if (!pFile) return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); file_size = archive_size; if (!file_size) { if (MZ_FSEEK64(pFile, 0, SEEK_END)) { MZ_FCLOSE(pFile); return mz_zip_set_error(pZip, MZ_ZIP_FILE_SEEK_FAILED); } file_size = MZ_FTELL64(pFile); } /* TODO: Better sanity check archive_size and the # of actual remaining bytes */ if (file_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) { MZ_FCLOSE(pFile); return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); } if (!mz_zip_reader_init_internal(pZip, flags)) { MZ_FCLOSE(pFile); return MZ_FALSE; } pZip->m_zip_type = MZ_ZIP_TYPE_FILE; pZip->m_pRead = mz_zip_file_read_func; pZip->m_pIO_opaque = pZip; pZip->m_pState->m_pFile = pFile; pZip->m_archive_size = file_size; pZip->m_pState->m_file_archive_start_ofs = file_start_ofs; if (!mz_zip_reader_read_central_dir(pZip, flags)) { mz_zip_reader_end_internal(pZip, MZ_FALSE); return MZ_FALSE; } return MZ_TRUE; } mz_bool mz_zip_reader_init_cfile(mz_zip_archive *pZip, MZ_FILE *pFile, mz_uint64 archive_size, mz_uint flags) { mz_uint64 cur_file_ofs; if ((!pZip) || (!pFile)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); cur_file_ofs = MZ_FTELL64(pFile); if (!archive_size) { if (MZ_FSEEK64(pFile, 0, SEEK_END)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_SEEK_FAILED); archive_size = MZ_FTELL64(pFile) - cur_file_ofs; if (archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); } if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE; pZip->m_zip_type = MZ_ZIP_TYPE_CFILE; pZip->m_pRead = mz_zip_file_read_func; pZip->m_pIO_opaque = pZip; pZip->m_pState->m_pFile = pFile; pZip->m_archive_size = archive_size; pZip->m_pState->m_file_archive_start_ofs = cur_file_ofs; if (!mz_zip_reader_read_central_dir(pZip, flags)) { mz_zip_reader_end_internal(pZip, MZ_FALSE); return MZ_FALSE; } return MZ_TRUE; } #endif /* #ifndef MINIZ_NO_STDIO */ static MZ_FORCEINLINE const mz_uint8 *mz_zip_get_cdh(mz_zip_archive *pZip, mz_uint file_index) { if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files)) return NULL; return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); } mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index) { mz_uint m_bit_flag; const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index); if (!p) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return MZ_FALSE; } m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); return (m_bit_flag & (MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION)) != 0; } mz_bool mz_zip_reader_is_file_supported(mz_zip_archive *pZip, mz_uint file_index) { mz_uint bit_flag; mz_uint method; const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index); if (!p) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return MZ_FALSE; } method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); if ((method != 0) && (method != MZ_DEFLATED)) { mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_METHOD); return MZ_FALSE; } if (bit_flag & (MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION)) { mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); return MZ_FALSE; } if (bit_flag & MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG) { mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); return MZ_FALSE; } return MZ_TRUE; } mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index) { mz_uint filename_len, attribute_mapping_id, external_attr; const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index); if (!p) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return MZ_FALSE; } filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); if (filename_len) { if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') return MZ_TRUE; } /* Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct. */ /* Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field. */ /* FIXME: Remove this check? Is it necessary - we already check the filename. */ attribute_mapping_id = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS) >> 8; (void)attribute_mapping_id; external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); if ((external_attr & MZ_ZIP_DOS_DIR_ATTRIBUTE_BITFLAG) != 0) { return MZ_TRUE; } return MZ_FALSE; } static mz_bool mz_zip_file_stat_internal(mz_zip_archive *pZip, mz_uint file_index, const mz_uint8 *pCentral_dir_header, mz_zip_archive_file_stat *pStat, mz_bool *pFound_zip64_extra_data) { mz_uint n; const mz_uint8 *p = pCentral_dir_header; if (pFound_zip64_extra_data) *pFound_zip64_extra_data = MZ_FALSE; if ((!p) || (!pStat)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); /* Extract fields from the central directory record. */ pStat->m_file_index = file_index; pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); #ifndef MINIZ_NO_TIME pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); #endif pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); /* Copy as much of the filename and comment as possible. */ n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\0'; n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); pStat->m_comment_size = n; memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; /* Set some flags for convienance */ pStat->m_is_directory = mz_zip_reader_is_file_a_directory(pZip, file_index); pStat->m_is_encrypted = mz_zip_reader_is_file_encrypted(pZip, file_index); pStat->m_is_supported = mz_zip_reader_is_file_supported(pZip, file_index); /* See if we need to read any zip64 extended information fields. */ /* Confusingly, these zip64 fields can be present even on non-zip64 archives (Debian zip on a huge files from stdin piped to stdout creates them). */ if (MZ_MAX(MZ_MAX(pStat->m_comp_size, pStat->m_uncomp_size), pStat->m_local_header_ofs) == MZ_UINT32_MAX) { /* Attempt to find zip64 extended information field in the entry's extra data */ mz_uint32 extra_size_remaining = MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS); if (extra_size_remaining) { const mz_uint8 *pExtra_data = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); do { mz_uint32 field_id; mz_uint32 field_data_size; if (extra_size_remaining < (sizeof(mz_uint16) * 2)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); field_id = MZ_READ_LE16(pExtra_data); field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); if ((field_data_size + sizeof(mz_uint16) * 2) > extra_size_remaining) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { const mz_uint8 *pField_data = pExtra_data + sizeof(mz_uint16) * 2; mz_uint32 field_data_remaining = field_data_size; if (pFound_zip64_extra_data) *pFound_zip64_extra_data = MZ_TRUE; if (pStat->m_uncomp_size == MZ_UINT32_MAX) { if (field_data_remaining < sizeof(mz_uint64)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pStat->m_uncomp_size = MZ_READ_LE64(pField_data); pField_data += sizeof(mz_uint64); field_data_remaining -= sizeof(mz_uint64); } if (pStat->m_comp_size == MZ_UINT32_MAX) { if (field_data_remaining < sizeof(mz_uint64)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pStat->m_comp_size = MZ_READ_LE64(pField_data); pField_data += sizeof(mz_uint64); field_data_remaining -= sizeof(mz_uint64); } if (pStat->m_local_header_ofs == MZ_UINT32_MAX) { if (field_data_remaining < sizeof(mz_uint64)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pStat->m_local_header_ofs = MZ_READ_LE64(pField_data); pField_data += sizeof(mz_uint64); field_data_remaining -= sizeof(mz_uint64); } break; } pExtra_data += sizeof(mz_uint16) * 2 + field_data_size; extra_size_remaining = extra_size_remaining - sizeof(mz_uint16) * 2 - field_data_size; } while (extra_size_remaining); } } return MZ_TRUE; } static MZ_FORCEINLINE mz_bool mz_zip_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags) { mz_uint i; if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) return 0 == memcmp(pA, pB, len); for (i = 0; i < len; ++i) if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) return MZ_FALSE; return MZ_TRUE; } static MZ_FORCEINLINE int mz_zip_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len) { const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); mz_uint8 l = 0, r = 0; pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pE = pL + MZ_MIN(l_len, r_len); while (pL < pE) { if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break; pL++; pR++; } return (pL == pE) ? (int)(l_len - r_len) : (l - r); } static mz_bool mz_zip_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename, mz_uint32 *pIndex) { mz_zip_internal_state *pState = pZip->m_pState; const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; const mz_zip_array *pCentral_dir = &pState->m_central_dir; mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); const uint32_t size = pZip->m_total_files; const mz_uint filename_len = (mz_uint)strlen(pFilename); if (pIndex) *pIndex = 0; if (size) { /* yes I could use uint32_t's, but then we would have to add some special case checks in the loop, argh, and */ /* honestly the major expense here on 32-bit CPU's will still be the filename compare */ mz_int64 l = 0, h = (mz_int64)size - 1; while (l <= h) { mz_int64 m = l + ((h - l) >> 1); uint32_t file_index = pIndices[(uint32_t)m]; int comp = mz_zip_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len); if (!comp) { if (pIndex) *pIndex = file_index; return MZ_TRUE; } else if (comp < 0) l = m + 1; else h = m - 1; } } return mz_zip_set_error(pZip, MZ_ZIP_FILE_NOT_FOUND); } int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags) { mz_uint32 index; if (!mz_zip_reader_locate_file_v2(pZip, pName, pComment, flags, &index)) return -1; else return (int)index; } mz_bool mz_zip_reader_locate_file_v2(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags, mz_uint32 *pIndex) { mz_uint file_index; size_t name_len, comment_len; if (pIndex) *pIndex = 0; if ((!pZip) || (!pZip->m_pState) || (!pName)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); /* See if we can use a binary search */ if (((pZip->m_pState->m_init_flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0) && (pZip->m_zip_mode == MZ_ZIP_MODE_READING) && ((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size)) { return mz_zip_locate_file_binary_search(pZip, pName, pIndex); } /* Locate the entry by scanning the entire central directory */ name_len = strlen(pName); if (name_len > MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); comment_len = pComment ? strlen(pComment) : 0; if (comment_len > MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); for (file_index = 0; file_index < pZip->m_total_files; file_index++) { const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; if (filename_len < name_len) continue; if (comment_len) { mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); const char *pFile_comment = pFilename + filename_len + file_extra_len; if ((file_comment_len != comment_len) || (!mz_zip_string_equal(pComment, pFile_comment, file_comment_len, flags))) continue; } if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) { int ofs = filename_len - 1; do { if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':')) break; } while (--ofs >= 0); ofs++; pFilename += ofs; filename_len -= ofs; } if ((filename_len == name_len) && (mz_zip_string_equal(pName, pFilename, filename_len, flags))) { if (pIndex) *pIndex = file_index; return MZ_TRUE; } } return mz_zip_set_error(pZip, MZ_ZIP_FILE_NOT_FOUND); } mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) { int status = TINFL_STATUS_DONE; mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; mz_zip_archive_file_stat file_stat; void *pRead_buf; mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; tinfl_decompressor inflator; if ((!pZip) || (!pZip->m_pState) || ((buf_size) && (!pBuf)) || ((user_read_buf_size) && (!pUser_read_buf)) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; /* A directory or zero length file */ if ((file_stat.m_is_directory) || (!file_stat.m_comp_size)) return MZ_TRUE; /* Encryption and patch files are not supported. */ if (file_stat.m_bit_flag & (MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); /* This function only supports decompressing stored and deflate. */ if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_METHOD); /* Ensure supplied output buffer is large enough. */ needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size; if (buf_size < needed_size) return mz_zip_set_error(pZip, MZ_ZIP_BUF_TOO_SMALL); /* Read and parse the local directory entry. */ cur_file_ofs = file_stat.m_local_header_ofs; if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { /* The file is stored or the caller has requested the compressed data. */ if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) == 0) { if (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32) return mz_zip_set_error(pZip, MZ_ZIP_CRC_CHECK_FAILED); } #endif return MZ_TRUE; } /* Decompress the file either directly from memory or from a file input buffer. */ tinfl_init(&inflator); if (pZip->m_pState->m_pMem) { /* Read directly from the archive in memory. */ pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; read_buf_size = read_buf_avail = file_stat.m_comp_size; comp_remaining = 0; } else if (pUser_read_buf) { /* Use a user provided read buffer. */ if (!user_read_buf_size) return MZ_FALSE; pRead_buf = (mz_uint8 *)pUser_read_buf; read_buf_size = user_read_buf_size; read_buf_avail = 0; comp_remaining = file_stat.m_comp_size; } else { /* Temporarily allocate a read buffer. */ read_buf_size = MZ_MIN(file_stat.m_comp_size, (mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE); if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); read_buf_avail = 0; comp_remaining = file_stat.m_comp_size; } do { /* The size_t cast here should be OK because we've verified that the output buffer is >= file_stat.m_uncomp_size above */ size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { status = TINFL_STATUS_FAILED; mz_zip_set_error(pZip, MZ_ZIP_DECOMPRESSION_FAILED); break; } cur_file_ofs += read_buf_avail; comp_remaining -= read_buf_avail; read_buf_ofs = 0; } in_buf_size = (size_t)read_buf_avail; status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); read_buf_avail -= in_buf_size; read_buf_ofs += in_buf_size; out_buf_ofs += out_buf_size; } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); if (status == TINFL_STATUS_DONE) { /* Make sure the entire file was decompressed, and check its CRC. */ if (out_buf_ofs != file_stat.m_uncomp_size) { mz_zip_set_error(pZip, MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE); status = TINFL_STATUS_FAILED; } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS else if (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32) { mz_zip_set_error(pZip, MZ_ZIP_CRC_CHECK_FAILED); status = TINFL_STATUS_FAILED; } #endif } if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return status == TINFL_STATUS_DONE; } mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) { mz_uint32 file_index; if (!mz_zip_reader_locate_file_v2(pZip, pFilename, NULL, flags, &file_index)) return MZ_FALSE; return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size); } mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags) { return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0); } mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags) { return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0); } void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags) { mz_uint64 comp_size, uncomp_size, alloc_size; const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index); void *pBuf; if (pSize) *pSize = 0; if (!p) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return NULL; } comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) { mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); return NULL; } if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); return NULL; } if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return NULL; } if (pSize) *pSize = (size_t)alloc_size; return pBuf; } void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags) { mz_uint32 file_index; if (!mz_zip_reader_locate_file_v2(pZip, pFilename, NULL, flags, &file_index)) { if (pSize) *pSize = 0; return MZ_FALSE; } return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); } mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) { int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT; mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs; mz_zip_archive_file_stat file_stat; void *pRead_buf = NULL; void *pWrite_buf = NULL; mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; if ((!pZip) || (!pZip->m_pState) || (!pCallback) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; /* A directory or zero length file */ if ((file_stat.m_is_directory) || (!file_stat.m_comp_size)) return MZ_TRUE; /* Encryption and patch files are not supported. */ if (file_stat.m_bit_flag & (MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); /* This function only supports decompressing stored and deflate. */ if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_METHOD); /* Read and do some minimal validation of the local directory entry (this doesn't crack the zip64 stuff, which we already have from the central dir) */ cur_file_ofs = file_stat.m_local_header_ofs; if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); /* Decompress the file either directly from memory or from a file input buffer. */ if (pZip->m_pState->m_pMem) { pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; read_buf_size = read_buf_avail = file_stat.m_comp_size; comp_remaining = 0; } else { read_buf_size = MZ_MIN(file_stat.m_comp_size, (mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE); if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); read_buf_avail = 0; comp_remaining = file_stat.m_comp_size; } if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { /* The file is stored or the caller has requested the compressed data. */ if (pZip->m_pState->m_pMem) { if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > MZ_UINT32_MAX)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) { mz_zip_set_error(pZip, MZ_ZIP_WRITE_CALLBACK_FAILED); status = TINFL_STATUS_FAILED; } else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size); #endif } cur_file_ofs += file_stat.m_comp_size; out_buf_ofs += file_stat.m_comp_size; comp_remaining = 0; } else { while (comp_remaining) { read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); status = TINFL_STATUS_FAILED; break; } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); } #endif if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { mz_zip_set_error(pZip, MZ_ZIP_WRITE_CALLBACK_FAILED); status = TINFL_STATUS_FAILED; break; } cur_file_ofs += read_buf_avail; out_buf_ofs += read_buf_avail; comp_remaining -= read_buf_avail; } } } else { tinfl_decompressor inflator; tinfl_init(&inflator); if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); status = TINFL_STATUS_FAILED; } else { do { mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); status = TINFL_STATUS_FAILED; break; } cur_file_ofs += read_buf_avail; comp_remaining -= read_buf_avail; read_buf_ofs = 0; } in_buf_size = (size_t)read_buf_avail; status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); read_buf_avail -= in_buf_size; read_buf_ofs += in_buf_size; if (out_buf_size) { if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size) { mz_zip_set_error(pZip, MZ_ZIP_WRITE_CALLBACK_FAILED); status = TINFL_STATUS_FAILED; break; } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); #endif if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) { mz_zip_set_error(pZip, MZ_ZIP_DECOMPRESSION_FAILED); status = TINFL_STATUS_FAILED; break; } } } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT)); } } if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) { /* Make sure the entire file was decompressed, and check its CRC. */ if (out_buf_ofs != file_stat.m_uncomp_size) { mz_zip_set_error(pZip, MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE); status = TINFL_STATUS_FAILED; } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS else if (file_crc32 != file_stat.m_crc32) { mz_zip_set_error(pZip, MZ_ZIP_DECOMPRESSION_FAILED); status = TINFL_STATUS_FAILED; } #endif } if (!pZip->m_pState->m_pMem) pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); if (pWrite_buf) pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); return status == TINFL_STATUS_DONE; } mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) { mz_uint32 file_index; if (!mz_zip_reader_locate_file_v2(pZip, pFilename, NULL, flags, &file_index)) return MZ_FALSE; return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags); } mz_zip_reader_extract_iter_state* mz_zip_reader_extract_iter_new(mz_zip_archive *pZip, mz_uint file_index, mz_uint flags) { mz_zip_reader_extract_iter_state *pState; mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; /* Argument sanity check */ if ((!pZip) || (!pZip->m_pState)) return NULL; /* Allocate an iterator status structure */ pState = (mz_zip_reader_extract_iter_state*)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_reader_extract_iter_state)); if (!pState) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); return NULL; } /* Fetch file details */ if (!mz_zip_reader_file_stat(pZip, file_index, &pState->file_stat)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } /* Encryption and patch files are not supported. */ if (pState->file_stat.m_bit_flag & (MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION | MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG)) { mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } /* This function only supports decompressing stored and deflate. */ if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (pState->file_stat.m_method != 0) && (pState->file_stat.m_method != MZ_DEFLATED)) { mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_METHOD); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } /* Init state - save args */ pState->pZip = pZip; pState->flags = flags; /* Init state - reset variables to defaults */ pState->status = TINFL_STATUS_DONE; #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS pState->file_crc32 = MZ_CRC32_INIT; #endif pState->read_buf_ofs = 0; pState->out_buf_ofs = 0; pState->pRead_buf = NULL; pState->pWrite_buf = NULL; pState->out_blk_remain = 0; /* Read and parse the local directory entry. */ pState->cur_file_ofs = pState->file_stat.m_local_header_ofs; if (pZip->m_pRead(pZip->m_pIO_opaque, pState->cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } pState->cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); if ((pState->cur_file_ofs + pState->file_stat.m_comp_size) > pZip->m_archive_size) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } /* Decompress the file either directly from memory or from a file input buffer. */ if (pZip->m_pState->m_pMem) { pState->pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + pState->cur_file_ofs; pState->read_buf_size = pState->read_buf_avail = pState->file_stat.m_comp_size; pState->comp_remaining = pState->file_stat.m_comp_size; } else { if (!((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!pState->file_stat.m_method))) { /* Decompression required, therefore intermediate read buffer required */ pState->read_buf_size = MZ_MIN(pState->file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); if (NULL == (pState->pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)pState->read_buf_size))) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } } else { /* Decompression not required - we will be reading directly into user buffer, no temp buf required */ pState->read_buf_size = 0; } pState->read_buf_avail = 0; pState->comp_remaining = pState->file_stat.m_comp_size; } if (!((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!pState->file_stat.m_method))) { /* Decompression required, init decompressor */ tinfl_init( &pState->inflator ); /* Allocate write buffer */ if (NULL == (pState->pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); if (pState->pRead_buf) pZip->m_pFree(pZip->m_pAlloc_opaque, pState->pRead_buf); pZip->m_pFree(pZip->m_pAlloc_opaque, pState); return NULL; } } return pState; } mz_zip_reader_extract_iter_state* mz_zip_reader_extract_file_iter_new(mz_zip_archive *pZip, const char *pFilename, mz_uint flags) { mz_uint32 file_index; /* Locate file index by name */ if (!mz_zip_reader_locate_file_v2(pZip, pFilename, NULL, flags, &file_index)) return NULL; /* Construct iterator */ return mz_zip_reader_extract_iter_new(pZip, file_index, flags); } size_t mz_zip_reader_extract_iter_read(mz_zip_reader_extract_iter_state* pState, void* pvBuf, size_t buf_size) { size_t copied_to_caller = 0; /* Argument sanity check */ if ((!pState) || (!pState->pZip) || (!pState->pZip->m_pState) || (!pvBuf)) return 0; if ((pState->flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!pState->file_stat.m_method)) { /* The file is stored or the caller has requested the compressed data, calc amount to return. */ copied_to_caller = MZ_MIN( buf_size, pState->comp_remaining ); /* Zip is in memory....or requires reading from a file? */ if (pState->pZip->m_pState->m_pMem) { /* Copy data to caller's buffer */ memcpy( pvBuf, pState->pRead_buf, copied_to_caller ); pState->pRead_buf = ((mz_uint8*)pState->pRead_buf) + copied_to_caller; } else { /* Read directly into caller's buffer */ if (pState->pZip->m_pRead(pState->pZip->m_pIO_opaque, pState->cur_file_ofs, pvBuf, copied_to_caller) != copied_to_caller) { /* Failed to read all that was asked for, flag failure and alert user */ mz_zip_set_error(pState->pZip, MZ_ZIP_FILE_READ_FAILED); pState->status = TINFL_STATUS_FAILED; copied_to_caller = 0; } } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS /* Compute CRC if not returning compressed data only */ if (!(pState->flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) pState->file_crc32 = (mz_uint32)mz_crc32(pState->file_crc32, (const mz_uint8 *)pvBuf, copied_to_caller); #endif /* Advance offsets, dec counters */ pState->cur_file_ofs += copied_to_caller; pState->out_buf_ofs += copied_to_caller; pState->comp_remaining -= copied_to_caller; } else { do { /* Calc ptr to write buffer - given current output pos and block size */ mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pState->pWrite_buf + (pState->out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); /* Calc max output size - given current output pos and block size */ size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (pState->out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); if (!pState->out_blk_remain) { /* Read more data from file if none available (and reading from file) */ if ((!pState->read_buf_avail) && (!pState->pZip->m_pState->m_pMem)) { /* Calc read size */ pState->read_buf_avail = MZ_MIN(pState->read_buf_size, pState->comp_remaining); if (pState->pZip->m_pRead(pState->pZip->m_pIO_opaque, pState->cur_file_ofs, pState->pRead_buf, (size_t)pState->read_buf_avail) != pState->read_buf_avail) { mz_zip_set_error(pState->pZip, MZ_ZIP_FILE_READ_FAILED); pState->status = TINFL_STATUS_FAILED; break; } /* Advance offsets, dec counters */ pState->cur_file_ofs += pState->read_buf_avail; pState->comp_remaining -= pState->read_buf_avail; pState->read_buf_ofs = 0; } /* Perform decompression */ in_buf_size = (size_t)pState->read_buf_avail; pState->status = tinfl_decompress(&pState->inflator, (const mz_uint8 *)pState->pRead_buf + pState->read_buf_ofs, &in_buf_size, (mz_uint8 *)pState->pWrite_buf, pWrite_buf_cur, &out_buf_size, pState->comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); pState->read_buf_avail -= in_buf_size; pState->read_buf_ofs += in_buf_size; /* Update current output block size remaining */ pState->out_blk_remain = out_buf_size; } if (pState->out_blk_remain) { /* Calc amount to return. */ size_t to_copy = MZ_MIN( (buf_size - copied_to_caller), pState->out_blk_remain ); /* Copy data to caller's buffer */ memcpy( (uint8_t*)pvBuf + copied_to_caller, pWrite_buf_cur, to_copy ); #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS /* Perform CRC */ pState->file_crc32 = (mz_uint32)mz_crc32(pState->file_crc32, pWrite_buf_cur, to_copy); #endif /* Decrement data consumed from block */ pState->out_blk_remain -= to_copy; /* Inc output offset, while performing sanity check */ if ((pState->out_buf_ofs += to_copy) > pState->file_stat.m_uncomp_size) { mz_zip_set_error(pState->pZip, MZ_ZIP_DECOMPRESSION_FAILED); pState->status = TINFL_STATUS_FAILED; break; } /* Increment counter of data copied to caller */ copied_to_caller += to_copy; } } while ( (copied_to_caller < buf_size) && ((pState->status == TINFL_STATUS_NEEDS_MORE_INPUT) || (pState->status == TINFL_STATUS_HAS_MORE_OUTPUT)) ); } /* Return how many bytes were copied into user buffer */ return copied_to_caller; } mz_bool mz_zip_reader_extract_iter_free(mz_zip_reader_extract_iter_state* pState) { int status; /* Argument sanity check */ if ((!pState) || (!pState->pZip) || (!pState->pZip->m_pState)) return MZ_FALSE; /* Was decompression completed and requested? */ if ((pState->status == TINFL_STATUS_DONE) && (!(pState->flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) { /* Make sure the entire file was decompressed, and check its CRC. */ if (pState->out_buf_ofs != pState->file_stat.m_uncomp_size) { mz_zip_set_error(pState->pZip, MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE); pState->status = TINFL_STATUS_FAILED; } #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS else if (pState->file_crc32 != pState->file_stat.m_crc32) { mz_zip_set_error(pState->pZip, MZ_ZIP_DECOMPRESSION_FAILED); pState->status = TINFL_STATUS_FAILED; } #endif } /* Free buffers */ if (!pState->pZip->m_pState->m_pMem) pState->pZip->m_pFree(pState->pZip->m_pAlloc_opaque, pState->pRead_buf); if (pState->pWrite_buf) pState->pZip->m_pFree(pState->pZip->m_pAlloc_opaque, pState->pWrite_buf); /* Save status */ status = pState->status; /* Free context */ pState->pZip->m_pFree(pState->pZip->m_pAlloc_opaque, pState); return status == TINFL_STATUS_DONE; } #ifndef MINIZ_NO_STDIO static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n) { (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE *)pOpaque); } mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags) { mz_bool status; mz_zip_archive_file_stat file_stat; MZ_FILE *pFile; if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; if ((file_stat.m_is_directory) || (!file_stat.m_is_supported)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); pFile = MZ_FOPEN(pDst_filename, "wb"); if (!pFile) return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); if (MZ_FCLOSE(pFile) == EOF) { if (status) mz_zip_set_error(pZip, MZ_ZIP_FILE_CLOSE_FAILED); status = MZ_FALSE; } #if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_STDIO) if (status) mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); #endif return status; } mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) { mz_uint32 file_index; if (!mz_zip_reader_locate_file_v2(pZip, pArchive_filename, NULL, flags, &file_index)) return MZ_FALSE; return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); } mz_bool mz_zip_reader_extract_to_cfile(mz_zip_archive *pZip, mz_uint file_index, MZ_FILE *pFile, mz_uint flags) { mz_zip_archive_file_stat file_stat; if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; if ((file_stat.m_is_directory) || (!file_stat.m_is_supported)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); return mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); } mz_bool mz_zip_reader_extract_file_to_cfile(mz_zip_archive *pZip, const char *pArchive_filename, MZ_FILE *pFile, mz_uint flags) { mz_uint32 file_index; if (!mz_zip_reader_locate_file_v2(pZip, pArchive_filename, NULL, flags, &file_index)) return MZ_FALSE; return mz_zip_reader_extract_to_cfile(pZip, file_index, pFile, flags); } #endif /* #ifndef MINIZ_NO_STDIO */ static size_t mz_zip_compute_crc32_callback(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) { mz_uint32 *p = (mz_uint32 *)pOpaque; (void)file_ofs; *p = (mz_uint32)mz_crc32(*p, (const mz_uint8 *)pBuf, n); return n; } mz_bool mz_zip_validate_file(mz_zip_archive *pZip, mz_uint file_index, mz_uint flags) { mz_zip_archive_file_stat file_stat; mz_zip_internal_state *pState; const mz_uint8 *pCentral_dir_header; mz_bool found_zip64_ext_data_in_cdir = MZ_FALSE; mz_bool found_zip64_ext_data_in_ldir = MZ_FALSE; mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; mz_uint64 local_header_ofs = 0; mz_uint32 local_header_filename_len, local_header_extra_len, local_header_crc32; mz_uint64 local_header_comp_size, local_header_uncomp_size; mz_uint32 uncomp_crc32 = MZ_CRC32_INIT; mz_bool has_data_descriptor; mz_uint32 local_header_bit_flags; mz_zip_array file_data_array; mz_zip_array_init(&file_data_array, 1); if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (file_index > pZip->m_total_files) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; pCentral_dir_header = mz_zip_get_cdh(pZip, file_index); if (!mz_zip_file_stat_internal(pZip, file_index, pCentral_dir_header, &file_stat, &found_zip64_ext_data_in_cdir)) return MZ_FALSE; /* A directory or zero length file */ if ((file_stat.m_is_directory) || (!file_stat.m_uncomp_size)) return MZ_TRUE; /* Encryption and patch files are not supported. */ if (file_stat.m_is_encrypted) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); /* This function only supports stored and deflate. */ if ((file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_METHOD); if (!file_stat.m_is_supported) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); /* Read and parse the local directory entry. */ local_header_ofs = file_stat.m_local_header_ofs; if (pZip->m_pRead(pZip->m_pIO_opaque, local_header_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); local_header_filename_len = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS); local_header_extra_len = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); local_header_comp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS); local_header_uncomp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS); local_header_crc32 = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_CRC32_OFS); local_header_bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); has_data_descriptor = (local_header_bit_flags & 8) != 0; if (local_header_filename_len != strlen(file_stat.m_filename)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if ((local_header_ofs + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + local_header_filename_len + local_header_extra_len + file_stat.m_comp_size) > pZip->m_archive_size) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (!mz_zip_array_resize(pZip, &file_data_array, MZ_MAX(local_header_filename_len, local_header_extra_len), MZ_FALSE)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); if (local_header_filename_len) { if (pZip->m_pRead(pZip->m_pIO_opaque, local_header_ofs + MZ_ZIP_LOCAL_DIR_HEADER_SIZE, file_data_array.m_p, local_header_filename_len) != local_header_filename_len) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); goto handle_failure; } /* I've seen 1 archive that had the same pathname, but used backslashes in the local dir and forward slashes in the central dir. Do we care about this? For now, this case will fail validation. */ if (memcmp(file_stat.m_filename, file_data_array.m_p, local_header_filename_len) != 0) { mz_zip_set_error(pZip, MZ_ZIP_VALIDATION_FAILED); goto handle_failure; } } if ((local_header_extra_len) && ((local_header_comp_size == MZ_UINT32_MAX) || (local_header_uncomp_size == MZ_UINT32_MAX))) { mz_uint32 extra_size_remaining = local_header_extra_len; const mz_uint8 *pExtra_data = (const mz_uint8 *)file_data_array.m_p; if (pZip->m_pRead(pZip->m_pIO_opaque, local_header_ofs + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + local_header_filename_len, file_data_array.m_p, local_header_extra_len) != local_header_extra_len) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); goto handle_failure; } do { mz_uint32 field_id, field_data_size, field_total_size; if (extra_size_remaining < (sizeof(mz_uint16) * 2)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); field_id = MZ_READ_LE16(pExtra_data); field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); field_total_size = field_data_size + sizeof(mz_uint16) * 2; if (field_total_size > extra_size_remaining) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { const mz_uint8 *pSrc_field_data = pExtra_data + sizeof(mz_uint32); if (field_data_size < sizeof(mz_uint64) * 2) { mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); goto handle_failure; } local_header_uncomp_size = MZ_READ_LE64(pSrc_field_data); local_header_comp_size = MZ_READ_LE64(pSrc_field_data + sizeof(mz_uint64)); found_zip64_ext_data_in_ldir = MZ_TRUE; break; } pExtra_data += field_total_size; extra_size_remaining -= field_total_size; } while (extra_size_remaining); } /* TODO: parse local header extra data when local_header_comp_size is 0xFFFFFFFF! (big_descriptor.zip) */ /* I've seen zips in the wild with the data descriptor bit set, but proper local header values and bogus data descriptors */ if ((has_data_descriptor) && (!local_header_comp_size) && (!local_header_crc32)) { mz_uint8 descriptor_buf[32]; mz_bool has_id; const mz_uint8 *pSrc; mz_uint32 file_crc32; mz_uint64 comp_size = 0, uncomp_size = 0; mz_uint32 num_descriptor_uint32s = ((pState->m_zip64) || (found_zip64_ext_data_in_ldir)) ? 6 : 4; if (pZip->m_pRead(pZip->m_pIO_opaque, local_header_ofs + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + local_header_filename_len + local_header_extra_len + file_stat.m_comp_size, descriptor_buf, sizeof(mz_uint32) * num_descriptor_uint32s) != (sizeof(mz_uint32) * num_descriptor_uint32s)) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); goto handle_failure; } has_id = (MZ_READ_LE32(descriptor_buf) == MZ_ZIP_DATA_DESCRIPTOR_ID); pSrc = has_id ? (descriptor_buf + sizeof(mz_uint32)) : descriptor_buf; file_crc32 = MZ_READ_LE32(pSrc); if ((pState->m_zip64) || (found_zip64_ext_data_in_ldir)) { comp_size = MZ_READ_LE64(pSrc + sizeof(mz_uint32)); uncomp_size = MZ_READ_LE64(pSrc + sizeof(mz_uint32) + sizeof(mz_uint64)); } else { comp_size = MZ_READ_LE32(pSrc + sizeof(mz_uint32)); uncomp_size = MZ_READ_LE32(pSrc + sizeof(mz_uint32) + sizeof(mz_uint32)); } if ((file_crc32 != file_stat.m_crc32) || (comp_size != file_stat.m_comp_size) || (uncomp_size != file_stat.m_uncomp_size)) { mz_zip_set_error(pZip, MZ_ZIP_VALIDATION_FAILED); goto handle_failure; } } else { if ((local_header_crc32 != file_stat.m_crc32) || (local_header_comp_size != file_stat.m_comp_size) || (local_header_uncomp_size != file_stat.m_uncomp_size)) { mz_zip_set_error(pZip, MZ_ZIP_VALIDATION_FAILED); goto handle_failure; } } mz_zip_array_clear(pZip, &file_data_array); if ((flags & MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY) == 0) { if (!mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_compute_crc32_callback, &uncomp_crc32, 0)) return MZ_FALSE; /* 1 more check to be sure, although the extract checks too. */ if (uncomp_crc32 != file_stat.m_crc32) { mz_zip_set_error(pZip, MZ_ZIP_VALIDATION_FAILED); return MZ_FALSE; } } return MZ_TRUE; handle_failure: mz_zip_array_clear(pZip, &file_data_array); return MZ_FALSE; } mz_bool mz_zip_validate_archive(mz_zip_archive *pZip, mz_uint flags) { mz_zip_internal_state *pState; uint32_t i; if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; /* Basic sanity checks */ if (!pState->m_zip64) { if (pZip->m_total_files > MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); if (pZip->m_archive_size > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); } else { if (pZip->m_total_files >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); if (pState->m_central_dir.m_size >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); } for (i = 0; i < pZip->m_total_files; i++) { if (MZ_ZIP_FLAG_VALIDATE_LOCATE_FILE_FLAG & flags) { mz_uint32 found_index; mz_zip_archive_file_stat stat; if (!mz_zip_reader_file_stat(pZip, i, &stat)) return MZ_FALSE; if (!mz_zip_reader_locate_file_v2(pZip, stat.m_filename, NULL, 0, &found_index)) return MZ_FALSE; /* This check can fail if there are duplicate filenames in the archive (which we don't check for when writing - that's up to the user) */ if (found_index != i) return mz_zip_set_error(pZip, MZ_ZIP_VALIDATION_FAILED); } if (!mz_zip_validate_file(pZip, i, flags)) return MZ_FALSE; } return MZ_TRUE; } mz_bool mz_zip_validate_mem_archive(const void *pMem, size_t size, mz_uint flags, mz_zip_error *pErr) { mz_bool success = MZ_TRUE; mz_zip_archive zip; mz_zip_error actual_err = MZ_ZIP_NO_ERROR; if ((!pMem) || (!size)) { if (pErr) *pErr = MZ_ZIP_INVALID_PARAMETER; return MZ_FALSE; } mz_zip_zero_struct(&zip); if (!mz_zip_reader_init_mem(&zip, pMem, size, flags)) { if (pErr) *pErr = zip.m_last_error; return MZ_FALSE; } if (!mz_zip_validate_archive(&zip, flags)) { actual_err = zip.m_last_error; success = MZ_FALSE; } if (!mz_zip_reader_end_internal(&zip, success)) { if (!actual_err) actual_err = zip.m_last_error; success = MZ_FALSE; } if (pErr) *pErr = actual_err; return success; } #ifndef MINIZ_NO_STDIO mz_bool mz_zip_validate_file_archive(const char *pFilename, mz_uint flags, mz_zip_error *pErr) { mz_bool success = MZ_TRUE; mz_zip_archive zip; mz_zip_error actual_err = MZ_ZIP_NO_ERROR; if (!pFilename) { if (pErr) *pErr = MZ_ZIP_INVALID_PARAMETER; return MZ_FALSE; } mz_zip_zero_struct(&zip); if (!mz_zip_reader_init_file_v2(&zip, pFilename, flags, 0, 0)) { if (pErr) *pErr = zip.m_last_error; return MZ_FALSE; } if (!mz_zip_validate_archive(&zip, flags)) { actual_err = zip.m_last_error; success = MZ_FALSE; } if (!mz_zip_reader_end_internal(&zip, success)) { if (!actual_err) actual_err = zip.m_last_error; success = MZ_FALSE; } if (pErr) *pErr = actual_err; return success; } #endif /* #ifndef MINIZ_NO_STDIO */ /* ------------------- .ZIP archive writing */ #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS static MZ_FORCEINLINE void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); } static MZ_FORCEINLINE void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); } static MZ_FORCEINLINE void mz_write_le64(mz_uint8 *p, mz_uint64 v) { mz_write_le32(p, (mz_uint32)v); mz_write_le32(p + sizeof(mz_uint32), (mz_uint32)(v >> 32)); } #define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) #define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) #define MZ_WRITE_LE64(p, v) mz_write_le64((mz_uint8 *)(p), (mz_uint64)(v)) static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) { mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; mz_zip_internal_state *pState = pZip->m_pState; mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); if (!n) return 0; /* An allocation this big is likely to just fail on 32-bit systems, so don't even go there. */ if ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)) { mz_zip_set_error(pZip, MZ_ZIP_FILE_TOO_LARGE); return 0; } if (new_size > pState->m_mem_capacity) { void *pNew_block; size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2; if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) { mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); return 0; } pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity; } memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); pState->m_mem_size = (size_t)new_size; return n; } static mz_bool mz_zip_writer_end_internal(mz_zip_archive *pZip, mz_bool set_last_error) { mz_zip_internal_state *pState; mz_bool status = MZ_TRUE; if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) { if (set_last_error) mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return MZ_FALSE; } pState = pZip->m_pState; pZip->m_pState = NULL; mz_zip_array_clear(pZip, &pState->m_central_dir); mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); #ifndef MINIZ_NO_STDIO if (pState->m_pFile) { if (pZip->m_zip_type == MZ_ZIP_TYPE_FILE) { if (MZ_FCLOSE(pState->m_pFile) == EOF) { if (set_last_error) mz_zip_set_error(pZip, MZ_ZIP_FILE_CLOSE_FAILED); status = MZ_FALSE; } } pState->m_pFile = NULL; } #endif /* #ifndef MINIZ_NO_STDIO */ if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); pState->m_pMem = NULL; } pZip->m_pFree(pZip->m_pAlloc_opaque, pState); pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; return status; } mz_bool mz_zip_writer_init_v2(mz_zip_archive *pZip, mz_uint64 existing_size, mz_uint flags) { mz_bool zip64 = (flags & MZ_ZIP_FLAG_WRITE_ZIP64) != 0; if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (flags & MZ_ZIP_FLAG_WRITE_ALLOW_READING) { if (!pZip->m_pRead) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); } if (pZip->m_file_offset_alignment) { /* Ensure user specified file offset alignment is a power of 2. */ if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); } if (!pZip->m_pAlloc) pZip->m_pAlloc = miniz_def_alloc_func; if (!pZip->m_pFree) pZip->m_pFree = miniz_def_free_func; if (!pZip->m_pRealloc) pZip->m_pRealloc = miniz_def_realloc_func; pZip->m_archive_size = existing_size; pZip->m_central_directory_file_ofs = 0; pZip->m_total_files = 0; if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); pZip->m_pState->m_zip64 = zip64; pZip->m_pState->m_zip64_has_extended_info_fields = zip64; pZip->m_zip_type = MZ_ZIP_TYPE_USER; pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; return MZ_TRUE; } mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) { return mz_zip_writer_init_v2(pZip, existing_size, 0); } mz_bool mz_zip_writer_init_heap_v2(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size, mz_uint flags) { pZip->m_pWrite = mz_zip_heap_write_func; pZip->m_pNeeds_keepalive = NULL; if (flags & MZ_ZIP_FLAG_WRITE_ALLOW_READING) pZip->m_pRead = mz_zip_mem_read_func; pZip->m_pIO_opaque = pZip; if (!mz_zip_writer_init_v2(pZip, size_to_reserve_at_beginning, flags)) return MZ_FALSE; pZip->m_zip_type = MZ_ZIP_TYPE_HEAP; if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning))) { if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size))) { mz_zip_writer_end_internal(pZip, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } pZip->m_pState->m_mem_capacity = initial_allocation_size; } return MZ_TRUE; } mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size) { return mz_zip_writer_init_heap_v2(pZip, size_to_reserve_at_beginning, initial_allocation_size, 0); } #ifndef MINIZ_NO_STDIO static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) { mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); file_ofs += pZip->m_pState->m_file_archive_start_ofs; if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) { mz_zip_set_error(pZip, MZ_ZIP_FILE_SEEK_FAILED); return 0; } return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); } mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning) { return mz_zip_writer_init_file_v2(pZip, pFilename, size_to_reserve_at_beginning, 0); } mz_bool mz_zip_writer_init_file_v2(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning, mz_uint flags) { MZ_FILE *pFile; pZip->m_pWrite = mz_zip_file_write_func; pZip->m_pNeeds_keepalive = NULL; if (flags & MZ_ZIP_FLAG_WRITE_ALLOW_READING) pZip->m_pRead = mz_zip_file_read_func; pZip->m_pIO_opaque = pZip; if (!mz_zip_writer_init_v2(pZip, size_to_reserve_at_beginning, flags)) return MZ_FALSE; if (NULL == (pFile = MZ_FOPEN(pFilename, (flags & MZ_ZIP_FLAG_WRITE_ALLOW_READING) ? "w+b" : "wb"))) { mz_zip_writer_end(pZip); return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); } pZip->m_pState->m_pFile = pFile; pZip->m_zip_type = MZ_ZIP_TYPE_FILE; if (size_to_reserve_at_beginning) { mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf); do { size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) { mz_zip_writer_end(pZip); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_ofs += n; size_to_reserve_at_beginning -= n; } while (size_to_reserve_at_beginning); } return MZ_TRUE; } mz_bool mz_zip_writer_init_cfile(mz_zip_archive *pZip, MZ_FILE *pFile, mz_uint flags) { pZip->m_pWrite = mz_zip_file_write_func; pZip->m_pNeeds_keepalive = NULL; if (flags & MZ_ZIP_FLAG_WRITE_ALLOW_READING) pZip->m_pRead = mz_zip_file_read_func; pZip->m_pIO_opaque = pZip; if (!mz_zip_writer_init_v2(pZip, 0, flags)) return MZ_FALSE; pZip->m_pState->m_pFile = pFile; pZip->m_pState->m_file_archive_start_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); pZip->m_zip_type = MZ_ZIP_TYPE_CFILE; return MZ_TRUE; } #endif /* #ifndef MINIZ_NO_STDIO */ mz_bool mz_zip_writer_init_from_reader_v2(mz_zip_archive *pZip, const char *pFilename, mz_uint flags) { mz_zip_internal_state *pState; if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (flags & MZ_ZIP_FLAG_WRITE_ZIP64) { /* We don't support converting a non-zip64 file to zip64 - this seems like more trouble than it's worth. (What about the existing 32-bit data descriptors that could follow the compressed data?) */ if (!pZip->m_pState->m_zip64) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); } /* No sense in trying to write to an archive that's already at the support max size */ if (pZip->m_pState->m_zip64) { if (pZip->m_total_files == MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } else { if (pZip->m_total_files == MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); if ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_FILE_TOO_LARGE); } pState = pZip->m_pState; if (pState->m_pFile) { #ifdef MINIZ_NO_STDIO (void)pFilename; return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); #else if (pZip->m_pIO_opaque != pZip) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (pZip->m_zip_type == MZ_ZIP_TYPE_FILE) { if (!pFilename) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); /* Archive is being read from stdio and was originally opened only for reading. Try to reopen as writable. */ if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) { /* The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it. */ mz_zip_reader_end_internal(pZip, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); } } pZip->m_pWrite = mz_zip_file_write_func; pZip->m_pNeeds_keepalive = NULL; #endif /* #ifdef MINIZ_NO_STDIO */ } else if (pState->m_pMem) { /* Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback. */ if (pZip->m_pIO_opaque != pZip) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState->m_mem_capacity = pState->m_mem_size; pZip->m_pWrite = mz_zip_heap_write_func; pZip->m_pNeeds_keepalive = NULL; } /* Archive is being read via a user provided read function - make sure the user has specified a write function too. */ else if (!pZip->m_pWrite) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); /* Start writing new files at the archive's current central directory location. */ /* TODO: We could add a flag that lets the user start writing immediately AFTER the existing central dir - this would be safer. */ pZip->m_archive_size = pZip->m_central_directory_file_ofs; pZip->m_central_directory_file_ofs = 0; /* Clear the sorted central dir offsets, they aren't useful or maintained now. */ /* Even though we're now in write mode, files can still be extracted and verified, but file locates will be slow. */ /* TODO: We could easily maintain the sorted central directory offsets. */ mz_zip_array_clear(pZip, &pZip->m_pState->m_sorted_central_dir_offsets); pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; return MZ_TRUE; } mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename) { return mz_zip_writer_init_from_reader_v2(pZip, pFilename, 0); } /* TODO: pArchive_name is a terrible name here! */ mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags) { return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); } typedef struct { mz_zip_archive *m_pZip; mz_uint64 m_cur_archive_file_ofs; mz_uint64 m_comp_size; } mz_zip_writer_add_state; static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, void *pUser) { mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len) return MZ_FALSE; pState->m_cur_archive_file_ofs += len; pState->m_comp_size += len; return MZ_TRUE; } #define MZ_ZIP64_MAX_LOCAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 2) #define MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 3) static mz_uint32 mz_zip_writer_create_zip64_extra_data(mz_uint8 *pBuf, mz_uint64 *pUncomp_size, mz_uint64 *pComp_size, mz_uint64 *pLocal_header_ofs) { mz_uint8 *pDst = pBuf; mz_uint32 field_size = 0; MZ_WRITE_LE16(pDst + 0, MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID); MZ_WRITE_LE16(pDst + 2, 0); pDst += sizeof(mz_uint16) * 2; if (pUncomp_size) { MZ_WRITE_LE64(pDst, *pUncomp_size); pDst += sizeof(mz_uint64); field_size += sizeof(mz_uint64); } if (pComp_size) { MZ_WRITE_LE64(pDst, *pComp_size); pDst += sizeof(mz_uint64); field_size += sizeof(mz_uint64); } if (pLocal_header_ofs) { MZ_WRITE_LE64(pDst, *pLocal_header_ofs); pDst += sizeof(mz_uint64); field_size += sizeof(mz_uint64); } MZ_WRITE_LE16(pBuf + 2, field_size); return (mz_uint32)(pDst - pBuf); } static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date) { (void)pZip; memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, MZ_MIN(comp_size, MZ_UINT32_MAX)); MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, MZ_MIN(uncomp_size, MZ_UINT32_MAX)); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); return MZ_TRUE; } static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) { (void)pZip; memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, MZ_MIN(comp_size, MZ_UINT32_MAX)); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, MZ_MIN(uncomp_size, MZ_UINT32_MAX)); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, MZ_MIN(local_header_ofs, MZ_UINT32_MAX)); return MZ_TRUE; } static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes, const char *user_extra_data, mz_uint user_extra_data_len) { mz_zip_internal_state *pState = pZip->m_pState; mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; size_t orig_central_dir_size = pState->m_central_dir.m_size; mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; if (!pZip->m_pState->m_zip64) { if (local_header_ofs > 0xFFFFFFFF) return mz_zip_set_error(pZip, MZ_ZIP_FILE_TOO_LARGE); } /* miniz doesn't support central dirs >= MZ_UINT32_MAX bytes yet */ if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + user_extra_data_len + comment_size) >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size + user_extra_data_len, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) || (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) || (!mz_zip_array_push_back(pZip, &pState->m_central_dir, user_extra_data, user_extra_data_len)) || (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) || (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, ¢ral_dir_ofs, 1))) { /* Try to resize the central directory array back into its original state. */ mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } return MZ_TRUE; } static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) { /* Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes. */ if (*pArchive_name == '/') return MZ_FALSE; while (*pArchive_name) { if ((*pArchive_name == '\\') || (*pArchive_name == ':')) return MZ_FALSE; pArchive_name++; } return MZ_TRUE; } static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) { mz_uint32 n; if (!pZip->m_file_offset_alignment) return 0; n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); return (mz_uint)((pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1)); } static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n) { char buf[4096]; memset(buf, 0, MZ_MIN(sizeof(buf), n)); while (n) { mz_uint32 s = MZ_MIN(sizeof(buf), n); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_file_ofs += s; n -= s; } return MZ_TRUE; } mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32) { return mz_zip_writer_add_mem_ex_v2(pZip, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, uncomp_size, uncomp_crc32, NULL, NULL, 0, NULL, 0); } mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32, MZ_TIME_T *last_modified, const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) { mz_uint16 method = 0, dos_time = 0, dos_date = 0; mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; size_t archive_name_size; mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; tdefl_compressor *pComp = NULL; mz_bool store_data_uncompressed; mz_zip_internal_state *pState; mz_uint8 *pExtra_data = NULL; mz_uint32 extra_size = 0; mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; mz_uint16 bit_flags = 0; if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; if (uncomp_size || (buf_size && !(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) bit_flags |= MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) bit_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; level = level_and_flags & 0xF; store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; if (pState->m_zip64) { if (pZip->m_total_files == MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } else { if (pZip->m_total_files == MZ_UINT16_MAX) { pState->m_zip64 = MZ_TRUE; /*return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); */ } if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) { pState->m_zip64 = MZ_TRUE; /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ } } if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_writer_validate_archive_name(pArchive_name)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); #ifndef MINIZ_NO_TIME if (last_modified != NULL) { mz_zip_time_t_to_dos_time(*last_modified, &dos_time, &dos_date); } else { MZ_TIME_T cur_time; time(&cur_time); mz_zip_time_t_to_dos_time(cur_time, &dos_time, &dos_date); } #endif /* #ifndef MINIZ_NO_TIME */ archive_name_size = strlen(pArchive_name); if (archive_name_size > MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); /* miniz doesn't support central dirs >= MZ_UINT32_MAX bytes yet */ if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE + comment_size) >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); if (!pState->m_zip64) { /* Bail early if the archive would obviously become too large */ if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size + user_extra_data_len + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + user_extra_data_central_len + MZ_ZIP_DATA_DESCRIPTER_SIZE32) > 0xFFFFFFFF) { pState->m_zip64 = MZ_TRUE; /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ } } if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) { /* Set DOS Subdirectory attribute bit. */ ext_attributes |= MZ_ZIP_DOS_DIR_ATTRIBUTE_BITFLAG; /* Subdirectories cannot contain data. */ if ((buf_size) || (uncomp_size)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); } /* Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.) */ if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size + (pState->m_zip64 ? MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE : 0))) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); if ((!store_data_uncompressed) && (buf_size)) { if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); return MZ_FALSE; } local_dir_header_ofs += num_alignment_padding_bytes; if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } cur_archive_file_ofs += num_alignment_padding_bytes; MZ_CLEAR_OBJ(local_dir_header); if (!store_data_uncompressed || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { method = MZ_DEFLATED; } if (pState->m_zip64) { if (uncomp_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) { pExtra_data = extra_data; extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, extra_size + user_extra_data_len, 0, 0, 0, method, bit_flags, dos_time, dos_date)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += sizeof(local_dir_header); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += archive_name_size; if (pExtra_data != NULL) { if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, extra_data, extra_size) != extra_size) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += extra_size; } } else { if ((comp_size > MZ_UINT32_MAX) || (cur_archive_file_ofs > MZ_UINT32_MAX)) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, user_extra_data_len, 0, 0, 0, method, bit_flags, dos_time, dos_date)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += sizeof(local_dir_header); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += archive_name_size; } if (user_extra_data_len > 0) { if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += user_extra_data_len; } if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size); uncomp_size = buf_size; if (uncomp_size <= 3) { level = 0; store_data_uncompressed = MZ_TRUE; } } if (store_data_uncompressed) { if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += buf_size; comp_size = buf_size; } else if (buf_size) { mz_zip_writer_add_state state; state.m_pZip = pZip; state.m_cur_archive_file_ofs = cur_archive_file_ofs; state.m_comp_size = 0; if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) || (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); return mz_zip_set_error(pZip, MZ_ZIP_COMPRESSION_FAILED); } comp_size = state.m_comp_size; cur_archive_file_ofs = state.m_cur_archive_file_ofs; } pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); pComp = NULL; if (uncomp_size) { mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; MZ_ASSERT(bit_flags & MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR); MZ_WRITE_LE32(local_dir_footer + 0, MZ_ZIP_DATA_DESCRIPTOR_ID); MZ_WRITE_LE32(local_dir_footer + 4, uncomp_crc32); if (pExtra_data == NULL) { if (comp_size > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); MZ_WRITE_LE32(local_dir_footer + 8, comp_size); MZ_WRITE_LE32(local_dir_footer + 12, uncomp_size); } else { MZ_WRITE_LE64(local_dir_footer + 8, comp_size); MZ_WRITE_LE64(local_dir_footer + 16, uncomp_size); local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE64; } if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) return MZ_FALSE; cur_archive_file_ofs += local_dir_footer_size; } if (pExtra_data != NULL) { extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, extra_size, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_dir_header_ofs, ext_attributes, user_extra_data_central, user_extra_data_central_len)) return MZ_FALSE; pZip->m_total_files++; pZip->m_archive_size = cur_archive_file_ofs; return MZ_TRUE; } #ifndef MINIZ_NO_STDIO mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, MZ_FILE *pSrc_file, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) { mz_uint16 gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = size_to_add, comp_size = 0; size_t archive_name_size; mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; mz_uint8 *pExtra_data = NULL; mz_uint32 extra_size = 0; mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; mz_zip_internal_state *pState; if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; level = level_and_flags & 0xF; /* Sanity checks */ if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; if ((!pState->m_zip64) && (uncomp_size > MZ_UINT32_MAX)) { /* Source file is too large for non-zip64 */ /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ pState->m_zip64 = MZ_TRUE; } /* We could support this, but why? */ if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_writer_validate_archive_name(pArchive_name)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); if (pState->m_zip64) { if (pZip->m_total_files == MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } else { if (pZip->m_total_files == MZ_UINT16_MAX) { pState->m_zip64 = MZ_TRUE; /*return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); */ } } archive_name_size = strlen(pArchive_name); if (archive_name_size > MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); /* miniz doesn't support central dirs >= MZ_UINT32_MAX bytes yet */ if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE + comment_size) >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); if (!pState->m_zip64) { /* Bail early if the archive would obviously become too large */ if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size + user_extra_data_len + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + 1024 + MZ_ZIP_DATA_DESCRIPTER_SIZE32 + user_extra_data_central_len) > 0xFFFFFFFF) { pState->m_zip64 = MZ_TRUE; /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ } } #ifndef MINIZ_NO_TIME if (pFile_time) { mz_zip_time_t_to_dos_time(*pFile_time, &dos_time, &dos_date); } #endif if (uncomp_size <= 3) level = 0; if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes)) { return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += num_alignment_padding_bytes; local_dir_header_ofs = cur_archive_file_ofs; if (pZip->m_file_offset_alignment) { MZ_ASSERT((cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } if (uncomp_size && level) { method = MZ_DEFLATED; } MZ_CLEAR_OBJ(local_dir_header); if (pState->m_zip64) { if (uncomp_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) { pExtra_data = extra_data; extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, extra_size + user_extra_data_len, 0, 0, 0, method, gen_flags, dos_time, dos_date)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += sizeof(local_dir_header); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += archive_name_size; if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, extra_data, extra_size) != extra_size) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += extra_size; } else { if ((comp_size > MZ_UINT32_MAX) || (cur_archive_file_ofs > MZ_UINT32_MAX)) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, user_extra_data_len, 0, 0, 0, method, gen_flags, dos_time, dos_date)) return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += sizeof(local_dir_header); if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_archive_file_ofs += archive_name_size; } if (user_extra_data_len > 0) { if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_archive_file_ofs += user_extra_data_len; } if (uncomp_size) { mz_uint64 uncomp_remaining = uncomp_size; void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); if (!pRead_buf) { return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (!level) { while (uncomp_remaining) { mz_uint n = (mz_uint)MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); uncomp_remaining -= n; cur_archive_file_ofs += n; } comp_size = uncomp_size; } else { mz_bool result = MZ_FALSE; mz_zip_writer_add_state state; tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); if (!pComp) { pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } state.m_pZip = pZip; state.m_cur_archive_file_ofs = cur_archive_file_ofs; state.m_comp_size = 0; if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) { pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); } for (;;) { size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, (mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE); tdefl_status status; tdefl_flush flush = TDEFL_NO_FLUSH; if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); break; } uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); uncomp_remaining -= in_buf_size; if (pZip->m_pNeeds_keepalive != NULL && pZip->m_pNeeds_keepalive(pZip->m_pIO_opaque)) flush = TDEFL_FULL_FLUSH; status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? flush : TDEFL_FINISH); if (status == TDEFL_STATUS_DONE) { result = MZ_TRUE; break; } else if (status != TDEFL_STATUS_OKAY) { mz_zip_set_error(pZip, MZ_ZIP_COMPRESSION_FAILED); break; } } pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); if (!result) { pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return MZ_FALSE; } comp_size = state.m_comp_size; cur_archive_file_ofs = state.m_cur_archive_file_ofs; } pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); } { mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; MZ_WRITE_LE32(local_dir_footer + 0, MZ_ZIP_DATA_DESCRIPTOR_ID); MZ_WRITE_LE32(local_dir_footer + 4, uncomp_crc32); if (pExtra_data == NULL) { if (comp_size > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); MZ_WRITE_LE32(local_dir_footer + 8, comp_size); MZ_WRITE_LE32(local_dir_footer + 12, uncomp_size); } else { MZ_WRITE_LE64(local_dir_footer + 8, comp_size); MZ_WRITE_LE64(local_dir_footer + 16, uncomp_size); local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE64; } if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) return MZ_FALSE; cur_archive_file_ofs += local_dir_footer_size; } if (pExtra_data != NULL) { extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, extra_size, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, gen_flags, dos_time, dos_date, local_dir_header_ofs, ext_attributes, user_extra_data_central, user_extra_data_central_len)) return MZ_FALSE; pZip->m_total_files++; pZip->m_archive_size = cur_archive_file_ofs; return MZ_TRUE; } mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) { MZ_FILE *pSrc_file = NULL; mz_uint64 uncomp_size = 0; MZ_TIME_T file_modified_time; MZ_TIME_T *pFile_time = NULL; mz_bool status; memset(&file_modified_time, 0, sizeof(file_modified_time)); #if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_STDIO) pFile_time = &file_modified_time; if (!mz_zip_get_file_modified_time(pSrc_filename, &file_modified_time)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_STAT_FAILED); #endif pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); if (!pSrc_file) return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); MZ_FSEEK64(pSrc_file, 0, SEEK_END); uncomp_size = MZ_FTELL64(pSrc_file); MZ_FSEEK64(pSrc_file, 0, SEEK_SET); status = mz_zip_writer_add_cfile(pZip, pArchive_name, pSrc_file, uncomp_size, pFile_time, pComment, comment_size, level_and_flags, NULL, 0, NULL, 0); MZ_FCLOSE(pSrc_file); return status; } #endif /* #ifndef MINIZ_NO_STDIO */ static mz_bool mz_zip_writer_update_zip64_extension_block(mz_zip_array *pNew_ext, mz_zip_archive *pZip, const mz_uint8 *pExt, uint32_t ext_len, mz_uint64 *pComp_size, mz_uint64 *pUncomp_size, mz_uint64 *pLocal_header_ofs, mz_uint32 *pDisk_start) { /* + 64 should be enough for any new zip64 data */ if (!mz_zip_array_reserve(pZip, pNew_ext, ext_len + 64, MZ_FALSE)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); mz_zip_array_resize(pZip, pNew_ext, 0, MZ_FALSE); if ((pUncomp_size) || (pComp_size) || (pLocal_header_ofs) || (pDisk_start)) { mz_uint8 new_ext_block[64]; mz_uint8 *pDst = new_ext_block; mz_write_le16(pDst, MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID); mz_write_le16(pDst + sizeof(mz_uint16), 0); pDst += sizeof(mz_uint16) * 2; if (pUncomp_size) { mz_write_le64(pDst, *pUncomp_size); pDst += sizeof(mz_uint64); } if (pComp_size) { mz_write_le64(pDst, *pComp_size); pDst += sizeof(mz_uint64); } if (pLocal_header_ofs) { mz_write_le64(pDst, *pLocal_header_ofs); pDst += sizeof(mz_uint64); } if (pDisk_start) { mz_write_le32(pDst, *pDisk_start); pDst += sizeof(mz_uint32); } mz_write_le16(new_ext_block + sizeof(mz_uint16), (mz_uint16)((pDst - new_ext_block) - sizeof(mz_uint16) * 2)); if (!mz_zip_array_push_back(pZip, pNew_ext, new_ext_block, pDst - new_ext_block)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if ((pExt) && (ext_len)) { mz_uint32 extra_size_remaining = ext_len; const mz_uint8 *pExtra_data = pExt; do { mz_uint32 field_id, field_data_size, field_total_size; if (extra_size_remaining < (sizeof(mz_uint16) * 2)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); field_id = MZ_READ_LE16(pExtra_data); field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); field_total_size = field_data_size + sizeof(mz_uint16) * 2; if (field_total_size > extra_size_remaining) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); if (field_id != MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { if (!mz_zip_array_push_back(pZip, pNew_ext, pExtra_data, field_total_size)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } pExtra_data += field_total_size; extra_size_remaining -= field_total_size; } while (extra_size_remaining); } return MZ_TRUE; } /* TODO: This func is now pretty freakin complex due to zip64, split it up? */ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint src_file_index) { mz_uint n, bit_flags, num_alignment_padding_bytes, src_central_dir_following_data_size; mz_uint64 src_archive_bytes_remaining, local_dir_header_ofs; mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; mz_uint8 new_central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; size_t orig_central_dir_size; mz_zip_internal_state *pState; void *pBuf; const mz_uint8 *pSrc_central_header; mz_zip_archive_file_stat src_file_stat; mz_uint32 src_filename_len, src_comment_len, src_ext_len; mz_uint32 local_header_filename_size, local_header_extra_len; mz_uint64 local_header_comp_size, local_header_uncomp_size; mz_bool found_zip64_ext_data_in_ldir = MZ_FALSE; /* Sanity checks */ if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pSource_zip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; /* Don't support copying files from zip64 archives to non-zip64, even though in some cases this is possible */ if ((pSource_zip->m_pState->m_zip64) && (!pZip->m_pState->m_zip64)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); /* Get pointer to the source central dir header and crack it */ if (NULL == (pSrc_central_header = mz_zip_get_cdh(pSource_zip, src_file_index))) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_SIG_OFS) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); src_filename_len = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS); src_comment_len = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); src_ext_len = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS); src_central_dir_following_data_size = src_filename_len + src_ext_len + src_comment_len; /* TODO: We don't support central dir's >= MZ_UINT32_MAX bytes right now (+32 fudge factor in case we need to add more extra data) */ if ((pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + src_central_dir_following_data_size + 32) >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); if (!pState->m_zip64) { if (pZip->m_total_files == MZ_UINT16_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } else { /* TODO: Our zip64 support still has some 32-bit limits that may not be worth fixing. */ if (pZip->m_total_files == MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } if (!mz_zip_file_stat_internal(pSource_zip, src_file_index, pSrc_central_header, &src_file_stat, NULL)) return MZ_FALSE; cur_src_file_ofs = src_file_stat.m_local_header_ofs; cur_dst_file_ofs = pZip->m_archive_size; /* Read the source archive's local dir header */ if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; /* Compute the total size we need to copy (filename+extra data+compressed data) */ local_header_filename_size = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS); local_header_extra_len = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); local_header_comp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS); local_header_uncomp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS); src_archive_bytes_remaining = local_header_filename_size + local_header_extra_len + src_file_stat.m_comp_size; /* Try to find a zip64 extended information field */ if ((local_header_extra_len) && ((local_header_comp_size == MZ_UINT32_MAX) || (local_header_uncomp_size == MZ_UINT32_MAX))) { mz_zip_array file_data_array; const mz_uint8 *pExtra_data; mz_uint32 extra_size_remaining = local_header_extra_len; mz_zip_array_init(&file_data_array, 1); if (!mz_zip_array_resize(pZip, &file_data_array, local_header_extra_len, MZ_FALSE)) { return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, src_file_stat.m_local_header_ofs + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + local_header_filename_size, file_data_array.m_p, local_header_extra_len) != local_header_extra_len) { mz_zip_array_clear(pZip, &file_data_array); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } pExtra_data = (const mz_uint8 *)file_data_array.m_p; do { mz_uint32 field_id, field_data_size, field_total_size; if (extra_size_remaining < (sizeof(mz_uint16) * 2)) { mz_zip_array_clear(pZip, &file_data_array); return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); } field_id = MZ_READ_LE16(pExtra_data); field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); field_total_size = field_data_size + sizeof(mz_uint16) * 2; if (field_total_size > extra_size_remaining) { mz_zip_array_clear(pZip, &file_data_array); return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); } if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { const mz_uint8 *pSrc_field_data = pExtra_data + sizeof(mz_uint32); if (field_data_size < sizeof(mz_uint64) * 2) { mz_zip_array_clear(pZip, &file_data_array); return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); } local_header_uncomp_size = MZ_READ_LE64(pSrc_field_data); local_header_comp_size = MZ_READ_LE64(pSrc_field_data + sizeof(mz_uint64)); /* may be 0 if there's a descriptor */ found_zip64_ext_data_in_ldir = MZ_TRUE; break; } pExtra_data += field_total_size; extra_size_remaining -= field_total_size; } while (extra_size_remaining); mz_zip_array_clear(pZip, &file_data_array); } if (!pState->m_zip64) { /* Try to detect if the new archive will most likely wind up too big and bail early (+(sizeof(mz_uint32) * 4) is for the optional descriptor which could be present, +64 is a fudge factor). */ /* We also check when the archive is finalized so this doesn't need to be perfect. */ mz_uint64 approx_new_archive_size = cur_dst_file_ofs + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + src_archive_bytes_remaining + (sizeof(mz_uint32) * 4) + pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + src_central_dir_following_data_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + 64; if (approx_new_archive_size >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); } /* Write dest archive padding */ if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes)) return MZ_FALSE; cur_dst_file_ofs += num_alignment_padding_bytes; local_dir_header_ofs = cur_dst_file_ofs; if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } /* The original zip's local header+ext block doesn't change, even with zip64, so we can just copy it over to the dest zip */ if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; /* Copy over the source archive bytes to the dest archive, also ensure we have enough buf space to handle optional data descriptor */ if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(32U, MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, src_archive_bytes_remaining))))) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); while (src_archive_bytes_remaining) { n = (mz_uint)MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, src_archive_bytes_remaining); if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } cur_src_file_ofs += n; if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_dst_file_ofs += n; src_archive_bytes_remaining -= n; } /* Now deal with the optional data descriptor */ bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); if (bit_flags & 8) { /* Copy data descriptor */ if ((pSource_zip->m_pState->m_zip64) || (found_zip64_ext_data_in_ldir)) { /* src is zip64, dest must be zip64 */ /* name uint32_t's */ /* id 1 (optional in zip64?) */ /* crc 1 */ /* comp_size 2 */ /* uncomp_size 2 */ if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, (sizeof(mz_uint32) * 6)) != (sizeof(mz_uint32) * 6)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == MZ_ZIP_DATA_DESCRIPTOR_ID) ? 6 : 5); } else { /* src is NOT zip64 */ mz_bool has_id; if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } has_id = (MZ_READ_LE32(pBuf) == MZ_ZIP_DATA_DESCRIPTOR_ID); if (pZip->m_pState->m_zip64) { /* dest is zip64, so upgrade the data descriptor */ const mz_uint32 *pSrc_descriptor = (const mz_uint32 *)((const mz_uint8 *)pBuf + (has_id ? sizeof(mz_uint32) : 0)); const mz_uint32 src_crc32 = pSrc_descriptor[0]; const mz_uint64 src_comp_size = pSrc_descriptor[1]; const mz_uint64 src_uncomp_size = pSrc_descriptor[2]; mz_write_le32((mz_uint8 *)pBuf, MZ_ZIP_DATA_DESCRIPTOR_ID); mz_write_le32((mz_uint8 *)pBuf + sizeof(mz_uint32) * 1, src_crc32); mz_write_le64((mz_uint8 *)pBuf + sizeof(mz_uint32) * 2, src_comp_size); mz_write_le64((mz_uint8 *)pBuf + sizeof(mz_uint32) * 4, src_uncomp_size); n = sizeof(mz_uint32) * 6; } else { /* dest is NOT zip64, just copy it as-is */ n = sizeof(mz_uint32) * (has_id ? 4 : 3); } } if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); } cur_src_file_ofs += n; cur_dst_file_ofs += n; } pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); /* Finally, add the new central dir header */ orig_central_dir_size = pState->m_central_dir.m_size; memcpy(new_central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); if (pState->m_zip64) { /* This is the painful part: We need to write a new central dir header + ext block with updated zip64 fields, and ensure the old fields (if any) are not included. */ const mz_uint8 *pSrc_ext = pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + src_filename_len; mz_zip_array new_ext_block; mz_zip_array_init(&new_ext_block, sizeof(mz_uint8)); MZ_WRITE_LE32(new_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, MZ_UINT32_MAX); MZ_WRITE_LE32(new_central_header + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, MZ_UINT32_MAX); MZ_WRITE_LE32(new_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, MZ_UINT32_MAX); if (!mz_zip_writer_update_zip64_extension_block(&new_ext_block, pZip, pSrc_ext, src_ext_len, &src_file_stat.m_comp_size, &src_file_stat.m_uncomp_size, &local_dir_header_ofs, NULL)) { mz_zip_array_clear(pZip, &new_ext_block); return MZ_FALSE; } MZ_WRITE_LE16(new_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS, new_ext_block.m_size); if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, new_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) { mz_zip_array_clear(pZip, &new_ext_block); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, src_filename_len)) { mz_zip_array_clear(pZip, &new_ext_block); mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, new_ext_block.m_p, new_ext_block.m_size)) { mz_zip_array_clear(pZip, &new_ext_block); mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + src_filename_len + src_ext_len, src_comment_len)) { mz_zip_array_clear(pZip, &new_ext_block); mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } mz_zip_array_clear(pZip, &new_ext_block); } else { /* sanity checks */ if (cur_dst_file_ofs > MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); if (local_dir_header_ofs >= MZ_UINT32_MAX) return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); MZ_WRITE_LE32(new_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs); if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, new_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, src_central_dir_following_data_size)) { mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } } /* This shouldn't trigger unless we screwed up during the initial sanity checks */ if (pState->m_central_dir.m_size >= MZ_UINT32_MAX) { /* TODO: Support central dirs >= 32-bits in size */ mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); } n = (mz_uint32)orig_central_dir_size; if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) { mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); } pZip->m_total_files++; pZip->m_archive_size = cur_dst_file_ofs; return MZ_TRUE; } mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) { mz_zip_internal_state *pState; mz_uint64 central_dir_ofs, central_dir_size; mz_uint8 hdr[256]; if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); pState = pZip->m_pState; if (pState->m_zip64) { if ((pZip->m_total_files > MZ_UINT32_MAX) || (pState->m_central_dir.m_size >= MZ_UINT32_MAX)) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } else { if ((pZip->m_total_files > MZ_UINT16_MAX) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > MZ_UINT32_MAX)) return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); } central_dir_ofs = 0; central_dir_size = 0; if (pZip->m_total_files) { /* Write central directory */ central_dir_ofs = pZip->m_archive_size; central_dir_size = pState->m_central_dir.m_size; pZip->m_central_directory_file_ofs = central_dir_ofs; if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); pZip->m_archive_size += central_dir_size; } if (pState->m_zip64) { /* Write zip64 end of central directory header */ mz_uint64 rel_ofs_to_zip64_ecdr = pZip->m_archive_size; MZ_CLEAR_OBJ(hdr); MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDH_SIG_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE - sizeof(mz_uint32) - sizeof(mz_uint64)); MZ_WRITE_LE16(hdr + MZ_ZIP64_ECDH_VERSION_MADE_BY_OFS, 0x031E); /* TODO: always Unix */ MZ_WRITE_LE16(hdr + MZ_ZIP64_ECDH_VERSION_NEEDED_OFS, 0x002D); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_CDIR_SIZE_OFS, central_dir_size); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_CDIR_OFS_OFS, central_dir_ofs); if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); pZip->m_archive_size += MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE; /* Write zip64 end of central directory locator */ MZ_CLEAR_OBJ(hdr); MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDL_SIG_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG); MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS, rel_ofs_to_zip64_ecdr); MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS, 1); if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) != MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); pZip->m_archive_size += MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE; } /* Write end of central directory record */ MZ_CLEAR_OBJ(hdr); MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, MZ_MIN(MZ_UINT16_MAX, pZip->m_total_files)); MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, MZ_MIN(MZ_UINT16_MAX, pZip->m_total_files)); MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, MZ_MIN(MZ_UINT32_MAX, central_dir_size)); MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, MZ_MIN(MZ_UINT32_MAX, central_dir_ofs)); if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); #ifndef MINIZ_NO_STDIO if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) return mz_zip_set_error(pZip, MZ_ZIP_FILE_CLOSE_FAILED); #endif /* #ifndef MINIZ_NO_STDIO */ pZip->m_archive_size += MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE; pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; return MZ_TRUE; } mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **ppBuf, size_t *pSize) { if ((!ppBuf) || (!pSize)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); *ppBuf = NULL; *pSize = 0; if ((!pZip) || (!pZip->m_pState)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (pZip->m_pWrite != mz_zip_heap_write_func) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); if (!mz_zip_writer_finalize_archive(pZip)) return MZ_FALSE; *ppBuf = pZip->m_pState->m_pMem; *pSize = pZip->m_pState->m_mem_size; pZip->m_pState->m_pMem = NULL; pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; return MZ_TRUE; } mz_bool mz_zip_writer_end(mz_zip_archive *pZip) { return mz_zip_writer_end_internal(pZip, MZ_TRUE); } #ifndef MINIZ_NO_STDIO mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) { return mz_zip_add_mem_to_archive_file_in_place_v2(pZip_filename, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, NULL); } mz_bool mz_zip_add_mem_to_archive_file_in_place_v2(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_zip_error *pErr) { mz_bool status, created_new_archive = MZ_FALSE; mz_zip_archive zip_archive; struct MZ_FILE_STAT_STRUCT file_stat; mz_zip_error actual_err = MZ_ZIP_NO_ERROR; mz_zip_zero_struct(&zip_archive); if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) { if (pErr) *pErr = MZ_ZIP_INVALID_PARAMETER; return MZ_FALSE; } if (!mz_zip_writer_validate_archive_name(pArchive_name)) { if (pErr) *pErr = MZ_ZIP_INVALID_FILENAME; return MZ_FALSE; } /* Important: The regular non-64 bit version of stat() can fail here if the file is very large, which could cause the archive to be overwritten. */ /* So be sure to compile with _LARGEFILE64_SOURCE 1 */ if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) { /* Create a new archive. */ if (!mz_zip_writer_init_file_v2(&zip_archive, pZip_filename, 0, level_and_flags)) { if (pErr) *pErr = zip_archive.m_last_error; return MZ_FALSE; } created_new_archive = MZ_TRUE; } else { /* Append to an existing archive. */ if (!mz_zip_reader_init_file_v2(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY, 0, 0)) { if (pErr) *pErr = zip_archive.m_last_error; return MZ_FALSE; } if (!mz_zip_writer_init_from_reader_v2(&zip_archive, pZip_filename, level_and_flags)) { if (pErr) *pErr = zip_archive.m_last_error; mz_zip_reader_end_internal(&zip_archive, MZ_FALSE); return MZ_FALSE; } } status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0); actual_err = zip_archive.m_last_error; /* Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.) */ if (!mz_zip_writer_finalize_archive(&zip_archive)) { if (!actual_err) actual_err = zip_archive.m_last_error; status = MZ_FALSE; } if (!mz_zip_writer_end_internal(&zip_archive, status)) { if (!actual_err) actual_err = zip_archive.m_last_error; status = MZ_FALSE; } if ((!status) && (created_new_archive)) { /* It's a new archive and something went wrong, so just delete it. */ int ignoredStatus = MZ_DELETE_FILE(pZip_filename); (void)ignoredStatus; } if (pErr) *pErr = actual_err; return status; } void *mz_zip_extract_archive_file_to_heap_v2(const char *pZip_filename, const char *pArchive_name, const char *pComment, size_t *pSize, mz_uint flags, mz_zip_error *pErr) { mz_uint32 file_index; mz_zip_archive zip_archive; void *p = NULL; if (pSize) *pSize = 0; if ((!pZip_filename) || (!pArchive_name)) { if (pErr) *pErr = MZ_ZIP_INVALID_PARAMETER; return NULL; } mz_zip_zero_struct(&zip_archive); if (!mz_zip_reader_init_file_v2(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY, 0, 0)) { if (pErr) *pErr = zip_archive.m_last_error; return NULL; } if (mz_zip_reader_locate_file_v2(&zip_archive, pArchive_name, pComment, flags, &file_index)) { p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); } mz_zip_reader_end_internal(&zip_archive, p != NULL); if (pErr) *pErr = zip_archive.m_last_error; return p; } void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags) { return mz_zip_extract_archive_file_to_heap_v2(pZip_filename, pArchive_name, NULL, pSize, flags, NULL); } #endif /* #ifndef MINIZ_NO_STDIO */ #endif /* #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS */ /* ------------------- Misc utils */ mz_zip_mode mz_zip_get_mode(mz_zip_archive *pZip) { return pZip ? pZip->m_zip_mode : MZ_ZIP_MODE_INVALID; } mz_zip_type mz_zip_get_type(mz_zip_archive *pZip) { return pZip ? pZip->m_zip_type : MZ_ZIP_TYPE_INVALID; } mz_zip_error mz_zip_set_last_error(mz_zip_archive *pZip, mz_zip_error err_num) { mz_zip_error prev_err; if (!pZip) return MZ_ZIP_INVALID_PARAMETER; prev_err = pZip->m_last_error; pZip->m_last_error = err_num; return prev_err; } mz_zip_error mz_zip_peek_last_error(mz_zip_archive *pZip) { if (!pZip) return MZ_ZIP_INVALID_PARAMETER; return pZip->m_last_error; } mz_zip_error mz_zip_clear_last_error(mz_zip_archive *pZip) { return mz_zip_set_last_error(pZip, MZ_ZIP_NO_ERROR); } mz_zip_error mz_zip_get_last_error(mz_zip_archive *pZip) { mz_zip_error prev_err; if (!pZip) return MZ_ZIP_INVALID_PARAMETER; prev_err = pZip->m_last_error; pZip->m_last_error = MZ_ZIP_NO_ERROR; return prev_err; } const char *mz_zip_get_error_string(mz_zip_error mz_err) { switch (mz_err) { case MZ_ZIP_NO_ERROR: return "no error"; case MZ_ZIP_UNDEFINED_ERROR: return "undefined error"; case MZ_ZIP_TOO_MANY_FILES: return "too many files"; case MZ_ZIP_FILE_TOO_LARGE: return "file too large"; case MZ_ZIP_UNSUPPORTED_METHOD: return "unsupported method"; case MZ_ZIP_UNSUPPORTED_ENCRYPTION: return "unsupported encryption"; case MZ_ZIP_UNSUPPORTED_FEATURE: return "unsupported feature"; case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR: return "failed finding central directory"; case MZ_ZIP_NOT_AN_ARCHIVE: return "not a ZIP archive"; case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED: return "invalid header or archive is corrupted"; case MZ_ZIP_UNSUPPORTED_MULTIDISK: return "unsupported multidisk archive"; case MZ_ZIP_DECOMPRESSION_FAILED: return "decompression failed or archive is corrupted"; case MZ_ZIP_COMPRESSION_FAILED: return "compression failed"; case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE: return "unexpected decompressed size"; case MZ_ZIP_CRC_CHECK_FAILED: return "CRC-32 check failed"; case MZ_ZIP_UNSUPPORTED_CDIR_SIZE: return "unsupported central directory size"; case MZ_ZIP_ALLOC_FAILED: return "allocation failed"; case MZ_ZIP_FILE_OPEN_FAILED: return "file open failed"; case MZ_ZIP_FILE_CREATE_FAILED: return "file create failed"; case MZ_ZIP_FILE_WRITE_FAILED: return "file write failed"; case MZ_ZIP_FILE_READ_FAILED: return "file read failed"; case MZ_ZIP_FILE_CLOSE_FAILED: return "file close failed"; case MZ_ZIP_FILE_SEEK_FAILED: return "file seek failed"; case MZ_ZIP_FILE_STAT_FAILED: return "file stat failed"; case MZ_ZIP_INVALID_PARAMETER: return "invalid parameter"; case MZ_ZIP_INVALID_FILENAME: return "invalid filename"; case MZ_ZIP_BUF_TOO_SMALL: return "buffer too small"; case MZ_ZIP_INTERNAL_ERROR: return "internal error"; case MZ_ZIP_FILE_NOT_FOUND: return "file not found"; case MZ_ZIP_ARCHIVE_TOO_LARGE: return "archive is too large"; case MZ_ZIP_VALIDATION_FAILED: return "validation failed"; case MZ_ZIP_WRITE_CALLBACK_FAILED: return "write calledback failed"; default: break; } return "unknown error"; } /* Note: Just because the archive is not zip64 doesn't necessarily mean it doesn't have Zip64 extended information extra field, argh. */ mz_bool mz_zip_is_zip64(mz_zip_archive *pZip) { if ((!pZip) || (!pZip->m_pState)) return MZ_FALSE; return pZip->m_pState->m_zip64; } size_t mz_zip_get_central_dir_size(mz_zip_archive *pZip) { if ((!pZip) || (!pZip->m_pState)) return 0; return pZip->m_pState->m_central_dir.m_size; } mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) { return pZip ? pZip->m_total_files : 0; } mz_uint64 mz_zip_get_archive_size(mz_zip_archive *pZip) { if (!pZip) return 0; return pZip->m_archive_size; } mz_uint64 mz_zip_get_archive_file_start_offset(mz_zip_archive *pZip) { if ((!pZip) || (!pZip->m_pState)) return 0; return pZip->m_pState->m_file_archive_start_ofs; } MZ_FILE *mz_zip_get_cfile(mz_zip_archive *pZip) { if ((!pZip) || (!pZip->m_pState)) return 0; return pZip->m_pState->m_pFile; } size_t mz_zip_read_archive_data(mz_zip_archive *pZip, mz_uint64 file_ofs, void *pBuf, size_t n) { if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pZip->m_pRead)) return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return pZip->m_pRead(pZip->m_pIO_opaque, file_ofs, pBuf, n); } mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size) { mz_uint n; const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index); if (!p) { if (filename_buf_size) pFilename[0] = '\0'; mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); return 0; } n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); if (filename_buf_size) { n = MZ_MIN(n, filename_buf_size - 1); memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pFilename[n] = '\0'; } return n + 1; } mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) { return mz_zip_file_stat_internal(pZip, file_index, mz_zip_get_cdh(pZip, file_index), pStat, NULL); } mz_bool mz_zip_end(mz_zip_archive *pZip) { if (!pZip) return MZ_FALSE; if (pZip->m_zip_mode == MZ_ZIP_MODE_READING) return mz_zip_reader_end(pZip); #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS else if ((pZip->m_zip_mode == MZ_ZIP_MODE_WRITING) || (pZip->m_zip_mode == MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)) return mz_zip_writer_end(pZip); #endif return MZ_FALSE; } #ifdef __cplusplus } #endif #endif /*#ifndef MINIZ_NO_ARCHIVE_APIS*/ libminizinc-2.5.3/lib/json_parser.cpp0000644000175000017500000005044713757304533016311 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include using namespace std; namespace MiniZinc { class JSONParser::Token { public: TokenT t; protected: Token(TokenT t0) : t(t0) {} public: Token() : t(T_EOF) {} std::string s; int i; double d; bool b; Token(std::string s0) : t(T_STRING), s(std::move(s0)) {} Token(int i0) : t(T_INT), i(i0), d(i0) {} Token(double d0) : t(T_FLOAT), d(d0) {} Token(bool b0) : t(T_BOOL), i(static_cast(b0)), d(static_cast(b0)), b(b0) {} static Token listOpen() { return Token(T_LIST_OPEN); } static Token listClose() { return Token(T_LIST_CLOSE); } static Token objOpen() { return Token(T_OBJ_OPEN); } static Token objClose() { return Token(T_OBJ_CLOSE); } static Token comma() { return Token(T_COMMA); } static Token colon() { return Token(T_COLON); } static Token eof() { return Token(T_EOF); } static Token null() { return Token(T_NULL); } string toString() const { switch (t) { case T_LIST_OPEN: return "["; case T_LIST_CLOSE: return "]"; case T_OBJ_OPEN: return "{"; case T_OBJ_CLOSE: return "}"; case T_COMMA: return ","; case T_COLON: return ":"; case T_STRING: return "\"" + s + "\""; case T_INT: { std::stringstream ss; ss << i; return ss.str(); } case T_FLOAT: { std::stringstream ss; ss << d; return ss.str(); } case T_BOOL: return b ? "true" : "false"; case T_NULL: return "null"; case T_EOF: return "eof"; } return "UNKNOWN"; } }; Location JSONParser::errLocation() const { Location loc(_filename, _line, _column, _line, _column); return loc; } JSONParser::Token JSONParser::readToken(istream& is) { string result; char buf[1]; enum { S_NOTHING, S_STRING, S_STRING_ESCAPE, S_INT, S_FLOAT } state; state = S_NOTHING; while (is.good()) { is.read(buf, sizeof(buf)); _column += sizeof(buf); if (is.eof()) { return Token::eof(); } if (!is.good()) { throw JSONError(_env, errLocation(), "tokenization failed"); } switch (state) { case S_NOTHING: switch (buf[0]) { case '\n': _line++; _column = 0; // fall through case ' ': case '\t': case '\r': break; case '[': return Token::listOpen(); case ']': return Token::listClose(); case '{': return Token::objOpen(); case '}': return Token::objClose(); case ',': return Token::comma(); case ':': return Token::colon(); case '"': result = ""; state = S_STRING; break; case 't': { char rest[3]; is.read(rest, sizeof(rest)); _column += sizeof(rest); if (!is.good() || std::strncmp(rest, "rue", 3) != 0) { throw JSONError(_env, errLocation(), "unexpected token `" + string(rest) + "'"); } state = S_NOTHING; return Token(true); } break; case 'f': { char rest[4]; is.read(rest, sizeof(rest)); _column += sizeof(rest); if (!is.good() || std::strncmp(rest, "alse", 4) != 0) { throw JSONError(_env, errLocation(), "unexpected token `" + string(rest) + "'"); } state = S_NOTHING; return Token(false); } break; case 'n': { char rest[3]; is.read(rest, sizeof(rest)); _column += sizeof(rest); if (!is.good() || std::strncmp(rest, "ull", 3) != 0) { throw JSONError(_env, errLocation(), "unexpected token `" + string(rest) + "'"); } state = S_NOTHING; return Token::null(); } break; default: if ((buf[0] >= '0' && buf[0] <= '9') || (buf[0] == '-')) { result = buf[0]; state = S_INT; } else { throw JSONError(_env, errLocation(), "unexpected token `" + string(1, buf[0]) + "'"); } break; } break; case S_STRING_ESCAPE: switch (buf[0]) { case 'n': result += "\n"; break; case 't': result += "\t"; break; case '"': result += "\""; break; case '\\': result += "\\"; break; default: result += "\\"; result += buf[0]; break; } state = S_STRING; break; case S_STRING: if (buf[0] == '"') { state = S_NOTHING; return Token(result); } if (buf[0] == '\\') { state = S_STRING_ESCAPE; } else { result += buf[0]; } break; case S_INT: if (buf[0] == '.') { result += buf[0]; state = S_FLOAT; } else if (buf[0] >= '0' && buf[0] <= '9') { result += buf[0]; } else { is.unget(); std::istringstream iss(result); int v; iss >> v; state = S_NOTHING; return Token(v); } break; case S_FLOAT: if (buf[0] >= '0' && buf[0] <= '9') { result += buf[0]; } else { is.unget(); std::istringstream iss(result); double v; iss >> v; state = S_NOTHING; return Token(v); } break; } } if (result.empty()) { // EOF return Token(); } throw JSONError(_env, errLocation(), "unexpected token `" + string(result) + "'"); } void JSONParser::expectToken(istream& is, JSONParser::TokenT t) { Token rt = readToken(is); if (rt.t != t) { throw JSONError(_env, errLocation(), "unexpected token"); } } string JSONParser::expectString(istream& is) { Token rt = readToken(is); if (rt.t != T_STRING) { throw JSONError(_env, errLocation(), "unexpected token, expected string"); } return rt.s; } void JSONParser::expectEof(istream& is) { Token rt = readToken(is); if (rt.t != T_EOF) { throw JSONError(_env, errLocation(), "unexpected token, expected end of file"); } } JSONParser::Token JSONParser::parseEnumString(istream& is) { Token next = readToken(is); if (next.t != T_STRING) { throw JSONError(_env, errLocation(), "invalid enum object"); } if (next.s.empty()) { throw JSONError(_env, errLocation(), "invalid enum identifier"); } size_t nonIdChar = next.s.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"); size_t nonIdBegin = next.s.find_first_of("0123456789_"); if (nonIdChar != std::string::npos || nonIdBegin == 0) { next.s = "'" + next.s + "'"; } return next; } Expression* JSONParser::parseObject(istream& is, bool possibleString) { // precondition: found T_OBJ_OPEN Token objid = readToken(is); if (objid.t != T_STRING) { throw JSONError(_env, errLocation(), "invalid object"); } expectToken(is, T_COLON); if (objid.s == "set") { expectToken(is, T_LIST_OPEN); vector elems; TokenT listT = T_COLON; // dummy marker for (Token next = readToken(is); next.t != T_LIST_CLOSE; next = readToken(is)) { switch (next.t) { case T_COMMA: break; case T_INT: if (listT == T_STRING || listT == T_OBJ_OPEN) { throw JSONError(_env, errLocation(), "invalid set literal"); } if (listT != T_FLOAT) { listT = T_INT; } elems.push_back(next); elems.push_back(next); break; case T_FLOAT: if (listT == T_STRING || listT == T_OBJ_OPEN) { throw JSONError(_env, errLocation(), "invalid set literal"); } listT = T_FLOAT; elems.push_back(next); elems.push_back(next); break; case T_STRING: if (listT != T_COLON && listT != (possibleString ? T_STRING : T_OBJ_OPEN)) { throw JSONError(_env, errLocation(), "invalid set literal"); } listT = possibleString ? T_STRING : T_OBJ_OPEN; elems.push_back(next); break; case T_BOOL: if (listT == T_STRING || listT == T_OBJ_OPEN) { throw JSONError(_env, errLocation(), "invalid set literal"); } if (listT == T_COLON) { listT = T_BOOL; } elems.push_back(next); break; case T_OBJ_OPEN: { if (listT != T_COLON && listT != T_OBJ_OPEN) { throw JSONError(_env, errLocation(), "invalid set literal"); } listT = T_OBJ_OPEN; Token enumid = readToken(is); if (enumid.t != T_STRING || enumid.s != "e") { throw JSONError(_env, errLocation(), "invalid enum object"); } expectToken(is, T_COLON); Token next = parseEnumString(is); expectToken(is, T_OBJ_CLOSE); elems.push_back(next); break; } case T_LIST_OPEN: if (listT != T_COLON && listT != T_INT && listT != T_FLOAT) { throw JSONError(_env, errLocation(), "invalid set literal"); } next = readToken(is); if (next.t == T_INT) { if (listT != T_FLOAT) { listT = T_INT; } } else if (next.t == T_FLOAT) { listT = T_FLOAT; } else { throw JSONError(_env, errLocation(), "invalid set literal"); } elems.push_back(next); expectToken(is, T_COMMA); next = readToken(is); if (next.t == T_INT) { if (listT != T_FLOAT) { listT = T_INT; } } else if (next.t == T_FLOAT) { listT = T_FLOAT; } else { throw JSONError(_env, errLocation(), "invalid set literal"); } elems.push_back(next); expectToken(is, T_LIST_CLOSE); break; default: throw JSONError(_env, errLocation(), "invalid set literal"); } } expectToken(is, T_OBJ_CLOSE); if (listT == T_INT) { unsigned int n = elems.size() / 2; auto* res = IntSetVal::a(); for (unsigned int i = 0; i < n; i++) { IntVal m(elems[2 * i].i); IntVal n(elems[2 * i + 1].i); auto* isv = IntSetVal::a(m, n); IntSetRanges isr(isv); IntSetRanges r(res); Ranges::Union u(isr, r); res = IntSetVal::ai(u); } return new SetLit(Location().introduce(), res); } if (listT == T_FLOAT) { unsigned int n = elems.size() / 2; auto* res = FloatSetVal::a(); for (unsigned int i = 0; i < n; i++) { FloatVal m(elems[2 * i].d); FloatVal n(elems[2 * i + 1].d); auto* fsv = FloatSetVal::a(m, n); FloatSetRanges fsr(fsv); FloatSetRanges r(res); Ranges::Union u(fsr, r); res = FloatSetVal::ai(u); } return new SetLit(Location().introduce(), res); } vector elems_e(elems.size()); switch (listT) { case T_COLON: break; case T_BOOL: for (unsigned int i = 0; i < elems.size(); i++) { elems_e[i] = new BoolLit(Location().introduce(), elems[i].b); } break; case T_STRING: for (unsigned int i = 0; i < elems.size(); i++) { elems_e[i] = new StringLit(Location().introduce(), elems[i].s); } break; case T_OBJ_OPEN: for (unsigned int i = 0; i < elems.size(); i++) { elems_e[i] = new Id(Location().introduce(), ASTString(elems[i].s), nullptr); } break; default: break; } return new SetLit(Location().introduce(), elems_e); } if (objid.s == "e") { Token next = parseEnumString(is); expectToken(is, T_OBJ_CLOSE); return new Id(Location().introduce(), ASTString(next.s), nullptr); } throw JSONError(_env, errLocation(), "invalid object"); } ArrayLit* JSONParser::parseArray(std::istream& is, bool possibleString) { // precondition: opening parenthesis has been read vector exps; vector > dims; dims.emplace_back(1, 0); vector hadDim; hadDim.push_back(false); Token next; for (;;) { next = readToken(is); if (next.t != T_LIST_OPEN) { break; } dims.emplace_back(1, 0); hadDim.push_back(false); } int curDim = static_cast(dims.size()) - 1; for (;;) { switch (next.t) { case T_LIST_CLOSE: hadDim[curDim] = true; curDim--; if (curDim < 0) { goto list_done; } else if (!hadDim[curDim]) { dims[curDim].second++; } break; case T_LIST_OPEN: curDim++; break; case T_COMMA: break; case T_INT: if (!hadDim[curDim]) { dims[curDim].second++; } exps.push_back(IntLit::a(next.i)); break; case T_FLOAT: if (!hadDim[curDim]) { dims[curDim].second++; } exps.push_back(FloatLit::a(next.d)); break; case T_STRING: { if (!hadDim[curDim]) { dims[curDim].second++; } if (possibleString) { exps.push_back(new StringLit(Location().introduce(), next.s)); } else { exps.push_back(new Id(Location().introduce(), ASTString(next.s), nullptr)); } break; } case T_BOOL: if (!hadDim[curDim]) { dims[curDim].second++; } exps.push_back(new BoolLit(Location().introduce(), next.b)); break; case T_NULL: if (!hadDim[curDim]) { dims[curDim].second++; } exps.push_back(constants().absent); break; case T_OBJ_OPEN: if (!hadDim[curDim]) { dims[curDim].second++; } exps.push_back(parseObject(is)); break; default: throw JSONError(_env, errLocation(), "cannot parse JSON file"); break; } next = readToken(is); } list_done: unsigned int expectedSize = 1; for (auto& d : dims) { expectedSize *= d.second; } if (exps.size() != expectedSize) { throw JSONError(_env, errLocation(), "mismatch in array dimensions"); /// TODO: check each individual sub-array } return new ArrayLit(Location().introduce(), exps, dims); } Expression* JSONParser::parseExp(std::istream& is, bool parseObjects, bool possibleString) { Token next = readToken(is); switch (next.t) { case T_INT: return IntLit::a(next.i); break; case T_FLOAT: return FloatLit::a(next.d); case T_STRING: if (!possibleString) { return new Id(Location().introduce(), ASTString(next.s), nullptr); } return new StringLit(Location().introduce(), next.s); case T_BOOL: return new BoolLit(Location().introduce(), next.b); case T_NULL: return constants().absent; case T_OBJ_OPEN: return parseObjects ? parseObject(is, possibleString) : nullptr; case T_LIST_OPEN: return parseArray(is, possibleString); default: throw JSONError(_env, errLocation(), "cannot parse JSON file"); break; } } Expression* JSONParser::coerceArray(TypeInst* intendedTI, ArrayLit* al) { assert(al != nullptr); TypeInst& ti = *intendedTI; const Location& loc = al->loc(); if (al->size() == 0) { return al; // Nothing to coerce } if (al->dims() != 1 && al->dims() != ti.ranges().size()) { return al; // Incompatible: TypeError will be thrown on original array } int missing_index = -1; for (int i = 0; i < ti.ranges().size(); ++i) { TypeInst* nti = ti.ranges()[i]; if (nti->domain() == nullptr) { if (missing_index != -1) { return al; // More than one index set is missing. Cannot compute correct index sets. } missing_index = i; } } std::vector args(ti.ranges().size() + 1); Expression* missing_max = missing_index >= 0 ? IntLit::a(al->size()) : nullptr; for (int i = 0; i < ti.ranges().size(); ++i) { if (i != missing_index) { assert(ti.ranges()[i]->domain() != nullptr); args[i] = ti.ranges()[i]->domain(); if (missing_index >= 0) { missing_max = new BinOp(loc.introduce(), missing_max, BOT_IDIV, new Call(Location().introduce(), "card", {args[i]})); } } } if (missing_index >= 0) { args[missing_index] = new BinOp(loc.introduce(), IntLit::a(1), BOT_DOTDOT, missing_max); } args[args.size() - 1] = al; std::string name = "array" + std::to_string(ti.ranges().size()) + "d"; Call* c = new Call(al->loc().introduce(), name, args); if (al->dims() != 1) { c->addAnnotation(constants().ann.array_check_form); } return c; } void JSONParser::parseModel(Model* m, std::istream& is, bool isData) { // precondition: found T_OBJ_OPEN ASTStringMap knownIds; if (isData) { // Collect known VarDecl ids from model and includes class VarDeclVisitor : public ItemVisitor { private: ASTStringMap& _knownIds; public: VarDeclVisitor(ASTStringMap& knownIds) : _knownIds(knownIds) {} void vVarDeclI(VarDeclI* vdi) { VarDecl* vd = vdi->e(); _knownIds.emplace(vd->id()->str(), vd->ti()); } } _varDecls(knownIds); iter_items(_varDecls, m); } for (;;) { string ident = expectString(is); expectToken(is, T_COLON); auto it = knownIds.find(ident); bool possibleString = it == knownIds.end() || it->second->type().bt() != Type::BT_UNKNOWN; Expression* e = parseExp(is, isData, possibleString); if (ident[0] != '_' && (!isData || it != knownIds.end())) { if (e == nullptr) { // This is a nested object auto* subModel = new Model; parseModel(subModel, is, isData); auto* ii = new IncludeI(Location().introduce(), ident); ii->m(subModel, true); m->addItem(ii); } else { auto* al = e->dynamicCast(); if (it != knownIds.end() && al != nullptr) { if (it->second->isarray()) { // Add correct index sets if they are non-standard e = coerceArray(it->second, al); } else if (it->second->type().isSet()) { // Convert array to a set e = new Call(Location().introduce(), "array2set", {al}); } } auto* ai = new AssignI(e->loc().introduce(), ident, e); m->addItem(ai); } } Token next = readToken(is); if (next.t == T_OBJ_CLOSE) { break; } if (next.t != T_COMMA) { throw JSONError(_env, errLocation(), "cannot parse JSON file"); } } } void JSONParser::parse(Model* m, const std::string& filename0, bool isData) { _filename = filename0; ifstream is(FILE_PATH(_filename), ios::in); if (!is.good()) { throw JSONError(_env, Location().introduce(), "cannot open file " + _filename); } _line = 0; _column = 0; expectToken(is, T_OBJ_OPEN); parseModel(m, is, isData); expectEof(is); } void JSONParser::parseFromString(Model* m, const std::string& data, bool isData) { istringstream iss(data); _line = 0; _column = 0; expectToken(iss, T_OBJ_OPEN); parseModel(m, iss, isData); expectEof(iss); } namespace { bool is_json(std::istream& is) { while (is.good()) { char c = is.get(); if (c == '{') { return true; } if (c != ' ' && c != '\n' && c != '\t' && c != '\r') { return false; } } return false; } } // namespace bool JSONParser::stringIsJSON(const std::string& data) { std::istringstream iss(data); return is_json(iss); } bool JSONParser::fileIsJSON(const std::string& filename) { ifstream is(FILE_PATH(filename), ios::in); return is_json(is); } } // namespace MiniZinc libminizinc-2.5.3/lib/builtins.cpp0000644000175000017500000034700013757304533015607 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_e b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.e = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_f b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.f = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_i b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.i = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_b b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.b = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_s b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.s = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } void rb(EnvI& env, Model* m, const ASTString& id, const std::vector& t, FunctionI::builtin_str b, bool fromGlobals = false) { FunctionI* fi = m->matchFn(env, id, t, false); if (fi != nullptr) { fi->builtins.str = b; } else if (!fromGlobals) { std::ostringstream ss; ss << "no definition found for builtin " << id; throw InternalError(ss.str()); } } IntVal b_int_min(EnvI& env, Call* call) { switch (call->argCount()) { case 1: if (call->arg(0)->type().isSet()) { throw EvalError(env, call->arg(0)->loc(), "sets not supported"); } else { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "minimum of empty array is undefined"); } IntVal m = eval_int(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { m = std::min(m, eval_int(env, (*al)[i])); } return m; } case 2: { return std::min(eval_int(env, call->arg(0)), eval_int(env, call->arg(1))); } default: throw EvalError(env, Location(), "dynamic type error"); } } IntVal b_int_max(EnvI& env, Call* call) { switch (call->argCount()) { case 1: if (call->arg(0)->type().isSet()) { throw EvalError(env, call->arg(0)->loc(), "sets not supported"); } else { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "maximum of empty array is undefined"); } IntVal m = eval_int(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { m = std::max(m, eval_int(env, (*al)[i])); } return m; } case 2: { return std::max(eval_int(env, call->arg(0)), eval_int(env, call->arg(1))); } default: throw EvalError(env, Location(), "dynamic type error"); } } IntVal b_arg_min_bool(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "arg_min of empty array is undefined"); } assert(al->dims() == 1); for (unsigned int i = 0; i < al->size(); i++) { bool val = eval_bool(env, (*al)[i]); if (!val) { return IntVal(i) + al->min(0); } } return al->min(0); } IntVal b_arg_max_bool(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "arg_max of empty array is undefined"); } assert(al->dims() == 1); for (unsigned int i = 0; i < al->size(); i++) { bool val = eval_bool(env, (*al)[i]); if (val) { return IntVal(i) + al->min(0); } } return al->min(0); } IntVal b_arg_min_int(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "argmin of empty array is undefined"); } assert(al->dims() == 1); IntVal m = eval_int(env, (*al)[0]); unsigned int m_idx = 0; for (unsigned int i = 1; i < al->size(); i++) { IntVal mi = eval_int(env, (*al)[i]); if (mi < m) { m = mi; m_idx = i; } } return IntVal(m_idx) + al->min(0); } IntVal b_arg_max_int(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "argmax of empty array is undefined"); } assert(al->dims() == 1); IntVal m = eval_int(env, (*al)[0]); unsigned int m_idx = 0; for (unsigned int i = 1; i < al->size(); i++) { IntVal mi = eval_int(env, (*al)[i]); if (mi > m) { m = mi; m_idx = i; } } return IntVal(m_idx) + al->min(0); } IntVal b_arg_min_float(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "argmin of empty array is undefined"); } assert(al->dims() == 1); FloatVal m = eval_float(env, (*al)[0]); unsigned int m_idx = 0; for (unsigned int i = 1; i < al->size(); i++) { FloatVal mi = eval_float(env, (*al)[i]); if (mi < m) { m = mi; m_idx = i; } } return IntVal(m_idx) + al->min(0); } IntVal b_arg_max_float(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw ResultUndefinedError(env, al->loc(), "argmax of empty array is undefined"); } assert(al->dims() == 1); FloatVal m = eval_float(env, (*al)[0]); unsigned int m_idx = 0; for (unsigned int i = 1; i < al->size(); i++) { FloatVal mi = eval_float(env, (*al)[i]); if (mi > m) { m = mi; m_idx = i; } } return IntVal(m_idx) + al->min(0); } IntVal b_abs_int(EnvI& env, Call* call) { assert(call->argCount() == 1); return std::abs(eval_int(env, call->arg(0))); } FloatVal b_abs_float(EnvI& env, Call* call) { assert(call->argCount() == 1); return std::abs(eval_float(env, call->arg(0))); } bool b_has_bounds_int(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } IntBounds ib = compute_int_bounds(env, call->arg(0)); return ib.valid && ib.l.isFinite() && ib.u.isFinite(); } bool b_has_bounds_float(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } FloatBounds fb = compute_float_bounds(env, call->arg(0)); return fb.valid; } IntVal lb_varoptint(EnvI& env, Expression* e) { IntBounds b = compute_int_bounds(env, e); if (b.valid) { return b.l; } return -IntVal::infinity(); } IntVal b_lb_varoptint(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } return lb_varoptint(env, call->arg(0)); } bool b_occurs(EnvI& env, Call* call) { GCLock lock; return eval_par(env, call->arg(0)) != constants().absent; } IntVal b_deopt_int(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return eval_int(env, e); } bool b_deopt_bool(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return eval_bool(env, e); } FloatVal b_deopt_float(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return eval_float(env, e); } IntSetVal* b_deopt_intset(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return eval_intset(env, e); } std::string b_deopt_string(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return eval_string(env, e); } Expression* b_deopt_expr(EnvI& env, Call* call) { GCLock lock; Expression* e = eval_par(env, call->arg(0)); if (e == constants().absent) { throw EvalError(env, e->loc(), "cannot evaluate deopt on absent value"); } return e; }; IntVal b_array_lb_int(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* e = follow_id_to_decl(call->arg(0)); bool foundMin = false; IntVal array_lb = -IntVal::infinity(); if (auto* vd = e->dynamicCast()) { if (vd->ti()->domain() != nullptr) { GCLock lock; IntSetVal* isv = eval_intset(env, vd->ti()->domain()); if (isv->size() != 0) { array_lb = isv->min(); foundMin = true; } } e = vd->e(); } if (e != nullptr) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->size() == 0) { throw EvalError(env, Location(), "lower bound of empty array undefined"); } IntVal min = IntVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { IntBounds ib = compute_int_bounds(env, (*al)[i]); if (!ib.valid) { goto b_array_lb_int_done; } min = std::min(min, ib.l); } if (foundMin) { array_lb = std::max(array_lb, min); } else { array_lb = min; } foundMin = true; } b_array_lb_int_done: if (foundMin) { return array_lb; } else { return -IntVal::infinity(); } } IntVal ub_varoptint(EnvI& env, Expression* e) { IntBounds b = compute_int_bounds(env, e); if (b.valid) { return b.u; } return IntVal::infinity(); } IntVal b_ub_varoptint(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } return ub_varoptint(env, call->arg(0)); } IntVal b_array_ub_int(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* e = follow_id_to_decl(call->arg(0)); bool foundMax = false; IntVal array_ub = IntVal::infinity(); if (auto* vd = e->dynamicCast()) { if (vd->ti()->domain() != nullptr) { GCLock lock; IntSetVal* isv = eval_intset(env, vd->ti()->domain()); if (isv->size() != 0) { array_ub = isv->max(); foundMax = true; } } e = vd->e(); } if (e != nullptr) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->size() == 0) { throw EvalError(env, Location(), "upper bound of empty array undefined"); } IntVal max = -IntVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { IntBounds ib = compute_int_bounds(env, (*al)[i]); if (!ib.valid) { goto b_array_ub_int_done; } max = std::max(max, ib.u); } if (foundMax) { array_ub = std::min(array_ub, max); } else { array_ub = max; } foundMax = true; } b_array_ub_int_done: if (foundMax) { return array_ub; } else { return IntVal::infinity(); } } IntVal b_idiv(EnvI& env, Call* call) { assert(call->argCount() == 2); IntVal a = eval_int(env, call->arg(0)); IntVal b = eval_int(env, call->arg(1)); if (b == 0) { throw ResultUndefinedError(env, call->loc(), "division by zero"); } return a / b; } IntVal b_mod(EnvI& env, Call* call) { assert(call->argCount() == 2); IntVal a = eval_int(env, call->arg(0)); IntVal b = eval_int(env, call->arg(1)); if (b == 0) { throw ResultUndefinedError(env, call->loc(), "division by zero"); } return a % b; } FloatVal b_fdiv(EnvI& env, Call* call) { assert(call->argCount() == 2); FloatVal a = eval_float(env, call->arg(0)); FloatVal b = eval_float(env, call->arg(1)); if (b == 0.0) { throw ResultUndefinedError(env, call->loc(), "division by zero"); } return a / b; } IntSetVal* b_dotdot(EnvI& env, Call* call) { assert(call->argCount() == 2); IntVal a = eval_int(env, call->arg(0)); IntVal b = eval_int(env, call->arg(1)); return IntSetVal::a(a, b); } IntVal b_sum_int(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return 0; } IntVal m = 0; for (unsigned int i = 0; i < al->size(); i++) { m += eval_int(env, (*al)[i]); } return m; } IntVal b_product_int(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return 1; } IntVal m = 1; for (unsigned int i = 0; i < al->size(); i++) { m *= eval_int(env, (*al)[i]); } return m; } FloatVal b_product_float(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return 1; } FloatVal m = 1.0; for (unsigned int i = 0; i < al->size(); i++) { m *= eval_float(env, (*al)[i]); } return m; } FloatVal lb_varoptfloat(EnvI& env, Expression* e) { FloatBounds b = compute_float_bounds(env, e); if (b.valid) { return b.l; } throw EvalError(env, e->loc(), "cannot determine bounds"); } FloatVal ub_varoptfloat(EnvI& env, Expression* e) { FloatBounds b = compute_float_bounds(env, e); if (b.valid) { return b.u; } throw EvalError(env, e->loc(), "cannot determine bounds"); } FloatVal b_lb_varoptfloat(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } return lb_varoptfloat(env, call->arg(0)); } FloatVal b_ub_varoptfloat(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "dynamic type error"); } return ub_varoptfloat(env, call->arg(0)); } FloatVal b_array_lb_float(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* e = follow_id_to_decl(call->arg(0)); bool foundMin = false; FloatVal array_lb = 0.0; if (auto* vd = e->dynamicCast()) { if (vd->ti()->domain() != nullptr) { FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); array_lb = fsv->min(); foundMin = true; } e = vd->e(); } if (e != nullptr) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->size() == 0) { throw EvalError(env, Location(), "lower bound of empty array undefined"); } bool min_valid = false; FloatVal min = 0.0; for (unsigned int i = 0; i < al->size(); i++) { FloatBounds fb = compute_float_bounds(env, (*al)[i]); if (!fb.valid) { goto b_array_lb_float_done; } if (min_valid) { min = std::min(min, fb.l); } else { min_valid = true; min = fb.l; } } assert(min_valid); if (foundMin) { array_lb = std::max(array_lb, min); } else { array_lb = min; } foundMin = true; } b_array_lb_float_done: if (foundMin) { return array_lb; } else { throw EvalError(env, e->loc(), "cannot determine lower bound"); } } FloatVal b_array_ub_float(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* e = follow_id_to_decl(call->arg(0)); bool foundMax = false; FloatVal array_ub = 0.0; if (auto* vd = e->dynamicCast()) { if (vd->ti()->domain() != nullptr) { FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); array_ub = fsv->max(); foundMax = true; } e = vd->e(); } if (e != nullptr) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->size() == 0) { throw EvalError(env, Location(), "upper bound of empty array undefined"); } bool max_valid = false; FloatVal max = 0.0; for (unsigned int i = 0; i < al->size(); i++) { FloatBounds fb = compute_float_bounds(env, (*al)[i]); if (!fb.valid) { goto b_array_ub_float_done; } if (max_valid) { max = std::max(max, fb.u); } else { max_valid = true; max = fb.u; } } assert(max_valid); if (foundMax) { array_ub = std::min(array_ub, max); } else { array_ub = max; } foundMax = true; } b_array_ub_float_done: if (foundMax) { return array_ub; } else { throw EvalError(env, e->loc(), "cannot determine upper bound"); } } FloatVal b_sum_float(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return 0; } FloatVal m = 0; for (unsigned int i = 0; i < al->size(); i++) { m += eval_float(env, (*al)[i]); } return m; } FloatVal b_float_min(EnvI& env, Call* call) { switch (call->argCount()) { case 1: if (call->arg(0)->type().isSet()) { throw EvalError(env, call->arg(0)->loc(), "sets not supported"); } else { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw EvalError(env, al->loc(), "min on empty array undefined"); } FloatVal m = eval_float(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { m = std::min(m, eval_float(env, (*al)[i])); } return m; } case 2: { return std::min(eval_float(env, call->arg(0)), eval_float(env, call->arg(1))); } default: throw EvalError(env, Location(), "dynamic type error"); } } FloatVal b_float_max(EnvI& env, Call* call) { switch (call->argCount()) { case 1: if (call->arg(0)->type().isSet()) { throw EvalError(env, call->arg(0)->loc(), "sets not supported"); } else { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw EvalError(env, al->loc(), "max on empty array undefined"); } FloatVal m = eval_float(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { m = std::max(m, eval_float(env, (*al)[i])); } return m; } case 2: { return std::max(eval_float(env, call->arg(0)), eval_float(env, call->arg(1))); } default: throw EvalError(env, Location(), "dynamic type error"); } } IntSetVal* b_index_set(EnvI& env, Expression* e, int i) { if (e->eid() != Expression::E_ID) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->dims() < i) { throw EvalError(env, e->loc(), "index_set: wrong dimension"); } return IntSetVal::a(al->min(i - 1), al->max(i - 1)); } Id* id = e->cast(); if (id->decl() == nullptr) { throw EvalError(env, id->loc(), "undefined identifier"); } if ((id->decl()->ti()->ranges().size() == 1 && id->decl()->ti()->ranges()[0]->domain() != nullptr && id->decl()->ti()->ranges()[0]->domain()->isa()) || (static_cast(id->decl()->ti()->ranges().size()) >= i && (id->decl()->ti()->ranges()[i - 1]->domain() == nullptr || id->decl()->ti()->ranges()[i - 1]->domain()->isa()))) { GCLock lock; ArrayLit* al = eval_array_lit(env, id); if (al->dims() < i) { throw EvalError(env, id->loc(), "index_set: wrong dimension"); } return IntSetVal::a(al->min(i - 1), al->max(i - 1)); } if (static_cast(id->decl()->ti()->ranges().size()) < i) { throw EvalError(env, id->loc(), "index_set: wrong dimension"); } return eval_intset(env, id->decl()->ti()->ranges()[i - 1]->domain()); } bool b_index_sets_agree(EnvI& env, Call* call) { if (call->argCount() != 2) { throw EvalError(env, Location(), "index_sets_agree needs exactly two arguments"); } GCLock lock; ArrayLit* al0 = eval_array_lit(env, call->arg(0)); ArrayLit* al1 = eval_array_lit(env, call->arg(1)); if (al0->type().dim() != al1->type().dim()) { return false; } for (int i = 1; i <= al0->type().dim(); i++) { IntSetVal* index0 = b_index_set(env, al0, i); IntSetVal* index1 = b_index_set(env, al1, i); if (!index0->equal(index1)) { return false; } } return true; } IntSetVal* b_index_set1(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 1); } IntSetVal* b_index_set2(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 2); } IntSetVal* b_index_set3(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 3); } IntSetVal* b_index_set4(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 4); } IntSetVal* b_index_set5(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 5); } IntSetVal* b_index_set6(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "index_set needs exactly one argument"); } return b_index_set(env, call->arg(0), 6); } IntVal b_min_parsetint(EnvI& env, Call* call) { assert(call->argCount() == 1); IntSetVal* isv = eval_intset(env, call->arg(0)); return isv->min(); } IntVal b_max_parsetint(EnvI& env, Call* call) { assert(call->argCount() == 1); IntSetVal* isv = eval_intset(env, call->arg(0)); return isv->max(); } IntSetVal* b_lb_set(EnvI& env, Call* e) { Expression* ee = follow_id_to_value(e->arg(0)); if (ee->type().isPar()) { return eval_intset(env, ee); } return IntSetVal::a(); } IntSetVal* b_ub_set(EnvI& env, Expression* e) { IntSetVal* isv = compute_intset_bounds(env, e); if (isv != nullptr) { return isv; } throw EvalError(env, e->loc(), "cannot determine bounds of set expression"); } IntSetVal* b_ub_set(EnvI& env, Call* call) { assert(call->argCount() == 1); return b_ub_set(env, call->arg(0)); } bool b_has_ub_set(EnvI& env, Call* call) { Expression* e = call->arg(0); for (;;) { switch (e->eid()) { case Expression::E_SETLIT: return true; case Expression::E_ID: { Id* id = e->cast(); if (id->decl() == nullptr) { throw EvalError(env, id->loc(), "undefined identifier"); } if (id->decl()->e() == nullptr) { return id->decl()->ti()->domain() != nullptr; } e = id->decl()->e(); } break; default: throw EvalError(env, e->loc(), "invalid argument to has_ub_set"); } } } IntSetVal* b_array_ub_set(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { throw EvalError(env, Location(), "upper bound of empty array undefined"); } IntSetVal* ub = b_ub_set(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { IntSetRanges isr(ub); IntSetRanges r(b_ub_set(env, (*al)[i])); Ranges::Union u(isr, r); ub = IntSetVal::ai(u); } return ub; } IntSetVal* b_dom_varint(EnvI& env, Expression* e) { Id* lastid = nullptr; Expression* cur = e; for (;;) { if (cur == nullptr) { if (lastid == nullptr || lastid->decl()->ti()->domain() == nullptr) { IntBounds b = compute_int_bounds(env, e); if (b.valid) { return IntSetVal::a(b.l, b.u); } return IntSetVal::a(-IntVal::infinity(), IntVal::infinity()); } return eval_intset(env, lastid->decl()->ti()->domain()); } switch (cur->eid()) { case Expression::E_INTLIT: { IntVal v = cur->cast()->v(); return IntSetVal::a(v, v); } case Expression::E_ID: { lastid = cur->cast(); if (lastid == constants().absent) { return IntSetVal::a(-IntVal::infinity(), IntVal::infinity()); } if (lastid->decl() == nullptr) { throw EvalError(env, lastid->loc(), "undefined identifier"); } cur = lastid->decl()->e(); } break; case Expression::E_ARRAYACCESS: { bool success; cur = eval_arrayaccess(env, cur->cast(), success); if (!success) { cur = nullptr; } } break; default: cur = nullptr; break; } } } IntSetVal* b_dom_varint(EnvI& env, Call* call) { assert(call->argCount() == 1); return b_dom_varint(env, call->arg(0)); } IntSetVal* b_dom_bounds_array(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* arg_e = call->arg(0); Expression* e = follow_id_to_decl(arg_e); bool foundBounds = false; IntVal array_lb = -IntVal::infinity(); IntVal array_ub = IntVal::infinity(); if (auto* vd = e->dynamicCast()) { if (vd->ti()->domain() != nullptr) { GCLock lock; IntSetVal* isv = eval_intset(env, vd->ti()->domain()); if (isv->size() != 0) { array_lb = isv->min(); array_ub = isv->max(); foundBounds = true; } } e = vd->e(); if (e == nullptr) { e = vd->flat()->e(); } } if (foundBounds) { return IntSetVal::a(array_lb, array_ub); } if (e != nullptr) { GCLock lock; ArrayLit* al = eval_array_lit(env, e); if (al->size() == 0) { throw EvalError(env, Location(), "lower bound of empty array undefined"); } IntVal min = IntVal::infinity(); IntVal max = -IntVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { IntBounds ib = compute_int_bounds(env, (*al)[i]); if (!ib.valid) { goto b_array_lb_int_done; } min = std::min(min, ib.l); max = std::max(max, ib.u); } array_lb = std::max(array_lb, min); array_ub = std::min(array_ub, max); foundBounds = true; } b_array_lb_int_done: if (foundBounds) { return IntSetVal::a(array_lb, array_ub); } else { throw EvalError(env, e->loc(), "cannot determine lower bound"); } } IntSetVal* b_dom_array(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* ae = call->arg(0); ArrayLit* al = nullptr; while (al == nullptr) { switch (ae->eid()) { case Expression::E_ARRAYLIT: al = ae->cast(); break; case Expression::E_ID: { Id* id = ae->cast(); if (id->decl() == nullptr) { throw EvalError(env, id->loc(), "undefined identifier"); } if (id->decl()->e() == nullptr) { if (id->decl()->flat() == nullptr) { throw EvalError(env, id->loc(), "array without initialiser"); } if (id->decl()->flat()->e() == nullptr) { throw EvalError(env, id->loc(), "array without initialiser"); } ae = id->decl()->flat()->e(); } else { ae = id->decl()->e(); } } break; default: throw EvalError(env, ae->loc(), "invalid argument to dom"); } } if (al->size() == 0) { return IntSetVal::a(); } IntSetVal* isv = b_dom_varint(env, (*al)[0]); for (unsigned int i = 1; i < al->size(); i++) { IntSetRanges isr(isv); IntSetRanges r(b_dom_varint(env, (*al)[i])); Ranges::Union u(isr, r); isv = IntSetVal::ai(u); } return isv; } IntSetVal* b_compute_div_bounds(EnvI& env, Call* call) { assert(call->argCount() == 2); IntBounds bx = compute_int_bounds(env, call->arg(0)); if (!bx.valid) { throw EvalError(env, call->arg(0)->loc(), "cannot determine bounds"); } /// TODO: better bounds if only some input bounds are infinite if (!bx.l.isFinite() || !bx.u.isFinite()) { return constants().infinity->isv(); } IntBounds by = compute_int_bounds(env, call->arg(1)); if (!by.valid) { throw EvalError(env, call->arg(1)->loc(), "cannot determine bounds"); } if (!by.l.isFinite() || !by.u.isFinite()) { return constants().infinity->isv(); } Ranges::Const byr(by.l, by.u); Ranges::Const by0(0, 0); Ranges::Diff, Ranges::Const> byr0(byr, by0); IntVal min = IntVal::maxint(); IntVal max = IntVal::minint(); if (byr0()) { min = std::min(min, bx.l / byr0.min()); min = std::min(min, bx.l / byr0.max()); min = std::min(min, bx.u / byr0.min()); min = std::min(min, bx.u / byr0.max()); max = std::max(max, bx.l / byr0.min()); max = std::max(max, bx.l / byr0.max()); max = std::max(max, bx.u / byr0.min()); max = std::max(max, bx.u / byr0.max()); ++byr0; if (byr0()) { min = std::min(min, bx.l / byr0.min()); min = std::min(min, bx.l / byr0.max()); min = std::min(min, bx.u / byr0.min()); min = std::min(min, bx.u / byr0.max()); max = std::max(max, bx.l / byr0.min()); max = std::max(max, bx.l / byr0.max()); max = std::max(max, bx.u / byr0.min()); max = std::max(max, bx.u / byr0.max()); } } return IntSetVal::a(min, max); } // NOLINTNEXTLINE(readability-identifier-naming) ArrayLit* b_arrayXd(EnvI& env, Call* call, int d) { GCLock lock; bool check_form = call->ann().contains(constants().ann.array_check_form); ArrayLit* al = eval_array_lit(env, call->arg(d)); std::vector> dims(d); unsigned int dim1d = 1; if (check_form && d != al->dims()) { std::ostringstream ss; ss << "number of dimensions of original array (" << al->dims() << ") does not match the given number of index sets (" << d << ")"; throw EvalError(env, call->loc(), ss.str()); } for (int i = 0; i < d; i++) { IntSetVal* di = eval_intset(env, call->arg(i)); if (di->size() == 0) { dims[i] = std::pair(1, 0); dim1d = 0; } else if (di->size() != 1) { throw EvalError(env, call->arg(i)->loc(), "arrayXd only defined for ranges"); } else { dims[i] = std::pair(static_cast(di->min(0).toInt()), static_cast(di->max(0).toInt())); dim1d *= dims[i].second - dims[i].first + 1; if (check_form && dims[i].second - dims[i].first != al->max(i) - al->min(i)) { std::ostringstream ss; ss << "index set " << i + 1 << " (" << dims[i].first << ".." << dims[i].second << ") does not match index set " << i + 1 << " of original array (" << al->min(i) << ".." << al->max(i) << ")"; throw EvalError(env, call->arg(i)->loc(), ss.str()); } } } if (dim1d != al->size()) { throw EvalError(env, al->loc(), "mismatch in array dimensions"); } auto* ret = new ArrayLit(al->loc(), *al, dims); Type t = al->type(); t.dim(d); ret->type(t); ret->flat(al->flat()); return ret; } Expression* b_array1d_list(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->dims() == 1 && al->min(0) == 1) { return call->arg(0)->isa() ? call->arg(0) : al; } auto* ret = new ArrayLit(al->loc(), *al); Type t = al->type(); t.dim(1); ret->type(t); ret->flat(al->flat()); return ret; } Expression* b_array1d(EnvI& env, Call* call) { return b_arrayXd(env, call, 1); } Expression* b_array2d(EnvI& env, Call* call) { return b_arrayXd(env, call, 2); } Expression* b_array3d(EnvI& env, Call* call) { return b_arrayXd(env, call, 3); } Expression* b_array4d(EnvI& env, Call* call) { return b_arrayXd(env, call, 4); } Expression* b_array5d(EnvI& env, Call* call) { return b_arrayXd(env, call, 5); } Expression* b_array6d(EnvI& env, Call* call) { return b_arrayXd(env, call, 6); } // NOLINTNEXTLINE(readability-identifier-naming) Expression* b_arrayXd(EnvI& env, Call* call) { GCLock lock; ArrayLit* al0 = eval_array_lit(env, call->arg(0)); ArrayLit* al1 = eval_array_lit(env, call->arg(1)); if (al0->dims() == al1->dims()) { bool sameDims = true; for (unsigned int i = al0->dims(); (i--) != 0U;) { if (al0->min(i) != al1->min(i) || al0->max(i) != al1->max(i)) { sameDims = false; break; } } if (sameDims) { return call->arg(1)->isa() ? call->arg(1) : al1; } } std::vector> dims(al0->dims()); for (unsigned int i = al0->dims(); (i--) != 0U;) { dims[i] = std::make_pair(al0->min(i), al0->max(i)); } auto* ret = new ArrayLit(al1->loc(), *al1, dims); Type t = al1->type(); t.dim(static_cast(dims.size())); ret->type(t); ret->flat(al1->flat()); return ret; } IntVal b_length(EnvI& env, Call* call) { GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); return al->size(); } IntVal b_bool2int(EnvI& env, Call* call) { return eval_bool(env, call->arg(0)) ? 1 : 0; } bool b_forall_par(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "forall needs exactly one argument"); } GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); for (unsigned int i = al->size(); (i--) != 0U;) { if (!eval_bool(env, (*al)[i])) { return false; } } return true; } bool b_exists_par(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "exists needs exactly one argument"); } GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); for (unsigned int i = al->size(); (i--) != 0U;) { if (eval_bool(env, (*al)[i])) { return true; } } return false; } bool b_clause_par(EnvI& env, Call* call) { if (call->argCount() != 2) { throw EvalError(env, Location(), "clause needs exactly two arguments"); } GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); for (unsigned int i = al->size(); (i--) != 0U;) { if (eval_bool(env, (*al)[i])) { return true; } } al = eval_array_lit(env, call->arg(1)); for (unsigned int i = al->size(); (i--) != 0U;) { if (!eval_bool(env, (*al)[i])) { return true; } } return false; } bool b_xorall_par(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "xorall needs exactly one argument"); } GCLock lock; int count = 0; ArrayLit* al = eval_array_lit(env, call->arg(0)); for (unsigned int i = al->size(); (i--) != 0U;) { count += static_cast(eval_bool(env, (*al)[i])); } return count % 2 == 1; } bool b_iffall_par(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "xorall needs exactly one argument"); } GCLock lock; int count = 0; ArrayLit* al = eval_array_lit(env, call->arg(0)); for (unsigned int i = al->size(); (i--) != 0U;) { count += static_cast(eval_bool(env, (*al)[i])); } return count % 2 == 0; } bool b_not_par(EnvI& env, Call* call) { assert(call->argCount() == 1); return !eval_bool(env, call->arg(0)); } IntVal b_card(EnvI& env, Call* call) { if (call->argCount() != 1) { throw EvalError(env, Location(), "card needs exactly one argument"); } IntSetVal* isv = eval_intset(env, call->arg(0)); IntSetRanges isr(isv); return Ranges::cardinality(isr); } Expression* exp_is_fixed(EnvI& env, Expression* e) { GCLock lock; Expression* cur = e; for (;;) { if (cur == nullptr) { return nullptr; } if (cur->type().isPar()) { return eval_par(env, cur); } switch (cur->eid()) { case Expression::E_ID: cur = cur->cast()->decl(); break; case Expression::E_VARDECL: if (cur->type().st() != Type::ST_SET) { Expression* dom = cur->cast()->ti()->domain(); if ((dom != nullptr) && (dom->isa() || dom->isa() || dom->isa())) { return dom; } if ((dom != nullptr) && dom->isa()) { auto* sl = dom->cast(); auto* isv = sl->isv(); if ((isv != nullptr) && isv->min() == isv->max()) { return IntLit::a(isv->min()); } auto* fsv = sl->fsv(); if ((fsv != nullptr) && fsv->min() == fsv->max()) { return FloatLit::a(fsv->min()); } } } cur = cur->cast()->e(); break; default: return nullptr; } } } bool b_is_fixed(EnvI& env, Call* call) { assert(call->argCount() == 1); return exp_is_fixed(env, call->arg(0)) != nullptr; } bool b_is_fixed_array(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return true; } for (unsigned int i = 0; i < al->size(); i++) { if (exp_is_fixed(env, (*al)[i]) == nullptr) { return false; } } return true; } bool b_is_same(EnvI& env, Call* call) { assert(call->argCount() == 2); return follow_id_to_decl(call->arg(0)) == follow_id_to_decl(call->arg(1)); } Expression* b_fix(EnvI& env, Call* call) { assert(call->argCount() == 1); Expression* ret = exp_is_fixed(env, call->arg(0)); if (ret == nullptr) { throw EvalError(env, call->arg(0)->loc(), "expression is not fixed"); } return ret; } IntVal b_fix_int(EnvI& env, Call* call) { return eval_int(env, b_fix(env, call)); } bool b_fix_bool(EnvI& env, Call* call) { return eval_bool(env, b_fix(env, call)); } FloatVal b_fix_float(EnvI& env, Call* call) { return eval_float(env, b_fix(env, call)); } IntSetVal* b_fix_set(EnvI& env, Call* call) { return eval_intset(env, b_fix(env, call)); } Expression* b_fix_array(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); std::vector fixed(al->size()); for (unsigned int i = 0; i < fixed.size(); i++) { fixed[i] = exp_is_fixed(env, (*al)[i]); if (fixed[i] == nullptr) { throw EvalError(env, (*al)[i]->loc(), "expression is not fixed"); } } auto* ret = new ArrayLit(Location(), fixed); Type tt = al->type(); tt.ti(Type::TI_PAR); ret->type(tt); return ret; } bool b_has_ann(EnvI& env, Call* call) { assert(call->argCount() == 2); Expression* expr = call->arg(0); if (!expr->isa()) { // Argument is a literal, unable to verify annotations return false; } expr = follow_id_to_decl(expr); Expression* ann = call->arg(1); if (ann->isa()) { return expr->ann().contains(ann); } auto* key = ann->cast(); if (Call* c = expr->ann().getCall(key->id())) { if (c->argCount() != key->argCount()) { return false; } for (int i = 0; i < c->argCount(); ++i) { if (c->arg(i)->type() != key->arg(i)->type()) { return false; } if (c->arg(i)->type().isPar()) { GCLock lock; Expression* check_eq = new BinOp(Location().introduce(), c->arg(i), BOT_EQ, key->arg(i)); check_eq->type(Type::parbool()); if (!eval_bool(env, check_eq)) { return false; } } else { if (c->arg(i)->isa() && key->arg(i)->isa()) { if (follow_id_to_decl(c->arg(i)) != follow_id_to_decl(key->arg(i))) { return false; } } else { throw EvalError(env, call->loc(), "Unable to determine equality of variable expressions"); } } } return true; } return false; } bool b_annotate(EnvI& env, Call* call) { assert(call->argCount() == 2); Expression* expr = call->arg(0); if (!expr->isa()) { // Argument is a literal, unable to annotate std::ostringstream ss; ss << "Unable to annotate literal expression `" << *expr << "'."; env.addWarning(ss.str()); return true; } auto* var_decl = follow_id_to_decl(expr)->cast(); // Add annotation Expression* ann = call->arg(1); var_decl->ann().add(ann); // Increase usage count of the annotation if (auto* ann_decl = follow_id_to_decl(ann)->dynamicCast()) { auto var_it = env.varOccurrences.idx.find(var_decl->id()); assert(var_it != env.varOccurrences.idx.end()); env.varOccurrences.add(ann_decl, (*env.flat())[var_it->second]); } return true; } FloatVal b_int2float(EnvI& env, Call* call) { return eval_int(env, call->arg(0)); } IntVal b_ceil(EnvI& env, Call* call) { return static_cast(std::ceil(eval_float(env, call->arg(0)))); } IntVal b_floor(EnvI& env, Call* call) { return static_cast(std::floor(eval_float(env, call->arg(0)))); } IntVal b_round(EnvI& env, Call* call) { /// Cast to int truncates, so cannot just add 0.5 and cast return {static_cast(std::round(eval_float(env, call->arg(0)).toDouble()))}; } FloatVal b_log10(EnvI& env, Call* call) { return std::log10(eval_float(env, call->arg(0)).toDouble()); } FloatVal b_log2(EnvI& env, Call* call) { return std::log(eval_float(env, call->arg(0)).toDouble()) / std::log(2.0); } FloatVal b_ln(EnvI& env, Call* call) { return std::log(eval_float(env, call->arg(0)).toDouble()); } FloatVal b_log(EnvI& env, Call* call) { return std::log(eval_float(env, call->arg(1)).toDouble()) / std::log(eval_float(env, call->arg(0)).toDouble()); } FloatVal b_exp(EnvI& env, Call* call) { return std::exp(eval_float(env, call->arg(0)).toDouble()); } FloatVal b_pow(EnvI& env, Call* call) { return std::pow(eval_float(env, call->arg(0)).toDouble(), eval_float(env, call->arg(1)).toDouble()); } IntVal b_pow_int(EnvI& env, Call* call) { IntVal p = eval_int(env, call->arg(0)); IntVal r = 1; long long int e = eval_int(env, call->arg(1)).toInt(); if (e < 0) { throw EvalError(env, call->arg(1)->loc(), "Cannot raise integer to a negative power"); } for (long long int i = e; (i--) != 0;) { r = r * p; } return r; } FloatVal b_sqrt(EnvI& env, Call* call) { return std::sqrt(eval_float(env, call->arg(0)).toDouble()); } bool b_assert_bool(EnvI& env, Call* call) { assert(call->argCount() == 2); GCLock lock; Expression* cond_e; if (call->arg(0)->type().cv()) { Ctx ctx; ctx.b = C_MIX; cond_e = flat_cv_exp(env, ctx, call->arg(0))(); } else { cond_e = call->arg(0); } if (eval_bool(env, cond_e)) { return true; } Expression* msg_e; if (call->arg(1)->type().cv()) { msg_e = flat_cv_exp(env, Ctx(), call->arg(1))(); } else { msg_e = call->arg(1); } std::ostringstream ss; ss << "Assertion failed: " << eval_string(env, msg_e); throw EvalError(env, call->arg(0)->loc(), ss.str()); } Expression* b_assert(EnvI& env, Call* call) { assert(call->argCount() == 3); GCLock lock; Expression* cond_e; if (call->arg(0)->type().cv()) { Ctx ctx; ctx.b = C_MIX; cond_e = flat_cv_exp(env, ctx, call->arg(0))(); } else { cond_e = call->arg(0); } if (eval_bool(env, cond_e)) { return call->arg(2); } Expression* msg_e; if (call->arg(1)->type().cv()) { msg_e = flat_cv_exp(env, Ctx(), call->arg(1))(); } else { msg_e = call->arg(1); } std::ostringstream ss; ss << "Assertion failed: " << eval_string(env, msg_e); throw EvalError(env, call->arg(0)->loc(), ss.str()); } Expression* b_mzn_deprecate(EnvI& env, Call* call) { assert(call->argCount() == 4); GCLock lock; std::string fnName = eval_string(env, call->arg(0)); if (env.deprecationWarnings.find(fnName) == env.deprecationWarnings.end()) { env.deprecationWarnings.insert(fnName); env.dumpStack(env.errstream, false); env.errstream << " The function/predicate `" << fnName; env.errstream << "' was deprecated in MiniZinc version " << eval_string(env, call->arg(1)); env.errstream << ".\n More information can be found at " << eval_string(env, call->arg(2)) << ".\n"; } return call->arg(3); } bool b_abort(EnvI& env, Call* call) { GCLock lock; Expression* msg_e; if (call->arg(0)->type().cv()) { msg_e = flat_cv_exp(env, Ctx(), call->arg(0))(); } else { msg_e = call->arg(0); } std::ostringstream ss; ss << "Abort: " << eval_string(env, msg_e); throw EvalError(env, call->arg(0)->loc(), ss.str()); } Expression* b_mzn_symmetry_breaking_constraint(EnvI& env, Call* call) { GCLock lock; Call* check = new Call(Location().introduce(), ASTString("mzn_check_ignore_symmetry_breaking_constraints"), {}); check->type(Type::parbool()); check->decl(env.model->matchFn(env, check, false, true)); if (eval_bool(env, check)) { return constants().literalTrue; } Call* nc = new Call(call->loc(), ASTString("symmetry_breaking_constraint"), {call->arg(0)}); nc->type(Type::varbool()); nc->decl(env.model->matchFn(env, nc, false, true)); return nc; } Expression* b_mzn_redundant_constraint(EnvI& env, Call* call) { GCLock lock; Call* check = new Call(Location().introduce(), ASTString("mzn_check_ignore_redundant_constraints"), {}); check->type(Type::parbool()); check->decl(env.model->matchFn(env, check, false, true)); if (eval_bool(env, check)) { return constants().literalTrue; } Call* nc = new Call(call->loc(), ASTString("redundant_constraint"), {call->arg(0)}); nc->type(Type::varbool()); nc->decl(env.model->matchFn(env, nc, false, true)); return nc; } Expression* b_trace(EnvI& env, Call* call) { GCLock lock; Expression* msg_e; if (call->arg(0)->type().cv()) { msg_e = flat_cv_exp(env, Ctx(), call->arg(0))(); } else { msg_e = call->arg(0); } env.errstream << eval_string(env, msg_e); return call->argCount() == 1 ? constants().literalTrue : call->arg(1); } Expression* b_trace_stdout(EnvI& env, Call* call) { GCLock lock; Expression* msg_e; if (call->arg(0)->type().cv()) { msg_e = flat_cv_exp(env, Ctx(), call->arg(0))(); } else { msg_e = call->arg(0); } env.errstream << eval_string(env, msg_e); return call->argCount() == 1 ? constants().literalTrue : call->arg(1); } Expression* b_trace_logstream(EnvI& env, Call* call) { GCLock lock; StringLit* msg; if (call->arg(0)->type().cv()) { msg = flat_cv_exp(env, Ctx(), call->arg(0))()->cast(); } else { msg = eval_par(env, call->arg(0))->cast(); } env.logstream << msg->v(); return call->argCount() == 1 ? constants().literalTrue : call->arg(1); } std::string b_logstream(EnvI& env, Call* call) { return env.logstream.str(); } bool b_in_redundant_constraint(EnvI& env, Call* /*call*/) { return env.inRedundantConstraint > 0; } Expression* b_set2array(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; IntSetVal* isv = eval_intset(env, call->arg(0)); std::vector elems; IntSetRanges isr(isv); for (Ranges::ToValues isr_v(isr); isr_v(); ++isr_v) { elems.push_back(IntLit::a(isr_v.val())); } auto* al = new ArrayLit(call->arg(0)->loc(), elems); al->type(Type::parint(1)); return al; } IntVal b_string_length(EnvI& env, Call* call) { GCLock lock; std::string s = eval_string(env, call->arg(0)); return s.size(); } std::string show(EnvI& env, Expression* exp) { std::ostringstream oss; GCLock lock; Printer p(oss, 0, false); Expression* e = follow_id_to_decl(exp); if (auto* vd = e->dynamicCast()) { if ((vd->e() != nullptr) && !vd->e()->isa()) { e = vd->e(); } else { e = vd->id(); } } if (e->type().isPar()) { e = eval_par(env, e); } if (e->type().dim() > 0) { e = eval_array_lit(env, e); } if (auto* al = e->dynamicCast()) { oss << "["; for (unsigned int i = 0; i < al->size(); i++) { p.print((*al)[i]); if (i < al->size() - 1) { oss << ", "; } } oss << "]"; } else { p.print(e); } return oss.str(); } std::string b_show(EnvI& env, Call* call) { return show(env, call->arg(0)); } std::string b_show_dzn_id(EnvI& env, Call* call) { GCLock lock; std::string s = eval_string(env, call->arg(0)); size_t nonIdChar = s.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"); size_t nonIdBegin = s.find_first_of("0123456789_"); if (nonIdChar != std::string::npos || nonIdBegin == 0) { s = "'" + s + "'"; } return s; } std::string b_show_json_basic(EnvI& env, Expression* e) { std::ostringstream oss; Printer p(oss, 0, false); if (auto* sl = e->dynamicCast()) { oss << "{ \"set\" : ["; if (IntSetVal* isv = sl->isv()) { bool first = true; for (IntSetRanges isr(isv); isr(); ++isr) { if (first) { first = false; } else { oss << ","; } if (isr.min() == isr.max()) { oss << isr.min(); } else { oss << "[" << isr.min() << "," << isr.max() << "]"; } } } else if (FloatSetVal* fsv = sl->fsv()) { bool first = true; for (FloatSetRanges fsr(fsv); fsr(); ++fsr) { if (first) { first = false; } else { oss << ","; } if (fsr.min() == fsr.max()) { pp_floatval(oss, fsr.min()); } else { oss << "["; pp_floatval(oss, fsr.min()); oss << ","; pp_floatval(oss, fsr.max()); oss << "]"; } } } else { for (unsigned int i = 0; i < sl->v().size(); i++) { p.print(sl->v()[i]); if (i < sl->v().size() - 1) { oss << ","; } } } oss << "]}"; } else if (e == constants().absent) { oss << "null"; } else { p.print(e); } return oss.str(); } std::string b_show_json(EnvI& env, Call* call) { Expression* exp = call->arg(0); GCLock lock; Expression* e = eval_par(env, exp); if (e->type().isvar()) { std::ostringstream oss; Printer p(oss, 0, false); p.print(e); return oss.str(); } if (auto* al = e->dynamicCast()) { std::vector dims(al->dims() - 1); if (!dims.empty()) { dims[0] = al->max(al->dims() - 1) - al->min(al->dims() - 1) + 1; } for (int i = 1; i < al->dims() - 1; i++) { dims[i] = dims[i - 1] * (al->max(al->dims() - 1 - i) - al->min(al->dims() - 1 - i) + 1); } std::ostringstream oss; oss << "["; for (unsigned int i = 0; i < al->size(); i++) { for (unsigned int dim : dims) { if (i % dim == 0) { oss << "["; } } oss << b_show_json_basic(env, (*al)[i]); for (unsigned int dim : dims) { if (i % dim == dim - 1) { oss << "]"; } } if (i < al->size() - 1) { oss << ", "; } } oss << "]"; return oss.str(); } return b_show_json_basic(env, e); } Expression* b_output_json(EnvI& env, Call* call) { return create__json_output(env, false, false, false); } Expression* b_output_json_parameters(EnvI& env, Call* call) { std::vector outputVars; outputVars.push_back(new StringLit(Location().introduce(), "{\n")); class JSONParVisitor : public ItemVisitor { protected: EnvI& _e; std::vector& _outputVars; bool _firstVar; public: JSONParVisitor(EnvI& e, std::vector& outputVars) : _e(e), _outputVars(outputVars), _firstVar(true) {} void vVarDeclI(VarDeclI* vdi) { VarDecl* vd = vdi->e(); if (vd->ann().contains(constants().ann.rhs_from_assignment)) { std::ostringstream s; if (_firstVar) { _firstVar = false; } else { s << ",\n"; } s << " \"" << vd->id()->str() << "\"" << " : "; auto* sl = new StringLit(Location().introduce(), s.str()); _outputVars.push_back(sl); std::vector showArgs(1); showArgs[0] = vd->id(); Call* show = new Call(Location().introduce(), "showJSON", showArgs); show->type(Type::parstring()); FunctionI* fi = _e.model->matchFn(_e, show, false); assert(fi); show->decl(fi); _outputVars.push_back(show); } } } jsonov(env, outputVars); iter_items(jsonov, env.model); outputVars.push_back(new StringLit(Location().introduce(), "\n}\n")); return new ArrayLit(Location().introduce(), outputVars); } std::string b_format(EnvI& env, Call* call) { int width = 0; int prec = -1; GCLock lock; Expression* e; if (call->argCount() > 1) { width = static_cast(eval_int(env, call->arg(0)).toInt()); if (call->argCount() == 2) { e = eval_par(env, call->arg(1)); } else { assert(call->argCount() == 3); prec = static_cast(eval_int(env, call->arg(1)).toInt()); if (prec < 0) { throw EvalError(env, call->arg(1)->loc(), "output precision cannot be negative"); } e = eval_par(env, call->arg(2)); } } else { e = eval_par(env, call->arg(0)); } if (e->type() == Type::parint()) { long long int i = eval_int(env, e).toInt(); std::ostringstream formatted; if (width > 0) { formatted.width(width); } else if (width < 0) { formatted.width(-width); formatted.flags(std::ios::left); } if (prec != -1) { formatted.precision(prec); } formatted << i; return formatted.str(); } if (e->type() == Type::parfloat()) { FloatVal i = eval_float(env, e); std::ostringstream formatted; if (width > 0) { formatted.width(width); } else if (width < 0) { formatted.width(-width); formatted.flags(std::ios::left); } formatted.setf(std::ios::fixed); formatted.precision(std::numeric_limits::digits10 + 2); if (prec != -1) { formatted.precision(prec); } formatted << i; return formatted.str(); } std::string s = show(env, e); if (prec >= 0 && prec < s.size()) { s = s.substr(0, prec); } std::ostringstream oss; if (s.size() < std::abs(width)) { int addLeft = width < 0 ? 0 : (width - static_cast(s.size())); if (addLeft < 0) { addLeft = 0; } int addRight = width < 0 ? (-width - static_cast(s.size())) : 0; if (addRight < 0) { addRight = 0; } for (int i = addLeft; (i--) != 0;) { oss << " "; } oss << s; for (int i = addRight; (i--) != 0;) { oss << " "; } return oss.str(); } return s; } std::string b_format_justify_string(EnvI& env, Call* call) { int width = 0; GCLock lock; Expression* e; width = static_cast(eval_int(env, call->arg(0)).toInt()); e = eval_par(env, call->arg(1)); std::string s = eval_string(env, e); std::ostringstream oss; if (s.size() < std::abs(width)) { int addLeft = width < 0 ? 0 : (width - static_cast(s.size())); if (addLeft < 0) { addLeft = 0; } int addRight = width < 0 ? (-width - static_cast(s.size())) : 0; if (addRight < 0) { addRight = 0; } for (int i = addLeft; (i--) != 0;) { oss << " "; } oss << s; for (int i = addRight; (i--) != 0;) { oss << " "; } return oss.str(); } return s; } std::string b_show_int(EnvI& env, Call* call) { assert(call->argCount() == 2); GCLock lock; Expression* e = eval_par(env, call->arg(1)); std::ostringstream oss; if (auto* iv = e->dynamicCast()) { int justify = static_cast(eval_int(env, call->arg(0)).toInt()); std::ostringstream oss_length; oss_length << iv->v(); int iv_length = static_cast(oss_length.str().size()); int addLeft = justify < 0 ? 0 : (justify - iv_length); if (addLeft < 0) { addLeft = 0; } int addRight = justify < 0 ? (-justify - iv_length) : 0; if (addRight < 0) { addRight = 0; } for (int i = addLeft; (i--) != 0;) { oss << " "; } oss << iv->v(); for (int i = addRight; (i--) != 0;) { oss << " "; } } else { Printer p(oss, 0, false); p.print(e); } return oss.str(); } std::string b_show_float(EnvI& env, Call* call) { assert(call->argCount() == 3); GCLock lock; Expression* e = eval_par(env, call->arg(2)); std::ostringstream oss; if (auto* fv = e->dynamicCast()) { int justify = static_cast(eval_int(env, call->arg(0)).toInt()); int prec = static_cast(eval_int(env, call->arg(1)).toInt()); if (prec < 0) { throw EvalError(env, call->arg(1)->loc(), "number of digits in show_float cannot be negative"); } std::ostringstream oss_length; oss_length << std::setprecision(prec) << std::fixed << fv->v(); int fv_length = static_cast(oss_length.str().size()); int addLeft = justify < 0 ? 0 : (justify - fv_length); if (addLeft < 0) { addLeft = 0; } int addRight = justify < 0 ? (-justify - fv_length) : 0; if (addRight < 0) { addRight = 0; } for (int i = addLeft; (i--) != 0;) { oss << " "; } oss << std::setprecision(prec) << std::fixed << fv->v(); for (int i = addRight; (i--) != 0;) { oss << " "; } } else { Printer p(oss, 0, false); p.print(e); } return oss.str(); } std::string b_file_path(EnvI& /*env*/, Call* call) { return FileUtils::file_path( std::string(call->loc().filename().c_str(), call->loc().filename().size())); } std::string b_concat(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); std::ostringstream oss; for (unsigned int i = 0; i < al->size(); i++) { oss << eval_string(env, (*al)[i]); } return oss.str(); } std::string b_join(EnvI& env, Call* call) { assert(call->argCount() == 2); std::string sep = eval_string(env, call->arg(0)); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(1)); std::ostringstream oss; for (unsigned int i = 0; i < al->size(); i++) { oss << eval_string(env, (*al)[i]); if (i < al->size() - 1) { oss << sep; } } return oss.str(); } IntSetVal* b_array_union(EnvI& env, Call* call) { assert(call->argCount() == 1); ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return IntSetVal::a(); } IntSetVal* isv = eval_intset(env, (*al)[0]); for (unsigned int i = 0; i < al->size(); i++) { IntSetRanges i0(isv); IntSetRanges i1(eval_intset(env, (*al)[i])); Ranges::Union u(i0, i1); isv = IntSetVal::ai(u); } return isv; } IntSetVal* b_array_intersect(EnvI& env, Call* call) { assert(call->argCount() == 1); ArrayLit* al = eval_array_lit(env, call->arg(0)); std::vector ranges; if (al->size() > 0) { IntSetVal* i0 = eval_intset(env, (*al)[0]); if (i0->size() > 0) { IntSetRanges i0r(i0); IntVal min = i0r.min(); while (i0r()) { // Initialize with last interval IntVal max = i0r.max(); // Intersect with all other intervals restart: for (unsigned int j = al->size(); (j--) != 0U;) { IntSetRanges ij(eval_intset(env, (*al)[j])); // Skip intervals that are too small while (ij() && (ij.max() < min)) { ++ij; } if (!ij()) { goto done; } if (ij.min() > max) { min = ij.min(); max = ij.max(); goto restart; } // Now the intervals overlap if (min < ij.min()) { min = ij.min(); } if (max > ij.max()) { max = ij.max(); } } ranges.emplace_back(min, max); // The next interval must be at least two elements away min = max + 2; } done: return IntSetVal::a(ranges); } else { return IntSetVal::a(); } } else { return IntSetVal::a(); } } Expression* b_sort_by_int(EnvI& env, Call* call) { assert(call->argCount() == 2); ArrayLit* al = eval_array_lit(env, call->arg(0)); ArrayLit* order_e = eval_array_lit(env, call->arg(1)); std::vector order(order_e->size()); std::vector a(order_e->size()); for (unsigned int i = 0; i < order.size(); i++) { a[i] = i; order[i] = eval_int(env, (*order_e)[i]); } struct Ord { std::vector& order; Ord(std::vector& order0) : order(order0) {} bool operator()(int i, int j) { return order[i] < order[j]; } } _ord(order); std::stable_sort(a.begin(), a.end(), _ord); std::vector sorted(a.size()); for (auto i = static_cast(sorted.size()); (i--) != 0U;) { sorted[i] = (*al)[a[i]]; } auto* al_sorted = new ArrayLit(al->loc(), sorted); al_sorted->type(al->type()); return al_sorted; } Expression* b_sort_by_float(EnvI& env, Call* call) { assert(call->argCount() == 2); ArrayLit* al = eval_array_lit(env, call->arg(0)); ArrayLit* order_e = eval_array_lit(env, call->arg(1)); std::vector order(order_e->size()); std::vector a(order_e->size()); for (unsigned int i = 0; i < order.size(); i++) { a[i] = i; order[i] = eval_float(env, (*order_e)[i]); } struct Ord { std::vector& order; Ord(std::vector& order0) : order(order0) {} bool operator()(int i, int j) { return order[i] < order[j]; } } _ord(order); std::stable_sort(a.begin(), a.end(), _ord); std::vector sorted(a.size()); for (auto i = static_cast(sorted.size()); (i--) != 0U;) { sorted[i] = (*al)[a[i]]; } auto* al_sorted = new ArrayLit(al->loc(), sorted); al_sorted->type(al->type()); return al_sorted; } Expression* b_sort(EnvI& env, Call* call) { assert(call->argCount() == 1); ArrayLit* al = eval_array_lit(env, call->arg(0)); std::vector sorted(al->size()); for (auto i = static_cast(sorted.size()); (i--) != 0U;) { sorted[i] = (*al)[i]; } struct Ord { EnvI& env; Ord(EnvI& env0) : env(env0) {} bool operator()(Expression* e0, Expression* e1) { switch (e0->type().bt()) { case Type::BT_INT: return eval_int(env, e0) < eval_int(env, e1); case Type::BT_BOOL: return static_cast(eval_bool(env, e0)) < static_cast(eval_bool(env, e1)); case Type::BT_FLOAT: return eval_float(env, e0) < eval_float(env, e1); default: throw EvalError(env, e0->loc(), "unsupported type for sorting"); } } } _ord(env); std::sort(sorted.begin(), sorted.end(), _ord); auto* al_sorted = new ArrayLit(al->loc(), sorted); al_sorted->type(al->type()); return al_sorted; } Expression* b_inverse(EnvI& env, Call* call) { assert(call->argCount() == 1); ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->size() == 0) { return al; } int min_idx = al->min(0); std::vector ivs(al->size()); IntVal minVal = eval_int(env, (*al)[0]); IntVal maxVal = minVal; ivs[0] = minVal; for (unsigned int i = 1; i < al->size(); i++) { IntVal ii = eval_int(env, (*al)[i]); ivs[i] = ii; minVal = std::min(minVal, ii); maxVal = std::max(maxVal, ii); } if (maxVal - minVal + 1 != al->size()) { throw ResultUndefinedError(env, call->loc(), "inverse on non-contiguous set of values is undefined"); } std::vector inv(al->size()); std::vector used(al->size()); for (unsigned int i = 0; i < ivs.size(); i++) { used[(ivs[i] - minVal).toInt()] = true; inv[(ivs[i] - minVal).toInt()] = IntLit::a(i + min_idx); } for (bool b : used) { if (!b) { throw ResultUndefinedError(env, call->loc(), "inverse on non-contiguous set of values is undefined"); } } auto* al_inv = new ArrayLit(al->loc(), inv, {{minVal.toInt(), maxVal.toInt()}}); al_inv->type(al->type()); return al_inv; } Expression* b_set_to_ranges_int(EnvI& env, Call* call) { assert(call->argCount() == 1); IntSetVal* isv = eval_intset(env, call->arg(0)); std::vector v(isv->size() * 2); for (unsigned int i = 0; i < isv->size(); i++) { v[2 * i] = IntLit::a(isv->min(i)); v[2 * i + 1] = IntLit::a(isv->max(i)); } auto* al = new ArrayLit(call->loc().introduce(), v); al->type(Type::parint(1)); return al; } Expression* b_set_to_ranges_float(EnvI& env, Call* call) { assert(call->argCount() == 1); FloatSetVal* fsv = eval_floatset(env, call->arg(0)); std::vector v(fsv->size() * 2); for (unsigned int i = 0; i < fsv->size(); i++) { v[2 * i] = FloatLit::a(fsv->min(i)); v[2 * i + 1] = FloatLit::a(fsv->max(i)); } auto* al = new ArrayLit(call->loc().introduce(), v); al->type(Type::parfloat(1)); return al; } std::default_random_engine& rnd_generator() { // TODO: initiate with seed if given as annotation/in command line static std::default_random_engine g; return g; } FloatVal b_normal_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = eval_float(env, call->arg(0)).toDouble(); const double stdv = eval_float(env, call->arg(1)).toDouble(); std::normal_distribution distribution(mean, stdv); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_normal_int_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = double(eval_int(env, call->arg(0)).toInt()); const double stdv = eval_float(env, call->arg(1)).toDouble(); std::normal_distribution distribution(mean, stdv); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_uniform_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double lb = eval_float(env, call->arg(0)).toDouble(); const double ub = eval_float(env, call->arg(1)).toDouble(); if (lb > ub) { std::stringstream ssm; ssm << "lowerbound of uniform distribution \"" << lb << "\" is higher than its upperbound: " << ub; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } std::uniform_real_distribution distribution(lb, ub); // return a sample from the distribution return distribution(rnd_generator()); } IntVal b_uniform_int(EnvI& env, Call* call) { assert(call->argCount() == 2); const long long int lb = eval_int(env, call->arg(0)).toInt(); const long long int ub = eval_int(env, call->arg(1)).toInt(); if (lb > ub) { std::stringstream ssm; ssm << "lowerbound of uniform distribution \"" << lb << "\" is higher than its upperbound: " << ub; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } std::uniform_int_distribution distribution(lb, ub); // return a sample from the distribution return IntVal(distribution(rnd_generator())); } IntVal b_poisson_int(EnvI& env, Call* call) { assert(call->argCount() == 1); long long int mean = eval_int(env, call->arg(0)).toInt(); std::poisson_distribution distribution(static_cast(mean)); // return a sample from the distribution return IntVal(distribution(rnd_generator())); } IntVal b_poisson_float(EnvI& env, Call* call) { assert(call->argCount() == 1); double mean = eval_float(env, call->arg(0)).toDouble(); std::poisson_distribution distribution(mean); // return a sample from the distribution return IntVal(distribution(rnd_generator())); } FloatVal b_gamma_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double alpha = eval_float(env, call->arg(0)).toDouble(); const double beta = eval_float(env, call->arg(1)).toDouble(); std::gamma_distribution distribution(alpha, beta); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_gamma_int_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double alpha = eval_float(env, call->arg(0)).toDouble(); const double beta = eval_float(env, call->arg(1)).toDouble(); std::gamma_distribution distribution(alpha, beta); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_weibull_int_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double shape = double(eval_int(env, call->arg(0)).toInt()); if (shape < 0) { std::stringstream ssm; ssm << "The shape factor for the weibull distribution \"" << shape << "\" has to be greater than zero."; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } const double scale = eval_float(env, call->arg(1)).toDouble(); if (scale < 0) { std::stringstream ssm; ssm << "The scale factor for the weibull distribution \"" << scale << "\" has to be greater than zero."; throw EvalError(env, call->arg(1)->loc(), ssm.str()); } std::weibull_distribution distribution(shape, scale); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_weibull_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double shape = eval_float(env, call->arg(0)).toDouble(); if (shape < 0) { std::stringstream ssm; ssm << "The shape factor for the weibull distribution \"" << shape << "\" has to be greater than zero."; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } const double scale = eval_float(env, call->arg(1)).toDouble(); if (scale < 0) { std::stringstream ssm; ssm << "The scale factor for the weibull distribution \"" << scale << "\" has to be greater than zero."; throw EvalError(env, call->arg(1)->loc(), ssm.str()); } std::weibull_distribution distribution(shape, scale); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_exponential_float(EnvI& env, Call* call) { assert(call->argCount() == 1); const double lambda = eval_float(env, call->arg(0)).toDouble(); if (lambda < 0) { std::stringstream ssm; ssm << "The lambda-parameter for the exponential distribution function \"" << lambda << "\" has to be greater than zero."; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } std::exponential_distribution distribution(lambda); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_exponential_int(EnvI& env, Call* call) { assert(call->argCount() == 1); const double lambda = double(eval_int(env, call->arg(0)).toInt()); if (lambda < 0) { std::stringstream ssm; ssm << "The lambda-parameter for the exponential distribution function \"" << lambda << "\" has to be greater than zero."; throw EvalError(env, call->arg(0)->loc(), ssm.str()); } std::exponential_distribution distribution(lambda); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_lognormal_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = eval_float(env, call->arg(0)).toDouble(); const double stdv = eval_float(env, call->arg(1)).toDouble(); std::lognormal_distribution distribution(mean, stdv); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_lognormal_int_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = double(eval_int(env, call->arg(0)).toInt()); const double stdv = eval_float(env, call->arg(1)).toDouble(); std::lognormal_distribution distribution(mean, stdv); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_chisquared_float(EnvI& env, Call* call) { assert(call->argCount() == 1); const double lambda = eval_float(env, call->arg(0)).toDouble(); std::exponential_distribution distribution(lambda); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_chisquared_int(EnvI& env, Call* call) { assert(call->argCount() == 1); const double lambda = double(eval_int(env, call->arg(0)).toInt()); std::exponential_distribution distribution(lambda); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_cauchy_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = eval_float(env, call->arg(0)).toDouble(); const double scale = eval_float(env, call->arg(1)).toDouble(); std::cauchy_distribution distribution(mean, scale); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_cauchy_int_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double mean = double(eval_int(env, call->arg(0)).toInt()); const double scale = eval_float(env, call->arg(1)).toDouble(); std::cauchy_distribution distribution(mean, scale); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_fdistribution_float_float(EnvI& env, Call* call) { assert(call->argCount() == 2); const double d1 = eval_float(env, call->arg(0)).toDouble(); const double d2 = eval_float(env, call->arg(1)).toDouble(); std::fisher_f_distribution distribution(d1, d2); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_fdistribution_int_int(EnvI& env, Call* call) { assert(call->argCount() == 2); const double d1 = double(eval_int(env, call->arg(0)).toInt()); const double d2 = double(eval_int(env, call->arg(1)).toInt()); std::fisher_f_distribution distribution(d1, d2); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_tdistribution_float(EnvI& env, Call* call) { assert(call->argCount() == 1); const double sampleSize = eval_float(env, call->arg(0)).toDouble(); std::student_t_distribution distribution(sampleSize); // return a sample from the distribution return distribution(rnd_generator()); } FloatVal b_tdistribution_int(EnvI& env, Call* call) { assert(call->argCount() == 1); const double sampleSize = double(eval_int(env, call->arg(0)).toInt()); std::student_t_distribution distribution(sampleSize); // return a sample from the distribution return distribution(rnd_generator()); } IntVal b_discrete_distribution(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; ArrayLit* al = eval_array_lit(env, call->arg(0)); if (al->dims() != 1) { std::stringstream ssm; ssm << "expecting 1-dimensional array of weights for discrete distribution instead of: " << *al << std::endl; throw EvalError(env, al->loc(), ssm.str()); } std::vector weights(al->size()); for (unsigned int i = 0; i < al->size(); i++) { weights[i] = eval_int(env, (*al)[i]).toInt(); } #ifdef _MSC_VER std::size_t i(0); std::discrete_distribution distribution( weights.size(), 0.0, 1.0, [&weights, &i](double d) { return weights[i++]; }); #else std::discrete_distribution distribution(weights.begin(), weights.end()); #endif // return a sample from the distribution IntVal iv = IntVal(distribution(rnd_generator())); return iv; } bool b_bernoulli(EnvI& env, Call* call) { assert(call->argCount() == 1); const double p = eval_float(env, call->arg(0)).toDouble(); std::bernoulli_distribution distribution(p); // return a sample from the distribution return distribution(rnd_generator()); } IntVal b_binomial(EnvI& env, Call* call) { assert(call->argCount() == 2); double t = double(eval_int(env, call->arg(0)).toInt()); double p = eval_float(env, call->arg(1)).toDouble(); std::binomial_distribution distribution(t, p); // return a sample from the distribution return IntVal(distribution(rnd_generator())); } FloatVal b_atan(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::atan(f.toDouble()); } FloatVal b_cos(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::cos(f.toDouble()); } FloatVal b_sin(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::sin(f.toDouble()); } FloatVal b_asin(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::asin(f.toDouble()); } FloatVal b_acos(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::acos(f.toDouble()); } FloatVal b_tan(EnvI& env, Call* call) { assert(call->argCount() == 1); GCLock lock; FloatVal f = eval_float(env, call->arg(0)); return std::tan(f.toDouble()); } IntVal b_to_enum(EnvI& env, Call* call) { assert(call->argCount() == 2); IntSetVal* isv = eval_intset(env, call->arg(0)); IntVal v = eval_int(env, call->arg(1)); if (!isv->contains(v)) { throw ResultUndefinedError(env, call->loc(), "value outside of enum range"); } return v; } IntVal b_enum_next(EnvI& env, Call* call) { IntSetVal* isv = eval_intset(env, call->arg(0)); IntVal v = eval_int(env, call->arg(1)); if (!isv->contains(v + 1)) { throw ResultUndefinedError(env, call->loc(), "value outside of enum range"); } return v + 1; } IntVal b_enum_prev(EnvI& env, Call* call) { IntSetVal* isv = eval_intset(env, call->arg(0)); IntVal v = eval_int(env, call->arg(1)); if (!isv->contains(v - 1)) { throw ResultUndefinedError(env, call->loc(), "value outside of enum range"); } return v - 1; } IntVal b_mzn_compiler_version(EnvI& /*env*/, Call* /*call*/) { return atoi(MZN_VERSION_MAJOR) * 10000 + atoi(MZN_VERSION_MINOR) * 1000 + atoi(MZN_VERSION_PATCH); } Expression* b_slice(EnvI& env, Call* call) { ArrayLit* al = eval_array_lit(env, call->arg(0)); ArrayLit* slice = eval_array_lit(env, call->arg(1)); std::vector> newSlice(slice->size()); for (unsigned int i = 0; i < slice->size(); i++) { IntSetVal* isv = eval_intset(env, (*slice)[i]); if (isv->size() == 0) { newSlice[i] = std::pair(1, 0); } else { if (isv->size() > 1) { throw ResultUndefinedError(env, call->loc(), "array slice must be contiguous"); } int sl_min = isv->min().isFinite() ? static_cast(isv->min().toInt()) : al->min(i); int sl_max = isv->max().isFinite() ? static_cast(isv->max().toInt()) : al->max(i); if (sl_min < al->min(i) || sl_max > al->max(i)) { throw ResultUndefinedError(env, call->loc(), "array slice out of bounds"); } newSlice[i] = std::pair(sl_min, sl_max); } } std::vector> newDims(call->argCount() - 2); for (unsigned int i = 0; i < newDims.size(); i++) { IntSetVal* isv = eval_intset(env, call->arg(2 + i)); if (isv->size() == 0) { newDims[i] = std::pair(1, 0); } else { newDims[i] = std::pair(static_cast(isv->min().toInt()), static_cast(isv->max().toInt())); } } auto* ret = new ArrayLit(al->loc(), al, newDims, newSlice); ret->type(call->type()); return ret; } Expression* b_regular_from_string(EnvI& env, Call* call) { #ifdef HAS_GECODE using namespace Gecode; ArrayLit* vars = eval_array_lit(env, call->arg(0)); std::string expr = eval_string(env, call->arg(1)); IntSetVal* dom; if (vars->size() == 0) { dom = IntSetVal::a(); } else { dom = b_dom_varint(env, (*vars)[0]); for (unsigned int i = 1; i < vars->size(); i++) { IntSetRanges isr(dom); IntSetRanges r(b_dom_varint(env, (*vars)[i])); Ranges::Union u(isr, r); dom = IntSetVal::ai(u); } } long long int card = dom->max().toInt() - dom->min().toInt() + 1; int offset = 1 - static_cast(dom->min().toInt()); // Replace all occurrences of enum constructor calls std::regex constructor_call( "([A-Za-z][A-Za-z0-9_]*|'[^'\\xa\\xd\\x0]*')[[:space:]]*\\([[:space:]]*([A-Za-z][A-Za-z0-9_]*" "|'[^'\\xa\\xd\\x0]*'|([0-9]*))[[:space:]]*\\)", std::regex_constants::egrep); while (std::regex_search(expr, constructor_call)) { std::ostringstream oss; auto id_re_it = std::sregex_token_iterator(expr.begin(), expr.end(), constructor_call, {-1, 1, 2, 3}); for (; id_re_it != std::sregex_token_iterator();) { std::string rest = *id_re_it; oss << rest; ++id_re_it; if (id_re_it == std::sregex_token_iterator()) { break; } std::string id1 = *id_re_it; ++id_re_it; std::string id2 = *id_re_it; ++id_re_it; std::string val3 = *id_re_it; ++id_re_it; // Enum constructor call, get both items Expression* arg; if (val3.empty()) { auto it = env.reverseEnum.find(id2); if (it == env.reverseEnum.end()) { throw std::runtime_error("Unknown identifier: " + id2); } auto* id2_vd = it->second->dynamicCast(); if (id2_vd == nullptr) { throw std::runtime_error("identifier " + id2 + " is not an enum constant"); } arg = id2_vd->e()->id(); } else { int v = std::stoi(val3); arg = IntLit::a(v); } auto it = env.reverseEnum.find(id1); if (it == env.reverseEnum.end()) { throw std::runtime_error("Unknown identifier: " + id2); } if (auto* id1_vdi = it->second->dynamicCast()) { // this is not an enum constructor, simply output both values IntVal result1 = eval_int(env, id1_vdi->e()->id()); IntVal result2 = eval_int(env, arg); oss << result1 << "(" << result2 << ")"; } else { auto* fi = it->second->cast(); Call* c = new Call(Location().introduce(), fi->id(), {arg}); c->type(fi->rtype(env, {arg->type()}, true)); c->decl(fi); IntVal result = eval_int(env, c); oss << result; } } expr = oss.str(); } // Replace all remaining enum identifiers std::regex enumid("[A-Za-z][A-Za-z0-9_]*|'[^'\\xa\\xd\\x0]*'", std::regex_constants::egrep); auto id_re_it = std::sregex_token_iterator(expr.begin(), expr.end(), enumid, {-1, 0}); std::ostringstream oss; for (; id_re_it != std::sregex_token_iterator();) { std::string rest = *id_re_it; oss << rest; ++id_re_it; if (id_re_it == std::sregex_token_iterator()) { break; } std::string id1 = *id_re_it; ++id_re_it; auto it = env.reverseEnum.find(id1); if (it == env.reverseEnum.end()) { throw std::runtime_error("Unknown identifier: " + id1); } auto* id1_vd = it->second->dynamicCast(); if (id1_vd == nullptr) { throw std::runtime_error("identifier " + id1 + " is not an enum constant"); } IntVal result1 = eval_int(env, id1_vd->e()->id()); oss << result1; } expr = oss.str(); std::unique_ptr regex; try { regex = regex_from_string(expr, *dom); } catch (const std::exception& e) { throw SyntaxError(call->arg(1)->loc(), e.what()); } DFA dfa = DFA(*regex); std::vector> reg_trans( dfa.n_states(), std::vector(static_cast(card), IntLit::a(IntVal(0)))); DFA::Transitions trans(dfa); while (trans()) { // std::cerr << trans.i_state() + 1 << " -- " << trans.symbol() << " --> " << // trans.o_state() + 1 << "\n"; if (trans.symbol() >= dom->min().toInt() && trans.symbol() <= dom->max().toInt()) { reg_trans[trans.i_state()][trans.symbol() + offset - 1] = IntLit::a(IntVal(trans.o_state() + 1)); } ++trans; } std::vector args(6); if (offset == 0) { args[0] = vars; // x } else { std::vector nvars(vars->size()); IntLit* loffset = IntLit::a(IntVal(offset)); for (int i = 0; i < nvars.size(); ++i) { nvars[i] = new BinOp(call->loc().introduce(), (*vars)[i], BOT_PLUS, loffset); nvars[i]->type(Type::varint()); } args[0] = new ArrayLit(call->loc().introduce(), nvars); // x args[0]->type(Type::varint(1)); } args[1] = IntLit::a(IntVal(dfa.n_states())); // Q args[1]->type(Type::parint()); args[2] = IntLit::a(IntVal(card)); // S args[2]->type(Type::parint()); args[3] = new ArrayLit(call->loc().introduce(), reg_trans); // d args[3]->type(Type::parint(2)); args[4] = IntLit::a(IntVal(1)); // q0 args[4]->type(Type::parint()); args[5] = new SetLit(call->loc().introduce(), IntSetVal::a(IntVal(dfa.final_fst() + 1), IntVal(dfa.final_lst()))); // F args[5]->type(Type::parsetint()); auto* nc = new Call(call->loc().introduce(), "regular", args); nc->type(Type::varbool()); return nc; #else throw FlatteningError( env, call->loc(), "MiniZinc was compiled without built-in Gecode, cannot parse regular expression"); #endif } Expression* b_show_checker_output(EnvI& env, Call* call) { // Get checker output env.checkerOutput.flush(); std::string output = env.checkerOutput.str(); // Reset checker output env.checkerOutput.str(""); env.checkerOutput.clear(); return new StringLit(call->loc().introduce(), output); } void register_builtins(Env& e) { EnvI& env = e.envi(); Model* m = env.model; std::vector t_intint(2); t_intint[0] = Type::parint(); t_intint[1] = Type::parint(); std::vector t_intarray(1); t_intarray[0] = Type::parint(-1); GCLock lock; rb(env, m, ASTString("min"), t_intint, b_int_min); rb(env, m, ASTString("min"), t_intarray, b_int_min); rb(env, m, ASTString("max"), t_intint, b_int_max); rb(env, m, ASTString("max"), t_intarray, b_int_max); rb(env, m, constants().ids.sum, t_intarray, b_sum_int); rb(env, m, ASTString("product"), t_intarray, b_product_int); rb(env, m, ASTString("pow"), t_intint, b_pow_int); rb(env, m, ASTString("'div'"), t_intint, b_idiv); rb(env, m, ASTString("'mod'"), t_intint, b_mod); rb(env, m, ASTString("'..'"), t_intint, b_dotdot); { std::vector t({Type::parfloat(), Type::parfloat()}); rb(env, m, ASTString("'/'"), t, b_fdiv); } { std::vector t(2); t[0] = Type::top(-1); t[1] = Type::top(-1); rb(env, m, ASTString("index_sets_agree"), t, b_index_sets_agree); } { std::vector t_anyarray1(1); t_anyarray1[0] = Type::optvartop(1); rb(env, m, ASTString("index_set"), t_anyarray1, b_index_set1); } { std::vector t_anyarray2(1); t_anyarray2[0] = Type::optvartop(2); rb(env, m, ASTString("index_set_1of2"), t_anyarray2, b_index_set1); rb(env, m, ASTString("index_set_2of2"), t_anyarray2, b_index_set2); } { std::vector t_anyarray3(1); t_anyarray3[0] = Type::optvartop(3); rb(env, m, ASTString("index_set_1of3"), t_anyarray3, b_index_set1); rb(env, m, ASTString("index_set_2of3"), t_anyarray3, b_index_set2); rb(env, m, ASTString("index_set_3of3"), t_anyarray3, b_index_set3); } { std::vector t_anyarray4(1); t_anyarray4[0] = Type::optvartop(4); rb(env, m, ASTString("index_set_1of4"), t_anyarray4, b_index_set1); rb(env, m, ASTString("index_set_2of4"), t_anyarray4, b_index_set2); rb(env, m, ASTString("index_set_3of4"), t_anyarray4, b_index_set3); rb(env, m, ASTString("index_set_4of4"), t_anyarray4, b_index_set4); } { std::vector t_anyarray5(1); t_anyarray5[0] = Type::optvartop(5); rb(env, m, ASTString("index_set_1of5"), t_anyarray5, b_index_set1); rb(env, m, ASTString("index_set_2of5"), t_anyarray5, b_index_set2); rb(env, m, ASTString("index_set_3of5"), t_anyarray5, b_index_set3); rb(env, m, ASTString("index_set_4of5"), t_anyarray5, b_index_set4); rb(env, m, ASTString("index_set_5of5"), t_anyarray5, b_index_set5); } { std::vector t_anyarray6(1); t_anyarray6[0] = Type::optvartop(6); rb(env, m, ASTString("index_set_1of6"), t_anyarray6, b_index_set1); rb(env, m, ASTString("index_set_2of6"), t_anyarray6, b_index_set2); rb(env, m, ASTString("index_set_3of6"), t_anyarray6, b_index_set3); rb(env, m, ASTString("index_set_4of6"), t_anyarray6, b_index_set4); rb(env, m, ASTString("index_set_5of6"), t_anyarray6, b_index_set5); rb(env, m, ASTString("index_set_6of6"), t_anyarray6, b_index_set6); } { std::vector t_arrayXd(1); t_arrayXd[0] = Type::top(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d_list); t_arrayXd[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d_list); t_arrayXd[0] = Type::vartop(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d_list); t_arrayXd[0] = Type::optvartop(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d_list); } { std::vector t_arrayXd(2); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::top(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d); t_arrayXd[1].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d); t_arrayXd[1] = Type::vartop(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d); t_arrayXd[1] = Type::optvartop(-1); rb(env, m, ASTString("array1d"), t_arrayXd, b_array1d); } { std::vector t_arrayXd(2); t_arrayXd[0] = Type::optvartop(-1); t_arrayXd[1] = Type::top(-1); rb(env, m, ASTString("arrayXd"), t_arrayXd, b_arrayXd); t_arrayXd[1].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("arrayXd"), t_arrayXd, b_arrayXd); t_arrayXd[1] = Type::vartop(-1); rb(env, m, ASTString("arrayXd"), t_arrayXd, b_arrayXd); t_arrayXd[1] = Type::optvartop(-1); rb(env, m, ASTString("arrayXd"), t_arrayXd, b_arrayXd); } { std::vector t_arrayXd(3); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::parsetint(); t_arrayXd[2] = Type::top(-1); rb(env, m, ASTString("array2d"), t_arrayXd, b_array2d); t_arrayXd[2].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array2d"), t_arrayXd, b_array2d); t_arrayXd[2] = Type::vartop(-1); rb(env, m, ASTString("array2d"), t_arrayXd, b_array2d); t_arrayXd[2] = Type::optvartop(-1); rb(env, m, ASTString("array2d"), t_arrayXd, b_array2d); } { std::vector t_arrayXd(4); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::parsetint(); t_arrayXd[2] = Type::parsetint(); t_arrayXd[3] = Type::top(-1); rb(env, m, ASTString("array3d"), t_arrayXd, b_array3d); t_arrayXd[3].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array3d"), t_arrayXd, b_array3d); t_arrayXd[3] = Type::vartop(-1); rb(env, m, ASTString("array3d"), t_arrayXd, b_array3d); t_arrayXd[3] = Type::optvartop(-1); rb(env, m, ASTString("array3d"), t_arrayXd, b_array3d); } { std::vector t_arrayXd(5); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::parsetint(); t_arrayXd[2] = Type::parsetint(); t_arrayXd[3] = Type::parsetint(); t_arrayXd[4] = Type::top(-1); rb(env, m, ASTString("array4d"), t_arrayXd, b_array4d); t_arrayXd[4].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array4d"), t_arrayXd, b_array4d); t_arrayXd[4] = Type::vartop(-1); rb(env, m, ASTString("array4d"), t_arrayXd, b_array4d); t_arrayXd[4] = Type::optvartop(-1); rb(env, m, ASTString("array4d"), t_arrayXd, b_array4d); } { std::vector t_arrayXd(6); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::parsetint(); t_arrayXd[2] = Type::parsetint(); t_arrayXd[3] = Type::parsetint(); t_arrayXd[4] = Type::parsetint(); t_arrayXd[5] = Type::top(-1); rb(env, m, ASTString("array5d"), t_arrayXd, b_array5d); t_arrayXd[5].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array5d"), t_arrayXd, b_array5d); t_arrayXd[5] = Type::vartop(-1); rb(env, m, ASTString("array5d"), t_arrayXd, b_array5d); t_arrayXd[5] = Type::optvartop(-1); rb(env, m, ASTString("array5d"), t_arrayXd, b_array5d); } { std::vector t_arrayXd(7); t_arrayXd[0] = Type::parsetint(); t_arrayXd[1] = Type::parsetint(); t_arrayXd[2] = Type::parsetint(); t_arrayXd[3] = Type::parsetint(); t_arrayXd[4] = Type::parsetint(); t_arrayXd[5] = Type::parsetint(); t_arrayXd[6] = Type::top(-1); rb(env, m, ASTString("array6d"), t_arrayXd, b_array6d); t_arrayXd[6].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("array6d"), t_arrayXd, b_array6d); t_arrayXd[6] = Type::vartop(-1); rb(env, m, ASTString("array6d"), t_arrayXd, b_array6d); t_arrayXd[6] = Type::optvartop(-1); rb(env, m, ASTString("array6d"), t_arrayXd, b_array6d); } { std::vector stv(3); stv[0] = Type::partop(-1); stv[1] = Type::parsetint(1); stv[2] = Type::parsetint(); rb(env, m, ASTString("slice_1d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_1d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_1d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_1d"), stv, b_slice); stv.push_back(Type::parsetint()); stv[0] = Type::partop(-1); rb(env, m, ASTString("slice_2d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_2d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_2d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_2d"), stv, b_slice); stv.push_back(Type::parsetint()); stv[0] = Type::partop(-1); rb(env, m, ASTString("slice_3d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_3d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_3d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_3d"), stv, b_slice); stv.push_back(Type::parsetint()); stv[0] = Type::partop(-1); rb(env, m, ASTString("slice_4d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_4d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_4d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_4d"), stv, b_slice); stv.push_back(Type::parsetint()); stv[0] = Type::partop(-1); rb(env, m, ASTString("slice_5d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_5d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_5d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_5d"), stv, b_slice); stv.push_back(Type::parsetint()); stv[0] = Type::partop(-1); rb(env, m, ASTString("slice_6d"), stv, b_slice); stv[0] = Type::vartop(-1); rb(env, m, ASTString("slice_6d"), stv, b_slice); stv[0] = Type::optvartop(-1); rb(env, m, ASTString("slice_6d"), stv, b_slice); stv[0] = Type::optpartop(-1); rb(env, m, ASTString("slice_6d"), stv, b_slice); } { std::vector t(2); t[0] = Type::parbool(); t[1] = Type::parstring(); rb(env, m, constants().ids.assert, t, b_assert_bool); } { std::vector t(3); t[0] = Type::parbool(); t[1] = Type::parstring(); t[2] = Type::top(); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::optpartop(); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::vartop(); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::optvartop(); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::top(-1); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::optpartop(-1); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::vartop(-1); rb(env, m, constants().ids.assert, t, b_assert); t[2] = Type::optvartop(-1); rb(env, m, constants().ids.assert, t, b_assert); } { std::vector t(4); t[0] = Type::parstring(); t[1] = Type::parstring(); t[2] = Type::parstring(); t[3] = Type::top(); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); t[3] = Type::vartop(); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); t[3] = Type::optvartop(); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); t[3] = Type::top(-1); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); t[3] = Type::vartop(-1); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); t[3] = Type::optvartop(-1); rb(env, m, constants().ids.mzn_deprecate, t, b_mzn_deprecate); } { rb(env, m, constants().ids.mzn_symmetry_breaking_constraint, {Type::varbool()}, b_mzn_symmetry_breaking_constraint); rb(env, m, constants().ids.mzn_redundant_constraint, {Type::varbool()}, b_mzn_redundant_constraint); } { std::vector t(1); t[0] = Type::parstring(); rb(env, m, ASTString("abort"), t, b_abort); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); } { std::vector t; rb(env, m, ASTString("logstream_to_string"), t, b_logstream); } { std::vector t(2); t[0] = Type::parstring(); t[1] = Type::top(); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::optpartop(); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::vartop(); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::optvartop(); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::top(-1); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::optpartop(-1); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::vartop(-1); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); t[1] = Type::optvartop(-1); rb(env, m, constants().ids.trace, t, b_trace); rb(env, m, ASTString("trace_stdout"), t, b_trace_stdout); rb(env, m, ASTString("trace_logstream"), t, b_trace_logstream); } { rb(env, m, ASTString("mzn_in_redundant_constraint"), std::vector(), b_in_redundant_constraint); } { std::vector t_length(1); t_length[0] = Type::optvartop(-1); rb(env, m, ASTString("length"), t_length, b_length); } { std::vector t(1); t[0] = Type::parbool(); rb(env, m, constants().ids.bool2int, t, b_bool2int); } { std::vector t(1); t[0] = Type::parbool(-1); rb(env, m, constants().ids.forall, t, b_forall_par); rb(env, m, constants().ids.exists, t, b_exists_par); rb(env, m, ASTString("xorall"), t, b_xorall_par); rb(env, m, ASTString("iffall"), t, b_iffall_par); } { rb(env, m, constants().ids.bool_not, {Type::parbool()}, b_not_par); } { std::vector t(2); t[0] = Type::parbool(-1); t[1] = Type::parbool(-1); rb(env, m, constants().ids.clause, t, b_clause_par); } { std::vector t(1); t[0] = Type::varsetint(); rb(env, m, ASTString("ub"), t, b_ub_set); rb(env, m, ASTString("lb"), t, b_lb_set); } { std::vector t(1); t[0] = Type::varsetint(1); rb(env, m, ASTString("ub_array"), t, b_array_ub_set); } { std::vector t(1); t[0] = Type::varint(); rb(env, m, ASTString("dom"), t, b_dom_varint); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("dom"), t, b_dom_varint); } { std::vector t(1); t[0] = Type::varint(-1); rb(env, m, ASTString("dom_array"), t, b_dom_array); rb(env, m, ASTString("dom_bounds_array"), t, b_dom_bounds_array); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("dom_array"), t, b_dom_array); rb(env, m, ASTString("dom_bounds_array"), t, b_dom_bounds_array); } { std::vector t(1); t[0] = Type::parsetint(); rb(env, m, ASTString("min"), t, b_min_parsetint); } { std::vector t(1); t[0] = Type::parsetint(); rb(env, m, ASTString("max"), t, b_max_parsetint); } { std::vector t(1); t[0] = Type::varint(); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("lb"), t, b_lb_varoptint); } { std::vector t(1); t[0] = Type::varint(); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("ub"), t, b_ub_varoptint); } { std::vector t(1); t[0] = Type::varint(); rb(env, m, ASTString("lb"), t, b_lb_varoptint); } { std::vector t(1); t[0] = Type::varint(); rb(env, m, ASTString("ub"), t, b_ub_varoptint); } { std::vector t(1); t[0] = Type::varint(-1); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("lb_array"), t, b_array_lb_int); } { std::vector t(1); t[0] = Type::varint(-1); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("ub_array"), t, b_array_ub_int); } { std::vector t(1); t[0] = Type::varfloat(); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("lb"), t, b_lb_varoptfloat); } { std::vector t(1); t[0] = Type::varfloat(); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("ub"), t, b_ub_varoptfloat); } { std::vector t(1); t[0] = Type::varfloat(); rb(env, m, ASTString("lb"), t, b_lb_varoptfloat); } { std::vector t(1); t[0] = Type::varfloat(); rb(env, m, ASTString("ub"), t, b_ub_varoptfloat); } { std::vector t(1); t[0] = Type::varfloat(-1); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("lb_array"), t, b_array_lb_float); } { std::vector t(1); t[0] = Type::varfloat(-1); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("ub_array"), t, b_array_ub_float); } { std::vector t(1); t[0] = Type::parsetint(); rb(env, m, ASTString("card"), t, b_card); } { std::vector t(1); t[0] = Type::parsetint(); rb(env, m, ASTString("set_to_ranges"), t, b_set_to_ranges_int); t[0] = Type::parsetfloat(); rb(env, m, ASTString("set_to_ranges"), t, b_set_to_ranges_float); } { std::vector t(1); t[0] = Type::parint(); rb(env, m, ASTString("abs"), t, b_abs_int); t[0] = Type::parfloat(); rb(env, m, ASTString("abs"), t, b_abs_float); } { std::vector t(1); t[0] = Type::varint(); rb(env, m, ASTString("has_bounds"), t, b_has_bounds_int); } { std::vector t(1); t[0] = Type::varfloat(); rb(env, m, ASTString("has_bounds"), t, b_has_bounds_float); } { std::vector t(1); t[0] = Type::varsetint(); rb(env, m, ASTString("has_ub_set"), t, b_has_ub_set); } { std::vector t(1); t[0] = Type::optvartop(); rb(env, m, ASTString("is_fixed"), t, b_is_fixed); t[0] = Type::varsetint(); rb(env, m, ASTString("is_fixed"), t, b_is_fixed); Type setoftop; setoftop.bt(Type::BT_TOP); setoftop.st(Type::ST_SET); setoftop.ti(Type::TI_PAR); setoftop.ot(Type::OT_PRESENT); t[0] = setoftop; rb(env, m, ASTString("is_fixed"), t, b_is_fixed); } { std::vector t(1); t[0] = Type::optvartop(-1); rb(env, m, ASTString("is_fixed"), t, b_is_fixed_array); } { std::vector t(2); t[0] = t[1] = Type::optvartop(); rb(env, m, ASTString("is_same"), t, b_is_same); } { std::vector t(1); t[0] = Type::optvartop(); rb(env, m, ASTString("fix"), t, b_fix_bool); rb(env, m, ASTString("fix"), t, b_fix_int); rb(env, m, ASTString("fix"), t, b_fix_set); rb(env, m, ASTString("fix"), t, b_fix_float); } { std::vector t(1); t[0] = Type::optvartop(1); rb(env, m, ASTString("fix"), t, b_fix_array); } { std::vector t(2); t[0] = Type::optvartop(); t[1] = Type::ann(); rb(env, m, ASTString("has_ann"), t, b_has_ann); t[0] = Type::varsetint(); rb(env, m, ASTString("has_ann"), t, b_has_ann); Type setoftop; setoftop.bt(Type::BT_TOP); setoftop.st(Type::ST_SET); setoftop.ti(Type::TI_PAR); setoftop.ot(Type::OT_PRESENT); t[0] = setoftop; rb(env, m, ASTString("has_ann"), t, b_has_ann); } { std::vector t(2); t[0] = Type::optvartop(); t[1] = Type::ann(); rb(env, m, ASTString("annotate"), t, b_annotate); t[0] = Type::varsetint(); rb(env, m, ASTString("annotate"), t, b_annotate); Type setoftop; setoftop.bt(Type::BT_TOP); setoftop.st(Type::ST_SET); setoftop.ti(Type::TI_PAR); setoftop.ot(Type::OT_PRESENT); t[0] = setoftop; rb(env, m, ASTString("annotate"), t, b_annotate); } { std::vector t(1); t[0] = Type::parint(); rb(env, m, ASTString("int2float"), t, b_int2float); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("ceil"), t, b_ceil); rb(env, m, ASTString("floor"), t, b_floor); rb(env, m, ASTString("round"), t, b_round); rb(env, m, ASTString("log10"), t, b_log10); rb(env, m, ASTString("log2"), t, b_log2); rb(env, m, ASTString("ln"), t, b_ln); rb(env, m, ASTString("exp"), t, b_exp); rb(env, m, ASTString("sqrt"), t, b_sqrt); t.push_back(Type::parfloat()); rb(env, m, ASTString("log"), t, b_log); rb(env, m, ASTString("pow"), t, b_pow); } { std::vector t(1); t[0] = Type::parfloat(1); rb(env, m, constants().ids.sum, t, b_sum_float); rb(env, m, ASTString("product"), t, b_product_float); } { std::vector t(1); t[0] = Type::parfloat(1); rb(env, m, ASTString("min"), t, b_float_min); rb(env, m, ASTString("max"), t, b_float_max); t[0] = Type::parfloat(); t.push_back(Type::parfloat()); rb(env, m, ASTString("min"), t, b_float_min); rb(env, m, ASTString("max"), t, b_float_max); } { std::vector t(1); t[0] = Type::parsetint(); rb(env, m, ASTString("set2array"), t, b_set2array); } { std::vector t(1); t[0] = Type::parstring(); rb(env, m, ASTString("string_length"), t, b_string_length); } { rb(env, m, ASTString("file_path"), std::vector(), b_file_path); } { std::vector t(1); t[0] = Type::vartop(); rb(env, m, ASTString("show"), t, b_show); rb(env, m, ASTString("showJSON"), t, b_show_json); t[0] = Type::vartop(); t[0].st(Type::ST_SET); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("show"), t, b_show); rb(env, m, ASTString("showJSON"), t, b_show_json); t[0] = Type::vartop(-1); rb(env, m, ASTString("show"), t, b_show); rb(env, m, ASTString("showJSON"), t, b_show_json); } { std::vector t(1); t[0] = Type::parstring(); rb(env, m, ASTString("showDznId"), t, b_show_dzn_id); } { std::vector t(3); t[0] = t[1] = Type::parint(); t[2] = Type::vartop(); rb(env, m, ASTString("format"), t, b_format); t[2] = Type::vartop(); t[2].st(Type::ST_SET); t[2].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("format"), t, b_format); t[2] = Type::vartop(-1); rb(env, m, ASTString("format"), t, b_format); } { std::vector t(2); t[0] = Type::parint(); t[1] = Type::vartop(); rb(env, m, ASTString("format"), t, b_format); t[1] = Type::vartop(); t[1].st(Type::ST_SET); t[1].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("format"), t, b_format); t[1] = Type::vartop(-1); rb(env, m, ASTString("format"), t, b_format); t[1] = Type::parstring(); rb(env, m, ASTString("format_justify_string"), t, b_format_justify_string); } { std::vector t; rb(env, m, ASTString("outputJSON"), t, b_output_json); rb(env, m, ASTString("outputJSONParameters"), t, b_output_json_parameters); } { std::vector t(2); t[0] = Type::parint(); t[1] = Type::varint(); rb(env, m, ASTString("show_int"), t, b_show_int); } { std::vector t(3); t[0] = Type::parint(); t[1] = Type::parint(); t[2] = Type::varfloat(); rb(env, m, ASTString("show_float"), t, b_show_float); } { std::vector t(1); t[0] = Type::parstring(1); rb(env, m, ASTString("concat"), t, b_concat); } { std::vector t(2); t[0] = Type::parstring(); t[1] = Type::parstring(1); rb(env, m, ASTString("join"), t, b_join); } { std::vector t(2); t[0] = Type::varint(); t[1] = Type::varint(); rb(env, m, ASTString("compute_div_bounds"), t, b_compute_div_bounds); } { std::vector t(1); t[0] = Type::parsetint(1); rb(env, m, ASTString("array_intersect"), t, b_array_intersect); rb(env, m, ASTString("array_union"), t, b_array_union); } { std::vector t(1); t[0] = Type::parint(); t[0].ot(Type::OT_OPTIONAL); t[0].bt(Type::BT_TOP); rb(env, m, ASTString("occurs"), t, b_occurs); rb(env, m, ASTString("deopt"), t, b_deopt_expr); t[0].bt(Type::BT_INT); rb(env, m, ASTString("deopt"), t, b_deopt_int); t[0].bt(Type::BT_BOOL); rb(env, m, ASTString("deopt"), t, b_deopt_bool); t[0].bt(Type::BT_FLOAT); rb(env, m, ASTString("deopt"), t, b_deopt_float); t[0].bt(Type::BT_STRING); rb(env, m, ASTString("deopt"), t, b_deopt_string); t[0].bt(Type::BT_INT); t[0].st(Type::ST_SET); rb(env, m, ASTString("deopt"), t, b_deopt_intset); } { std::vector t(2); t[0] = Type::varbot(1); t[1] = Type::parint(1); rb(env, m, ASTString("sort_by"), t, b_sort_by_int); t[0] = Type::bot(1); rb(env, m, ASTString("sort_by"), t, b_sort_by_int); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("sort_by"), t, b_sort_by_int); } { std::vector t(2); t[0] = Type::varbot(1); t[1] = Type::parfloat(1); rb(env, m, ASTString("sort_by"), t, b_sort_by_float); t[0] = Type::bot(1); rb(env, m, ASTString("sort_by"), t, b_sort_by_float); t[0].ot(Type::OT_OPTIONAL); rb(env, m, ASTString("sort_by"), t, b_sort_by_float); } { std::vector t(1); t[0] = Type::parint(1); rb(env, m, ASTString("sort"), t, b_sort); rb(env, m, ASTString("arg_min"), t, b_arg_min_int); rb(env, m, ASTString("arg_max"), t, b_arg_max_int); t[0] = Type::parbool(1); rb(env, m, ASTString("sort"), t, b_sort); rb(env, m, ASTString("arg_min"), t, b_arg_min_bool); rb(env, m, ASTString("arg_max"), t, b_arg_max_bool); t[0] = Type::parfloat(1); rb(env, m, ASTString("sort"), t, b_sort); rb(env, m, ASTString("arg_min"), t, b_arg_min_float); rb(env, m, ASTString("arg_max"), t, b_arg_max_float); } { std::vector t(1); t[0] = Type::parint(1); rb(env, m, ASTString("inverse"), t, b_inverse, true); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("atan"), t, b_atan); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("cos"), t, b_cos); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("sin"), t, b_sin); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("asin"), t, b_asin); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("acos"), t, b_acos); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("tan"), t, b_tan); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("normal"), t, b_normal_float_float); t[0] = Type::parint(); rb(env, m, ASTString("normal"), t, b_normal_int_float); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("uniform"), t, b_uniform_float); t[0] = Type::parint(); t[1] = Type::parint(); rb(env, m, ASTString("uniform"), t, b_uniform_int); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("poisson"), t, b_poisson_float); t[0] = Type::parint(); rb(env, m, ASTString("poisson"), t, b_poisson_int); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("gamma"), t, b_gamma_float_float); t[0] = Type::parint(); rb(env, m, ASTString("gamma"), t, b_gamma_int_float); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("weibull"), t, b_weibull_float_float); t[0] = Type::parint(); rb(env, m, ASTString("weibull"), t, b_weibull_int_float); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("exponential"), t, b_exponential_float); t[0] = Type::parint(); rb(env, m, ASTString("exponential"), t, b_exponential_int); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("lognormal"), t, b_lognormal_float_float); t[0] = Type::parint(); rb(env, m, ASTString("lognormal"), t, b_lognormal_int_float); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("chisquared"), t, b_chisquared_float); t[0] = Type::parint(); rb(env, m, ASTString("chisquared"), t, b_chisquared_int); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("cauchy"), t, b_cauchy_float_float); t[0] = Type::parint(); rb(env, m, ASTString("cauchy"), t, b_cauchy_int_float); } { std::vector t(2); t[0] = Type::parfloat(); t[1] = Type::parfloat(); rb(env, m, ASTString("fdistribution"), t, b_fdistribution_float_float); t[0] = Type::parint(); t[1] = Type::parint(); rb(env, m, ASTString("fdistribution"), t, b_fdistribution_int_int); } { std::vector t(1); t[0] = Type::parfloat(); rb(env, m, ASTString("tdistribution"), t, b_tdistribution_float); t[0] = Type::parint(); rb(env, m, ASTString("tdistribution"), t, b_tdistribution_int); } { std::vector t(1); t[0] = Type::parint(1); rb(env, m, ASTString("discrete_distribution"), t, b_discrete_distribution); } { std::vector t(1); t[0] = Type::parint(); rb(env, m, ASTString("bernoulli"), t, b_bernoulli); } { std::vector t(2); t[0] = Type::parint(); t[1] = Type::parfloat(); rb(env, m, ASTString("binomial"), t, b_binomial); } { std::vector t(2); t[0] = Type::parsetint(); t[1] = Type::parint(); rb(env, m, ASTString("to_enum"), t, b_to_enum); rb(env, m, ASTString("enum_next"), t, b_enum_next); rb(env, m, ASTString("enum_prev"), t, b_enum_prev); } { rb(env, m, ASTString("mzn_compiler_version"), std::vector(), b_mzn_compiler_version); } { std::vector t(2); t[0] = Type::varint(1); t[1] = Type::parstring(); rb(env, m, ASTString("fzn_regular"), t, b_regular_from_string, true); } { rb(env, m, ASTString("showCheckerOutput"), {}, b_show_checker_output); } } } // namespace MiniZinc libminizinc-2.5.3/lib/type.cpp0000644000175000017500000000630413757304533014736 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { std::string Type::toString(EnvI& env) const { std::ostringstream oss; if (_dim > 0) { oss << "array["; if (_enumId != 0U) { const std::vector& arrayEnumIds = env.getArrayEnum(_enumId); for (unsigned int i = 0; i < arrayEnumIds.size() - 1; i++) { if (i != 0) { oss << ","; } unsigned int enumId = arrayEnumIds[i]; if (enumId == 0) { oss << "int"; } else { oss << *env.getEnum(enumId)->e()->id(); } } } else { for (int i = 0; i < _dim; i++) { oss << (i == 0 ? "" : ",") << "int"; } } oss << "] of "; } if (_dim < 0) { oss << "array[$_] of "; } switch (static_cast(_ti)) { case TI_PAR: break; case TI_VAR: oss << "var "; break; } if (static_cast(_ot) == OT_OPTIONAL) { oss << "opt "; } if (static_cast(_st) == ST_SET) { oss << "set of "; } switch (static_cast(_bt)) { case BT_INT: { unsigned int enumId; if (_enumId != 0U && _dim > 0) { const std::vector& arrayEnumIds = env.getArrayEnum(_enumId); enumId = arrayEnumIds[arrayEnumIds.size() - 1]; } else { enumId = _enumId; } if (enumId == 0) { oss << "int"; } else { oss << *env.getEnum(enumId)->e()->id(); } } break; case BT_BOOL: oss << "bool"; break; case BT_FLOAT: oss << "float"; break; case BT_STRING: oss << "string"; break; case BT_ANN: oss << "ann"; break; case BT_BOT: oss << "bot"; break; case BT_TOP: oss << "top"; break; case BT_UNKNOWN: oss << "??? "; break; } return oss.str(); } std::string Type::nonEnumToString() const { std::ostringstream oss; if (_dim > 0) { oss << "array[int"; for (int i = 1; i < _dim; i++) { oss << ",int"; } oss << "] of "; } if (_dim < 0) { oss << "array[$_] of "; } switch (static_cast(_ti)) { case TI_PAR: break; case TI_VAR: oss << "var "; break; } if (static_cast(_ot) == OT_OPTIONAL) { oss << "opt "; } if (static_cast(_st) == ST_SET) { oss << "set of "; } switch (static_cast(_bt)) { case BT_INT: oss << "int"; break; case BT_BOOL: oss << "bool"; break; case BT_FLOAT: oss << "float"; break; case BT_STRING: oss << "string"; break; case BT_ANN: oss << "ann"; break; case BT_BOT: oss << "bot"; break; case BT_TOP: oss << "top"; break; case BT_UNKNOWN: oss << "??? "; break; } return oss.str(); } } // namespace MiniZinc libminizinc-2.5.3/lib/chain_compressor.cpp0000644000175000017500000004567313757304533017327 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include namespace MiniZinc { void ChainCompressor::removeItem(Item* i) { CollectDecls cd(_env.varOccurrences, _deletedVarDecls, i); if (auto* ci = i->dynamicCast()) { top_down(cd, ci->e()); } else if (auto* vdi = i->dynamicCast()) { top_down(cd, vdi->e()); } else { assert(false); // CURRENTLY NOT SUPPORTED } i->remove(); } int ChainCompressor::addItem(Item* i) { _env.flatAddItem(i); int item_idx = static_cast(_env.flat()->size()) - 1; trackItem(i); return item_idx; } void ChainCompressor::updateCount() { for (auto it = _items.begin(); it != _items.end();) { if (it->second->removed()) { it = _items.erase(it); } else { ++it; } } } void ChainCompressor::replaceCallArgument(Item* i, Call* c, unsigned int n, Expression* e) { CollectDecls cd(_env.varOccurrences, _deletedVarDecls, i); top_down(cd, c->arg(n)); c->arg(n, e); CollectOccurrencesE ce(_env.varOccurrences, i); top_down(ce, e); } bool ImpCompressor::trackItem(Item* i) { if (i->removed()) { return false; } if (auto* ci = i->dynamicCast()) { if (auto* c = ci->e()->dynamicCast()) { // clause([y], [x]); i.e. x -> y if (c->id() == constants().ids.clause) { auto* positive = c->arg(0)->cast(); auto* negative = c->arg(1)->cast(); if (positive->length() == 1 && negative->length() == 1) { auto* var = (*negative)[0]->cast(); storeItem(var->decl(), i); return true; } } else if (c->id() == "mzn_reverse_map_var") { auto* control = c->arg(0)->cast(); assert(control->type().isvarbool()); storeItem(control->decl(), i); return true; // pred_imp(..., b); i.e. b -> pred(...) } else if (c->id().endsWith("_imp")) { auto* control = c->arg(c->argCount() - 1)->cast(); assert(control->type().isvarbool()); storeItem(control->decl(), i); return true; } } } else if (auto* vdi = i->dynamicCast()) { if (vdi->e()->type().isvarbool() && (vdi->e() != nullptr) && (vdi->e()->e() != nullptr)) { if (auto* c = vdi->e()->e()->dynamicCast()) { // x = forall([y,z,...]); potentially: x -> (y /\ z /\ ...) if (c->id() == constants().ids.forall) { storeItem(vdi->e(), i); return true; // x ::ctx_pos = pred(...); potentially: pred_imp(..., x); i.e. x -> pred(...) } if (_env.fopts.enableHalfReification && vdi->e()->ann().contains(constants().ctx.pos)) { GCLock lock; auto cid = EnvI::halfReifyId(c->id()); std::vector args; args.reserve(c->argCount() + 1); for (int j = 0; j < c->argCount(); ++j) { args.push_back(c->arg(j)->type()); } args.push_back(Type::varbool()); FunctionI* decl = _env.model->matchFn(_env, cid, args, false); if (decl != nullptr) { storeItem(vdi->e(), i); return true; } } } } } return false; } void ImpCompressor::compress() { for (auto it = _items.begin(); it != _items.end();) { VarDecl* lhs = nullptr; VarDecl* rhs = nullptr; // Check if compression is possible if (auto* ci = it->second->dynamicCast()) { auto* c = ci->e()->cast(); if (c->id() == constants().ids.clause) { auto* positive = c->arg(0)->cast(); auto* var = (*positive)[0]->cast(); bool output_var = var->decl()->ann().contains(constants().ann.output_var); auto usages = _env.varOccurrences.usages(var->decl()); output_var = output_var || usages.second; int occurrences = usages.first; unsigned long lhs_occurences = count(var->decl()); // Compress if: // - There is one occurrence on the RHS of a clause and the others are on the LHS of a // clause // - There is one occurrence on the RHS of a clause, that Id is a reified forall that has no // other occurrences // - There is one occurrence on the RHS of a clause, that Id is a reification in a positive // context, and all other occurrences are on the LHS of a clause bool compress = !output_var && lhs_occurences > 0; if ((var->decl()->e() != nullptr) && (var->decl()->e()->dynamicCast() != nullptr)) { auto* call = var->decl()->e()->cast(); if (call->id() == constants().ids.forall) { compress = compress && (occurrences == 1 && lhs_occurences == 1); } else { compress = compress && (occurrences == lhs_occurences); } } else { compress = compress && (occurrences == lhs_occurences + 1); } if (compress) { rhs = var->decl(); auto* negative = c->arg(1)->cast(); lhs = (*negative)[0]->cast()->decl(); if (lhs == rhs) { continue; } } // TODO: Detect equivalences for output variables. } } if ((lhs != nullptr) && (rhs != nullptr)) { assert(count(rhs) > 0); auto range = find(rhs); std::vector to_process; for (auto match = range.first; match != range.second; ++match) { to_process.push_back(match->second); } _items.erase(range.first, range.second); for (auto* item : to_process) { bool success = compressItem(item, lhs); assert(success); _env.counters.impDel++; } assert(!rhs->ann().contains(constants().ann.output_var)); removeItem(it->second); it = _items.erase(it); } else { ++it; } } } bool ImpCompressor::compressItem(Item* i, VarDecl* newLHS) { GCLock lock; if (auto* ci = i->dynamicCast()) { auto* c = ci->e()->cast(); // Given (x -> y) /\ (y -> z), produce x -> z if (c->id() == constants().ids.clause) { auto* positive = c->arg(0)->cast(); auto* rhs = (*positive)[0]->cast(); if (rhs->decl() != newLHS) { ConstraintI* nci = constructClause(positive, newLHS->id()); _boolConstraints.push_back(addItem(nci)); } removeItem(i); return true; // Given (x -> y) /\ (y -> pred(...)), produce x -> pred(...) } if (c->id() == "mzn_reverse_map_var") { return true; } if (c->id().endsWith("_imp")) { replaceCallArgument(i, c, c->argCount() - 1, newLHS->id()); trackItem(i); return true; } } else if (auto* vdi = i->dynamicCast()) { auto* c = vdi->e()->e()->dynamicCast(); // Given: (x -> y) /\ (y -> (a /\ b /\ ...)), produce (x -> a) /\ (x -> b) /\ ... if (c->id() == constants().ids.forall) { auto* exprs = c->arg(0)->cast(); for (int j = 0; j < exprs->size(); ++j) { auto* rhs = (*exprs)[j]->cast(); if (rhs->decl() != newLHS) { ConstraintI* nci = constructClause(rhs, newLHS->id()); _boolConstraints.push_back(addItem(nci)); } } return true; // x ::ctx_pos = pred(...); potentially: pred_imp(..., x); i.e. x -> pred(...) } if (vdi->e()->ann().contains(constants().ctx.pos)) { ConstraintI* nci = constructHalfReif(c, newLHS->id()); assert(nci); addItem(nci); return true; } } return false; } ConstraintI* ImpCompressor::constructClause(Expression* pos, Expression* neg) { assert(GC::locked()); std::vector args(2); if (pos->dynamicCast() != nullptr) { args[0] = pos; } else { assert(neg->type().isbool()); std::vector eVec(1); eVec[0] = pos; args[0] = new ArrayLit(pos->loc().introduce(), eVec); args[0]->type(Type::varbool(1)); } if (neg->dynamicCast() != nullptr) { args[1] = neg; } else { assert(neg->type().isbool()); std::vector eVec(1); eVec[0] = neg; args[1] = new ArrayLit(neg->loc().introduce(), eVec); args[1]->type(Type::varbool(1)); } // NEVER CREATE (a -> a) assert((*args[0]->dynamicCast())[0]->dynamicCast()->decl() != (*args[1]->dynamicCast())[0]->dynamicCast()->decl()); auto* nc = new Call(MiniZinc::Location().introduce(), constants().ids.clause, args); nc->type(Type::varbool()); nc->decl(_env.model->matchFn(_env, nc, false)); assert(nc->decl()); return new ConstraintI(MiniZinc::Location().introduce(), nc); } ConstraintI* ImpCompressor::constructHalfReif(Call* call, Id* control) { assert(_env.fopts.enableHalfReification); assert(GC::locked()); auto cid = EnvI::halfReifyId(call->id()); std::vector args(call->argCount()); for (int i = 0; i < call->argCount(); ++i) { args[i] = call->arg(i); } args.push_back(control); FunctionI* decl = _env.model->matchFn(_env, cid, args, false); if (decl != nullptr) { auto* nc = new Call(call->loc().introduce(), cid, args); nc->decl(decl); nc->type(Type::varbool()); return new ConstraintI(call->loc().introduce(), nc); } return nullptr; } bool LECompressor::trackItem(Item* i) { if (i->removed()) { return false; } bool added = false; if (auto* ci = i->dynamicCast()) { if (auto* call = ci->e()->dynamicCast()) { // {int,float}_lin_le([c1,c2,...], [x, y,...], 0); if (call->id() == constants().ids.int_.lin_le || call->id() == constants().ids.float_.lin_le) { auto* as = follow_id(call->arg(0))->cast(); auto* bs = follow_id(call->arg(1))->cast(); assert(as->size() == bs->size()); for (int j = 0; j < as->size(); ++j) { if (as->type().isIntArray()) { if (follow_id((*as)[j])->cast()->v() > IntVal(0)) { // Check if left hand side is a variable (could be constant) if (auto* decl = follow_id_to_decl((*bs)[j])->dynamicCast()) { storeItem(decl, i); added = true; } } } else { if (follow_id((*as)[j])->cast()->v() > FloatVal(0)) { // Check if left hand side is a variable (could be constant) if (auto* decl = follow_id_to_decl((*bs)[j])->dynamicCast()) { storeItem(decl, i); added = true; } } } } } assert(call->id() != constants().ids.int2float); } } else if (auto* vdi = i->dynamicCast()) { assert(vdi->e()); if (Expression* vde = vdi->e()->e()) { if (auto* call = vde->dynamicCast()) { if (call->id() == constants().ids.int2float) { if (auto* vd = follow_id_to_decl(call->arg(0))->dynamicCast()) { auto* alias = follow_id_to_decl(vdi->e())->cast(); _aliasMap[vd] = alias; } } } } } return added; } void LECompressor::compress() { for (auto it = _items.begin(); it != _items.end();) { VarDecl* lhs = nullptr; VarDecl* rhs = nullptr; VarDecl* alias = nullptr; // Check if compression is possible if (auto* ci = it->second->dynamicCast()) { auto* call = ci->e()->cast(); if (call->id() == constants().ids.int_.lin_le) { auto* as = follow_id(call->arg(0))->cast(); auto* bs = follow_id(call->arg(1))->cast(); auto* c = follow_id(call->arg(2))->cast(); if (bs->size() == 2 && c->v() == IntVal(0)) { auto a0 = follow_id((*as)[0])->cast()->v(); auto a1 = follow_id((*as)[1])->cast()->v(); if (a0 == -a1 && eqBounds((*bs)[0], (*bs)[1])) { int i = a0 < a1 ? 0 : 1; if (!(*bs)[i]->isa()) { break; } auto* neg = follow_id_to_decl((*bs)[i])->cast(); bool output_var = neg->ann().contains(constants().ann.output_var); auto usages = _env.varOccurrences.usages(neg); int occurrences = usages.first; output_var = output_var || usages.second; unsigned long lhs_occurences = count(neg); bool compress = !output_var; auto search = _aliasMap.find(neg); if (search != _aliasMap.end()) { alias = search->second; auto alias_usages = _env.varOccurrences.usages(alias); int alias_occ = alias_usages.first; compress = compress && (!alias_usages.second); unsigned long alias_lhs_occ = count(alias); // neg is only allowed to occur: // - once in the "implication" // - once in the aliasing // - on a lhs of other expressions // alias is only allowed to occur on a lhs of an expression. compress = compress && (lhs_occurences + alias_lhs_occ > 0) && (occurrences == lhs_occurences + 2) && (alias_occ == alias_lhs_occ); } else { // neg is only allowed to occur: // - once in the "implication" // - on a lhs of other expressions compress = compress && (lhs_occurences > 0) && (occurrences == lhs_occurences + 1); } auto* pos = follow_id_to_decl((*bs)[1 - i])->dynamicCast(); if ((pos != nullptr) && compress) { rhs = neg; lhs = pos; assert(lhs != rhs); } // TODO: Detect equivalences for output variables. } } } } if ((lhs != nullptr) && (rhs != nullptr)) { assert(count(rhs) + count(alias) > 0); auto range = find(rhs); { std::vector to_process; for (auto match = range.first; match != range.second; ++match) { to_process.push_back(match->second); } _items.erase(range.first, range.second); for (auto* item : to_process) { leReplaceVar(item, rhs, lhs); } } if (alias != nullptr) { VarDecl* i2f_lhs; auto search = _aliasMap.find(lhs); if (search != _aliasMap.end()) { i2f_lhs = search->second; } else { // Create new int2float Call* i2f = new Call(lhs->loc().introduce(), constants().ids.int2float, {lhs->id()}); i2f->decl(_env.model->matchFn(_env, i2f, false)); assert(i2f->decl()); i2f->type(Type::varfloat()); auto* domain = new SetLit(lhs->loc().introduce(), eval_floatset(_env, lhs->ti()->domain())); auto* i2f_ti = new TypeInst(lhs->loc().introduce(), Type::varfloat(), domain); i2f_lhs = new VarDecl(lhs->loc().introduce(), i2f_ti, _env.genId(), i2f); i2f_lhs->type(Type::varfloat()); addItem(new VarDeclI(lhs->loc().introduce(), i2f_lhs)); } auto arange = find(alias); { std::vector to_process; for (auto match = arange.first; match != arange.second; ++match) { to_process.push_back(match->second); } _items.erase(arange.first, arange.second); for (auto* item : to_process) { leReplaceVar(item, alias, i2f_lhs); } } } assert(!rhs->ann().contains(constants().ann.output_var)); removeItem(it->second); _env.counters.linDel++; it = _items.erase(it); } else { ++it; } } } template void LECompressor::leReplaceVar(Item* i, VarDecl* oldVar, VarDecl* newVar) { typedef typename LinearTraits::Val Val; GCLock lock; auto* ci = i->cast(); auto* call = ci->e()->cast(); assert(call->id() == constants().ids.int_.lin_le || call->id() == constants().ids.float_.lin_le); // Remove old occurrences CollectDecls cd(_env.varOccurrences, _deletedVarDecls, i); top_down(cd, ci->e()); ArrayLit* al_c = eval_array_lit(_env, call->arg(0)); std::vector coeffs(al_c->size()); for (int j = 0; j < al_c->size(); j++) { coeffs[j] = LinearTraits::eval(_env, (*al_c)[j]); } ArrayLit* al_x = eval_array_lit(_env, call->arg(1)); std::vector x(al_x->size()); for (int j = 0; j < al_x->size(); j++) { Expression* decl = follow_id_to_decl((*al_x)[j]); if (decl && decl->cast() == oldVar) { x[j] = newVar->id(); } else { x[j] = (*al_x)[j]; } } Val d = LinearTraits::eval(_env, call->arg(2)); simplify_lin(coeffs, x, d); if (coeffs.empty()) { i->remove(); _env.counters.linDel++; return; } std::vector coeffs_e(coeffs.size()); std::vector x_e(coeffs.size()); for (unsigned int j = 0; j < coeffs.size(); j++) { coeffs_e[j] = Lit::a(coeffs[j]); x_e[j] = x[j](); Expression* decl = follow_id_to_decl(x_e[j]); if (decl && decl->cast() == newVar) { storeItem(newVar, i); } } if (auto* arg0 = call->arg(0)->dynamicCast()) { arg0->setVec(coeffs_e); } else { auto* al_c_new = new ArrayLit(al_c->loc().introduce(), coeffs_e); al_c_new->type(al_c->type()); call->arg(0, al_c_new); } if (auto* arg1 = call->arg(1)->dynamicCast()) { arg1->setVec(x_e); } else { auto* al_x_new = new ArrayLit(al_x->loc().introduce(), x_e); al_x_new->type(al_x->type()); call->arg(1, al_x_new); } call->arg(2, Lit::a(d)); // Add new occurences CollectOccurrencesE ce(_env.varOccurrences, i); top_down(ce, ci->e()); } bool LECompressor::eqBounds(Expression* a, Expression* b) { // TODO: (To optimise) Check lb(lhs) >= lb(rhs) and enforce ub(lhs) <= ub(rhs) IntSetVal* dom_a = nullptr; IntSetVal* dom_b = nullptr; if (auto* a_decl = follow_id_to_decl(a)->dynamicCast()) { if (a_decl->ti()->domain() != nullptr) { dom_a = eval_intset(_env, a_decl->ti()->domain()); } } else { assert(a->dynamicCast()); auto* a_val = a->cast(); dom_a = IntSetVal::a(a_val->v(), a_val->v()); } if (auto* b_decl = follow_id_to_decl(b)->dynamicCast()) { if (b_decl->ti()->domain() != nullptr) { dom_b = eval_intset(_env, b_decl->ti()->domain()); } } else { assert(b->dynamicCast()); auto* b_val = b->cast(); dom_b = IntSetVal::a(b_val->v(), b_val->v()); } return ((dom_a != nullptr) && (dom_b != nullptr) && (dom_a->min() == dom_b->min()) && (dom_a->max() == dom_b->max())) || ((dom_a == nullptr) && (dom_b == nullptr)); } } // namespace MiniZinc libminizinc-2.5.3/lib/cdecode.c0000644000175000017500000000570413757304533015006 0ustar kaolkaol/* cdecoder.c - c source to a base64 decoding algorithm implementation This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #include int base64_decode_value(char value_in) { static const char decoding[] = {62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51}; static const char decoding_size = sizeof(decoding); value_in -= 43; if (value_in < 0 || value_in >= decoding_size) return -1; return decoding[(int)value_in]; } void base64_init_decodestate(base64_decodestate* state_in) { state_in->step = step_a; state_in->plainchar = 0; } int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) { const char* codechar = code_in; char* plainchar = plaintext_out; char fragment; *plainchar = state_in->plainchar; switch (state_in->step) { while (1) { case step_a: do { if (codechar == code_in + length_in) { state_in->step = step_a; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = (char)base64_decode_value(*codechar++); } while (fragment < 0); *plainchar = (fragment & 0x03f) << 2; case step_b: do { if (codechar == code_in + length_in) { state_in->step = step_b; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = (char)base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x030) >> 4; *plainchar = (fragment & 0x00f) << 4; case step_c: do { if (codechar == code_in + length_in) { state_in->step = step_c; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = (char)base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03c) >> 2; *plainchar = (fragment & 0x003) << 6; case step_d: do { if (codechar == code_in + length_in) { state_in->step = step_d; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = (char)base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03f); } } /* control should not reach here */ return plainchar - plaintext_out; } libminizinc-2.5.3/lib/ast.cpp0000644000175000017500000020264413757304533014551 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include namespace MiniZinc { Location::LocVec* Location::LocVec::a(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column) { static const unsigned int pointerBits = sizeof(void*) * 8; if (pointerBits <= 32) { if (first_line < (1 << 8) && last_line - first_line < (1 << 7) && first_column < (1 << 6) && last_column < (1 << 7)) { long long int combined = first_line; combined |= (last_line - first_line) << 8; combined |= (first_column) << (8 + 7); combined |= (last_column) << (8 + 7 + 6); auto* v = static_cast(alloc(2)); new (v) LocVec(filename, combined); return v; } } else if (pointerBits >= 64) { if (first_line < (1 << 20) && last_line - first_line < (1 << 20) && first_column < (1 << 10) && last_column < (1 << 10)) { long long int combined = first_line; combined |= (static_cast(last_line - first_line)) << 20; combined |= (static_cast(first_column)) << (20 + 20); combined |= (static_cast(last_column)) << (20 + 20 + 10); auto* v = static_cast(alloc(2)); new (v) LocVec(filename, combined); return v; } } auto* v = static_cast(alloc(5)); new (v) LocVec(filename, first_line, first_column, last_line, last_column); return v; } Location::LocVec::LocVec(const ASTString& filename, IntVal combined) : ASTVec(2) { *(_data + 0) = filename.aststr(); *(_data + 1) = IntLit::a(combined); } Location::LocVec::LocVec(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column) : ASTVec(5) { *(_data + 0) = filename.aststr(); *(_data + 1) = IntLit::a(first_line); *(_data + 2) = IntLit::a(last_line); *(_data + 3) = IntLit::a(first_column); *(_data + 4) = IntLit::a(last_column); } Location Location::nonalloc; Type Type::unboxedint = Type::parint(); Type Type::unboxedfloat = Type::parfloat(); Annotation Annotation::empty; std::string Location::toString() const { std::ostringstream oss; oss << filename() << ":" << firstLine() << "." << firstColumn(); return oss.str(); } void Location::mark() const { if (lv() != nullptr) { lv()->mark(); } } Location Location::introduce() const { Location l = *this; if (l._locInfo.lv != nullptr) { l._locInfo.t |= 1; } return l; } void Expression::addAnnotation(Expression* ann) { if (!isUnboxedVal()) { _ann.add(ann); } } void Expression::addAnnotations(const std::vector& ann) { if (!isUnboxedVal()) { for (const auto& i : ann) { if (i != nullptr) { _ann.add(i); } } } } #define pushstack(e) \ do { \ if ((e) != nullptr) { \ stack.push_back(e); \ } \ } while (0) #define pushall(v) \ do { \ (v).mark(); \ for (unsigned int i = 0; i < (v).size(); i++) \ if ((v)[i] != nullptr) { \ stack.push_back((v)[i]); \ } \ } while (0) #define pushann(a) \ do { \ for (ExpressionSetIter it = (a).begin(); it != (a).end(); ++it) { \ pushstack(*it); \ } \ } while (0) void Expression::mark(Expression* e) { if (e == nullptr || e->isUnboxedVal()) { return; } std::vector stack; stack.reserve(1000); stack.push_back(e); while (!stack.empty()) { const Expression* cur = stack.back(); stack.pop_back(); if (!cur->isUnboxedVal() && cur->_gcMark == 0U) { cur->_gcMark = 1U; cur->loc().mark(); pushann(cur->ann()); switch (cur->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_ANON: break; case Expression::E_SETLIT: if (cur->cast()->isv() != nullptr) { cur->cast()->isv()->mark(); } else if (cur->cast()->fsv() != nullptr) { cur->cast()->fsv()->mark(); } else { pushall(cur->cast()->v()); } break; case Expression::E_STRINGLIT: cur->cast()->v().mark(); break; case Expression::E_ID: if (cur->cast()->idn() == -1) { cur->cast()->v().mark(); } pushstack(cur->cast()->decl()); break; case Expression::E_ARRAYLIT: if (cur->_flag2) { pushstack(cur->cast()->_u.al); } else { pushall(ASTExprVec(cur->cast()->_u.v)); } cur->cast()->_dims.mark(); break; case Expression::E_ARRAYACCESS: pushstack(cur->cast()->v()); pushall(cur->cast()->idx()); break; case Expression::E_COMP: pushstack(cur->cast()->_e); pushall(cur->cast()->_g); cur->cast()->_gIndex.mark(); break; case Expression::E_ITE: pushstack(cur->cast()->elseExpr()); pushall(cur->cast()->_eIfThen); break; case Expression::E_BINOP: pushstack(cur->cast()->lhs()); pushstack(cur->cast()->rhs()); break; case Expression::E_UNOP: pushstack(cur->cast()->e()); break; case Expression::E_CALL: cur->cast()->id().mark(); for (unsigned int i = cur->cast()->argCount(); (i--) != 0U;) { pushstack(cur->cast()->arg(i)); } if (!cur->cast()->_u.oneArg->isUnboxedVal() && !cur->cast()->_u.oneArg->isTagged()) { cur->cast()->_u.args->mark(); } if (FunctionI* fi = cur->cast()->decl()) { Item::mark(fi); } break; case Expression::E_VARDECL: pushstack(cur->cast()->ti()); pushstack(cur->cast()->e()); pushstack(cur->cast()->id()); break; case Expression::E_LET: pushall(cur->cast()->let()); pushall(cur->cast()->_letOrig); pushstack(cur->cast()->in()); break; case Expression::E_TI: pushstack(cur->cast()->domain()); pushall(cur->cast()->ranges()); break; case Expression::E_TIID: cur->cast()->v().mark(); break; } } } } #undef pushstack #undef pushall void IntLit::rehash() { initHash(); std::hash h; combineHash(h(_v)); } void FloatLit::rehash() { initHash(); std::hash h; combineHash(h(_v)); } void SetLit::rehash() { initHash(); if (isv() != nullptr) { std::hash h; for (IntSetRanges r0(isv()); r0(); ++r0) { combineHash(h(r0.min())); combineHash(h(r0.max())); } } else if (fsv() != nullptr) { std::hash h; for (FloatSetRanges r0(fsv()); r0(); ++r0) { combineHash(h(r0.min())); combineHash(h(r0.max())); } } else { for (unsigned int i = v().size(); (i--) != 0U;) { combineHash(Expression::hash(_v[i])); } } } void BoolLit::rehash() { initHash(); std::hash h; combineHash(h(_v)); } void StringLit::rehash() { initHash(); combineHash(_v.hash()); } void Id::rehash() { initHash(); std::hash h; if (idn() == -1) { combineHash(v().hash()); } else { combineHash(h(idn())); } } int Id::levenshteinDistance(Id* other) const { if (idn() != -1 || other->idn() != -1) { return std::numeric_limits::max(); } return v().levenshteinDistance(other->v()); } ASTString Id::str() const { if (idn() == -1) { return v(); } std::ostringstream oss; oss << "X_INTRODUCED_" << idn() << "_"; return oss.str(); } void TIId::rehash() { initHash(); combineHash(_v.hash()); } void AnonVar::rehash() { initHash(); } unsigned int ArrayLit::dims() const { return _flag2 ? ((_dims.size() - 2 * _u.al->dims()) / 2) : (_dims.size() == 0 ? 1 : _dims.size() / 2); } int ArrayLit::min(unsigned int i) const { if (_dims.size() == 0) { assert(i == 0); return 1; } return _dims[2 * i]; } int ArrayLit::max(unsigned int i) const { if (_dims.size() == 0) { assert(i == 0); return static_cast(_u.v->size()); } return _dims[2 * i + 1]; } unsigned int ArrayLit::length() const { if (dims() == 0) { return 0; } unsigned int l = max(0) - min(0) + 1; for (int i = 1; i < dims(); i++) { l *= (max(i) - min(i) + 1); } return l; } void ArrayLit::make1d() { if (_dims.size() != 0) { GCLock lock; if (_flag2) { std::vector d(2 + _u.al->dims() * 2); unsigned int dimOffset = dims() * 2; d[0] = 1; d[1] = length(); for (unsigned int i = 2; i < d.size(); i++) { d[i] = _dims[dimOffset + i]; } _dims = ASTIntVec(d); } else { std::vector d(2); d[0] = 1; d[1] = length(); _dims = ASTIntVec(d); } } } unsigned int ArrayLit::origIdx(unsigned int i) const { assert(_flag2); unsigned int curIdx = i; int multiplyer = 1; unsigned int oIdx = 0; unsigned int sliceOffset = dims() * 2; for (int curDim = static_cast(_u.al->dims()) - 1; curDim >= 0; curDim--) { oIdx += multiplyer * ((curIdx % (_dims[sliceOffset + curDim * 2 + 1] - _dims[sliceOffset + curDim * 2] + 1)) + (_dims[sliceOffset + curDim * 2] - _u.al->min(curDim))); curIdx = curIdx / (_dims[sliceOffset + curDim * 2 + 1] - _dims[sliceOffset + curDim * 2] + 1); multiplyer *= (_u.al->max(curDim) - _u.al->min(curDim) + 1); } return oIdx; } Expression* ArrayLit::getSlice(unsigned int i) const { if (!_flag2) { assert(_u.v->flag()); int off = static_cast(length()) - static_cast(_u.v->size()); return i <= off ? (*_u.v)[0] : (*_u.v)[i - off]; } assert(_flag2); return (*_u.al)[origIdx(i)]; } void ArrayLit::setSlice(unsigned int i, Expression* e) { if (!_flag2) { assert(_u.v->flag()); int off = static_cast(length()) - static_cast(_u.v->size()); if (i <= off) { (*_u.v)[0] = e; } else { (*_u.v)[i - off] = e; } } else { assert(_flag2); _u.al->set(origIdx(i), e); } } ArrayLit::ArrayLit(const Location& loc, ArrayLit* v, const std::vector >& dims, const std::vector >& slice) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = true; _u.al = v; assert(slice.size() == v->dims()); std::vector d(dims.size() * 2 + 2 * slice.size()); for (auto i = static_cast(dims.size()); (i--) != 0U;) { d[i * 2] = dims[i].first; d[i * 2 + 1] = dims[i].second; } int sliceOffset = static_cast(2 * dims.size()); for (auto i = static_cast(slice.size()); (i--) != 0U;) { d[sliceOffset + i * 2] = slice[i].first; d[sliceOffset + i * 2 + 1] = slice[i].second; } _dims = ASTIntVec(d); } void ArrayLit::compress(const std::vector& v, const std::vector& dims) { if (v.size() >= 4 && Expression::equal(v[0], v[1]) && Expression::equal(v[1], v[2]) && Expression::equal(v[2], v[3])) { std::vector compress(v.size()); compress[0] = v[0]; int k = 4; while (k < v.size() && Expression::equal(v[k], v[0])) { k++; } int i = 1; for (; k < v.size(); k++) { compress[i++] = v[k]; } compress.resize(i); _u.v = ASTExprVec(compress).vec(); _u.v->flag(true); _dims = ASTIntVec(dims); } else { _u.v = ASTExprVec(v).vec(); if (dims.size() != 2 || dims[0] != 1) { // only allocate dims vector if it is not a 1d array indexed from 1 _dims = ASTIntVec(dims); } } } ArrayLit::ArrayLit(const Location& loc, const std::vector& v, const std::vector >& dims) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = false; std::vector d(dims.size() * 2); for (auto i = static_cast(dims.size()); (i--) != 0U;) { d[i * 2] = dims[i].first; d[i * 2 + 1] = dims[i].second; } compress(v, d); rehash(); } void ArrayLit::rehash() { initHash(); std::hash h; for (int _dim : _dims) { combineHash(h(_dim)); } if (_flag2) { combineHash(Expression::hash(_u.al)); } else { for (unsigned int i = _u.v->size(); (i--) != 0U;) { combineHash(h(static_cast(i))); combineHash(Expression::hash((*_u.v)[i])); } } } void ArrayAccess::rehash() { initHash(); combineHash(Expression::hash(_v)); std::hash h; combineHash(h(_idx.size())); for (unsigned int i = _idx.size(); (i--) != 0U;) { combineHash(Expression::hash(_idx[i])); } } Generator::Generator(const std::vector& v, Expression* in, Expression* where) { std::vector vd; Location loc = in == nullptr ? where->loc() : in->loc(); for (auto i : v) { auto* nvd = new VarDecl(loc, new TypeInst(loc, Type::parint()), i); nvd->toplevel(false); vd.push_back(nvd); } _v = vd; _in = in; _where = where; } Generator::Generator(const std::vector& v, Expression* in, Expression* where) { std::vector vd; for (auto* i : v) { auto* nvd = new VarDecl(i->loc(), new TypeInst(i->loc(), Type::parint()), i->v()); nvd->toplevel(false); vd.push_back(nvd); } _v = vd; _in = in; _where = where; } Generator::Generator(const std::vector& v, Expression* in, Expression* where) { std::vector vd; Location loc = in == nullptr ? where->loc() : in->loc(); for (const auto& i : v) { auto* nvd = new VarDecl(loc, new TypeInst(loc, Type::parint()), ASTString(i)); nvd->toplevel(false); vd.push_back(nvd); } _v = vd; _in = in; _where = where; } Generator::Generator(const std::vector& v, Expression* in, Expression* where) { _v = v; _in = in; _where = where; } Generator::Generator(int pos, Expression* where) { std::vector vd; std::ostringstream oss; oss << "__dummy" << pos; auto* nvd = new VarDecl(Location().introduce(), new TypeInst(Location().introduce(), Type::parint()), ASTString(oss.str())); nvd->toplevel(false); vd.push_back(nvd); _v = vd; _in = new ArrayLit(Location().introduce(), std::vector({IntLit::a(0)})); _where = where; } bool Comprehension::set() const { return _flag1; } void Comprehension::rehash() { initHash(); std::hash h; combineHash(h(static_cast(set()))); combineHash(Expression::hash(_e)); combineHash(h(_gIndex.size())); for (unsigned int i = _gIndex.size(); (i--) != 0U;) { combineHash(h(_gIndex[i])); } combineHash(h(_g.size())); for (unsigned int i = _g.size(); (i--) != 0U;) { combineHash(Expression::hash(_g[i])); } } unsigned int Comprehension::numberOfGenerators() const { return _gIndex.size() - 1; } Expression* Comprehension::in(unsigned int i) { return _g[_gIndex[i]]; } const Expression* Comprehension::in(unsigned int i) const { return _g[_gIndex[i]]; } const Expression* Comprehension::where(unsigned int i) const { return _g[_gIndex[i] + 1]; } Expression* Comprehension::where(unsigned int i) { return _g[_gIndex[i] + 1]; } unsigned int Comprehension::numberOfDecls(unsigned int i) const { return _gIndex[i + 1] - _gIndex[i] - 2; } VarDecl* Comprehension::decl(unsigned int gen, unsigned int i) { return _g[_gIndex[gen] + 2 + i]->cast(); } const VarDecl* Comprehension::decl(unsigned int gen, unsigned int i) const { return _g[_gIndex[gen] + 2 + i]->cast(); } bool Comprehension::containsBoundVariable(Expression* e) { std::unordered_set decls; for (unsigned int i = 0; i < numberOfGenerators(); i++) { for (unsigned int j = 0; j < numberOfDecls(i); j++) { decls.insert(decl(i, j)); } } class FindVar : public EVisitor { std::unordered_set& _decls; bool _found; public: FindVar(std::unordered_set& decls) : _decls(decls), _found(false) {} bool enter(Expression* /*e*/) const { return !_found; } void vId(Id& ident) { if (_decls.find(ident.decl()) != _decls.end()) { _found = true; } } bool found() const { return _found; } } _fv(decls); top_down(_fv, e); return _fv.found(); } void ITE::rehash() { initHash(); std::hash h; combineHash(h(_eIfThen.size())); for (unsigned int i = _eIfThen.size(); (i--) != 0U;) { combineHash(Expression::hash(_eIfThen[i])); } combineHash(Expression::hash(elseExpr())); } BinOpType BinOp::op() const { return static_cast(_secondaryId); } void BinOp::rehash() { initHash(); std::hash h; combineHash(h(static_cast(op()))); combineHash(Expression::hash(_e0)); combineHash(Expression::hash(_e1)); } Call* BinOp::morph(const ASTString& ident, const std::vector& args) { _id = Call::eid; _flag1 = true; Call* c = cast(); c->id(ident); c->args(args); return c; } namespace { class OpToString : public GCMarker { public: Id* sBOT_PLUS; // NOLINT(readability-identifier-naming) Id* sBOT_MINUS; // NOLINT(readability-identifier-naming) Id* sBOT_MULT; // NOLINT(readability-identifier-naming) Id* sBOT_DIV; // NOLINT(readability-identifier-naming) Id* sBOT_IDIV; // NOLINT(readability-identifier-naming) Id* sBOT_MOD; // NOLINT(readability-identifier-naming) Id* sBOT_POW; // NOLINT(readability-identifier-naming) Id* sBOT_LE; // NOLINT(readability-identifier-naming) Id* sBOT_LQ; // NOLINT(readability-identifier-naming) Id* sBOT_GR; // NOLINT(readability-identifier-naming) Id* sBOT_GQ; // NOLINT(readability-identifier-naming) Id* sBOT_EQ; // NOLINT(readability-identifier-naming) Id* sBOT_NQ; // NOLINT(readability-identifier-naming) Id* sBOT_IN; // NOLINT(readability-identifier-naming) Id* sBOT_SUBSET; // NOLINT(readability-identifier-naming) Id* sBOT_SUPERSET; // NOLINT(readability-identifier-naming) Id* sBOT_UNION; // NOLINT(readability-identifier-naming) Id* sBOT_DIFF; // NOLINT(readability-identifier-naming) Id* sBOT_SYMDIFF; // NOLINT(readability-identifier-naming) Id* sBOT_INTERSECT; // NOLINT(readability-identifier-naming) Id* sBOT_PLUSPLUS; // NOLINT(readability-identifier-naming) Id* sBOT_EQUIV; // NOLINT(readability-identifier-naming) Id* sBOT_IMPL; // NOLINT(readability-identifier-naming) Id* sBOT_RIMPL; // NOLINT(readability-identifier-naming) Id* sBOT_OR; // NOLINT(readability-identifier-naming) Id* sBOT_AND; // NOLINT(readability-identifier-naming) Id* sBOT_XOR; // NOLINT(readability-identifier-naming) Id* sBOT_DOTDOT; // NOLINT(readability-identifier-naming) Id* sBOT_NOT; // NOLINT(readability-identifier-naming) OpToString() { GCLock lock; sBOT_PLUS = new Id(Location(), "'+'", nullptr); sBOT_MINUS = new Id(Location(), "'-'", nullptr); sBOT_MULT = new Id(Location(), "'*'", nullptr); sBOT_DIV = new Id(Location(), "'/'", nullptr); sBOT_IDIV = new Id(Location(), "'div'", nullptr); sBOT_MOD = new Id(Location(), "'mod'", nullptr); sBOT_POW = new Id(Location(), "'^'", nullptr); sBOT_LE = new Id(Location(), "'<'", nullptr); sBOT_LQ = new Id(Location(), "'<='", nullptr); sBOT_GR = new Id(Location(), "'>'", nullptr); sBOT_GQ = new Id(Location(), "'>='", nullptr); sBOT_EQ = new Id(Location(), "'='", nullptr); sBOT_NQ = new Id(Location(), "'!='", nullptr); sBOT_IN = new Id(Location(), "'in'", nullptr); sBOT_SUBSET = new Id(Location(), "'subset'", nullptr); sBOT_SUPERSET = new Id(Location(), "'superset'", nullptr); sBOT_UNION = new Id(Location(), "'union'", nullptr); sBOT_DIFF = new Id(Location(), "'diff'", nullptr); sBOT_SYMDIFF = new Id(Location(), "'symdiff'", nullptr); sBOT_INTERSECT = new Id(Location(), "'intersect'", nullptr); sBOT_PLUSPLUS = new Id(Location(), "'++'", nullptr); sBOT_EQUIV = new Id(Location(), "'<->'", nullptr); sBOT_IMPL = new Id(Location(), "'->'", nullptr); sBOT_RIMPL = new Id(Location(), "'<-'", nullptr); sBOT_OR = new Id(Location(), "'\\/'", nullptr); sBOT_AND = new Id(Location(), "'/\\'", nullptr); sBOT_XOR = new Id(Location(), "'xor'", nullptr); sBOT_DOTDOT = new Id(Location(), "'..'", nullptr); sBOT_NOT = new Id(Location(), "'not'", nullptr); } static OpToString& o() { static OpToString _o; return _o; } void mark(MINIZINC_GC_STAT_ARGS) override { Expression::mark(sBOT_PLUS); Expression::mark(sBOT_MINUS); Expression::mark(sBOT_MULT); Expression::mark(sBOT_DIV); Expression::mark(sBOT_IDIV); Expression::mark(sBOT_MOD); Expression::mark(sBOT_POW); Expression::mark(sBOT_LE); Expression::mark(sBOT_LQ); Expression::mark(sBOT_GR); Expression::mark(sBOT_GQ); Expression::mark(sBOT_EQ); Expression::mark(sBOT_NQ); Expression::mark(sBOT_IN); Expression::mark(sBOT_SUBSET); Expression::mark(sBOT_SUPERSET); Expression::mark(sBOT_UNION); Expression::mark(sBOT_DIFF); Expression::mark(sBOT_SYMDIFF); Expression::mark(sBOT_INTERSECT); Expression::mark(sBOT_PLUSPLUS); Expression::mark(sBOT_EQUIV); Expression::mark(sBOT_IMPL); Expression::mark(sBOT_RIMPL); Expression::mark(sBOT_OR); Expression::mark(sBOT_AND); Expression::mark(sBOT_XOR); Expression::mark(sBOT_DOTDOT); Expression::mark(sBOT_NOT); } }; } // namespace ASTString BinOp::opToString() const { switch (op()) { case BOT_PLUS: return OpToString::o().sBOT_PLUS->v(); case BOT_MINUS: return OpToString::o().sBOT_MINUS->v(); case BOT_MULT: return OpToString::o().sBOT_MULT->v(); case BOT_DIV: return OpToString::o().sBOT_DIV->v(); case BOT_IDIV: return OpToString::o().sBOT_IDIV->v(); case BOT_MOD: return OpToString::o().sBOT_MOD->v(); case BOT_POW: return OpToString::o().sBOT_POW->v(); case BOT_LE: return OpToString::o().sBOT_LE->v(); case BOT_LQ: return OpToString::o().sBOT_LQ->v(); case BOT_GR: return OpToString::o().sBOT_GR->v(); case BOT_GQ: return OpToString::o().sBOT_GQ->v(); case BOT_EQ: return OpToString::o().sBOT_EQ->v(); case BOT_NQ: return OpToString::o().sBOT_NQ->v(); case BOT_IN: return OpToString::o().sBOT_IN->v(); case BOT_SUBSET: return OpToString::o().sBOT_SUBSET->v(); case BOT_SUPERSET: return OpToString::o().sBOT_SUPERSET->v(); case BOT_UNION: return OpToString::o().sBOT_UNION->v(); case BOT_DIFF: return OpToString::o().sBOT_DIFF->v(); case BOT_SYMDIFF: return OpToString::o().sBOT_SYMDIFF->v(); case BOT_INTERSECT: return OpToString::o().sBOT_INTERSECT->v(); case BOT_PLUSPLUS: return OpToString::o().sBOT_PLUSPLUS->v(); case BOT_EQUIV: return OpToString::o().sBOT_EQUIV->v(); case BOT_IMPL: return OpToString::o().sBOT_IMPL->v(); case BOT_RIMPL: return OpToString::o().sBOT_RIMPL->v(); case BOT_OR: return OpToString::o().sBOT_OR->v(); case BOT_AND: return OpToString::o().sBOT_AND->v(); case BOT_XOR: return OpToString::o().sBOT_XOR->v(); case BOT_DOTDOT: return OpToString::o().sBOT_DOTDOT->v(); default: assert(false); return ASTString(""); } } UnOpType UnOp::op() const { return static_cast(_secondaryId); } void UnOp::rehash() { initHash(); std::hash h; combineHash(h(static_cast(_secondaryId))); combineHash(Expression::hash(_e0)); } ASTString UnOp::opToString() const { switch (op()) { case UOT_PLUS: return OpToString::o().sBOT_PLUS->v(); case UOT_MINUS: return OpToString::o().sBOT_MINUS->v(); case UOT_NOT: return OpToString::o().sBOT_NOT->v(); default: assert(false); return ASTString(""); } } void Call::rehash() { initHash(); combineHash(id().hash()); std::hash hf; combineHash(hf(decl())); std::hash hu; combineHash(hu(argCount())); for (unsigned int i = 0; i < argCount(); i++) { combineHash(Expression::hash(arg(i))); } } void VarDecl::trail() { GC::trail(&_e, e()); if (_ti->ranges().size() > 0) { GC::trail(reinterpret_cast(&_ti), _ti); } } void VarDecl::rehash() { initHash(); combineHash(Expression::hash(_ti)); combineHash(_id->hash()); combineHash(Expression::hash(_e)); } void Let::rehash() { initHash(); combineHash(Expression::hash(_in)); std::hash h; combineHash(h(_let.size())); for (unsigned int i = _let.size(); (i--) != 0U;) { combineHash(Expression::hash(_let[i])); } } Let::Let(const Location& loc, const std::vector& let, Expression* in) : Expression(loc, E_LET, Type()) { _let = ASTExprVec(let); std::vector vde; for (auto* i : let) { if (auto* vd = Expression::dynamicCast(i)) { vde.push_back(vd->e()); for (unsigned int i = 0; i < vd->ti()->ranges().size(); i++) { vde.push_back(vd->ti()->ranges()[i]->domain()); } } } _letOrig = ASTExprVec(vde); _in = in; rehash(); } void Let::pushbindings() { GC::mark(); for (unsigned int i = 0, j = 0; i < _let.size(); i++) { if (auto* vd = _let[i]->dynamicCast()) { vd->trail(); vd->e(_letOrig[j++]); for (unsigned int k = 0; k < vd->ti()->ranges().size(); k++) { vd->ti()->ranges()[k]->domain(_letOrig[j++]); } } } } // NOLINTNEXTLINE(readability-convert-member-functions-to-static) void Let::popbindings() { GC::untrail(); } void TypeInst::rehash() { initHash(); std::hash h; unsigned int rsize = _ranges.size(); combineHash(h(rsize)); for (unsigned int i = rsize; (i--) != 0U;) { combineHash(Expression::hash(_ranges[i])); } combineHash(Expression::hash(domain())); } void TypeInst::setRanges(const std::vector& ranges) { _ranges = ASTExprVec(ranges); if (ranges.size() == 1 && (ranges[0] != nullptr) && ranges[0]->isa() && (ranges[0]->cast()->domain() != nullptr) && ranges[0]->cast()->domain()->isa() && !ranges[0]->cast()->domain()->cast()->v().beginsWith("$")) { _type.dim(-1); } else { _type.dim(static_cast(ranges.size())); } rehash(); } bool TypeInst::hasTiVariable() const { if ((domain() != nullptr) && domain()->isa()) { return true; } for (unsigned int i = _ranges.size(); (i--) != 0U;) { if (_ranges[i]->isa()) { return true; } } return false; } namespace { Type get_type(Expression* e) { return e->type(); } Type get_type(const Type& t) { return t; } const Location& get_loc(Expression* e, FunctionI* /*fi*/) { return e->loc(); } const Location& get_loc(const Type& /*t*/, FunctionI* fi) { return fi->loc(); } bool isa_tiid(Expression* e) { if (TIId* t = Expression::dynamicCast(e)) { return !t->v().beginsWith("$"); } return false; } bool isa_enum_tiid(Expression* e) { if (TIId* t = Expression::dynamicCast(e)) { return t->v().beginsWith("$"); } return false; } template Type return_type(EnvI& env, FunctionI* fi, const std::vector& ta, bool strictEnum) { if (fi->id() == constants().varRedef->id()) { return Type::varbool(); } Type ret = fi->ti()->type(); ASTString dh; if (fi->ti()->domain() && fi->ti()->domain()->isa()) { dh = fi->ti()->domain()->cast()->v(); } ASTString rh; if (fi->ti()->ranges().size() == 1 && isa_tiid(fi->ti()->ranges()[0]->domain())) { rh = fi->ti()->ranges()[0]->domain()->cast()->v(); } ASTStringMap tmap; for (unsigned int i = 0; i < ta.size(); i++) { TypeInst* tii = fi->params()[i]->ti(); if (tii->domain() && tii->domain()->isa()) { ASTString tiid = tii->domain()->cast()->v(); Type tiit = get_type(ta[i]); if (tiit.enumId() != 0 && tiit.dim() > 0) { const std::vector& enumIds = env.getArrayEnum(tiit.enumId()); tiit.enumId(enumIds[enumIds.size() - 1]); } tiit.dim(0); if (tii->type().st() == Type::ST_SET) { tiit.st(Type::ST_PLAIN); } if (isa_enum_tiid(tii->domain())) { tiit.st(Type::ST_SET); } auto it = tmap.find(tiid); if (it == tmap.end()) { tmap.insert(std::pair(tiid, tiit)); } else { if (it->second.dim() > 0) { std::ostringstream ss; ss << "type-inst variable $" << tiid << " used in both array and non-array position"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } Type tiit_par = tiit; tiit_par.ti(Type::TI_PAR); tiit_par.ot(Type::OT_PRESENT); Type its_par = it->second; its_par.ti(Type::TI_PAR); its_par.ot(Type::OT_PRESENT); if (tiit_par.bt() == Type::BT_TOP || tiit_par.bt() == Type::BT_BOT) { tiit_par.bt(its_par.bt()); } if (its_par.bt() == Type::BT_TOP || its_par.bt() == Type::BT_BOT) { its_par.bt(tiit_par.bt()); } if (env.isSubtype(tiit_par, its_par, strictEnum)) { if (it->second.bt() == Type::BT_TOP) { it->second.bt(tiit.bt()); } } else if (env.isSubtype(its_par, tiit_par, strictEnum)) { it->second = tiit_par; } else { std::ostringstream ss; ss << "type-inst variable $" << tiid << " instantiated with different types (" << tiit.toString(env) << " vs " << it->second.toString(env) << ")"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } } } if (tii->ranges().size() == 1 && isa_tiid(tii->ranges()[0]->domain())) { ASTString tiid = tii->ranges()[0]->domain()->cast()->v(); Type orig_tiit = get_type(ta[i]); if (orig_tiit.dim() == 0) { std::ostringstream ss; ss << "type-inst variable $" << tiid << " must be an array index"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } Type tiit = Type::top(orig_tiit.dim()); if (orig_tiit.enumId() != 0) { std::vector enumIds(tiit.dim() + 1); const std::vector& orig_enumIds = env.getArrayEnum(orig_tiit.enumId()); for (unsigned int i = 0; i < enumIds.size() - 1; i++) { enumIds[i] = orig_enumIds[i]; } enumIds[enumIds.size() - 1] = 0; tiit.enumId(env.registerArrayEnum(enumIds)); } auto it = tmap.find(tiid); if (it == tmap.end()) { tmap.insert(std::pair(tiid, tiit)); } else { if (it->second.dim() == 0) { std::ostringstream ss; ss << "type-inst variable $" << tiid << " used in both array and non-array position"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } if (it->second != tiit) { std::ostringstream ss; ss << "type-inst variable $" << tiid << " instantiated with different types (" << tiit.toString(env) + " vs " << it->second.toString(env) << ")"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } } } else if (tii->ranges().size() > 0) { for (unsigned int j = 0; j < tii->ranges().size(); j++) { if (isa_enum_tiid(tii->ranges()[j]->domain())) { ASTString enumTIId = tii->ranges()[j]->domain()->cast()->v(); Type tiit = get_type(ta[i]); Type enumIdT; if (tiit.enumId() != 0) { unsigned int enumId = env.getArrayEnum(tiit.enumId())[j]; enumIdT = Type::parsetenum(enumId); } else { enumIdT = Type::parsetint(); } auto it = tmap.find(enumTIId); // TODO: this may clash if the same enum TIId is used for different types // but the same enum if (it == tmap.end()) { tmap.insert(std::pair(enumTIId, enumIdT)); } else if (strictEnum && it->second.enumId() != enumIdT.enumId()) { std::ostringstream ss; ss << "type-inst variable $" << enumTIId << " used for different enum types"; throw TypeError(env, get_loc(ta[i], fi), ss.str()); } } } } } if (dh.size() != 0) { auto it = tmap.find(dh); if (it == tmap.end()) { std::ostringstream ss; ss << "type-inst variable $" << dh << " used but not defined"; throw TypeError(env, fi->loc(), ss.str()); } if (dh.beginsWith("$")) { // this is an enum ret.bt(Type::BT_INT); } else { ret.bt(it->second.bt()); if (ret.st() == Type::ST_PLAIN) { ret.st(it->second.st()); } } if (fi->ti()->ranges().size() > 0 && it->second.enumId() != 0) { std::vector enumIds(fi->ti()->ranges().size() + 1); for (unsigned int i = 0; i < fi->ti()->ranges().size(); i++) { enumIds[i] = 0; } enumIds[enumIds.size() - 1] = it->second.enumId(); ret.enumId(env.registerArrayEnum(enumIds)); } else { ret.enumId(it->second.enumId()); } } if (rh.size() != 0) { auto it = tmap.find(rh); if (it == tmap.end()) { std::ostringstream ss; ss << "type-inst variable $" << rh << " used but not defined"; throw TypeError(env, fi->loc(), ss.str()); } ret.dim(it->second.dim()); if (it->second.enumId() != 0) { std::vector enumIds(it->second.dim() + 1); const std::vector& orig_enumIds = env.getArrayEnum(it->second.enumId()); for (unsigned int i = 0; i < enumIds.size() - 1; i++) { enumIds[i] = orig_enumIds[i]; } enumIds[enumIds.size() - 1] = ret.enumId() == 0 ? 0 : env.getArrayEnum(ret.enumId())[enumIds.size() - 1]; ret.enumId(env.registerArrayEnum(enumIds)); } } else if (fi->ti()->ranges().size() > 0) { std::vector enumIds(fi->ti()->ranges().size() + 1); bool hadRealEnum = false; if (ret.enumId() == 0) { enumIds[enumIds.size() - 1] = 0; } else { enumIds[enumIds.size() - 1] = env.getArrayEnum(ret.enumId())[enumIds.size() - 1]; hadRealEnum = true; } for (unsigned int i = 0; i < fi->ti()->ranges().size(); i++) { if (isa_enum_tiid(fi->ti()->ranges()[i]->domain())) { ASTString enumTIId = fi->ti()->ranges()[i]->domain()->cast()->v(); auto it = tmap.find(enumTIId); if (it == tmap.end()) { std::ostringstream ss; ss << "type-inst variable $" << enumTIId << " used but not defined"; throw TypeError(env, fi->loc(), ss.str()); } enumIds[i] = it->second.enumId(); hadRealEnum |= (enumIds[i] != 0); } else { enumIds[i] = 0; } } if (hadRealEnum) { ret.enumId(env.registerArrayEnum(enumIds)); } } return ret; } } // namespace #if defined(MINIZINC_GC_STATS) void Item::mark(Item* item, MINIZINC_GC_STAT_ARGS) { #else void Item::mark(Item* item) { #endif if (item->hasMark()) { return; } item->_gcMark = 1; item->loc().mark(); switch (item->iid()) { case Item::II_INC: item->cast()->f().mark(); break; case Item::II_VD: Expression::mark(item->cast()->e()); #if defined(MINIZINC_GC_STATS) gc_stats[item->cast()->e()->Expression::eid()].inmodel++; #endif break; case Item::II_ASN: item->cast()->id().mark(); Expression::mark(item->cast()->e()); Expression::mark(item->cast()->decl()); break; case Item::II_CON: Expression::mark(item->cast()->e()); #if defined(MINIZINC_GC_STATS) gc_stats[item->cast()->e()->Expression::eid()].inmodel++; #endif break; case Item::II_SOL: { auto* si = item->cast(); for (ExpressionSetIter it = si->ann().begin(); it != si->ann().end(); ++it) { Expression::mark(*it); } } Expression::mark(item->cast()->e()); break; case Item::II_OUT: Expression::mark(item->cast()->e()); break; case Item::II_FUN: { auto* fi = item->cast(); fi->id().mark(); Expression::mark(fi->ti()); for (ExpressionSetIter it = fi->ann().begin(); it != fi->ann().end(); ++it) { Expression::mark(*it); } Expression::mark(fi->e()); fi->params().mark(); for (unsigned int k = 0; k < fi->params().size(); k++) { Expression::mark(fi->params()[k]); } } break; } } Type FunctionI::rtype(EnvI& env, const std::vector& ta, bool strictEnums) { return return_type(env, this, ta, strictEnums); } Type FunctionI::rtype(EnvI& env, const std::vector& ta, bool strictEnums) { return return_type(env, this, ta, strictEnums); } Type FunctionI::argtype(EnvI& env, const std::vector& ta, unsigned int n) const { TypeInst* tii = params()[n]->ti(); if ((tii->domain() != nullptr) && tii->domain()->isa()) { Type ty = ta[n]->type(); ty.st(tii->type().st()); ty.dim(tii->type().dim()); ASTString tv = tii->domain()->cast()->v(); for (unsigned int i = 0; i < params().size(); i++) { if ((params()[i]->ti()->domain() != nullptr) && params()[i]->ti()->domain()->isa() && params()[i]->ti()->domain()->cast()->v() == tv) { Type toCheck = ta[i]->type(); toCheck.st(tii->type().st()); toCheck.dim(tii->type().dim()); if (toCheck != ty) { if (env.isSubtype(ty, toCheck, true)) { ty = toCheck; } else { Type ty_par = ty; ty_par.ti(Type::TI_PAR); Type toCheck_par = toCheck; toCheck_par.ti(Type::TI_PAR); if (env.isSubtype(ty_par, toCheck_par, true)) { ty.bt(toCheck.bt()); } } } } } return ty; } return tii->type(); } bool Expression::equalInternal(const Expression* e0, const Expression* e1) { switch (e0->eid()) { case Expression::E_INTLIT: return e0->cast()->v() == e1->cast()->v(); case Expression::E_FLOATLIT: return e0->cast()->v() == e1->cast()->v(); case Expression::E_SETLIT: { const auto* s0 = e0->cast(); const auto* s1 = e1->cast(); if (s0->isv() != nullptr) { if (s1->isv() != nullptr) { IntSetRanges r0(s0->isv()); IntSetRanges r1(s1->isv()); return Ranges::equal(r0, r1); } return false; } if (s0->fsv() != nullptr) { if (s1->fsv() != nullptr) { FloatSetRanges r0(s0->fsv()); FloatSetRanges r1(s1->fsv()); return Ranges::equal(r0, r1); } return false; } if ((s1->isv() != nullptr) || (s1->fsv() != nullptr)) { return false; } if (s0->v().size() != s1->v().size()) { return false; } for (unsigned int i = 0; i < s0->v().size(); i++) { if (!Expression::equal(s0->v()[i], s1->v()[i])) { return false; } } return true; } case Expression::E_BOOLLIT: return e0->cast()->v() == e1->cast()->v(); case Expression::E_STRINGLIT: return e0->cast()->v() == e1->cast()->v(); case Expression::E_ID: { const Id* id0 = e0->cast(); const Id* id1 = e1->cast(); if (id0->decl() == nullptr || id1->decl() == nullptr) { return id0->v() == id1->v() && id0->idn() == id1->idn(); } return id0->decl() == id1->decl() || (id0->decl()->flat() != nullptr && id0->decl()->flat() == id1->decl()->flat()); } case Expression::E_ANON: return false; case Expression::E_ARRAYLIT: { const auto* a0 = e0->cast(); const auto* a1 = e1->cast(); if (a0->size() != a1->size()) { return false; } if (a0->_dims.size() != a1->_dims.size()) { return false; } for (unsigned int i = 0; i < a0->_dims.size(); i++) { if (a0->_dims[i] != a1->_dims[i]) { return false; } } for (unsigned int i = 0; i < a0->size(); i++) { if (!Expression::equal((*a0)[i], (*a1)[i])) { return false; } } return true; } case Expression::E_ARRAYACCESS: { const auto* a0 = e0->cast(); const auto* a1 = e1->cast(); if (!Expression::equal(a0->v(), a1->v())) { return false; } if (a0->idx().size() != a1->idx().size()) { return false; } for (unsigned int i = 0; i < a0->idx().size(); i++) { if (!Expression::equal(a0->idx()[i], a1->idx()[i])) { return false; } } return true; } case Expression::E_COMP: { const auto* c0 = e0->cast(); const auto* c1 = e1->cast(); if (c0->set() != c1->set()) { return false; } if (!Expression::equal(c0->_e, c1->_e)) { return false; } if (c0->_g.size() != c1->_g.size()) { return false; } for (unsigned int i = 0; i < c0->_g.size(); i++) { if (!Expression::equal(c0->_g[i], c1->_g[i])) { return false; } } for (unsigned int i = 0; i < c0->_gIndex.size(); i++) { if (c0->_gIndex[i] != c1->_gIndex[i]) { return false; } } return true; } case Expression::E_ITE: { const ITE* i0 = e0->cast(); const ITE* i1 = e1->cast(); if (i0->_eIfThen.size() != i1->_eIfThen.size()) { return false; } for (unsigned int i = i0->_eIfThen.size(); (i--) != 0U;) { if (!Expression::equal(i0->_eIfThen[i], i1->_eIfThen[i])) { return false; } } return Expression::equal(i0->elseExpr(), i1->elseExpr()); } case Expression::E_BINOP: { const auto* b0 = e0->cast(); const auto* b1 = e1->cast(); if (b0->op() != b1->op()) { return false; } if (!Expression::equal(b0->lhs(), b1->lhs())) { return false; } if (!Expression::equal(b0->rhs(), b1->rhs())) { return false; } return true; } case Expression::E_UNOP: { const UnOp* b0 = e0->cast(); const UnOp* b1 = e1->cast(); if (b0->op() != b1->op()) { return false; } if (!Expression::equal(b0->e(), b1->e())) { return false; } return true; } case Expression::E_CALL: { const Call* c0 = e0->cast(); const Call* c1 = e1->cast(); if (c0->id() != c1->id()) { return false; } if (c0->decl() != c1->decl()) { return false; } if (c0->argCount() != c1->argCount()) { return false; } for (unsigned int i = 0; i < c0->argCount(); i++) { if (!Expression::equal(c0->arg(i), c1->arg(i))) { return false; } } return true; } case Expression::E_VARDECL: { const auto* v0 = e0->cast(); const auto* v1 = e1->cast(); if (!Expression::equal(v0->ti(), v1->ti())) { return false; } if (!Expression::equal(v0->id(), v1->id())) { return false; } if (!Expression::equal(v0->e(), v1->e())) { return false; } return true; } case Expression::E_LET: { const Let* l0 = e0->cast(); const Let* l1 = e1->cast(); if (!Expression::equal(l0->in(), l1->in())) { return false; } if (l0->let().size() != l1->let().size()) { return false; } for (unsigned int i = l0->let().size(); (i--) != 0U;) { if (!Expression::equal(l0->let()[i], l1->let()[i])) { return false; } } return true; } case Expression::E_TI: { const auto* t0 = e0->cast(); const auto* t1 = e1->cast(); if (t0->ranges().size() != t1->ranges().size()) { return false; } for (unsigned int i = t0->ranges().size(); (i--) != 0U;) { if (!Expression::equal(t0->ranges()[i], t1->ranges()[i])) { return false; } } return Expression::equal(t0->domain(), t1->domain()); } case Expression::E_TIID: return false; default: assert(false); return false; } } Constants::Constants() { GCLock lock; auto* ti = new TypeInst(Location(), Type::parbool()); literalTrue = new BoolLit(Location(), true); varTrue = new VarDecl(Location(), ti, "_bool_true", literalTrue); literalFalse = new BoolLit(Location(), false); varFalse = new VarDecl(Location(), ti, "_bool_false", literalFalse); varIgnore = new VarDecl(Location(), ti, "_bool_ignore"); absent = new Id(Location(), "_absent", nullptr); varRedef = new FunctionI(Location(), "__internal_varRedef", new TypeInst(Location(), Type::varbool()), std::vector()); Type absent_t; absent_t.bt(Type::BT_BOT); absent_t.dim(0); absent_t.st(Type::ST_PLAIN); absent_t.ot(Type::OT_OPTIONAL); absent->type(absent_t); IntSetVal* isv_infty = IntSetVal::a(-IntVal::infinity(), IntVal::infinity()); infinity = new SetLit(Location(), isv_infty); ids.forall = ASTString("forall"); ids.forallReif = ASTString("forallReif"); ids.exists = ASTString("exists"); ids.clause = ASTString("clause"); ids.bool2int = ASTString("bool2int"); ids.int2float = ASTString("int2float"); ids.bool2float = ASTString("bool2float"); ids.assert = ASTString("assert"); ids.mzn_deprecate = ASTString("mzn_deprecate"); ids.mzn_symmetry_breaking_constraint = ASTString("mzn_symmetry_breaking_constraint"); ids.mzn_redundant_constraint = ASTString("mzn_redundant_constraint"); ids.trace = ASTString("trace"); ids.sum = ASTString("sum"); ids.lin_exp = ASTString("lin_exp"); ids.element = ASTString("element"); ids.show = ASTString("show"); ids.output = ASTString("output"); ids.fix = ASTString("fix"); ids.int_.lin_eq = ASTString("int_lin_eq"); ids.int_.lin_le = ASTString("int_lin_le"); ids.int_.lin_ne = ASTString("int_lin_ne"); ids.int_.plus = ASTString("int_plus"); ids.int_.minus = ASTString("int_minus"); ids.int_.times = ASTString("int_times"); ids.int_.div = ASTString("int_div"); ids.int_.mod = ASTString("int_mod"); ids.int_.lt = ASTString("int_lt"); ids.int_.le = ASTString("int_le"); ids.int_.gt = ASTString("int_gt"); ids.int_.ge = ASTString("int_ge"); ids.int_.eq = ASTString("int_eq"); ids.int_.ne = ASTString("int_ne"); ids.int_reif.lin_eq = ASTString("int_lin_eq_reif"); ids.int_reif.lin_le = ASTString("int_lin_le_reif"); ids.int_reif.lin_ne = ASTString("int_lin_ne_reif"); ids.int_reif.plus = ASTString("int_plus_reif"); ids.int_reif.minus = ASTString("int_minus_reif"); ids.int_reif.times = ASTString("int_times_reif"); ids.int_reif.div = ASTString("int_div_reif"); ids.int_reif.mod = ASTString("int_mod_reif"); ids.int_reif.lt = ASTString("int_lt_reif"); ids.int_reif.le = ASTString("int_le_reif"); ids.int_reif.gt = ASTString("int_gt_reif"); ids.int_reif.ge = ASTString("int_ge_reif"); ids.int_reif.eq = ASTString("int_eq_reif"); ids.int_reif.ne = ASTString("int_ne_reif"); ids.float_.lin_eq = ASTString("float_lin_eq"); ids.float_.lin_le = ASTString("float_lin_le"); ids.float_.lin_lt = ASTString("float_lin_lt"); ids.float_.lin_ne = ASTString("float_lin_ne"); ids.float_.plus = ASTString("float_plus"); ids.float_.minus = ASTString("float_minus"); ids.float_.times = ASTString("float_times"); ids.float_.div = ASTString("float_div"); ids.float_.mod = ASTString("float_mod"); ids.float_.lt = ASTString("float_lt"); ids.float_.le = ASTString("float_le"); ids.float_.gt = ASTString("float_gt"); ids.float_.ge = ASTString("float_ge"); ids.float_.eq = ASTString("float_eq"); ids.float_.ne = ASTString("float_ne"); ids.float_.in = ASTString("float_in"); ids.float_.dom = ASTString("float_dom"); ids.float_reif.lin_eq = ASTString("float_lin_eq_reif"); ids.float_reif.lin_le = ASTString("float_lin_le_reif"); ids.float_reif.lin_lt = ASTString("float_lin_lt_reif"); ids.float_reif.lin_ne = ASTString("float_lin_ne_reif"); ids.float_reif.plus = ASTString("float_plus_reif"); ids.float_reif.minus = ASTString("float_minus_reif"); ids.float_reif.times = ASTString("float_times_reif"); ids.float_reif.div = ASTString("float_div_reif"); ids.float_reif.mod = ASTString("float_mod_reif"); ids.float_reif.lt = ASTString("float_lt_reif"); ids.float_reif.le = ASTString("float_le_reif"); ids.float_reif.gt = ASTString("float_gt_reif"); ids.float_reif.ge = ASTString("float_ge_reif"); ids.float_reif.eq = ASTString("float_eq_reif"); ids.float_reif.ne = ASTString("float_ne_reif"); ids.float_reif.in = ASTString("float_in_reif"); ids.bool_eq = ASTString("bool_eq"); ids.bool_eq_reif = ASTString("bool_eq_reif"); ids.bool_not = ASTString("bool_not"); ids.bool_clause = ASTString("bool_clause"); ids.bool_clause_reif = ASTString("bool_clause_reif"); ids.bool_xor = ASTString("bool_xor"); ids.array_bool_or = ASTString("array_bool_or"); ids.array_bool_and = ASTString("array_bool_and"); ids.set_eq = ASTString("set_eq"); ids.set_in = ASTString("set_in"); ids.set_subset = ASTString("set_subset"); ids.set_card = ASTString("set_card"); ids.pow = ASTString("pow"); ids.introduced_var = ASTString("__INTRODUCED"); ids.anonEnumFromStrings = ASTString("anon_enum"); ctx.root = new Id(Location(), ASTString("ctx_root"), nullptr); ctx.root->type(Type::ann()); ctx.pos = new Id(Location(), ASTString("ctx_pos"), nullptr); ctx.pos->type(Type::ann()); ctx.neg = new Id(Location(), ASTString("ctx_neg"), nullptr); ctx.neg->type(Type::ann()); ctx.mix = new Id(Location(), ASTString("ctx_mix"), nullptr); ctx.mix->type(Type::ann()); ann.output_var = new Id(Location(), ASTString("output_var"), nullptr); ann.output_var->type(Type::ann()); ann.output_only = new Id(Location(), ASTString("output_only"), nullptr); ann.output_only->type(Type::ann()); ann.output_array = ASTString("output_array"); ann.add_to_output = new Id(Location(), ASTString("add_to_output"), nullptr); ann.add_to_output->type(Type::ann()); ann.mzn_check_var = new Id(Location(), ASTString("mzn_check_var"), nullptr); ann.mzn_check_var->type(Type::ann()); ann.mzn_check_enum_var = ASTString("mzn_check_enum_var"); ann.is_defined_var = new Id(Location(), ASTString("is_defined_var"), nullptr); ann.is_defined_var->type(Type::ann()); ann.defines_var = ASTString("defines_var"); ann.is_reverse_map = new Id(Location(), ASTString("is_reverse_map"), nullptr); ann.is_reverse_map->type(Type::ann()); ann.promise_total = new Id(Location(), ASTString("promise_total"), nullptr); ann.promise_total->type(Type::ann()); ann.maybe_partial = new Id(Location(), ASTString("maybe_partial"), nullptr); ann.maybe_partial->type(Type::ann()); ann.doc_comment = ASTString("doc_comment"); ann.mzn_path = ASTString("mzn_path"); ann.is_introduced = ASTString("is_introduced"); ann.user_cut = new Id(Location(), ASTString("user_cut"), nullptr); ann.user_cut->type(Type::ann()); ann.lazy_constraint = new Id(Location(), ASTString("lazy_constraint"), nullptr); ann.lazy_constraint->type(Type::ann()); #ifndef NDEBUG ann.mzn_break_here = new Id(Location(), ASTString("mzn_break_here"), nullptr); ann.mzn_break_here->type(Type::ann()); #endif ann.rhs_from_assignment = new Id(Location(), ASTString("mzn_rhs_from_assignment"), nullptr); ann.rhs_from_assignment->type(Type::ann()); ann.domain_change_constraint = new Id(Location(), ASTString("domain_change_constraint"), nullptr); ann.domain_change_constraint->type(Type::ann()); ann.mzn_deprecated = ASTString("mzn_deprecated"); ann.mzn_was_undefined = new Id(Location(), ASTString("mzn_was_undefined"), nullptr); ann.mzn_was_undefined->type(Type::ann()); ann.array_check_form = new Id(Location(), ASTString("array_check_form"), nullptr); ann.array_check_form->type(Type::ann()); cli.cmdlineData_short_str = ASTString("-D"); cli.cmdlineData_str = ASTString("--cmdline-data"); cli.datafile_str = ASTString("--data"); cli.datafile_short_str = ASTString("-d"); cli.globalsDir_str = ASTString("--globals-dir"); cli.globalsDir_alt_str = ASTString("--mzn-globals-dir"); cli.globalsDir_short_str = ASTString("-G"); cli.help_str = ASTString("--help"); cli.help_short_str = ASTString("-h"); cli.ignoreStdlib_str = ASTString("--ignore-stdlib"); cli.include_str = ASTString("-I"); cli.inputFromStdin_str = ASTString("--input-from-stdin"); cli.instanceCheckOnly_str = ASTString("--instance-check-only"); cli.newfzn_str = ASTString("--newfzn"); cli.no_optimize_str = ASTString("--no-optimize"); cli.no_optimize_alt_str = ASTString("--no-optimise"); cli.no_outputOzn_str = ASTString("--no-output-ozn"); cli.no_outputOzn_short_str = ASTString("-O-"); cli.no_typecheck_str = ASTString("--no-typecheck"); cli.outputBase_str = ASTString("--output-base"); cli.outputFznToStdout_str = ASTString("--output-to-stdout"); cli.outputFznToStdout_alt_str = ASTString("--output-fzn-to-stdout"); cli.outputOznToFile_str = ASTString("--output-ozn-to-file"); cli.outputOznToStdout_str = ASTString("--output-ozn-to-stdout"); cli.outputFznToFile_alt_str = ASTString("--output-fzn-to-file"); cli.outputFznToFile_short_str = ASTString("-o"); cli.outputFznToFile_str = ASTString("--output-to-file"); cli.rangeDomainsOnly_str = ASTString("--only-range-domains"); cli.statistics_str = ASTString("--statistics"); cli.statistics_short_str = ASTString("-s"); cli.stdlib_str = ASTString("--stdlib-dir"); cli.verbose_str = ASTString("--verbose"); cli.verbose_short_str = ASTString("-v"); cli.version_str = ASTString("--version"); cli.werror_str = ASTString("-Werror"); cli.solver.all_sols_str = ASTString("-a"); cli.solver.fzn_solver_str = ASTString("--solver"); opts.cmdlineData = ASTString("cmdlineData"); opts.datafile = ASTString("datafile"); opts.datafiles = ASTString("datafiles"); opts.fznToFile = ASTString("fznToFile"); opts.fznToStdout = ASTString("fznToStdout"); opts.globalsDir = ASTString("globalsDir"); opts.ignoreStdlib = ASTString("ignoreStdlib"); opts.includeDir = ASTString("includeDir"); opts.includePaths = ASTString("includePaths"); opts.inputFromStdin = ASTString("inputStdin"); opts.instanceCheckOnly = ASTString("instanceCheckOnly"); opts.model = ASTString("model"); opts.newfzn = ASTString("newfzn"); opts.noOznOutput = ASTString("noOznOutput"); opts.optimize = ASTString("optimize"); opts.outputBase = ASTString("outputBase"); opts.oznToFile = ASTString("oznToFile"); opts.oznToStdout = ASTString("oznToStdout"); opts.rangeDomainsOnly = ASTString("rangeDomainsOnly"); opts.statistics = ASTString("statistics"); opts.stdlib = ASTString("stdlib"); opts.typecheck = ASTString("typecheck"); opts.verbose = ASTString("verbose"); opts.werror = ASTString("werror"); opts.solver.allSols = ASTString("allSols"); opts.solver.numSols = ASTString("numSols"); opts.solver.threads = ASTString("threads"); opts.solver.fzn_solver = ASTString("fznsolver"); opts.solver.fzn_flags = ASTString("fzn_flags"); opts.solver.fzn_flag = ASTString("fzn_flag"); opts.solver.fzn_time_limit_ms = ASTString("fzn_time_limit_ms"); opts.solver.fzn_sigint = ASTString("fzn_sigint"); cli_cat.general = ASTString("General Options"); cli_cat.io = ASTString("Input/Output Options"); cli_cat.solver = ASTString("Solver Options"); cli_cat.translation = ASTString("Translation Options"); }; void Constants::mark(MINIZINC_GC_STAT_ARGS) { Expression::mark(literalTrue); Expression::mark(varTrue); Expression::mark(literalFalse); Expression::mark(varFalse); Expression::mark(varIgnore); #if defined(MINIZINC_GC_STATS) Item::mark(varRedef, gc_stats); #else Item::mark(varRedef); #endif Expression::mark(absent); Expression::mark(infinity); ids.forall.mark(); ids.exists.mark(); ids.clause.mark(); ids.bool2int.mark(); ids.int2float.mark(); ids.bool2float.mark(); ids.sum.mark(); ids.lin_exp.mark(); ids.element.mark(); ids.show.mark(); ids.output.mark(); ids.fix.mark(); ids.int_.lin_eq.mark(); ids.int_.lin_le.mark(); ids.int_.lin_ne.mark(); ids.int_.plus.mark(); ids.int_.minus.mark(); ids.int_.times.mark(); ids.int_.div.mark(); ids.int_.mod.mark(); ids.int_.lt.mark(); ids.int_.le.mark(); ids.int_.gt.mark(); ids.int_.ge.mark(); ids.int_.eq.mark(); ids.int_.ne.mark(); ids.int_reif.lin_eq.mark(); ids.int_reif.lin_le.mark(); ids.int_reif.lin_ne.mark(); ids.int_reif.plus.mark(); ids.int_reif.minus.mark(); ids.int_reif.times.mark(); ids.int_reif.div.mark(); ids.int_reif.mod.mark(); ids.int_reif.lt.mark(); ids.int_reif.le.mark(); ids.int_reif.gt.mark(); ids.int_reif.ge.mark(); ids.int_reif.eq.mark(); ids.int_reif.ne.mark(); ids.float_.lin_eq.mark(); ids.float_.lin_le.mark(); ids.float_.lin_lt.mark(); ids.float_.lin_ne.mark(); ids.float_.plus.mark(); ids.float_.minus.mark(); ids.float_.times.mark(); ids.float_.div.mark(); ids.float_.mod.mark(); ids.float_.lt.mark(); ids.float_.le.mark(); ids.float_.gt.mark(); ids.float_.ge.mark(); ids.float_.eq.mark(); ids.float_.ne.mark(); ids.float_.in.mark(); ids.float_.dom.mark(); ids.float_reif.lin_eq.mark(); ids.float_reif.lin_le.mark(); ids.float_reif.lin_lt.mark(); ids.float_reif.lin_ne.mark(); ids.float_reif.plus.mark(); ids.float_reif.minus.mark(); ids.float_reif.times.mark(); ids.float_reif.div.mark(); ids.float_reif.mod.mark(); ids.float_reif.lt.mark(); ids.float_reif.le.mark(); ids.float_reif.gt.mark(); ids.float_reif.ge.mark(); ids.float_reif.eq.mark(); ids.float_reif.ne.mark(); ids.float_reif.in.mark(); ids.bool_eq.mark(); ids.bool_eq_reif.mark(); ids.bool_not.mark(); ids.bool_clause.mark(); ids.bool_clause_reif.mark(); ids.bool_xor.mark(); ids.array_bool_or.mark(); ids.array_bool_and.mark(); ids.set_eq.mark(); ids.set_in.mark(); ids.set_subset.mark(); ids.set_card.mark(); ids.pow.mark(); ids.assert.mark(); ids.mzn_deprecate.mark(); ids.trace.mark(); ids.mzn_symmetry_breaking_constraint.mark(); ids.mzn_redundant_constraint.mark(); ids.introduced_var.mark(); ids.anonEnumFromStrings.mark(); Expression::mark(ctx.root); Expression::mark(ctx.pos); Expression::mark(ctx.neg); Expression::mark(ctx.mix); Expression::mark(ann.output_var); Expression::mark(ann.output_only); Expression::mark(ann.add_to_output); Expression::mark(ann.mzn_check_var); ann.mzn_check_enum_var.mark(); ann.output_array.mark(); Expression::mark(ann.is_defined_var); ann.defines_var.mark(); Expression::mark(ann.is_reverse_map); Expression::mark(ann.promise_total); Expression::mark(ann.maybe_partial); ann.doc_comment.mark(); ann.mzn_path.mark(); ann.is_introduced.mark(); Expression::mark(ann.user_cut); Expression::mark(ann.lazy_constraint); #ifndef NDEBUG Expression::mark(ann.mzn_break_here); #endif Expression::mark(ann.rhs_from_assignment); Expression::mark(ann.domain_change_constraint); ann.mzn_deprecated.mark(); Expression::mark(ann.mzn_was_undefined); Expression::mark(ann.array_check_form); cli.cmdlineData_short_str.mark(); cli.cmdlineData_str.mark(); cli.datafile_short_str.mark(); cli.datafile_str.mark(); cli.globalsDir_alt_str.mark(); cli.globalsDir_short_str.mark(); cli.globalsDir_str.mark(); cli.help_short_str.mark(); cli.help_str.mark(); cli.ignoreStdlib_str.mark(); cli.include_str.mark(); cli.inputFromStdin_str.mark(); cli.instanceCheckOnly_str.mark(); cli.newfzn_str.mark(); cli.no_optimize_alt_str.mark(); cli.no_optimize_str.mark(); cli.no_outputOzn_short_str.mark(); cli.no_outputOzn_str.mark(); cli.no_typecheck_str.mark(); cli.outputBase_str.mark(); cli.outputFznToStdout_alt_str.mark(); cli.outputFznToStdout_str.mark(); cli.outputOznToFile_str.mark(); cli.outputOznToStdout_str.mark(); cli.outputFznToFile_alt_str.mark(); cli.outputFznToFile_short_str.mark(); cli.outputFznToFile_str.mark(); cli.rangeDomainsOnly_str.mark(); cli.statistics_short_str.mark(); cli.statistics_str.mark(); cli.stdlib_str.mark(); cli.verbose_short_str.mark(); cli.verbose_str.mark(); cli.version_str.mark(); cli.werror_str.mark(); cli.solver.all_sols_str.mark(); cli.solver.fzn_solver_str.mark(); opts.cmdlineData.mark(); opts.datafile.mark(); opts.datafiles.mark(); opts.fznToFile.mark(); opts.fznToStdout.mark(); opts.globalsDir.mark(); opts.ignoreStdlib.mark(); opts.includePaths.mark(); opts.includeDir.mark(); opts.inputFromStdin.mark(); opts.instanceCheckOnly.mark(); opts.model.mark(); opts.newfzn.mark(); opts.noOznOutput.mark(); opts.optimize.mark(); opts.outputBase.mark(); opts.oznToFile.mark(); opts.oznToStdout.mark(); opts.rangeDomainsOnly.mark(); opts.statistics.mark(); opts.stdlib.mark(); opts.typecheck.mark(); opts.verbose.mark(); opts.werror.mark(); opts.solver.allSols.mark(); opts.solver.numSols.mark(); opts.solver.threads.mark(); opts.solver.fzn_solver.mark(); opts.solver.fzn_flags.mark(); opts.solver.fzn_flag.mark(); opts.solver.fzn_time_limit_ms.mark(); opts.solver.fzn_sigint.mark(); cli_cat.general.mark(); cli_cat.io.mark(); cli_cat.solver.mark(); cli_cat.translation.mark(); } const int Constants::max_array_size; Constants& constants() { static Constants _c; return _c; } Annotation::~Annotation() { delete _s; } bool Annotation::contains(Expression* e) const { return (_s != nullptr) && _s->contains(e); } bool Annotation::isEmpty() const { return _s == nullptr || _s->isEmpty(); } ExpressionSetIter Annotation::begin() const { return _s == nullptr ? ExpressionSetIter(true) : _s->begin(); } ExpressionSetIter Annotation::end() const { return _s == nullptr ? ExpressionSetIter(true) : _s->end(); } void Annotation::add(Expression* e) { if (_s == nullptr) { _s = new ExpressionSet; } if (e != nullptr) { _s->insert(e); } } void Annotation::add(std::vector e) { if (_s == nullptr) { _s = new ExpressionSet; } for (auto i = static_cast(e.size()); (i--) != 0U;) { if (e[i] != nullptr) { _s->insert(e[i]); } } } void Annotation::remove(Expression* e) { if ((_s != nullptr) && (e != nullptr)) { _s->remove(e); } } void Annotation::removeCall(const ASTString& id) { if (_s == nullptr) { return; } std::vector toRemove; for (ExpressionSetIter it = _s->begin(); it != _s->end(); ++it) { if (Call* c = (*it)->dynamicCast()) { if (c->id() == id) { toRemove.push_back(*it); } } } for (auto i = static_cast(toRemove.size()); (i--) != 0U;) { _s->remove(toRemove[i]); } } Call* Annotation::getCall(const ASTString& id) const { if (_s == nullptr) { return nullptr; } for (ExpressionSetIter it = _s->begin(); it != _s->end(); ++it) { if (Call* c = (*it)->dynamicCast()) { if (c->id() == id) { return c; } } } return nullptr; } bool Annotation::containsCall(const MiniZinc::ASTString& id) const { if (_s == nullptr) { return false; } for (ExpressionSetIter it = _s->begin(); it != _s->end(); ++it) { if (Call* c = (*it)->dynamicCast()) { if (c->id() == id) { return true; } } } return false; } void Annotation::clear() { if (_s != nullptr) { _s->clear(); } } void Annotation::merge(const Annotation& ann) { if (ann._s == nullptr) { return; } if (_s == nullptr) { _s = new ExpressionSet; } for (ExpressionSetIter it = ann.begin(); it != ann.end(); ++it) { _s->insert(*it); } } Expression* get_annotation(const Annotation& ann, const std::string& str) { for (ExpressionSetIter i = ann.begin(); i != ann.end(); ++i) { Expression* e = *i; if ((e->isa() && e->cast()->str() == str) || (e->isa() && e->cast()->id() == str)) { return e; } } return nullptr; } Expression* get_annotation(const Annotation& ann, const ASTString& str) { for (ExpressionSetIter i = ann.begin(); i != ann.end(); ++i) { Expression* e = *i; if ((e->isa() && e->cast()->str() == str) || (e->isa() && e->cast()->id() == str)) { return e; } } return nullptr; } } // namespace MiniZinc libminizinc-2.5.3/lib/parser.cpp0000644000175000017500000002736713757304533015265 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This (main) file coordinates flattening and solving. * The corresponding modules are flexibly plugged in * as derived classes, prospectively from DLLs. * A flattening module should provide MinZinc::GetFlattener() * A solving module should provide an object of a class derived from SolverFactory. * Need to get more flexible for multi-pass & multi-solving stuff TODO */ #include #include #include #include #include using namespace std; int mzn_yylex_init(void** scanner); void mzn_yyset_extra(void* user_defined, void* yyscanner); int mzn_yylex_destroy(void* scanner); namespace { // fastest way to read a file into a string (especially big files) // see: http://insanecoding.blogspot.be/2011/11/how-to-read-in-file-in-c.html std::string get_file_contents(std::ifstream& in) { if (in) { std::string contents; in.seekg(0, std::ios::end); contents.resize(static_cast(in.tellg())); in.seekg(0, std::ios::beg); in.read(&contents[0], contents.size()); in.close(); if (!contents.empty() && contents[0] == '@') { contents = MiniZinc::FileUtils::decode_base64(contents); MiniZinc::FileUtils::inflate_string(contents); } return (contents); } throw(errno); } } // namespace namespace MiniZinc { void parse(Env& env, Model*& model, const vector& filenames, const vector& datafiles, const std::string& modelString, const std::string& modelStringName, const vector& ip, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, ostream& err, std::vector& syntaxErrors) { vector includePaths; for (const auto& i : ip) { includePaths.push_back(i); } vector files; map seenModels; string workingDir = FileUtils::working_directory(); if (!filenames.empty()) { GCLock lock; model->setFilename(FileUtils::base_name(filenames[0])); if (FileUtils::is_absolute(filenames[0])) { files.emplace_back(model, nullptr, "", filenames[0]); } else { files.emplace_back(model, nullptr, "", workingDir + "/" + filenames[0]); } for (unsigned int i = 1; i < filenames.size(); i++) { GCLock lock; string fullName = filenames[i]; string baseName = FileUtils::base_name(filenames[i]); if (!FileUtils::is_absolute(fullName)) { fullName = workingDir + "/" + fullName; } bool isFzn = (baseName.compare(baseName.length() - 4, 4, ".fzn") == 0); if (isFzn) { files.emplace_back(model, nullptr, "", fullName); } else { auto* includedModel = new Model; includedModel->setFilename(baseName); files.emplace_back(includedModel, nullptr, "", fullName); seenModels.insert(pair(baseName, includedModel)); Location loc(ASTString(filenames[i]), 0, 0, 0, 0); auto* inc = new IncludeI(loc, includedModel->filename()); inc->m(includedModel, true); model->addItem(inc); } } if (!modelString.empty()) { auto* includedModel = new Model; includedModel->setFilename(modelStringName); files.emplace_back(includedModel, nullptr, modelString, modelStringName, false, true); seenModels.insert(pair(modelStringName, includedModel)); Location loc(ASTString(modelStringName), 0, 0, 0, 0); auto* inc = new IncludeI(loc, includedModel->filename()); inc->m(includedModel, true); model->addItem(inc); } } else if (!modelString.empty()) { GCLock lock; model->setFilename(modelStringName); files.emplace_back(model, nullptr, modelString, modelStringName, false, true); } auto include_file = [&](const std::string& libname, bool builtin) { GCLock lock; auto* lib = new Model; lib->setFilename(libname); files.emplace_back(lib, nullptr, "./", libname, builtin); seenModels.insert(pair(libname, lib)); Location libloc(ASTString(model->filename()), 0, 0, 0, 0); auto* libinc = new IncludeI(libloc, lib->filename()); libinc->m(lib, true); model->addItem(libinc); }; // TODO: It should be possible to use just flatzinc builtins instead of stdlib when parsing // FlatZinc if (!isFlatZinc) { if (!ignoreStdlib) { include_file("solver_redefinitions.mzn", false); include_file("stdlib.mzn", true); // Added last, so it is processed first } // } else { // include_file("flatzincbuiltins.mzn", true); // } while (!files.empty()) { GCLock lock; ParseWorkItem& np = files.back(); string parentPath = np.dirName; Model* m = np.m; bool isModelString = np.isModelString; bool isSTDLib = np.isSTDLib; IncludeI* np_ii = np.ii; string f(np.fileName); files.pop_back(); std::string s; std::string fullname; bool isFzn; if (!isModelString) { for (Model* p = m->parent(); p != nullptr; p = p->parent()) { if (p->filename() == f) { err << "Error: cyclic includes: " << std::endl; for (Model* pe = m; pe != nullptr; pe = pe->parent()) { err << " " << pe->filename() << std::endl; } goto error; } } ifstream file; if (FileUtils::is_absolute(f) || parentPath.empty()) { fullname = f; if (FileUtils::file_exists(fullname)) { file.open(FILE_PATH(fullname), std::ios::binary); } } else { includePaths.push_back(parentPath); unsigned int i = 0; for (; i < includePaths.size(); i++) { fullname = includePaths[i] + "/" + f; if (FileUtils::file_exists(fullname)) { file.open(FILE_PATH(fullname), std::ios::binary); if (file.is_open()) { break; } } } if (file.is_open() && i < includePaths.size() - 1 && parentPath == workingDir && FileUtils::file_path(includePaths[i], workingDir) != FileUtils::file_path(workingDir) && FileUtils::file_exists(workingDir + "/" + f)) { err << "Warning: file " << f << " included from library, but also exists in current working directory" << endl; } for (; i < includePaths.size(); i++) { std::string deprecatedName = includePaths[i] + "/" + f + ".deprecated.mzn"; if (FileUtils::file_exists(deprecatedName)) { string deprecatedBaseName = FileUtils::base_name(deprecatedName); auto* includedModel = new Model; includedModel->setFilename(deprecatedBaseName); files.emplace_back(includedModel, nullptr, "", deprecatedName, isSTDLib, false); seenModels.insert(pair(deprecatedBaseName, includedModel)); Location loc(ASTString(deprecatedName), 0, 0, 0, 0); auto* inc = new IncludeI(loc, includedModel->filename()); inc->m(includedModel, true); m->addItem(inc); files.emplace_back(includedModel, inc, deprecatedName, deprecatedBaseName, isSTDLib, false); } } includePaths.pop_back(); } if (!file.is_open()) { if (np_ii != nullptr) { err << np_ii->loc().toString() << ":\n"; err << "MiniZinc: error in include item, cannot open file '" << f << "'." << endl; } else { err << "Error: cannot open file '" << f << "'." << endl; } goto error; } if (verbose) { std::cerr << "processing file '" << fullname << "'" << endl; } s = get_file_contents(file); if (m->filepath().size() == 0) { m->setFilepath(fullname); } isFzn = (fullname.compare(fullname.length() - 4, 4, ".fzn") == 0); isFzn |= (fullname.compare(fullname.length() - 4, 4, ".ozn") == 0); isFzn |= (fullname.compare(fullname.length() - 4, 4, ".szn") == 0); isFzn |= (fullname.compare(fullname.length() - 4, 4, ".mzc") == 0); } else { isFzn = false; fullname = f; s = parentPath; } ParserState pp(fullname, s, err, files, seenModels, m, false, isFzn, isSTDLib, parseDocComments); mzn_yylex_init(&pp.yyscanner); mzn_yyset_extra(&pp, pp.yyscanner); mzn_yyparse(&pp); if (pp.yyscanner != nullptr) { mzn_yylex_destroy(pp.yyscanner); } if (pp.hadError) { for (const auto& syntaxError : pp.syntaxErrors) { syntaxErrors.push_back(syntaxError); } goto error; } } for (const auto& f : datafiles) { GCLock lock; if (f.size() >= 6 && f.substr(f.size() - 5, string::npos) == ".json") { JSONParser jp(env.envi()); jp.parse(model, f, true); } else { string s; if (f.size() > 5 && f.substr(0, 5) == "cmd:/") { s = f.substr(5); } else { std::ifstream file(FILE_PATH(f), std::ios::binary); if (!FileUtils::file_exists(f) || !file.is_open()) { err << "Error: cannot open data file '" << f << "'." << endl; goto error; } if (verbose) { std::cerr << "processing data file '" << f << "'" << endl; } s = get_file_contents(file); } ParserState pp(f, s, err, files, seenModels, model, true, false, false, parseDocComments); mzn_yylex_init(&pp.yyscanner); mzn_yyset_extra(&pp, pp.yyscanner); mzn_yyparse(&pp); if (pp.yyscanner != nullptr) { mzn_yylex_destroy(pp.yyscanner); } if (pp.hadError) { for (const auto& syntaxError : pp.syntaxErrors) { syntaxErrors.push_back(syntaxError); } goto error; } } } return; error: delete model; model = nullptr; } Model* parse(Env& env, const vector& filenames, const vector& datafiles, const string& textModel, const string& textModelName, const vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, ostream& err) { if (filenames.empty() && textModel.empty()) { err << "Error: no model given" << std::endl; return nullptr; } Model* model; { GCLock lock; model = new Model(); } std::vector se; parse(env, model, filenames, datafiles, textModel, textModelName, includePaths, isFlatZinc, ignoreStdlib, parseDocComments, verbose, err, se); return model; } Model* parse_data(Env& env, Model* model, const vector& datafiles, const vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, ostream& err) { vector filenames; std::vector se; parse(env, model, filenames, datafiles, "", "", includePaths, isFlatZinc, ignoreStdlib, parseDocComments, verbose, err, se); return model; } Model* parse_from_string(Env& env, const string& text, const string& filename, const vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, ostream& err, std::vector& syntaxErrors) { vector filenames; vector datafiles; Model* model; { GCLock lock; model = new Model(); } parse(env, model, filenames, datafiles, text, filename, includePaths, isFlatZinc, ignoreStdlib, parseDocComments, verbose, err, syntaxErrors); return model; } } // namespace MiniZinc libminizinc-2.5.3/lib/astmap.cpp0000644000175000017500000000177313757304533015247 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { template <> void ManagedASTStringMap::mark(MINIZINC_GC_STAT_ARGS) { for (auto& it : *this) { it.first.mark(); Expression::mark(it.second); #if defined(MINIZINC_GC_STATS) gc_stats[it->second->_id].keepalive++; #endif } }; template <> void ManagedASTStringMap::mark(MINIZINC_GC_STAT_ARGS) { for (auto& it : *this) { it.first.mark(); #if defined(MINIZINC_GC_STATS) gc_stats[it.second->e()->Expression::eid()].keepalive++; Item::mark(it.second, gc_stats); #else Item::mark(it.second); #endif } }; } // namespace MiniZinc libminizinc-2.5.3/lib/solns2out.cpp0000644000175000017500000005525313757304533015734 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was ! distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include using namespace std; using namespace MiniZinc; void Solns2Out::printHelp(ostream& os) { os << "Solution output options:" << std::endl << " --ozn-file \n Read output specification from ozn file." << std::endl << " -o , --output-to-file \n Filename for generated output." << std::endl << " -i , --ignore-lines , --ignore-leading-lines \n Ignore the first lines " "in the FlatZinc solution stream." << std::endl << " --soln-sep , --soln-separator , --solution-separator \n Specify the string " "printed after each solution (as a separate line).\n The default is to use the same as " "FlatZinc, \"----------\"." << std::endl << " --soln-comma , --solution-comma \n Specify the string used to separate " "solutions.\n The default is the empty string." << std::endl << " --unsat-msg (--unsatisfiable-msg), --unbounded-msg, --unsatorunbnd-msg,\n" " --unknown-msg, --error-msg, --search-complete-msg \n" " Specify solution status messages. The defaults:\n" " \"=====UNSATISFIABLE=====\", \"=====UNSATorUNBOUNDED=====\", " "\"=====UNBOUNDED=====\",\n" " \"=====UNKNOWN=====\", \"=====ERROR=====\", \"==========\", respectively." << std::endl << " --non-unique\n Allow duplicate solutions.\n" << " -c, --canonicalize\n Canonicalize the output solution stream (i.e., buffer and " "sort).\n" << " --output-non-canonical \n Non-buffered solution output file in case of " "canonicalization.\n" << " --output-raw \n File to dump the solver's raw output (not for hard-linked " "solvers)\n" // Unclear how to exit then: // << " --number-output \n Maximal number of different solutions printed." << // std::endl << " --no-output-comments\n Do not print comments in the FlatZinc solution stream." << std::endl << " --output-time\n Print timing information in the FlatZinc solution stream." << std::endl << " --no-flush-output\n Don't flush output stream after every line." << std::endl; } bool Solns2Out::processOption(int& i, std::vector& argv, const std::string& workingDir) { CLOParser cop(i, argv); std::string buffer; if (cop.getOption("--ozn-file", &buffer)) { initFromOzn(FileUtils::file_path(buffer, workingDir)); } else if (cop.getOption("-o --output-to-file", &buffer)) { opt.flagOutputFile = buffer; } else if (cop.getOption("--no-flush-output")) { opt.flagOutputFlush = false; } else if (cop.getOption("--no-output-comments")) { opt.flagOutputComments = false; } else if (cop.getOption("-i --ignore-lines --ignore-leading-lines", &opt.flagIgnoreLines)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--output-time")) { opt.flagOutputTime = true; } else if (cop.getOption("--soln-sep --soln-separator --solution-separator", &opt.solutionSeparator)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--soln-comma --solution-comma", &opt.solutionComma)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--unsat-msg --unsatisfiable-msg", &opt.unsatisfiableMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--unbounded-msg", &opt.unboundedMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--unsatorunbnd-msg", &opt.unsatorunbndMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--unknown-msg", &opt.unknownMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--error-msg", &opt.errorMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--search-complete-msg", &opt.searchCompleteMsg)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--unique")) { opt.flagUnique = true; } else if (cop.getOption("--non-unique")) { opt.flagUnique = false; } else if (cop.getOption("-c --canonicalize")) { opt.flagCanonicalize = true; } else if (cop.getOption("--output-non-canonical --output-non-canon", &opt.flagOutputNoncanonical)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--output-raw", &opt.flagOutputRaw)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (opt.flagStandaloneSolns2Out) { std::string oznfile(argv[i]); if (oznfile.length() <= 4) { return false; } size_t last_dot = oznfile.find_last_of('.'); if (last_dot == string::npos) { return false; } std::string extension = oznfile.substr(last_dot, string::npos); if (extension == ".ozn") { initFromOzn(oznfile); return true; } return false; } else { return false; } return true; } bool Solns2Out::initFromEnv(Env* pE) { assert(pE); _env = pE; _includePaths.push_back(_stdlibDir + "/std/"); init(); return true; } void Solns2Out::initFromOzn(const std::string& filename) { std::vector filenames(1, filename); _includePaths.push_back(_stdlibDir + "/std/"); for (auto& includePath : _includePaths) { if (!FileUtils::directory_exists(includePath)) { std::cerr << "solns2out: cannot access include directory " << includePath << "\n"; std::exit(EXIT_FAILURE); } } { _env = new Env(); std::stringstream errstream; if ((_outputModel = parse(*_env, filenames, std::vector(), "", "", _includePaths, false, false, false, false, errstream)) != nullptr) { std::vector typeErrors; _env->model(_outputModel); MZN_ASSERT_HARD_MSG(_env, "solns2out: could not allocate Env"); _envGuard.reset(_env); MiniZinc::typecheck(*_env, _outputModel, typeErrors, false, false); MiniZinc::register_builtins(*_env); _env->envi().swapOutput(); init(); } else { throw Error(errstream.str()); } } } Solns2Out::DE& Solns2Out::findOutputVar(const ASTString& name) { declNewOutput(); auto it = _declmap.find(name); MZN_ASSERT_HARD_MSG(_declmap.end() != it, "solns2out_base: unexpected id in output: " << name); return it->second; } void Solns2Out::restoreDefaults() { for (auto& i : *getModel()) { if (auto* vdi = i->dynamicCast()) { if (vdi->e()->id()->idn() != -1 || (vdi->e()->id()->v() != "_mzn_solution_checker" && vdi->e()->id()->v() != "_mzn_stats_checker")) { GCLock lock; auto& de = findOutputVar(vdi->e()->id()->str()); vdi->e()->e(de.second()); vdi->e()->evaluated(false); } } } _fNewSol2Print = false; } void Solns2Out::parseAssignments(string& solution) { std::vector se; unique_ptr sm(parse_from_string(*_env, solution, "solution received from solver", _includePaths, false, true, false, false, _log, se)); if (sm == nullptr) { throw Error("solns2out_base: could not parse solution"); } solution = ""; for (unsigned int i = 0; i < sm->size(); i++) { if (auto* ai = (*sm)[i]->dynamicCast()) { auto& de = findOutputVar(ai->id()); if (!ai->e()->isa() && !ai->e()->isa() && !ai->e()->isa()) { Type de_t = de.first->type(); de_t.cv(false); ai->e()->type(de_t); } ai->decl(de.first); typecheck(*_env, getModel(), ai); if (Call* c = ai->e()->dynamicCast()) { // This is an arrayXd call, make sure we get the right builtin assert(c->arg(c->argCount() - 1)->isa()); for (unsigned int i = 0; i < c->argCount(); i++) { c->arg(i)->type(Type::parsetint()); } c->arg(c->argCount() - 1)->type(de.first->type()); c->decl(getModel()->matchFn(_env->envi(), c, false)); } de.first->e(ai->e()); } } declNewOutput(); } void Solns2Out::declNewOutput() { _fNewSol2Print = true; status = SolverInstance::SAT; } bool Solns2Out::evalOutput(const string& s_ExtraInfo) { if (!_fNewSol2Print) { return true; } ostringstream oss; if (!_checkerModel.empty()) { auto& checkerStream = _env->envi().checkerOutput; checkerStream.clear(); checkerStream.str(""); checkSolution(checkerStream); } if (!evalOutputInternal(oss)) { return false; } bool fNew = true; if (opt.flagUnique || opt.flagCanonicalize) { auto res = _sSolsCanon.insert(oss.str()); if (!res.second) { // repeated solution fNew = false; } } if (fNew) { { auto& checkerStream = _env->envi().checkerOutput; checkerStream.flush(); std::string line; if (std::getline(checkerStream, line)) { _os << "% Solution checker report:\n"; _os << "% " << line << "\n"; while (std::getline(checkerStream, line)) { _os << "% " << line << "\n"; } } } ++stats.nSolns; if (opt.flagCanonicalize) { if (_outStreamNonCanon != nullptr) { if (_outStreamNonCanon->good()) { (*_outStreamNonCanon) << oss.str(); (*_outStreamNonCanon) << comments; if (!s_ExtraInfo.empty()) { (*_outStreamNonCanon) << s_ExtraInfo; if ('\n' != s_ExtraInfo.back()) { /// TODO is this enough to check EOL? (*_outStreamNonCanon) << '\n'; } } if (opt.flagOutputTime) { (*_outStreamNonCanon) << "% time elapsed: " << _starttime.stoptime() << "\n"; } if (!opt.solutionSeparator.empty()) { (*_outStreamNonCanon) << opt.solutionSeparator << '\n'; } if (opt.flagOutputFlush) { _outStreamNonCanon->flush(); } } } } else { if ((!opt.solutionComma.empty()) && stats.nSolns > 1) { getOutput() << opt.solutionComma << '\n'; } getOutput() << oss.str(); } } getOutput() << comments; // print them now ???? comments = ""; if (!s_ExtraInfo.empty()) { getOutput() << s_ExtraInfo; if ('\n' != s_ExtraInfo.back()) { /// TODO is this enough to check EOL? getOutput() << '\n'; } } if (fNew && opt.flagOutputTime) { getOutput() << "% time elapsed: " << _starttime.stoptime() << "\n"; } if (fNew && !opt.flagCanonicalize && !opt.solutionSeparator.empty()) { getOutput() << opt.solutionSeparator << '\n'; } if (opt.flagOutputFlush) { getOutput().flush(); } restoreDefaults(); // cleans data. evalOutput() should not be called again w/o assigning new // data. return true; } // NOLINTNEXTLINE(readability-convert-member-functions-to-static): Appears static without Gecode void Solns2Out::checkSolution(std::ostream& oss) { #ifdef HAS_GECODE std::ostringstream checker; checker << _checkerModel; { GCLock lock; for (auto& i : *getModel()) { if (auto* vdi = i->dynamicCast()) { if (vdi->e()->ann().contains(constants().ann.mzn_check_var)) { checker << vdi->e()->id()->str() << " = "; Expression* e = eval_par(getEnv()->envi(), vdi->e()->e()); auto* al = e->dynamicCast(); std::vector enumids; if (Call* cev = vdi->e()->ann().getCall(constants().ann.mzn_check_enum_var)) { auto* enumIdsAl = cev->arg(0)->cast(); for (int j = 0; j < enumIdsAl->size(); j++) { enumids.push_back((*enumIdsAl)[j]->dynamicCast()); } } if (al != nullptr) { checker << "array" << al->dims() << "d("; for (int i = 0; i < al->dims(); i++) { if (!enumids.empty() && enumids[i] != nullptr) { checker << "to_enum(" << *enumids[i] << ","; } checker << al->min(i) << ".." << al->max(i); if (!enumids.empty() && enumids[i] != nullptr) { checker << ")"; } checker << ","; } } if (!enumids.empty() && enumids.back() != nullptr) { checker << "to_enum(" << *enumids.back() << "," << *e << ")"; } else { checker << *e; } if (al != nullptr) { checker << ")"; } checker << ";\n"; } } } } MznSolver slv(oss, oss); slv.s2out.opt.solutionSeparator = ""; try { std::vector args({"--solver", "org.minizinc.gecode_presolver"}); slv.run(args, checker.str(), "minizinc", "checker.mzc"); } catch (const LocationException& e) { oss << e.loc() << ":" << std::endl; oss << e.what() << ": " << e.msg() << std::endl; } catch (const Exception& e) { std::string what = e.what(); oss << what << (what.empty() ? "" : ": ") << e.msg() << std::endl; } catch (const exception& e) { oss << e.what() << std::endl; } catch (...) { oss << " UNKNOWN EXCEPTION." << std::endl; } #else oss << "% solution checking not supported (need built-in Gecode)" << std::endl; #endif } // NOLINTNEXTLINE(readability-convert-member-functions-to-static): Appears static without Gecode void Solns2Out::checkStatistics(std::ostream& oss) { #ifdef HAS_GECODE std::ostringstream checker; checker << _statisticsCheckerModel; checker << "mzn_stats_failures = " << stats.nFails << ";\n"; checker << "mzn_stats_solutions = " << stats.nSolns << ";\n"; checker << "mzn_stats_nodes = " << stats.nNodes << ";\n"; checker << "mzn_stats_time = " << _starttime.ms() << ";\n"; MznSolver slv(oss, oss); slv.s2out.opt.solutionSeparator = ""; try { std::vector args({"--solver", "org.minizinc.gecode_presolver"}); slv.run(args, checker.str(), "minizinc", "checker.mzc"); } catch (const LocationException& e) { oss << e.loc() << ":" << std::endl; oss << e.what() << ": " << e.msg() << std::endl; } catch (const Exception& e) { std::string what = e.what(); oss << what << (what.empty() ? "" : ": ") << e.msg() << std::endl; } catch (const exception& e) { oss << e.what() << std::endl; } catch (...) { oss << " UNKNOWN EXCEPTION." << std::endl; } #else oss << "% statistics checking not supported (need built-in Gecode)" << std::endl; #endif } bool Solns2Out::evalOutputInternal(ostream& fout) { if (nullptr != _outputExpr) { _env->envi().evalOutput(fout, _log); } return true; } bool Solns2Out::evalStatus(SolverInstance::Status status) { if (opt.flagCanonicalize) { evalOutputFinalInternal(opt.flagOutputFlush); } evalStatusMsg(status); fStatusPrinted = true; return true; } bool Solns2Out::evalOutputFinalInternal(bool /*b*/) { /// Print the canonical list for (const auto& sol : _sSolsCanon) { if ((!opt.solutionComma.empty()) && &sol != &*_sSolsCanon.begin()) { getOutput() << opt.solutionComma << '\n'; } getOutput() << sol; if (!opt.solutionSeparator.empty()) { getOutput() << opt.solutionSeparator << '\n'; } } return true; } bool Solns2Out::evalStatusMsg(SolverInstance::Status status) { std::map stat2msg; stat2msg[SolverInstance::OPT] = opt.searchCompleteMsg; stat2msg[SolverInstance::UNSAT] = opt.unsatisfiableMsg; stat2msg[SolverInstance::UNBND] = opt.unboundedMsg; stat2msg[SolverInstance::UNSATorUNBND] = opt.unsatorunbndMsg; stat2msg[SolverInstance::UNKNOWN] = opt.unknownMsg; stat2msg[SolverInstance::ERROR] = opt.errorMsg; stat2msg[SolverInstance::NONE] = ""; auto it = stat2msg.find(status); if (stat2msg.end() != it) { getOutput() << comments; if (!it->second.empty()) { getOutput() << it->second << '\n'; } if (opt.flagOutputTime) { getOutput() << "% time elapsed: " << _starttime.stoptime() << "\n"; } if (opt.flagOutputFlush) { getOutput().flush(); } Solns2Out::status = status; } else { getOutput() << comments; if (opt.flagOutputFlush) { getOutput().flush(); } MZN_ASSERT_HARD_MSG(SolverInstance::SAT == status, // which is ignored "solns2out_base: undefined solution status code " << status); Solns2Out::status = SolverInstance::SAT; } comments = ""; return true; } void Solns2Out::init() { _declmap.clear(); for (auto& i : *getModel()) { if (auto* oi = i->dynamicCast()) { _outputExpr = oi->e(); } else if (auto* vdi = i->dynamicCast()) { if (vdi->e()->id()->idn() == -1 && vdi->e()->id()->v() == "_mzn_solution_checker") { _checkerModel = eval_string(getEnv()->envi(), vdi->e()->e()); if (!_checkerModel.empty() && _checkerModel[0] == '@') { _checkerModel = FileUtils::decode_base64(_checkerModel); FileUtils::inflate_string(_checkerModel); } } else if (vdi->e()->id()->idn() == -1 && vdi->e()->id()->v() == "_mzn_stats_checker") { _statisticsCheckerModel = eval_string(getEnv()->envi(), vdi->e()->e()); if (!_statisticsCheckerModel.empty() && _statisticsCheckerModel[0] == '@') { _statisticsCheckerModel = FileUtils::decode_base64(_statisticsCheckerModel); FileUtils::inflate_string(_statisticsCheckerModel); } } else { GCLock lock; _declmap.insert(make_pair(vdi->e()->id()->str(), DE(vdi->e(), vdi->e()->e()))); } } } /// Main output file if (nullptr == _outStream) { if (!opt.flagOutputFile.empty()) { _outStream.reset(new ofstream(FILE_PATH(opt.flagOutputFile))); MZN_ASSERT_HARD_MSG(_outStream.get(), "solns2out_base: could not allocate stream object for file output into " << opt.flagOutputFile); check_io_status(_outStream->good(), opt.flagOutputFile); } } /// Non-canonical output if (opt.flagCanonicalize && (!opt.flagOutputNoncanonical.empty())) { _outStreamNonCanon.reset(new ofstream(FILE_PATH(opt.flagOutputNoncanonical))); MZN_ASSERT_HARD_MSG(_outStreamNonCanon.get(), "solns2out_base: could not allocate stream object for non-canon output"); check_io_status(_outStreamNonCanon->good(), opt.flagOutputNoncanonical, false); } /// Raw output if (!opt.flagOutputRaw.empty()) { _outStreamRaw.reset(new ofstream(FILE_PATH(opt.flagOutputRaw))); MZN_ASSERT_HARD_MSG(_outStreamRaw.get(), "solns2out_base: could not allocate stream object for raw output"); check_io_status(_outStreamRaw->good(), opt.flagOutputRaw, false); } /// Assume all options are set before nLinesIgnore = opt.flagIgnoreLines; } Solns2Out::Solns2Out(std::ostream& os0, std::ostream& log0, std::string stdlibDir0) : _os(os0), _log(log0), _stdlibDir(std::move(stdlibDir0)) {} Solns2Out::~Solns2Out() { getOutput() << comments; if (opt.flagOutputFlush) { getOutput() << flush; } } ostream& Solns2Out::getOutput() { return (((_outStream != nullptr) && _outStream->good()) ? *_outStream : _os); } ostream& Solns2Out::getLog() { return _log; } bool Solns2Out::feedRawDataChunk(const char* data) { istringstream solstream(data); while (solstream.good()) { string line; getline(solstream, line); if (!_linePart.empty()) { line = _linePart + line; _linePart.clear(); } if (solstream.eof()) { // wait next chunk _linePart = line; break; // to get to raw output } if (!line.empty()) { if ('\r' == line.back()) { line.pop_back(); // For WIN files } } if (nLinesIgnore > 0) { --nLinesIgnore; continue; } if (_mapInputStatus.empty()) { createInputMap(); } auto it = _mapInputStatus.find(line); if (_mapInputStatus.end() != it) { if (SolverInstance::SAT == it->second) { parseAssignments(solution); evalOutput(); } else { evalStatus(it->second); } } else { solution += line + '\n'; if (opt.flagOutputComments) { std::istringstream iss(line); char c = '_'; iss >> skipws >> c; if (iss.good() && '%' == c) { // Feed comments directly getOutput() << line << '\n'; if (opt.flagOutputFlush) { getOutput().flush(); } if (_outStreamNonCanon != nullptr) { if (_outStreamNonCanon->good()) { (*_outStreamNonCanon) << line << '\n'; } } if (line.substr(0, 13) == "%%%mzn-stat: " && line.size() > 13) { if (line.substr(13, 6) == "nodes=") { std::istringstream iss(line.substr(19)); int n_nodes; iss >> n_nodes; stats.nNodes = n_nodes; } else if (line.substr(13, 9) == "failures=") { std::istringstream iss(line.substr(22)); int n_failures; iss >> n_failures; stats.nFails = n_failures; } } } } } } if (_outStreamRaw != nullptr) { *_outStreamRaw << data; if (opt.flagOutputFlush) { _outStreamRaw->flush(); } } return true; } void Solns2Out::createInputMap() { _mapInputStatus[opt.searchCompleteMsgDef] = SolverInstance::OPT; _mapInputStatus[opt.solutionSeparatorDef] = SolverInstance::SAT; _mapInputStatus[opt.unsatisfiableMsgDef] = SolverInstance::UNSAT; _mapInputStatus[opt.unboundedMsgDef] = SolverInstance::UNBND; _mapInputStatus[opt.unsatorunbndMsgDef] = SolverInstance::UNSATorUNBND; _mapInputStatus[opt.unknownMsgDef] = SolverInstance::UNKNOWN; _mapInputStatus[opt.errorMsg] = SolverInstance::ERROR; } void Solns2Out::printStatistics(ostream& os) { os << "%%%mzn-stat: nSolutions=" << stats.nSolns << "\n"; if (!_statisticsCheckerModel.empty()) { std::ostringstream oss; checkStatistics(oss); os << "%%%mzn-stat: statisticsCheck=\"" << Printer::escapeStringLit(oss.str()) << "\"\n"; } os << "%%%mzn-stat-end\n"; } libminizinc-2.5.3/lib/eval_par.cpp0000644000175000017500000032545313757304533015557 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include namespace MiniZinc { bool check_par_domain(EnvI& env, Expression* e, Expression* domain) { if (e->type() == Type::parint()) { IntSetVal* isv = eval_intset(env, domain); if (!isv->contains(eval_int(env, e))) { return false; } } else if (e->type() == Type::parfloat()) { FloatSetVal* fsv = eval_floatset(env, domain); if (!fsv->contains(eval_float(env, e))) { return false; } } else if (e->type() == Type::parsetint()) { IntSetVal* isv = eval_intset(env, domain); IntSetRanges ir(isv); IntSetVal* rsv = eval_intset(env, e); IntSetRanges rr(rsv); if (!Ranges::subset(rr, ir)) { return false; } } else if (e->type() == Type::parsetfloat()) { FloatSetVal* fsv = eval_floatset(env, domain); FloatSetRanges fr(fsv); FloatSetVal* rsv = eval_floatset(env, e); FloatSetRanges rr(rsv); if (!Ranges::subset(rr, fr)) { return false; } } return true; } void check_par_declaration(EnvI& env, VarDecl* vd) { if (vd->type().dim() > 0) { check_index_sets(env, vd, vd->e()); if (vd->ti()->domain() != nullptr) { ArrayLit* al = eval_array_lit(env, vd->e()); for (unsigned int i = 0; i < al->size(); i++) { if (!check_par_domain(env, (*al)[i], vd->ti()->domain())) { throw ResultUndefinedError(env, vd->e()->loc(), "parameter value out of range"); } } } } else { if (vd->ti()->domain() != nullptr) { if (!check_par_domain(env, vd->e(), vd->ti()->domain())) { throw ResultUndefinedError(env, vd->e()->loc(), "parameter value out of range"); } } } } template typename E::Val eval_id(EnvI& env, Expression* e) { Id* id = e->cast(); if (!id->decl()) { throw EvalError(env, e->loc(), "undeclared identifier", id->str()); } VarDecl* vd = id->decl(); while (vd->flat() && vd->flat() != vd) { vd = vd->flat(); } if (!vd->e()) { throw EvalError(env, vd->loc(), "cannot evaluate expression", id->str()); } typename E::Val r = E::e(env, vd->e()); if (!vd->evaluated() && (vd->toplevel() || vd->type().dim() > 0)) { Expression* ne = E::exp(r); vd->e(ne); vd->evaluated(true); } return r; } bool EvalBase::evalBoolCV(EnvI& env, Expression* e) { GCLock lock; if (e->type().cv()) { return eval_bool(env, flat_cv_exp(env, Ctx(), e)()); } return eval_bool(env, e); }; class EvalIntLit : public EvalBase { public: typedef IntLit* Val; typedef Expression* ArrayVal; static IntLit* e(EnvI& env, Expression* e) { return IntLit::a(eval_int(env, e)); } static Expression* exp(IntLit* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalIntVal : public EvalBase { public: typedef IntVal Val; typedef IntVal ArrayVal; static IntVal e(EnvI& env, Expression* e) { return eval_int(env, e); } static Expression* exp(IntVal e) { return IntLit::a(e); } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) { if ((fi->ti()->domain() != nullptr) && !fi->ti()->domain()->isa()) { IntSetVal* isv = eval_intset(env, fi->ti()->domain()); if (!isv->contains(v)) { throw ResultUndefinedError(env, Location().introduce(), "function result violates function type-inst"); } } } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalFloatVal : public EvalBase { public: typedef FloatVal Val; typedef FloatVal ArrayVal; static FloatVal e(EnvI& env, Expression* e) { return eval_float(env, e); } static Expression* exp(FloatVal e) { return FloatLit::a(e); } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) { if ((fi->ti()->domain() != nullptr) && !fi->ti()->domain()->isa()) { FloatSetVal* fsv = eval_floatset(env, fi->ti()->domain()); if (!fsv->contains(v)) { throw ResultUndefinedError(env, Location().introduce(), "function result violates function type-inst"); } } } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalFloatLit : public EvalBase { public: typedef FloatLit* Val; typedef Expression* ArrayVal; static FloatLit* e(EnvI& env, Expression* e) { return FloatLit::a(eval_float(env, e)); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalString : public EvalBase { public: typedef std::string Val; typedef std::string ArrayVal; static std::string e(EnvI& env, Expression* e) { return eval_string(env, e); } static Expression* exp(const std::string& e) { return new StringLit(Location(), e); } static void checkRetVal(EnvI& env, const Val& v, FunctionI* fi) {} static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalStringLit : public EvalBase { public: typedef StringLit* Val; typedef Expression* ArrayVal; static StringLit* e(EnvI& env, Expression* e) { return new StringLit(Location(), eval_string(env, e)); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalBoolLit : public EvalBase { public: typedef BoolLit* Val; typedef Expression* ArrayVal; static BoolLit* e(EnvI& env, Expression* e) { return constants().boollit(eval_bool(env, e)); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalBoolVal : public EvalBase { public: typedef bool Val; static bool e(EnvI& env, Expression* e) { return eval_bool(env, e); } static Expression* exp(bool e) { return constants().boollit(e); } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) {} static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalArrayLit : public EvalBase { public: typedef ArrayLit* Val; typedef Expression* ArrayVal; static ArrayLit* e(EnvI& env, Expression* e) { return eval_array_lit(env, e); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalArrayLitCopy : public EvalBase { public: typedef ArrayLit* Val; typedef Expression* ArrayVal; static ArrayLit* e(EnvI& env, Expression* e) { return copy(env, eval_array_lit(env, e), true)->cast(); } static Expression* exp(Expression* e) { return e; } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) { for (unsigned int i = 0; i < fi->ti()->ranges().size(); i++) { if ((fi->ti()->ranges()[i]->domain() != nullptr) && !fi->ti()->ranges()[i]->domain()->isa()) { IntSetVal* isv = eval_intset(env, fi->ti()->ranges()[i]->domain()); bool bothEmpty = isv->min() > isv->max() && v->min(i) > v->max(i); if (!bothEmpty && (v->min(i) != isv->min() || v->max(i) != isv->max())) { std::ostringstream oss; oss << "array index set " << (i + 1) << " of function result violates function type-inst"; throw ResultUndefinedError(env, fi->e()->loc(), oss.str()); } } } if ((fi->ti()->domain() != nullptr) && !fi->ti()->domain()->isa() && fi->ti()->type().ti() == Type::TI_PAR) { Type base_t = fi->ti()->type(); if (base_t.bt() == Type::BT_INT) { IntSetVal* isv = eval_intset(env, fi->ti()->domain()); if (base_t.st() == Type::ST_PLAIN) { for (unsigned int i = 0; i < v->size(); i++) { IntVal iv = eval_int(env, (*v)[i]); if (!isv->contains(iv)) { std::ostringstream oss; oss << "array contains value " << iv << " which is not contained in " << *isv; throw ResultUndefinedError( env, fi->e()->loc(), "function result violates function type-inst, " + oss.str()); } } } else { for (unsigned int i = 0; i < v->size(); i++) { IntSetVal* iv = eval_intset(env, (*v)[i]); IntSetRanges isv_r(isv); IntSetRanges v_r(iv); if (!Ranges::subset(v_r, isv_r)) { std::ostringstream oss; oss << "array contains value " << *iv << " which is not a subset of " << *isv; throw ResultUndefinedError( env, fi->e()->loc(), "function result violates function type-inst, " + oss.str()); } } } } else if (base_t.bt() == Type::BT_FLOAT) { FloatSetVal* fsv = eval_floatset(env, fi->ti()->domain()); if (base_t.st() == Type::ST_PLAIN) { for (unsigned int i = 0; i < v->size(); i++) { FloatVal fv = eval_float(env, (*v)[i]); if (!fsv->contains(fv)) { std::ostringstream oss; oss << "array contains value " << fv << " which is not contained in " << *fsv; throw ResultUndefinedError( env, fi->e()->loc(), "function result violates function type-inst, " + oss.str()); } } } else { for (unsigned int i = 0; i < v->size(); i++) { FloatSetVal* fv = eval_floatset(env, (*v)[i]); FloatSetRanges fsv_r(fsv); FloatSetRanges v_r(fv); if (!Ranges::subset(v_r, fsv_r)) { std::ostringstream oss; oss << "array contains value " << *fv << " which is not a subset of " << *fsv; throw ResultUndefinedError( env, fi->e()->loc(), "function result violates function type-inst, " + oss.str()); } } } } } } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalIntSet : public EvalBase { public: typedef IntSetVal* Val; static IntSetVal* e(EnvI& env, Expression* e) { return eval_intset(env, e); } static Expression* exp(IntSetVal* e) { return new SetLit(Location(), e); } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) { if ((fi->ti()->domain() != nullptr) && !fi->ti()->domain()->isa()) { IntSetVal* isv = eval_intset(env, fi->ti()->domain()); IntSetRanges isv_r(isv); IntSetRanges v_r(v); if (!Ranges::subset(v_r, isv_r)) { throw ResultUndefinedError(env, Location().introduce(), "function result violates function type-inst"); } } } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalFloatSet : public EvalBase { public: typedef FloatSetVal* Val; static FloatSetVal* e(EnvI& env, Expression* e) { return eval_floatset(env, e); } static Expression* exp(FloatSetVal* e) { return new SetLit(Location(), e); } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) { if ((fi->ti()->domain() != nullptr) && !fi->ti()->domain()->isa()) { FloatSetVal* fsv = eval_floatset(env, fi->ti()->domain()); FloatSetRanges fsv_r(fsv); FloatSetRanges v_r(v); if (!Ranges::subset(v_r, fsv_r)) { throw ResultUndefinedError(env, Location().introduce(), "function result violates function type-inst"); } } } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalBoolSet : public EvalBase { public: typedef IntSetVal* Val; static IntSetVal* e(EnvI& env, Expression* e) { return eval_boolset(env, e); } static Expression* exp(IntSetVal* e) { auto* sl = new SetLit(Location(), e); sl->type(Type::parsetbool()); return sl; } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) {} static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalSetLit : public EvalBase { public: typedef SetLit* Val; typedef Expression* ArrayVal; static SetLit* e(EnvI& env, Expression* e) { return eval_set_lit(env, e); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalFloatSetLit : public EvalBase { public: typedef SetLit* Val; typedef Expression* ArrayVal; static SetLit* e(EnvI& env, Expression* e) { return new SetLit(e->loc(), eval_floatset(env, e)); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalBoolSetLit : public EvalBase { public: typedef SetLit* Val; typedef Expression* ArrayVal; static SetLit* e(EnvI& env, Expression* e) { auto* sl = new SetLit(e->loc(), eval_boolset(env, e)); sl->type(Type::parsetbool()); return sl; } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalCopy : public EvalBase { public: typedef Expression* Val; typedef Expression* ArrayVal; static Expression* e(EnvI& env, Expression* e) { return copy(env, e, true); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; class EvalPar : public EvalBase { public: typedef Expression* Val; typedef Expression* ArrayVal; static Expression* e(EnvI& env, Expression* e) { return eval_par(env, e); } static Expression* exp(Expression* e) { return e; } static void checkRetVal(EnvI& env, Val v, FunctionI* fi) {} static Expression* flatten(EnvI& /*env*/, Expression* /*e*/) { throw InternalError("evaluating var assignment generator inside par expression not supported"); } }; void check_dom(EnvI& env, Id* arg, IntSetVal* dom, Expression* e) { bool oob = false; if (!e->type().isOpt()) { if (e->type().isIntSet()) { IntSetVal* ev = eval_intset(env, e); IntSetRanges ev_r(ev); IntSetRanges dom_r(dom); oob = !Ranges::subset(ev_r, dom_r); } else { oob = !dom->contains(eval_int(env, e)); } } if (oob) { std::ostringstream oss; oss << "value for argument `" << *arg << "' out of bounds"; throw EvalError(env, e->loc(), oss.str()); } } void check_dom(EnvI& env, Id* arg, FloatVal dom_min, FloatVal dom_max, Expression* e) { if (!e->type().isOpt()) { FloatVal ev = eval_float(env, e); if (ev < dom_min || ev > dom_max) { std::ostringstream oss; oss << "value for argument `" << *arg << "' out of bounds"; throw EvalError(env, e->loc(), oss.str()); } } } template typename Eval::Val eval_call(EnvI& env, CallClass* ce) { std::vector previousParameters(ce->decl()->params().size()); std::vector params(ce->decl()->params().size()); for (unsigned int i = 0; i < ce->decl()->params().size(); i++) { params[i] = eval_par(env, ce->arg(i)); } for (unsigned int i = ce->decl()->params().size(); i--;) { VarDecl* vd = ce->decl()->params()[i]; if (vd->type().dim() > 0) { // Check array index sets auto* al = params[i]->cast(); for (unsigned int j = 0; j < vd->ti()->ranges().size(); j++) { TypeInst* range_ti = vd->ti()->ranges()[j]; if (range_ti->domain() && !range_ti->domain()->isa()) { IntSetVal* isv = eval_intset(env, range_ti->domain()); if (isv->min() != al->min(j) || isv->max() != al->max(j)) { std::ostringstream oss; oss << "array index set " << (j + 1) << " of argument " << (i + 1) << " does not match declared index set"; throw EvalError(env, ce->loc(), oss.str()); } } } } previousParameters[i] = vd->e(); vd->flat(vd); vd->e(params[i]); if (vd->e()->type().isPar()) { if (Expression* dom = vd->ti()->domain()) { if (!dom->isa()) { if (vd->e()->type().bt() == Type::BT_INT) { IntSetVal* isv = eval_intset(env, dom); if (vd->e()->type().dim() > 0) { ArrayLit* al = eval_array_lit(env, vd->e()); for (unsigned int i = 0; i < al->size(); i++) { check_dom(env, vd->id(), isv, (*al)[i]); } } else { check_dom(env, vd->id(), isv, vd->e()); } } else if (vd->e()->type().bt() == Type::BT_FLOAT) { GCLock lock; FloatSetVal* fsv = eval_floatset(env, dom); FloatVal dom_min = fsv->min(); FloatVal dom_max = fsv->max(); check_dom(env, vd->id(), dom_min, dom_max, vd->e()); } } } } } typename Eval::Val ret = Eval::e(env, ce->decl()->e()); Eval::checkRetVal(env, ret, ce->decl()); for (unsigned int i = ce->decl()->params().size(); i--;) { VarDecl* vd = ce->decl()->params()[i]; vd->e(previousParameters[i]); vd->flat(vd->e() ? vd : nullptr); } return ret; } ArrayLit* eval_array_comp(EnvI& env, Comprehension* e) { ArrayLit* ret; if (e->type() == Type::parint(1)) { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } else if (e->type() == Type::parbool(1)) { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } else if (e->type() == Type::parfloat(1)) { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } else if (e->type().st() == Type::ST_SET) { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } else if (e->type() == Type::parstring(1)) { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } else { std::vector a = eval_comp(env, e); ret = new ArrayLit(e->loc(), a); } ret->type(e->type()); return ret; } ArrayLit* eval_array_lit(EnvI& env, Expression* e) { CallStackItem csi(env, e); switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_SETLIT: case Expression::E_ANON: case Expression::E_TI: case Expression::E_TIID: case Expression::E_VARDECL: throw EvalError(env, e->loc(), "not an array expression"); case Expression::E_ID: return eval_id(env, e); case Expression::E_ARRAYLIT: return e->cast(); case Expression::E_ARRAYACCESS: throw EvalError(env, e->loc(), "arrays of arrays not supported"); case Expression::E_COMP: return eval_array_comp(env, e->cast()); case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_array_lit(env, ite->thenExpr(i)); } } return eval_array_lit(env, ite->elseExpr()); } case Expression::E_BINOP: { auto* bo = e->cast(); if (bo->op() == BOT_PLUSPLUS) { ArrayLit* al0 = eval_array_lit(env, bo->lhs()); ArrayLit* al1 = eval_array_lit(env, bo->rhs()); std::vector v(al0->size() + al1->size()); for (unsigned int i = al0->size(); (i--) != 0U;) { v[i] = (*al0)[i]; } for (unsigned int i = al1->size(); (i--) != 0U;) { v[al0->size() + i] = (*al1)[i]; } auto* ret = new ArrayLit(e->loc(), v); ret->flat(al0->flat() && al1->flat()); ret->type(e->type()); return ret; } if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } throw EvalError(env, e->loc(), "not an array expression", bo->opToString()); } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } throw EvalError(env, e->loc(), "not an array expression"); } case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.e != nullptr) { return eval_array_lit(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } ArrayLit* l_in = eval_array_lit(env, l->in()); auto* ret = copy(env, l_in, true)->cast(); ret->flat(l_in->flat()); l->popbindings(); return ret; } } assert(false); return nullptr; } Expression* eval_arrayaccess(EnvI& env, ArrayLit* al, const std::vector& idx, bool& success) { success = true; assert(al->dims() == idx.size()); IntVal realidx = 0; int realdim = 1; for (int i = 0; i < al->dims(); i++) { realdim *= al->max(i) - al->min(i) + 1; } for (int i = 0; i < al->dims(); i++) { IntVal ix = idx[i]; if (ix < al->min(i) || ix > al->max(i)) { success = false; Type t = al->type(); t.dim(0); if (t.isint()) { return IntLit::a(0); } if (t.isbool()) { return constants().literalFalse; } if (t.isfloat()) { return FloatLit::a(0.0); } if (t.st() == Type::ST_SET || t.isbot()) { auto* ret = new SetLit(Location(), std::vector()); ret->type(t); return ret; } if (t.isstring()) { return new StringLit(Location(), ""); } throw EvalError(env, al->loc(), "Internal error: unexpected type in array access expression"); } realdim /= al->max(i) - al->min(i) + 1; realidx += (ix - al->min(i)) * realdim; } assert(realidx >= 0 && realidx <= al->size()); return (*al)[static_cast(realidx.toInt())]; } Expression* eval_arrayaccess(EnvI& env, ArrayAccess* e, bool& success) { ArrayLit* al = eval_array_lit(env, e->v()); std::vector dims(e->idx().size()); for (unsigned int i = e->idx().size(); (i--) != 0U;) { dims[i] = eval_int(env, e->idx()[i]); } return eval_arrayaccess(env, al, dims, success); } Expression* eval_arrayaccess(EnvI& env, ArrayAccess* e) { bool success; Expression* ret = eval_arrayaccess(env, e, success); if (success) { return ret; } throw ResultUndefinedError(env, e->loc(), "array access out of bounds"); } SetLit* eval_set_lit(EnvI& env, Expression* e) { switch (e->type().bt()) { case Type::BT_INT: case Type::BT_BOT: return new SetLit(e->loc(), eval_intset(env, e)); case Type::BT_BOOL: { auto* sl = new SetLit(e->loc(), eval_boolset(env, e)); sl->type(Type::parsetbool()); return sl; } case Type::BT_FLOAT: return new SetLit(e->loc(), eval_floatset(env, e)); default: throw InternalError("invalid set literal type"); } } IntSetVal* eval_intset(EnvI& env, Expression* e) { if (auto* sl = e->dynamicCast()) { if (sl->isv() != nullptr) { return sl->isv(); } } CallStackItem csi(env, e); switch (e->eid()) { case Expression::E_SETLIT: { auto* sl = e->cast(); std::vector vals; for (unsigned int i = 0; i < sl->v().size(); i++) { Expression* vi = eval_par(env, sl->v()[i]); if (vi != constants().absent) { vals.push_back(eval_int(env, vi)); } } return IntSetVal::a(vals); } case Expression::E_BOOLLIT: case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not a set of int expression"); break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); std::vector vals(al->size()); for (unsigned int i = 0; i < al->size(); i++) { vals[i] = eval_int(env, (*al)[i]); } return IntSetVal::a(vals); } break; case Expression::E_COMP: { auto* c = e->cast(); std::vector a = eval_comp(env, c); return IntSetVal::a(a); } case Expression::E_ID: { GCLock lock; return eval_id(env, e)->isv(); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_intset(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_intset(env, ite->thenExpr(i)); } } return eval_intset(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } Expression* lhs = eval_par(env, bo->lhs()); Expression* rhs = eval_par(env, bo->rhs()); if (lhs->type().isIntSet() && rhs->type().isIntSet()) { IntSetVal* v0 = eval_intset(env, lhs); IntSetVal* v1 = eval_intset(env, rhs); IntSetRanges ir0(v0); IntSetRanges ir1(v1); switch (bo->op()) { case BOT_UNION: { Ranges::Union u(ir0, ir1); return IntSetVal::ai(u); } case BOT_DIFF: { Ranges::Diff u(ir0, ir1); return IntSetVal::ai(u); } case BOT_SYMDIFF: { Ranges::Union u(ir0, ir1); Ranges::Inter i(ir0, ir1); Ranges::Diff, Ranges::Inter> sd(u, i); return IntSetVal::ai(sd); } case BOT_INTERSECT: { Ranges::Inter u(ir0, ir1); return IntSetVal::ai(u); } default: throw EvalError(env, e->loc(), "not a set of int expression", bo->opToString()); } } else if (lhs->type().isint() && rhs->type().isint()) { if (bo->op() != BOT_DOTDOT) { throw EvalError(env, e->loc(), "not a set of int expression", bo->opToString()); } return IntSetVal::a(eval_int(env, lhs), eval_int(env, rhs)); } else { throw EvalError(env, e->loc(), "not a set of int expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } throw EvalError(env, e->loc(), "not a set of int expression"); } case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.s != nullptr) { return ce->decl()->builtins.s(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_intset(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } IntSetVal* ret = eval_intset(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return nullptr; } } FloatSetVal* eval_floatset(EnvI& env, Expression* e) { if (auto* sl = e->dynamicCast()) { if (sl->fsv() != nullptr) { return sl->fsv(); } if (sl->isv() != nullptr) { IntSetRanges isr(sl->isv()); return FloatSetVal::ai(isr); } } CallStackItem csi(env, e); switch (e->eid()) { case Expression::E_SETLIT: { auto* sl = e->cast(); std::vector vals; for (unsigned int i = 0; i < sl->v().size(); i++) { Expression* vi = eval_par(env, sl->v()[i]); if (vi != constants().absent) { vals.push_back(eval_float(env, vi)); } } return FloatSetVal::a(vals); } case Expression::E_BOOLLIT: case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not a set of float expression"); break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); std::vector vals(al->size()); for (unsigned int i = 0; i < al->size(); i++) { vals[i] = eval_float(env, (*al)[i]); } return FloatSetVal::a(vals); } break; case Expression::E_COMP: { auto* c = e->cast(); std::vector a = eval_comp(env, c); return FloatSetVal::a(a); } case Expression::E_ID: { GCLock lock; return eval_floatset(env, eval_id(env, e)); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_floatset(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_floatset(env, ite->thenExpr(i)); } } return eval_floatset(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } Expression* lhs = eval_par(env, bo->lhs()); Expression* rhs = eval_par(env, bo->rhs()); if (lhs->type().isFloatSet() && rhs->type().isFloatSet()) { FloatSetVal* v0 = eval_floatset(env, lhs); FloatSetVal* v1 = eval_floatset(env, rhs); FloatSetRanges fr0(v0); FloatSetRanges fr1(v1); switch (bo->op()) { case BOT_UNION: { Ranges::Union u(fr0, fr1); return FloatSetVal::ai(u); } case BOT_DIFF: { Ranges::Diff u(fr0, fr1); return FloatSetVal::ai(u); } case BOT_SYMDIFF: { Ranges::Union u(fr0, fr1); Ranges::Inter i(fr0, fr1); Ranges::Diff, Ranges::Inter> sd(u, i); return FloatSetVal::ai(sd); } case BOT_INTERSECT: { Ranges::Inter u(fr0, fr1); return FloatSetVal::ai(u); } default: throw EvalError(env, e->loc(), "not a set of int expression", bo->opToString()); } } else if (lhs->type().isfloat() && rhs->type().isfloat()) { if (bo->op() != BOT_DOTDOT) { throw EvalError(env, e->loc(), "not a set of float expression", bo->opToString()); } return FloatSetVal::a(eval_float(env, lhs), eval_float(env, rhs)); } else { throw EvalError(env, e->loc(), "not a set of float expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } throw EvalError(env, e->loc(), "not a set of float expression"); } case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.e != nullptr) { return eval_floatset(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } FloatSetVal* ret = eval_floatset(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return nullptr; } } bool eval_bool(EnvI& env, Expression* e) { CallStackItem csi(env, e); try { if (auto* bl = e->dynamicCast()) { return bl->v(); } switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_SETLIT: case Expression::E_ARRAYLIT: case Expression::E_COMP: case Expression::E_VARDECL: case Expression::E_TI: assert(false); throw EvalError(env, e->loc(), "not a bool expression"); break; case Expression::E_ID: { GCLock lock; return eval_id(env, e)->v(); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_bool(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_bool(env, ite->thenExpr(i)); } } return eval_bool(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); Expression* lhs = bo->lhs(); if (lhs->type().bt() == Type::BT_TOP) { lhs = eval_par(env, lhs); } Expression* rhs = bo->rhs(); if (rhs->type().bt() == Type::BT_TOP) { rhs = eval_par(env, rhs); } if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } if (lhs->type().isbool() && rhs->type().isbool()) { try { switch (bo->op()) { case BOT_LE: return static_cast(eval_bool(env, lhs)) < static_cast(eval_bool(env, rhs)); case BOT_LQ: return static_cast(eval_bool(env, lhs)) <= static_cast(eval_bool(env, rhs)); case BOT_GR: return static_cast(eval_bool(env, lhs)) > static_cast(eval_bool(env, rhs)); case BOT_GQ: return static_cast(eval_bool(env, lhs)) >= static_cast(eval_bool(env, rhs)); case BOT_EQ: return eval_bool(env, lhs) == eval_bool(env, rhs); case BOT_NQ: return eval_bool(env, lhs) != eval_bool(env, rhs); case BOT_EQUIV: return eval_bool(env, lhs) == eval_bool(env, rhs); case BOT_IMPL: return (!eval_bool(env, lhs)) || eval_bool(env, rhs); case BOT_RIMPL: return (!eval_bool(env, rhs)) || eval_bool(env, lhs); case BOT_OR: return eval_bool(env, lhs) || eval_bool(env, rhs); case BOT_AND: return eval_bool(env, lhs) && eval_bool(env, rhs); case BOT_XOR: return eval_bool(env, lhs) ^ eval_bool(env, rhs); default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isint() && rhs->type().isint()) { try { IntVal v0 = eval_int(env, lhs); IntVal v1 = eval_int(env, rhs); switch (bo->op()) { case BOT_LE: return v0 < v1; case BOT_LQ: return v0 <= v1; case BOT_GR: return v0 > v1; case BOT_GQ: return v0 >= v1; case BOT_EQ: return v0 == v1; case BOT_NQ: return v0 != v1; default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isfloat() && rhs->type().isfloat()) { try { FloatVal v0 = eval_float(env, lhs); FloatVal v1 = eval_float(env, rhs); switch (bo->op()) { case BOT_LE: return v0 < v1; case BOT_LQ: return v0 <= v1; case BOT_GR: return v0 > v1; case BOT_GQ: return v0 >= v1; case BOT_EQ: return v0 == v1; case BOT_NQ: return v0 != v1; default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isint() && rhs->type().isIntSet()) { try { IntVal v0 = eval_int(env, lhs); GCLock lock; IntSetVal* v1 = eval_intset(env, rhs); switch (bo->op()) { case BOT_IN: return v1->contains(v0); default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isfloat() && rhs->type().isFloatSet()) { try { FloatVal v0 = eval_float(env, lhs); GCLock lock; FloatSetVal* v1 = eval_floatset(env, rhs); switch (bo->op()) { case BOT_IN: return v1->contains(v0); default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isSet() && rhs->type().isSet()) { try { GCLock lock; IntSetVal* v0 = eval_intset(env, lhs); IntSetVal* v1 = eval_intset(env, rhs); IntSetRanges ir0(v0); IntSetRanges ir1(v1); switch (bo->op()) { case BOT_LE: return Ranges::less(ir0, ir1); case BOT_LQ: return Ranges::less_eq(ir0, ir1); case BOT_GR: return Ranges::less(ir1, ir0); case BOT_GQ: return Ranges::less_eq(ir1, ir0); case BOT_EQ: return Ranges::equal(ir0, ir1); case BOT_NQ: return !Ranges::equal(ir0, ir1); case BOT_SUBSET: return Ranges::subset(ir0, ir1); case BOT_SUPERSET: return Ranges::subset(ir1, ir0); default: throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (lhs->type().isstring() && rhs->type().isstring()) { try { GCLock lock; std::string s0 = eval_string(env, lhs); std::string s1 = eval_string(env, rhs); switch (bo->op()) { case BOT_EQ: return s0 == s1; case BOT_NQ: return s0 != s1; case BOT_LE: return s0 < s1; case BOT_LQ: return s0 <= s1; case BOT_GR: return s0 > s1; case BOT_GQ: return s0 >= s1; default: throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } catch (ResultUndefinedError&) { return false; } } else if (bo->op() == BOT_EQ && lhs->type().isAnn()) { return Expression::equal(lhs, rhs); } else if (bo->op() == BOT_EQ && lhs->type().dim() > 0 && rhs->type().dim() > 0) { try { ArrayLit* al0 = eval_array_lit(env, lhs); ArrayLit* al1 = eval_array_lit(env, rhs); if (al0->size() != al1->size()) { return false; } for (unsigned int i = 0; i < al0->size(); i++) { if (!Expression::equal(eval_par(env, (*al0)[i]), eval_par(env, (*al1)[i]))) { return false; } } return true; } catch (ResultUndefinedError&) { return false; } } else { throw EvalError(env, e->loc(), "not a bool expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } bool v0 = eval_bool(env, uo->e()); switch (uo->op()) { case UOT_NOT: return !v0; default: assert(false); throw EvalError(env, e->loc(), "not a bool expression", uo->opToString()); } } break; case Expression::E_CALL: { try { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.b != nullptr) { return ce->decl()->builtins.b(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_bool(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } catch (ResultUndefinedError&) { return false; } } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); bool ret = true; for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); bool maybe_partial = vdi->ann().contains(constants().ann.maybe_partial); if (maybe_partial) { env.inMaybePartial++; } try { check_par_declaration(env, vdi); } catch (ResultUndefinedError&) { ret = false; } if (maybe_partial) { env.inMaybePartial--; } } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is false. if (!eval_bool(env, l->let()[i])) { if (l->let()[i]->ann().contains(constants().ann.maybe_partial)) { ret = false; } else { throw ResultUndefinedError(env, l->let()[i]->loc(), "domain constraint in let failed"); } } } } ret = ret && eval_bool(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return false; } } catch (ResultUndefinedError&) { // undefined means false return false; } } IntSetVal* eval_boolset(EnvI& env, Expression* e) { CallStackItem csi(env, e); switch (e->eid()) { case Expression::E_SETLIT: { auto* sl = e->cast(); if (sl->isv() != nullptr) { return sl->isv(); } std::vector vals; for (unsigned int i = 0; i < sl->v().size(); i++) { Expression* vi = eval_par(env, sl->v()[i]); if (vi != constants().absent) { vals.push_back(eval_int(env, vi)); } } return IntSetVal::a(vals); } case Expression::E_BOOLLIT: case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not a set of bool expression"); break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); std::vector vals(al->size()); for (unsigned int i = 0; i < al->size(); i++) { vals[i] = static_cast(eval_bool(env, (*al)[i])); } return IntSetVal::a(vals); } break; case Expression::E_COMP: { auto* c = e->cast(); std::vector a = eval_comp(env, c); return IntSetVal::a(a); } case Expression::E_ID: { GCLock lock; return eval_id(env, e)->isv(); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_boolset(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_boolset(env, ite->thenExpr(i)); } } return eval_boolset(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } Expression* lhs = eval_par(env, bo->lhs()); Expression* rhs = eval_par(env, bo->rhs()); if (lhs->type().isIntSet() && rhs->type().isIntSet()) { IntSetVal* v0 = eval_boolset(env, lhs); IntSetVal* v1 = eval_boolset(env, rhs); IntSetRanges ir0(v0); IntSetRanges ir1(v1); switch (bo->op()) { case BOT_UNION: { Ranges::Union u(ir0, ir1); return IntSetVal::ai(u); } case BOT_DIFF: { Ranges::Diff u(ir0, ir1); return IntSetVal::ai(u); } case BOT_SYMDIFF: { Ranges::Union u(ir0, ir1); Ranges::Inter i(ir0, ir1); Ranges::Diff, Ranges::Inter> sd(u, i); return IntSetVal::ai(sd); } case BOT_INTERSECT: { Ranges::Inter u(ir0, ir1); return IntSetVal::ai(u); } default: throw EvalError(env, e->loc(), "not a set of bool expression", bo->opToString()); } } else if (lhs->type().isbool() && rhs->type().isbool()) { if (bo->op() != BOT_DOTDOT) { throw EvalError(env, e->loc(), "not a set of bool expression", bo->opToString()); } return IntSetVal::a(static_cast(eval_bool(env, lhs)), static_cast(eval_bool(env, rhs))); } else { throw EvalError(env, e->loc(), "not a set of bool expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } throw EvalError(env, e->loc(), "not a set of bool expression"); } case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.s != nullptr) { return ce->decl()->builtins.s(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_boolset(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } IntSetVal* ret = eval_boolset(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return nullptr; } } IntVal eval_int(EnvI& env, Expression* e) { if (e->type().isbool()) { return static_cast(eval_bool(env, e)); } if (auto* il = e->dynamicCast()) { return il->v(); } CallStackItem csi(env, e); try { switch (e->eid()) { case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_SETLIT: case Expression::E_ARRAYLIT: case Expression::E_COMP: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not an integer expression"); break; case Expression::E_ID: { GCLock lock; return eval_id(env, e)->v(); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_int(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_int(env, ite->thenExpr(i)); } } return eval_int(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } IntVal v0 = eval_int(env, bo->lhs()); IntVal v1 = eval_int(env, bo->rhs()); switch (bo->op()) { case BOT_PLUS: return v0 + v1; case BOT_MINUS: return v0 - v1; case BOT_MULT: return v0 * v1; case BOT_POW: return v0.pow(v1); case BOT_IDIV: if (v1 == 0) { throw ResultUndefinedError(env, e->loc(), "division by zero"); } return v0 / v1; case BOT_MOD: if (v1 == 0) { throw ResultUndefinedError(env, e->loc(), "division by zero"); } return v0 % v1; default: throw EvalError(env, e->loc(), "not an integer expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } IntVal v0 = eval_int(env, uo->e()); switch (uo->op()) { case UOT_PLUS: return v0; case UOT_MINUS: return -v0; default: throw EvalError(env, e->loc(), "not an integer expression", uo->opToString()); } } break; case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.i != nullptr) { return ce->decl()->builtins.i(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_int(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } IntVal ret = eval_int(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return 0; } } catch (ArithmeticError& err) { throw EvalError(env, e->loc(), err.msg()); } } FloatVal eval_float(EnvI& env, Expression* e) { if (e->type().isint()) { return static_cast(eval_int(env, e).toInt()); } if (e->type().isbool()) { return static_cast(eval_bool(env, e)); } CallStackItem csi(env, e); try { if (auto* fl = e->dynamicCast()) { return fl->v(); } switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_SETLIT: case Expression::E_ARRAYLIT: case Expression::E_COMP: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not a float expression"); break; case Expression::E_ID: { GCLock lock; return eval_id(env, e)->v(); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_float(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_float(env, ite->thenExpr(i)); } } return eval_float(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } FloatVal v0 = eval_float(env, bo->lhs()); FloatVal v1 = eval_float(env, bo->rhs()); switch (bo->op()) { case BOT_PLUS: return v0 + v1; case BOT_MINUS: return v0 - v1; case BOT_MULT: return v0 * v1; case BOT_POW: return std::pow(v0.toDouble(), v1.toDouble()); case BOT_DIV: if (v1 == 0.0) { throw ResultUndefinedError(env, e->loc(), "division by zero"); } return v0 / v1; default: throw EvalError(env, e->loc(), "not a float expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } FloatVal v0 = eval_float(env, uo->e()); switch (uo->op()) { case UOT_PLUS: return v0; case UOT_MINUS: return -v0; default: throw EvalError(env, e->loc(), "not a float expression", uo->opToString()); } } break; case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.f != nullptr) { return ce->decl()->builtins.f(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_float(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } FloatVal ret = eval_float(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return 0.0; } } catch (ArithmeticError& err) { throw EvalError(env, e->loc(), err.msg()); } } std::string eval_string(EnvI& env, Expression* e) { CallStackItem csi(env, e); switch (e->eid()) { case Expression::E_STRINGLIT: { ASTString str = e->cast()->v(); return std::string(str.c_str(), str.size()); } case Expression::E_FLOATLIT: case Expression::E_INTLIT: case Expression::E_BOOLLIT: case Expression::E_ANON: case Expression::E_TIID: case Expression::E_SETLIT: case Expression::E_ARRAYLIT: case Expression::E_COMP: case Expression::E_VARDECL: case Expression::E_TI: throw EvalError(env, e->loc(), "not a string expression"); break; case Expression::E_ID: { GCLock lock; ASTString str = eval_id(env, e)->v(); return std::string(str.c_str(), str.size()); } break; case Expression::E_ARRAYACCESS: { GCLock lock; return eval_string(env, eval_arrayaccess(env, e->cast())); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (eval_bool(env, ite->ifExpr(i))) { return eval_string(env, ite->thenExpr(i)); } } return eval_string(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } std::string v0 = eval_string(env, bo->lhs()); std::string v1 = eval_string(env, bo->rhs()); switch (bo->op()) { case BOT_PLUSPLUS: return v0 + v1; default: throw EvalError(env, e->loc(), "not a string expression", bo->opToString()); } } break; case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } throw EvalError(env, e->loc(), "not a string expression"); } break; case Expression::E_CALL: { Call* ce = e->cast(); if (ce->decl() == nullptr) { throw EvalError(env, e->loc(), "undeclared function", ce->id()); } if (ce->decl()->builtins.str != nullptr) { return ce->decl()->builtins.str(env, ce); } if (ce->decl()->builtins.e != nullptr) { return eval_string(env, ce->decl()->builtins.e(env, ce)); } if (ce->decl()->e() == nullptr) { std::ostringstream ss; ss << "internal error: missing builtin '" << ce->id() << "'"; throw EvalError(env, ce->loc(), ss.str()); } return eval_call(env, ce); } break; case Expression::E_LET: { Let* l = e->cast(); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } std::string ret = eval_string(env, l->in()); l->popbindings(); return ret; } break; default: assert(false); return ""; } } Expression* eval_par(EnvI& env, Expression* e) { if (e == nullptr) { return nullptr; } switch (e->eid()) { case Expression::E_ANON: case Expression::E_TIID: { return e; } case Expression::E_COMP: if (e->cast()->set()) { return EvalSetLit::e(env, e); } // fall through case Expression::E_ARRAYLIT: { ArrayLit* al = eval_array_lit(env, e); std::vector args(al->size()); for (unsigned int i = al->size(); (i--) != 0U;) { args[i] = eval_par(env, (*al)[i]); } std::vector> dims(al->dims()); for (unsigned int i = al->dims(); (i--) != 0U;) { dims[i].first = al->min(i); dims[i].second = al->max(i); } auto* ret = new ArrayLit(al->loc(), args, dims); Type t = al->type(); if (t.isbot() && ret->size() > 0) { t.bt((*ret)[0]->type().bt()); } ret->type(t); return ret; } case Expression::E_VARDECL: { auto* vd = e->cast(); throw EvalError(env, vd->loc(), "cannot evaluate variable declaration", vd->id()->v()); } case Expression::E_TI: { auto* t = e->cast(); ASTExprVec r; if (t->ranges().size() > 0) { std::vector rv(t->ranges().size()); for (unsigned int i = t->ranges().size(); (i--) != 0U;) { rv[i] = static_cast(eval_par(env, t->ranges()[i])); } r = ASTExprVec(rv); } return new TypeInst(Location(), t->type(), r, eval_par(env, t->domain())); } case Expression::E_ID: { if (e == constants().absent) { return e; } Id* id = e->cast(); if (id->decl() == nullptr) { throw EvalError(env, e->loc(), "undefined identifier", id->v()); } if (id->decl()->ti()->domain() != nullptr) { if (auto* bl = id->decl()->ti()->domain()->dynamicCast()) { return bl; } if (id->decl()->ti()->type().isint()) { if (auto* sl = id->decl()->ti()->domain()->dynamicCast()) { if ((sl->isv() != nullptr) && sl->isv()->min() == sl->isv()->max()) { return IntLit::a(sl->isv()->min()); } } } else if (id->decl()->ti()->type().isfloat()) { if (id->decl()->ti()->domain() != nullptr) { FloatSetVal* fsv = eval_floatset(env, id->decl()->ti()->domain()); if (fsv->min() == fsv->max()) { return FloatLit::a(fsv->min()); } } } } if (id->decl()->e() == nullptr) { return id; } return eval_par(env, id->decl()->e()); } case Expression::E_STRINGLIT: return e; default: { if (e->type().dim() != 0) { ArrayLit* al = eval_array_lit(env, e); std::vector args(al->size()); for (unsigned int i = al->size(); (i--) != 0U;) { args[i] = eval_par(env, (*al)[i]); } std::vector> dims(al->dims()); for (unsigned int i = al->dims(); (i--) != 0U;) { dims[i].first = al->min(i); dims[i].second = al->max(i); } auto* ret = new ArrayLit(al->loc(), args, dims); Type t = al->type(); if ((t.bt() == Type::BT_BOT || t.bt() == Type::BT_TOP) && ret->size() > 0) { t.bt((*ret)[0]->type().bt()); } ret->type(t); return ret; } if (e->type().isPar()) { if (e->type().isSet()) { return EvalSetLit::e(env, e); } if (e->type() == Type::parint()) { return EvalIntLit::e(env, e); } if (e->type() == Type::parbool()) { return EvalBoolLit::e(env, e); } if (e->type() == Type::parfloat()) { return EvalFloatLit::e(env, e); } if (e->type() == Type::parstring()) { return EvalStringLit::e(env, e); } } switch (e->eid()) { case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { if (ite->ifExpr(i)->type() == Type::parbool()) { if (eval_bool(env, ite->ifExpr(i))) { return eval_par(env, ite->thenExpr(i)); } } else { std::vector e_ifthen(ite->size() * 2); for (int i = 0; i < ite->size(); i++) { e_ifthen[2 * i] = eval_par(env, ite->ifExpr(i)); e_ifthen[2 * i + 1] = eval_par(env, ite->thenExpr(i)); } ITE* n_ite = new ITE(ite->loc(), e_ifthen, eval_par(env, ite->elseExpr())); n_ite->type(ite->type()); return n_ite; } } return eval_par(env, ite->elseExpr()); } case Expression::E_CALL: { Call* c = e->cast(); if (c->decl() != nullptr) { if (c->decl()->builtins.e != nullptr) { return eval_par(env, c->decl()->builtins.e(env, c)); } if (c->decl()->e() == nullptr) { if (c->id() == "deopt" && Expression::equal(c->arg(0), constants().absent)) { throw ResultUndefinedError(env, e->loc(), "deopt(<>) is undefined"); } return c; } return eval_call(env, c); } std::vector args(c->argCount()); for (unsigned int i = 0; i < args.size(); i++) { args[i] = eval_par(env, c->arg(i)); } Call* nc = new Call(c->loc(), c->id(), args); nc->type(c->type()); return nc; } case Expression::E_BINOP: { auto* bo = e->cast(); if ((bo->decl() != nullptr) && (bo->decl()->e() != nullptr)) { return eval_call(env, bo); } auto* nbo = new BinOp(e->loc(), eval_par(env, bo->lhs()), bo->op(), eval_par(env, bo->rhs())); nbo->type(bo->type()); return nbo; } case Expression::E_UNOP: { UnOp* uo = e->cast(); if ((uo->decl() != nullptr) && (uo->decl()->e() != nullptr)) { return eval_call(env, uo); } UnOp* nuo = new UnOp(e->loc(), uo->op(), eval_par(env, uo->e())); nuo->type(uo->type()); return nuo; } case Expression::E_ARRAYACCESS: { auto* aa = e->cast(); for (unsigned int i = 0; i < aa->idx().size(); i++) { if (!aa->idx()[i]->type().isPar()) { std::vector idx(aa->idx().size()); for (unsigned int j = 0; j < aa->idx().size(); j++) { idx[j] = eval_par(env, aa->idx()[j]); } auto* aa_new = new ArrayAccess(e->loc(), eval_par(env, aa->v()), idx); aa_new->type(aa->type()); return aa_new; } } return eval_par(env, eval_arrayaccess(env, aa)); } case Expression::E_LET: { Let* l = e->cast(); assert(l->type().isPar()); l->pushbindings(); for (unsigned int i = 0; i < l->let().size(); i++) { // Evaluate all variable declarations if (auto* vdi = l->let()[i]->dynamicCast()) { vdi->e(eval_par(env, vdi->e())); check_par_declaration(env, vdi); } else { // This is a constraint item. Since the let is par, // it can only be a par bool expression. If it evaluates // to false, it means that the value of this let is undefined. if (!eval_bool(env, l->let()[i])) { throw ResultUndefinedError(env, l->let()[i]->loc(), "constraint in let failed"); } } } Expression* ret = eval_par(env, l->in()); l->popbindings(); return ret; } default: return e; } } } } class ComputeIntBounds : public EVisitor { public: typedef std::pair Bounds; std::vector bounds; bool valid; EnvI& env; ComputeIntBounds(EnvI& env0) : valid(true), env(env0) {} bool enter(Expression* e) { if (e->type().isAnn()) { return false; } if (e->isa()) { return false; } if (e->type().dim() > 0) { return false; } if (e->type().isPar()) { if (e->type().isint()) { Expression* exp = eval_par(env, e); if (exp == constants().absent) { valid = false; } else { IntVal v = exp->cast()->v(); bounds.emplace_back(v, v); } } else { valid = false; } return false; } if (e->type().isint()) { if (ITE* ite = e->dynamicCast()) { Bounds itebounds(IntVal::infinity(), -IntVal::infinity()); for (int i = 0; i < ite->size(); i++) { if (ite->ifExpr(i)->type().isPar() && static_cast(ite->ifExpr(i)->type().cv()) == Type::CV_NO) { if (eval_bool(env, ite->ifExpr(i))) { BottomUpIterator cbi(*this); cbi.run(ite->thenExpr(i)); Bounds& back = bounds.back(); back.first = std::min(itebounds.first, back.first); back.second = std::max(itebounds.second, back.second); return false; } } else { BottomUpIterator cbi(*this); cbi.run(ite->thenExpr(i)); Bounds back = bounds.back(); bounds.pop_back(); itebounds.first = std::min(itebounds.first, back.first); itebounds.second = std::max(itebounds.second, back.second); } } BottomUpIterator cbi(*this); cbi.run(ite->elseExpr()); Bounds& back = bounds.back(); back.first = std::min(itebounds.first, back.first); back.second = std::max(itebounds.second, back.second); return false; } return true; } return false; } /// Visit integer literal void vIntLit(const IntLit& i) { bounds.emplace_back(i.v(), i.v()); } /// Visit floating point literal void vFloatLit(const FloatLit& /*f*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit Boolean literal void vBoolLit(const BoolLit& /*b*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit set literal void vSetLit(const SetLit& /*sl*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit string literal void vStringLit(const StringLit& /*sl*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit identifier void vId(const Id& id) { VarDecl* vd = id.decl(); while ((vd->flat() != nullptr) && vd->flat() != vd) { vd = vd->flat(); } if (vd->ti()->domain() != nullptr) { GCLock lock; IntSetVal* isv = eval_intset(env, vd->ti()->domain()); if (isv->size() == 0) { valid = false; bounds.emplace_back(0, 0); } else { bounds.emplace_back(isv->min(0), isv->max(isv->size() - 1)); } } else { if (vd->e() != nullptr) { BottomUpIterator cbi(*this); cbi.run(vd->e()); } else { bounds.emplace_back(-IntVal::infinity(), IntVal::infinity()); } } } /// Visit anonymous variable void vAnonVar(const AnonVar& /*v*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit array literal void vArrayLit(const ArrayLit& /*al*/) {} /// Visit array access void vArrayAccess(ArrayAccess& aa) { bool parAccess = true; for (unsigned int i = aa.idx().size(); (i--) != 0U;) { bounds.pop_back(); if (!aa.idx()[i]->type().isPar()) { parAccess = false; } } if (Id* id = aa.v()->dynamicCast()) { while ((id->decl()->e() != nullptr) && id->decl()->e()->isa()) { id = id->decl()->e()->cast(); } if (parAccess && (id->decl()->e() != nullptr)) { bool success; Expression* e = eval_arrayaccess(env, &aa, success); if (success) { BottomUpIterator cbi(*this); cbi.run(e); return; } } if (id->decl()->ti()->domain() != nullptr) { GCLock lock; IntSetVal* isv = eval_intset(env, id->decl()->ti()->domain()); if (isv->size() > 0) { bounds.emplace_back(isv->min(0), isv->max(isv->size() - 1)); return; } } } valid = false; bounds.emplace_back(0, 0); } /// Visit array comprehension void vComprehension(const Comprehension& c) { valid = false; bounds.emplace_back(0, 0); } /// Visit if-then-else void vITE(const ITE& /*ite*/) { valid = false; bounds.emplace_back(0, 0); } /// Visit binary operator void vBinOp(const BinOp& bo) { Bounds b1 = bounds.back(); bounds.pop_back(); Bounds b0 = bounds.back(); bounds.pop_back(); if (!b1.first.isFinite() || !b1.second.isFinite() || !b0.first.isFinite() || !b0.second.isFinite()) { valid = false; bounds.emplace_back(0, 0); } else { switch (bo.op()) { case BOT_PLUS: bounds.emplace_back(b0.first + b1.first, b0.second + b1.second); break; case BOT_MINUS: bounds.emplace_back(b0.first - b1.second, b0.second - b1.first); break; case BOT_MULT: { IntVal x0 = b0.first * b1.first; IntVal x1 = b0.first * b1.second; IntVal x2 = b0.second * b1.first; IntVal x3 = b0.second * b1.second; IntVal m = std::min(x0, std::min(x1, std::min(x2, x3))); IntVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_IDIV: { IntVal b0f = b0.first == 0 ? 1 : b0.first; IntVal b0s = b0.second == 0 ? -1 : b0.second; IntVal b1f = b1.first == 0 ? 1 : b1.first; IntVal b1s = b1.second == 0 ? -1 : b1.second; IntVal x0 = b0f / b1f; IntVal x1 = b0f / b1s; IntVal x2 = b0s / b1f; IntVal x3 = b0s / b1s; IntVal m = std::min(x0, std::min(x1, std::min(x2, x3))); IntVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_MOD: { IntVal b0f = b0.first == 0 ? 1 : b0.first; IntVal b0s = b0.second == 0 ? -1 : b0.second; IntVal b1f = b1.first == 0 ? 1 : b1.first; IntVal b1s = b1.second == 0 ? -1 : b1.second; IntVal x0 = b0f % b1f; IntVal x1 = b0f % b1s; IntVal x2 = b0s % b1f; IntVal x3 = b0s % b1s; IntVal m = std::min(x0, std::min(x1, std::min(x2, x3))); IntVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_POW: { IntVal exp_min = std::min(0, b1.first); IntVal exp_max = std::min(0, b1.second); IntVal x0 = b0.first.pow(exp_min); IntVal x1 = b0.first.pow(exp_max); IntVal x2 = b0.second.pow(exp_min); IntVal x3 = b0.second.pow(exp_max); IntVal m = std::min(x0, std::min(x1, std::min(x2, x3))); IntVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_DIV: case BOT_LE: case BOT_LQ: case BOT_GR: case BOT_GQ: case BOT_EQ: case BOT_NQ: case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: case BOT_UNION: case BOT_DIFF: case BOT_SYMDIFF: case BOT_INTERSECT: case BOT_PLUSPLUS: case BOT_EQUIV: case BOT_IMPL: case BOT_RIMPL: case BOT_OR: case BOT_AND: case BOT_XOR: case BOT_DOTDOT: valid = false; bounds.emplace_back(0, 0); } } } /// Visit unary operator void vUnOp(const UnOp& uo) { switch (uo.op()) { case UOT_PLUS: break; case UOT_MINUS: bounds.back().first = -bounds.back().first; bounds.back().second = -bounds.back().second; std::swap(bounds.back().first, bounds.back().second); break; case UOT_NOT: valid = false; } } /// Visit call void vCall(Call& c) { if (c.id() == constants().ids.lin_exp || c.id() == constants().ids.sum) { bool le = c.id() == constants().ids.lin_exp; ArrayLit* coeff = le ? eval_array_lit(env, c.arg(0)) : nullptr; if (c.arg(le ? 1 : 0)->type().isOpt()) { valid = false; bounds.emplace_back(0, 0); return; } ArrayLit* al = eval_array_lit(env, c.arg(le ? 1 : 0)); if (le) { bounds.pop_back(); // remove constant (third arg) from stack } IntVal d = le ? c.arg(2)->cast()->v() : 0; int stacktop = static_cast(bounds.size()); for (unsigned int i = al->size(); (i--) != 0U;) { BottomUpIterator cbi(*this); cbi.run((*al)[i]); if (!valid) { for (unsigned int j = al->size() - 1; j > i; j--) { bounds.pop_back(); } return; } } assert(stacktop + al->size() == bounds.size()); IntVal lb = d; IntVal ub = d; for (unsigned int i = 0; i < al->size(); i++) { Bounds b = bounds.back(); bounds.pop_back(); IntVal cv = le ? eval_int(env, (*coeff)[i]) : 1; if (cv > 0) { if (b.first.isFinite()) { if (lb.isFinite()) { lb += cv * b.first; } } else { lb = b.first; } if (b.second.isFinite()) { if (ub.isFinite()) { ub += cv * b.second; } } else { ub = b.second; } } else { if (b.second.isFinite()) { if (lb.isFinite()) { lb += cv * b.second; } } else { lb = -b.second; } if (b.first.isFinite()) { if (ub.isFinite()) { ub += cv * b.first; } } else { ub = -b.first; } } } bounds.emplace_back(lb, ub); } else if (c.id() == "card") { if (IntSetVal* isv = compute_intset_bounds(env, c.arg(0))) { IntSetRanges isr(isv); bounds.emplace_back(0, Ranges::cardinality(isr)); } else { valid = false; bounds.emplace_back(0, 0); } } else if (c.id() == "int_times") { Bounds b1 = bounds.back(); bounds.pop_back(); Bounds b0 = bounds.back(); bounds.pop_back(); if (!b1.first.isFinite() || !b1.second.isFinite() || !b0.first.isFinite() || !b0.second.isFinite()) { valid = false; bounds.emplace_back(0, 0); } else { IntVal x0 = b0.first * b1.first; IntVal x1 = b0.first * b1.second; IntVal x2 = b0.second * b1.first; IntVal x3 = b0.second * b1.second; IntVal m = std::min(x0, std::min(x1, std::min(x2, x3))); IntVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } } else if (c.id() == constants().ids.bool2int) { bounds.emplace_back(0, 1); } else if (c.id() == "abs") { Bounds b0 = bounds.back(); if (b0.first < 0) { bounds.pop_back(); if (b0.second < 0) { bounds.emplace_back(-b0.second, -b0.first); } else { bounds.emplace_back(0, std::max(-b0.first, b0.second)); } } } else if ((c.decl() != nullptr) && (c.decl()->ti()->domain() != nullptr) && !c.decl()->ti()->domain()->isa()) { for (int i = 0; i < c.argCount(); i++) { if (c.arg(i)->type().isint()) { assert(!bounds.empty()); bounds.pop_back(); } } IntSetVal* isv = eval_intset(env, c.decl()->ti()->domain()); bounds.emplace_back(isv->min(), isv->max()); } else { valid = false; bounds.emplace_back(0, 0); } } /// Visit let void vLet(const Let& l) { valid = false; bounds.emplace_back(0, 0); } /// Visit variable declaration void vVarDecl(const VarDecl& vd) { valid = false; bounds.emplace_back(0, 0); } /// Visit annotation void vAnnotation(const Annotation& e) { valid = false; bounds.emplace_back(0, 0); } /// Visit type inst void vTypeInst(const TypeInst& e) { valid = false; bounds.emplace_back(0, 0); } /// Visit TIId void vTIId(const TIId& e) { valid = false; bounds.emplace_back(0, 0); } }; IntBounds compute_int_bounds(EnvI& env, Expression* e) { try { ComputeIntBounds cb(env); BottomUpIterator cbi(cb); cbi.run(e); if (cb.valid) { assert(cb.bounds.size() == 1); return IntBounds(cb.bounds.back().first, cb.bounds.back().second, true); } return IntBounds(0, 0, false); } catch (ResultUndefinedError&) { return IntBounds(0, 0, false); } } class ComputeFloatBounds : public EVisitor { protected: typedef std::pair FBounds; public: std::vector bounds; bool valid; EnvI& env; ComputeFloatBounds(EnvI& env0) : valid(true), env(env0) {} bool enter(Expression* e) { if (e->type().isAnn()) { return false; } if (e->isa()) { return false; } if (e->type().dim() > 0) { return false; } if (e->type().isPar()) { if (e->type().isfloat()) { Expression* exp = eval_par(env, e); if (exp == constants().absent) { valid = false; } else { FloatVal v = exp->cast()->v(); bounds.emplace_back(v, v); } } return false; } if (e->type().isfloat()) { if (ITE* ite = e->dynamicCast()) { FBounds itebounds(FloatVal::infinity(), -FloatVal::infinity()); for (int i = 0; i < ite->size(); i++) { if (ite->ifExpr(i)->type().isPar() && static_cast(ite->ifExpr(i)->type().cv()) == Type::CV_NO) { if (eval_bool(env, ite->ifExpr(i))) { BottomUpIterator cbi(*this); cbi.run(ite->thenExpr(i)); FBounds& back = bounds.back(); back.first = std::min(itebounds.first, back.first); back.second = std::max(itebounds.second, back.second); return false; } } else { BottomUpIterator cbi(*this); cbi.run(ite->thenExpr(i)); FBounds back = bounds.back(); bounds.pop_back(); itebounds.first = std::min(itebounds.first, back.first); itebounds.second = std::max(itebounds.second, back.second); } } BottomUpIterator cbi(*this); cbi.run(ite->elseExpr()); FBounds& back = bounds.back(); back.first = std::min(itebounds.first, back.first); back.second = std::max(itebounds.second, back.second); return false; } return true; } return false; } /// Visit integer literal void vIntLit(const IntLit& i) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit floating point literal void vFloatLit(const FloatLit& f) { bounds.emplace_back(f.v(), f.v()); } /// Visit Boolean literal void vBoolLit(const BoolLit& /*b*/) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit set literal void vSetLit(const SetLit& /*sl*/) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit string literal void vStringLit(const StringLit& /*sl*/) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit identifier void vId(const Id& id) { VarDecl* vd = id.decl(); while ((vd->flat() != nullptr) && vd->flat() != vd) { vd = vd->flat(); } if (vd->ti()->domain() != nullptr) { GCLock lock; FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); if (fsv->size() == 0) { valid = false; bounds.emplace_back(0, 0); } else { bounds.emplace_back(fsv->min(0), fsv->max(fsv->size() - 1)); } } else { if (vd->e() != nullptr) { BottomUpIterator cbi(*this); cbi.run(vd->e()); } else { bounds.emplace_back(-FloatVal::infinity(), FloatVal::infinity()); } } } /// Visit anonymous variable void vAnonVar(const AnonVar& v) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit array literal void vArrayLit(const ArrayLit& al) {} /// Visit array access void vArrayAccess(ArrayAccess& aa) { bool parAccess = true; for (unsigned int i = aa.idx().size(); (i--) != 0U;) { if (!aa.idx()[i]->type().isPar()) { parAccess = false; } } if (Id* id = aa.v()->dynamicCast()) { while ((id->decl()->e() != nullptr) && id->decl()->e()->isa()) { id = id->decl()->e()->cast(); } if (parAccess && (id->decl()->e() != nullptr)) { bool success; Expression* e = eval_arrayaccess(env, &aa, success); if (success) { BottomUpIterator cbi(*this); cbi.run(e); return; } } if (id->decl()->ti()->domain() != nullptr) { FloatSetVal* fsv = eval_floatset(env, id->decl()->ti()->domain()); FBounds b(fsv->min(), fsv->max()); bounds.push_back(b); return; } } valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit array comprehension void vComprehension(const Comprehension& c) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit if-then-else void vITE(const ITE& ite) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit binary operator void vBinOp(const BinOp& bo) { FBounds b1 = bounds.back(); bounds.pop_back(); FBounds b0 = bounds.back(); bounds.pop_back(); if (!b1.first.isFinite() || !b1.second.isFinite() || !b0.first.isFinite() || !b0.second.isFinite()) { valid = false; bounds.emplace_back(0.0, 0.0); } else { switch (bo.op()) { case BOT_PLUS: bounds.emplace_back(b0.first + b1.first, b0.second + b1.second); break; case BOT_MINUS: bounds.emplace_back(b0.first - b1.second, b0.second - b1.first); break; case BOT_MULT: { FloatVal x0 = b0.first * b1.first; FloatVal x1 = b0.first * b1.second; FloatVal x2 = b0.second * b1.first; FloatVal x3 = b0.second * b1.second; FloatVal m = std::min(x0, std::min(x1, std::min(x2, x3))); FloatVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_POW: { FloatVal x0 = std::pow(b0.first.toDouble(), b1.first.toDouble()); FloatVal x1 = std::pow(b0.first.toDouble(), b1.second.toDouble()); FloatVal x2 = std::pow(b0.second.toDouble(), b1.first.toDouble()); FloatVal x3 = std::pow(b0.second.toDouble(), b1.second.toDouble()); FloatVal m = std::min(x0, std::min(x1, std::min(x2, x3))); FloatVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } break; case BOT_DIV: case BOT_IDIV: case BOT_MOD: case BOT_LE: case BOT_LQ: case BOT_GR: case BOT_GQ: case BOT_EQ: case BOT_NQ: case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: case BOT_UNION: case BOT_DIFF: case BOT_SYMDIFF: case BOT_INTERSECT: case BOT_PLUSPLUS: case BOT_EQUIV: case BOT_IMPL: case BOT_RIMPL: case BOT_OR: case BOT_AND: case BOT_XOR: case BOT_DOTDOT: valid = false; bounds.emplace_back(0.0, 0.0); } } } /// Visit unary operator void vUnOp(const UnOp& uo) { switch (uo.op()) { case UOT_PLUS: break; case UOT_MINUS: bounds.back().first = -bounds.back().first; bounds.back().second = -bounds.back().second; break; case UOT_NOT: valid = false; bounds.emplace_back(0.0, 0.0); } } /// Visit call void vCall(Call& c) { if (c.id() == constants().ids.lin_exp || c.id() == constants().ids.sum) { bool le = c.id() == constants().ids.lin_exp; ArrayLit* coeff = le ? eval_array_lit(env, c.arg(0)) : nullptr; if (le) { bounds.pop_back(); // remove constant (third arg) from stack } if (c.arg(le ? 1 : 0)->type().isOpt()) { valid = false; bounds.emplace_back(0.0, 0.0); return; } ArrayLit* al = eval_array_lit(env, c.arg(le ? 1 : 0)); FloatVal d = le ? c.arg(2)->cast()->v() : 0.0; int stacktop = static_cast(bounds.size()); for (unsigned int i = al->size(); (i--) != 0U;) { BottomUpIterator cbi(*this); cbi.run((*al)[i]); if (!valid) { return; } } assert(stacktop + al->size() == bounds.size()); FloatVal lb = d; FloatVal ub = d; for (unsigned int i = 0; i < (*al).size(); i++) { FBounds b = bounds.back(); bounds.pop_back(); FloatVal cv = le ? eval_float(env, (*coeff)[i]) : 1.0; if (cv > 0) { if (b.first.isFinite()) { if (lb.isFinite()) { lb += cv * b.first; } } else { lb = b.first; } if (b.second.isFinite()) { if (ub.isFinite()) { ub += cv * b.second; } } else { ub = b.second; } } else { if (b.second.isFinite()) { if (lb.isFinite()) { lb += cv * b.second; } } else { lb = -b.second; } if (b.first.isFinite()) { if (ub.isFinite()) { ub += cv * b.first; } } else { ub = -b.first; } } } bounds.emplace_back(lb, ub); } else if (c.id() == "float_times") { BottomUpIterator cbi(*this); cbi.run(c.arg(0)); cbi.run(c.arg(1)); FBounds b1 = bounds.back(); bounds.pop_back(); FBounds b0 = bounds.back(); bounds.pop_back(); if (!b1.first.isFinite() || !b1.second.isFinite() || !b0.first.isFinite() || !b0.second.isFinite()) { valid = false; bounds.emplace_back(0, 0); } else { FloatVal x0 = b0.first * b1.first; FloatVal x1 = b0.first * b1.second; FloatVal x2 = b0.second * b1.first; FloatVal x3 = b0.second * b1.second; FloatVal m = std::min(x0, std::min(x1, std::min(x2, x3))); FloatVal n = std::max(x0, std::max(x1, std::max(x2, x3))); bounds.emplace_back(m, n); } } else if (c.id() == "int2float") { ComputeIntBounds ib(env); BottomUpIterator cbi(ib); cbi.run(c.arg(0)); if (!ib.valid) { valid = false; } ComputeIntBounds::Bounds result = ib.bounds.back(); if (!result.first.isFinite() || !result.second.isFinite()) { valid = false; bounds.emplace_back(0.0, 0.0); } else { bounds.emplace_back(static_cast(result.first.toInt()), static_cast(result.second.toInt())); } } else if (c.id() == "abs") { BottomUpIterator cbi(*this); cbi.run(c.arg(0)); FBounds b0 = bounds.back(); if (b0.first < 0) { bounds.pop_back(); if (b0.second < 0) { bounds.emplace_back(-b0.second, -b0.first); } else { bounds.emplace_back(0.0, std::max(-b0.first, b0.second)); } } } else if ((c.decl() != nullptr) && (c.decl()->ti()->domain() != nullptr) && !c.decl()->ti()->domain()->isa()) { for (int i = 0; i < c.argCount(); i++) { if (c.arg(i)->type().isfloat()) { assert(!bounds.empty()); bounds.pop_back(); } } FloatSetVal* fsv = eval_floatset(env, c.decl()->ti()->domain()); bounds.emplace_back(fsv->min(), fsv->max()); } else { valid = false; bounds.emplace_back(0.0, 0.0); } } /// Visit let void vLet(const Let& l) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit variable declaration void vVarDecl(const VarDecl& vd) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit annotation void vAnnotation(const Annotation& e) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit type inst void vTypeInst(const TypeInst& e) { valid = false; bounds.emplace_back(0.0, 0.0); } /// Visit TIId void vTIId(const TIId& e) { valid = false; bounds.emplace_back(0.0, 0.0); } }; FloatBounds compute_float_bounds(EnvI& env, Expression* e) { try { ComputeFloatBounds cb(env); BottomUpIterator cbi(cb); cbi.run(e); if (cb.valid) { assert(!cb.bounds.empty()); return FloatBounds(cb.bounds.back().first, cb.bounds.back().second, true); } return FloatBounds(0.0, 0.0, false); } catch (ResultUndefinedError&) { return FloatBounds(0.0, 0.0, false); } } class ComputeIntSetBounds : public EVisitor { public: std::vector bounds; bool valid; EnvI& env; ComputeIntSetBounds(EnvI& env0) : valid(true), env(env0) {} bool enter(Expression* e) { if (e->type().isAnn()) { return false; } if (e->isa()) { return false; } if (e->type().dim() > 0) { return false; } if (!e->type().isIntSet()) { return false; } if (e->type().isPar()) { bounds.push_back(eval_intset(env, e)); return false; } return true; } /// Visit set literal void vSetLit(const SetLit& sl) { assert(sl.type().isvar()); assert(sl.isv() == nullptr); IntSetVal* isv = IntSetVal::a(); for (unsigned int i = 0; i < sl.v().size(); i++) { IntSetRanges i0(isv); IntBounds ib = compute_int_bounds(env, sl.v()[i]); if (!ib.valid || !ib.l.isFinite() || !ib.u.isFinite()) { valid = false; bounds.push_back(nullptr); return; } Ranges::Const cr(ib.l, ib.u); Ranges::Union> u(i0, cr); isv = IntSetVal::ai(u); } bounds.push_back(isv); } /// Visit identifier void vId(const Id& id) { if ((id.decl()->ti()->domain() != nullptr) && !id.decl()->ti()->domain()->isa()) { bounds.push_back(eval_intset(env, id.decl()->ti()->domain())); } else { if (id.decl()->e() != nullptr) { BottomUpIterator cbi(*this); cbi.run(id.decl()->e()); } else { valid = false; bounds.push_back(nullptr); } } } /// Visit anonymous variable void vAnonVar(const AnonVar& v) { valid = false; bounds.push_back(nullptr); } /// Visit array access void vArrayAccess(ArrayAccess& aa) { bool parAccess = true; for (unsigned int i = aa.idx().size(); (i--) != 0U;) { if (!aa.idx()[i]->type().isPar()) { parAccess = false; break; } } if (Id* id = aa.v()->dynamicCast()) { while ((id->decl()->e() != nullptr) && id->decl()->e()->isa()) { id = id->decl()->e()->cast(); } if (parAccess && (id->decl()->e() != nullptr)) { bool success; Expression* e = eval_arrayaccess(env, &aa, success); if (success) { BottomUpIterator cbi(*this); cbi.run(e); return; } } if (id->decl()->ti()->domain() != nullptr) { bounds.push_back(eval_intset(env, id->decl()->ti()->domain())); return; } } valid = false; bounds.push_back(nullptr); } /// Visit array comprehension void vComprehension(const Comprehension& c) { valid = false; bounds.push_back(nullptr); } /// Visit if-then-else void vITE(const ITE& ite) { valid = false; bounds.push_back(nullptr); } /// Visit binary operator void vBinOp(const BinOp& bo) { if (bo.op() == BOT_DOTDOT) { IntBounds lb = compute_int_bounds(env, bo.lhs()); IntBounds ub = compute_int_bounds(env, bo.rhs()); valid = valid && lb.valid && ub.valid; bounds.push_back(IntSetVal::a(lb.l, ub.u)); } else { IntSetVal* b1 = bounds.back(); bounds.pop_back(); IntSetVal* b0 = bounds.back(); bounds.pop_back(); switch (bo.op()) { case BOT_INTERSECT: case BOT_UNION: { IntSetRanges b0r(b0); IntSetRanges b1r(b1); Ranges::Union u(b0r, b1r); bounds.push_back(IntSetVal::ai(u)); } break; case BOT_DIFF: { bounds.push_back(b0); } break; case BOT_SYMDIFF: valid = false; bounds.push_back(nullptr); break; case BOT_PLUS: case BOT_MINUS: case BOT_MULT: case BOT_POW: case BOT_DIV: case BOT_IDIV: case BOT_MOD: case BOT_LE: case BOT_LQ: case BOT_GR: case BOT_GQ: case BOT_EQ: case BOT_NQ: case BOT_IN: case BOT_SUBSET: case BOT_SUPERSET: case BOT_PLUSPLUS: case BOT_EQUIV: case BOT_IMPL: case BOT_RIMPL: case BOT_OR: case BOT_AND: case BOT_XOR: case BOT_DOTDOT: valid = false; bounds.push_back(nullptr); } } } /// Visit unary operator void vUnOp(const UnOp& uo) { valid = false; bounds.push_back(nullptr); } /// Visit call void vCall(Call& c) { if (valid && (c.id() == "set_intersect" || c.id() == "set_union")) { IntSetVal* b0 = bounds.back(); bounds.pop_back(); IntSetVal* b1 = bounds.back(); bounds.pop_back(); IntSetRanges b0r(b0); IntSetRanges b1r(b1); Ranges::Union u(b0r, b1r); bounds.push_back(IntSetVal::ai(u)); } else if (valid && c.id() == "set_diff") { IntSetVal* b0 = bounds.back(); bounds.pop_back(); bounds.pop_back(); // don't need bounds of right hand side bounds.push_back(b0); } else if ((c.decl() != nullptr) && (c.decl()->ti()->domain() != nullptr) && !c.decl()->ti()->domain()->isa()) { for (int i = 0; i < c.argCount(); i++) { if (c.arg(i)->type().isIntSet()) { assert(!bounds.empty()); bounds.pop_back(); } } IntSetVal* fsv = eval_intset(env, c.decl()->ti()->domain()); bounds.push_back(fsv); } else { valid = false; bounds.push_back(nullptr); } } /// Visit let void vLet(const Let& l) { valid = false; bounds.push_back(nullptr); } /// Visit variable declaration void vVarDecl(const VarDecl& vd) { valid = false; bounds.push_back(nullptr); } /// Visit annotation void vAnnotation(const Annotation& e) { valid = false; bounds.push_back(nullptr); } /// Visit type inst void vTypeInst(const TypeInst& e) { valid = false; bounds.push_back(nullptr); } /// Visit TIId void vTIId(const TIId& e) { valid = false; bounds.push_back(nullptr); } }; IntSetVal* compute_intset_bounds(EnvI& env, Expression* e) { try { ComputeIntSetBounds cb(env); BottomUpIterator cbi(cb); cbi.run(e); if (cb.valid) { return cb.bounds.back(); } return nullptr; } catch (ResultUndefinedError&) { return nullptr; } } Expression* follow_id(Expression* e) { for (;;) { if (e == nullptr) { return nullptr; } if (e->eid() == Expression::E_ID && e != constants().absent) { e = e->cast()->decl()->e(); } else { return e; } } } Expression* follow_id_to_decl(Expression* e) { for (;;) { if (e == nullptr) { return nullptr; } if (e == constants().absent) { return e; } switch (e->eid()) { case Expression::E_ID: e = e->cast()->decl(); break; case Expression::E_VARDECL: { Expression* vd_e = e->cast()->e(); if ((vd_e != nullptr) && vd_e->isa() && vd_e != constants().absent) { e = vd_e; } else { return e; } break; } default: return e; } } } Expression* follow_id_to_value(Expression* e) { Expression* decl = follow_id_to_decl(e); if (auto* vd = decl->dynamicCast()) { if ((vd->e() != nullptr) && vd->e()->type().isPar()) { return vd->e(); } return vd->id(); } return decl; } } // namespace MiniZinc libminizinc-2.5.3/lib/parser.yxx0000644000175000017500000016217413757304533015327 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ %define api.pure %parse-param {void *parm} %define api.header.include {} %lex-param {void* SCANNER} %{ #define SCANNER static_cast(parm)->yyscanner #include #include #include #include namespace MiniZinc{ class ParserLocation; } #define YYLTYPE MiniZinc::ParserLocation #define YYLTYPE_IS_DECLARED 1 #define YYLTYPE_IS_TRIVIAL 0 #define YYMAXDEPTH 10000 #define YYINITDEPTH 10000 #include #include using namespace std; using namespace MiniZinc; #define YYLLOC_DEFAULT(Current, Rhs, N) \ do { \ if (N > 0) { \ (Current).filename(YYRHSLOC(Rhs, 1).filename()); \ (Current).firstLine(YYRHSLOC(Rhs, 1).firstLine()); \ (Current).firstColumn(YYRHSLOC(Rhs, 1).firstColumn()); \ (Current).lastLine(YYRHSLOC(Rhs, N).lastLine()); \ (Current).lastColumn(YYRHSLOC(Rhs, N).lastColumn()); \ } else { \ (Current).filename(YYRHSLOC(Rhs, 0).filename()); \ (Current).firstLine(YYRHSLOC(Rhs, 0).lastLine()); \ (Current).firstColumn(YYRHSLOC(Rhs, 0).lastColumn()); \ (Current).lastLine(YYRHSLOC(Rhs, 0).lastLine()); \ (Current).lastColumn(YYRHSLOC(Rhs, 0).lastColumn()); \ } \ } while (false) int mzn_yyparse(void*); int mzn_yylex(YYSTYPE*, YYLTYPE*, void* scanner); int mzn_yylex_init (void** scanner); int mzn_yylex_destroy (void* scanner); int mzn_yyget_lineno (void* scanner); void mzn_yyset_extra (void* user_defined ,void* yyscanner ); extern int yydebug; namespace MiniZinc { void yyerror(YYLTYPE* location, void* parm, const string& str) { ParserState* pp = static_cast(parm); Model* m = pp->model; while (m->parent() != nullptr) { m = m->parent(); pp->err << "(included from file '" << m->filename() << "')" << endl; } pp->err << location->toString() << ":" << endl; pp->printCurrentLine(location->firstColumn(),location->lastColumn()); pp->err << "Error: " << str << std::endl; pp->hadError = true; pp->syntaxErrors.push_back(SyntaxError(Location(*location), str)); } bool notInDatafile(YYLTYPE* location, void* parm, const string& item) { ParserState* pp = static_cast(parm); if (pp->isDatafile) { yyerror(location,parm,item+" item not allowed in data file"); return false; } return true; } Expression* createDocComment(const ParserLocation& loc, const std::string& s) { std::vector args(1); args[0] = new StringLit(loc, s); Call* c = new Call(Location(loc), constants().ann.doc_comment, args); c->type(Type::ann()); return c; } Expression* createArrayAccess(const ParserLocation& loc, Expression* e, std::vector >& idx) { Expression* ret = e; for (unsigned int i=0; i* vardeclexprs; MiniZinc::TypeInst* tiexpr; std::vector* tiexprs; MiniZinc::Expression* expression; std::vector* expressions1d; std::vector >* expressions2d; std::vector > >* expressions3d; MiniZinc::Generator* generator; std::vector* generators; std::vector* strings; std::vector >* expressionPairs; MiniZinc::Generators* generatorsPointer; } %locations %define parse.error verbose %initial-action { GCLock lock; @$.filename(ASTString(static_cast(parm)->filename)); } %token MZN_INTEGER_LITERAL "integer literal" MZN_BOOL_LITERAL "bool literal" %token MZN_FLOAT_LITERAL "float literal" %token MZN_IDENTIFIER "identifier" MZN_QUOTED_IDENTIFIER "quoted identifier" MZN_STRING_LITERAL "string literal" %token MZN_STRING_QUOTE_START "interpolated string start" MZN_STRING_QUOTE_MID "interpolated string middle" MZN_STRING_QUOTE_END "interpolated string end" %token MZN_TI_IDENTIFIER "type-inst identifier" MZN_TI_ENUM_IDENTIFIER "type-inst enum identifier" MZN_DOC_COMMENT "documentation comment" MZN_DOC_FILE_COMMENT "file-level documentation comment" %token MZN_VAR "var" MZN_PAR "par" %token MZN_ABSENT "<>" %token MZN_ANN "ann" %token MZN_ANNOTATION "annotation" %token MZN_ANY "any" %token MZN_ARRAY "array" %token MZN_BOOL "bool" %token MZN_CASE "case" %token MZN_CONSTRAINT "constraint" %token MZN_DEFAULT "default" %token MZN_ELSE "else" %token MZN_ELSEIF "elseif" %token MZN_ENDIF "endif" %token MZN_ENUM "enum" %token MZN_FLOAT "float" %token MZN_FUNCTION "function" %token MZN_IF "if" %token MZN_INCLUDE "include" %token MZN_INFINITY "infinity" %token MZN_INT "int" %token MZN_LET "let" %token MZN_LIST "list" %token MZN_MAXIMIZE "maximize" %token MZN_MINIMIZE "minimize" %token MZN_OF "of" %token MZN_OPT "opt" %token MZN_SATISFY "satisfy" %token MZN_OUTPUT "output" %token MZN_PREDICATE "predicate" %token MZN_RECORD "record" %token MZN_SET "set" %token MZN_SOLVE "solve" %token MZN_STRING "string" %token MZN_TEST "test" %token MZN_THEN "then" %token MZN_TUPLE "tuple" %token MZN_TYPE "type" %token MZN_UNDERSCORE "_" %token MZN_VARIANT_RECORD "variant_record" %token MZN_WHERE "where" %token MZN_LEFT_BRACKET "[" %token MZN_LEFT_2D_BRACKET "[|" %token MZN_RIGHT_BRACKET "]" %token MZN_RIGHT_2D_BRACKET "|]" // Used to signal an error when parsing a MiniZinc file // that contains identifiers starting with _ %token FLATZINC_IDENTIFIER %token MZN_INVALID_INTEGER_LITERAL "invalid integer literal" %token MZN_INVALID_FLOAT_LITERAL "invalid float literal" %token MZN_UNTERMINATED_STRING "unterminated string" %token MZN_END_OF_LINE_IN_STRING "end of line inside string literal" %token MZN_INVALID_NULL "null character" %token END 0 "end of file" %token MZN_EQUIV "<->" %token MZN_IMPL "->" MZN_RIMPL "<-" %token MZN_OR "\\/" MZN_XOR "xor" %token MZN_AND "/\\" %token MZN_LE "<" MZN_GR ">" MZN_LQ "<=" MZN_GQ ">=" MZN_EQ "=" MZN_NQ "!=" MZN_WEAK_EQ "~=" %token MZN_IN "in" MZN_SUBSET "subset" MZN_SUPERSET "superset" %token MZN_UNION "union" MZN_DIFF "diff" MZN_SYMDIFF "symdiff" %token MZN_DOTDOT ".." %token MZN_PLUS "+" MZN_MINUS "-" MZN_WEAK_PLUS "~+" MZN_WEAK_MINUS "~-" %token MZN_MULT "*" MZN_DIV "/" MZN_IDIV "div" MZN_MOD "mod" MZN_INTERSECT "intersect" MZN_WEAK_MULT "~*" %token MZN_POW "^" %token MZN_POW_MINUS1 "^-1" %token MZN_NOT "not" %token MZN_PLUSPLUS "++" %token MZN_COLONCOLON "::" %right PREC_ANNO %left MZN_EQUIV %left MZN_IMPL MZN_RIMPL %left MZN_OR MZN_XOR %left MZN_AND %nonassoc MZN_LE MZN_GR MZN_LQ MZN_GQ MZN_EQ MZN_NQ MZN_WEAK_EQ %nonassoc MZN_IN MZN_SUBSET MZN_SUPERSET %left MZN_UNION MZN_DIFF MZN_SYMDIFF MZN_INTERSECT %nonassoc MZN_DOTDOT %left MZN_PLUS MZN_MINUS MZN_WEAK_PLUS MZN_WEAK_MINUS %left MZN_MULT MZN_DIV MZN_IDIV MZN_MOD MZN_WEAK_MULT %left MZN_POW MZN_POW_MINUS1 %nonassoc MZN_NOT %left MZN_PLUSPLUS %left MZN_QUOTED_IDENTIFIER %left MZN_COLONCOLON %token MZN_EQUIV_QUOTED "'<->'" %token MZN_IMPL_QUOTED "'->'" MZN_RIMPL_QUOTED "'<-'" %token MZN_OR_QUOTED "'\\/'" MZN_XOR_QUOTED "'xor'" %token MZN_AND_QUOTED "'/\\'" %token MZN_LE_QUOTED "'<'" MZN_GR_QUOTED "'>'" MZN_LQ_QUOTED "'<='" MZN_GQ_QUOTED "'>='" MZN_EQ_QUOTED "'='" MZN_NQ_QUOTED "'!='" %token MZN_IN_QUOTED "'in'" MZN_SUBSET_QUOTED "'subset'" MZN_SUPERSET_QUOTED "'superset'" %token MZN_UNION_QUOTED "'union'" MZN_DIFF_QUOTED "'diff'" MZN_SYMDIFF_QUOTED "'symdiff'" %token MZN_DOTDOT_QUOTED "'..'" %token MZN_PLUS_QUOTED "'+'" MZN_MINUS_QUOTED "'-'" %token MZN_MULT_QUOTED "'*'" MZN_DIV_QUOTED "'/'" MZN_IDIV_QUOTED "'div'" MZN_MOD_QUOTED "'mod'" MZN_INTERSECT_QUOTED "'intersect'" %token MZN_POW_QUOTED "'^'" %token MZN_NOT_QUOTED "'not'" %token MZN_COLONCOLON_QUOTED "'::'" %token MZN_PLUSPLUS_QUOTED "'++'" %type item item_tail include_item vardecl_item assign_item constraint_item solve_item output_item predicate_item annotation_item function_item %type ti_expr_and_id ti_expr_and_id_or_anon let_vardecl_item %type params params_list params_list_head %type ti_expr base_ti_expr base_ti_expr_tail %type ti_expr_list ti_expr_list_head %type expr expr_atom_head expr_atom_head_nonstring array_access_expr %type set_expr string_expr string_quote_rest annotation_expr enum_construct %type simple_array_literal simple_array_literal_2d simple_array_comp if_then_else_expr call_expr quoted_op_call let_expr operation_item_tail set_literal set_comp %type expr_list expr_list_head array_access_expr_list array_access_expr_list_head elseif_list let_vardecl_item_list enum_init enum_id_list string_lit_list %type simple_array_literal_2d_list array_access_tail %type simple_array_literal_3d_list %type comp_tail %type generator generator_eq %type generator_list generator_list_head %type id_list id_list_head %type comp_or_expr comp_or_expr_head %type annotations ne_annotations %type quoted_op %type id_or_quoted_op %type opt_opt %% /********************************/ /* main goal and item lists */ /********************************/ model : item_list item_list : /* empty */ | item_list_head semi_or_none item_list_head: item { ParserState* pp = static_cast(parm); if ($1) { pp->model->addItem($1); GC::unlock(); GC::lock(); } } | doc_file_comments item { ParserState* pp = static_cast(parm); if ($2) { pp->model->addItem($2); GC::unlock(); GC::lock(); } } | item_list_head ';' item { ParserState* pp = static_cast(parm); if ($3) { pp->model->addItem($3); GC::unlock(); GC::lock(); } } | item_list_head ';' doc_file_comments item { ParserState* pp = static_cast(parm); if ($4) { pp->model->addItem($4); GC::unlock(); GC::lock(); } } | item error_item_start { yyerror(&@2, parm, "unexpected item, expecting ';' or end of file"); YYERROR; } | error ';' item doc_file_comments: MZN_DOC_FILE_COMMENT { ParserState* pp = static_cast(parm); if (pp->parseDocComments && $1) { pp->model->addDocComment($1); } free($1); } | doc_file_comments MZN_DOC_FILE_COMMENT { ParserState* pp = static_cast(parm); if (pp->parseDocComments && $2) { pp->model->addDocComment($2); } free($2); } semi_or_none : | ';' item : MZN_DOC_COMMENT item_tail { $$ = $2; ParserState* pp = static_cast(parm); if (FunctionI* fi = Item::dynamicCast($$)) { if (pp->parseDocComments) { fi->ann().add(createDocComment(@1,$1)); } } else if (VarDeclI* vdi = Item::dynamicCast($$)) { if (pp->parseDocComments) { vdi->e()->addAnnotation(createDocComment(@1,$1)); } } else { yyerror(&@2, parm, "documentation comments are only supported for function, predicate and variable declarations"); } free($1); } | item_tail { $$ = $1; } item_tail : include_item { $$=notInDatafile(&@$,parm,"include") ? $1 : nullptr; } | vardecl_item { $$=notInDatafile(&@$,parm,"variable declaration") ? $1 : nullptr; } | assign_item | constraint_item { $$=notInDatafile(&@$,parm,"constraint") ? $1 : nullptr; } | solve_item { $$=notInDatafile(&@$,parm,"solve") ? $1 : nullptr; } | output_item { $$=notInDatafile(&@$,parm,"output") ? $1 : nullptr; } | predicate_item { $$=notInDatafile(&@$,parm,"predicate") ? $1 : nullptr; } | function_item { $$=notInDatafile(&@$,parm,"predicate") ? $1 : nullptr; } | annotation_item { $$=notInDatafile(&@$,parm,"annotation") ? $1 : nullptr; } error_item_start : MZN_INCLUDE | MZN_ENUM | MZN_OUTPUT | MZN_CONSTRAINT | MZN_SOLVE | MZN_PREDICATE | MZN_FUNCTION | MZN_TEST | MZN_ANNOTATION include_item : MZN_INCLUDE MZN_STRING_LITERAL { ParserState* pp = static_cast(parm); map::iterator ret = pp->seenModels.find($2); IncludeI* ii = new IncludeI(@$,ASTString($2)); $$ = ii; if (ret == pp->seenModels.end()) { Model* im = new Model; im->setParent(pp->model); im->setFilename($2); string fpath = FileUtils::dir_name(pp->filename); string fbase = FileUtils::base_name(pp->filename); if (fpath=="") fpath="./"; pp->files.emplace_back(im, ii, fpath, $2, pp->isSTDLib); ii->m(im); pp->seenModels.insert(pair($2,im)); } else { ii->m(ret->second, false); } free($2); } vardecl_item : ti_expr_and_id annotations { if ($1 && $2) $1->addAnnotations(*$2); if ($1) $$ = new VarDeclI(@$,$1); delete $2; } | ti_expr_and_id annotations MZN_EQ expr { if ($1) $1->e($4); if ($1 && $2) $1->addAnnotations(*$2); if ($1) $$ = new VarDeclI(@$,$1); delete $2; } | MZN_ENUM MZN_IDENTIFIER annotations { TypeInst* ti = new TypeInst(@$,Type::parsetint()); ti->setIsEnum(true); VarDecl* vd = new VarDecl(@$,ti,$2); if ($2 && $3) vd->addAnnotations(*$3); free($2); $$ = new VarDeclI(@$,vd); } | MZN_ENUM MZN_IDENTIFIER annotations MZN_EQ enum_init { if ($5) { TypeInst* ti = new TypeInst(@$,Type::parsetint()); ti->setIsEnum(true); Expression* e; if ($5->size()==1) { e = (*$5)[0]; } else { ArrayLit* al = new ArrayLit(@$,*$5); e = new Call(@$, ASTString("enumFromConstructors"), {al}); } VarDecl* vd = new VarDecl(@$,ti,$2,e); $$ = new VarDeclI(@$,vd); } free($2); delete $5; } | MZN_ENUM MZN_IDENTIFIER annotations MZN_EQ MZN_LEFT_BRACKET string_lit_list MZN_RIGHT_BRACKET { TypeInst* ti = new TypeInst(@$,Type::parsetint()); ti->setIsEnum(true); vector args; args.push_back(new ArrayLit(@$,*$6)); Call* sl = new Call(@$, constants().ids.anonEnumFromStrings, args); VarDecl* vd = new VarDecl(@$,ti,$2,sl); if ($2 && $3) vd->addAnnotations(*$3); free($2); delete $6; $$ = new VarDeclI(@$,vd); } enum_init : enum_construct { $$ = new std::vector({$1}); } | enum_init MZN_PLUSPLUS enum_construct { $$ = $1; if ($$) { $$->push_back($3); } } enum_construct : '{' enum_id_list '}' { $$ = new SetLit(@$, *$2); delete $2; } | MZN_IDENTIFIER '(' expr ')' { vector args({$3}); $$ = new Call(@$, ASTString($1), args); free($1); } string_lit_list : // empty { $$ = new std::vector(); } | MZN_STRING_LITERAL { $$ = new std::vector(); $$->push_back(new StringLit(@$, $1)); free($1); } | string_lit_list ',' MZN_STRING_LITERAL { $$ = $1; if ($$) $$->push_back(new StringLit(@$, $3)); free($3); } enum_id_list : // empty { $$ = new std::vector(); } | MZN_IDENTIFIER { $$ = new std::vector(); $$->push_back(new Id(@$,$1,nullptr)); free($1); } | enum_id_list ',' MZN_IDENTIFIER { $$ = $1; if ($$) $$->push_back(new Id(@$,$3,nullptr)); free($3); } assign_item : MZN_IDENTIFIER MZN_EQ expr { $$ = new AssignI(@$,$1,$3); free($1); } constraint_item : MZN_CONSTRAINT expr { $$ = new ConstraintI(@$,$2);} | MZN_CONSTRAINT MZN_COLONCOLON string_expr expr { $$ = new ConstraintI(@$,$4); if ($4 && $3) $$->cast()->e()->ann().add(new Call(@2, ASTString("mzn_constraint_name"), {$3})); } solve_item : MZN_SOLVE annotations MZN_SATISFY { $$ = SolveI::sat(@$); if ($$ && $2) $$->cast()->ann().add(*$2); delete $2; } | MZN_SOLVE annotations MZN_MINIMIZE expr { $$ = SolveI::min(@$,$4); if ($$ && $2) $$->cast()->ann().add(*$2); delete $2; } | MZN_SOLVE annotations MZN_MAXIMIZE expr { $$ = SolveI::max(@$,$4); if ($$ && $2) $$->cast()->ann().add(*$2); delete $2; } output_item : MZN_OUTPUT expr { $$ = new OutputI(@$,$2);} predicate_item : MZN_PREDICATE MZN_IDENTIFIER params annotations operation_item_tail { ParserState* pp = static_cast(parm); if ($3) $$ = new FunctionI(@$,$2,new TypeInst(@$, Type::varbool()),*$3,$5,pp->isSTDLib); if ($$ && $4) $$->cast()->ann().add(*$4); free($2); delete $3; delete $4; } | MZN_TEST MZN_IDENTIFIER params annotations operation_item_tail { ParserState* pp = static_cast(parm); if ($3) $$ = new FunctionI(@$,$2,new TypeInst(@$, Type::parbool()),*$3,$5,pp->isSTDLib); if ($$ && $4) $$->cast()->ann().add(*$4); free($2); delete $3; delete $4; } | MZN_PREDICATE MZN_IDENTIFIER MZN_POW_MINUS1 params annotations operation_item_tail { if ($4) $$ = new FunctionI(@$,std::string($2)+"⁻¹",new TypeInst(@$, Type::varbool()),*$4,$6); if ($$ && $5) $$->cast()->ann().add(*$5); free($2); delete $4; delete $5; } | MZN_TEST MZN_IDENTIFIER MZN_POW_MINUS1 params annotations operation_item_tail { if ($4) $$ = new FunctionI(@$,std::string($2)+"⁻¹",new TypeInst(@$, Type::parbool()),*$4,$6); if ($$ && $5) $$->cast()->ann().add(*$5); free($2); delete $4; delete $5; } function_item : MZN_FUNCTION ti_expr ':' id_or_quoted_op params annotations operation_item_tail { ParserState* pp = static_cast(parm); if ($5) $$ = new FunctionI(@$,$4,$2,*$5,$7,pp->isSTDLib); if ($$ && $6) $$->cast()->ann().add(*$6); free($4); delete $5; delete $6; } | ti_expr ':' MZN_IDENTIFIER '(' params_list ')' annotations operation_item_tail { ParserState* pp = static_cast(parm); if ($5) $$ = new FunctionI(@$,$3,$1,*$5,$8,pp->isSTDLib); if ($$ && $7) $$->cast()->ann().add(*$7); free($3); delete $5; delete $7; } annotation_item : MZN_ANNOTATION MZN_IDENTIFIER params { ParserState* pp = static_cast(parm); TypeInst* ti=new TypeInst(@1,Type::ann()); if ($3==nullptr || $3->empty()) { VarDecl* vd = new VarDecl(@$,ti,$2); $$ = new VarDeclI(@$,vd); } else { $$ = new FunctionI(@$,$2,ti,*$3,nullptr,pp->isSTDLib); } free($2); delete $3; } | MZN_ANNOTATION MZN_IDENTIFIER params MZN_EQ expr { ParserState* pp = static_cast(parm); TypeInst* ti=new TypeInst(@1,Type::ann()); if ($3) $$ = new FunctionI(@$,$2,ti,*$3,$5,pp->isSTDLib); delete $3; } operation_item_tail : /*empty*/ { $$=nullptr; } | MZN_EQ expr { $$=$2; } params : /* empty */ { $$=new vector(); } | '(' params_list ')' { $$=$2; } | '(' error ')' { $$=new vector(); } params_list : /* empty */ { $$=new vector(); } | params_list_head comma_or_none { $$=$1; } params_list_head : ti_expr_and_id_or_anon { $$=new vector(); if ($1) $1->toplevel(false); if ($1) $$->push_back($1); } | params_list_head ',' ti_expr_and_id_or_anon { $$=$1; if ($3) $3->toplevel(false); if ($1 && $3) $1->push_back($3); } comma_or_none : | ',' ti_expr_and_id_or_anon : ti_expr_and_id { $$=$1; } | ti_expr { if ($1) $$=new VarDecl(@$, $1, ""); } ti_expr_and_id : ti_expr ':' MZN_IDENTIFIER { if ($1 && $3) { Id* ident = new Id(@3, $3, nullptr); $$ = new VarDecl(@$, $1, ident); } free($3); } ti_expr_list : ti_expr_list_head comma_or_none { $$=$1; } ti_expr_list_head : ti_expr { $$=new vector(); $$->push_back($1); } | ti_expr_list_head ',' ti_expr { $$=$1; if ($1 && $3) $1->push_back($3); } ti_expr : base_ti_expr | MZN_ARRAY MZN_LEFT_BRACKET ti_expr_list MZN_RIGHT_BRACKET MZN_OF base_ti_expr { $$ = $6; if ($$ && $3) $$->setRanges(*$3); delete $3; } | MZN_LIST MZN_OF base_ti_expr { $$ = $3; std::vector ti(1); ti[0] = new TypeInst(@$,Type::parint()); if ($$) $$->setRanges(ti); } base_ti_expr : base_ti_expr_tail { $$ = $1; } | MZN_OPT base_ti_expr_tail { $$ = $2; if ($$) { Type tt = $$->type(); tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } | MZN_PAR opt_opt base_ti_expr_tail { $$ = $3; if ($$ && $2) { Type tt = $$->type(); tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } | MZN_VAR opt_opt base_ti_expr_tail { $$ = $3; if ($$) { Type tt = $$->type(); tt.ti(Type::TI_VAR); if ($2) tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } | MZN_SET MZN_OF base_ti_expr_tail { $$ = $3; if ($$) { Type tt = $$->type(); tt.st(Type::ST_SET); $$->type(tt); } } | MZN_OPT MZN_SET MZN_OF base_ti_expr_tail { $$ = $4; if ($$) { Type tt = $$->type(); tt.st(Type::ST_SET); tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } | MZN_PAR opt_opt MZN_SET MZN_OF base_ti_expr_tail { $$ = $5; if ($$) { Type tt = $$->type(); tt.st(Type::ST_SET); if ($2) tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } | MZN_VAR opt_opt MZN_SET MZN_OF base_ti_expr_tail { $$ = $5; if ($$) { Type tt = $$->type(); tt.ti(Type::TI_VAR); tt.st(Type::ST_SET); if ($2) tt.ot(Type::OT_OPTIONAL); $$->type(tt); } } opt_opt: /* nothing */ { $$ = false; } | MZN_OPT { $$ = true; } base_ti_expr_tail : MZN_INT { $$ = new TypeInst(@$,Type::parint()); } | MZN_BOOL { $$ = new TypeInst(@$,Type::parbool()); } | MZN_FLOAT { $$ = new TypeInst(@$,Type::parfloat()); } | MZN_STRING { $$ = new TypeInst(@$,Type::parstring()); } | MZN_ANN { $$ = new TypeInst(@$,Type::ann()); } | set_expr { if ($1) $$ = new TypeInst(@$,Type(),$1); } | MZN_TI_IDENTIFIER { $$ = new TypeInst(@$,Type::top(), new TIId(@$, $1)); free($1); } | MZN_TI_ENUM_IDENTIFIER { $$ = new TypeInst(@$,Type::parint(), new TIId(@$, $1)); free($1); } array_access_expr_list : array_access_expr_list_head comma_or_none array_access_expr_list_head : array_access_expr { $$=new std::vector; $$->push_back($1); } | array_access_expr_list_head ',' array_access_expr { $$=$1; if ($$ && $3) $$->push_back($3); } array_access_expr : expr { $$ = $1; } | MZN_DOTDOT { $$=new SetLit(@$, IntSetVal::a(-IntVal::infinity(),IntVal::infinity())); } | MZN_DOTDOT expr { if ($2==nullptr) { $$ = nullptr; } else if ($2->isa()) { $$=new SetLit(@$, IntSetVal::a(-IntVal::infinity(),$2->cast()->v())); } else { $$=new BinOp(@$, IntLit::a(-IntVal::infinity()), BOT_DOTDOT, $2); } } | expr MZN_DOTDOT { if ($1==nullptr) { $$ = nullptr; } else if ($1->isa()) { $$=new SetLit(@$, IntSetVal::a($1->cast()->v(),IntVal::infinity())); } else { $$=new BinOp(@$, $1, BOT_DOTDOT, IntLit::a(IntVal::infinity())); } } expr_list : expr_list_head comma_or_none expr_list_head : expr { $$=new std::vector; $$->push_back($1); } | expr_list_head ',' expr { $$=$1; if ($$ && $3) $$->push_back($3); } /// set_expr : expr_atom_head | set_expr MZN_COLONCOLON annotation_expr { if ($1 && $3) $1->addAnnotation($3); $$=$1; } | set_expr MZN_UNION set_expr { $$=new BinOp(@$, $1, BOT_UNION, $3); } | set_expr MZN_DIFF set_expr { $$=new BinOp(@$, $1, BOT_DIFF, $3); } | set_expr MZN_SYMDIFF set_expr { $$=new BinOp(@$, $1, BOT_SYMDIFF, $3); } | set_expr MZN_DOTDOT set_expr { if ($1==nullptr || $3==nullptr) { $$ = nullptr; } else if ($1->isa() && $3->isa()) { $$=new SetLit(@$, IntSetVal::a($1->cast()->v(),$3->cast()->v())); } else { $$=new BinOp(@$, $1, BOT_DOTDOT, $3); } } | MZN_DOTDOT_QUOTED '(' expr ',' expr ')' { if ($3==nullptr || $5==nullptr) { $$ = nullptr; } else if ($3->isa() && $5->isa()) { $$=new SetLit(@$, IntSetVal::a($3->cast()->v(),$5->cast()->v())); } else { $$=new BinOp(@$, $3, BOT_DOTDOT, $5); } } | set_expr MZN_INTERSECT set_expr { $$=new BinOp(@$, $1, BOT_INTERSECT, $3); } | set_expr MZN_PLUSPLUS set_expr { $$=new BinOp(@$, $1, BOT_PLUSPLUS, $3); } | set_expr MZN_PLUS set_expr { $$=new BinOp(@$, $1, BOT_PLUS, $3); } | set_expr MZN_MINUS set_expr { $$=new BinOp(@$, $1, BOT_MINUS, $3); } | set_expr MZN_MULT set_expr { $$=new BinOp(@$, $1, BOT_MULT, $3); } | set_expr MZN_DIV set_expr { $$=new BinOp(@$, $1, BOT_DIV, $3); } | set_expr MZN_IDIV set_expr { $$=new BinOp(@$, $1, BOT_IDIV, $3); } | set_expr MZN_MOD set_expr { $$=new BinOp(@$, $1, BOT_MOD, $3); } | set_expr MZN_POW set_expr { $$=new BinOp(@$, $1, BOT_POW, $3); } | set_expr MZN_WEAK_PLUS set_expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~+"), args); } | set_expr MZN_WEAK_MINUS set_expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~-"), args); } | set_expr MZN_WEAK_MULT set_expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~*"), args); } | set_expr MZN_WEAK_EQ set_expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~="), args); } | set_expr MZN_QUOTED_IDENTIFIER set_expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, $2, args); free($2); } | MZN_PLUS set_expr %prec MZN_NOT { $$=new UnOp(@$, UOT_PLUS, $2); } | MZN_MINUS set_expr %prec MZN_NOT { if ($2 && $2->isa()) { $$ = IntLit::a(-$2->cast()->v()); } else if ($2 && $2->isa()) { $$ = FloatLit::a(-$2->cast()->v()); } else { $$=new UnOp(@$, UOT_MINUS, $2); } } /// expr : expr_atom_head | expr MZN_COLONCOLON annotation_expr { if ($1 && $3) $1->addAnnotation($3); $$=$1; } | expr MZN_EQUIV expr { $$=new BinOp(@$, $1, BOT_EQUIV, $3); } | expr MZN_IMPL expr { $$=new BinOp(@$, $1, BOT_IMPL, $3); } | expr MZN_RIMPL expr { $$=new BinOp(@$, $1, BOT_RIMPL, $3); } | expr MZN_OR expr { $$=new BinOp(@$, $1, BOT_OR, $3); } | expr MZN_XOR expr { $$=new BinOp(@$, $1, BOT_XOR, $3); } | expr MZN_AND expr { $$=new BinOp(@$, $1, BOT_AND, $3); } | expr MZN_LE expr { $$=new BinOp(@$, $1, BOT_LE, $3); } | expr MZN_GR expr { $$=new BinOp(@$, $1, BOT_GR, $3); } | expr MZN_LQ expr { $$=new BinOp(@$, $1, BOT_LQ, $3); } | expr MZN_GQ expr { $$=new BinOp(@$, $1, BOT_GQ, $3); } | expr MZN_EQ expr { $$=new BinOp(@$, $1, BOT_EQ, $3); } | expr MZN_NQ expr { $$=new BinOp(@$, $1, BOT_NQ, $3); } | expr MZN_IN expr { $$=new BinOp(@$, $1, BOT_IN, $3); } | expr MZN_SUBSET expr { $$=new BinOp(@$, $1, BOT_SUBSET, $3); } | expr MZN_SUPERSET expr { $$=new BinOp(@$, $1, BOT_SUPERSET, $3); } | expr MZN_UNION expr { $$=new BinOp(@$, $1, BOT_UNION, $3); } | expr MZN_DIFF expr { $$=new BinOp(@$, $1, BOT_DIFF, $3); } | expr MZN_SYMDIFF expr { $$=new BinOp(@$, $1, BOT_SYMDIFF, $3); } | expr MZN_DOTDOT expr { if ($1==nullptr || $3==nullptr) { $$ = nullptr; } else if ($1->isa() && $3->isa()) { $$=new SetLit(@$, IntSetVal::a($1->cast()->v(),$3->cast()->v())); } else { $$=new BinOp(@$, $1, BOT_DOTDOT, $3); } } | MZN_DOTDOT_QUOTED '(' expr ',' expr ')' { if ($3==nullptr || $5==nullptr) { $$ = nullptr; } else if ($3->isa() && $5->isa()) { $$=new SetLit(@$, IntSetVal::a($3->cast()->v(),$5->cast()->v())); } else { $$=new BinOp(@$, $3, BOT_DOTDOT, $5); } } | expr MZN_INTERSECT expr { $$=new BinOp(@$, $1, BOT_INTERSECT, $3); } | expr MZN_PLUSPLUS expr { $$=new BinOp(@$, $1, BOT_PLUSPLUS, $3); } | expr MZN_PLUS expr { $$=new BinOp(@$, $1, BOT_PLUS, $3); } | expr MZN_MINUS expr { $$=new BinOp(@$, $1, BOT_MINUS, $3); } | expr MZN_MULT expr { $$=new BinOp(@$, $1, BOT_MULT, $3); } | expr MZN_DIV expr { $$=new BinOp(@$, $1, BOT_DIV, $3); } | expr MZN_IDIV expr { $$=new BinOp(@$, $1, BOT_IDIV, $3); } | expr MZN_MOD expr { $$=new BinOp(@$, $1, BOT_MOD, $3); } | expr MZN_POW expr { $$=new BinOp(@$, $1, BOT_POW, $3); } | expr MZN_WEAK_PLUS expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~+"), args); } | expr MZN_WEAK_MINUS expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~-"), args); } | expr MZN_WEAK_MULT expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~*"), args); } | expr MZN_WEAK_EQ expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, ASTString("~="), args); } | expr MZN_QUOTED_IDENTIFIER expr { vector args; args.push_back($1); args.push_back($3); $$=new Call(@$, $2, args); free($2); } | MZN_NOT expr %prec MZN_NOT { $$=new UnOp(@$, UOT_NOT, $2); } | MZN_PLUS expr %prec MZN_NOT { if (($2 && $2->isa()) || ($2 && $2->isa())) { $$ = $2; } else { $$=new UnOp(@$, UOT_PLUS, $2); } } | MZN_MINUS expr %prec MZN_NOT { if ($2 && $2->isa()) { $$ = IntLit::a(-$2->cast()->v()); } else if ($2 && $2->isa()) { $$ = FloatLit::a(-$2->cast()->v()); } else { $$=new UnOp(@$, UOT_MINUS, $2); } } expr_atom_head : expr_atom_head_nonstring { $$=$1; } | string_expr { $$=$1; } expr_atom_head_nonstring : '(' expr ')' { $$=$2; } | '(' expr ')' array_access_tail { if ($4) $$=createArrayAccess(@$, $2, *$4); delete $4; } | '(' expr ')' MZN_POW_MINUS1 { $$=new BinOp(@$, $2, BOT_POW, IntLit::a(-1)); } | '(' expr ')' array_access_tail MZN_POW_MINUS1 { if ($4) $$=new BinOp(@$,createArrayAccess(@$, $2, *$4), BOT_POW, IntLit::a(-1)); delete $4; } | MZN_IDENTIFIER { $$=new Id(@$, $1, nullptr); free($1); } | MZN_IDENTIFIER array_access_tail { if ($2) $$=createArrayAccess(@$, new Id(@1,$1,nullptr), *$2); free($1); delete $2; } | MZN_IDENTIFIER MZN_POW_MINUS1 { $$=new BinOp(@$,new Id(@$, $1, nullptr), BOT_POW, IntLit::a(-1)); free($1); } | MZN_IDENTIFIER array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, new Id(@1,$1,nullptr), *$2), BOT_POW, IntLit::a(-1)); free($1); delete $2; } | MZN_UNDERSCORE { $$=new AnonVar(@$); } | MZN_UNDERSCORE array_access_tail { if ($2) $$=createArrayAccess(@$, new AnonVar(@$), *$2); delete $2; } | MZN_UNDERSCORE MZN_POW_MINUS1 { $$=new BinOp(@$,new AnonVar(@$), BOT_POW, IntLit::a(-1)); } | MZN_UNDERSCORE array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, new AnonVar(@$), *$2), BOT_POW, IntLit::a(-1)); delete $2; } | MZN_BOOL_LITERAL { $$=constants().boollit(($1!=0)); } | MZN_BOOL_LITERAL MZN_POW_MINUS1 { $$=new BinOp(@$,constants().boollit(($1!=0)), BOT_POW, IntLit::a(-1)); } | MZN_INTEGER_LITERAL { $$=IntLit::a($1); } | MZN_INTEGER_LITERAL MZN_POW_MINUS1 { $$=new BinOp(@$,IntLit::a($1), BOT_POW, IntLit::a(-1)); } | MZN_INFINITY { $$=IntLit::a(IntVal::infinity()); } | MZN_INFINITY MZN_POW_MINUS1 { $$=new BinOp(@$,IntLit::a(IntVal::infinity()), BOT_POW, IntLit::a(-1)); } | MZN_FLOAT_LITERAL { $$=FloatLit::a($1); } | MZN_FLOAT_LITERAL MZN_POW_MINUS1 { $$=new BinOp(@$,FloatLit::a($1), BOT_POW, IntLit::a(-1)); } | MZN_ABSENT { $$=constants().absent; } | MZN_ABSENT MZN_POW_MINUS1 { $$=constants().absent; } | set_literal | set_literal array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | set_literal MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | set_literal array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | set_comp | set_comp array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | set_comp MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | set_comp array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | simple_array_literal | simple_array_literal array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | simple_array_literal MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | simple_array_literal array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | simple_array_literal_2d | simple_array_literal_2d array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | simple_array_literal_2d MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | simple_array_literal_2d array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | simple_array_comp | simple_array_comp array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | simple_array_comp MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | simple_array_comp array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | if_then_else_expr | if_then_else_expr array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | if_then_else_expr MZN_POW_MINUS1 { $$ = new BinOp(@$,$1, BOT_POW, IntLit::a(-1)); } | if_then_else_expr array_access_tail MZN_POW_MINUS1 { if ($2) $$=new BinOp(@$,createArrayAccess(@$, $1, *$2), BOT_POW, IntLit::a(-1)); delete $2; } | let_expr | call_expr | call_expr array_access_tail { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } | call_expr MZN_POW_MINUS1 | call_expr array_access_tail MZN_POW_MINUS1 { if ($2) $$=createArrayAccess(@$, $1, *$2); delete $2; } string_expr: MZN_STRING_LITERAL { $$=new StringLit(@$, $1); free($1); } | MZN_STRING_QUOTE_START string_quote_rest { $$=new BinOp(@$, new StringLit(@$, $1), BOT_PLUSPLUS, $2); free($1); } string_quote_rest: expr_list_head MZN_STRING_QUOTE_END { if ($1) $$=new BinOp(@$, new Call(@$, ASTString("format"), *$1), BOT_PLUSPLUS, new StringLit(@$,$2)); free($2); delete $1; } | expr_list_head MZN_STRING_QUOTE_MID string_quote_rest { if ($1) $$=new BinOp(@$, new Call(@$, ASTString("format"), *$1), BOT_PLUSPLUS, new BinOp(@$, new StringLit(@$,$2), BOT_PLUSPLUS, $3)); free($2); delete $1; } array_access_tail : MZN_LEFT_BRACKET array_access_expr_list MZN_RIGHT_BRACKET { $$=new std::vector >(); if ($2) { $$->push_back(*$2); delete $2; } } | array_access_tail MZN_LEFT_BRACKET array_access_expr_list MZN_RIGHT_BRACKET { $$=$1; if ($$ && $3) { $$->push_back(*$3); delete $3; } } set_literal : '{' '}' { $$ = new SetLit(@$, std::vector()); } | '{' expr_list '}' { if ($2) $$ = new SetLit(@$, *$2); delete $2; } set_comp : '{' expr '|' comp_tail '}' { if ($4) $$ = new Comprehension(@$, $2, *$4, true); delete $4; } comp_tail : generator_list { if ($1) $$=new Generators; $$->g = *$1; delete $1; } generator_list : generator_list_head comma_or_none generator_list_head : generator { $$=new std::vector; if ($1) $$->push_back(*$1); delete $1; } | generator_eq { $$=new std::vector; if ($1) $$->push_back(*$1); delete $1; } | generator_eq MZN_WHERE expr { $$=new std::vector; if ($1) $$->push_back(*$1); if ($1 && $3) $$->push_back(Generator($$->size(),$3)); delete $1; } | generator_list_head ',' generator { $$=$1; if ($$ && $3) $$->push_back(*$3); delete $3; } | generator_list_head ',' generator_eq { $$=$1; if ($$ && $3) $$->push_back(*$3); delete $3; } | generator_list_head ',' generator_eq MZN_WHERE expr { $$=$1; if ($$ && $3) $$->push_back(*$3); if ($$ && $3 && $5) $$->push_back(Generator($$->size(),$5)); delete $3; } generator : id_list MZN_IN expr { if ($1 && $3) $$=new Generator(*$1,$3,nullptr); else $$=nullptr; delete $1; } | id_list MZN_IN expr MZN_WHERE expr { if ($1 && $3) $$=new Generator(*$1,$3,$5); else $$=nullptr; delete $1; } generator_eq : MZN_IDENTIFIER MZN_EQ expr { if ($3) $$=new Generator({$1},nullptr,$3); else $$=nullptr; free($1); } id_list : id_list_head comma_or_none id_list_head : MZN_IDENTIFIER { $$=new std::vector; $$->push_back($1); free($1); } | id_list_head ',' MZN_IDENTIFIER { $$=$1; if ($$ && $3) $$->push_back($3); free($3); } simple_array_literal : MZN_LEFT_BRACKET MZN_RIGHT_BRACKET { $$=new ArrayLit(@$, std::vector()); } | MZN_LEFT_BRACKET expr_list MZN_RIGHT_BRACKET { if ($2) $$=new ArrayLit(@$, *$2); delete $2; } simple_array_literal_2d : MZN_LEFT_2D_BRACKET MZN_RIGHT_2D_BRACKET { $$=new ArrayLit(@$, std::vector >()); } | MZN_LEFT_2D_BRACKET simple_array_literal_2d_list MZN_RIGHT_2D_BRACKET { if ($2) { $$=new ArrayLit(@$, *$2); for (unsigned int i=1; i<$2->size(); i++) if ((*$2)[i].size() != (*$2)[i-1].size()) yyerror(&@2, parm, "syntax error, all sub-arrays of 2d array literal must have the same length"); delete $2; } else { $$ = nullptr; } } | MZN_LEFT_2D_BRACKET simple_array_literal_2d_list '|' MZN_RIGHT_2D_BRACKET { if ($2) { $$=new ArrayLit(@$, *$2); for (unsigned int i=1; i<$2->size(); i++) if ((*$2)[i].size() != (*$2)[i-1].size()) yyerror(&@2, parm, "syntax error, all sub-arrays of 2d array literal must have the same length"); delete $2; } else { $$ = nullptr; } } | MZN_LEFT_2D_BRACKET simple_array_literal_3d_list MZN_RIGHT_2D_BRACKET { if ($2) { std::vector > dims(3); dims[0] = std::pair(1,static_cast($2->size())); if ($2->size()==0) { dims[1] = std::pair(1,0); dims[2] = std::pair(1,0); } else { dims[1] = std::pair(1,static_cast((*$2)[0].size())); if ((*$2)[0].size()==0) { dims[2] = std::pair(1,0); } else { dims[2] = std::pair(1,static_cast((*$2)[0][0].size())); } } std::vector a; for (int i=0; i > >; } | '|' simple_array_literal_2d_list '|' { $$=new std::vector > >; if ($2) $$->push_back(*$2); delete $2; } | simple_array_literal_3d_list ',' '|' simple_array_literal_2d_list '|' { $$=$1; if ($$ && $4) $$->push_back(*$4); delete $4; } simple_array_literal_2d_list : expr_list { $$=new std::vector >; if ($1) $$->push_back(*$1); delete $1; } | simple_array_literal_2d_list '|' expr_list { $$=$1; if ($$ && $3) $$->push_back(*$3); delete $3; } simple_array_comp : MZN_LEFT_BRACKET expr '|' comp_tail MZN_RIGHT_BRACKET { if ($4) $$=new Comprehension(@$, $2, *$4, false); delete $4; } if_then_else_expr : MZN_IF expr MZN_THEN expr MZN_ENDIF { std::vector iexps; iexps.push_back($2); iexps.push_back($4); $$=new ITE(@$, iexps, nullptr); } | MZN_IF expr MZN_THEN expr elseif_list MZN_ELSE expr MZN_ENDIF { std::vector iexps; iexps.push_back($2); iexps.push_back($4); if ($5) { for (unsigned int i=0; i<$5->size(); i+=2) { iexps.push_back((*$5)[i]); iexps.push_back((*$5)[i+1]); } } $$=new ITE(@$, iexps,$7); delete $5; } elseif_list : { $$=new std::vector; } | elseif_list MZN_ELSEIF expr MZN_THEN expr { $$=$1; if ($$ && $3 && $5) { $$->push_back($3); $$->push_back($5); } } quoted_op : MZN_EQUIV_QUOTED { $$=BOT_EQUIV; } | MZN_IMPL_QUOTED { $$=BOT_IMPL; } | MZN_RIMPL_QUOTED { $$=BOT_RIMPL; } | MZN_OR_QUOTED { $$=BOT_OR; } | MZN_XOR_QUOTED { $$=BOT_XOR; } | MZN_AND_QUOTED { $$=BOT_AND; } | MZN_LE_QUOTED { $$=BOT_LE; } | MZN_GR_QUOTED { $$=BOT_GR; } | MZN_LQ_QUOTED { $$=BOT_LQ; } | MZN_GQ_QUOTED { $$=BOT_GQ; } | MZN_EQ_QUOTED { $$=BOT_EQ; } | MZN_NQ_QUOTED { $$=BOT_NQ; } | MZN_IN_QUOTED { $$=BOT_IN; } | MZN_SUBSET_QUOTED { $$=BOT_SUBSET; } | MZN_SUPERSET_QUOTED { $$=BOT_SUPERSET; } | MZN_UNION_QUOTED { $$=BOT_UNION; } | MZN_DIFF_QUOTED { $$=BOT_DIFF; } | MZN_SYMDIFF_QUOTED { $$=BOT_SYMDIFF; } | MZN_PLUS_QUOTED { $$=BOT_PLUS; } | MZN_MINUS_QUOTED { $$=BOT_MINUS; } | MZN_MULT_QUOTED { $$=BOT_MULT; } | MZN_POW_QUOTED { $$=BOT_POW; } | MZN_DIV_QUOTED { $$=BOT_DIV; } | MZN_IDIV_QUOTED { $$=BOT_IDIV; } | MZN_MOD_QUOTED { $$=BOT_MOD; } | MZN_INTERSECT_QUOTED { $$=BOT_INTERSECT; } | MZN_PLUSPLUS_QUOTED { $$=BOT_PLUSPLUS; } | MZN_NOT_QUOTED { $$=-1; } quoted_op_call : quoted_op '(' expr ',' expr ')' { if ($1==-1) { $$=nullptr; yyerror(&@3, parm, "syntax error, unary operator with two arguments"); } else { $$=new BinOp(@$, $3,static_cast($1),$5); } } | quoted_op '(' expr ')' { int uot=-1; switch ($1) { case -1: uot = UOT_NOT; break; case BOT_MINUS: uot = UOT_MINUS; break; case BOT_PLUS: uot = UOT_PLUS; break; default: yyerror(&@3, parm, "syntax error, binary operator with unary argument list"); break; } if (uot==-1) $$=nullptr; else { if (uot==UOT_PLUS && $3 && ($3->isa() || $3->isa())) { $$ = $3; } else if (uot==UOT_MINUS && $3 && $3->isa()) { $$ = IntLit::a(-$3->cast()->v()); } else if (uot==UOT_MINUS && $3 && $3->isa()) { $$ = FloatLit::a(-$3->cast()->v()); } else { $$=new UnOp(@$, static_cast(uot),$3); } } } call_expr : MZN_IDENTIFIER '(' ')' { $$=new Call(@$, $1, std::vector()); free($1); } | MZN_IDENTIFIER MZN_POW_MINUS1 '(' ')' { $$=new Call(@$, std::string($1)+"⁻¹", std::vector()); free($1); } | quoted_op_call | MZN_IDENTIFIER '(' comp_or_expr ')' { if ($3!=nullptr) { bool hadWhere = false; std::vector args; for (unsigned int i=0; i<$3->size(); i++) { if ((*$3)[i].second) { yyerror(&@3, parm, "syntax error, 'where' expression outside generator call"); hadWhere = true; $$=nullptr; } args.push_back((*$3)[i].first); } if (!hadWhere) { $$=new Call(@$, $1, args); } } free($1); delete $3; } | MZN_IDENTIFIER '(' comp_or_expr ')' '(' expr ')' { vector gens; vector ids; if ($3) { for (unsigned int i=0; i<$3->size(); i++) { if (Id* id = Expression::dynamicCast((*$3)[i].first)) { if ((*$3)[i].second) { ParserLocation loc = (*$3)[i].second->loc().parserLocation(); yyerror(&loc, parm, "illegal where expression in generator call"); } ids.push_back(id); } else { if (BinOp* boe = Expression::dynamicCast((*$3)[i].first)) { if (boe->lhs() && boe->rhs()) { Id* id = Expression::dynamicCast(boe->lhs()); if (id && boe->op() == BOT_IN) { ids.push_back(id); gens.push_back(Generator(ids,boe->rhs(),(*$3)[i].second)); ids = vector(); } else if (id && boe->op() == BOT_EQ && ids.empty()) { ids.push_back(id); gens.push_back(Generator(ids,nullptr,boe->rhs())); if ((*$3)[i].second) { gens.push_back(Generator(gens.size(),(*$3)[i].second)); } ids = vector(); } else { ParserLocation loc = (*$3)[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } else { ParserLocation loc = (*$3)[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } } if (ids.size() != 0) { yyerror(&@3, parm, "illegal expression in generator call"); } ParserState* pp = static_cast(parm); if (pp->hadError) { $$=nullptr; } else { Generators g; g.g = gens; Comprehension* ac = new Comprehension(@$, $6,g,false); vector args; args.push_back(ac); $$=new Call(@$, $1, args); } free($1); delete $3; } | MZN_IDENTIFIER MZN_POW_MINUS1 '(' comp_or_expr ')' { if ($4!=nullptr) { bool hadWhere = false; std::vector args; for (unsigned int i=0; i<$4->size(); i++) { if ((*$4)[i].second) { yyerror(&@4, parm, "syntax error, 'where' expression outside generator call"); hadWhere = true; $$=nullptr; } args.push_back((*$4)[i].first); } if (!hadWhere) { $$=new Call(@$, std::string($1)+"⁻¹", args); } } free($1); delete $4; } | MZN_IDENTIFIER MZN_POW_MINUS1 '(' comp_or_expr ')' '(' expr ')' { vector gens; vector ids; if ($4) { for (unsigned int i=0; i<$4->size(); i++) { if (Id* id = Expression::dynamicCast((*$4)[i].first)) { if ((*$4)[i].second) { ParserLocation loc = (*$4)[i].second->loc().parserLocation(); yyerror(&loc, parm, "illegal where expression in generator call"); } ids.push_back(id); } else { if (BinOp* boe = Expression::dynamicCast((*$4)[i].first)) { if (boe->lhs() && boe->rhs()) { Id* id = Expression::dynamicCast(boe->lhs()); if (id && boe->op() == BOT_IN) { ids.push_back(id); gens.push_back(Generator(ids,boe->rhs(),(*$4)[i].second)); ids = vector(); } else if (id && boe->op() == BOT_EQ && ids.empty()) { ids.push_back(id); gens.push_back(Generator(ids,nullptr,boe->rhs())); if ((*$4)[i].second) { gens.push_back(Generator(gens.size(),(*$4)[i].second)); } ids = vector(); } else { ParserLocation loc = (*$4)[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } else { ParserLocation loc = (*$4)[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } } if (ids.size() != 0) { yyerror(&@4, parm, "illegal expression in generator call"); } ParserState* pp = static_cast(parm); if (pp->hadError) { $$=nullptr; } else { Generators g; g.g = gens; Comprehension* ac = new Comprehension(@$, $7,g,false); vector args; args.push_back(ac); $$=new Call(@$, std::string($1)+"⁻¹", args); } free($1); delete $4; } comp_or_expr : comp_or_expr_head comma_or_none comp_or_expr_head : expr { $$=new vector >; if ($1) { $$->push_back(pair($1,nullptr)); } } | expr MZN_WHERE expr { $$=new vector >; if ($1 && $3) { $$->push_back(pair($1,$3)); } } | comp_or_expr_head ',' expr { $$=$1; if ($$ && $3) $$->push_back(pair($3,nullptr)); } | comp_or_expr_head ',' expr MZN_WHERE expr { $$=$1; if ($$ && $3 && $5) $$->push_back(pair($3,$5)); } let_expr : MZN_LET '{' let_vardecl_item_list '}' MZN_IN expr %prec PREC_ANNO { if ($3 && $6) { $$=new Let(@$, *$3, $6); delete $3; } else { $$=nullptr; } } | MZN_LET '{' let_vardecl_item_list comma_or_semi '}' MZN_IN expr %prec PREC_ANNO { if ($3 && $7) { $$=new Let(@$, *$3, $7); delete $3; } else { $$=nullptr; } } let_vardecl_item_list : let_vardecl_item { $$=new vector; $$->push_back($1); } | constraint_item { $$=new vector; if ($1) { ConstraintI* ce = $1->cast(); $$->push_back(ce->e()); ce->e(nullptr); } } | let_vardecl_item_list comma_or_semi let_vardecl_item { $$=$1; if ($$ && $3) $$->push_back($3); } | let_vardecl_item_list comma_or_semi constraint_item { $$=$1; if ($$ && $3) { ConstraintI* ce = $3->cast(); $$->push_back(ce->e()); ce->e(nullptr); } } comma_or_semi : ',' | ';' let_vardecl_item : ti_expr_and_id annotations { $$ = $1; if ($$) $$->toplevel(false); if ($$ && $2) $$->addAnnotations(*$2); delete $2; } | ti_expr_and_id annotations MZN_EQ expr { if ($1) $1->e($4); $$ = $1; if ($$) $$->loc(@$); if ($$) $$->toplevel(false); if ($$ && $2) $$->addAnnotations(*$2); delete $2; } annotations : /* empty */ { $$=nullptr; } | ne_annotations annotation_expr : expr_atom_head_nonstring { $$ = $1; } | string_expr { $$ = new Call(@1, ASTString("mzn_expression_name"), {$1}); } ne_annotations : MZN_COLONCOLON annotation_expr { $$=new std::vector(1); (*$$)[0] = $2; } | ne_annotations MZN_COLONCOLON annotation_expr { $$=$1; if ($$) $$->push_back($3); } id_or_quoted_op : MZN_IDENTIFIER { $$=$1; } | MZN_IDENTIFIER MZN_POW_MINUS1 { $$=strdup((std::string($1)+"⁻¹").c_str()); } | MZN_EQUIV_QUOTED { $$=strdup("'<->'"); } | MZN_IMPL_QUOTED { $$=strdup("'->'"); } | MZN_RIMPL_QUOTED { $$=strdup("'<-'"); } | MZN_OR_QUOTED { $$=strdup("'\\/'"); } | MZN_XOR_QUOTED { $$=strdup("'xor'"); } | MZN_AND_QUOTED { $$=strdup("'/\\'"); } | MZN_LE_QUOTED { $$=strdup("'<'"); } | MZN_GR_QUOTED { $$=strdup("'>'"); } | MZN_LQ_QUOTED { $$=strdup("'<='"); } | MZN_GQ_QUOTED { $$=strdup("'>='"); } | MZN_EQ_QUOTED { $$=strdup("'='"); } | MZN_NQ_QUOTED { $$=strdup("'!='"); } | MZN_IN_QUOTED { $$=strdup("'in'"); } | MZN_SUBSET_QUOTED { $$=strdup("'subset'"); } | MZN_SUPERSET_QUOTED { $$=strdup("'superset'"); } | MZN_UNION_QUOTED { $$=strdup("'union'"); } | MZN_DIFF_QUOTED { $$=strdup("'diff'"); } | MZN_SYMDIFF_QUOTED { $$=strdup("'symdiff'"); } | MZN_DOTDOT_QUOTED { $$=strdup("'..'"); } | MZN_PLUS_QUOTED { $$=strdup("'+'"); } | MZN_MINUS_QUOTED { $$=strdup("'-'"); } | MZN_MULT_QUOTED { $$=strdup("'*'"); } | MZN_POW_QUOTED { $$=strdup("'^'"); } | MZN_DIV_QUOTED { $$=strdup("'/'"); } | MZN_IDIV_QUOTED { $$=strdup("'div'"); } | MZN_MOD_QUOTED { $$=strdup("'mod'"); } | MZN_INTERSECT_QUOTED { $$=strdup("'intersect'"); } | MZN_NOT_QUOTED { $$=strdup("'not'"); } | MZN_PLUSPLUS_QUOTED { $$=strdup("'++'"); } libminizinc-2.5.3/lib/values.cpp0000644000175000017500000000167113757304533015256 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { IntVal IntVal::minint() { return IntVal(std::numeric_limits::min()); } IntVal IntVal::maxint() { return IntVal(std::numeric_limits::max()); } IntVal IntVal::infinity() { return IntVal(1, true); } IntSetVal::IntSetVal(IntVal m, IntVal n) : ASTChunk(sizeof(Range)) { get(0).min = m; get(0).max = n; } FloatSetVal::FloatSetVal(FloatVal m, FloatVal n) : ASTChunk(sizeof(Range)) { get(0).min = m; get(0).max = n; } FloatVal FloatVal::infinity() { return FloatVal(1.0, true); } } // namespace MiniZinc libminizinc-2.5.3/lib/passes/0000755000175000017500000000000013757304533014544 5ustar kaolkaollibminizinc-2.5.3/lib/passes/gecode_pass.cpp0000644000175000017500000000154613757304533017532 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Kevin Leo */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { GecodePass::GecodePass(GecodeOptions* gopts) : _gopts(gopts) {} Env* GecodePass::run(Env* env, std::ostream& log) { try { GecodeSolverInstance gecode(*env, log, new GecodeOptions(*_gopts)); gecode.processFlatZinc(); gecode.presolve(env->flat()); } catch (const InternalError& e) { std::cerr << "Warning during presolve: " << e.msg() << std::endl; } return env; } } // namespace MiniZinc libminizinc-2.5.3/lib/passes/compile_pass.cpp0000644000175000017500000001356513757304533017740 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Kevin Leo */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { using std::string; using std::vector; Env* change_library(Env& e, vector& includePaths, const string& globals_dir, CompilePassFlags& compflags, bool verbose = false) { GCLock lock; CopyMap cm; Model* m = e.envi().originalModel != nullptr ? e.envi().originalModel : e.envi().model; auto* new_mod = new Model(); new_mod->setFilename(m->filename()); new_mod->setFilepath(m->filepath()); vector new_includePaths; if (std::find(includePaths.begin(), includePaths.end(), globals_dir) == includePaths.end()) { new_includePaths.push_back(globals_dir); } new_includePaths.insert(new_includePaths.end(), includePaths.begin(), includePaths.end()); // Collect include items vector include_names; for (Item* item : *m) { if (auto* inc = item->dynamicCast()) { include_names.push_back(inc->m()->filepath()); } else { new_mod->addItem(copy(e.envi(), cm, item)); } } std::stringstream ss; for (auto& name : include_names) { ss << "include \"" << Printer::escapeStringLit(name) << "\";"; } vector syntax_errors; Env* fenv = new Env(new_mod); // Model* inc_mod = parse(*fenv, include_names, {}, new_includePaths, true, true, verbose, // std::cerr); std::ostringstream dummy_file; dummy_file << m->filepath() << "_Dummy.mzn"; Model* inc_mod = parse_from_string(*fenv, ss.str(), dummy_file.str(), new_includePaths, false, false, true, verbose, std::cerr, syntax_errors); if (inc_mod == nullptr) { for (const SyntaxError& se : syntax_errors) { std::cerr << std::endl; std::cerr << se.what() << ": " << se.msg() << std::endl; std::cerr << se.loc() << std::endl; } return nullptr; } auto* new_inc = new IncludeI(Location().introduce(), string("MultiPassDummy.mzn")); new_inc->m(inc_mod); inc_mod->setParent(new_mod); new_mod->addItem(new_inc); return fenv; } CompilePass::CompilePass(Env* e, FlatteningOptions& opts, CompilePassFlags& cflags, string globals_library, vector include_paths, bool change_lib, bool ignore_unknown) : _env(e), _fopts(opts), _compflags(cflags), _library(std::move(globals_library)), _includePaths(std::move(include_paths)), _changeLibrary(change_lib), _ignoreUnknownIds(ignore_unknown) {} Env* CompilePass::run(Env* store, std::ostream& log) { Timer lasttime; if (_compflags.verbose) { log << "\n\tCompilePass: Flatten with \'" << _library << "\' library ...\n"; } Env* new_env; if (_changeLibrary) { new_env = change_library(*_env, _includePaths, _library, _compflags, _compflags.verbose); if (new_env == nullptr) { return nullptr; } new_env->envi().copyPathMapsAndState(store->envi()); } else { new_env = _env; } new_env->envi().ignoreUnknownIds = _ignoreUnknownIds; vector typeErrors; MiniZinc::typecheck(*new_env, new_env->model(), typeErrors, _compflags.modelCheckOnly || _compflags.modelInterfaceOnly, _compflags.allowMultiAssign); if (!typeErrors.empty()) { std::ostringstream errstream; for (auto& typeError : typeErrors) { errstream << typeError.what() << ": " << typeError.msg() << std::endl; errstream << typeError.loc() << std::endl; } throw Error(errstream.str()); } register_builtins(*new_env); try { flatten(*new_env, _fopts); } catch (LocationException& e) { if (_compflags.verbose) { log << std::endl; } std::ostringstream errstream; errstream << e.what() << ": " << std::endl; new_env->dumpErrorStack(errstream); errstream << " " << e.msg() << std::endl; throw Error(errstream.str()); } if (!_compflags.noMIPdomains) { if (_compflags.verbose) { log << "MIP domains ..."; } mip_domains(*new_env, _compflags.statistics); if (_compflags.verbose) { log << " done (" << lasttime.stoptime() << ")" << std::endl; } } if (_compflags.optimize) { if (_compflags.verbose) { log << "Optimizing ..."; } optimize(*new_env, _compflags.chainCompression); if (_compflags.verbose) { log << " done (" << lasttime.stoptime() << ")" << std::endl; } } for (const auto& i : new_env->warnings()) { log << (_compflags.werror ? "\n ERROR: " : "\n WARNING: ") << i; } if (_compflags.werror && !new_env->warnings().empty()) { throw Error("errors encountered"); } new_env->clearWarnings(); if (!_compflags.newfzn) { if (_compflags.verbose) { log << "Converting to old FlatZinc ..."; } oldflatzinc(*new_env); if (_compflags.verbose) { log << " done (" << lasttime.stoptime() << ")" << std::endl; } } else { new_env->flat()->compact(); new_env->output()->compact(); } if (_compflags.verbose) { log << " done (" << lasttime.stoptime() << ")" << std::endl; } return new_env; } CompilePass::~CompilePass(){}; } // namespace MiniZinc libminizinc-2.5.3/lib/solver.cpp0000644000175000017500000010320713757304533015267 0ustar kaolkaol /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This (main) file coordinates flattening and solving. * The corresponding modules are flexibly plugged in * as derived classes, prospectively from DLLs. * A flattening module should provide MinZinc::GetFlattener() * A solving module should provide an object of a class derived from SolverFactory. * Need to get more flexible for multi-pass & multi-solving stuff TODO */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include #include #ifdef HAS_GUROBI #include #endif #ifdef HAS_CPLEX #include #endif #ifdef HAS_OSICBC #include #endif #ifdef HAS_XPRESS #include #endif #ifdef HAS_GECODE #include #endif #ifdef HAS_GEAS #include #endif #ifdef HAS_SCIP #include #endif #include #include #include #include #include #include using namespace std; using namespace MiniZinc; SolverInitialiser::SolverInitialiser() { #ifdef HAS_GUROBI GurobiSolverFactoryInitialiser _gurobi_init; #endif #ifdef HAS_CPLEX static CplexSolverFactoryInitialiser _cplex_init; #endif #ifdef HAS_OSICBC static OSICBCSolverFactoryInitialiser _osicbc_init; #endif #ifdef HAS_XPRESS static XpressSolverFactoryInitialiser _xpress_init; #endif #ifdef HAS_GECODE static GecodeSolverFactoryInitialiser _gecode_init; #endif #ifdef HAS_GEAS static GeasSolverFactoryInitialiser _geas_init; #endif #ifdef HAS_SCIP static SCIPSolverFactoryInitialiser _scip_init; #endif static FZNSolverFactoryInitialiser _fzn_init; static MZNSolverFactoryInitialiser _mzn_init; static NLSolverFactoryInitialiser _nl_init; } MZNFZNSolverFlag MZNFZNSolverFlag::std(const std::string& n0) { const std::string argFlags("-I -n -p -r -n-o"); if (argFlags.find(n0) != std::string::npos) { return MZNFZNSolverFlag(FT_ARG, n0); } return MZNFZNSolverFlag(FT_NOARG, n0); } MZNFZNSolverFlag MZNFZNSolverFlag::extra(const SolverConfig::ExtraFlag& ef) { return MZNFZNSolverFlag( ef.flagType == SolverConfig::ExtraFlag::FlagType::T_BOOL && ef.range.empty() ? FT_NOARG : FT_ARG, ef.flag); } // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SolverRegistry* MiniZinc::get_global_solver_registry() { static SolverRegistry sr; return &sr; } void SolverRegistry::addSolverFactory(SolverFactory* pSF) { assert(pSF); _sfstorage.push_back(pSF); } void SolverRegistry::removeSolverFactory(SolverFactory* pSF) { auto it = find(_sfstorage.begin(), _sfstorage.end(), pSF); assert(pSF); _sfstorage.erase(it); } void SolverRegistry::addFactoryFlag(const std::string& flag, SolverFactory* sf) { assert(sf); _factoryFlagStorage.push_back(std::make_pair(flag, sf)); } void SolverRegistry::removeFactoryFlag(const std::string& flag, SolverFactory* sf) { assert(sf); auto it = find(_factoryFlagStorage.begin(), _factoryFlagStorage.end(), std::make_pair(flag, sf)); _factoryFlagStorage.erase(it); } /// Function createSI also adds each SI to the local storage SolverInstanceBase* SolverFactory::createSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) { SolverInstanceBase* pSI = doCreateSI(env, log, opt); if (pSI == nullptr) { throw InternalError("SolverFactory: failed to initialize solver " + getDescription()); } _sistorage.resize(_sistorage.size() + 1); _sistorage.back().reset(pSI); return pSI; } /// also providing a destroy function for a DLL or just special allocator etc. void SolverFactory::destroySI(SolverInstanceBase* pSI) { auto it = _sistorage.begin(); for (; it != _sistorage.end(); ++it) { if (it->get() == pSI) { break; } } if (_sistorage.end() == it) { cerr << " SolverFactory: failed to remove solver at " << pSI << endl; throw InternalError(" SolverFactory: failed to remove solver"); } _sistorage.erase(it); } MznSolver::MznSolver(std::ostream& os0, std::ostream& log0) : _solverConfigs(log0), _flt(os0, log0, _solverConfigs.mznlibDir()), _executableName(""), _os(os0), _log(log0), s2out(os0, log0, _solverConfigs.mznlibDir()) {} MznSolver::~MznSolver() { // if (si) // first the solver // CleanupSolverInterface(si); // TODO cleanup the used solver interfaces _si = nullptr; _siOpt = nullptr; GC::trigger(); } bool MznSolver::ifMzn2Fzn() const { return _isMzn2fzn; } bool MznSolver::ifSolns2out() const { return s2out.opt.flagStandaloneSolns2Out; } void MznSolver::addSolverInterface(SolverFactory* sf) { _si = sf->createSI(*_flt.getEnv(), _log, _siOpt); assert(_si); if (s2out.getEnv() == nullptr) { s2out.initFromEnv(_flt.getEnv()); } _si->setSolns2Out(&s2out); if (flagCompilerVerbose) { _log // << " ---------------------------------------------------------------------------\n" << " % SOLVING PHASE\n" << sf->getDescription(_siOpt) << endl; } } void MznSolver::addSolverInterface() { GCLock lock; if (_sf == nullptr) { if (get_global_solver_registry()->getSolverFactories().empty()) { _log << " MznSolver: NO SOLVER FACTORIES LINKED." << endl; assert(0); } _sf = get_global_solver_registry()->getSolverFactories().back(); } addSolverInterface(_sf); } void MznSolver::printUsage() { _os << _executableName << ": "; if (ifMzn2Fzn()) { _os << "MiniZinc to FlatZinc converter.\n" << "Usage: " << _executableName << " [] [-I ] .mzn [.dzn ...]" << std::endl; } else if (ifSolns2out()) { _os << "Solutions to output translator.\n" << "Usage: " << _executableName << " [] .ozn" << std::endl; } else { _os << "MiniZinc driver.\n" << "Usage: " << _executableName << " [] [-I ] .mzn [.dzn ...] or just .fzn" << std::endl; } } void MznSolver::printHelp(const std::string& selectedSolver) { printUsage(); _os << "General options:" << std::endl << " --help, -h\n Print this help message." << std::endl << " --version\n Print version information." << std::endl << " --solvers\n Print list of available solvers." << std::endl << " --time-limit \n Stop after milliseconds (includes compilation and solving)." << std::endl << " --solver , --solver .msc\n Select solver to use." << std::endl << " --help \n Print help for a particular solver." << std::endl << " -v, -l, --verbose\n Print progress/log statements. Note that some solvers may log " "to " "stdout." << std::endl << " --verbose-compilation\n Print progress/log statements for compilation." << std::endl << " -s, --statistics\n Print statistics." << std::endl << " --compiler-statistics\n Print statistics for compilation." << std::endl << " -c, --compile\n Compile only (do not run solver)." << std::endl << " --config-dirs\n Output configuration directories." << std::endl << " --param-file \n Load parameters from the given JSON file." << std::endl; if (selectedSolver.empty()) { _flt.printHelp(_os); _os << endl; if (!ifMzn2Fzn()) { Solns2Out::printHelp(_os); _os << endl; } _os << "Available solvers (get help using --help ):" << endl; std::vector solvers = _solverConfigs.solvers(); if (solvers.empty()) { cout << " none.\n"; } for (auto& solver : solvers) { cout << " " << solver << endl; } } else { const SolverConfig& sc = _solverConfigs.config(selectedSolver); string solverId = sc.executable().empty() ? sc.id() : (sc.supportsMzn() ? string("org.minizinc.mzn-mzn") : string("org.minizinc.mzn-fzn")); bool found = false; for (auto it = get_global_solver_registry()->getSolverFactories().rbegin(); it != get_global_solver_registry()->getSolverFactories().rend(); ++it) { if ((*it)->getId() == solverId) { _os << endl; (*it)->printHelp(_os); if (!sc.executable().empty() && !sc.extraFlags().empty()) { _os << "Extra solver flags (use with "; _os << (sc.supportsMzn() ? "--mzn-flags" : "--fzn-flags") << ")" << endl; for (const SolverConfig::ExtraFlag& ef : sc.extraFlags()) { _os << " " << ef.flag << endl << " " << ef.description << endl; } } found = true; } } if (!found) { _os << "No help found for solver " << selectedSolver << endl; } } } void add_flags(const std::string& sep, const std::vector& in_args, std::vector& out_args) { for (const std::string& arg : in_args) { out_args.push_back(sep); out_args.push_back(arg); } } MznSolver::OptionStatus MznSolver::processOptions(std::vector& argv) { _executableName = argv[0]; _executableName = _executableName.substr(_executableName.find_last_of("/\\") + 1); size_t lastdot = _executableName.find_last_of('.'); if (lastdot != std::string::npos) { _executableName = _executableName.substr(0, lastdot); } string solver; bool load_params = false; bool mzn2fzn_exe = (_executableName == "mzn2fzn"); if (mzn2fzn_exe) { _isMzn2fzn = true; } else if (_executableName == "solns2out") { s2out.opt.flagStandaloneSolns2Out = true; flagIsSolns2out = true; } bool compileSolutionChecker = false; int i = 1; int j = 1; int argc = static_cast(argv.size()); std::vector workingDirs = {""}; if (argc < 2) { return OPTION_ERROR; } // Add params from a file if necessary std::vector paramFiles; for (i = 1; i < argc; ++i) { string paramFile; bool usedFlag = false; bool pushWorkingDir = true; if (argv[i] == "--param-file") { usedFlag = true; ++i; if (i == argc) { _log << "Argument required for --param-file" << endl; return OPTION_ERROR; } paramFile = argv[i]; } else if (argv[i] == "--param-file-no-push") { usedFlag = true; pushWorkingDir = false; ++i; if (i == argc) { _log << "Argument required for --param-file-no-push" << endl; return OPTION_ERROR; } paramFile = argv[i]; } else if (argv[i] == "--push-working-directory") { ++i; workingDirs.push_back(argv[i]); } else if (argv[i] == "--pop-working-directory") { workingDirs.pop_back(); } else { size_t last_dot = argv[i].find_last_of('.'); if (last_dot != string::npos && argv[i].substr(last_dot, string::npos) == ".mpc") { paramFile = argv[i]; } } if (!paramFile.empty()) { try { auto paramFilePath = FileUtils::file_path(paramFile, workingDirs.back()); if (std::find(paramFiles.begin(), paramFiles.end(), paramFilePath) != paramFiles.end()) { throw ParamException("Cyclic parameter configuration file"); } // add parameter file arguments ParamConfig pc; pc.blacklist( {"--solvers", "--solvers-json", "--solver-json", "--help", "-h", "--config-dirs"}); pc.negatedFlag("-i", "-n-i"); pc.negatedFlag("--intermediate", "--no-intermediate"); pc.negatedFlag("--intermediate-solutions", "--no-intermediate-solutions"); pc.negatedFlag("--all-satisfaction", "--disable-all-satisfaction"); pc.load(paramFilePath); // Insert the new options auto toInsert = pc.argv(); auto remove = argv.begin() + (usedFlag ? i - 1 : i); auto position = argv.erase(remove, argv.begin() + i + 1); if (pushWorkingDir) { position = argv.insert(position, {"--push-working-directory", FileUtils::file_path(FileUtils::dir_name(paramFilePath))}) + 2; } position = argv.insert(position, toInsert.begin(), toInsert.end()) + toInsert.size(); if (pushWorkingDir) { position = argv.insert(position, "--pop-working-directory") + 1; } paramFiles.push_back(paramFilePath); argc = argv.size(); // Have to process the newly added options if (usedFlag) { i -= 2; } else { i--; } } catch (ParamException& e) { _log << "Solver parameter exception: " << e.msg() << endl; return OPTION_ERROR; } } } // Process any registered factory flags const auto& factoryFlags = get_global_solver_registry()->getFactoryFlags(); std::unordered_map> reducedSolverDefaults; if (!factoryFlags.empty()) { // Process solver default factory flags for (const auto& factoryFlag : factoryFlags) { auto factoryId = factoryFlag.second->getId(); if (reducedSolverDefaults.count(factoryId) == 0) { reducedSolverDefaults.insert({factoryId, _solverConfigs.defaultOptions(factoryId)}); } auto& defaultArgs = reducedSolverDefaults.find(factoryId)->second; std::vector keep; for (i = 0; i < defaultArgs.size(); i++) { if (defaultArgs[i] != factoryFlag.first || !factoryFlag.second->processFactoryOption(i, defaultArgs)) { keep.push_back(defaultArgs[i]); } } defaultArgs = keep; } // Process command line factory flags std::vector remaining = {argv[0]}; for (i = 1; i < argc; i++) { bool ok = false; if (argv[i] == "--push-working-directory") { remaining.push_back(argv[i]); i++; workingDirs.push_back(argv[i]); } else if (argv[i] == "--pop-working-directory") { workingDirs.pop_back(); } else { for (const auto& factoryFlag : factoryFlags) { if (argv[i] == factoryFlag.first && factoryFlag.second->processFactoryOption(i, argv, workingDirs.back())) { ok = true; break; } } } if (!ok) { remaining.push_back(argv[i]); } } argv = remaining; argc = remaining.size(); } for (auto* sf : get_global_solver_registry()->getSolverFactories()) { // Notify solver factories that factory flags are done sf->factoryOptionsFinished(); } // After this point all solver configurations must be available _solverConfigs.populate(_log); for (i = 1; i < argc; ++i) { if (argv[i] == "-h" || argv[i] == "--help") { if (argc > i + 1) { printHelp(argv[i + 1]); } else { printHelp(); } return OPTION_FINISH; } if (argv[i] == "--version") { Flattener::printVersion(cout); return OPTION_FINISH; } if (argv[i] == "--solvers") { cout << "MiniZinc driver.\nAvailable solver configurations:\n"; std::vector solvers = _solverConfigs.solvers(); if (solvers.empty()) { cout << " none.\n"; } for (auto& solver : solvers) { cout << " " << solver << endl; } cout << "Search path for solver configurations:\n"; for (const string& p : _solverConfigs.solverConfigsPath()) { cout << " " << p << endl; } return OPTION_FINISH; } if (argv[i] == "--solvers-json") { cout << _solverConfigs.solverConfigsJSON(); return OPTION_FINISH; } if (argv[i] == "--solver-json") { ++i; if (i == argc) { _log << "Argument required for --solver-json" << endl; return OPTION_ERROR; } if (!solver.empty() && solver != argv[i]) { _log << "Only one --solver-json option allowed" << endl; return OPTION_ERROR; } solver = argv[i]; const SolverConfig& sc = _solverConfigs.config(solver); cout << sc.toJSON(_solverConfigs); return OPTION_FINISH; } if (argv[i] == "--config-dirs") { GCLock lock; cout << "{\n"; cout << " \"globalConfigFile\" : \"" << Printer::escapeStringLit(FileUtils::global_config_file()) << "\",\n"; cout << " \"userConfigFile\" : \"" << Printer::escapeStringLit(FileUtils::user_config_file()) << "\",\n"; cout << " \"userSolverConfigDir\" : \"" << Printer::escapeStringLit(FileUtils::user_config_dir()) << "/solvers\",\n"; cout << " \"mznStdlibDir\" : \"" << Printer::escapeStringLit(_solverConfigs.mznlibDir()) << "\"\n"; cout << "}\n"; return OPTION_FINISH; } if (argv[i] == "--time-limit") { ++i; if (i == argc) { _log << "Argument required for --time-limit" << endl; return OPTION_ERROR; } flagOverallTimeLimit = atoi(argv[i].c_str()); } else if (argv[i] == "--solver") { ++i; if (i == argc) { _log << "Argument required for --solver" << endl; return OPTION_ERROR; } if (!solver.empty() && solver != argv[i]) { _log << "Only one --solver option allowed" << endl; return OPTION_ERROR; } solver = argv[i]; } else if (argv[i] == "-c" || argv[i] == "--compile") { _isMzn2fzn = true; } else if (argv[i] == "-v" || argv[i] == "--verbose" || argv[i] == "-l") { flagVerbose = true; flagCompilerVerbose = true; } else if (argv[i] == "--verbose-compilation") { flagCompilerVerbose = true; } else if (argv[i] == "-s" || argv[i] == "--statistics") { flagStatistics = true; flagCompilerStatistics = true; } else if (argv[i] == "--compiler-statistics") { flagCompilerStatistics = true; } else { if ((argv[i] == "--fzn-cmd" || argv[i] == "--flatzinc-cmd") && solver.empty()) { solver = "org.minizinc.mzn-fzn"; } if (argv[i] == "--compile-solution-checker") { compileSolutionChecker = true; } if (argv[i] == "--ozn-file") { flagIsSolns2out = true; } argv[j++] = argv[i]; } } argv.resize(j); argc = j; if ((mzn2fzn_exe || compileSolutionChecker) && solver.empty()) { solver = "org.minizinc.mzn-fzn"; } if (flagVerbose) { argv.emplace_back("--verbose-solving"); argc++; } if (flagStatistics) { argv.emplace_back("--solver-statistics"); argc++; } _flt.setFlagOutputByDefault(ifMzn2Fzn()); bool isMznMzn = false; if (!flagIsSolns2out) { try { const SolverConfig& sc = _solverConfigs.config(solver); string solverId; if (sc.executable().empty()) { solverId = sc.id(); } else if (sc.supportsMzn()) { solverId = "org.minizinc.mzn-mzn"; } else if (sc.supportsFzn()) { solverId = "org.minizinc.mzn-fzn"; } else if (sc.supportsNL()) { solverId = "org.minizinc.mzn-nl"; } else { _log << "Selected solver does not support MiniZinc, FlatZinc or NL input." << endl; return OPTION_ERROR; } // Check support of -a and -i for (const auto& flag : sc.stdFlags()) { if (flag == "-a") { _supportsA = true; } else if (flag == "-i") { _supportsI = true; } } for (auto* it : get_global_solver_registry()->getSolverFactories()) { if (it->getId() == solverId) { /// TODO: also check version (currently assumes all ids are unique) _sf = it; delete _siOpt; _siOpt = _sf->createOptions(); if (!sc.executable().empty() || solverId == "org.minizinc.mzn-fzn" || solverId == "org.minizinc.mzn-nl") { std::vector acceptedFlags; for (const auto& sf : sc.stdFlags()) { acceptedFlags.push_back(MZNFZNSolverFlag::std(sf)); } for (const auto& ef : sc.extraFlags()) { acceptedFlags.push_back(MZNFZNSolverFlag::extra(ef)); } // Collect arguments required for underlying exe vector fzn_mzn_flags; if (sc.needsStdlibDir()) { fzn_mzn_flags.emplace_back("--stdlib-dir"); fzn_mzn_flags.push_back(FileUtils::share_directory()); } if (sc.needsMznExecutable()) { fzn_mzn_flags.emplace_back("--minizinc-exe"); fzn_mzn_flags.push_back(FileUtils::progpath() + "/" + _executableName); } if (sc.supportsMzn()) { isMznMzn = true; MZNSolverFactory::setAcceptedFlags(_siOpt, acceptedFlags); std::vector additionalArgs_s; additionalArgs_s.emplace_back("-m"); if (!sc.executableResolved().empty()) { additionalArgs_s.push_back(sc.executableResolved()); } else { additionalArgs_s.push_back(sc.executable()); } if (!fzn_mzn_flags.empty()) { add_flags("--mzn-flag", fzn_mzn_flags, additionalArgs_s); } // This should maybe be moved to fill in fzn_mzn_flags when // --find-muses is implemented (these arguments will be passed // through to the subsolver of findMUS) if (!sc.mznlib().empty()) { if (sc.mznlib().substr(0, 2) == "-G") { additionalArgs_s.emplace_back("--mzn-flag"); additionalArgs_s.push_back(sc.mznlib()); } else { additionalArgs_s.emplace_back("--mzn-flag"); additionalArgs_s.emplace_back("-I"); additionalArgs_s.emplace_back("--mzn-flag"); std::string _mznlib; if (!sc.mznlibResolved().empty()) { _mznlib = sc.mznlibResolved(); } else { _mznlib = sc.mznlib(); } additionalArgs_s.push_back(_mznlib); } } for (i = 0; i < additionalArgs_s.size(); ++i) { bool success = _sf->processOption(_siOpt, i, additionalArgs_s); if (!success) { _log << "Solver backend " << solverId << " does not recognise option " << additionalArgs_s[i] << "." << endl; return OPTION_ERROR; } } } else { // supports fzn or nl std::vector additionalArgs; if (sc.supportsFzn()) { FZNSolverFactory::setAcceptedFlags(_siOpt, acceptedFlags); additionalArgs.emplace_back("--fzn-cmd"); } else { // supports nl additionalArgs.emplace_back("--nl-cmd"); } if (!sc.executableResolved().empty()) { additionalArgs.push_back(sc.executableResolved()); } else { additionalArgs.push_back(sc.executable()); } if (!fzn_mzn_flags.empty()) { if (sc.supportsFzn()) { add_flags("--fzn-flag", fzn_mzn_flags, additionalArgs); } else { add_flags("--nl-flag", fzn_mzn_flags, additionalArgs); } } if (sc.needsPathsFile()) { // Instruct flattener to hold onto paths int i = 0; vector args{"--keep-paths"}; _flt.processOption(i, args); // Instruct FznSolverInstance to write a path file // and pass it to the executable with --paths arg additionalArgs.emplace_back("--fzn-needs-paths"); } if (!sc.needsSolns2Out()) { additionalArgs.emplace_back("--fzn-output-passthrough"); } int i = 0; for (i = 0; i < additionalArgs.size(); ++i) { bool success = _sf->processOption(_siOpt, i, additionalArgs); if (!success) { _log << "Solver backend " << solverId << " does not recognise option " << additionalArgs[i] << "." << endl; return OPTION_ERROR; } } } } if (!sc.mznlib().empty()) { if (sc.mznlib().substr(0, 2) == "-G") { std::vector additionalArgs({sc.mznlib()}); int i = 0; if (!_flt.processOption(i, additionalArgs)) { _log << "Flattener does not recognise option " << sc.mznlib() << endl; return OPTION_ERROR; } } else { std::vector additionalArgs(2); additionalArgs[0] = "-I"; if (!sc.mznlibResolved().empty()) { additionalArgs[1] = sc.mznlibResolved(); } else { additionalArgs[1] = sc.mznlib(); } int i = 0; if (!_flt.processOption(i, additionalArgs)) { _log << "Flattener does not recognise option -I." << endl; return OPTION_ERROR; } } } auto reducedDefaultFlags = reducedSolverDefaults.find(sc.id()); const auto& defaultFlags = reducedDefaultFlags == reducedSolverDefaults.end() ? sc.defaultFlags() : reducedDefaultFlags->second; if (!defaultFlags.empty()) { std::vector addedArgs; addedArgs.push_back(argv[0]); // excutable name for (const auto& df : defaultFlags) { addedArgs.push_back(df); } for (int i = 1; i < argv.size(); i++) { addedArgs.push_back(argv[i]); } argv = addedArgs; argc = addedArgs.size(); } break; } } } catch (ConfigException& e) { _log << "Config exception: " << e.msg() << endl; return OPTION_ERROR; } if (_sf == nullptr) { _log << "Solver " << solver << " not found." << endl; return OPTION_ERROR; } CLOParser cop(i, argv); // For special handling of -a, -i and -n-i for (i = 1; i < argc; ++i) { if (argv[i] == "--push-working-directory") { i++; workingDirs.push_back(argv[i]); } else if (argv[i] == "--pop-working-directory") { workingDirs.pop_back(); } else if (!ifMzn2Fzn() ? s2out.processOption(i, argv, workingDirs.back()) : false) { // NOLINT: Allow repeated empty if // Processed by Solns2Out } else if ((!isMznMzn || _isMzn2fzn) && _flt.processOption(i, argv, workingDirs.back())) { // NOLINT: Allow repeated empty if // Processed by Flattener } else if ((_supportsA || _supportsI) && cop.get("-a --all --all-solns --all-solutions")) { _flagAllSatisfaction = true; _flagIntermediate = true; } else if ((_supportsA || _supportsI) && cop.get("-i --intermediate --intermediate-solutions")) { _flagIntermediate = true; } else if (cop.getOption("-n-i --no-intermediate --no-intermediate-solutions")) { _flagIntermediate = false; } else if (_supportsA && cop.get("--all-satisfaction")) { _flagAllSatisfaction = true; } else if (cop.get("--disable-all-satisfaction")) { _flagAllSatisfaction = false; } else if (_sf != nullptr && _sf->processOption(_siOpt, i, argv)) { // NOLINT: Allow repeated empty if // Processed by Solver Factory } else { std::string executable_name(argv[0]); executable_name = executable_name.substr(executable_name.find_last_of("/\\") + 1); _log << executable_name << ": Unrecognized option or bad format `" << argv[i] << "'" << endl; return OPTION_ERROR; } } return OPTION_OK; } for (i = 1; i < argc; ++i) { if (argv[i] == "--push-working-directory") { i++; workingDirs.push_back(argv[i]); } else if (argv[i] == "--pop-working-directory") { workingDirs.pop_back(); } else if (s2out.processOption(i, argv, workingDirs.back())) { // Processed by Solns2Out } else { std::string executable_name(argv[0]); executable_name = executable_name.substr(executable_name.find_last_of("/\\") + 1); _log << executable_name << ": Unrecognized option or bad format `" << argv[i] << "'" << endl; return OPTION_ERROR; } } return OPTION_OK; } void MznSolver::flatten(const std::string& modelString, const std::string& modelName) { _flt.setFlagVerbose(flagCompilerVerbose); _flt.setFlagStatistics(flagCompilerStatistics); _flt.setFlagTimelimit(flagOverallTimeLimit); _flt.flatten(modelString, modelName); } SolverInstance::Status MznSolver::solve() { { // To be able to clean up flatzinc after PrcessFlt() GCLock lock; getSI()->processFlatZinc(); } SolverInstance::Status status = getSI()->solve(); GCLock lock; if (!getSI()->getSolns2Out()->fStatusPrinted) { getSI()->getSolns2Out()->evalStatus(status); } if (_siOpt->printStatistics) { getSI()->printStatistics(); } if (flagStatistics) { getSI()->getSolns2Out()->printStatistics(_os); } return status; } SolverInstance::Status MznSolver::run(const std::vector& args0, const std::string& model, const std::string& exeName, const std::string& modelName) { using namespace std::chrono; steady_clock::time_point startTime = steady_clock::now(); std::vector args = {exeName}; for (const auto& a : args0) { args.push_back(a); } switch (processOptions(args)) { case OPTION_FINISH: return SolverInstance::NONE; case OPTION_ERROR: printUsage(); _os << "More info with \"" << exeName << " --help\"\n"; return SolverInstance::ERROR; case OPTION_OK: break; } if (flagIsSolns2out && (ifMzn2Fzn() || _sf == nullptr || _sf->getId() != "org.minizinc.mzn-mzn") && !_flt.hasInputFiles() && model.empty()) { // We are in solns2out mode while (std::cin.good()) { string line; getline(std::cin, line); line += '\n'; // need eols as in t=raw stream s2out.feedRawDataChunk(line.c_str()); } return SolverInstance::NONE; } if (!ifMzn2Fzn() && _sf->getId() == "org.minizinc.mzn-mzn") { Env env; _si = _sf->createSI(env, _log, _siOpt); _si->setSolns2Out(&s2out); { // To be able to clean up flatzinc after PrcessFlt() GCLock lock; _si->options()->verbose = getFlagVerbose(); _si->options()->printStatistics = getFlagStatistics(); } _si->solve(); return SolverInstance::NONE; } try { flatten(model, modelName); } catch (Timeout&) { s2out.evalStatus(SolverInstance::UNKNOWN); return SolverInstance::UNKNOWN; } if (!ifMzn2Fzn() && flagOverallTimeLimit != 0) { steady_clock::time_point afterFlattening = steady_clock::now(); milliseconds passed = duration_cast(afterFlattening - startTime); milliseconds time_limit(flagOverallTimeLimit); if (passed > time_limit) { s2out.evalStatus(getFltStatus()); return SolverInstance::UNKNOWN; } int time_left = (time_limit - passed).count(); std::vector timeoutArgs(2); timeoutArgs[0] = "--solver-time-limit"; std::ostringstream oss; oss << time_left; timeoutArgs[1] = oss.str(); int i = 0; _sf->processOption(_siOpt, i, timeoutArgs); } if (SolverInstance::UNKNOWN == getFltStatus()) { if (!ifMzn2Fzn()) { // only then // Special handling of basic stdFlags auto* solve_item = _flt.getEnv()->model()->solveItem(); bool is_sat_problem = solve_item != nullptr ? solve_item->st() == SolveI::SolveType::ST_SAT : true; if (is_sat_problem && _flagAllSatisfaction) { if (_supportsA) { std::vector a_flag = {"-a"}; int i = 0; _sf->processOption(_siOpt, i, a_flag); } else { // Solver does not support -a _log << "WARNING: Solver does not support all solutions for satisfaction problems." << endl; } } if (!is_sat_problem && _flagIntermediate) { std::vector i_flag(1); i_flag[0] = _supportsI ? "-i" : "-a"; // Fallback to -a if -i is not supported int i = 0; _sf->processOption(_siOpt, i, i_flag); } // GCLock lock; // better locally, to enable cleanup after ProcessFlt() addSolverInterface(); return solve(); } return SolverInstance::NONE; } if (!ifMzn2Fzn()) { s2out.evalStatus(getFltStatus()); } return getFltStatus(); // Add evalOutput() here? TODO } libminizinc-2.5.3/lib/flattener.cpp0000644000175000017500000011141413757304533015740 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was ! distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* A basic mzn2fzn wrapper, can be used as a plugin */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #ifdef HAS_GECODE #include #include #endif using namespace std; using namespace MiniZinc; void Flattener::printVersion(ostream& os) { os << "MiniZinc to FlatZinc converter, version " << MZN_VERSION_MAJOR << "." << MZN_VERSION_MINOR << "." << MZN_VERSION_PATCH; if (!std::string(MZN_BUILD_REF).empty()) { os << ", build " << MZN_BUILD_REF; } os << std::endl; os << "Copyright (C) 2014-" << string(__DATE__).substr(7, 4) << " Monash University, NICTA, Data61" << std::endl; } void Flattener::printHelp(ostream& os) const { os << std::endl << "Flattener input options:" << std::endl << " --instance-check-only\n Check the model instance (including data) for errors, but " "do " "not\n convert to FlatZinc." << std::endl << " -e, --model-check-only\n Check the model (without requiring data) for errors, but " "do " "not\n convert to FlatZinc." << std::endl << " --model-interface-only\n Only extract parameters and output variables." << std::endl << " --model-types-only\n Only output variable (enum) type information." << std::endl << " --no-optimize\n Do not optimize the FlatZinc" << std::endl << " --no-chain-compression\n Do not simplify chains of implication constraints." << std::endl << " -m , --model \n File named is the model." << std::endl << " -d , --data \n File named contains data used by the model." << std::endl << " -D , --cmdline-data \n Include the given data assignment in the model." << std::endl << " --stdlib-dir \n Path to MiniZinc standard library directory" << std::endl << " -G , --globals-dir , --mzn-globals-dir \n Search for included " "globals " "in /." << std::endl << " -, --input-from-stdin\n Read problem from standard input" << std::endl << " -I , --search-dir \n Additionally search for included files in ." << std::endl << " -D \"fMIPdomains=true\"\n Switch on MIPDomain Unification" << std::endl << " --MIPDMaxIntvEE \n MIPD: max integer domain subinterval length to enforce " "equality encoding, default " << _optMIPDmaxIntvEE << std::endl << " --MIPDMaxDensEE \n MIPD: max domain cardinality to N subintervals ratio\n to " "enforce equality encoding, default " << _optMIPDmaxDensEE << ", either condition triggers" << std::endl << " --only-range-domains\n When no MIPdomains: all domains contiguous, holes replaced " "by " "inequalities" << std::endl << " --allow-multiple-assignments\n Allow multiple assignments to the same variable " "(e.g. " "in dzn)" << std::endl << " --no-half-reifications\n Only use fully reified constraints, even when a half " "reified constraint is defined." << std::endl << " --compile-solution-checker .mzc.mzn\n Compile solution checker model" << std::endl << std::endl << "Flattener two-pass options:" << std::endl << " --two-pass\n Flatten twice to make better flattening decisions for the target" << std::endl #ifdef HAS_GECODE << " --use-gecode\n Perform root-node-propagation with Gecode (adds --two-pass)" << std::endl << " --shave\n Probe bounds of all variables at the root node (adds --use-gecode)" << std::endl << " --sac\n Probe values of all variables at the root node (adds --use-gecode)" << std::endl << " --pre-passes \n Number of times to apply shave/sac pass (0 = fixed-point, 1 = " "default)" << std::endl #endif << " -O\n Two-pass optimisation levels:" << std::endl << " -O0: Disable optimize (--no-optimize) -O1: Single pass (default)" << std::endl << " -O2: Same as: --two-pass" #ifdef HAS_GECODE << " -O3: Same as: --use-gecode" << std::endl << " -O4: Same as: --shave -O5: Same as: --sac" << std::endl #else << "\n -O3,4,5: Disabled [Requires MiniZinc with built-in Gecode support]" << std::endl #endif << " -g\n Debug mode: Forces -O0 and records all domain changes as constraints instead " "of " "applying them" << std::endl << std::endl; os << "Flattener output options:" << std::endl << " --no-output-ozn, -O-\n Do not output ozn file" << std::endl << " --output-base \n Base name for output files" << std::endl << (_fOutputByDefault ? " -o , --fzn , --output-to-file , --output-fzn-to-file \n" : " --fzn , --output-fzn-to-file \n") << " Filename for generated FlatZinc output" << std::endl << " --ozn, --output-ozn-to-file \n Filename for model output specification " "(--ozn- " "for none)" << std::endl << " --keep-paths\n Don't remove path annotations from FlatZinc" << std::endl << " --output-paths\n Output a symbol table (.paths file)" << std::endl << " --output-paths-to-file \n Output a symbol table (.paths file) to " << std::endl << " --output-detailed-timing\n Output detailed profiling information of compilation time" << std::endl << " --output-to-stdout, --output-fzn-to-stdout\n Print generated FlatZinc to standard " "output" << std::endl << " --output-ozn-to-stdout\n Print model output specification to standard output" << std::endl << " --output-paths-to-stdout\n Output symbol table to standard output" << std::endl << " --output-mode \n Create output according to output item " "(default), or output compatible\n with dzn or json format, or for solution checking" << std::endl << " --output-objective\n Print value of objective function in dzn or json output" << std::endl << " --output-output-item\n Print the output item as a string in the dzn or json output" << std::endl << " -Werror\n Turn warnings into errors" << std::endl; } bool Flattener::processOption(int& i, std::vector& argv, const std::string& workingDir) { CLOParser cop(i, argv); string buffer; int intBuffer; if (cop.getOption("-I --search-dir", &buffer)) { _includePaths.push_back(FileUtils::file_path(buffer + "/", workingDir)); } else if (cop.getOption("--no-typecheck")) { _flags.typecheck = false; } else if (cop.getOption("--instance-check-only")) { _flags.instanceCheckOnly = true; } else if (cop.getOption("-e --model-check-only")) { _flags.modelCheckOnly = true; } else if (cop.getOption("--model-interface-only")) { _flags.modelInterfaceOnly = true; } else if (cop.getOption("--model-types-only")) { _flags.modelTypesOnly = true; } else if (cop.getOption("-v --verbose")) { _flags.verbose = true; } else if (cop.getOption("--newfzn")) { _flags.newfzn = true; } else if (cop.getOption("--no-optimize --no-optimise")) { _flags.optimize = false; } else if (cop.getOption("--no-chain-compression")) { _flags.chainCompression = false; } else if (cop.getOption("--no-output-ozn -O-")) { _flags.noOutputOzn = true; } else if (cop.getOption("--output-base", &_flagOutputBase)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption(_fOutputByDefault ? "-o --fzn --output-to-file --output-fzn-to-file" : "--fzn --output-fzn-to-file", &buffer)) { _flagOutputFzn = FileUtils::file_path(buffer, workingDir); } else if (cop.getOption("--output-paths")) { _fopts.collectMznPaths = true; } else if (cop.getOption("--output-paths-to-file", &buffer)) { _flagOutputPaths = FileUtils::file_path(buffer, workingDir); _fopts.collectMznPaths = true; } else if (cop.getOption("--output-to-stdout --output-fzn-to-stdout")) { _flags.outputFznStdout = true; } else if (cop.getOption("--output-ozn-to-stdout")) { _flags.outputOznStdout = true; } else if (cop.getOption("--output-paths-to-stdout")) { _fopts.collectMznPaths = true; _flags.outputPathsStdout = true; } else if (cop.getOption("--output-detailed-timing")) { _fopts.detailedTiming = true; } else if (cop.getOption("--output-mode", &buffer)) { if (buffer == "dzn") { _flagOutputMode = FlatteningOptions::OUTPUT_DZN; } else if (buffer == "json") { _flagOutputMode = FlatteningOptions::OUTPUT_JSON; } else if (buffer == "item") { _flagOutputMode = FlatteningOptions::OUTPUT_ITEM; } else if (buffer == "checker") { _flagOutputMode = FlatteningOptions::OUTPUT_CHECKER; } else { return false; } } else if (cop.getOption("--output-objective")) { _flags.outputObjective = true; } else if (cop.getOption("--output-output-item")) { _flags.outputOutputItem = true; } else if (cop.getOption("- --input-from-stdin")) { _flags.stdinInput = true; } else if (cop.getOption("-d --data", &buffer)) { auto last_dot = buffer.find_last_of('.'); if (last_dot == string::npos) { return false; } auto extension = buffer.substr(last_dot, string::npos); if (extension != ".dzn" && extension != ".json") { return false; } _datafiles.push_back(FileUtils::file_path(buffer, workingDir)); } else if (cop.getOption("--stdlib-dir", &buffer)) { _stdLibDir = FileUtils::file_path(buffer, workingDir); } else if (cop.getOption("-G --globals-dir --mzn-globals-dir", &_globalsDir)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("-D --cmdline-data", &buffer)) { _datafiles.push_back("cmd:/" + buffer); } else if (cop.getOption("--allow-unbounded-vars")) { _flags.allowUnboundedVars = true; } else if (cop.getOption("--only-range-domains")) { _flags.onlyRangeDomains = true; } else if (cop.getOption("--no-MIPdomains")) { // internal _flags.noMIPdomains = true; } else if (cop.getOption("--MIPDMaxIntvEE", &_optMIPDmaxIntvEE)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("--MIPDMaxDensEE", &_optMIPDmaxDensEE)) { // NOLINT: Allow repeated empty if // Parsed by reference } else if (cop.getOption("-Werror")) { _flags.werror = true; } else if (cop.getOption("--use-gecode")) { #ifdef HAS_GECODE _flags.twoPass = true; _flags.gecode = true; #else _log << "warning: Gecode not available. Ignoring '--use-gecode'\n"; #endif } else if (cop.getOption("--sac")) { #ifdef HAS_GECODE _flags.twoPass = true; _flags.gecode = true; _flags.sac = true; #else _log << "warning: Gecode not available. Ignoring '--sac'\n"; #endif } else if (cop.getOption("--shave")) { #ifdef HAS_GECODE _flags.twoPass = true; _flags.gecode = true; _flags.shave = true; #else _log << "warning: Gecode not available. Ignoring '--shave'\n"; #endif } else if (cop.getOption("--two-pass")) { _flags.twoPass = true; } else if (cop.getOption("--pre-passes", &intBuffer)) { if (intBuffer >= 0) { _flagPrePasses = static_cast(intBuffer); } } else if (cop.getOption("-O", &intBuffer)) { switch (intBuffer) { case 0: { _flags.optimize = false; break; } case 1: { // Default settings break; } case 2: { _flags.twoPass = true; break; } case 3: { _flags.twoPass = true; _flags.gecode = true; break; } case 4: { _flags.twoPass = true; _flags.gecode = true; _flags.shave = true; break; } case 5: { _flags.twoPass = true; _flags.gecode = true; _flags.sac = true; break; } default: { _log << "% Error: Unsupported optimisation level, cannot process -O" << intBuffer << "." << std::endl; return false; } } // ozn options must be after the -O optimisation options } else if (cop.getOption("--ozn --output-ozn-to-file", &buffer)) { _flagOutputOzn = FileUtils::file_path(buffer, workingDir); } else if (cop.getOption("-g")) { _flags.optimize = false; _flags.twoPass = false; _flags.gecode = false; _flags.shave = false; _flags.sac = false; _fopts.recordDomainChanges = true; } else if (string(argv[i]) == "--keep-paths") { _flags.keepMznPaths = true; _fopts.collectMznPaths = true; } else if (string(argv[i]) == "--only-toplevel-presolve") { _fopts.onlyToplevelPaths = true; } else if (cop.getOption("--allow-multiple-assignments")) { _flags.allowMultiAssign = true; } else if (cop.getOption("--no-half-reifications")) { _fopts.enableHalfReification = false; } else if (string(argv[i]) == "--input-is-flatzinc") { _isFlatzinc = true; } else if (cop.getOption("--compile-solution-checker", &buffer)) { if (buffer.length() >= 8 && buffer.substr(buffer.length() - 8, string::npos) == ".mzc.mzn") { _flags.compileSolutionCheckModel = true; _flags.modelCheckOnly = true; _filenames.push_back(FileUtils::file_path(buffer, workingDir)); } else { _log << "Error: solution checker model must have extension .mzc.mzn" << std::endl; return false; } } else if (cop.getOption("-m --model", &buffer)) { if (buffer.length() <= 4) { return false; } auto extension = buffer.substr(buffer.length() - 4, string::npos); auto isChecker = buffer.length() > 8 && buffer.substr(buffer.length() - 8, string::npos) == ".mzc.mzn"; if ((extension == ".mzn" && !isChecker) || extension == ".fzn") { if (extension == ".fzn") { _isFlatzinc = true; if (_fOutputByDefault) { // mzn2fzn mode return false; } } _filenames.push_back(FileUtils::file_path(buffer, workingDir)); return true; } _log << "Error: model must have extension .mzn (or .fzn)" << std::endl; return false; } else { std::string input_file(argv[i]); if (input_file.length() <= 4) { return false; } size_t last_dot = input_file.find_last_of('.'); if (last_dot == string::npos) { return false; } std::string extension = input_file.substr(last_dot, string::npos); if (extension == ".mzc" || (input_file.length() >= 8 && input_file.substr(input_file.length() - 8, string::npos) == ".mzc.mzn")) { _flagSolutionCheckModel = input_file; } else if (extension == ".mzn" || extension == ".fzn") { if (extension == ".fzn") { _isFlatzinc = true; if (_fOutputByDefault) { // mzn2fzn mode return false; } } _filenames.push_back(input_file); } else if (extension == ".dzn" || extension == ".json") { _datafiles.push_back(input_file); } else { if (_fOutputByDefault) { _log << "Error: cannot handle file extension " << extension << "." << std::endl; } return false; } } return true; } Flattener::Flattener(std::ostream& os, std::ostream& log, std::string stdlibDir) : _os(os), _log(log), _stdLibDir(std::move(stdlibDir)) {} Flattener::~Flattener() { if (_pEnv != nullptr) { // ??? TODO if (_isFlatzinc) { _pEnv->swap(); } } } Env* Flattener::multiPassFlatten(const vector >& passes) { Env& e = *getEnv(); Env* pre_env = &e; size_t npasses = passes.size(); pre_env->envi().finalPassNumber = static_cast(npasses); Timer starttime; bool verbose = false; for (unsigned int i = 0; i < passes.size(); i++) { pre_env->envi().currentPassNumber = i; if (verbose) { _log << "Start pass " << i << ":\n"; } Env* out_env = passes[i]->run(pre_env, _log); if (out_env == nullptr) { return nullptr; } if (pre_env != &e && pre_env != out_env) { delete pre_env; } pre_env = out_env; if (verbose) { _log << "Finish pass " << i << ": " << starttime.stoptime() << "\n"; } } return pre_env; } class FlattenTimeout { public: FlattenTimeout(unsigned long long int t) { GC::setTimeout(t); } ~FlattenTimeout() { GC::setTimeout(0); } }; void Flattener::flatten(const std::string& modelString, const std::string& modelName) { FlattenTimeout flatten_timeout(_fopts.timeout); Timer flatten_time; _starttime.reset(); if (_flags.verbose) { printVersion(_log); } if (_filenames.empty() && !_flagSolutionCheckModel.empty()) { // Compile solution check model as if it were a normal model _filenames.push_back(_flagSolutionCheckModel); _flagSolutionCheckModel = ""; } if (_filenames.empty() && !_flags.stdinInput && modelString.empty()) { throw Error("Error: no model file given."); } if (_stdLibDir.empty()) { throw Error( "Error: unknown minizinc standard library directory.\n" "Specify --stdlib-dir on the command line or set the\n" "MZN_STDLIB_DIR environment variable."); } if (!_globalsDir.empty()) { _includePaths.insert(_includePaths.begin(), _stdLibDir + "/" + _globalsDir + "/"); } _includePaths.push_back(_stdLibDir + "/std/"); for (auto& includePath : _includePaths) { if (!FileUtils::directory_exists(includePath)) { throw Error("Cannot access include directory " + includePath); } } if (_flagOutputBase.empty()) { if (_filenames.empty()) { _flagOutputBase = "mznout"; } else { _flagOutputBase = _filenames[0].substr(0, _filenames[0].length() - 4); } } if (_filenames.end() != find(_filenames.begin(), _filenames.end(), _flagOutputFzn) || _datafiles.end() != find(_datafiles.begin(), _datafiles.end(), _flagOutputFzn)) { _log << " WARNING: fzn filename '" << _flagOutputFzn << "' matches an input file, ignoring." << endl; _flagOutputFzn = ""; } if (_filenames.end() != find(_filenames.begin(), _filenames.end(), _flagOutputOzn) || _datafiles.end() != find(_datafiles.begin(), _datafiles.end(), _flagOutputOzn)) { _log << " WARNING: ozn filename '" << _flagOutputOzn << "' matches an input file, ignoring." << endl; _flagOutputOzn = ""; } if (_fOutputByDefault) { if (_flagOutputFzn.empty()) { _flagOutputFzn = _flagOutputBase + ".fzn"; } if (_flagOutputPaths.empty() && _fopts.collectMznPaths) { _flagOutputPaths = _flagOutputBase + ".paths"; } if (_flagOutputOzn.empty() && !_flags.noOutputOzn) { _flagOutputOzn = _flagOutputBase + ".ozn"; } } { std::stringstream errstream; Model* m; _pEnv.reset(new Env(nullptr, _os, _log)); Env* env = getEnv(); if (!_flags.compileSolutionCheckModel && !_flagSolutionCheckModel.empty()) { // Extract variables to check from solution check model if (_flags.verbose) { _log << "Parsing solution checker model " << _flagSolutionCheckModel << " ..." << endl; } bool isCompressedChecker = _flagSolutionCheckModel.size() >= 4 && _flagSolutionCheckModel.substr(_flagSolutionCheckModel.size() - 4) == ".mzc"; std::vector smm_model({_flagSolutionCheckModel}); Model* smm = parse(*env, smm_model, _datafiles, "", "", _includePaths, _isFlatzinc, false, false, _flags.verbose, errstream); if (_flags.verbose) { _log << " done parsing (" << _starttime.stoptime() << ")" << std::endl; } if (smm != nullptr) { _log << errstream.str(); errstream.str(""); std::ostringstream smm_oss; std::ostringstream smm_stats_oss; Printer p(smm_oss, 0, false); p.print(smm); Env smm_env(smm); GCLock lock; vector typeErrors; try { MiniZinc::typecheck(smm_env, smm, typeErrors, true, false, true); if (!typeErrors.empty()) { if (!isCompressedChecker) { for (auto& typeError : typeErrors) { if (_flags.verbose) { _log << std::endl; } _log << typeError.loc() << ":" << std::endl; _log << typeError.what() << ": " << typeError.msg() << std::endl; } } throw Error("multiple type errors"); } for (auto& i : *smm) { if (auto* vdi = i->dynamicCast()) { if (vdi->e()->e() == nullptr) { env->envi().checkVars.emplace_back(vdi->e()); } else if (vdi->e()->ann().contains(constants().ann.rhs_from_assignment)) { smm_stats_oss << *vdi; } } } smm->compact(); std::string smm_compressed = FileUtils::encode_base64(FileUtils::deflate_string(smm_oss.str())); auto* ti = new TypeInst(Location().introduce(), Type::parstring(), nullptr); auto* checkString = new VarDecl(Location().introduce(), ti, ASTString("_mzn_solution_checker"), new StringLit(Location().introduce(), smm_compressed)); auto* checkStringI = new VarDeclI(Location().introduce(), checkString); env->output()->addItem(checkStringI); for (FunctionIterator it = smm->functions().begin(); it != smm->functions().end(); ++it) { if (it->id() == "checkStatistics") { smm_stats_oss << *it; smm_stats_oss << "int: mzn_stats_failures;\n"; smm_stats_oss << "int: mzn_stats_solutions;\n"; smm_stats_oss << "int: mzn_stats_nodes;\n"; smm_stats_oss << "int: mzn_stats_time;\n"; smm_stats_oss << "output " "[checkStatistics(mzn_stats_failures,mzn_stats_solutions,mzn_stats_" "nodes,mzn_stats_time)];\n"; std::string smm_stats_compressed = FileUtils::encode_base64(FileUtils::deflate_string(smm_stats_oss.str())); auto* ti = new TypeInst(Location().introduce(), Type::parstring(), nullptr); auto* checkStatsString = new VarDecl(Location().introduce(), ti, ASTString("_mzn_stats_checker"), new StringLit(Location().introduce(), smm_stats_compressed)); auto* checkStatsStringI = new VarDeclI(Location().introduce(), checkStatsString); env->output()->addItem(checkStatsStringI); } } } catch (TypeError& e) { if (isCompressedChecker) { _log << "Warning: type error in solution checker model\n"; } else { throw; } } } else { if (isCompressedChecker) { _log << "Warning: syntax error in solution checker model\n"; } else { _log << errstream.str(); throw Error("parse error"); } } } if (_flags.compileSolutionCheckModel) { if (!modelString.empty()) { throw Error("Cannot compile solution checker model with additional model inputs."); } if (_flags.stdinInput) { throw Error( "Cannot compile solution checker model with additional model from standard input."); } if (_filenames.size() != 1) { throw Error("Cannot compile solution checker model with more than one model given."); } } if (!_flagSolutionCheckModel.empty() && _filenames.empty()) { throw Error("Cannot run solution checker without model."); } std::string modelText = modelString; if (_flags.stdinInput) { std::string input = std::string(istreambuf_iterator(std::cin), istreambuf_iterator()); modelText += input; } if (_flags.verbose) { _log << "Parsing file(s) "; for (int i = 0; i < _filenames.size(); ++i) { _log << (i == 0 ? "" : ", '") << _filenames[i] << '\''; } for (const auto& sFln : _datafiles) { _log << ", '" << sFln << '\''; } _log << " ..." << std::endl; } errstream.str(""); m = parse(*env, _filenames, _datafiles, modelText, modelName.empty() ? "stdin" : modelName, _includePaths, _isFlatzinc, false, false, _flags.verbose, errstream); if (!_globalsDir.empty()) { _includePaths.erase(_includePaths.begin()); } if (m == nullptr) { throw Error(errstream.str()); } _log << errstream.str(); env->model(m); if (_flags.typecheck) { if (_flags.verbose) { _log << " done parsing (" << _starttime.stoptime() << ")" << std::endl; } if (_flags.instanceCheckOnly || _flags.modelCheckOnly || _flags.modelInterfaceOnly || _flags.modelTypesOnly) { std::ostringstream compiledSolutionCheckModel; if (_flags.compileSolutionCheckModel) { Printer p(compiledSolutionCheckModel, 0); p.print(m); } GCLock lock; vector typeErrors; MiniZinc::typecheck( *env, m, typeErrors, _flags.modelTypesOnly || _flags.modelInterfaceOnly || _flags.modelCheckOnly, _flags.allowMultiAssign); if (!typeErrors.empty()) { for (auto& typeError : typeErrors) { if (_flags.verbose) { _log << std::endl; } _log << typeError.loc() << ":" << std::endl; _log << typeError.what() << ": " << typeError.msg() << std::endl; } throw Error("multiple type errors"); } if (_flags.modelInterfaceOnly) { MiniZinc::output_model_interface(*env, m, _os, _includePaths); } if (_flags.modelTypesOnly) { MiniZinc::output_model_variable_types(*env, m, _os, _includePaths); } if (_flags.compileSolutionCheckModel) { std::string mzc(FileUtils::deflate_string(compiledSolutionCheckModel.str())); mzc = FileUtils::encode_base64(mzc); std::string mzc_filename = _filenames[0].substr(0, _filenames[0].size() - 4); if (_flags.verbose) { _log << "Write solution checker to " << mzc_filename << "\n"; } std::ofstream mzc_f(FILE_PATH(mzc_filename)); mzc_f << mzc; mzc_f.close(); } status = SolverInstance::NONE; } else { if (_isFlatzinc) { GCLock lock; vector typeErrors; MiniZinc::typecheck(*env, m, typeErrors, _flags.modelCheckOnly || _flags.modelInterfaceOnly, _flags.allowMultiAssign, true); if (!typeErrors.empty()) { for (auto& typeError : typeErrors) { if (_flags.verbose) { _log << std::endl; } _log << typeError.loc() << ":" << std::endl; _log << typeError.what() << ": " << typeError.msg() << std::endl; } throw Error("multiple type errors"); } MiniZinc::register_builtins(*env); env->swap(); populate_output(*env); } else { if (_flags.verbose) { _log << "Flattening ..."; } _fopts.onlyRangeDomains = _flags.onlyRangeDomains; _fopts.verbose = _flags.verbose; _fopts.outputMode = _flagOutputMode; _fopts.outputObjective = _flags.outputObjective; _fopts.outputOutputItem = _flags.outputOutputItem; _fopts.hasChecker = !_flagSolutionCheckModel.empty(); #ifdef HAS_GECODE GecodeOptions gopts; gopts.onlyRangeDomains = _flags.onlyRangeDomains; gopts.sac = _flags.sac; gopts.allowUnboundedVars = _flags.allowUnboundedVars; gopts.shave = _flags.shave; gopts.printStatistics = _flags.statistics; gopts.prePasses = _flagPrePasses; #endif FlatteningOptions pass_opts = _fopts; CompilePassFlags cfs; cfs.noMIPdomains = _flags.noMIPdomains; cfs.verbose = _flags.verbose; cfs.statistics = _flags.statistics; cfs.optimize = _flags.optimize; cfs.chainCompression = _flags.chainCompression; cfs.newfzn = _flags.newfzn; cfs.werror = _flags.werror; cfs.modelCheckOnly = _flags.modelCheckOnly; cfs.modelInterfaceOnly = _flags.modelInterfaceOnly; cfs.allowMultiAssign = _flags.allowMultiAssign; std::vector > managed_passes; if (_flags.twoPass) { std::string library = _stdLibDir + (_flags.gecode ? "/gecode_presolver/" : "/std/"); bool differentLibrary = (library != _stdLibDir + "/" + _globalsDir + "/"); managed_passes.emplace_back(new CompilePass(env, pass_opts, cfs, library, _includePaths, true, differentLibrary)); #ifdef HAS_GECODE if (_flags.gecode) { managed_passes.emplace_back(new GecodePass(&gopts)); } #endif } managed_passes.emplace_back(new CompilePass(env, _fopts, cfs, _stdLibDir + "/" + _globalsDir + "/", _includePaths, _flags.twoPass, false)); Env* out_env = multiPassFlatten(managed_passes); if (out_env == nullptr) { exit(EXIT_FAILURE); } if (out_env != env) { _pEnv.reset(out_env); } env = out_env; if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")," << " max stack depth " << env->maxCallStack() << std::endl; } } if (_flags.statistics) { FlatModelStatistics stats = statistics(*env); _os << "% Generated FlatZinc statistics:\n"; _os << "%%%mzn-stat: paths=" << env->envi().getPathMap().size() << endl; if (stats.n_bool_vars != 0) { _os << "%%%mzn-stat: flatBoolVars=" << stats.n_bool_vars << endl; } if (stats.n_int_vars != 0) { _os << "%%%mzn-stat: flatIntVars=" << stats.n_int_vars << endl; } if (stats.n_float_vars != 0) { _os << "%%%mzn-stat: flatFloatVars=" << stats.n_float_vars << endl; } if (stats.n_set_vars != 0) { _os << "%%%mzn-stat: flatSetVars=" << stats.n_set_vars << endl; } if (stats.n_bool_ct != 0) { _os << "%%%mzn-stat: flatBoolConstraints=" << stats.n_bool_ct << endl; } if (stats.n_int_ct != 0) { _os << "%%%mzn-stat: flatIntConstraints=" << stats.n_int_ct << endl; } if (stats.n_float_ct != 0) { _os << "%%%mzn-stat: flatFloatConstraints=" << stats.n_float_ct << endl; } if (stats.n_set_ct != 0) { _os << "%%%mzn-stat: flatSetConstraints=" << stats.n_set_ct << endl; } if (stats.n_reif_ct != 0) { _os << "%%%mzn-stat: evaluatedReifiedConstraints=" << stats.n_reif_ct << endl; } if (stats.n_imp_ct != 0) { _os << "%%%mzn-stat: evaluatedHalfReifiedConstraints=" << stats.n_imp_ct << endl; } if (stats.n_imp_del != 0) { _os << "%%%mzn-stat: eliminatedImplications=" << stats.n_imp_del << endl; } if (stats.n_lin_del != 0) { _os << "%%%mzn-stat: eliminatedLinearConstraints=" << stats.n_lin_del << endl; } /// Objective / SAT. These messages are used by mzn-test.py. SolveI* solveItem = env->flat()->solveItem(); if (solveItem->st() != SolveI::SolveType::ST_SAT) { if (solveItem->st() == SolveI::SolveType::ST_MAX) { _os << "%%%mzn-stat: method=\"maximize\"" << endl; } else { _os << "%%%mzn-stat: method=\"minimize\"" << endl; } } else { _os << "%%%mzn-stat: method=\"satisfy\"" << endl; } _os << "%%%mzn-stat: flatTime=" << flatten_time.s() << endl; _os << "%%%mzn-stat-end" << endl << endl; } if (_flags.outputPathsStdout) { if (_flags.verbose) { _log << "Printing Paths to stdout ..." << std::endl; } PathFilePrinter pfp(_os, env->envi()); pfp.print(env->flat()); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } else if (!_flagOutputPaths.empty()) { if (_flags.verbose) { _log << "Printing Paths to '" << _flagOutputPaths << "' ..." << std::flush; } std::ofstream ofs(FILE_PATH(_flagOutputPaths), ios::out); check_io_status(ofs.good(), " I/O error: cannot open fzn output file. "); PathFilePrinter pfp(ofs, env->envi()); pfp.print(env->flat()); check_io_status(ofs.good(), " I/O error: cannot write fzn output file. "); ofs.close(); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } if ((_fopts.collectMznPaths || _flags.twoPass) && !_flags.keepMznPaths) { class RemovePathAnnotations : public ItemVisitor { public: static void removePath(Annotation& a) { a.removeCall(constants().ann.mzn_path); } static void vVarDeclI(VarDeclI* vdi) { removePath(vdi->e()->ann()); } static void vConstraintI(ConstraintI* ci) { removePath(ci->e()->ann()); } static void vSolveI(SolveI* si) { removePath(si->ann()); if (Expression* e = si->e()) { removePath(e->ann()); } } } removePaths; iter_items(removePaths, env->flat()); } if (_flags.outputFznStdout) { if (_flags.verbose) { _log << "Printing FlatZinc to stdout ..." << std::endl; } Printer p(_os, 0); p.print(env->flat()); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } else if (!_flagOutputFzn.empty()) { if (_flags.verbose) { _log << "Printing FlatZinc to '" << _flagOutputFzn << "' ..." << std::flush; } std::ofstream ofs(FILE_PATH(_flagOutputFzn), ios::out); check_io_status(ofs.good(), " I/O error: cannot open fzn output file. "); Printer p(ofs, 0); p.print(env->flat()); check_io_status(ofs.good(), " I/O error: cannot write fzn output file. "); ofs.close(); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } if (!_flags.noOutputOzn) { if (_flags.outputOznStdout) { if (_flags.verbose) { _log << "Printing .ozn to stdout ..." << std::endl; } Printer p(_os, 0); p.print(env->output()); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } else if (!_flagOutputOzn.empty()) { if (_flags.verbose) { _log << "Printing .ozn to '" << _flagOutputOzn << "' ..." << std::flush; } std::ofstream ofs(FILE_PATH(_flagOutputOzn), std::ios::out); check_io_status(ofs.good(), " I/O error: cannot open ozn output file. "); Printer p(ofs, 0); p.print(env->output()); check_io_status(ofs.good(), " I/O error: cannot write ozn output file. "); ofs.close(); if (_flags.verbose) { _log << " done (" << _starttime.stoptime() << ")" << std::endl; } } } } } else { // !flag_typecheck Printer p(_os); p.print(m); } } if (getEnv()->envi().failed()) { status = SolverInstance::UNSAT; } if (_flags.verbose) { size_t mem = GC::maxMem(); if (mem < 1024) { _log << "Maximum memory " << mem << " bytes"; } else if (mem < 1024 * 1024) { _log << "Maximum memory " << mem / 1024 << " Kbytes"; } else { _log << "Maximum memory " << mem / (1024 * 1024) << " Mbytes"; } _log << "." << std::endl; } } void Flattener::printStatistics(ostream& /*os*/) {} libminizinc-2.5.3/lib/typecheck.cpp0000644000175000017500000040035513757304533015740 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { Scopes::Scopes() { _s.emplace_back(ST_TOPLEVEL); } void Scopes::add(EnvI& env, VarDecl* vd) { if (!_s.back().toplevel() && vd->ti()->isEnum() && (vd->e() != nullptr)) { throw TypeError(env, vd->loc(), "enums are only allowed at top level"); } if (vd->id()->idn() == -1 && vd->id()->v() == "") { return; } // If the current scope is ST_INNER, check if vd shadows another // declaration from the same functional or toplevel scope if (_s.back().st == ST_INNER) { assert(_s.size() > 1); // at least toplevel scope above for (int i = static_cast(_s.size()) - 2; i >= 0; i--) { auto previous = _s[i].m.find(vd->id()); if (previous != _s[i].m.end()) { std::ostringstream oss; ASTString warnloc_f = vd->loc().filename(); unsigned int warnloc_l = vd->id()->loc().firstLine(); unsigned int warnloc_c = vd->id()->loc().firstColumn(); unsigned int earlier_l = previous->second->id()->loc().firstLine(); unsigned int earlier_c = previous->second->id()->loc().firstColumn(); oss << "\n " << warnloc_f << ":" << warnloc_l << "." << warnloc_c << ":\n"; oss << " Variable `" << *vd->id() << "' shadows variable with the same name in line " << earlier_l << "." << earlier_c; env.addWarning(oss.str()); break; } if (_s[i].st != ST_INNER) { break; } } } auto vdi = _s.back().m.find(vd->id()); if (vdi == _s.back().m.end()) { _s.back().m.insert(vd->id(), vd); } else { std::ostringstream ss; ss << "identifier `" << vd->id()->str() << "' already defined"; throw TypeError(env, vd->loc(), ss.str()); } } void Scopes::pushToplevel() { _s.emplace_back(ST_TOPLEVEL); } void Scopes::pushFun() { _s.emplace_back(ST_FUN); } void Scopes::push() { _s.emplace_back(ST_INNER); } void Scopes::pop() { _s.pop_back(); } VarDecl* Scopes::find(Id* ident) { int cur = static_cast(_s.size()) - 1; for (;;) { auto vdi = _s[cur].m.find(ident); if (vdi == _s[cur].m.end()) { if (_s[cur].toplevel()) { if (cur > 0) { cur = 0; } else { return nullptr; } } else { cur--; } } else { return vdi->second; } } } VarDecl* Scopes::findSimilar(Id* ident) { VarDecl* mostSimilar = nullptr; int cur = static_cast(_s.size()) - 1; int minEdits = 3; for (;;) { for (auto decls : _s[cur].m) { int edits = ident->levenshteinDistance(decls.first); if (edits < minEdits && std::abs(static_cast(ident->v().size()) - static_cast(decls.first->v().size())) <= 3) { minEdits = edits; mostSimilar = decls.second; } } if (_s[cur].toplevel()) { if (cur > 0) { cur = 0; } else { break; } } else { cur--; } } return mostSimilar; } class VarDeclCmp { private: std::unordered_map& _pos; public: VarDeclCmp(std::unordered_map& pos) : _pos(pos) {} bool operator()(Expression* e0, Expression* e1) { if (auto* vd0 = Expression::dynamicCast(e0)) { if (auto* vd1 = Expression::dynamicCast(e1)) { return _pos[vd0] < _pos[vd1]; } return true; } return false; } }; class ItemCmp { private: std::unordered_map& _pos; public: ItemCmp(std::unordered_map& pos) : _pos(pos) {} bool operator()(Item* i0, Item* i1) { if (auto* vd0 = i0->cast()) { if (auto* vd1 = i1->cast()) { return _pos[vd0->e()] < _pos[vd1->e()]; } return true; } return false; } }; void create_enum_mapper(EnvI& env, Model* m, unsigned int enumId, VarDecl* vd, Model* enumItems) { GCLock lock; Id* ident = vd->id(); Call* c = vd->e()->dynamicCast(); auto* al = vd->e()->dynamicCast(); std::vector parts; if (vd->e()->isa()) { parts.push_back(vd->e()); } else if ((al != nullptr) || ((c != nullptr) && c->id() == "anon_enum" && c->argCount() == 1 && c->arg(0)->isa())) { if (c != nullptr) { al = c->arg(0)->cast(); } std::vector enumIds(al->size()); for (unsigned int i = 0; i < al->size(); i++) { if (Id* eid = (*al)[i]->dynamicCast()) { enumIds[i] = eid; } else { std::ostringstream ss; ss << "invalid initialisation for enum `" << ident->v() << "'"; throw TypeError(env, vd->e()->loc(), ss.str()); } } parts.push_back(new SetLit(vd->e()->loc(), enumIds)); } else if (c != nullptr) { if (c->id() == "enumFromConstructors") { if (c->argCount() != 1 || !c->arg(0)->isa()) { throw TypeError(env, c->loc(), "enumFromConstructors used with incorrect argument type (only supports " "array literals)"); } auto* al = c->arg(0)->cast(); for (unsigned int i = 0; i < al->size(); i++) { parts.push_back((*al)[i]); } } else { parts.push_back(c); } } else { throw TypeError(env, vd->e()->loc(), std::string("invalid initialisation for enum `") + ident->v().c_str() + "'"); } std::vector partCardinality; for (unsigned int p = 0; p < parts.size(); p++) { if (auto* sl = parts[p]->dynamicCast()) { for (unsigned int i = 0; i < sl->v().size(); i++) { if (!sl->v()[i]->isa()) { throw TypeError( env, sl->v()[i]->loc(), std::string("invalid initialisation for enum `") + ident->v().c_str() + "'"); } auto* ti_id = new TypeInst(sl->v()[i]->loc(), Type::parenum(enumId)); std::vector toEnumArgs(2); toEnumArgs[0] = vd->id(); if (partCardinality.empty()) { toEnumArgs[1] = IntLit::a(i + 1); } else { toEnumArgs[1] = new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, IntLit::a(i + 1)); } Call* toEnum = new Call(sl->v()[i]->loc(), ASTString("to_enum"), toEnumArgs); auto* vd_id = new VarDecl(ti_id->loc(), ti_id, sl->v()[i]->cast()->str(), toEnum); auto* vdi_id = new VarDeclI(vd_id->loc(), vd_id); std::string str(sl->v()[i]->cast()->str().c_str()); env.reverseEnum[str] = vdi_id; enumItems->addItem(vdi_id); if (i == sl->v().size() - 1) { // remember the last identifier partCardinality.push_back(toEnumArgs[1]); } } std::string name = create_enum_to_string_name(ident, "_enum_to_string_" + std::to_string(p) + "_"); std::vector al_args(sl->v().size()); for (unsigned int i = 0; i < sl->v().size(); i++) { std::string str(sl->v()[i]->cast()->str().c_str()); if (str.size() >= 2 && str[0] == '\'' && str[str.size() - 1] == '\'') { al_args[i] = new StringLit(Location().introduce(), ASTString(str.substr(1, str.size() - 2))); } else { al_args[i] = new StringLit(Location().introduce(), ASTString(str)); } /// TODO: reimplement reverseEnum with a symbol table into the model (so you can evalPar an /// expression) } auto* al = new ArrayLit(Location().introduce(), al_args); std::vector ranges(1); ranges[0] = new TypeInst(Location().introduce(), Type::parint()); auto* ti = new TypeInst(Location().introduce(), Type::parstring(1)); ti->setRanges(ranges); auto* vd_enumToString = new VarDecl(Location().introduce(), ti, name, al); enumItems->addItem(new VarDeclI(Location().introduce(), vd_enumToString)); Type tx = Type::parint(); tx.ot(Type::OT_OPTIONAL); auto* ti_aa = new TypeInst(Location().introduce(), tx); auto* vd_aa = new VarDecl(Location().introduce(), ti_aa, "x"); vd_aa->toplevel(false); auto* ti_ab = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_ab = new VarDecl(Location().introduce(), ti_ab, "b"); vd_ab->toplevel(false); auto* ti_aj = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_aj = new VarDecl(Location().introduce(), ti_aj, "json"); vd_aj->toplevel(false); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_aa; fi_params[1] = vd_ab; fi_params[2] = vd_aj; std::vector deopt_args(1); deopt_args[0] = vd_aa->id(); Call* deopt = new Call(Location().introduce(), "deopt", deopt_args); Call* occurs = new Call(Location().introduce(), "occurs", deopt_args); std::vector aa_args(1); aa_args[0] = deopt; auto* aa = new ArrayAccess(Location().introduce(), vd_enumToString->id(), aa_args); auto* sl_absent = new StringLit(Location().introduce(), "<>"); ITE* if_absent = new ITE( Location().introduce(), {vd_aj->id(), new StringLit(Location().introduce(), ASTString("null"))}, sl_absent); auto* json_e_quote = new StringLit(Location().introduce(), ASTString("{\"e\":\"")); auto* json_e_quote_end = new StringLit(Location().introduce(), ASTString("\"}")); auto* quote_aa = new BinOp(Location().introduce(), json_e_quote, BOT_PLUSPLUS, aa); auto* quote_aa2 = new BinOp(Location().introduce(), quote_aa, BOT_PLUSPLUS, json_e_quote_end); Call* quote_dzn = new Call(Location().introduce(), ASTString("showDznId"), {aa}); std::vector ite_ifelse(2); ite_ifelse[0] = occurs; ite_ifelse[1] = new ITE(Location().introduce(), {vd_ab->id(), quote_dzn, vd_aj->id(), quote_aa2}, aa); ITE* ite = new ITE(Location().introduce(), ite_ifelse, if_absent); std::string toString = "_toString_"; if (parts.size() > 1) { toString += std::to_string(p) + "_"; } auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, toString), ti_fi, fi_params, ite); enumItems->addItem(fi); } else if (Call* c = parts[p]->dynamicCast()) { if (c->id() == "anon_enum") { Type tx = Type::parint(); tx.ot(Type::OT_OPTIONAL); auto* ti_aa = new TypeInst(Location().introduce(), tx); auto* vd_aa = new VarDecl(Location().introduce(), ti_aa, "x"); vd_aa->toplevel(false); auto* ti_ab = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_ab = new VarDecl(Location().introduce(), ti_ab, "b"); vd_ab->toplevel(false); auto* ti_aj = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_aj = new VarDecl(Location().introduce(), ti_aj, "json"); vd_aj->toplevel(false); std::vector deopt_args(1); deopt_args[0] = vd_aa->id(); Call* deopt = new Call(Location().introduce(), "deopt", deopt_args); Call* if_absent = new Call(Location().introduce(), "absent", deopt_args); auto* sl_absent_dzn = new StringLit(Location().introduce(), "<>"); ITE* sl_absent = new ITE( Location().introduce(), {vd_aj->id(), new StringLit(Location().introduce(), ASTString("null"))}, sl_absent_dzn); auto* sl_dzn = new StringLit(Location().introduce(), ASTString(std::string("to_enum(") + ident->str().c_str() + ",")); std::vector showIntArgs(1); if (partCardinality.empty()) { showIntArgs[0] = deopt; partCardinality.push_back(c->arg(0)); } else { showIntArgs[0] = new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, deopt); partCardinality.push_back( new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, c->arg(0))); } Call* showInt = new Call(Location().introduce(), constants().ids.show, showIntArgs); auto* construct_string_dzn = new BinOp(Location().introduce(), sl_dzn, BOT_PLUSPLUS, showInt); auto* closing_bracket = new StringLit(Location().introduce(), ASTString(")")); auto* construct_string_dzn_2 = new BinOp(Location().introduce(), construct_string_dzn, BOT_PLUSPLUS, closing_bracket); auto* sl = new StringLit(Location().introduce(), ASTString(std::string(ident->str().c_str()) + "_")); auto* construct_string = new BinOp(Location().introduce(), sl, BOT_PLUSPLUS, showInt); auto* json_e_quote = new StringLit(Location().introduce(), ASTString("{\"e\":\"")); auto* json_e_quote_mid = new StringLit(Location().introduce(), ASTString("\", \"i\":")); auto* json_e_quote_end = new StringLit(Location().introduce(), ASTString("}")); auto* construct_string_json = new BinOp(Location().introduce(), json_e_quote, BOT_PLUSPLUS, new StringLit(Location().introduce(), ident->str())); auto* construct_string_json_1a = new BinOp(Location().introduce(), construct_string_json, BOT_PLUSPLUS, json_e_quote_mid); auto* construct_string_json_1b = new BinOp(Location().introduce(), construct_string_json_1a, BOT_PLUSPLUS, showInt); auto* construct_string_json_2 = new BinOp(Location().introduce(), construct_string_json_1b, BOT_PLUSPLUS, json_e_quote_end); std::vector if_then(6); if_then[0] = if_absent; if_then[1] = sl_absent; if_then[2] = vd_ab->id(); if_then[3] = construct_string_dzn_2; if_then[4] = vd_aj->id(); if_then[5] = construct_string_json_2; ITE* ite = new ITE(Location().introduce(), if_then, construct_string); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_aa; fi_params[1] = vd_ab; fi_params[2] = vd_aj; std::string toString = "_toString_"; if (parts.size() > 1) { toString += std::to_string(p) + "_"; } auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, toString), ti_fi, fi_params, ite); enumItems->addItem(fi); } else { // This is an enum constructor C(E) if (c->argCount() != 1 || !c->arg(0)->isa()) { throw TypeError(env, c->loc(), "enum constructors must have a single identifier as argument"); } Id* otherEnumId = c->arg(0)->cast(); // Generate: /* function X: C(E: x) = to_enum(X,partCardinality.back()+x) function var X: C(var E: x) = to_enum(X,partCardinality.back()+x) function opt X: C(opt E: x) = if occurs(x) then C(deopt(x)) else to_enum(x,<>) endif function var opt X: C(var opt E: x) = if occurs(x) then C(deopt(x)) else to_enum(x,<>) endif function set of X: C(set of E: x) = { C(i) | i in x } function var set of X: C(var set of E: x) = { C(i) | i in x } */ { Type Xt = Type::parint(); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); auto* Cfn_x_ti = new TypeInst(Location().introduce(), Type(), otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); vd_x->toplevel(false); Expression* realX; if (partCardinality.empty()) { realX = vd_x->id(); } else { realX = new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, vd_x->id()); } auto* Cfn_body = new Call(Location().introduce(), "to_enum", {vd->id(), realX}); std::string Cfn_id(c->id().c_str()); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, Cfn_body); env.reverseEnum[Cfn_id] = Cfn; enumItems->addItem(Cfn); } { Type Xt = Type::varint(); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); Type argT; argT.ti(Type::TI_VAR); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); vd_x->toplevel(false); Expression* realX; if (partCardinality.empty()) { realX = vd_x->id(); } else { realX = new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, vd_x->id()); } auto* Cfn_body = new Call(Location().introduce(), "to_enum", {vd->id(), realX}); std::string Cfn_id(c->id().c_str()); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, Cfn_body); enumItems->addItem(Cfn); } { Type Xt = Type::parint(); Xt.ot(Type::OT_OPTIONAL); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); Type argT; argT.ot(Type::OT_OPTIONAL); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cfn_id(c->id().c_str()); vd_x->toplevel(false); auto* occurs = new Call(Location().introduce(), "occurs", {vd_x->id()}); auto* deopt = new Call(Location().introduce(), "deopt", {vd_x->id()}); auto* inv = new Call(Location().introduce(), Cfn_id, {deopt}); auto* toEnumAbsent = new Call(Location().introduce(), "to_enum", {vd->id(), constants().absent}); auto* ite = new ITE(Location().introduce(), {occurs, inv}, toEnumAbsent); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, ite); enumItems->addItem(Cfn); } { Type Xt = Type::varint(); Xt.ot(Type::OT_OPTIONAL); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); Type argT; argT.ti(Type::TI_VAR); argT.ot(Type::OT_OPTIONAL); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cfn_id(c->id().c_str()); vd_x->toplevel(false); auto* occurs = new Call(Location().introduce(), "occurs", {vd_x->id()}); auto* deopt = new Call(Location().introduce(), "deopt", {vd_x->id()}); auto* toEnumAbsent = new Call(Location().introduce(), "to_enum", {vd->id(), constants().absent}); auto* inv = new Call(Location().introduce(), Cfn_id, {deopt}); auto* ite = new ITE(Location().introduce(), {occurs, inv}, toEnumAbsent); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, ite); enumItems->addItem(Cfn); } { Type Xt = Type::parint(); Xt.st(Type::ST_SET); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); Type argT; argT.st(Type::ST_SET); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cfn_id(c->id().c_str()); vd_x->toplevel(false); auto* s_ti = new TypeInst(Location().introduce(), Type::parint()); auto* s = new VarDecl(Location().introduce(), s_ti, "s", nullptr); s->toplevel(false); auto* inv = new Call(Location().introduce(), Cfn_id, {s->id()}); Generator gen({s}, vd_x->id(), nullptr); Generators gens; gens.g = {gen}; auto* comprehension = new Comprehension(Location().introduce(), inv, gens, true); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, comprehension); enumItems->addItem(Cfn); } { Type Xt = Type::varint(); Xt.st(Type::ST_SET); Xt.enumId(enumId); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt); Type argT; argT.ti(Type::TI_VAR); argT.st(Type::ST_SET); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, otherEnumId); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cfn_id(c->id().c_str()); vd_x->toplevel(false); auto* s_ti = new TypeInst(Location().introduce(), Type::parint()); auto* s = new VarDecl(Location().introduce(), s_ti, "s", nullptr); s->toplevel(false); auto* inv = new Call(Location().introduce(), Cfn_id, {s->id()}); Generator gen({s}, vd_x->id(), nullptr); Generators gens; gens.g = {gen}; auto* comprehension = new Comprehension(Location().introduce(), inv, gens, true); auto* Cfn = new FunctionI(Location().introduce(), Cfn_id, Cfn_ti, {vd_x}, comprehension); enumItems->addItem(Cfn); } /* function E: C⁻¹(X: x) = to_enum(E,x-partCardinality.back()) function var E: C⁻¹(var X: x) = to_enum(E,x-partCardinality.back()) function opt E: C⁻¹(opt X: x) = if occurs(x) then C⁻¹(deopt(x)) else to_enum(x,<>) endif function var opt E: C⁻¹(var opt X: x) = if occurs(x) then C⁻¹(deopt(x)) else to_enum(x,<>) endif function set of E: C⁻¹(set of X: x) = { C⁻¹(i) | i in x } function var set of E: C⁻¹(var set of X: x) = { C⁻¹(i) | i in x } */ { auto* toEfn_ti = new TypeInst(Location().introduce(), Type(), otherEnumId); Type Xt = Type::parint(); Xt.enumId(enumId); auto* toEfn_x_ti = new TypeInst(Location().introduce(), Xt, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), toEfn_x_ti, "x"); vd_x->toplevel(false); Expression* realX; if (partCardinality.empty()) { realX = vd_x->id(); } else { realX = new BinOp(Location().introduce(), vd_x->id(), BOT_MINUS, partCardinality.back()); } auto* toEfn_body = new Call(Location().introduce(), "to_enum", {otherEnumId, realX}); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); auto* toEfn = new FunctionI(Location().introduce(), Cinv_id, toEfn_ti, {vd_x}, toEfn_body); enumItems->addItem(toEfn); } { Type rT; rT.ti(Type::TI_VAR); auto* toEfn_ti = new TypeInst(Location().introduce(), rT, otherEnumId); Type Xt = Type::varint(); Xt.enumId(enumId); auto* toEfn_x_ti = new TypeInst(Location().introduce(), Xt, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), toEfn_x_ti, "x"); vd_x->toplevel(false); Expression* realX; if (partCardinality.empty()) { realX = vd_x->id(); } else { realX = new BinOp(Location().introduce(), vd_x->id(), BOT_MINUS, partCardinality.back()); } auto* toEfn_body = new Call(Location().introduce(), "to_enum", {otherEnumId, realX}); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); auto* toEfn = new FunctionI(Location().introduce(), Cinv_id, toEfn_ti, {vd_x}, toEfn_body); enumItems->addItem(toEfn); } { Type rt; rt.ot(Type::OT_OPTIONAL); auto* Cfn_ti = new TypeInst(Location().introduce(), rt, otherEnumId); Type argT; argT.ot(Type::OT_OPTIONAL); argT.enumId(enumId); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); vd_x->toplevel(false); auto* occurs = new Call(Location().introduce(), "occurs", {vd_x->id()}); auto* deopt = new Call(Location().introduce(), "deopt", {vd_x->id()}); auto* inv = new Call(Location().introduce(), Cinv_id, {deopt}); auto* toEnumAbsent = new Call(Location().introduce(), "to_enum", {otherEnumId, constants().absent}); auto* ite = new ITE(Location().introduce(), {occurs, inv}, toEnumAbsent); auto* Cfn = new FunctionI(Location().introduce(), Cinv_id, Cfn_ti, {vd_x}, ite); enumItems->addItem(Cfn); } { Type rt; rt.ti(Type::TI_VAR); rt.ot(Type::OT_OPTIONAL); auto* Cfn_ti = new TypeInst(Location().introduce(), rt, otherEnumId); Type argT = Type::varint(); argT.ot(Type::OT_OPTIONAL); argT.enumId(enumId); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); vd_x->toplevel(false); auto* occurs = new Call(Location().introduce(), "occurs", {vd_x->id()}); auto* deopt = new Call(Location().introduce(), "deopt", {vd_x->id()}); auto* inv = new Call(Location().introduce(), Cinv_id, {deopt}); auto* toEnumAbsent = new Call(Location().introduce(), "to_enum", {otherEnumId, constants().absent}); auto* ite = new ITE(Location().introduce(), {occurs, inv}, toEnumAbsent); auto* Cfn = new FunctionI(Location().introduce(), Cinv_id, Cfn_ti, {vd_x}, ite); enumItems->addItem(Cfn); } { Type Xt; Xt.st(Type::ST_SET); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt, otherEnumId); Type argT = Type::parint(); argT.st(Type::ST_SET); argT.enumId(enumId); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); vd_x->toplevel(false); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); auto* s_ti = new TypeInst(Location().introduce(), Type::parint()); auto* s = new VarDecl(Location().introduce(), s_ti, "s", nullptr); s->toplevel(false); auto* inv = new Call(Location().introduce(), Cinv_id, {s->id()}); Generator gen({s}, vd_x->id(), nullptr); Generators gens; gens.g = {gen}; auto* comprehension = new Comprehension(Location().introduce(), inv, gens, true); auto* Cfn = new FunctionI(Location().introduce(), Cinv_id, Cfn_ti, {vd_x}, comprehension); enumItems->addItem(Cfn); } { Type Xt; Xt.ti(Type::TI_VAR); Xt.st(Type::ST_SET); auto* Cfn_ti = new TypeInst(Location().introduce(), Xt, otherEnumId); Type argT = Type::varint(); argT.st(Type::ST_SET); argT.enumId(enumId); auto* Cfn_x_ti = new TypeInst(Location().introduce(), argT, vd->id()); auto* vd_x = new VarDecl(Location().introduce(), Cfn_x_ti, "x"); vd_x->toplevel(false); std::string Cinv_id(std::string(c->id().c_str()) + "⁻¹"); auto* s_ti = new TypeInst(Location().introduce(), Type::varint()); auto* s = new VarDecl(Location().introduce(), s_ti, "s", nullptr); s->toplevel(false); auto* inv = new Call(Location().introduce(), Cinv_id, {s->id()}); Generator gen({s}, vd_x->id(), nullptr); Generators gens; gens.g = {gen}; auto* comprehension = new Comprehension(Location().introduce(), inv, gens, true); auto* Cfn = new FunctionI(Location().introduce(), Cinv_id, Cfn_ti, {vd_x}, comprehension); enumItems->addItem(Cfn); } /* function string: _toString_p_X(opt X: x, bool: b, bool: json) = if absent(x) then "<>" else if json then "{ \"c\": \"C\", \"e\":" else "C(" endif ++_toString_E(to_enum(E,deopt(x)),b,json) ++ if json then "}" else ")" endif endif */ { Type tx = Type::parint(); tx.ot(Type::OT_OPTIONAL); auto* ti_aa = new TypeInst(Location().introduce(), tx); auto* vd_aa = new VarDecl(Location().introduce(), ti_aa, "x"); vd_aa->toplevel(false); auto* ti_ab = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_ab = new VarDecl(Location().introduce(), ti_ab, "b"); vd_ab->toplevel(false); auto* ti_aj = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_aj = new VarDecl(Location().introduce(), ti_aj, "json"); vd_aj->toplevel(false); std::vector deopt_args(1); deopt_args[0] = vd_aa->id(); Call* deopt = new Call(Location().introduce(), "deopt", deopt_args); Call* if_absent = new Call(Location().introduce(), "absent", deopt_args); auto* sl_absent_dzn = new StringLit(Location().introduce(), "<>"); ITE* sl_absent = new ITE(Location().introduce(), {vd_aj->id(), new StringLit(Location().introduce(), ASTString("null"))}, sl_absent_dzn); Call* toEnumE = new Call(Location().introduce(), "to_enum", {otherEnumId, deopt}); Call* toString = new Call(Location().introduce(), create_enum_to_string_name(otherEnumId, "_toString_"), {toEnumE, vd_ab->id(), vd_aj->id()}); auto* openOther = new StringLit(Location().introduce(), std::string(c->id().c_str()) + "("); auto* openJson = new StringLit(Location().introduce(), "{ \"c\" : \"" + std::string(c->id().c_str()) + "\", \"e\" : "); ITE* openConstr = new ITE(Location().introduce(), {vd_aj->id(), openJson}, openOther); auto* closeJson = new StringLit(Location().introduce(), "}"); auto* closeOther = new StringLit(Location().introduce(), ")"); ITE* closeConstr = new ITE(Location().introduce(), {vd_aj->id(), closeJson}, closeOther); auto* concat1 = new BinOp(Location().introduce(), openConstr, BOT_PLUSPLUS, toString); auto* concat2 = new BinOp(Location().introduce(), concat1, BOT_PLUSPLUS, closeConstr); ITE* ite = new ITE(Location().introduce(), {if_absent, sl_absent}, concat2); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_aa; fi_params[1] = vd_ab; fi_params[2] = vd_aj; std::string XtoString = "_toString_"; if (parts.size() > 1) { XtoString += std::to_string(p) + "_"; } auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, XtoString), ti_fi, fi_params, ite); enumItems->addItem(fi); } Call* cardE = new Call(Location().introduce(), "card", {otherEnumId}); if (partCardinality.empty()) { partCardinality.push_back(cardE); } else { partCardinality.push_back( new BinOp(Location().introduce(), partCardinality.back(), BOT_PLUS, cardE)); } } } else { assert(false); } } // Create set literal for overall enum auto* rhs = new BinOp(vd->loc(), IntLit::a(1), BOT_DOTDOT, partCardinality.back()); vd->e(rhs); if (parts.size() > 1) { Type tx = Type::parint(); tx.ot(Type::OT_OPTIONAL); auto* ti_aa = new TypeInst(Location().introduce(), tx); auto* vd_aa = new VarDecl(Location().introduce(), ti_aa, "x"); vd_aa->toplevel(false); auto* ti_ab = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_ab = new VarDecl(Location().introduce(), ti_ab, "b"); vd_ab->toplevel(false); auto* ti_aj = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_aj = new VarDecl(Location().introduce(), ti_aj, "json"); vd_aj->toplevel(false); std::vector deopt_args(1); deopt_args[0] = vd_aa->id(); Call* deopt = new Call(Location().introduce(), "deopt", deopt_args); Call* if_absent = new Call(Location().introduce(), "absent", deopt_args); auto* sl_absent_dzn = new StringLit(Location().introduce(), "<>"); ITE* sl_absent = new ITE( Location().introduce(), {vd_aj->id(), new StringLit(Location().introduce(), ASTString("null"))}, sl_absent_dzn); std::vector ite_cases_a; Expression* ite_cases_else; for (unsigned int i = 0; i < parts.size(); i++) { std::string toString = "_toString_" + std::to_string(i) + "_"; Expression* aa; if (i == 0) { aa = vd_aa->id(); } else { auto* bo = new BinOp(Location().introduce(), deopt, BOT_MINUS, partCardinality[i - 1]); Call* c = new Call(Location().introduce(), "to_enum", {vd->id(), bo}); aa = c; } Call* c = new Call(Location().introduce(), create_enum_to_string_name(ident, toString), {aa, vd_ab->id(), vd_aj->id()}); if (i < parts.size() - 1) { auto* bo = new BinOp(Location().introduce(), deopt, BOT_LQ, partCardinality[i]); ite_cases_a.push_back(bo); ite_cases_a.push_back(c); } else { ite_cases_else = c; } } ITE* ite_cases = new ITE(Location().introduce(), ite_cases_a, ite_cases_else); ITE* ite = new ITE(Location().introduce(), {if_absent, sl_absent}, ite_cases); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_aa; fi_params[1] = vd_ab; fi_params[2] = vd_aj; auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), ti_fi, fi_params, ite); enumItems->addItem(fi); /* function string: _toString_ENUM(opt Foo: x, bool: b, bool: json) = if occurs(x) then if deopt(x)<=partCardinality[1] then _toString_1_ENUM(x,b,json) elseif deopt(x)<=partCardinality[2] then _toString_2_ENUM(x,b,json) ... endif else "<>" endif */ } { /* function _toString_ENUM(array[$U] of opt Foo: x, bool: b, bool: json) = let { array[int] of opt ENUM: xx = array1d(x) } in "[" ++ join(", ", [ _toString_ENUM(xx[i],b,json) | i in index_set(xx) ]) ++ "]"; */ TIId* tiid = new TIId(Location().introduce(), "U"); auto* ti_range = new TypeInst(Location().introduce(), Type::parint(), tiid); std::vector ranges(1); ranges[0] = ti_range; Type tx = Type::parint(-1); tx.ot(Type::OT_OPTIONAL); auto* x_ti = new TypeInst(Location().introduce(), tx, ranges, ident); auto* vd_x = new VarDecl(Location().introduce(), x_ti, "x"); vd_x->toplevel(false); auto* b_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_b = new VarDecl(Location().introduce(), b_ti, "b"); vd_b->toplevel(false); auto* j_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_j = new VarDecl(Location().introduce(), j_ti, "json"); vd_j->toplevel(false); auto* xx_range = new TypeInst(Location().introduce(), Type::parint(), nullptr); std::vector xx_ranges(1); xx_ranges[0] = xx_range; auto* xx_ti = new TypeInst(Location().introduce(), tx, xx_ranges, ident); std::vector array1dArgs(1); array1dArgs[0] = vd_x->id(); Call* array1dCall = new Call(Location().introduce(), "array1d", array1dArgs); auto* vd_xx = new VarDecl(Location().introduce(), xx_ti, "xx", array1dCall); vd_xx->toplevel(false); auto* idx_i_ti = new TypeInst(Location().introduce(), Type::parint()); auto* idx_i = new VarDecl(Location().introduce(), idx_i_ti, "i"); idx_i->toplevel(false); std::vector aa_xxi_idx(1); aa_xxi_idx[0] = idx_i->id(); auto* aa_xxi = new ArrayAccess(Location().introduce(), vd_xx->id(), aa_xxi_idx); std::vector _toString_ENUMArgs(3); _toString_ENUMArgs[0] = aa_xxi; _toString_ENUMArgs[1] = vd_b->id(); _toString_ENUMArgs[2] = vd_j->id(); Call* _toString_ENUM = new Call(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), _toString_ENUMArgs); std::vector index_set_xx_args(1); index_set_xx_args[0] = vd_xx->id(); Call* index_set_xx = new Call(Location().introduce(), "index_set", index_set_xx_args); std::vector gen_exps(1); gen_exps[0] = idx_i; Generator gen(gen_exps, index_set_xx, nullptr); Generators generators; generators.g.push_back(gen); auto* comp = new Comprehension(Location().introduce(), _toString_ENUM, generators, false); std::vector join_args(2); join_args[0] = new StringLit(Location().introduce(), ", "); join_args[1] = comp; Call* join = new Call(Location().introduce(), "join", join_args); auto* sl_open = new StringLit(Location().introduce(), "["); auto* bopp0 = new BinOp(Location().introduce(), sl_open, BOT_PLUSPLUS, join); auto* sl_close = new StringLit(Location().introduce(), "]"); auto* bopp1 = new BinOp(Location().introduce(), bopp0, BOT_PLUSPLUS, sl_close); std::vector let_args(1); let_args[0] = vd_xx; Let* let = new Let(Location().introduce(), let_args, bopp1); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_x; fi_params[1] = vd_b; fi_params[2] = vd_j; auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), ti_fi, fi_params, let); enumItems->addItem(fi); } { /* function _toString_ENUM(opt set of ENUM: x, bool: b, bool: json) = if absent(x) then "<>" else "{" ++ join(", ", [ _toString_ENUM(i,b,json) | i in x ]) ++ "}" endif; */ Type argType = Type::parsetenum(ident->type().enumId()); argType.ot(Type::OT_OPTIONAL); auto* x_ti = new TypeInst(Location().introduce(), argType, ident); auto* vd_x = new VarDecl(Location().introduce(), x_ti, "x"); vd_x->toplevel(false); auto* b_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_b = new VarDecl(Location().introduce(), b_ti, "b"); vd_b->toplevel(false); auto* j_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_j = new VarDecl(Location().introduce(), j_ti, "json"); vd_j->toplevel(false); auto* idx_i_ti = new TypeInst(Location().introduce(), Type::parint()); auto* idx_i = new VarDecl(Location().introduce(), idx_i_ti, "i"); idx_i->toplevel(false); std::vector _toString_ENUMArgs(3); _toString_ENUMArgs[0] = idx_i->id(); _toString_ENUMArgs[1] = vd_b->id(); _toString_ENUMArgs[2] = vd_j->id(); Call* _toString_ENUM = new Call(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), _toString_ENUMArgs); std::vector deopt_args(1); deopt_args[0] = vd_x->id(); Call* deopt = new Call(Location().introduce(), "deopt", deopt_args); Call* if_absent = new Call(Location().introduce(), "absent", deopt_args); auto* sl_absent_dzn = new StringLit(Location().introduce(), "<>"); ITE* sl_absent = new ITE(Location().introduce(), {vd_j->id(), new StringLit(Location().introduce(), ASTString("null"))}, sl_absent_dzn); std::vector gen_exps(1); gen_exps[0] = idx_i; Generator gen(gen_exps, deopt, nullptr); Generators generators; generators.g.push_back(gen); auto* comp = new Comprehension(Location().introduce(), _toString_ENUM, generators, false); std::vector join_args(2); join_args[0] = new StringLit(Location().introduce(), ", "); join_args[1] = comp; Call* join = new Call(Location().introduce(), "join", join_args); ITE* json_set = new ITE(Location().introduce(), {vd_j->id(), new StringLit(Location().introduce(), ASTString("\"set\":["))}, new StringLit(Location().introduce(), ASTString(""))); ITE* json_set_close = new ITE( Location().introduce(), {vd_j->id(), new StringLit(Location().introduce(), ASTString("]"))}, new StringLit(Location().introduce(), ASTString(""))); auto* sl_open = new StringLit(Location().introduce(), "{"); auto* bopp0 = new BinOp(Location().introduce(), sl_open, BOT_PLUSPLUS, json_set); auto* bopp1 = new BinOp(Location().introduce(), bopp0, BOT_PLUSPLUS, join); auto* bopp2 = new BinOp(Location().introduce(), bopp1, BOT_PLUSPLUS, json_set_close); auto* sl_close = new StringLit(Location().introduce(), "}"); auto* bopp3 = new BinOp(Location().introduce(), bopp2, BOT_PLUSPLUS, sl_close); std::vector if_then(2); if_then[0] = if_absent; if_then[1] = sl_absent; ITE* ite = new ITE(Location().introduce(), if_then, bopp3); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_x; fi_params[1] = vd_b; fi_params[2] = vd_j; auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), ti_fi, fi_params, ite); enumItems->addItem(fi); } { /* function _toString_ENUM(array[$U] of opt set of ENUM: x, bool: b, bool: json) = let { array[int] of opt set of ENUM: xx = array1d(x) } in "[" ++ join(", ", [ _toString_ENUM(xx[i],b,json) | i in index_set(xx) ]) ++ "]"; */ TIId* tiid = new TIId(Location().introduce(), "U"); auto* ti_range = new TypeInst(Location().introduce(), Type::parint(), tiid); std::vector ranges(1); ranges[0] = ti_range; Type tx = Type::parsetint(-1); tx.ot(Type::OT_OPTIONAL); auto* x_ti = new TypeInst(Location().introduce(), tx, ranges, ident); auto* vd_x = new VarDecl(Location().introduce(), x_ti, "x"); vd_x->toplevel(false); auto* b_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_b = new VarDecl(Location().introduce(), b_ti, "b"); vd_b->toplevel(false); auto* j_ti = new TypeInst(Location().introduce(), Type::parbool()); auto* vd_j = new VarDecl(Location().introduce(), j_ti, "json"); vd_j->toplevel(false); auto* xx_range = new TypeInst(Location().introduce(), Type::parint(), nullptr); std::vector xx_ranges(1); xx_ranges[0] = xx_range; auto* xx_ti = new TypeInst(Location().introduce(), tx, xx_ranges, ident); std::vector array1dArgs(1); array1dArgs[0] = vd_x->id(); Call* array1dCall = new Call(Location().introduce(), "array1d", array1dArgs); auto* vd_xx = new VarDecl(Location().introduce(), xx_ti, "xx", array1dCall); vd_xx->toplevel(false); auto* idx_i_ti = new TypeInst(Location().introduce(), Type::parint()); auto* idx_i = new VarDecl(Location().introduce(), idx_i_ti, "i"); idx_i->toplevel(false); std::vector aa_xxi_idx(1); aa_xxi_idx[0] = idx_i->id(); auto* aa_xxi = new ArrayAccess(Location().introduce(), vd_xx->id(), aa_xxi_idx); std::vector _toString_ENUMArgs(3); _toString_ENUMArgs[0] = aa_xxi; _toString_ENUMArgs[1] = vd_b->id(); _toString_ENUMArgs[2] = vd_j->id(); Call* _toString_ENUM = new Call(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), _toString_ENUMArgs); std::vector index_set_xx_args(1); index_set_xx_args[0] = vd_xx->id(); Call* index_set_xx = new Call(Location().introduce(), "index_set", index_set_xx_args); std::vector gen_exps(1); gen_exps[0] = idx_i; Generator gen(gen_exps, index_set_xx, nullptr); Generators generators; generators.g.push_back(gen); auto* comp = new Comprehension(Location().introduce(), _toString_ENUM, generators, false); std::vector join_args(2); join_args[0] = new StringLit(Location().introduce(), ", "); join_args[1] = comp; Call* join = new Call(Location().introduce(), "join", join_args); auto* sl_open = new StringLit(Location().introduce(), "["); auto* bopp0 = new BinOp(Location().introduce(), sl_open, BOT_PLUSPLUS, join); auto* sl_close = new StringLit(Location().introduce(), "]"); auto* bopp1 = new BinOp(Location().introduce(), bopp0, BOT_PLUSPLUS, sl_close); std::vector let_args(1); let_args[0] = vd_xx; Let* let = new Let(Location().introduce(), let_args, bopp1); auto* ti_fi = new TypeInst(Location().introduce(), Type::parstring()); std::vector fi_params(3); fi_params[0] = vd_x; fi_params[1] = vd_b; fi_params[2] = vd_j; auto* fi = new FunctionI(Location().introduce(), create_enum_to_string_name(ident, "_toString_"), ti_fi, fi_params, let); enumItems->addItem(fi); } } void TopoSorter::add(EnvI& env, VarDeclI* vdi, bool handleEnums, Model* enumItems) { VarDecl* vd = vdi->e(); if (handleEnums && vd->ti()->isEnum()) { unsigned int enumId = env.registerEnum(vdi); Type vdt = vd->type(); vdt.enumId(enumId); vd->ti()->type(vdt); vd->type(vdt); if (vd->e() != nullptr) { create_enum_mapper(env, model, enumId, vd, enumItems); } } scopes.add(env, vd); } VarDecl* TopoSorter::get(EnvI& env, const ASTString& id_v, const Location& loc) { GCLock lock; Id* ident = new Id(Location(), id_v, nullptr); VarDecl* decl = scopes.find(ident); if (decl == nullptr) { std::ostringstream ss; ss << "undefined identifier `" << ident->str() << "'"; VarDecl* similar = scopes.findSimilar(ident); if (similar != nullptr) { ss << ", did you mean `" << *similar->id() << "'?"; } throw TypeError(env, loc, ss.str()); } return decl; } VarDecl* TopoSorter::checkId(EnvI& env, Id* ident, const Location& loc) { VarDecl* decl = scopes.find(ident); if (decl == nullptr) { std::ostringstream ss; ss << "undefined identifier `" << ident->str() << "'"; VarDecl* similar = scopes.findSimilar(ident); if (similar != nullptr) { ss << ", did you mean `" << *similar->id() << "'?"; } throw TypeError(env, loc, ss.str()); } auto pi = pos.find(decl); if (pi == pos.end()) { // new id scopes.pushToplevel(); run(env, decl); scopes.pop(); } else { // previously seen, check if circular if (pi->second == -1) { std::ostringstream ss; ss << "circular definition of `" << ident->str() << "'"; throw TypeError(env, loc, ss.str()); } } return decl; } VarDecl* TopoSorter::checkId(EnvI& env, const ASTString& id_v, const Location& loc) { GCLock lock; Id* id = new Id(loc, id_v, nullptr); return checkId(env, id, loc); } void TopoSorter::run(EnvI& env, Expression* e) { if (e == nullptr) { return; } switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: break; case Expression::E_SETLIT: { auto* sl = e->cast(); if (sl->isv() == nullptr && sl->fsv() == nullptr) { for (unsigned int i = 0; i < sl->v().size(); i++) { run(env, sl->v()[i]); } } } break; case Expression::E_ID: { if (e != constants().absent) { VarDecl* vd = checkId(env, e->cast(), e->loc()); e->cast()->decl(vd); } } break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); for (unsigned int i = 0; i < al->size(); i++) { run(env, (*al)[i]); } } break; case Expression::E_ARRAYACCESS: { auto* ae = e->cast(); run(env, ae->v()); for (unsigned int i = 0; i < ae->idx().size(); i++) { run(env, ae->idx()[i]); } } break; case Expression::E_COMP: { auto* ce = e->cast(); scopes.push(); for (int i = 0; i < ce->numberOfGenerators(); i++) { run(env, ce->in(i)); for (int j = 0; j < ce->numberOfDecls(i); j++) { run(env, ce->decl(i, j)); scopes.add(env, ce->decl(i, j)); } if (ce->where(i) != nullptr) { run(env, ce->where(i)); } } run(env, ce->e()); scopes.pop(); } break; case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { run(env, ite->ifExpr(i)); run(env, ite->thenExpr(i)); } run(env, ite->elseExpr()); } break; case Expression::E_BINOP: { auto* be = e->cast(); std::vector todo; todo.push_back(be->lhs()); todo.push_back(be->rhs()); while (!todo.empty()) { Expression* be = todo.back(); todo.pop_back(); if (auto* e_bo = be->dynamicCast()) { todo.push_back(e_bo->lhs()); todo.push_back(e_bo->rhs()); for (ExpressionSetIter it = e_bo->ann().begin(); it != e_bo->ann().end(); ++it) { run(env, *it); } } else { run(env, be); } } } break; case Expression::E_UNOP: { UnOp* ue = e->cast(); run(env, ue->e()); } break; case Expression::E_CALL: { Call* ce = e->cast(); for (unsigned int i = 0; i < ce->argCount(); i++) { run(env, ce->arg(i)); } } break; case Expression::E_VARDECL: { auto* ve = e->cast(); auto pi = pos.find(ve); if (pi == pos.end()) { pos.insert(std::pair(ve, -1)); run(env, ve->ti()); run(env, ve->e()); ve->payload(static_cast(decls.size())); decls.push_back(ve); pi = pos.find(ve); pi->second = static_cast(decls.size()) - 1; } else { assert(pi->second != -1); } } break; case Expression::E_TI: { auto* ti = e->cast(); for (unsigned int i = 0; i < ti->ranges().size(); i++) { run(env, ti->ranges()[i]); } run(env, ti->domain()); } break; case Expression::E_TIID: break; case Expression::E_LET: { Let* let = e->cast(); scopes.push(); for (unsigned int i = 0; i < let->let().size(); i++) { run(env, let->let()[i]); if (auto* vd = let->let()[i]->dynamicCast()) { scopes.add(env, vd); } } run(env, let->in()); VarDeclCmp poscmp(pos); std::stable_sort(let->let().begin(), let->let().end(), poscmp); for (unsigned int i = 0, j = 0; i < let->let().size(); i++) { if (auto* vd = let->let()[i]->dynamicCast()) { let->letOrig()[j++] = vd->e(); for (unsigned int k = 0; k < vd->ti()->ranges().size(); k++) { let->letOrig()[j++] = vd->ti()->ranges()[k]->domain(); } } } scopes.pop(); } break; } if (env.ignoreUnknownIds) { std::vector toDelete; for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { try { run(env, *it); } catch (TypeError&) { toDelete.push_back(*it); } for (Expression* de : toDelete) { e->ann().remove(de); } } } else { for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { run(env, *it); } } } KeepAlive add_coercion(EnvI& env, Model* m, Expression* e, const Type& funarg_t) { if (e->isa() && e->type().dim() > 0) { auto* aa = e->cast(); // Turn ArrayAccess into a slicing operation std::vector args; args.push_back(aa->v()); args.push_back(nullptr); std::vector slice; GCLock lock; for (unsigned int i = 0; i < aa->idx().size(); i++) { if (aa->idx()[i]->type().isSet()) { bool needIdxSet = true; bool needInter = true; if (auto* sl = aa->idx()[i]->dynamicCast()) { if ((sl->isv() != nullptr) && sl->isv()->size() == 1) { if (sl->isv()->min().isFinite() && sl->isv()->max().isFinite()) { args.push_back(sl); needIdxSet = false; } else if (sl->isv()->min() == -IntVal::infinity() && sl->isv()->max() == IntVal::infinity()) { needInter = false; } } } if (needIdxSet) { std::ostringstream oss; oss << "index_set"; if (aa->idx().size() > 1) { oss << "_" << (i + 1) << "of" << aa->idx().size(); } std::vector origIdxsetArgs(1); origIdxsetArgs[0] = aa->v(); Call* origIdxset = new Call(aa->v()->loc(), ASTString(oss.str()), origIdxsetArgs); FunctionI* fi = m->matchFn(env, origIdxset, false); if (fi == nullptr) { throw TypeError(env, e->loc(), "missing builtin " + oss.str()); } origIdxset->type(fi->rtype(env, origIdxsetArgs, false)); origIdxset->decl(fi); if (needInter) { auto* inter = new BinOp(aa->idx()[i]->loc(), aa->idx()[i], BOT_INTERSECT, origIdxset); inter->type(Type::parsetint()); args.push_back(inter); } else { args.push_back(origIdxset); } } slice.push_back(aa->idx()[i]); } else { auto* bo = new BinOp(aa->idx()[i]->loc(), aa->idx()[i], BOT_DOTDOT, aa->idx()[i]); bo->type(Type::parsetint()); slice.push_back(bo); } } auto* a_slice = new ArrayLit(e->loc(), slice); a_slice->type(Type::parsetint(1)); args[1] = a_slice; std::ostringstream oss; oss << "slice_" << (args.size() - 2) << "d"; Call* c = new Call(e->loc(), ASTString(oss.str()), args); FunctionI* fi = m->matchFn(env, c, false); if (fi == nullptr) { throw TypeError(env, e->loc(), "missing builtin " + oss.str()); } c->type(fi->rtype(env, args, false)); c->decl(fi); e = c; } if (e->type().dim() == funarg_t.dim() && (funarg_t.bt() == Type::BT_BOT || funarg_t.bt() == Type::BT_TOP || e->type().bt() == funarg_t.bt() || e->type().bt() == Type::BT_BOT)) { return e; } GCLock lock; Call* c = nullptr; if (e->type().dim() == 0 && funarg_t.dim() != 0) { if (e->type().isvar()) { throw TypeError(env, e->loc(), "cannot coerce var set into array"); } if (e->type().isOpt()) { throw TypeError(env, e->loc(), "cannot coerce opt set into array"); } std::vector set2a_args(1); set2a_args[0] = e; Call* set2a = new Call(e->loc(), ASTString("set2array"), set2a_args); FunctionI* fi = m->matchFn(env, set2a, false); if (fi != nullptr) { set2a->type(fi->rtype(env, set2a_args, false)); set2a->decl(fi); e = set2a; } } if (funarg_t.bt() == Type::BT_TOP || e->type().bt() == funarg_t.bt() || e->type().bt() == Type::BT_BOT) { KeepAlive ka(e); return ka; } std::vector args(1); args[0] = e; if (e->type().bt() == Type::BT_BOOL) { if (funarg_t.bt() == Type::BT_INT) { c = new Call(e->loc(), constants().ids.bool2int, args); } else if (funarg_t.bt() == Type::BT_FLOAT) { c = new Call(e->loc(), constants().ids.bool2float, args); } } else if (e->type().bt() == Type::BT_INT) { if (funarg_t.bt() == Type::BT_FLOAT) { c = new Call(e->loc(), constants().ids.int2float, args); } } if (c != nullptr) { FunctionI* fi = m->matchFn(env, c, false); assert(fi); Type ct = fi->rtype(env, args, false); ct.cv(e->type().cv()); c->type(ct); c->decl(fi); KeepAlive ka(c); return ka; } throw TypeError(env, e->loc(), "cannot determine coercion from type " + e->type().toString(env) + " to type " + funarg_t.toString(env)); } KeepAlive add_coercion(EnvI& env, Model* m, Expression* e, Expression* funarg) { return add_coercion(env, m, e, funarg->type()); } template class Typer { private: EnvI& _env; Model* _model; std::vector& _typeErrors; bool _ignoreUndefined; public: Typer(EnvI& env, Model* model, std::vector& typeErrors, bool ignoreUndefined) : _env(env), _model(model), _typeErrors(typeErrors), _ignoreUndefined(ignoreUndefined) {} /// Check annotations when expression is finished void exit(Expression* e) { for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { if (!(*it)->type().isAnn()) { throw TypeError(_env, (*it)->loc(), "expected annotation, got `" + (*it)->type().toString(_env) + "'"); } } } bool enter(Expression* /*e*/) { return true; } /// Visit integer literal void vIntLit(const IntLit& /*i*/) {} /// Visit floating point literal void vFloatLit(const FloatLit& /*f*/) {} /// Visit Boolean literal void vBoolLit(const BoolLit& /*b*/) {} /// Visit set literal void vSetLit(SetLit& sl) { Type ty; ty.st(Type::ST_SET); if (sl.isv() != nullptr) { ty.bt(Type::BT_INT); ty.enumId(sl.type().enumId()); sl.type(ty); return; } if (sl.fsv() != nullptr) { ty.bt(Type::BT_FLOAT); sl.type(ty); return; } unsigned int enumId = sl.v().size() > 0 ? sl.v()[0]->type().enumId() : 0; for (unsigned int i = 0; i < sl.v().size(); i++) { Type vi_t = sl.v()[i]->type(); vi_t.ot(Type::OT_PRESENT); if (sl.v()[i] == constants().absent) { continue; } if (vi_t.dim() > 0) { throw TypeError(_env, sl.v()[i]->loc(), "set literals cannot contain arrays"); } if (vi_t.st() == Type::ST_SET) { throw TypeError(_env, sl.v()[i]->loc(), "set literals cannot contain sets"); } if (vi_t.isvar()) { ty.ti(Type::TI_VAR); } if (vi_t.cv()) { ty.cv(true); } if (enumId != vi_t.enumId()) { enumId = 0; } if (!Type::btSubtype(vi_t, ty, true)) { if (ty.bt() == Type::BT_UNKNOWN || Type::btSubtype(ty, vi_t, true)) { ty.bt(vi_t.bt()); } else { throw TypeError(_env, sl.loc(), "non-uniform set literal"); } } } ty.enumId(enumId); if (ty.bt() == Type::BT_UNKNOWN) { ty.bt(Type::BT_BOT); } else { if (ty.isvar() && ty.bt() != Type::BT_INT) { if (ty.bt() == Type::BT_BOOL) { ty.bt(Type::BT_INT); } else { throw TypeError(_env, sl.loc(), "cannot coerce set literal element to var int"); } } for (unsigned int i = 0; i < sl.v().size(); i++) { sl.v()[i] = add_coercion(_env, _model, sl.v()[i], ty)(); } } sl.type(ty); } /// Visit string literal void vStringLit(const StringLit& /*sl*/) {} /// Visit identifier void vId(Id& id) { if (&id != constants().absent) { assert(!id.decl()->type().isunknown()); id.type(id.decl()->type()); } } /// Visit anonymous variable void vAnonVar(const AnonVar& /*v*/) {} /// Visit array literal void vArrayLit(ArrayLit& al) { Type ty; ty.dim(static_cast(al.dims())); std::vector anons; bool haveAbsents = false; bool haveInferredType = false; for (unsigned int i = 0; i < al.size(); i++) { Expression* vi = al[i]; if (vi->type().dim() > 0) { throw TypeError(_env, vi->loc(), "arrays cannot be elements of arrays"); } if (vi == constants().absent) { haveAbsents = true; } auto* av = vi->dynamicCast(); if (av != nullptr) { ty.ti(Type::TI_VAR); anons.push_back(av); } else if (vi->type().isvar()) { ty.ti(Type::TI_VAR); } if (vi->type().cv()) { ty.cv(true); } if (vi->type().isOpt()) { ty.ot(Type::OT_OPTIONAL); } if (ty.bt() == Type::BT_UNKNOWN) { if (av == nullptr) { if (haveInferredType) { if (ty.st() != vi->type().st() && vi->type().ot() != Type::OT_OPTIONAL) { throw TypeError(_env, al.loc(), "non-uniform array literal"); } } else { haveInferredType = true; ty.st(vi->type().st()); } if (vi->type().bt() != Type::BT_BOT) { ty.bt(vi->type().bt()); ty.enumId(vi->type().enumId()); } } } else { if (av == nullptr) { if (vi->type().bt() == Type::BT_BOT) { if (vi->type().st() != ty.st() && vi->type().ot() != Type::OT_OPTIONAL) { throw TypeError(_env, al.loc(), "non-uniform array literal"); } if (vi->type().enumId() != 0 && ty.enumId() != vi->type().enumId()) { ty.enumId(0); } } else { unsigned int tyEnumId = ty.enumId(); ty.enumId(vi->type().enumId()); if (Type::btSubtype(ty, vi->type(), true)) { ty.bt(vi->type().bt()); } if (tyEnumId != vi->type().enumId()) { ty.enumId(0); } if (!Type::btSubtype(vi->type(), ty, true) || ty.st() != vi->type().st()) { throw TypeError(_env, al.loc(), "non-uniform array literal"); } } } } } if (ty.bt() == Type::BT_UNKNOWN) { ty.bt(Type::BT_BOT); if (!anons.empty()) { throw TypeError(_env, al.loc(), "array literal must contain at least one non-anonymous variable"); } if (haveAbsents) { throw TypeError(_env, al.loc(), "array literal must contain at least one non-absent value"); } } else { Type at = ty; at.dim(0); if (at.ti() == Type::TI_VAR && at.st() == Type::ST_SET && at.bt() != Type::BT_INT) { if (at.bt() == Type::BT_BOOL) { ty.bt(Type::BT_INT); at.bt(Type::BT_INT); } else { throw TypeError(_env, al.loc(), "cannot coerce array element to var set of int"); } } for (auto& anon : anons) { anon->type(at); } for (unsigned int i = 0; i < al.size(); i++) { al.set(i, add_coercion(_env, _model, al[i], at)()); } } if (ty.enumId() != 0) { std::vector enumIds(ty.dim() + 1); for (int i = 0; i < ty.dim(); i++) { enumIds[i] = 0; } enumIds[ty.dim()] = ty.enumId(); ty.enumId(_env.registerArrayEnum(enumIds)); } al.type(ty); } /// Visit array access void vArrayAccess(ArrayAccess& aa) { if (aa.v()->type().dim() == 0) { if (aa.v()->type().st() == Type::ST_SET) { Type tv = aa.v()->type(); tv.st(Type::ST_PLAIN); tv.dim(1); aa.v(add_coercion(_env, _model, aa.v(), tv)()); } else { std::ostringstream oss; oss << "array access attempted on expression of type `" << aa.v()->type().toString(_env) << "'"; throw TypeError(_env, aa.v()->loc(), oss.str()); } } else if (aa.v()->isa()) { aa.v(add_coercion(_env, _model, aa.v(), aa.v()->type())()); } if (aa.v()->type().dim() != aa.idx().size()) { std::ostringstream oss; oss << aa.v()->type().dim() << "-dimensional array accessed with " << aa.idx().size() << (aa.idx().size() == 1 ? " expression" : " expressions"); throw TypeError(_env, aa.v()->loc(), oss.str()); } Type tt = aa.v()->type(); if (tt.enumId() != 0) { const std::vector& arrayEnumIds = _env.getArrayEnum(tt.enumId()); std::vector newArrayEnumids; for (unsigned int i = 0; i < arrayEnumIds.size() - 1; i++) { Expression* aai = aa.idx()[i]; // Check if index is slice operator, and convert to correct enum type if (auto* aai_sl = aai->dynamicCast()) { if (IntSetVal* aai_isv = aai_sl->isv()) { if (aai_isv->min() == -IntVal::infinity() && aai_isv->max() == IntVal::infinity()) { Type aai_sl_t = aai_sl->type(); aai_sl_t.enumId(arrayEnumIds[i]); aai_sl->type(aai_sl_t); } } } else if (auto* aai_bo = aai->dynamicCast()) { if (aai_bo->op() == BOT_DOTDOT) { Type aai_bo_t = aai_bo->type(); if (auto* il = aai_bo->lhs()->dynamicCast()) { if (il->v() == -IntVal::infinity()) { // Expression is ..X, so result gets enum type of X aai_bo_t.enumId(aai_bo->rhs()->type().enumId()); } } else if (auto* il = aai_bo->rhs()->dynamicCast()) { if (il->v() == IntVal::infinity()) { // Expression is X.., so result gets enum type of X aai_bo_t.enumId(aai_bo->lhs()->type().enumId()); } } aai_bo->type(aai_bo_t); } } if (aai->type().isSet()) { newArrayEnumids.push_back(arrayEnumIds[i]); } if (arrayEnumIds[i] != 0) { if (aa.idx()[i]->type().enumId() != arrayEnumIds[i]) { std::ostringstream oss; oss << "array index "; if (aa.idx().size() > 1) { oss << (i + 1) << " "; } oss << "must be `" << _env.getEnum(arrayEnumIds[i])->e()->id()->str() << "', but is `" << aa.idx()[i]->type().toString(_env) << "'"; throw TypeError(_env, aa.loc(), oss.str()); } } } if (newArrayEnumids.empty()) { tt.enumId(arrayEnumIds[arrayEnumIds.size() - 1]); } else { newArrayEnumids.push_back(arrayEnumIds[arrayEnumIds.size() - 1]); int newEnumId = _env.registerArrayEnum(newArrayEnumids); tt.enumId(newEnumId); } } int n_dimensions = 0; bool isVarAccess = false; bool isSlice = false; for (unsigned int i = 0; i < aa.idx().size(); i++) { Expression* aai = aa.idx()[i]; if (aai->isa()) { aai->type(Type::varint()); } if ((aai->type().bt() != Type::BT_INT && aai->type().bt() != Type::BT_BOOL) || aai->type().dim() != 0) { throw TypeError(_env, aa.loc(), "array index must be `int' or `set of int', but is `" + aai->type().toString(_env) + "'"); } if (aai->type().isSet()) { if (isVarAccess || aai->type().isvar()) { throw TypeError(_env, aa.loc(), "array slicing with variable range or index not supported"); } isSlice = true; aa.idx()[i] = add_coercion(_env, _model, aai, Type::varsetint())(); n_dimensions++; } else { aa.idx()[i] = add_coercion(_env, _model, aai, Type::varint())(); } if (aai->type().isOpt()) { tt.ot(Type::OT_OPTIONAL); } if (aai->type().isvar()) { isVarAccess = true; if (isSlice) { throw TypeError(_env, aa.loc(), "array slicing with variable range or index not supported"); } tt.ti(Type::TI_VAR); if (tt.bt() == Type::BT_ANN || tt.bt() == Type::BT_STRING) { throw TypeError(_env, aai->loc(), std::string("array access using a variable not supported for array of ") + (tt.bt() == Type::BT_ANN ? "ann" : "string")); } } tt.dim(n_dimensions); if (aai->type().cv()) { tt.cv(true); } } aa.type(tt); } /// Visit array comprehension void vComprehension(Comprehension& c) { Type tt = c.e()->type(); typedef std::unordered_map> genMap_t; typedef std::unordered_map> whereMap_t; genMap_t generatorMap; whereMap_t whereMap; int declCount = 0; for (int i = 0; i < c.numberOfGenerators(); i++) { for (int j = 0; j < c.numberOfDecls(i); j++) { generatorMap[c.decl(i, j)] = std::pair(i, declCount++); whereMap[c.decl(i, j)] = std::vector(); } Expression* g_in = c.in(i); if (g_in != nullptr) { const Type& ty_in = g_in->type(); if (ty_in == Type::varsetint()) { if (!c.set()) { tt.ot(Type::OT_OPTIONAL); } tt.ti(Type::TI_VAR); tt.cv(true); } if (ty_in.cv()) { tt.cv(true); } if (c.where(i) != nullptr) { if (c.where(i)->type() == Type::varbool()) { if (!c.set()) { tt.ot(Type::OT_OPTIONAL); } tt.ti(Type::TI_VAR); tt.cv(true); } else if (c.where(i)->type() != Type::parbool()) { throw TypeError( _env, c.where(i)->loc(), "where clause must be bool, but is `" + c.where(i)->type().toString(_env) + "'"); } if (c.where(i)->type().cv()) { tt.cv(true); } // Try to move parts of the where clause to earlier generators std::vector wherePartsStack; std::vector whereParts; wherePartsStack.push_back(c.where(i)); while (!wherePartsStack.empty()) { Expression* e = wherePartsStack.back(); wherePartsStack.pop_back(); if (auto* bo = e->dynamicCast()) { if (bo->op() == BOT_AND) { wherePartsStack.push_back(bo->rhs()); wherePartsStack.push_back(bo->lhs()); } else { whereParts.push_back(e); } } else { whereParts.push_back(e); } } for (auto* wp : whereParts) { class FindLatestGen : public EVisitor { public: int declIndex; VarDecl* decl; const genMap_t& generatorMap; Comprehension* comp; FindLatestGen(const genMap_t& generatorMap0, Comprehension* comp0) : declIndex(-1), decl(comp0->decl(0, 0)), generatorMap(generatorMap0), comp(comp0) {} void vId(const Id& ident) { auto it = generatorMap.find(ident.decl()); if (it != generatorMap.end() && it->second.second > declIndex) { declIndex = it->second.second; decl = ident.decl(); int gen = it->second.first; while (comp->in(gen) == nullptr && gen < comp->numberOfGenerators() - 1) { declIndex++; gen++; decl = comp->decl(gen, 0); } } } } flg(generatorMap, &c); top_down(flg, wp); whereMap[flg.decl].push_back(wp); } } } else { assert(c.where(i) != nullptr); whereMap[c.decl(i, 0)].push_back(c.where(i)); } } { GCLock lock; Generators generators; for (int i = 0; i < c.numberOfGenerators(); i++) { std::vector decls; for (int j = 0; j < c.numberOfDecls(i); j++) { decls.push_back(c.decl(i, j)); KeepAlive c_in = c.in(i) != nullptr ? add_coercion(_env, _model, c.in(i), c.in(i)->type()) : nullptr; if (!whereMap[c.decl(i, j)].empty()) { // need a generator for all the decls up to this point Expression* whereExpr = whereMap[c.decl(i, j)][0]; for (unsigned int k = 1; k < whereMap[c.decl(i, j)].size(); k++) { GCLock lock; auto* bo = new BinOp(Location().introduce(), whereExpr, BOT_AND, whereMap[c.decl(i, j)][k]); Type bo_t = whereMap[c.decl(i, j)][k]->type().isPar() && whereExpr->type().isPar() ? Type::parbool() : Type::varbool(); if (whereMap[c.decl(i, j)][k]->type().cv() || whereExpr->type().cv()) { bo_t.cv(true); } bo->type(bo_t); whereExpr = bo; } generators.g.emplace_back(decls, c_in(), whereExpr); decls.clear(); } else if (j == c.numberOfDecls(i) - 1) { generators.g.emplace_back(decls, c_in(), nullptr); decls.clear(); } } } c.init(c.e(), generators); } if (c.set()) { if (c.e()->type().dim() != 0 || c.e()->type().st() == Type::ST_SET) { throw TypeError(_env, c.e()->loc(), "set comprehension expression must be scalar, but is `" + c.e()->type().toString(_env) + "'"); } tt.st(Type::ST_SET); if (tt.isvar()) { c.e(add_coercion(_env, _model, c.e(), Type::varint())()); tt.bt(Type::BT_INT); } } else { if (c.e()->type().dim() != 0) { throw TypeError(_env, c.e()->loc(), "array comprehension expression cannot be an array"); } tt.dim(1); if (tt.enumId() != 0) { std::vector enumIds(2); enumIds[0] = 0; enumIds[1] = tt.enumId(); tt.enumId(_env.registerArrayEnum(enumIds)); } } c.type(tt); } /// Visit array comprehension generator void vComprehensionGenerator(Comprehension& c, int gen_i) { Expression* g_in = c.in(gen_i); if (g_in == nullptr) { // This is an "assignment generator" (i = expr) assert(c.where(gen_i) != nullptr); assert(c.numberOfDecls(gen_i) == 1); const Type& ty_where = c.where(gen_i)->type(); c.decl(gen_i, 0)->type(ty_where); c.decl(gen_i, 0)->ti()->type(ty_where); } else { const Type& ty_in = g_in->type(); if (ty_in != Type::varsetint() && ty_in != Type::parsetint() && ty_in.dim() != 1) { throw TypeError(_env, g_in->loc(), "generator expression must be (par or var) set of int or one-dimensional " "array, but is `" + ty_in.toString(_env) + "'"); } Type ty_id; if (ty_in.dim() == 0) { ty_id = Type::parint(); ty_id.enumId(ty_in.enumId()); } else { ty_id = ty_in; if (ty_in.enumId() != 0) { const std::vector& enumIds = _env.getArrayEnum(ty_in.enumId()); ty_id.enumId(enumIds.back()); } ty_id.dim(0); } for (int j = 0; j < c.numberOfDecls(gen_i); j++) { c.decl(gen_i, j)->type(ty_id); c.decl(gen_i, j)->ti()->type(ty_id); } } } /// Visit if-then-else void vITE(ITE& ite) { bool mustBeBool = false; if (ite.elseExpr() == nullptr) { // this is an "if then endif" so the must be bool ite.elseExpr(constants().boollit(true)); mustBeBool = true; } Type tret = ite.elseExpr()->type(); std::vector anons; bool allpar = !(tret.isvar()); if (tret.isunknown()) { if (auto* av = ite.elseExpr()->dynamicCast()) { allpar = false; anons.push_back(av); } else { throw TypeError(_env, ite.elseExpr()->loc(), "cannot infer type of expression in `else' branch of conditional"); } } bool allpresent = !(tret.isOpt()); bool varcond = false; for (int i = 0; i < ite.size(); i++) { Expression* eif = ite.ifExpr(i); Expression* ethen = ite.thenExpr(i); varcond = varcond || (eif->type() == Type::varbool()); if (eif->type() != Type::parbool() && eif->type() != Type::varbool()) { throw TypeError( _env, eif->loc(), "expected bool conditional expression, got `" + eif->type().toString(_env) + "'"); } if (eif->type().cv()) { tret.cv(true); } if (ethen->type().isunknown()) { if (auto* av = ethen->dynamicCast()) { allpar = false; anons.push_back(av); } else { throw TypeError(_env, ethen->loc(), "cannot infer type of expression in `then' branch of conditional"); } } else { if (tret.isbot() || tret.isunknown()) { tret.bt(ethen->type().bt()); } if (mustBeBool && (ethen->type().bt() != Type::BT_BOOL || ethen->type().dim() > 0 || ethen->type().st() != Type::ST_PLAIN || ethen->type().ot() != Type::OT_PRESENT)) { throw TypeError(_env, ite.loc(), std::string("conditional without `else' branch must have bool type, ") + "but `then' branch has type `" + ethen->type().toString(_env) + "'"); } if ((!ethen->type().isbot() && !Type::btSubtype(ethen->type(), tret, true) && !Type::btSubtype(tret, ethen->type(), true)) || ethen->type().st() != tret.st() || ethen->type().dim() != tret.dim()) { throw TypeError(_env, ethen->loc(), "type mismatch in branches of conditional. `then' branch has type `" + ethen->type().toString(_env) + "', but `else' branch has type `" + tret.toString(_env) + "'"); } if (Type::btSubtype(tret, ethen->type(), true)) { tret.bt(ethen->type().bt()); } if (tret.enumId() != 0 && ethen->type().enumId() == 0) { tret.enumId(0); } if (ethen->type().isvar()) { allpar = false; } if (ethen->type().isOpt()) { allpresent = false; } if (ethen->type().cv()) { tret.cv(true); } } } Type tret_var(tret); tret_var.ti(Type::TI_VAR); for (auto& anon : anons) { anon->type(tret_var); } for (int i = 0; i < ite.size(); i++) { ite.thenExpr(i, add_coercion(_env, _model, ite.thenExpr(i), tret)()); } ite.elseExpr(add_coercion(_env, _model, ite.elseExpr(), tret)()); /// TODO: perhaps extend flattener to array types, but for now throw an error if (varcond && tret.dim() > 0) { throw TypeError(_env, ite.loc(), "conditional with var condition cannot have array type"); } if (varcond || !allpar) { tret.ti(Type::TI_VAR); } if (!allpresent) { tret.ot(Type::OT_OPTIONAL); } ite.type(tret); } /// Visit binary operator void vBinOp(BinOp& bop) { std::vector args(2); args[0] = bop.lhs(); args[1] = bop.rhs(); if (FunctionI* fi = _model->matchFn(_env, bop.opToString(), args, true)) { bop.lhs(add_coercion(_env, _model, bop.lhs(), fi->argtype(_env, args, 0))()); bop.rhs(add_coercion(_env, _model, bop.rhs(), fi->argtype(_env, args, 1))()); args[0] = bop.lhs(); args[1] = bop.rhs(); Type ty = fi->rtype(_env, args, true); ty.cv(bop.lhs()->type().cv() || bop.rhs()->type().cv()); bop.type(ty); if (fi->e() != nullptr) { bop.decl(fi); } else { bop.decl(nullptr); } if (bop.lhs()->type().isint() && bop.rhs()->type().isint() && (bop.op() == BOT_EQ || bop.op() == BOT_GQ || bop.op() == BOT_GR || bop.op() == BOT_NQ || bop.op() == BOT_LE || bop.op() == BOT_LQ)) { Call* call = bop.lhs()->dynamicCast(); Expression* rhs = bop.rhs(); BinOpType bot = bop.op(); if (call == nullptr) { call = bop.rhs()->dynamicCast(); rhs = bop.lhs(); switch (bop.op()) { case BOT_LQ: bot = BOT_GQ; break; case BOT_LE: bot = BOT_GR; break; case BOT_GQ: bot = BOT_LQ; break; case BOT_GR: bot = BOT_LE; break; default: break; } } if ((call != nullptr) && (call->id() == "count" || call->id() == "sum") && call->type().isvar()) { if (call->argCount() == 1 && call->arg(0)->isa()) { auto* comp = call->arg(0)->cast(); auto* inner_bo = comp->e()->dynamicCast(); if (inner_bo != nullptr) { if (inner_bo->op() == BOT_EQ && inner_bo->lhs()->type().isint()) { Expression* generated = inner_bo->lhs(); Expression* comparedTo = inner_bo->rhs(); if (comp->containsBoundVariable(comparedTo)) { if (comp->containsBoundVariable(generated)) { comparedTo = nullptr; } else { std::swap(generated, comparedTo); } } if (comparedTo != nullptr) { GCLock lock; ASTString cid; switch (bot) { case BOT_EQ: cid = ASTString("count_eq"); break; case BOT_GQ: cid = ASTString("count_leq"); break; case BOT_GR: cid = ASTString("count_lt"); break; case BOT_LQ: cid = ASTString("count_geq"); break; case BOT_LE: cid = ASTString("count_gt"); break; case BOT_NQ: cid = ASTString("count_neq"); break; default: assert(false); } comp->e(generated); Type ct = comp->type(); ct.bt(generated->type().bt()); comp->type(ct); std::vector args({comp, comparedTo, rhs}); FunctionI* newCall_decl = _model->matchFn(_env, cid, args, true); if (newCall_decl == nullptr) { std::ostringstream ss; ss << "could not replace binary operator by call to " << cid; throw InternalError(ss.str()); } Call* newCall = bop.morph(cid, args); newCall->decl(newCall_decl); } } } } else if (call->argCount() == 2 && call->arg(0)->type().isIntArray() && call->arg(1)->type().isint()) { GCLock lock; ASTString cid; switch (bot) { case BOT_EQ: cid = ASTString("count_eq"); break; case BOT_GQ: cid = ASTString("count_leq"); break; case BOT_GR: cid = ASTString("count_lt"); break; case BOT_LQ: cid = ASTString("count_geq"); break; case BOT_LE: cid = ASTString("count_gt"); break; case BOT_NQ: cid = ASTString("count_neq"); break; default: assert(false); } std::vector args({call->arg(0), call->arg(1), rhs}); FunctionI* newCall_decl = _model->matchFn(_env, cid, args, true); if (newCall_decl == nullptr) { std::ostringstream ss; ss << "could not replace binary operator by call to " << cid; throw InternalError(ss.str()); } Call* newCall = bop.morph(cid, args); newCall->decl(newCall_decl); } } } } else { std::ostringstream ss; ss << "type error in operator application for `" << bop.opToString() << "'. No matching operator found with left-hand side type `" << bop.lhs()->type().toString(_env) << "' and right-hand side type `" << bop.rhs()->type().toString(_env) << "'"; throw TypeError(_env, bop.loc(), ss.str()); } } /// Visit unary operator void vUnOp(UnOp& uop) { std::vector args(1); args[0] = uop.e(); if (FunctionI* fi = _model->matchFn(_env, uop.opToString(), args, true)) { uop.e(add_coercion(_env, _model, uop.e(), fi->argtype(_env, args, 0))()); args[0] = uop.e(); Type ty = fi->rtype(_env, args, true); ty.cv(uop.e()->type().cv()); uop.type(ty); if (fi->e() != nullptr) { uop.decl(fi); } } else { std::ostringstream ss; ss << "type error in operator application for `" << uop.opToString() << "'. No matching operator found with type `" << uop.e()->type().toString(_env) << "'"; throw TypeError(_env, uop.loc(), ss.str()); } } /// Visit call void vCall(Call& call) { std::vector args(call.argCount()); for (auto i = static_cast(args.size()); (i--) != 0U;) { args[i] = call.arg(i); } FunctionI* fi = _model->matchFn(_env, &call, true, true); if (fi != nullptr && fi->id() == "symmetry_breaking_constraint" && fi->params().size() == 1 && fi->params()[0]->type().isbool()) { GCLock lock; call.id(ASTString("mzn_symmetry_breaking_constraint")); fi = _model->matchFn(_env, &call, true, true); } else if (fi != nullptr && fi->id() == "redundant_constraint" && fi->params().size() == 1 && fi->params()[0]->type().isbool()) { GCLock lock; call.id(ASTString("mzn_redundant_constraint")); fi = _model->matchFn(_env, &call, true, true); } if ((fi->e() != nullptr) && fi->e()->isa()) { Call* next_call = fi->e()->cast(); if ((next_call->decl() != nullptr) && next_call->argCount() == fi->params().size() && _model->sameOverloading(_env, args, fi, next_call->decl())) { bool macro = true; for (unsigned int i = 0; i < fi->params().size(); i++) { if (!Expression::equal(next_call->arg(i), fi->params()[i]->id())) { macro = false; break; } } if (macro) { // Call is not a macro if it has a reification implementation GCLock lock; ASTString reif_id = _env.reifyId(fi->id()); std::vector tt(fi->params().size() + 1); for (unsigned int i = 0; i < fi->params().size(); i++) { tt[i] = fi->params()[i]->type(); } tt[fi->params().size()] = Type::varbool(); macro = _model->matchFn(_env, reif_id, tt, true) == nullptr; } if (macro) { call.decl(next_call->decl()); for (ExpressionSetIter esi = next_call->ann().begin(); esi != next_call->ann().end(); ++esi) { call.addAnnotation(*esi); } call.rehash(); fi = next_call->decl(); } } } bool cv = false; for (unsigned int i = 0; i < args.size(); i++) { if (auto* c = call.arg(i)->dynamicCast()) { Type t_before = c->e()->type(); Type t = fi->argtype(_env, args, i); t.dim(0); c->e(add_coercion(_env, _model, c->e(), t)()); Type t_after = c->e()->type(); if (t_before != t_after) { Type ct = c->type(); ct.bt(t_after.bt()); c->type(ct); } } else { args[i] = add_coercion(_env, _model, call.arg(i), fi->argtype(_env, args, i))(); call.arg(i, args[i]); } cv = cv || args[i]->type().cv(); } // Replace par enums with their string versions if (call.id() == "format" || call.id() == "show" || call.id() == "showDzn" || call.id() == "showJSON") { if (call.arg(call.argCount() - 1)->type().isPar()) { unsigned int enumId = call.arg(call.argCount() - 1)->type().enumId(); if (enumId != 0U && call.arg(call.argCount() - 1)->type().dim() != 0) { const std::vector& enumIds = _env.getArrayEnum(enumId); enumId = enumIds[enumIds.size() - 1]; } if (enumId > 0) { VarDecl* enumDecl = _env.getEnum(enumId)->e(); if (enumDecl->e() != nullptr) { Id* ti_id = _env.getEnum(enumId)->e()->id(); GCLock lock; std::vector args(3); args[0] = call.arg(call.argCount() - 1); if (args[0]->type().dim() > 1) { std::vector a1dargs(1); a1dargs[0] = args[0]; Call* array1d = new Call(Location().introduce(), ASTString("array1d"), a1dargs); Type array1dt = args[0]->type(); array1dt.dim(1); array1d->type(array1dt); args[0] = array1d; } args[1] = constants().boollit(call.id() == "showDzn"); args[2] = constants().boollit(call.id() == "showJSON"); ASTString enumName(create_enum_to_string_name(ti_id, "_toString_")); call.id(enumName); call.args(args); if (call.id() == "showDzn") { call.id(constants().ids.show); } fi = _model->matchFn(_env, &call, false, true); } } } } // Set type and decl Type ty = fi->rtype(_env, args, true); ty.cv(cv); call.type(ty); if (Call* deprecated = fi->ann().getCall(constants().ann.mzn_deprecated)) { // rewrite this call into a call to mzn_deprecate(..., e) GCLock lock; std::vector params(call.argCount()); for (unsigned int i = 0; i < params.size(); i++) { params[i] = call.arg(i); } Call* origCall = new Call(call.loc(), call.id(), params); origCall->type(ty); origCall->decl(fi); call.id(constants().ids.mzn_deprecate); std::vector args( {new StringLit(Location(), fi->id()), deprecated->arg(0), deprecated->arg(1), origCall}); call.args(args); FunctionI* deprecated_fi = _model->matchFn(_env, &call, false, true); call.decl(deprecated_fi); } else { call.decl(fi); } } /// Visit let void vLet(Let& let) { bool cv = false; bool isVar = false; for (unsigned int i = 0, j = 0; i < let.let().size(); i++) { Expression* li = let.let()[i]; cv = cv || li->type().cv(); if (auto* vdi = li->dynamicCast()) { if (vdi->e() == nullptr && vdi->type().isSet() && vdi->type().isvar() && vdi->ti()->domain() == nullptr) { std::ostringstream ss; ss << "set element type for `" << vdi->id()->str() << "' is not finite"; _typeErrors.emplace_back(_env, vdi->loc(), ss.str()); } if (vdi->type().isPar() && (vdi->e() == nullptr)) { std::ostringstream ss; ss << "let variable `" << vdi->id()->v() << "' must be initialised"; throw TypeError(_env, vdi->loc(), ss.str()); } if (vdi->ti()->hasTiVariable()) { std::ostringstream ss; ss << "type-inst variables not allowed in type-inst for let variable `" << vdi->id()->str() << "'"; _typeErrors.emplace_back(_env, vdi->loc(), ss.str()); } let.letOrig()[j++] = vdi->e(); for (unsigned int k = 0; k < vdi->ti()->ranges().size(); k++) { let.letOrig()[j++] = vdi->ti()->ranges()[k]->domain(); } } isVar |= li->type().isvar(); } Type ty = let.in()->type(); ty.cv(cv); if (isVar && ty.bt() == Type::BT_BOOL && ty.dim() == 0) { ty.ti(Type::TI_VAR); } let.type(ty); } /// Visit variable declaration void vVarDecl(VarDecl& vd) { if (ignoreVarDecl) { if (vd.e() != nullptr) { Type vdt = vd.ti()->type(); Type vet = vd.e()->type(); if (vdt.enumId() != 0 && vdt.dim() > 0 && (vd.e()->isa() || vd.e()->isa() || (vd.e()->isa() && vd.e()->cast()->op() == BOT_PLUSPLUS))) { // Special case: index sets of array literals and comprehensions automatically // coerce to any enum index set const std::vector& enumIds = _env.getArrayEnum(vdt.enumId()); if (enumIds[enumIds.size() - 1] == 0) { vdt.enumId(0); } else { std::vector nEnumIds(enumIds.size()); for (unsigned int i = 0; i < nEnumIds.size() - 1; i++) { nEnumIds[i] = 0; } nEnumIds[nEnumIds.size() - 1] = enumIds[enumIds.size() - 1]; vdt.enumId(_env.registerArrayEnum(nEnumIds)); } } else if (vd.ti()->isEnum() && vd.e()->isa()) { if (vd.e()->cast()->id() == "anon_enum") { vet.enumId(vdt.enumId()); } } if (vd.type().isunknown()) { vd.ti()->type(vet); vd.type(vet); } else if (!_env.isSubtype(vet, vdt, true)) { if (vet == Type::bot(1) && vd.e()->isa() && vd.e()->cast()->size() == 0 && vdt.dim() != 0) { // NOLINT(bugprone-branch-clone): see TODO in other branch // this is okay: assigning an empty array (one-dimensional) to an array variable } else if (vd.ti()->isEnum() && vet == Type::parsetint()) { // let's ignore this for now (TODO: add an annotation to make sure only // compiler-generated ones are accepted) } else { const Location& loc = vd.e()->loc().isNonAlloc() ? vd.loc() : vd.e()->loc(); std::ostringstream ss; ss << "initialisation value for `" << vd.id()->str() << "' has invalid type-inst: expected `" << vd.ti()->type().toString(_env) << "', actual `" << vd.e()->type().toString(_env) << "'"; _typeErrors.emplace_back(_env, loc, ss.str()); } } else { vd.e(add_coercion(_env, _model, vd.e(), vd.ti()->type())()); } } else { assert(!vd.type().isunknown()); } } else { vd.type(vd.ti()->type()); vd.id()->type(vd.type()); } } /// Visit type inst void vTypeInst(TypeInst& ti) { Type tt = ti.type(); bool foundEnum = ti.ranges().size() > 0 && (ti.domain() != nullptr) && ti.domain()->type().enumId() != 0; if (ti.ranges().size() > 0) { bool foundTIId = false; for (unsigned int i = 0; i < ti.ranges().size(); i++) { TypeInst* ri = ti.ranges()[i]; assert(ri != nullptr); if (ri->type().cv()) { tt.cv(true); } if (ri->type().enumId() != 0) { foundEnum = true; } if (ri->type() == Type::top()) { // if (foundTIId) { // throw TypeError(_env,ri->loc(), // "only one type-inst variable allowed in array index"); // } else { foundTIId = true; // } } else if (ri->type() != Type::parint()) { assert(ri->isa()); auto* riti = ri->cast(); if (riti->domain() != nullptr) { throw TypeError(_env, ri->loc(), "array index set expression has invalid type, expected `set of int', " "actual `set of " + ri->type().toString(_env) + "'"); } throw TypeError(_env, ri->loc(), "cannot use `" + ri->type().toString(_env) + "' as array index set (did you mean `int'?)"); } } tt.dim(foundTIId ? -1 : static_cast(ti.ranges().size())); } if ((ti.domain() != nullptr) && ti.domain()->type().cv()) { tt.cv(true); } if (ti.domain() != nullptr) { if (TIId* tiid = ti.domain()->dynamicCast()) { if (tiid->isEnum()) { tt.bt(Type::BT_INT); } } else { if (ti.domain()->type().ti() != Type::TI_PAR || ti.domain()->type().st() != Type::ST_SET) { throw TypeError( _env, ti.domain()->loc().isNonAlloc() ? ti.loc() : ti.domain()->loc(), "type-inst must be par set but is `" + ti.domain()->type().toString(_env) + "'"); } if (ti.domain()->type().dim() != 0) { throw TypeError(_env, ti.domain()->loc(), "type-inst cannot be an array"); } } } if (tt.isunknown() && (ti.domain() != nullptr)) { assert(ti.domain()); switch (ti.domain()->type().bt()) { case Type::BT_INT: case Type::BT_FLOAT: break; case Type::BT_BOT: { Type tidt = ti.domain()->type(); tidt.bt(Type::BT_INT); ti.domain()->type(tidt); } break; default: throw TypeError(_env, ti.domain()->loc(), "type-inst must be int or float"); } tt.bt(ti.domain()->type().bt()); tt.enumId(ti.domain()->type().enumId()); } else { // assert(ti.domain()==NULL || ti.domain()->isa()); } if (foundEnum) { std::vector enumIds(ti.ranges().size() + 1); for (unsigned int i = 0; i < ti.ranges().size(); i++) { enumIds[i] = ti.ranges()[i]->type().enumId(); } enumIds[ti.ranges().size()] = ti.domain() != nullptr ? ti.domain()->type().enumId() : 0; int arrayEnumId = _env.registerArrayEnum(enumIds); tt.enumId(arrayEnumId); } if (tt.st() == Type::ST_SET && tt.ti() == Type::TI_VAR && tt.bt() != Type::BT_INT && tt.bt() != Type::BT_TOP) { throw TypeError(_env, ti.loc(), "var set element types other than `int' not allowed"); } ti.type(tt); } void vTIId(TIId& id) {} }; void typecheck(Env& env, Model* origModel, std::vector& typeErrors, bool ignoreUndefinedParameters, bool allowMultiAssignment, bool isFlatZinc) { Model* m; if (!isFlatZinc && origModel == env.model()) { // Combine all items into single model auto* combinedModel = new Model; class Combiner : public ItemVisitor { public: Model* m; Combiner(Model* m0) : m(m0) {} bool enter(Item* i) const { if (!i->isa()) { m->addItem(i); } return true; } } _combiner(combinedModel); iter_items(_combiner, origModel); env.envi().originalModel = origModel; env.envi().model = combinedModel; m = combinedModel; } else { m = origModel; } // Topological sorting TopoSorter ts(m); std::vector functionItems; std::vector assignItems; auto* enumItems = new Model; class TSVFuns : public ItemVisitor { public: EnvI& env; Model* model; std::vector& fis; TSVFuns(EnvI& env0, Model* model0, std::vector& fis0) : env(env0), model(model0), fis(fis0) {} void vFunctionI(FunctionI* i) { (void)model->registerFn(env, i); fis.push_back(i); } } _tsvf(env.envi(), m, functionItems); iter_items(_tsvf, m); class TSV0 : public ItemVisitor { public: EnvI& env; TopoSorter& ts; Model* model; bool hadSolveItem; std::vector& ais; VarDeclI* objective; Model* enumis; bool isFlatZinc; TSV0(EnvI& env0, TopoSorter& ts0, Model* model0, std::vector& ais0, Model* enumis0, bool isFlatZinc0) : env(env0), ts(ts0), model(model0), hadSolveItem(false), ais(ais0), objective(nullptr), enumis(enumis0), isFlatZinc(isFlatZinc0) {} void vAssignI(AssignI* i) { ais.push_back(i); } void vVarDeclI(VarDeclI* i) { ts.add(env, i, true, enumis); // initialise new identifier counter to be larger than existing identifier if (i->e()->id()->idn() >= 0) { env.minId(i->e()->id()->idn()); } else if (i->e()->id()->v().beginsWith("X_INTRODUCED_") && i->e()->id()->v().endsWith("_")) { std::string numId = i->e()->id()->v().substr(std::string("X_INTRODUCED_").size()); if (!numId.empty()) { numId = numId.substr(0, numId.size() - 1); if (!numId.empty()) { int vId = -1; try { vId = std::stoi(numId); } catch (std::exception&) { } if (vId >= 0) { env.minId(vId); } } } } } void vSolveI(SolveI* si) { if (hadSolveItem) { throw TypeError(env, si->loc(), "Only one solve item allowed"); } hadSolveItem = true; if (!isFlatZinc && (si->e() != nullptr)) { GCLock lock; auto* ti = new TypeInst(Location().introduce(), Type()); auto* obj = new VarDecl(Location().introduce(), ti, "_objective", si->e()); si->e(obj->id()); objective = new VarDeclI(Location().introduce(), obj); } } } _tsv0(env.envi(), ts, m, assignItems, enumItems, isFlatZinc); iter_items(_tsv0, m); if (_tsv0.objective != nullptr) { m->addItem(_tsv0.objective); ts.add(env.envi(), _tsv0.objective, true, enumItems); } for (unsigned int i = 0; i < enumItems->size(); i++) { if (auto* ai = (*enumItems)[i]->dynamicCast()) { assignItems.push_back(ai); } else if (auto* vdi = (*enumItems)[i]->dynamicCast()) { m->addItem(vdi); ts.add(env.envi(), vdi, false, enumItems); } else { auto* fi = (*enumItems)[i]->dynamicCast(); m->addItem(fi); (void)m->registerFn(env.envi(), fi); functionItems.push_back(fi); } } auto* enumItems2 = new Model; for (auto* ai : assignItems) { VarDecl* vd = nullptr; if (env.envi().ignoreUnknownIds) { try { vd = ts.get(env.envi(), ai->id(), ai->loc()); } catch (TypeError&) { } } else { vd = ts.get(env.envi(), ai->id(), ai->loc()); } if (vd != nullptr) { if (vd->e() != nullptr) { if (allowMultiAssignment) { GCLock lock; m->addItem(new ConstraintI( ai->loc(), new BinOp(ai->loc(), new Id(Location().introduce(), ai->id(), vd), BOT_EQ, ai->e()))); } else { throw TypeError(env.envi(), ai->loc(), "multiple assignment to the same variable"); } } else { vd->e(ai->e()); vd->ann().add(constants().ann.rhs_from_assignment); if (vd->ti()->isEnum()) { create_enum_mapper(env.envi(), m, vd->ti()->type().enumId(), vd, enumItems2); } } } ai->remove(); } for (auto& i : *enumItems2) { if (auto* vdi = i->dynamicCast()) { m->addItem(vdi); ts.add(env.envi(), vdi, false, enumItems); } else { auto* fi = i->cast(); m->addItem(fi); (void)m->registerFn(env.envi(), fi); functionItems.push_back(fi); } } delete enumItems; delete enumItems2; class TSV1 : public ItemVisitor { public: EnvI& env; TopoSorter& ts; TSV1(EnvI& env0, TopoSorter& ts0) : env(env0), ts(ts0) {} void vVarDeclI(VarDeclI* i) { ts.run(env, i->e()); } void vAssignI(AssignI* i) {} void vConstraintI(ConstraintI* i) { ts.run(env, i->e()); } void vSolveI(SolveI* i) { for (ExpressionSetIter it = i->ann().begin(); it != i->ann().end(); ++it) { ts.run(env, *it); } ts.run(env, i->e()); } void vOutputI(OutputI* i) { ts.run(env, i->e()); } void vFunctionI(FunctionI* fi) { ts.run(env, fi->ti()); for (unsigned int i = 0; i < fi->params().size(); i++) { ts.run(env, fi->params()[i]); } for (ExpressionSetIter it = fi->ann().begin(); it != fi->ann().end(); ++it) { ts.run(env, *it); } ts.scopes.pushFun(); for (unsigned int i = 0; i < fi->params().size(); i++) { ts.scopes.add(env, fi->params()[i]); } ts.run(env, fi->e()); ts.scopes.pop(); } } _tsv1(env.envi(), ts); iter_items(_tsv1, m); m->sortFn(); { struct SortByPayload { bool operator()(Item* i0, Item* i1) { if (i0->isa()) { return !i1->isa(); } if (auto* vdi0 = i0->dynamicCast()) { if (auto* vdi1 = i1->dynamicCast()) { return vdi0->e()->payload() < vdi1->e()->payload(); } return !i1->isa(); } return false; } } _sbp; std::stable_sort(m->begin(), m->end(), _sbp); } { Typer ty(env.envi(), m, typeErrors, ignoreUndefinedParameters); BottomUpIterator> bottomUpTyper(ty); for (auto& decl : ts.decls) { decl->payload(0); bottomUpTyper.run(decl->ti()); ty.vVarDecl(*decl); } for (auto& functionItem : functionItems) { bottomUpTyper.run(functionItem->ti()); for (unsigned int j = 0; j < functionItem->params().size(); j++) { bottomUpTyper.run(functionItem->params()[j]); } } } m->fixFnMap(); { Typer ty(env.envi(), m, typeErrors, ignoreUndefinedParameters); BottomUpIterator> bottomUpTyper(ty); class TSV2 : public ItemVisitor { private: EnvI& _env; Model* _m; BottomUpIterator>& _bottomUpTyper; std::vector& _typeErrors; public: TSV2(EnvI& env0, Model* m0, BottomUpIterator>& b, std::vector& typeErrors) : _env(env0), _m(m0), _bottomUpTyper(b), _typeErrors(typeErrors) {} void vVarDeclI(VarDeclI* i) { _bottomUpTyper.run(i->e()); if (i->e()->ti()->hasTiVariable()) { std::ostringstream ss; ss << "type-inst variables not allowed in type-inst for `" << i->e()->id()->str() << "'"; _typeErrors.emplace_back(_env, i->e()->loc(), ss.str()); } VarDecl* vdi = i->e(); if (vdi->e() == nullptr && vdi->type().isSet() && vdi->type().isvar() && vdi->ti()->domain() == nullptr) { std::ostringstream ss; ss << "set element type for `" << vdi->id()->str() << "' is not finite"; _typeErrors.emplace_back(_env, vdi->loc(), ss.str()); } if (i->e()->ann().contains(constants().ann.output_only)) { if (vdi->e() == nullptr) { _typeErrors.emplace_back( _env, vdi->loc(), "variables annotated with ::output_only must have a right hand side"); } else if (vdi->e()->type().isvar()) { _typeErrors.emplace_back(_env, vdi->loc(), "variables annotated with ::output_only must be par"); } } } void vAssignI(AssignI* i) { _bottomUpTyper.run(i->e()); if (!_env.isSubtype(i->e()->type(), i->decl()->ti()->type(), true)) { std::ostringstream ss; ss << "assignment value for `" << i->decl()->id()->str() << "' has invalid type-inst: expected `" << i->decl()->ti()->type().toString(_env) << "', actual `" << i->e()->type().toString(_env) << "'"; _typeErrors.emplace_back(_env, i->loc(), ss.str()); // Assign to "true" constant to avoid generating further errors that the parameter // is undefined i->decl()->e(constants().literalTrue); } } void vConstraintI(ConstraintI* i) { _bottomUpTyper.run(i->e()); if (!_env.isSubtype(i->e()->type(), Type::varbool(), true)) { throw TypeError(_env, i->loc(), "invalid type of constraint, expected `" + Type::varbool().toString(_env) + "', actual `" + i->e()->type().toString(_env) + "'"); } } void vSolveI(SolveI* i) { for (ExpressionSetIter it = i->ann().begin(); it != i->ann().end(); ++it) { _bottomUpTyper.run(*it); if (!(*it)->type().isAnn()) { throw TypeError(_env, (*it)->loc(), "expected annotation, got `" + (*it)->type().toString(_env) + "'"); } } _bottomUpTyper.run(i->e()); if (i->e() != nullptr) { Type et = i->e()->type(); bool needOptCoercion = et.isOpt() && et.isint(); if (needOptCoercion) { et.ot(Type::OT_PRESENT); } if (!(_env.isSubtype(et, Type::varint(), true) || _env.isSubtype(et, Type::varfloat(), true))) { throw TypeError(_env, i->e()->loc(), "objective has invalid type, expected int or float, actual `" + et.toString(_env) + "'"); } if (needOptCoercion) { GCLock lock; std::vector args(2); args[0] = i->e(); args[1] = constants().boollit(i->st() == SolveI::ST_MAX); Call* c = new Call(Location().introduce(), ASTString("objective_deopt_"), args); c->decl(_env.model->matchFn(_env, c, false)); assert(c->decl()); c->type(et); i->e(c); } } } void vOutputI(OutputI* i) { _bottomUpTyper.run(i->e()); if (i->e()->type() != Type::parstring(1) && i->e()->type() != Type::bot(1)) { throw TypeError(_env, i->e()->loc(), "invalid type in output item, expected `" + Type::parstring(1).toString(_env) + "', actual `" + i->e()->type().toString(_env) + "'"); } } void vFunctionI(FunctionI* i) { for (ExpressionSetIter it = i->ann().begin(); it != i->ann().end(); ++it) { _bottomUpTyper.run(*it); if (!(*it)->type().isAnn()) { throw TypeError(_env, (*it)->loc(), "expected annotation, got `" + (*it)->type().toString(_env) + "'"); } } _bottomUpTyper.run(i->ti()); _bottomUpTyper.run(i->e()); if ((i->e() != nullptr) && !_env.isSubtype(i->e()->type(), i->ti()->type(), true)) { throw TypeError(_env, i->e()->loc(), "return type of function does not match body, declared type is `" + i->ti()->type().toString(_env) + "', body type is `" + i->e()->type().toString(_env) + "'"); } if ((i->e() != nullptr) && i->e()->type().isPar() && i->ti()->type().isvar()) { // this is a par function declared as var, so change declared return type Type i_t = i->ti()->type(); i_t.ti(Type::TI_PAR); i->ti()->type(i_t); } if (i->e() != nullptr) { i->e(add_coercion(_env, _m, i->e(), i->ti()->type())()); } } } _tsv2(env.envi(), m, bottomUpTyper, typeErrors); iter_items(_tsv2, m); } class TSV3 : public ItemVisitor { public: EnvI& env; Model* m; OutputI* outputItem; TSV3(EnvI& env0, Model* m0) : env(env0), m(m0), outputItem(nullptr) {} void vAssignI(AssignI* i) { i->decl()->e(add_coercion(env, m, i->e(), i->decl()->type())()); } void vOutputI(OutputI* oi) { if (outputItem == nullptr) { outputItem = oi; } else { GCLock lock; auto* bo = new BinOp(Location().introduce(), outputItem->e(), BOT_PLUSPLUS, oi->e()); bo->type(Type::parstring(1)); outputItem->e(bo); oi->remove(); m->setOutputItem(outputItem); } } } _tsv3(env.envi(), m); if (typeErrors.empty()) { iter_items(_tsv3, m); } // Create a par version of each function that returns par and // that has a body that can be made par std::unordered_map>> fnsToMakePar; for (auto& f : m->functions()) { if (f.id() == "mzn_reverse_map_var") { continue; } if (f.e() != nullptr && f.ti()->type().bt() != Type::BT_ANN) { bool foundVar = false; for (auto* p : f.params()) { if (p->type().isvar()) { foundVar = true; break; } } if (foundVar) { // create par version of parameter types std::vector tv; for (auto* p : f.params()) { Type t = p->type(); t.cv(false); t.ti(Type::TI_PAR); tv.push_back(t); } // check if specialised par version of function already exists FunctionI* fi_par = m->matchFn(env.envi(), f.id(), tv, false); bool parIsUsable = false; if (fi_par != nullptr) { bool foundVar = false; for (auto* p : fi_par->params()) { if (p->type().isvar()) { foundVar = true; break; } } parIsUsable = !foundVar; } if (!parIsUsable) { // check if body of f doesn't contain any free variables in lets, // all calls in the body have par versions available, // and all toplevel identifiers used in the body of f are par class CheckParBody : public EVisitor { public: EnvI& env; Model* m; CheckParBody(EnvI& env0, Model* m0) : env(env0), m(m0) {} bool isPar = true; std::vector deps; bool enter(Expression* e) const { // if we have already found a var, don't continue return isPar; } void vId(const Id& ident) { if (ident.decl() != nullptr && ident.type().isvar() && ident.decl()->toplevel()) { isPar = false; } } void vLet(const Let& let) { // check if any of the declared variables does not have a RHS for (auto* e : let.let()) { if (auto* vd = e->dynamicCast()) { if (vd->e() == nullptr) { isPar = false; break; } } } } void vCall(const Call& c) { if (!c.type().isAnn()) { FunctionI* decl = c.decl(); // create par version of parameter types std::vector tv; for (auto* p : decl->params()) { Type t = p->type(); t.cv(false); t.ti(Type::TI_PAR); tv.push_back(t); } // check if specialised par version of function already exists FunctionI* decl_par = m->matchFn(env, decl->id(), tv, false); bool parIsUsable = decl_par->ti()->type().isPar(); if (parIsUsable && decl_par->e() == nullptr && decl_par->fromStdLib()) { parIsUsable = true; } else if (parIsUsable) { bool foundVar = false; for (auto* p : decl_par->params()) { if (p->type().isvar()) { foundVar = true; break; } } parIsUsable = !foundVar; } if (!parIsUsable) { deps.push_back(decl_par); } } } } cpb(env.envi(), m); top_down(cpb, f.e()); if (cpb.isPar) { fnsToMakePar.insert({&f, {false, cpb.deps}}); } } else { fnsToMakePar.insert({fi_par, {true, std::vector()}}); } } } } // Repeatedly remove functions whose dependencies cannot be made par bool didRemove; do { didRemove = false; std::vector toRemove; for (auto& p : fnsToMakePar) { for (auto* dep : p.second.second) { if (fnsToMakePar.find(dep) == fnsToMakePar.end()) { toRemove.push_back(p.first); } } } if (!toRemove.empty()) { didRemove = true; for (auto* p : toRemove) { fnsToMakePar.erase(p); } } } while (didRemove); // Create par versions of remaining functions { // First step: copy and register functions std::vector parFunctions; CopyMap parCopyMap; for (auto& p : fnsToMakePar) { if (!p.second.first) { GCLock lock; auto* cp = copy(env.envi(), parCopyMap, p.first)->cast(); for (auto* v : cp->params()) { Type vt = v->ti()->type(); vt.ti(Type::TI_PAR); v->ti()->type(vt); v->type(vt); } Type cpt(cp->ti()->type()); cpt.ti(Type::TI_PAR); cp->ti()->type(cpt); bool didRegister = m->registerFn(env.envi(), cp, true, false); if (didRegister) { m->addItem(cp); parFunctions.push_back(cp); } } } // Second step: make function bodies par // (needs to happen in a separate second step so that // matchFn will find the correct par function from first step) class MakeFnPar : public EVisitor { public: EnvI& env; Model* m; MakeFnPar(EnvI& env0, Model* m0) : env(env0), m(m0) {} static bool enter(Expression* e) { Type t(e->type()); t.ti(Type::TI_PAR); t.cv(false); e->type(t); return true; } void vCall(Call& c) { FunctionI* decl = m->matchFn(env, &c, false); c.decl(decl); } void vBinOp(BinOp& bo) { if (bo.decl() != nullptr) { std::vector ta(2); ta[0] = bo.lhs()->type(); ta[1] = bo.rhs()->type(); FunctionI* decl = m->matchFn(env, bo.opToString(), ta, false); bo.decl(decl); } } void vUnOp(UnOp& uo) { if (uo.decl() != nullptr) { std::vector ta(1); ta[0] = uo.e()->type(); FunctionI* decl = m->matchFn(env, uo.opToString(), ta, false); uo.decl(decl); } } } _mfp(env.envi(), m); for (auto* p : parFunctions) { bottom_up(_mfp, p->e()); } } try { m->checkFnOverloading(env.envi()); } catch (TypeError& e) { typeErrors.push_back(e); } for (auto& decl : ts.decls) { if (decl->toplevel() && decl->type().isPar() && !decl->type().isAnn() && decl->e() == nullptr) { if (decl->type().isOpt() && decl->type().dim() == 0) { decl->e(constants().absent); decl->addAnnotation(constants().ann.mzn_was_undefined); } else if (!ignoreUndefinedParameters) { std::ostringstream ss; ss << " symbol error: variable `" << decl->id()->str() << "' must be defined (did you forget to specify a data file?)"; typeErrors.emplace_back(env.envi(), decl->loc(), ss.str()); } } if (decl->ti()->isEnum()) { decl->ti()->setIsEnum(false); Type vdt = decl->ti()->type(); vdt.enumId(0); decl->ti()->type(vdt); } } for (auto vd_k : env.envi().checkVars) { try { VarDecl* vd; try { vd = ts.get(env.envi(), vd_k()->cast()->id()->str(), vd_k()->cast()->loc()); } catch (TypeError&) { if (vd_k()->cast()->type().isvar()) { continue; // var can be undefined } throw; } vd->ann().add(constants().ann.mzn_check_var); if (vd->type().enumId() != 0) { GCLock lock; std::vector enumIds({vd->type().enumId()}); if (vd->type().dim() > 0) { enumIds = env.envi().getArrayEnum(vd->type().enumId()); } std::vector enumIds_a(enumIds.size()); for (unsigned int i = 0; i < enumIds.size(); i++) { if (enumIds[i] != 0) { enumIds_a[i] = env.envi().getEnum(enumIds[i])->e()->id(); } else { enumIds_a[i] = new SetLit(Location().introduce(), std::vector()); } } auto* enumIds_al = new ArrayLit(Location().introduce(), enumIds_a); enumIds_al->type(Type::parsetint(1)); std::vector args({enumIds_al}); Call* checkEnum = new Call(Location().introduce(), constants().ann.mzn_check_enum_var, args); checkEnum->type(Type::ann()); checkEnum->decl(env.envi().model->matchFn(env.envi(), checkEnum, false)); vd->ann().add(checkEnum); } Type vdktype = vd_k()->type(); vdktype.ti(Type::TI_VAR); if (!vd_k()->type().isSubtypeOf(vd->type(), false)) { std::ostringstream ss; ss << "Solution checker requires `" << vd->id()->str() << "' to be of type `" << vdktype.toString(env.envi()) << "'"; typeErrors.emplace_back(env.envi(), vd->loc(), ss.str()); } } catch (TypeError& e) { typeErrors.emplace_back(env.envi(), e.loc(), e.msg() + " (required by solution checker model)"); } } } void typecheck(Env& env, Model* m, AssignI* ai) { std::vector typeErrors; Typer ty(env.envi(), m, typeErrors, false); BottomUpIterator> bottomUpTyper(ty); bottomUpTyper.run(ai->e()); if (!typeErrors.empty()) { throw typeErrors[0]; } if (!env.envi().isSubtype(ai->e()->type(), ai->decl()->ti()->type(), true)) { std::ostringstream ss; ss << "assignment value for `" << ai->decl()->id()->str() << "' has invalid type-inst: expected `" << ai->decl()->ti()->type().toString(env.envi()) << "', actual `" << ai->e()->type().toString(env.envi()) << "'"; throw TypeError(env.envi(), ai->e()->loc(), ss.str()); } } void output_var_desc_json(Env& env, VarDecl* vd, std::ostream& os, bool extra = false) { os << " \"" << *vd->id() << "\" : {"; os << "\"type\" : "; switch (vd->type().bt()) { case Type::BT_INT: os << "\"int\""; break; case Type::BT_BOOL: os << "\"bool\""; break; case Type::BT_FLOAT: os << "\"float\""; break; case Type::BT_STRING: os << "\"string\""; break; case Type::BT_ANN: os << "\"ann\""; break; default: os << "\"?\""; break; } if (vd->type().ot() == Type::OT_OPTIONAL) { os << ", \"optional\" : true"; } if (vd->type().st() == Type::ST_SET) { os << ", \"set\" : true"; } if (vd->type().dim() > 0) { os << ", \"dim\" : " << vd->type().dim(); if (extra) { os << ", \"dims\" : ["; bool had_dim = false; ASTExprVec ranges = vd->ti()->ranges(); for (auto& range : ranges) { if (range->type().enumId() > 0) { os << (had_dim ? "," : "") << "\"" << *env.envi().getEnum(range->type().enumId())->e()->id() << "\""; } else { os << (had_dim ? "," : "") << "\"int\""; } had_dim = true; } os << "]"; if (vd->type().enumId() > 0) { const std::vector& enumIds = env.envi().getArrayEnum(vd->type().enumId()); if (enumIds.back() > 0) { os << ", \"enum_type\" : \"" << *env.envi().getEnum(enumIds.back())->e()->id() << "\""; } } } } else { if (extra) { if (vd->type().enumId() > 0) { os << ", \"enum_type\" : \"" << *env.envi().getEnum(vd->type().enumId())->e()->id() << "\""; } } } os << "}"; } void output_model_variable_types(Env& env, Model* m, std::ostream& os, const std::vector& skipDirs) { class VInfVisitor : public ItemVisitor { public: Env& env; const std::vector& skipDirs; bool hadVar; bool hadEnum; std::ostringstream ossVars; std::ostringstream ossEnums; VInfVisitor(Env& env0, const std::vector& skipDirs0) : env(env0), skipDirs(skipDirs0), hadVar(false), hadEnum(false) {} bool enter(Item* i) { if (auto* ii = i->dynamicCast()) { std::string prefix = ii->m()->filepath().substr(0, ii->m()->filepath().size() - ii->f().size()); for (const auto& skip_dir : skipDirs) { if (prefix.substr(0, skip_dir.size()) == skip_dir) { return false; } } } return true; } void vVarDeclI(VarDeclI* vdi) { if (!vdi->e()->type().isAnn() && !vdi->e()->ti()->isEnum()) { if (hadVar) { ossVars << ",\n"; } output_var_desc_json(env, vdi->e(), ossVars, true); hadVar = true; } else if (vdi->e()->type().st() == Type::ST_SET && vdi->e()->type().enumId() != 0 && !vdi->e()->type().isAnn()) { if (hadEnum) { ossEnums << ", "; } ossEnums << "\"" << *env.envi().getEnum(vdi->e()->type().enumId())->e()->id() << "\""; hadEnum = true; } } } _vinf(env, skipDirs); iter_items(_vinf, m); os << "{\"var_types\": {"; os << "\n \"vars\": {\n" << _vinf.ossVars.str() << "\n },"; os << "\n \"enums\": [" << _vinf.ossEnums.str() << "]\n"; os << "}}\n"; } void output_model_interface(Env& env, Model* m, std::ostream& os, const std::vector& skipDirs) { class IfcVisitor : public ItemVisitor { public: Env& env; const std::vector& skipDirs; bool hadInput; bool hadOutput; bool hadIncludedFiles; bool hadAddToOutput = false; std::ostringstream ossInput; std::ostringstream ossOutput; std::ostringstream ossIncludedFiles; std::string method; bool outputItem; IfcVisitor(Env& env0, const std::vector& skipDirs0) : env(env0), skipDirs(skipDirs0), hadInput(false), hadOutput(false), hadIncludedFiles(false), method("sat"), outputItem(false) {} bool enter(Item* i) { if (auto* ii = i->dynamicCast()) { std::string prefix = ii->m()->filepath().substr(0, ii->m()->filepath().size() - ii->f().size()); for (const auto& skip_dir : skipDirs) { if (prefix.substr(0, skip_dir.size()) == skip_dir) { return false; } } if (hadIncludedFiles) { ossIncludedFiles << ",\n"; } ossIncludedFiles << " \"" << Printer::escapeStringLit(ii->m()->filepath()) << "\""; hadIncludedFiles = true; } return true; } void vVarDeclI(VarDeclI* vdi) { VarDecl* vd = vdi->e(); if (vd->type().isPar() && !vd->type().isAnn() && (vd->e() == nullptr || (vd->e() == constants().absent && vd->ann().contains(constants().ann.mzn_was_undefined)))) { if (hadInput) { ossInput << ",\n"; } output_var_desc_json(env, vd, ossInput); hadInput = true; } else { bool process_var = false; if (vd->ann().contains(constants().ann.add_to_output)) { if (!hadAddToOutput) { ossOutput.str(""); hadOutput = false; } hadAddToOutput = true; process_var = true; } else if (!hadAddToOutput) { process_var = vd->type().isvar() && (vd->e() == nullptr || vd->ann().contains(constants().ann.rhs_from_assignment)); } if (process_var) { if (hadOutput) { ossOutput << ",\n"; } output_var_desc_json(env, vd, ossOutput); hadOutput = true; } } } void vSolveI(SolveI* si) { switch (si->st()) { case SolveI::ST_MIN: method = "min"; break; case SolveI::ST_MAX: method = "max"; break; case SolveI::ST_SAT: method = "sat"; break; } } void vOutputI(OutputI* oi) { outputItem = true; } } _ifc(env, skipDirs); iter_items(_ifc, m); os << "{\n \"input\" : {\n" << _ifc.ossInput.str() << "\n },\n \"output\" : {\n" << _ifc.ossOutput.str() << "\n }"; os << ",\n \"method\": \""; os << _ifc.method; os << "\""; os << ",\n \"has_outputItem\": " << (_ifc.outputItem ? "true" : "false"); os << ",\n \"included_files\": [\n" << _ifc.ossIncludedFiles.str() << "\n ]"; os << "\n}\n"; } std::string create_enum_to_string_name(Id* ident, const std::string& prefix) { std::ostringstream ss; if (ident->str().c_str()[0] == '\'') { ss << "'" << prefix << ident->str().substr(1); } else { ss << prefix << *ident; } return ss.str(); } } // namespace MiniZinc libminizinc-2.5.3/lib/optimize_constraints.cpp0000644000175000017500000004122113757304533020241 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include namespace MiniZinc { void OptimizeRegistry::reg(const MiniZinc::ASTString& call, optimizer opt) { _m.insert(std::make_pair(call, opt)); } OptimizeRegistry::ConstraintStatus OptimizeRegistry::process(EnvI& env, MiniZinc::Item* i, MiniZinc::Call* c, Expression*& rewrite) { auto it = _m.find(c->id()); if (it != _m.end()) { return it->second(env, i, c, rewrite); } return CS_NONE; } OptimizeRegistry& OptimizeRegistry::registry() { static OptimizeRegistry reg; return reg; } namespace Optimizers { OptimizeRegistry::ConstraintStatus o_linear(EnvI& env, Item* ii, Call* c, Expression*& rewrite) { ArrayLit* al_c = eval_array_lit(env, c->arg(0)); std::vector coeffs(al_c->size()); for (unsigned int i = 0; i < al_c->size(); i++) { coeffs[i] = eval_int(env, (*al_c)[i]); } ArrayLit* al_x = eval_array_lit(env, c->arg(1)); std::vector x(al_x->size()); for (unsigned int i = 0; i < al_x->size(); i++) { x[i] = (*al_x)[i]; } IntVal d = 0; simplify_lin(coeffs, x, d); if (coeffs.empty()) { bool failed; if (c->id() == constants().ids.int_.lin_le) { failed = (d > eval_int(env, c->arg(2))); } else if (c->id() == constants().ids.int_.lin_eq) { failed = (d != eval_int(env, c->arg(2))); } else { failed = (d == eval_int(env, c->arg(2))); } if (failed) { return OptimizeRegistry::CS_FAILED; } return OptimizeRegistry::CS_ENTAILED; } if (coeffs.size() == 1 && (ii->isa() || ii->cast()->e()->ti()->domain() == constants().literalTrue)) { VarDecl* vd = x[0]()->cast()->decl(); IntSetVal* domain = vd->ti()->domain() != nullptr ? eval_intset(env, vd->ti()->domain()) : nullptr; if (c->id() == constants().ids.int_.lin_eq) { IntVal rd = eval_int(env, c->arg(2)) - d; if (rd % coeffs[0] == 0) { IntVal nd = rd / coeffs[0]; if ((domain != nullptr) && !domain->contains(nd)) { return OptimizeRegistry::CS_FAILED; } std::vector args(2); args[0] = x[0](); args[1] = IntLit::a(nd); Call* nc = new Call(Location(), constants().ids.int_.eq, args); nc->type(Type::varbool()); rewrite = nc; return OptimizeRegistry::CS_REWRITE; } return OptimizeRegistry::CS_FAILED; } if (c->id() == constants().ids.int_.lin_le) { IntVal ac = std::abs(coeffs[0]); IntVal rd = eval_int(env, c->arg(2)) - d; IntVal ad = std::abs(rd); IntVal nd; if (ad % ac == 0) { nd = rd / coeffs[0]; } else { double nd_d = static_cast(ad.toInt()) / static_cast(ac.toInt()); if (coeffs[0] >= 0 && rd >= 0) { nd = static_cast(std::floor(nd_d)); } else if (rd >= 0) { nd = -static_cast(std::floor(nd_d)); } else if (coeffs[0] >= 0) { nd = -static_cast(std::ceil(nd_d)); } else { nd = static_cast(std::ceil(nd_d)); } } bool swapSign = coeffs[0] < 0; if (domain != nullptr) { if (swapSign) { if (domain->max() < nd) { return OptimizeRegistry::CS_FAILED; } if (domain->min() >= nd) { return OptimizeRegistry::CS_ENTAILED; } } else { if (domain->min() > nd) { return OptimizeRegistry::CS_FAILED; } if (domain->max() <= nd) { return OptimizeRegistry::CS_ENTAILED; } } std::vector args(2); args[0] = x[0](); args[1] = IntLit::a(nd); if (swapSign) { std::swap(args[0], args[1]); } Call* nc = new Call(Location(), constants().ids.int_.le, args); nc->type(Type::varbool()); rewrite = nc; return OptimizeRegistry::CS_REWRITE; } } } else if (c->id() == constants().ids.int_.lin_eq && coeffs.size() == 2 && ((coeffs[0] == 1 && coeffs[1] == -1) || (coeffs[1] == 1 && coeffs[0] == -1)) && eval_int(env, c->arg(2)) - d == 0) { std::vector args(2); args[0] = x[0](); args[1] = x[1](); Call* nc = new Call(Location(), constants().ids.int_.eq, args); rewrite = nc; return OptimizeRegistry::CS_REWRITE; } if (coeffs.size() < al_c->size()) { std::vector coeffs_e(coeffs.size()); std::vector x_e(coeffs.size()); for (unsigned int i = 0; i < coeffs.size(); i++) { coeffs_e[i] = IntLit::a(coeffs[i]); x_e[i] = x[i](); } auto* al_c_new = new ArrayLit(al_c->loc(), coeffs_e); al_c_new->type(Type::parint(1)); auto* al_x_new = new ArrayLit(al_x->loc(), x_e); al_x_new->type(al_x->type()); std::vector args(3); args[0] = al_c_new; args[1] = al_x_new; args[2] = IntLit::a(eval_int(env, c->arg(2)) - d); Call* nc = new Call(Location(), c->id(), args); nc->type(Type::varbool()); for (ExpressionSetIter it = c->ann().begin(); it != c->ann().end(); ++it) { nc->addAnnotation(*it); } rewrite = nc; return OptimizeRegistry::CS_REWRITE; } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_lin_exp(EnvI& env, Item* i, Call* c, Expression*& rewrite) { if (c->type().isint()) { ArrayLit* al_c = eval_array_lit(env, c->arg(0)); std::vector coeffs(al_c->size()); for (unsigned int j = 0; j < al_c->size(); j++) { coeffs[j] = eval_int(env, (*al_c)[j]); } ArrayLit* al_x = eval_array_lit(env, c->arg(1)); std::vector x(al_x->size()); for (unsigned int j = 0; j < al_x->size(); j++) { x[j] = (*al_x)[j]; } IntVal d = eval_int(env, c->arg(2)); simplify_lin(coeffs, x, d); if (coeffs.empty()) { rewrite = IntLit::a(d); return OptimizeRegistry::CS_REWRITE; } if (coeffs.size() < al_c->size()) { if (coeffs.size() == 1 && coeffs[0] == 1 && d == 0) { rewrite = x[0](); return OptimizeRegistry::CS_REWRITE; } std::vector coeffs_e(coeffs.size()); std::vector x_e(coeffs.size()); for (unsigned int j = 0; j < coeffs.size(); j++) { coeffs_e[j] = IntLit::a(coeffs[j]); x_e[j] = x[j](); } auto* al_c_new = new ArrayLit(al_c->loc(), coeffs_e); al_c_new->type(Type::parint(1)); auto* al_x_new = new ArrayLit(al_x->loc(), x_e); al_x_new->type(al_x->type()); std::vector args(3); args[0] = al_c_new; args[1] = al_x_new; args[2] = IntLit::a(d); Call* nc = new Call(Location(), c->id(), args); nc->type(c->type()); for (ExpressionSetIter it = c->ann().begin(); it != c->ann().end(); ++it) { nc->addAnnotation(*it); } rewrite = nc; return OptimizeRegistry::CS_REWRITE; } } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_element(EnvI& env, Item* i, Call* c, Expression*& rewrite) { if (c->arg(0)->isa()) { IntVal idx = eval_int(env, c->arg(0)); ArrayLit* al = eval_array_lit(env, c->arg(1)); if (idx < 1 || idx > al->size()) { return OptimizeRegistry::CS_FAILED; } Expression* result = (*al)[static_cast(idx.toInt()) - 1]; std::vector args(2); args[0] = result; args[1] = c->arg(2); Call* eq = new Call(Location(), constants().ids.int_.eq, args); rewrite = eq; return OptimizeRegistry::CS_REWRITE; } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_clause(EnvI& env, Item* i, Call* c, Expression*& rewrite) { std::vector pos; std::vector neg; ArrayLit* al_pos = eval_array_lit(env, c->arg(0)); for (unsigned int j = 0; j < al_pos->size(); j++) { if (Id* ident = (*al_pos)[j]->dynamicCast()) { if (ident->decl()->ti()->domain() == nullptr) { pos.push_back(ident->decl()); } } } ArrayLit* al_neg = eval_array_lit(env, c->arg(1)); for (unsigned int j = 0; j < al_neg->size(); j++) { if (Id* ident = (*al_neg)[j]->dynamicCast()) { if (ident->decl()->ti()->domain() == nullptr) { neg.push_back(ident->decl()); } } } bool subsumed = false; if (!pos.empty() && !neg.empty()) { std::sort(pos.begin(), pos.end()); std::sort(neg.begin(), neg.end()); unsigned int ix = 0; unsigned int iy = 0; for (;;) { if (pos[ix] == neg[iy]) { subsumed = true; break; } if (pos[ix] < neg[iy]) { ix++; } else { iy++; } if (ix == pos.size() || iy == neg.size()) { break; } } } if (subsumed) { return OptimizeRegistry::CS_ENTAILED; } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_not(EnvI& env, Item* i, Call* c, Expression*& rewrite) { if (c->argCount() == 2) { Expression* e0 = c->arg(0); Expression* e1 = c->arg(1); if (e0->type().isPar() && e1->type().isPar()) { return eval_bool(env, e0) == eval_bool(env, e1) ? OptimizeRegistry::CS_FAILED : OptimizeRegistry::CS_ENTAILED; } if (e1->type().isPar()) { std::swap(e0, e1); } if (e0->type().isPar()) { Call* eq = new Call(Location(), constants().ids.bool_eq, {e1, constants().boollit(!eval_bool(env, e0))}); rewrite = eq; return OptimizeRegistry::CS_REWRITE; } } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_div(EnvI& env, Item* i, Call* c, Expression*& rewrite) { if (c->arg(1)->type().isPar()) { IntVal c1v = eval_int(env, c->arg(1)); if (c->arg(0)->type().isPar() && c->argCount() == 3 && c->arg(2)->type().isPar()) { IntVal c0v = eval_int(env, c->arg(0)); IntVal c2v = eval_int(env, c->arg(2)); return (c0v / c1v == c2v) ? OptimizeRegistry::CS_ENTAILED : OptimizeRegistry::CS_FAILED; } } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_times(EnvI& env, Item* i, Call* c, Expression*& rewrite) { Expression* result = nullptr; Expression* arg0 = c->arg(0); Expression* arg1 = c->arg(1); if (arg0->type().isPar() && arg1->type().isPar()) { IntVal c0v = eval_int(env, arg0); IntVal c1v = eval_int(env, arg1); result = IntLit::a(c0v * c1v); } else if (arg0->type().isPar()) { IntVal c0v = eval_int(env, arg0); if (c0v == 0) { result = IntLit::a(0); } else if (c0v == 1) { result = arg1; } } else if (arg1->type().isPar()) { IntVal c1v = eval_int(env, arg1); if (c1v == 0) { result = IntLit::a(0); } if (c1v == 1) { result = arg0; } } if (result != nullptr) { if (c->argCount() == 2) { // this is the functional version of times rewrite = result; return OptimizeRegistry::CS_REWRITE; } // this is the relational version of times assert(c->argCount() == 3); rewrite = new Call(Location().introduce(), constants().ids.int_.eq, {c->arg(2), result}); return OptimizeRegistry::CS_REWRITE; } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_set_in(EnvI& env, Item* i, Call* c, Expression*& rewrite) { if (c->arg(1)->type().isPar()) { if (c->arg(0)->type().isPar()) { IntSetVal* isv = eval_intset(env, c->arg(1)); return isv->contains(eval_int(env, c->arg(0))) ? OptimizeRegistry::CS_ENTAILED : OptimizeRegistry::CS_FAILED; } if (Id* ident = c->arg(0)->dynamicCast()) { VarDecl* vd = ident->decl(); IntSetVal* isv = eval_intset(env, c->arg(1)); if (vd->ti()->domain() != nullptr) { IntSetVal* dom = eval_intset(env, vd->ti()->domain()); { IntSetRanges isv_r(isv); IntSetRanges dom_r(dom); if (Ranges::subset(dom_r, isv_r)) { return OptimizeRegistry::CS_ENTAILED; } } { IntSetRanges isv_r(isv); IntSetRanges dom_r(dom); if (Ranges::disjoint(dom_r, isv_r)) { return OptimizeRegistry::CS_FAILED; } } } else if (isv->min() == isv->max()) { std::vector args(2); args[0] = vd->id(); args[1] = IntLit::a(isv->min()); Call* eq = new Call(Location(), constants().ids.int_.eq, args); rewrite = eq; return OptimizeRegistry::CS_REWRITE; } } } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_int_ne(EnvI& env, Item* i, Call* c, Expression*& rewrite) { Expression* e0 = c->arg(0); Expression* e1 = c->arg(1); if (e0->type().isPar() && e1->type().isPar()) { return eval_int(env, e0) != eval_int(env, e1) ? OptimizeRegistry::CS_ENTAILED : OptimizeRegistry::CS_FAILED; } if (e1->isa()) { std::swap(e0, e1); } if (Id* ident = e0->dynamicCast()) { if (e1->type().isPar()) { if (ident->decl()->ti()->domain() != nullptr) { IntVal e1v = eval_int(env, e1); IntSetVal* isv = eval_intset(env, ident->decl()->ti()->domain()); if (!isv->contains(e1v)) { return OptimizeRegistry::CS_ENTAILED; } if (e1v == isv->min() && e1v == isv->max()) { return OptimizeRegistry::CS_FAILED; } } } } return OptimizeRegistry::CS_OK; } OptimizeRegistry::ConstraintStatus o_int_le(EnvI& env, Item* i, Call* c, Expression*& rewrite) { Expression* e0 = c->arg(0); Expression* e1 = c->arg(1); if (e0->type().isPar() && e1->type().isPar()) { return eval_int(env, e0) <= eval_int(env, e1) ? OptimizeRegistry::CS_ENTAILED : OptimizeRegistry::CS_FAILED; } bool swapped = false; if (e1->isa()) { std::swap(e0, e1); swapped = true; } if (Id* ident = e0->dynamicCast()) { if (e1->type().isPar()) { if (ident->decl()->ti()->domain() != nullptr) { IntVal e1v = eval_int(env, e1); IntSetVal* isv = eval_intset(env, ident->decl()->ti()->domain()); if (!swapped) { if (isv->max() <= e1v) { return OptimizeRegistry::CS_ENTAILED; } if (isv->min() > e1v) { return OptimizeRegistry::CS_FAILED; } } else { if (e1v <= isv->min()) { return OptimizeRegistry::CS_ENTAILED; } if (e1v > isv->max()) { return OptimizeRegistry::CS_FAILED; } } } } } return OptimizeRegistry::CS_OK; } class Register { private: Model* _keepAliveModel; public: Register() { GCLock lock; _keepAliveModel = new Model; ASTString id_element("array_int_element"); ASTString id_var_element("array_var_int_element"); std::vector e; e.push_back(new StringLit(Location(), id_element)); e.push_back(new StringLit(Location(), id_var_element)); _keepAliveModel->addItem(new ConstraintI(Location(), new ArrayLit(Location(), e))); OptimizeRegistry::registry().reg(constants().ids.int_.lin_eq, o_linear); OptimizeRegistry::registry().reg(constants().ids.int_.lin_le, o_linear); OptimizeRegistry::registry().reg(constants().ids.int_.lin_ne, o_linear); OptimizeRegistry::registry().reg(constants().ids.int_.div, o_div); OptimizeRegistry::registry().reg(constants().ids.int_.times, o_times); OptimizeRegistry::registry().reg(id_element, o_element); OptimizeRegistry::registry().reg(constants().ids.lin_exp, o_lin_exp); OptimizeRegistry::registry().reg(id_var_element, o_element); OptimizeRegistry::registry().reg(constants().ids.clause, o_clause); OptimizeRegistry::registry().reg(constants().ids.bool_clause, o_clause); OptimizeRegistry::registry().reg(constants().ids.bool_not, o_not); OptimizeRegistry::registry().reg(constants().ids.set_in, o_set_in); OptimizeRegistry::registry().reg(constants().ids.int_.ne, o_int_ne); OptimizeRegistry::registry().reg(constants().ids.int_.le, o_int_le); } ~Register() { delete _keepAliveModel; } } _r; } // namespace Optimizers } // namespace MiniZinc libminizinc-2.5.3/lib/htmlprinter.cpp0000644000175000017500000013116613757304533016332 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include namespace MiniZinc { namespace HtmlDocOutput { // Trim leading space: // - always trim first line completely // - second line defines the base indentation std::string trim(const std::string& s0) { std::string s = s0; // remove carriage returns size_t j = 0; for (size_t i = 0; i < s.size(); i++) { if (s[i] != '\r') { s[j++] = s[i]; } } s.resize(j); size_t first_line_indent = s.find_first_not_of(" \t"); if (first_line_indent == std::string::npos) { return ""; } size_t first_nl = s.find('\n'); std::ostringstream oss; if (first_line_indent == first_nl) { // first line is empty oss << "\n"; } else { // strip first line size_t end_of_first_line = first_nl == std::string::npos ? std::string::npos : first_nl - first_line_indent + 1; oss << s.substr(first_line_indent, end_of_first_line); } if (first_nl == std::string::npos) { return oss.str(); } size_t unindent = s.find_first_not_of(" \t", first_nl + 1); if (unindent == std::string::npos) { return oss.str(); } size_t pos = s.find('\n', first_nl + 1); if (unindent == 0 || unindent > pos) { oss << s.substr(first_nl + 1, std::string::npos); return oss.str(); } size_t lastpos = unindent; while (pos != std::string::npos) { oss << s.substr(lastpos, pos - lastpos) << "\n"; size_t next_indent = s.find_first_not_of(" \t", pos + 1); if (next_indent == std::string::npos || next_indent - (pos + 1) < unindent) { lastpos = next_indent; } else { lastpos = pos + 1 + unindent; } pos = (lastpos == std::string::npos ? lastpos : s.find('\n', lastpos)); } if (lastpos != std::string::npos) { oss << s.substr(lastpos, std::string::npos); } return oss.str(); } class DocItem { public: enum DocType { T_PAR = 0, T_VAR = 1, T_FUN = 2 }; DocItem(const DocType& t0, std::string id0, std::string sig0, std::string doc0) : t(t0), id(std::move(id0)), sig(std::move(sig0)), doc(std::move(doc0)) {} DocType t; std::string id; std::string sig; std::string doc; }; typedef std::unordered_map FunMap; class Group; class GroupMap { public: typedef std::vector Map; Map m; ~GroupMap(); Map::iterator find(const std::string& n); }; class Group { public: Group(std::string name0, std::string fullPath0) : name(std::move(name0)), fullPath(std::move(fullPath0)) {} std::string name; std::string fullPath; std::string desc; std::string htmlName; GroupMap subgroups; std::vector items; std::string getAnchor(int level, int indivFileLevel) const { if (level < indivFileLevel) { return fullPath + ".html"; } return "#" + fullPath; } std::string toHTML(int level, int indivFileLevel, Group* parent, unsigned int idx, const std::string& basename, bool generateIndex) { std::ostringstream oss; int realLevel = (level < indivFileLevel) ? 0 : level - indivFileLevel; oss << "
\n"; if (parent != nullptr) { oss << "
"; if (idx > 0) { oss << " "; } oss << " "; if (idx < parent->subgroups.m.size() - 1) { oss << " "; } if (generateIndex) { oss << "Index\n"; } if (!items.empty()) { oss << "reveal " "all\n"; oss << "hide " "all\n"; } oss << "
"; } if (!htmlName.empty()) { oss << "\n"; oss << "
\n" << desc << "
\n"; } if (!subgroups.m.empty()) { oss << "

Sections:

\n"; oss << "
    \n"; for (auto& it : subgroups.m) { oss << "
  • " << it->htmlName << "\n"; if (it->htmlName.empty()) { std::cerr << "Warning: undocumented group " << it->fullPath << "\n"; } } oss << "
\n"; if (parent == nullptr && generateIndex) { oss << "

Index

\n"; } if (!items.empty()) { oss << "

Declarations in this section:

\n"; } } struct SortById { bool operator()(const DocItem& i0, const DocItem& i1) { return i0.t < i1.t || (i0.t == i1.t && i0.id < i1.id); } } _cmp; std::stable_sort(items.begin(), items.end(), _cmp); int cur_t = -1; const char* dt[] = {"par", "var", "fun"}; const char* dt_desc[] = {"Parameters", "Variables", "Functions and Predicates"}; for (const auto& item : items) { if (item.t != cur_t) { if (cur_t != -1) { oss << "
\n"; } cur_t = item.t; oss << "
\n"; oss << "
" << dt_desc[cur_t] << "
\n"; } oss << item.doc; } if (cur_t != -1) { oss << "
\n"; } if (level >= indivFileLevel) { for (unsigned int i = 0; i < subgroups.m.size(); i++) { oss << subgroups.m[i]->toHTML(level + 1, indivFileLevel, this, i, basename, generateIndex); } } oss << ""; return oss.str(); } static std::string rstHeading(const std::string& s, int level) { std::vector levelChar({'#', '=', '-', '^', '+', '"'}); std::ostringstream oss; oss << s << "\n"; for (int i = 0; i < s.size(); i++) { oss << levelChar[level]; } oss << "\n\n"; return oss.str(); } std::string toRST(int level) { std::ostringstream oss; if (!htmlName.empty()) { if (level == 0) { oss << ".. _ch-lib-" << name << ":\n\n"; } oss << rstHeading(htmlName, level); oss << HtmlDocOutput::trim(desc) << "\n\n"; } for (auto& i : subgroups.m) { oss << i->toRST(level + 1); } if (!items.empty()) { if (!subgroups.m.empty()) { oss << rstHeading("Other declarations", level + 1); } struct SortById { bool operator()(const DocItem& i0, const DocItem& i1) { return i0.t < i1.t || (i0.t == i1.t && i0.id < i1.id); } } _cmp; std::stable_sort(items.begin(), items.end(), _cmp); int cur_t = -1; int nHeadings = 0; for (const auto& item : items) { if (item.t != cur_t) { cur_t = item.t; nHeadings++; } } cur_t = -1; const char* dt_desc[] = {"Parameters", "Variables", "Functions and Predicates"}; for (const auto& item : items) { if (item.t != cur_t) { cur_t = item.t; if (nHeadings > 1) { oss << rstHeading(dt_desc[cur_t], subgroups.m.empty() ? level + 1 : level + 2); } } oss << item.doc; } } return oss.str(); } }; GroupMap::~GroupMap() { for (auto& it : m) { delete it; } } GroupMap::Map::iterator GroupMap::find(const std::string& n) { for (auto it = m.begin(); it != m.end(); ++it) { if ((*it)->name == n) { return it; } } return m.end(); } void add_to_group(Group& gm, const std::string& group, DocItem& di) { std::vector subgroups; size_t lastpos = 0; size_t pos = group.find('.'); while (pos != std::string::npos) { subgroups.push_back(group.substr(lastpos, pos - lastpos)); lastpos = pos + 1; pos = group.find('.', lastpos); } subgroups.push_back(group.substr(lastpos, std::string::npos)); GroupMap* cgm = &gm.subgroups; std::string gpath(gm.fullPath); for (unsigned int i = 0; i < subgroups.size(); i++) { gpath += "-"; gpath += subgroups[i]; if (cgm->find(subgroups[i]) == cgm->m.end()) { cgm->m.push_back(new Group(subgroups[i], gpath)); } Group& g = **cgm->find(subgroups[i]); if (i == subgroups.size() - 1) { g.items.push_back(di); } else { cgm = &g.subgroups; } } } void set_group_desc(Group& maingroup, const std::string& group, const std::string& htmlName, const std::string& s) { if (group == "MAIN") { if (!maingroup.htmlName.empty()) { std::cerr << "Warning: two descriptions for group `" << group << "'\n"; } maingroup.htmlName = htmlName; maingroup.desc = s; return; } std::vector subgroups; size_t lastpos = 0; size_t pos = group.find('.'); while (pos != std::string::npos) { subgroups.push_back(group.substr(lastpos, pos - lastpos)); lastpos = pos + 1; pos = group.find('.', lastpos); } subgroups.push_back(group.substr(lastpos, std::string::npos)); GroupMap* cgm = &maingroup.subgroups; std::string gpath(maingroup.fullPath); for (unsigned int i = 0; i < subgroups.size(); i++) { gpath += "-"; gpath += subgroups[i]; if (cgm->find(subgroups[i]) == cgm->m.end()) { cgm->m.push_back(new Group(subgroups[i], gpath)); } Group& g = **cgm->find(subgroups[i]); if (i == subgroups.size() - 1) { if (!g.htmlName.empty()) { std::cerr << "Warning: two descriptions for group `" << group << "'\n"; } g.htmlName = htmlName; g.desc = s; } else { cgm = &g.subgroups; } } } std::string extract_arg_word(std::string& s, size_t n) { size_t start = n; while (start < s.size() && s[start] != ' ' && s[start] != '\t') { start++; } while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) { start++; } size_t end = start + 1; while (end < s.size() && ((isalnum(s[end]) != 0) || s[end] == '_' || s[end] == '.')) { end++; } std::string ret = s.substr(start, end - start); s = s.substr(end, std::string::npos); return ret; } std::string make_html_id(const std::string& ident) { std::ostringstream oss; oss << "I"; bool prevWasSym = false; for (char i : ident) { bool isSym = true; switch (i) { case '!': oss << "-ex"; break; case '=': oss << "-eq"; break; case '*': oss << "-as"; break; case '+': oss << "-pl"; break; case '-': oss << "-mi"; break; case '>': oss << "-gr"; break; case '<': oss << "-lt"; break; case '/': oss << "-dv"; break; case '\\': oss << "-bs"; break; case '~': oss << "-tl"; break; case '\'': oss << "-tk"; break; case ' ': case '\t': case '\n': break; case ':': oss << "-cl"; break; case '[': oss << "-bo"; break; case ']': oss << "-bc"; break; case '$': oss << "-dd"; break; case '(': oss << "-po"; break; case ')': oss << "-pc"; break; case ',': oss << "-cm"; break; default: oss << (prevWasSym ? "-" : "") << i; isSym = false; break; } prevWasSym = isSym; } return oss.str(); } } // namespace HtmlDocOutput class CollectFunctionsVisitor : public ItemVisitor { protected: EnvI& _env; HtmlDocOutput::FunMap& _funmap; bool _includeStdLib; public: CollectFunctionsVisitor(EnvI& env, HtmlDocOutput::FunMap& funmap, bool includeStdLib) : _env(env), _funmap(funmap), _includeStdLib(includeStdLib) {} bool enterModel(Model* m) const { return _includeStdLib || m->filename() != "stdlib.mzn"; } void vFunctionI(FunctionI* fi) { if (Call* docstring = Expression::dynamicCast(get_annotation(fi->ann(), constants().ann.doc_comment))) { std::string ds = eval_string(_env, docstring->arg(0)); std::string group("main"); size_t group_idx = ds.find("@group"); if (group_idx != std::string::npos) { group = HtmlDocOutput::extract_arg_word(ds, group_idx); } _funmap.insert(std::make_pair(fi, group)); } } }; class PrintHtmlVisitor : public ItemVisitor { protected: EnvI& _env; HtmlDocOutput::Group& _maingroup; HtmlDocOutput::FunMap& _funmap; bool _includeStdLib; static std::vector replaceArgs(std::string& s) { std::vector replacements; std::ostringstream oss; size_t lastpos = 0; size_t pos = std::min(s.find("\\a"), s.find("\\p")); size_t mathjax_open = s.find("\\("); size_t mathjax_close = s.rfind("\\)"); if (pos == std::string::npos) { return replacements; } while (pos != std::string::npos) { oss << s.substr(lastpos, pos - lastpos); size_t start = pos; while (start < s.size() && s[start] != ' ' && s[start] != '\t') { start++; } while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) { start++; } size_t end = start + 1; while (end < s.size() && ((isalnum(s[end]) != 0) || s[end] == '_')) { end++; } if (s[pos + 1] == 'a') { replacements.push_back(s.substr(start, end - start)); if (pos >= mathjax_open && pos <= mathjax_close) { oss << "{\\bf " << replacements.back() << "}"; } else { oss << "" << replacements.back() << ""; } } else { if (pos >= mathjax_open && pos <= mathjax_close) { oss << "{\\bf " << s.substr(start, end - start) << "}"; } else { oss << "" << s.substr(start, end - start) << ""; } } lastpos = end; pos = std::min(s.find("\\a", lastpos), s.find("\\p", lastpos)); } oss << s.substr(lastpos, std::string::npos); s = oss.str(); return replacements; } static std::pair extractArgLine(std::string& s, size_t n) { size_t start = n; while (start < s.size() && s[start] != ' ' && s[start] != '\t') { start++; } while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) { start++; } size_t end = start + 1; while (end < s.size() && s[end] != ':') { end++; } std::string arg = s.substr(start, end - start); size_t doc_start = end + 1; while (end < s.size() && s[end] != '\n') { end++; } std::string ret = s.substr(doc_start, end - doc_start); replaceArgs(ret); s = s.substr(0, n) + s.substr(end, std::string::npos); return make_pair(arg, ret); } static std::string addHTML(const std::string& s) { std::ostringstream oss; size_t lastpos = 0; size_t pos = s.find('\n'); bool inUl = false; oss << "

\n"; while (pos != std::string::npos) { oss << s.substr(lastpos, pos - lastpos); size_t next = std::min(s.find('\n', pos + 1), s.find('-', pos + 1)); if (next == std::string::npos) { lastpos = pos + 1; break; } bool allwhite = true; for (size_t cur = pos + 1; cur < next; cur++) { if (s[cur] != ' ' && s[cur] != '\t') { allwhite = false; break; } } if (allwhite) { if (s[next] == '-') { if (!inUl) { oss << "

    \n"; inUl = true; } oss << "
  • "; } else { if (inUl) { oss << "
\n"; inUl = false; } else { oss << "

\n"; } } lastpos = next + 1; pos = s.find('\n', lastpos); } else { lastpos = pos + 1; if (s[pos] == '\n') { oss << " "; } if (s[next] == '-') { pos = s.find('\n', next + 1); } else { pos = next; } } } oss << s.substr(lastpos, std::string::npos); if (inUl) { oss << "\n"; } oss << "

\n"; return oss.str(); } public: PrintHtmlVisitor(EnvI& env, HtmlDocOutput::Group& mg, HtmlDocOutput::FunMap& fm, bool includeStdLib) : _env(env), _maingroup(mg), _funmap(fm), _includeStdLib(includeStdLib) {} bool enterModel(Model* m) { if (!_includeStdLib && m->filename() == "stdlib.mzn") { return false; } const std::string& dc = m->docComment(); if (!dc.empty()) { size_t gpos = dc.find("@groupdef"); while (gpos != std::string::npos) { size_t start = gpos; while (start < dc.size() && dc[start] != ' ' && dc[start] != '\t') { start++; } while (start < dc.size() && (dc[start] == ' ' || dc[start] == '\t')) { start++; } size_t end = start + 1; while (end < dc.size() && ((isalnum(dc[end]) != 0) || dc[end] == '_' || dc[end] == '.')) { end++; } std::string groupName = dc.substr(start, end - start); size_t doc_start = end + 1; while (end < dc.size() && dc[end] != '\n') { end++; } std::string groupHTMLName = dc.substr(doc_start, end - doc_start); size_t next = dc.find("@groupdef", gpos + 1); HtmlDocOutput::set_group_desc( _maingroup, groupName, groupHTMLName, addHTML(dc.substr(end, next == std::string::npos ? next : next - end))); gpos = next; } } return true; } /// Visit variable declaration void vVarDeclI(VarDeclI* vdi) { if (Call* docstring = Expression::dynamicCast( get_annotation(vdi->e()->ann(), constants().ann.doc_comment))) { std::string ds = eval_string(_env, docstring->arg(0)); std::string group("main"); size_t group_idx = ds.find("@group"); if (group_idx != std::string::npos) { group = HtmlDocOutput::extract_arg_word(ds, group_idx); } std::ostringstream os; std::string sig = vdi->e()->type().toString(_env) + " " + std::string(vdi->e()->id()->str().c_str()); os << "
\n"; os << "
\n"; if (vdi->e()->ti()->type() == Type::ann()) { os << "annotation "; os << "" << *vdi->e()->id() << ""; } else { os << *vdi->e()->ti() << ": " << *vdi->e()->id(); } os << "
\n"; os << addHTML(ds); os << "
"; GCLock lock; HtmlDocOutput::DocItem di( vdi->e()->type().isPar() ? HtmlDocOutput::DocItem::T_PAR : HtmlDocOutput::DocItem::T_VAR, sig, sig, os.str()); HtmlDocOutput::add_to_group(_maingroup, group, di); } } /// Visit function item void vFunctionI(FunctionI* fi) { if (Call* docstring = Expression::dynamicCast(get_annotation(fi->ann(), constants().ann.doc_comment))) { std::string ds = eval_string(_env, docstring->arg(0)); std::string group("main"); size_t group_idx = ds.find("@group"); if (group_idx != std::string::npos) { group = HtmlDocOutput::extract_arg_word(ds, group_idx); } size_t param_idx = ds.find("@param"); std::vector > params; while (param_idx != std::string::npos) { params.push_back(extractArgLine(ds, param_idx)); param_idx = ds.find("@param"); } std::vector args = replaceArgs(ds); std::unordered_set allArgs; for (auto& arg : args) { allArgs.insert(arg); } for (auto& param : params) { allArgs.insert(param.first); } GCLock lock; for (unsigned int i = 0; i < fi->params().size(); i++) { std::string param(fi->params()[i]->id()->str().c_str(), fi->params()[i]->id()->str().size()); if (allArgs.find(param) == allArgs.end()) { std::cerr << "Warning: parameter " << *fi->params()[i]->id() << " not documented for function " << fi->id() << " at location " << fi->loc() << "\n"; } } std::string sig; { GCLock lock; auto* fi_c = new FunctionI(Location(), fi->id(), fi->ti(), fi->params()); std::ostringstream oss_sig; oss_sig << *fi_c; sig = oss_sig.str(); sig.resize(sig.size() - 2); } std::ostringstream os; os << "
\n"; os << "
"; os << ""; std::ostringstream fs; if (fi->ti()->type() == Type::ann()) { fs << "annotation "; os << "annotation "; } else if (fi->ti()->type() == Type::parbool()) { fs << "test "; os << "test "; } else if (fi->ti()->type() == Type::varbool()) { fs << "predicate "; os << "predicate "; } else { fs << "function " << *fi->ti() << ": "; os << "function " << *fi->ti() << ": "; } fs << fi->id() << "("; os << "" << fi->id() << "("; size_t align = fs.str().size(); for (unsigned int i = 0; i < fi->params().size(); i++) { fs << *fi->params()[i]->ti() << ": " << *fi->params()[i]->id(); if (i < fi->params().size() - 1) { fs << ", "; } } bool splitArgs = (fs.str().size() > 70); for (unsigned int i = 0; i < fi->params().size(); i++) { os << "" << *fi->params()[i]->ti() << ": " << "" << *fi->params()[i]->id() << ""; if (i < fi->params().size() - 1) { os << ","; if (splitArgs) { os << "\n"; for (auto j = static_cast(align); (j--) != 0U;) { os << " "; } } else { os << " "; } } } os << ")"; if (fi->e() != nullptr) { FunctionI* f_body = fi; bool alias; do { alias = false; Call* c = Expression::dynamicCast(f_body->e()); if ((c != nullptr) && c->argCount() == f_body->params().size()) { bool sameParams = true; for (unsigned int i = 0; i < f_body->params().size(); i++) { Id* ident = c->arg(i)->dynamicCast(); if (ident == nullptr || ident->decl() != f_body->params()[i] || ident->str() != c->decl()->params()[i]->id()->str()) { sameParams = false; break; } } if (sameParams) { alias = true; f_body = c->decl(); } } } while (alias); if (f_body->e() != nullptr) { std::ostringstream body_os; Printer p(body_os, 70); p.print(f_body->e()); std::string filename = std::string(f_body->loc().filename().c_str(), f_body->loc().filename().size()); size_t lastSlash = filename.find_last_of('/'); if (lastSlash != std::string::npos) { filename = filename.substr(lastSlash + 1, std::string::npos); } os << " ="; os << "\n
"; os << "
"; os << body_os.str(); os << "
\n"; os << "(standard decomposition from " << filename << ":" << f_body->loc().firstLine() << ")"; os << "
"; } } os << "
\n
\n"; if (fi->id().c_str()[0] == '\'') { std::string op = fi->id().substr(1, fi->id().size() - 2); ; const char* space = (op[0] >= 'a' ? " " : ""); if (fi->params().size() == 2) { os << "

Usage: " << *fi->params()[0]->id() << space << op << space << *fi->params()[1]->id() << "

"; } else if (fi->params().size() == 1) { os << "

Usage: " << op << space << *fi->params()[0]->id() << "

"; } } std::string dshtml = addHTML(ds); os << dshtml; if (!params.empty()) { os << "
Parameters
\n"; os << "
    \n"; for (auto& param : params) { os << "
  • " << param.first << ": " << param.second << "
  • \n"; } os << "
\n"; } os << "
"; os << "
"; HtmlDocOutput::DocItem di(HtmlDocOutput::DocItem::T_FUN, std::string(fi->id().c_str(), fi->id().size()), sig, os.str()); HtmlDocOutput::add_to_group(_maingroup, group, di); } } }; std::vector HtmlPrinter::printHtml(EnvI& env, MiniZinc::Model* m, const std::string& basename, int splitLevel, bool includeStdLib, bool generateIndex) { using namespace HtmlDocOutput; Group g(basename, basename); FunMap funMap; CollectFunctionsVisitor fv(env, funMap, includeStdLib); iter_items(fv, m); PrintHtmlVisitor phv(env, g, funMap, includeStdLib); iter_items(phv, m); std::vector ret; struct SI { Group* g; Group* p; int level; int idx; SI(Group* g0, Group* p0, int level0, int idx0) : g(g0), p(p0), level(level0), idx(idx0) {} }; struct IndexEntry { std::string id; std::string sig; std::string link; std::string groupName; IndexEntry(std::string id0, std::string sig0, std::string link0, std::string groupName0) : id(std::move(id0)), sig(std::move(sig0)), link(std::move(link0)), groupName(std::move(groupName0)) { size_t spacepos = id.find_last_of(' '); if (spacepos != std::string::npos) { id = id.substr(spacepos + 1); } } bool operator<(const IndexEntry& e) const { if ((isalpha(id[0]) == 0) && (isalpha(e.id[0]) != 0)) { return true; } return id == e.id ? groupName < e.groupName : id < e.id; } }; std::vector index; std::vector stack; stack.emplace_back(&g, nullptr, 0, 0); while (!stack.empty()) { Group& g = *stack.back().g; int curLevel = stack.back().level; int curIdx = stack.back().idx; Group* p = stack.back().p; stack.pop_back(); for (const auto& it : g.items) { index.emplace_back(it.id, it.sig, g.fullPath, g.htmlName); } ret.emplace_back(g.fullPath, g.htmlName, g.toHTML(curLevel, splitLevel, p, curIdx, basename, generateIndex)); if (curLevel < splitLevel) { for (unsigned int i = 0; i < g.subgroups.m.size(); i++) { stack.emplace_back(g.subgroups.m[i], &g, curLevel + 1, i); } } } if (generateIndex) { std::sort(index.begin(), index.end()); std::ostringstream oss; index.emplace_back("", "", "", ""); std::vector idxSections; if (!index.empty()) { if (isalpha(index[0].id[0]) != 0) { char idxSec_c = (char)toupper(index[0].id[0]); std::string idxSec(&idxSec_c, 1); oss << "

" << idxSec << "

\n"; idxSections.push_back(idxSec); } else { oss << "

Symbols

\n"; idxSections.emplace_back("Symbols"); } } oss << "
    \n"; std::string prevId = index.empty() ? "" : index[0].id; std::vector curEntries; for (auto ie : index) { if (ie.id != prevId) { oss << "
  • "; assert(!curEntries.empty()); IndexEntry& cur = curEntries[0]; if (curEntries.size() == 1) { oss << cur.id << " " << "(" << cur.groupName << ")"; } else { oss << cur.id << " ("; bool first = true; for (const auto& i_ie : curEntries) { if (first) { first = false; } else { oss << ", "; } oss << ""; oss << i_ie.groupName << ""; } oss << ")"; } oss << "
  • \n"; curEntries.clear(); } if ((isalpha(ie.id[0]) != 0) && ie.id[0] != prevId[0]) { char idxSec_c = (char)toupper(ie.id[0]); std::string idxSec(&idxSec_c, 1); oss << "
\n

" << idxSec << "

    "; idxSections.push_back(idxSec); } prevId = ie.id; if (curEntries.empty() || curEntries.back().groupName != ie.groupName) { curEntries.push_back(ie); } } oss << "
\n"; std::ostringstream oss_header; oss_header << "
\n"; oss_header << "
"; oss_header << " "; bool first = true; for (const auto& is : idxSections) { if (first) { first = false; } else { oss_header << " | "; } oss_header << "" << is << ""; } oss_header << "
"; oss_header << "
Index
\n"; HtmlDocument idx("doc-index", "Index", oss_header.str() + oss.str()); ret.push_back(idx); } return ret; } class PrintRSTVisitor : public ItemVisitor { protected: EnvI& _env; HtmlDocOutput::Group& _maingroup; HtmlDocOutput::FunMap& _funmap; bool _includeStdLib; static std::vector replaceArgsRST(std::string& s) { std::vector replacements; std::ostringstream oss; size_t lastpos = 0; size_t pos = std::min(s.find("\\a"), s.find("\\p")); size_t mathjax_open = s.find("\\("); size_t mathjax_close = s.rfind("\\)"); while (pos != std::string::npos) { oss << s.substr(lastpos, pos - lastpos); size_t start = pos; while (start < s.size() && s[start] != ' ' && s[start] != '\t') { start++; } while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) { start++; } size_t end = start + 1; while (end < s.size() && ((isalnum(s[end]) != 0) || s[end] == '_')) { end++; } bool needSpace = pos != 0 && s[pos - 1] != ' ' && s[pos - 1] != '\n'; if (s[pos + 1] == 'a') { replacements.push_back(s.substr(start, end - start)); if (pos >= mathjax_open && pos <= mathjax_close) { oss << "{\\bf " << replacements.back() << "}"; } else { oss << (needSpace ? " " : "") << "``" << replacements.back() << "`` "; } } else { if (pos >= mathjax_open && pos <= mathjax_close) { oss << "{\\bf " << s.substr(start, end - start) << "}"; } else { oss << (needSpace ? " " : "") << "``" << s.substr(start, end - start) << "`` "; } } lastpos = end; pos = std::min(s.find("\\a", lastpos), s.find("\\p", lastpos)); } oss << s.substr(lastpos, std::string::npos); s = oss.str(); std::ostringstream oss2; pos = std::min(s.find("\\("), s.find("\\)")); lastpos = 0; while (pos != std::string::npos) { if (s[pos + 1] == ')') { // remove trailing whitespace std::string t = s.substr(lastpos, pos - lastpos); size_t t_end = t.find_last_not_of(' '); if (t_end != std::string::npos) { t_end++; } oss2 << t.substr(0, t_end); } else { oss2 << s.substr(lastpos, pos - lastpos); } lastpos = pos + 2; if (s[pos + 1] == '(') { oss2 << ":math:`"; lastpos = s.find_first_not_of(' ', lastpos); } else { oss2 << "`"; } pos = std::min(s.find("\\(", lastpos), s.find("\\)", lastpos)); } oss2 << s.substr(lastpos, std::string::npos); s = oss2.str(); std::ostringstream oss3; pos = std::min(s.find("\\["), s.find("\\]")); lastpos = 0; while (pos != std::string::npos) { if (s[pos + 1] == ']') { // remove trailing whitespace std::string t = s.substr(lastpos, pos - lastpos); size_t t_end = t.find_last_not_of(' '); if (t_end != std::string::npos) { t_end++; } oss3 << t.substr(0, t_end); } else { oss3 << s.substr(lastpos, pos - lastpos); } lastpos = pos + 2; if (s[pos + 1] == '[') { oss3 << "``"; lastpos = s.find_first_not_of(' ', lastpos); } else { oss3 << "``"; } pos = std::min(s.find("\\[", lastpos), s.find("\\]", lastpos)); } oss3 << s.substr(lastpos, std::string::npos); s = oss3.str(); return replacements; } static std::pair extractArgLine(std::string& s, size_t n) { size_t start = n; while (start < s.size() && s[start] != ' ' && s[start] != '\t') { start++; } while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) { start++; } size_t end = start + 1; while (end < s.size() && s[end] != ':') { end++; } std::string arg = s.substr(start, end - start); size_t doc_start = end + 1; while (end < s.size() && s[end] != '\n') { end++; } std::string ret = s.substr(doc_start, end - doc_start); replaceArgsRST(ret); s = s.substr(0, n) + s.substr(end, std::string::npos); return make_pair(arg, ret); } public: PrintRSTVisitor(EnvI& env, HtmlDocOutput::Group& mg, HtmlDocOutput::FunMap& fm, bool includeStdLib) : _env(env), _maingroup(mg), _funmap(fm), _includeStdLib(includeStdLib) {} bool enterModel(Model* m) { if (!_includeStdLib && m->filename() == "stdlib.mzn") { return false; } const std::string& dc = m->docComment(); if (!dc.empty()) { size_t gpos = dc.find("@groupdef"); while (gpos != std::string::npos) { size_t start = gpos; while (start < dc.size() && dc[start] != ' ' && dc[start] != '\t') { start++; } while (start < dc.size() && (dc[start] == ' ' || dc[start] == '\t')) { start++; } size_t end = start + 1; while (end < dc.size() && ((isalnum(dc[end]) != 0) || dc[end] == '_' || dc[end] == '.')) { end++; } std::string groupName = dc.substr(start, end - start); size_t doc_start = end + 1; while (end < dc.size() && dc[end] != '\n') { end++; } std::string groupHTMLName = dc.substr(doc_start, end - doc_start); size_t next = dc.find("@groupdef", gpos + 1); std::string groupDesc = dc.substr(end, next == std::string::npos ? next : next - end); replaceArgsRST(groupDesc); HtmlDocOutput::set_group_desc(_maingroup, groupName, groupHTMLName, groupDesc); gpos = next; } } return true; } /// Visit variable declaration void vVarDeclI(VarDeclI* vdi) { if (Call* docstring = Expression::dynamicCast( get_annotation(vdi->e()->ann(), constants().ann.doc_comment))) { std::string ds = eval_string(_env, docstring->arg(0)); std::string group("main"); size_t group_idx = ds.find("@group"); if (group_idx != std::string::npos) { group = HtmlDocOutput::extract_arg_word(ds, group_idx); } std::ostringstream os; std::string sig = vdi->e()->type().toString(_env) + " " + std::string(vdi->e()->id()->str().c_str(), vdi->e()->id()->str().size()); std::string myMainGroup = group.substr(0, group.find_first_of('.')); auto it = _maingroup.subgroups.find(myMainGroup); os << ".. index::\n"; if (it != _maingroup.subgroups.m.end()) { os << " pair: " << (*it)->htmlName << "; " << *vdi->e()->id() << "\n\n"; } else { std::cerr << "did not find " << myMainGroup << "\n"; os << " single: " << *vdi->e()->id() << "\n\n"; } os << ".. code-block:: minizinc\n\n"; if (vdi->e()->ti()->type() == Type::ann()) { os << " annotation " << *vdi->e()->id(); } else { os << " " << *vdi->e()->ti() << ": " << *vdi->e()->id(); } os << "\n\n"; os << HtmlDocOutput::trim(ds) << "\n\n"; GCLock lock; HtmlDocOutput::DocItem di( vdi->e()->type().isPar() ? HtmlDocOutput::DocItem::T_PAR : HtmlDocOutput::DocItem::T_VAR, sig, sig, os.str()); HtmlDocOutput::add_to_group(_maingroup, group, di); } } /// Visit function item void vFunctionI(FunctionI* fi) { if (Call* docstring = Expression::dynamicCast(get_annotation(fi->ann(), constants().ann.doc_comment))) { std::string ds = eval_string(_env, docstring->arg(0)); std::string group("main"); size_t group_idx = ds.find("@group"); if (group_idx != std::string::npos) { group = HtmlDocOutput::extract_arg_word(ds, group_idx); } size_t param_idx = ds.find("@param"); std::vector > params; while (param_idx != std::string::npos) { params.push_back(extractArgLine(ds, param_idx)); param_idx = ds.find("@param"); } std::vector args = replaceArgsRST(ds); std::unordered_set allArgs; for (auto& arg : args) { allArgs.insert(arg); } for (auto& param : params) { allArgs.insert(param.first); } GCLock lock; for (unsigned int i = 0; i < fi->params().size(); i++) { if (allArgs.find(std::string(fi->params()[i]->id()->str().c_str(), fi->params()[i]->id()->str().size())) == allArgs.end()) { std::cerr << "Warning: parameter " << *fi->params()[i]->id() << " not documented for function " << fi->id() << " at location " << fi->loc() << "\n"; } } std::string sig; { GCLock lock; auto* fi_c = new FunctionI(Location(), fi->id(), fi->ti(), fi->params()); std::ostringstream oss_sig; oss_sig << *fi_c; sig = oss_sig.str(); sig.resize(sig.size() - 2); } std::ostringstream os; std::ostringstream fs; std::string myMainGroup = group.substr(0, group.find_first_of('.')); auto it = _maingroup.subgroups.find(myMainGroup); os << ".. index::\n"; if (it != _maingroup.subgroups.m.end()) { os << " pair: " << (*it)->htmlName << "; " << fi->id() << "\n\n"; } else { std::cerr << "did not find " << myMainGroup << "\n"; os << " single: " << fi->id() << "\n\n"; } os << ".. code-block:: minizinc\n\n"; if (fi->ti()->type() == Type::ann()) { fs << "annotation "; } else if (fi->ti()->type() == Type::parbool()) { fs << "test "; } else if (fi->ti()->type() == Type::varbool()) { fs << "predicate "; } else { fs << "function " << *fi->ti() << ": "; } fs << fi->id() << "("; os << " " << fs.str(); size_t align = fs.str().size(); for (unsigned int i = 0; i < fi->params().size(); i++) { fs << *fi->params()[i]->ti(); std::ostringstream fid; fid << *fi->params()[i]->id(); if (!fid.str().empty()) { fs << ": " << *fi->params()[i]->id(); } if (i < fi->params().size() - 1) { fs << ", "; } } bool splitArgs = (fs.str().size() > 70); for (unsigned int i = 0; i < fi->params().size(); i++) { os << *fi->params()[i]->ti(); std::ostringstream fid; fid << *fi->params()[i]->id(); if (!fid.str().empty()) { os << ": " << *fi->params()[i]->id(); } if (i < fi->params().size() - 1) { os << ","; if (splitArgs) { os << "\n "; for (auto j = static_cast(align); (j--) != 0U;) { os << " "; } } else { os << " "; } } } os << ")"; os << "\n\n"; if (fi->id().c_str()[0] == '\'') { std::string op = fi->id().substr(1, fi->id().size() - 2); if (fi->params().size() == 2) { os << "Usage: ``" << *fi->params()[0]->id() << " " << op << " " << *fi->params()[1]->id() << "``\n\n"; } else if (fi->params().size() == 1) { os << "Usage: ``" << op << " " << *fi->params()[0]->id() << "``\n\n"; } } os << HtmlDocOutput::trim(ds) << "\n\n"; if (fi->e() != nullptr) { FunctionI* f_body = fi; bool alias; do { alias = false; Call* c = Expression::dynamicCast(f_body->e()); if ((c != nullptr) && c->argCount() == f_body->params().size()) { bool sameParams = true; for (unsigned int i = 0; i < f_body->params().size(); i++) { Id* ident = c->arg(i)->dynamicCast(); if (ident == nullptr || ident->decl() != f_body->params()[i] || ident->str() != c->decl()->params()[i]->id()->str()) { sameParams = false; break; } } if (sameParams) { alias = true; f_body = c->decl(); } } } while (alias); if (f_body->e() != nullptr) { std::string filename = std::string(f_body->loc().filename().c_str(), f_body->loc().filename().size()); size_t filePos = filename.find("std/"); if (filePos != std::string::npos) { filePos += 4; os << ".. only:: builder_html\n\n"; os << " `More... loc().firstLine() << "-L" << f_body->loc().lastLine() << ">`__\n\n"; } } } if (!params.empty()) { os << "Parameters:\n\n"; for (auto& param : params) { os << "- ``" << param.first << "``: " << param.second << "\n"; } os << "\n"; } os << "\n"; HtmlDocOutput::DocItem di(HtmlDocOutput::DocItem::T_FUN, std::string(fi->id().c_str(), fi->id().size()), sig, os.str()); HtmlDocOutput::add_to_group(_maingroup, group, di); } } }; std::vector RSTPrinter::printRST(EnvI& env, MiniZinc::Model* m, const std::string& basename, int splitLevel, bool includeStdLib, bool generateIndex) { using namespace HtmlDocOutput; Group g(basename, basename); FunMap funMap; CollectFunctionsVisitor fv(env, funMap, includeStdLib); iter_items(fv, m); PrintRSTVisitor prv(env, g, funMap, includeStdLib); iter_items(prv, m); std::vector ret; std::ostringstream oss; oss << Group::rstHeading(g.htmlName, 0); oss << trim(g.desc) << "\n"; oss << ".. toctree::\n\n"; for (auto* sg : g.subgroups.m) { oss << " " << sg->fullPath << "\n"; } ret.emplace_back(g.fullPath, g.htmlName, oss.str()); for (auto& sg : g.subgroups.m) { ret.emplace_back(sg->fullPath, sg->htmlName, sg->toRST(0)); } return ret; } } // namespace MiniZinc libminizinc-2.5.3/lib/statistics.cpp0000644000175000017500000000267213757304533016153 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { /// TODO all key words should be standard and defined in 1 place void Statistics::print(std::ostream& os) { os << "%%%mzn-stat: solveTime=" << _time << std::endl << "%%%mzn-stat: nodes=" << _nodes << std::endl << "%%%mzn-stat: failures=" << _failures << std::endl << "%%%mzn-stat: objective=" << _objective << std::endl; }; void Statistics::time(unsigned long long t) { _time = t; } void Statistics::nodes(unsigned long long n) { _nodes = n; } void Statistics::failures(unsigned long long f) { _failures = f; } void Statistics::objective(double o) { _objective = o; } unsigned long long Statistics::time() const { return _time; }; unsigned long long Statistics::nodes() const { return _nodes; }; unsigned long long Statistics::failures() const { return _failures; }; double Statistics::objective() const { return _objective; }; Statistics& Statistics::operator+=(Statistics& s) { _time += s.time(); _nodes += s.nodes(); _failures += s.failures(); _objective = s.objective(); return *this; } } // namespace MiniZinc libminizinc-2.5.3/lib/solver_instance_base.cpp0000644000175000017500000001772213757304533020153 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif namespace MiniZinc { SolverInstanceBase::Status SolverInstanceBase::solve() { return SolverInstance__ERROR; } void SolverInstanceBase::reset() { assert(false); } void SolverInstanceBase::resetWithConstraints(Model::iterator begin, Model::iterator end) { assert(false); } void SolverInstanceBase::processPermanentConstraints(Model::iterator begin, Model::iterator end) { assert(false); } void Registry::add(const ASTString name, poster p) { _registry.insert(std::make_pair(name, p)); } void Registry::add(const std::string& name, poster p) { GCLock lock; ASTString str(name); return add(str, p); } void Registry::post(Call* c) { auto it = _registry.find(c->id()); if (it == _registry.end()) { std::ostringstream ss; ss << "Error: solver backend cannot handle constraint: " << c->id(); throw InternalError(ss.str()); } it->second(_base, c); } void SolverInstanceBase::printSolution() { std::ostringstream oss; if (_options->printStatistics) { printStatistics(); // Insert stats before sol separator } if (nullptr == _pS2Out) { getEnv()->evalOutput(std::cout, std::cerr); // deprecated std::cout << oss.str(); if ((!oss.str().empty()) && '\n' != oss.str().back()) { std::cout << '\n'; } std::cout << "----------" << std::endl; } else { getSolns2Out()->evalOutput(oss.str()); } } void SolverInstanceBase2::printSolution() { GCLock lock; assignSolutionToOutput(); SolverInstanceBase::printSolution(); } // void // SolverInstanceBase::assignSolutionToOutput() { // for (VarDeclIterator it = getEnv()->output()->vardecls().begin(); it != // getEnv()->output()->vardecls().end(); ++it) { // if (it->e()->e() == NULL) { // it->e()->e(getSolutionValue(it->e()->id())); // } // } // } void SolverInstanceBase2::assignSolutionToOutput() { GCLock lock; MZN_ASSERT_HARD_MSG( nullptr != _pS2Out, "Setup a Solns2Out object to use default solution extraction/reporting procs"); if (_varsWithOutput.empty()) { for (VarDeclIterator it = getEnv()->flat()->vardecls().begin(); it != getEnv()->flat()->vardecls().end(); ++it) { if (!it->removed()) { VarDecl* vd = it->e(); if (!vd->ann().isEmpty()) { if (vd->ann().containsCall(constants().ann.output_array.aststr()) || vd->ann().contains(constants().ann.output_var)) { _varsWithOutput.push_back(vd); } } } } } _pS2Out->declNewOutput(); // Even for empty output decl // iterate over set of ids that have an output annotation && obtain their right hand side from the // flat model for (auto* vd : _varsWithOutput) { // std::cout << "DEBUG: Looking at var-decl with output-annotation: " << *vd << std::endl; if (Call* output_array_ann = Expression::dynamicCast( get_annotation(vd->ann(), constants().ann.output_array.aststr()))) { assert(vd->e()); if (auto* al = vd->e()->dynamicCast()) { std::vector array_elems; ArrayLit& array = *al; for (unsigned int j = 0; j < array.size(); j++) { if (Id* id = array[j]->dynamicCast()) { // std::cout << "DEBUG: getting solution value from " << *id << " : " << id->v() << // std::endl; array_elems.push_back(getSolutionValue(id)); } else if (auto* floatLit = array[j]->dynamicCast()) { array_elems.push_back(floatLit); } else if (auto* intLit = array[j]->dynamicCast()) { array_elems.push_back(intLit); } else if (auto* boolLit = array[j]->dynamicCast()) { array_elems.push_back(boolLit); } else if (auto* setLit = array[j]->dynamicCast()) { array_elems.push_back(setLit); } else if (auto* strLit = array[j]->dynamicCast()) { array_elems.push_back(strLit); } else { std::ostringstream oss; oss << "Error: array element " << *array[j] << " is not an id nor a literal"; throw InternalError(oss.str()); } } GCLock lock; ArrayLit* dims; Expression* e = output_array_ann->arg(0); if (auto* al = e->dynamicCast()) { dims = al; } else if (Id* id = e->dynamicCast()) { dims = id->decl()->e()->cast(); } else { throw -1; } std::vector > dims_v; for (int i = 0; i < dims->length(); i++) { IntSetVal* isv = eval_intset(getEnv()->envi(), (*dims)[i]); if (isv->size() == 0) { dims_v.emplace_back(1, 0); } else { dims_v.emplace_back(static_cast(isv->min().toInt()), static_cast(isv->max().toInt())); } } auto* array_solution = new ArrayLit(Location(), array_elems, dims_v); KeepAlive ka(array_solution); auto& de = getSolns2Out()->findOutputVar(vd->id()->str()); de.first->e(array_solution); } } else if (vd->ann().contains(constants().ann.output_var)) { Expression* sol = getSolutionValue(vd->id()); vd->e(sol); auto& de = getSolns2Out()->findOutputVar(vd->id()->str()); de.first->e(sol); } } } void SolverInstanceBase::flattenSearchAnnotations(const Annotation& ann, std::vector& out) { for (ExpressionSetIter i = ann.begin(); i != ann.end(); ++i) { Expression* e = *i; if (e->isa() && (e->cast()->id() == "seq_search" || e->cast()->id() == "warm_start_array")) { Call* c = e->cast(); auto* anns = c->arg(0)->cast(); for (unsigned int i = 0; i < anns->size(); i++) { Annotation subann; subann.add((*anns)[i]); flattenSearchAnnotations(subann, out); } } else { out.push_back(*i); } } } void SolverInstanceBase::flattenMultipleObjectives(const Annotation& ann, MultipleObjectives& mo) const { int nGoalH = 0; for (ExpressionSetIter i = ann.begin(); i != ann.end(); ++i) { MZN_ASSERT_HARD_MSG(0 == nGoalH++, "Several goal hierarchies provided"); Expression* e = *i; if (e->isa() && (e->cast()->id() == "goal_hierarchy")) { MZN_ASSERT_HARD_MSG(getEnv()->flat()->solveItem()->st() == SolveI::SolveType::ST_SAT, "goal_hierarchy provided but solve item is not SAT"); Call* c = e->cast(); auto* anns = c->arg(0)->cast(); for (unsigned int i = 0; i < anns->size(); i++) { Annotation subann; subann.add((*anns)[i]); MultipleObjectives::Objective obj; flattenMultObjComponent(subann, obj); mo.add(obj); } } } } void SolverInstanceBase::flattenMultObjComponent(const Annotation& ann, MultipleObjectives::Objective& obj) { MZN_ASSERT_HARD(!ann.isEmpty()); Expression* e = *ann.begin(); MZN_ASSERT_HARD(e->isa()); Call* c = e->cast(); obj.setVariable(c->arg(0)); const auto id = c->id(); if (id == "min_goal" || id == "int_min_goal" || id == "float_min_goal") { obj.setWeight(-1.0); } else if (id == "sat_goal" || id == "max_goal" || id == "int_max_goal" || id == "float_max_goal") { obj.setWeight(1.0); } else { MZN_ASSERT_HARD_MSG(false, "unknown goal: " << id); } } } // namespace MiniZinc libminizinc-2.5.3/lib/astexception.cpp0000644000175000017500000000172113757304533016461 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { LocationException::LocationException(EnvI& env, const Location& loc, const std::string& msg) : Exception(msg), _loc(loc) { env.createErrorStack(); } ResultUndefinedError::ResultUndefinedError(EnvI& env, const Location& loc, const std::string& msg) : LocationException(env, loc, msg) { if (env.inMaybePartial == 0) { std::string warning = "undefined result becomes false in Boolean context"; if (!msg.empty()) { warning += "\n (" + msg + ")"; } env.addWarning(warning); } } } // namespace MiniZinc libminizinc-2.5.3/lib/flatten.cpp0000644000175000017500000047574013757304533015430 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { // Create domain constraints. Return true if successful. bool create_explicit_domain_constraints(EnvI& envi, VarDecl* vd, Expression* domain) { std::vector calls; Location iloc = Location().introduce(); if (vd->type().isIntSet()) { assert(domain->type().isint() || domain->type().isIntSet()); IntSetVal* isv = eval_intset(envi, domain); calls.push_back(new Call(iloc, constants().ids.set_subset, {vd->id(), new SetLit(iloc, isv)})); } else if (domain->type().isbool()) { calls.push_back(new Call(iloc, constants().ids.bool_eq, {vd->id(), domain})); } else if (domain->type().isBoolSet()) { IntSetVal* bsv = eval_boolset(envi, domain); assert(bsv->size() == 1); if (bsv->min() != bsv->max()) { return true; // Both values are still possible, no change } calls.push_back( new Call(iloc, constants().ids.bool_eq, {vd->id(), constants().boollit(bsv->min() > 0)})); } else if (domain->type().isfloat() || domain->type().isFloatSet()) { FloatSetVal* fsv = eval_floatset(envi, domain); if (fsv->size() == 1) { // Range based if (fsv->min() == fsv->max()) { calls.push_back( new Call(iloc, constants().ids.float_.eq, {vd->id(), FloatLit::a(fsv->min())})); } else { FloatSetVal* cfsv; if (vd->ti()->domain() != nullptr) { cfsv = eval_floatset(envi, vd->ti()->domain()); } else { cfsv = FloatSetVal::a(-FloatVal::infinity(), FloatVal::infinity()); } if (cfsv->min() < fsv->min()) { calls.push_back( new Call(iloc, constants().ids.float_.le, {FloatLit::a(fsv->min()), vd->id()})); } if (cfsv->max() > fsv->max()) { calls.push_back( new Call(iloc, constants().ids.float_.le, {vd->id(), FloatLit::a(fsv->max())})); } } } else { calls.push_back(new Call(iloc, constants().ids.set_in, {vd->id(), new SetLit(iloc, fsv)})); } } else if (domain->type().isint() || domain->type().isIntSet()) { IntSetVal* isv = eval_intset(envi, domain); if (isv->size() == 1) { // Range based if (isv->min() == isv->max()) { calls.push_back(new Call(iloc, constants().ids.int_.eq, {vd->id(), IntLit::a(isv->min())})); } else { IntSetVal* cisv; if (vd->ti()->domain() != nullptr) { cisv = eval_intset(envi, vd->ti()->domain()); } else { cisv = IntSetVal::a(-IntVal::infinity(), IntVal::infinity()); } if (cisv->min() < isv->min()) { calls.push_back( new Call(iloc, constants().ids.int_.le, {IntLit::a(isv->min()), vd->id()})); } if (cisv->max() > isv->max()) { calls.push_back( new Call(iloc, constants().ids.int_.le, {vd->id(), IntLit::a(isv->max())})); } } } else { calls.push_back(new Call(iloc, constants().ids.set_in, {vd->id(), new SetLit(iloc, isv)})); } } else { return false; } int counter = 0; for (Call* c : calls) { CallStackItem csi(envi, IntLit::a(counter++)); c->ann().add(constants().ann.domain_change_constraint); c->type(Type::varbool()); c->decl(envi.model->matchFn(envi, c, true)); flat_exp(envi, Ctx(), c, constants().varTrue, constants().varTrue); } return true; } void set_computed_domain(EnvI& envi, VarDecl* vd, Expression* domain, bool is_computed) { if (envi.hasReverseMapper(vd->id())) { if (!create_explicit_domain_constraints(envi, vd, domain)) { std::ostringstream ss; ss << "Unable to create domain constraint for reverse mapped variable: " << *vd->id() << " = " << *domain << std::endl; throw EvalError(envi, domain->loc(), ss.str()); } vd->ti()->domain(domain); return; } if (envi.fopts.recordDomainChanges && !vd->ann().contains(constants().ann.is_defined_var) && !vd->introduced() && !(vd->type().dim() > 0)) { if (create_explicit_domain_constraints(envi, vd, domain)) { return; } std::cerr << "Warning: domain change not handled by -g mode: " << *vd->id() << " = " << *domain << std::endl; } vd->ti()->domain(domain); vd->ti()->setComputedDomain(is_computed); } /// Output operator for contexts template std::basic_ostream& operator<<(std::basic_ostream& os, Ctx& ctx) { switch (ctx.b) { case C_ROOT: os << "R"; break; case C_POS: os << "+"; break; case C_NEG: os << "-"; break; case C_MIX: os << "M"; break; default: assert(false); break; } switch (ctx.i) { case C_ROOT: os << "R"; break; case C_POS: os << "+"; break; case C_NEG: os << "-"; break; case C_MIX: os << "M"; break; default: assert(false); break; } if (ctx.neg) { os << "!"; } return os; } BCtx operator+(const BCtx& c) { switch (c) { case C_ROOT: case C_POS: return C_POS; case C_NEG: return C_NEG; case C_MIX: return C_MIX; default: assert(false); return C_ROOT; } } BCtx operator-(const BCtx& c) { switch (c) { case C_ROOT: case C_POS: return C_NEG; case C_NEG: return C_POS; case C_MIX: return C_MIX; default: assert(false); return C_ROOT; } } /// Check if \a c is non-positive bool nonpos(const BCtx& c) { return c == C_NEG || c == C_MIX; } /// Check if \a c is non-negative bool nonneg(const BCtx& c) { return c == C_ROOT || c == C_POS; } void dump_ee_b(const std::vector& ee) { for (const auto& i : ee) { std::cerr << *i.b() << "\n"; } } void dump_ee_r(const std::vector& ee) { for (const auto& i : ee) { std::cerr << *i.r() << "\n"; } } std::tuple ann_to_ctx(VarDecl* vd) { if (vd->ann().contains(constants().ctx.root)) { return std::make_tuple(C_ROOT, true); } if (vd->ann().contains(constants().ctx.mix)) { return std::make_tuple(C_MIX, true); } if (vd->ann().contains(constants().ctx.pos)) { return std::make_tuple(C_POS, true); } if (vd->ann().contains(constants().ctx.neg)) { return std::make_tuple(C_NEG, true); } return std::make_tuple(C_MIX, false); } void add_ctx_ann(VarDecl* vd, BCtx& c) { if (vd != nullptr) { Id* ctx_id = nullptr; BCtx nc; bool annotated; std::tie(nc, annotated) = ann_to_ctx(vd); // If previously annotated if (annotated) { // Early exit if (nc == c || nc == C_ROOT || (nc == C_MIX && c != C_ROOT)) { return; } // Remove old annotation switch (nc) { case C_ROOT: vd->ann().remove(constants().ctx.root); break; case C_MIX: vd->ann().remove(constants().ctx.mix); break; case C_POS: vd->ann().remove(constants().ctx.pos); break; case C_NEG: vd->ann().remove(constants().ctx.neg); break; default: assert(false); break; } // Determine new context if (c == C_ROOT) { nc = C_ROOT; } else { nc = C_MIX; } } else { nc = c; } switch (nc) { case C_ROOT: ctx_id = constants().ctx.root; break; case C_POS: ctx_id = constants().ctx.pos; break; case C_NEG: ctx_id = constants().ctx.neg; break; case C_MIX: ctx_id = constants().ctx.mix; break; default: assert(false); break; } vd->addAnnotation(ctx_id); } } void make_defined_var(VarDecl* vd, Call* c) { if (!vd->ann().contains(constants().ann.is_defined_var)) { std::vector args(1); args[0] = vd->id(); Call* dv = new Call(Location().introduce(), constants().ann.defines_var, args); dv->type(Type::ann()); vd->addAnnotation(constants().ann.is_defined_var); c->addAnnotation(dv); } } bool is_defines_var_ann(Expression* e) { return e->isa() && e->cast()->id() == constants().ann.defines_var; } /// Check if \a e is NULL or true bool istrue(EnvI& env, Expression* e) { if (e == nullptr) { return true; } if (e->type() == Type::parbool()) { if (e->type().cv()) { Ctx ctx; ctx.b = C_MIX; KeepAlive r = flat_cv_exp(env, ctx, e); return eval_bool(env, r()); } GCLock lock; return eval_bool(env, e); } return false; } /// Check if \a e is non-NULL and false bool isfalse(EnvI& env, Expression* e) { if (e == nullptr) { return false; } if (e->type() == Type::parbool()) { if (e->type().cv()) { Ctx ctx; ctx.b = C_MIX; KeepAlive r = flat_cv_exp(env, ctx, e); return !eval_bool(env, r()); } GCLock lock; return !eval_bool(env, e); } return false; } /// Use bounds from ovd for vd if they are better. /// Returns true if ovd's bounds are better. bool update_bounds(EnvI& envi, VarDecl* ovd, VarDecl* vd) { bool tighter = false; bool fixed = false; if ((ovd->ti()->domain() != nullptr) || (ovd->e() != nullptr)) { IntVal intval; FloatVal doubleval; bool boolval; if (vd->type().isint()) { IntBounds oldbounds = compute_int_bounds(envi, ovd->id()); IntBounds bounds(0, 0, false); if ((vd->ti()->domain() != nullptr) || (vd->e() != nullptr)) { bounds = compute_int_bounds(envi, vd->id()); } if (((vd->ti()->domain() != nullptr) || (vd->e() != nullptr)) && bounds.valid && bounds.l.isFinite() && bounds.u.isFinite()) { if (oldbounds.valid && oldbounds.l.isFinite() && oldbounds.u.isFinite()) { fixed = oldbounds.u == oldbounds.l || bounds.u == bounds.l; if (fixed) { tighter = true; intval = oldbounds.u == oldbounds.l ? oldbounds.u : bounds.l; ovd->ti()->domain(new SetLit(ovd->loc(), IntSetVal::a(intval, intval))); } else { IntSetVal* olddom = ovd->ti()->domain() != nullptr ? eval_intset(envi, ovd->ti()->domain()) : nullptr; IntSetVal* newdom = vd->ti()->domain() != nullptr ? eval_intset(envi, vd->ti()->domain()) : nullptr; if (olddom != nullptr) { if (newdom == nullptr) { tighter = true; } else { IntSetRanges oisr(olddom); IntSetRanges nisr(newdom); IntSetRanges nisr_card(newdom); Ranges::Inter inter(oisr, nisr); if (Ranges::cardinality(inter) < Ranges::cardinality(nisr_card)) { IntSetRanges oisr_inter(olddom); IntSetRanges nisr_inter(newdom); Ranges::Inter inter_card(oisr_inter, nisr_inter); tighter = true; ovd->ti()->domain(new SetLit(ovd->loc(), IntSetVal::ai(inter_card))); } } } } } } else { if (oldbounds.valid && oldbounds.l.isFinite() && oldbounds.u.isFinite()) { tighter = true; fixed = oldbounds.u == oldbounds.l; if (fixed) { intval = oldbounds.u; ovd->ti()->domain(new SetLit(ovd->loc(), IntSetVal::a(intval, intval))); } } } } else if (vd->type().isfloat()) { FloatBounds oldbounds = compute_float_bounds(envi, ovd->id()); FloatBounds bounds(0.0, 0.0, false); if ((vd->ti()->domain() != nullptr) || (vd->e() != nullptr)) { bounds = compute_float_bounds(envi, vd->id()); } if (((vd->ti()->domain() != nullptr) || (vd->e() != nullptr)) && bounds.valid) { if (oldbounds.valid) { fixed = oldbounds.u == oldbounds.l || bounds.u == bounds.l; if (fixed) { doubleval = oldbounds.u == oldbounds.l ? oldbounds.u : bounds.l; } tighter = fixed || (oldbounds.u - oldbounds.l < bounds.u - bounds.l); } } else { if (oldbounds.valid) { tighter = true; fixed = oldbounds.u == oldbounds.l; if (fixed) { doubleval = oldbounds.u; } } } } else if (vd->type().isbool()) { if (ovd->ti()->domain() != nullptr) { fixed = tighter = true; boolval = eval_bool(envi, ovd->ti()->domain()); } else { fixed = tighter = ((ovd->e() != nullptr) && ovd->e()->isa()); if (fixed) { boolval = ovd->e()->cast()->v(); } } } if (tighter) { vd->ti()->domain(ovd->ti()->domain()); if (vd->e() == nullptr && fixed) { if (vd->ti()->type().isvarint()) { vd->type(Type::parint()); vd->ti(new TypeInst(vd->loc(), Type::parint())); vd->e(IntLit::a(intval)); } else if (vd->ti()->type().isvarfloat()) { vd->type(Type::parfloat()); vd->ti(new TypeInst(vd->loc(), Type::parfloat())); vd->e(FloatLit::a(doubleval)); } else if (vd->ti()->type().isvarbool()) { vd->type(Type::parbool()); vd->ti(new TypeInst(vd->loc(), Type::parbool())); vd->ti()->domain(boolval ? constants().literalTrue : constants().literalFalse); vd->e(new BoolLit(vd->loc(), boolval)); } } } } return tighter; } std::string get_path(EnvI& env) { std::string path; std::stringstream ss; if (env.dumpPath(ss)) { path = ss.str(); } return path; } inline Location get_loc(EnvI& env, Expression* e1, Expression* e2) { if (e1 != nullptr) { return e1->loc().introduce(); } if (e2 != nullptr) { return e2->loc().introduce(); } return Location().introduce(); } inline Id* get_id(EnvI& env, Id* origId) { return origId != nullptr ? origId : new Id(Location().introduce(), env.genId(), nullptr); } StringLit* get_longest_mzn_path_annotation(EnvI& env, const Expression* e) { StringLit* sl = nullptr; if (const auto* vd = e->dynamicCast()) { EnvI::ReversePathMap& reversePathMap = env.getReversePathMap(); KeepAlive vd_decl_ka(vd->id()->decl()); auto it = reversePathMap.find(vd_decl_ka); if (it != reversePathMap.end()) { sl = new StringLit(Location(), it->second); } } else { for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { if (Call* ca = (*it)->dynamicCast()) { if (ca->id() == constants().ann.mzn_path) { auto* sl1 = ca->arg(0)->cast(); if (sl != nullptr) { if (sl1->v().size() > sl->v().size()) { sl = sl1; } } else { sl = sl1; } } } } } return sl; } void add_path_annotation(EnvI& env, Expression* e) { if (!(e->type().isAnn() || e->isa()) && e->type().dim() == 0) { GCLock lock; Annotation& ann = e->ann(); if (ann.containsCall(constants().ann.mzn_path)) { return; } EnvI::ReversePathMap& reversePathMap = env.getReversePathMap(); std::vector path_args(1); std::string p; KeepAlive e_ka(e); auto it = reversePathMap.find(e_ka); if (it == reversePathMap.end()) { p = get_path(env); } else { p = it->second; } if (!p.empty()) { path_args[0] = new StringLit(Location(), p); Call* path_call = new Call(e->loc(), constants().ann.mzn_path, path_args); path_call->type(Type::ann()); e->addAnnotation(path_call); } } } VarDecl* new_vardecl(EnvI& env, const Ctx& ctx, TypeInst* ti, Id* origId, VarDecl* origVd, Expression* rhs) { VarDecl* vd = nullptr; // Is this vardecl already in the FlatZinc (for unification) bool hasBeenAdded = false; // Don't use paths for arrays or annotations if (ti->type().dim() == 0 && !ti->type().isAnn()) { std::string path = get_path(env); if (!path.empty()) { EnvI::ReversePathMap& reversePathMap = env.getReversePathMap(); EnvI::PathMap& pathMap = env.getPathMap(); auto it = pathMap.find(path); if (it != pathMap.end()) { auto* ovd = Expression::cast((it->second.decl)()); unsigned int ovd_pass = it->second.passNumber; if (ovd != nullptr) { // If ovd was introduced during the same pass, we can unify if (env.currentPassNumber == ovd_pass) { vd = ovd; if (origId != nullptr) { origId->decl(vd); } hasBeenAdded = true; } else { vd = new VarDecl(get_loc(env, origVd, rhs), ti, get_id(env, origId)); hasBeenAdded = false; update_bounds(env, ovd, vd); } // Check whether ovd was unified in a previous pass if (ovd->id() != ovd->id()->decl()->id()) { // We may not have seen the pointed to decl just yet KeepAlive ovd_decl_ka(ovd->id()->decl()); auto path2It = reversePathMap.find(ovd_decl_ka); if (path2It != reversePathMap.end()) { std::string path2 = path2It->second; EnvI::PathVar vd_tup{vd, env.currentPassNumber}; pathMap[path] = vd_tup; pathMap[path2] = vd_tup; KeepAlive vd_ka(vd); reversePathMap.insert(vd_ka, path); } } } } else { // Create new VarDecl and add it to the maps vd = new VarDecl(get_loc(env, origVd, rhs), ti, get_id(env, origId)); hasBeenAdded = false; EnvI::PathVar vd_tup{vd, env.currentPassNumber}; pathMap[path] = vd_tup; KeepAlive vd_ka(vd); reversePathMap.insert(vd_ka, path); } } } if (vd == nullptr) { vd = new VarDecl(get_loc(env, origVd, rhs), ti, get_id(env, origId)); hasBeenAdded = false; } // If vd has an e() use bind to turn rhs into a constraint if (vd->e() != nullptr) { if (rhs != nullptr) { bind(env, ctx, vd, rhs); } } else { vd->e(rhs); if ((rhs != nullptr) && hasBeenAdded) { // This variable is being reused, so it won't be added to the model below. // Therefore, we need to register that we changed the RHS, in order // for the reference counts to be accurate. env.voAddExp(vd); } } assert(!vd->type().isbot()); if ((origVd != nullptr) && (origVd->id()->idn() != -1 || origVd->toplevel())) { vd->introduced(origVd->introduced()); } else { vd->introduced(true); } vd->flat(vd); // Copy annotations from origVd if (origVd != nullptr) { for (ExpressionSetIter it = origVd->ann().begin(); it != origVd->ann().end(); ++it) { EE ee_ann = flat_exp(env, Ctx(), *it, nullptr, constants().varTrue); vd->addAnnotation(ee_ann.r()); } } if (!hasBeenAdded) { if (FunctionI* fi = env.model->matchRevMap(env, vd->type())) { // We need to introduce a reverse mapper Call* revmap = new Call(Location().introduce(), fi->id(), {vd->id()}); revmap->decl(fi); revmap->type(Type::varbool()); env.flatAddItem(new ConstraintI(Location().introduce(), revmap)); } auto* ni = new VarDeclI(Location().introduce(), vd); env.flatAddItem(ni); EE ee(vd, nullptr); env.cseMapInsert(vd->id(), ee); } return vd; } #define MZN_FILL_REIFY_MAP(T, ID) \ _reifyMap.insert( \ std::pair(constants().ids.T.ID, constants().ids.T##reif.ID)); EnvI::EnvI(Model* model0, std::ostream& outstream0, std::ostream& errstream0) : model(model0), originalModel(nullptr), output(new Model), outstream(outstream0), errstream(errstream0), currentPassNumber(0), finalPassNumber(1), maxPathDepth(0), ignorePartial(false), ignoreUnknownIds(false), maxCallStack(0), inRedundantConstraint(0), inMaybePartial(0), inReverseMapVar(false), counters({0, 0, 0, 0}), pathUse(0), _flat(new Model), _failed(false), _ids(0), _collectVardecls(false) { MZN_FILL_REIFY_MAP(int_, lin_eq); MZN_FILL_REIFY_MAP(int_, lin_le); MZN_FILL_REIFY_MAP(int_, lin_ne); MZN_FILL_REIFY_MAP(int_, plus); MZN_FILL_REIFY_MAP(int_, minus); MZN_FILL_REIFY_MAP(int_, times); MZN_FILL_REIFY_MAP(int_, div); MZN_FILL_REIFY_MAP(int_, mod); MZN_FILL_REIFY_MAP(int_, lt); MZN_FILL_REIFY_MAP(int_, le); MZN_FILL_REIFY_MAP(int_, gt); MZN_FILL_REIFY_MAP(int_, ge); MZN_FILL_REIFY_MAP(int_, eq); MZN_FILL_REIFY_MAP(int_, ne); MZN_FILL_REIFY_MAP(float_, lin_eq); MZN_FILL_REIFY_MAP(float_, lin_le); MZN_FILL_REIFY_MAP(float_, lin_lt); MZN_FILL_REIFY_MAP(float_, lin_ne); MZN_FILL_REIFY_MAP(float_, plus); MZN_FILL_REIFY_MAP(float_, minus); MZN_FILL_REIFY_MAP(float_, times); MZN_FILL_REIFY_MAP(float_, div); MZN_FILL_REIFY_MAP(float_, mod); MZN_FILL_REIFY_MAP(float_, lt); MZN_FILL_REIFY_MAP(float_, le); MZN_FILL_REIFY_MAP(float_, gt); MZN_FILL_REIFY_MAP(float_, ge); MZN_FILL_REIFY_MAP(float_, eq); MZN_FILL_REIFY_MAP(float_, ne); _reifyMap.insert( std::pair(constants().ids.forall, constants().ids.forallReif)); _reifyMap.insert( std::pair(constants().ids.bool_eq, constants().ids.bool_eq_reif)); _reifyMap.insert(std::pair(constants().ids.bool_clause, constants().ids.bool_clause_reif)); _reifyMap.insert( std::pair(constants().ids.clause, constants().ids.bool_clause_reif)); _reifyMap.insert({constants().ids.bool_not, constants().ids.bool_not}); } EnvI::~EnvI() { delete _flat; delete output; delete model; delete originalModel; } long long int EnvI::genId() { return _ids++; } void EnvI::cseMapInsert(Expression* e, const EE& ee) { KeepAlive ka(e); _cseMap.insert(ka, WW(ee.r(), ee.b())); Call* c = e->dynamicCast(); if ((c != nullptr) && c->id() == constants().ids.bool_not && c->arg(0)->isa() && ee.r()->isa() && ee.b() == constants().boollit(true)) { Call* neg_c = new Call(Location().introduce(), c->id(), {ee.r()}); neg_c->type(c->type()); neg_c->decl(c->decl()); KeepAlive neg_ka(neg_c); _cseMap.insert(neg_ka, WW(c->arg(0), ee.b())); } } EnvI::CSEMap::iterator EnvI::cseMapFind(Expression* e) { KeepAlive ka(e); auto it = _cseMap.find(ka); if (it != _cseMap.end()) { if (it->second.r() != nullptr) { VarDecl* it_vd = it->second.r()->isa() ? it->second.r()->cast()->decl() : it->second.r()->dynamicCast(); if (it_vd != nullptr) { int idx = varOccurrences.find(it_vd); if (idx == -1 || (*_flat)[idx]->removed()) { return _cseMap.end(); } } } else { return _cseMap.end(); } } return it; } void EnvI::cseMapRemove(Expression* e) { KeepAlive ka(e); _cseMap.remove(ka); } EnvI::CSEMap::iterator EnvI::cseMapEnd() { return _cseMap.end(); } void EnvI::dump() { struct EED { static std::string k(Expression* e) { std::ostringstream oss; oss << *e; return oss.str(); } static std::string d(const WW& ee) { std::ostringstream oss; oss << *ee.r() << " " << ee.b(); return oss.str(); } }; _cseMap.dump(); } void EnvI::flatAddItem(Item* i) { assert(_flat); if (_failed) { return; } _flat->addItem(i); Expression* toAnnotate = nullptr; Expression* toAdd = nullptr; switch (i->iid()) { case Item::II_VD: { auto* vd = i->cast(); add_path_annotation(*this, vd->e()); toAnnotate = vd->e()->e(); varOccurrences.addIndex(vd, static_cast(_flat->size()) - 1); toAdd = vd->e(); break; } case Item::II_CON: { auto* ci = i->cast(); if (ci->e()->isa() && !ci->e()->cast()->v()) { fail(); } else { toAnnotate = ci->e(); add_path_annotation(*this, ci->e()); toAdd = ci->e(); } break; } case Item::II_SOL: { auto* si = i->cast(); CollectOccurrencesE ce(varOccurrences, si); top_down(ce, si->e()); for (ExpressionSetIter it = si->ann().begin(); it != si->ann().end(); ++it) { top_down(ce, *it); } break; } case Item::II_OUT: { auto* si = i->cast(); toAdd = si->e(); break; } default: break; } if ((toAnnotate != nullptr) && toAnnotate->isa()) { annotateFromCallStack(toAnnotate); } if (toAdd != nullptr) { CollectOccurrencesE ce(varOccurrences, i); top_down(ce, toAdd); } } void EnvI::annotateFromCallStack(Expression* e) { int prev = !idStack.empty() ? idStack.back() : 0; bool allCalls = true; for (int i = static_cast(callStack.size()) - 1; i >= prev; i--) { Expression* ee = callStack[i]->untag(); allCalls = allCalls && (i == callStack.size() - 1 || ee->isa() || ee->isa()); for (ExpressionSetIter it = ee->ann().begin(); it != ee->ann().end(); ++it) { EE ee_ann = flat_exp(*this, Ctx(), *it, nullptr, constants().varTrue); if (allCalls || !is_defines_var_ann(ee_ann.r())) { e->addAnnotation(ee_ann.r()); } } } } void EnvI::copyPathMapsAndState(EnvI& env) { finalPassNumber = env.finalPassNumber; maxPathDepth = env.maxPathDepth; currentPassNumber = env.currentPassNumber; _filenameSet = env._filenameSet; maxPathDepth = env.maxPathDepth; _pathMap = env.getPathMap(); _reversePathMap = env.getReversePathMap(); } void EnvI::flatRemoveExpr(Expression* e, Item* i) { std::vector toRemove; CollectDecls cd(varOccurrences, toRemove, i); top_down(cd, e); Model& flat = (*_flat); while (!toRemove.empty()) { VarDecl* cur = toRemove.back(); toRemove.pop_back(); assert(varOccurrences.occurrences(cur) == 0 && CollectDecls::varIsFree(cur)); auto cur_idx = varOccurrences.idx.find(cur->id()); if (cur_idx != varOccurrences.idx.end()) { auto* vdi = flat[cur_idx->second]->cast(); if (!is_output(vdi->e()) && !vdi->removed()) { CollectDecls cd(varOccurrences, toRemove, vdi); top_down(cd, vdi->e()->e()); vdi->remove(); } } } } void EnvI::flatRemoveItem(ConstraintI* ci) { flatRemoveExpr(ci->e(), ci); ci->e(constants().literalTrue); ci->remove(); } void EnvI::flatRemoveItem(VarDeclI* vdi) { flatRemoveExpr(vdi->e(), vdi); vdi->remove(); } void EnvI::fail(const std::string& msg) { if (!_failed) { addWarning(std::string("model inconsistency detected") + (msg.empty() ? std::string() : (": " + msg))); _failed = true; for (auto& i : *_flat) { i->remove(); } auto* failedConstraint = new ConstraintI(Location().introduce(), constants().literalFalse); _flat->addItem(failedConstraint); _flat->addItem(SolveI::sat(Location().introduce())); for (auto& i : *output) { i->remove(); } output->addItem( new OutputI(Location().introduce(), new ArrayLit(Location(), std::vector()))); throw ModelInconsistent(*this, Location().introduce()); } } bool EnvI::failed() const { return _failed; } unsigned int EnvI::registerEnum(VarDeclI* vdi) { auto it = _enumMap.find(vdi); unsigned int ret; if (it == _enumMap.end()) { ret = static_cast(_enumVarDecls.size()); _enumVarDecls.push_back(vdi); _enumMap.insert(std::make_pair(vdi, ret)); } else { ret = it->second; } return ret + 1; } VarDeclI* EnvI::getEnum(unsigned int i) const { assert(i > 0 && i <= _enumVarDecls.size()); return _enumVarDecls[i - 1]; } unsigned int EnvI::registerArrayEnum(const std::vector& arrayEnum) { std::ostringstream oss; for (unsigned int i : arrayEnum) { assert(i <= _enumVarDecls.size()); oss << i << "."; } auto it = _arrayEnumMap.find(oss.str()); unsigned int ret; if (it == _arrayEnumMap.end()) { ret = static_cast(_arrayEnumDecls.size()); _arrayEnumDecls.push_back(arrayEnum); _arrayEnumMap.insert(std::make_pair(oss.str(), ret)); } else { ret = it->second; } return ret + 1; } const std::vector& EnvI::getArrayEnum(unsigned int i) const { assert(i > 0 && i <= _arrayEnumDecls.size()); return _arrayEnumDecls[i - 1]; } bool EnvI::isSubtype(const Type& t1, const Type& t2, bool strictEnums) const { if (!t1.isSubtypeOf(t2, strictEnums)) { return false; } if (strictEnums && t1.dim() == 0 && t2.dim() != 0 && t2.enumId() != 0) { // set assigned to an array const std::vector& t2enumIds = getArrayEnum(t2.enumId()); if (t2enumIds[t2enumIds.size() - 1] != 0 && t1.enumId() != t2enumIds[t2enumIds.size() - 1]) { return false; } } if (strictEnums && t1.dim() > 0 && t1.enumId() != t2.enumId()) { if (t1.enumId() == 0) { return t1.isbot(); } if (t2.enumId() != 0) { const std::vector& t1enumIds = getArrayEnum(t1.enumId()); const std::vector& t2enumIds = getArrayEnum(t2.enumId()); assert(t1enumIds.size() == t2enumIds.size()); for (unsigned int i = 0; i < t1enumIds.size() - 1; i++) { if (t2enumIds[i] != 0 && t1enumIds[i] != t2enumIds[i]) { return false; } } if (!t1.isbot() && t2enumIds[t1enumIds.size() - 1] != 0 && t1enumIds[t1enumIds.size() - 1] != t2enumIds[t2enumIds.size() - 1]) { return false; } } } return true; } void EnvI::collectVarDecls(bool b) { _collectVardecls = b; } void EnvI::voAddExp(VarDecl* vd) { if ((vd->e() != nullptr) && vd->e()->isa() && !vd->e()->type().isAnn()) { int prev = !idStack.empty() ? idStack.back() : 0; for (int i = static_cast(callStack.size()) - 1; i >= prev; i--) { Expression* ee = callStack[i]->untag(); for (ExpressionSetIter it = ee->ann().begin(); it != ee->ann().end(); ++it) { Expression* ann = *it; if (ann != constants().ann.add_to_output && ann != constants().ann.rhs_from_assignment) { bool needAnnotation = true; if (Call* ann_c = ann->dynamicCast()) { if (ann_c->id() == constants().ann.defines_var) { // only add defines_var annotation if vd is the defined variable if (Id* defined_var = ann_c->arg(0)->dynamicCast()) { if (defined_var->decl() != vd->id()->decl()) { needAnnotation = false; } } } } if (needAnnotation) { EE ee_ann = flat_exp(*this, Ctx(), *it, nullptr, constants().varTrue); vd->e()->addAnnotation(ee_ann.r()); } } } } } int idx = varOccurrences.find(vd); CollectOccurrencesE ce(varOccurrences, (*_flat)[idx]); top_down(ce, vd->e()); if (_collectVardecls) { modifiedVarDecls.push_back(idx); } } Model* EnvI::flat() { return _flat; } void EnvI::swap() { Model* tmp = model; model = _flat; _flat = tmp; } ASTString EnvI::reifyId(const ASTString& id) { auto it = _reifyMap.find(id); if (it == _reifyMap.end()) { std::ostringstream ss; ss << id << "_reif"; return {ss.str()}; } return it->second; } #undef MZN_FILL_REIFY_MAP ASTString EnvI::halfReifyId(const ASTString& id) { std::ostringstream ss; ss << id << "_imp"; return {ss.str()}; } void EnvI::addWarning(const std::string& msg) { if (warnings.size() > 20) { return; } if (warnings.size() == 20) { warnings.emplace_back("Further warnings have been suppressed.\n"); } else { std::ostringstream oss; createErrorStack(); dumpStack(oss, true); warnings.push_back(msg + "\n" + oss.str()); } } void EnvI::createErrorStack() { errorStack.clear(); for (auto i = static_cast(callStack.size()); (i--) != 0U;) { Expression* e = callStack[i]->untag(); bool isCompIter = callStack[i]->isTagged(); KeepAlive ka(e); errorStack.emplace_back(ka, isCompIter); } } Call* EnvI::surroundingCall() const { if (callStack.size() >= 2) { return callStack[callStack.size() - 2]->untag()->dynamicCast(); } return nullptr; } void EnvI::cleanupExceptOutput() { cmap.clear(); _cseMap.clear(); delete _flat; delete model; delete originalModel; _flat = nullptr; model = nullptr; } CallStackItem::CallStackItem(EnvI& env0, Expression* e) : env(env0) { if (e->isa()) { env.idStack.push_back(static_cast(env.callStack.size())); } if (e->isa() && e->cast()->id() == "redundant_constraint") { env.inRedundantConstraint++; } if (e->ann().contains(constants().ann.maybe_partial)) { env.inMaybePartial++; } env.callStack.push_back(e); env.maxCallStack = std::max(env.maxCallStack, static_cast(env.callStack.size())); } CallStackItem::CallStackItem(EnvI& env0, Id* ident, IntVal i) : env(env0) { Expression* ee = ident->tag(); env.callStack.push_back(ee); env.maxCallStack = std::max(env.maxCallStack, static_cast(env.callStack.size())); } CallStackItem::~CallStackItem() { try { Expression* e = env.callStack.back()->untag(); if (e->isa()) { env.idStack.pop_back(); } if (e->isa() && e->cast()->id() == "redundant_constraint") { env.inRedundantConstraint--; } if (e->ann().contains(constants().ann.maybe_partial)) { env.inMaybePartial--; } env.callStack.pop_back(); } catch (std::exception&) { assert(false); // Invariant: These Env vector operations will never throw an exception } } FlatteningError::FlatteningError(EnvI& env, const Location& loc, const std::string& msg) : LocationException(env, loc, msg) {} Env::Env(Model* m, std::ostream& outstream, std::ostream& errstream) : _e(new EnvI(m, outstream, errstream)) {} Env::~Env() { delete _e; } Model* Env::model() { return _e->model; } void Env::model(Model* m) { _e->model = m; } Model* Env::flat() { return _e->flat(); } void Env::swap() { _e->swap(); } Model* Env::output() { return _e->output; } std::ostream& Env::evalOutput(std::ostream& os, std::ostream& log) { return _e->evalOutput(os, log); } EnvI& Env::envi() { return *_e; } const EnvI& Env::envi() const { return *_e; } std::ostream& Env::dumpErrorStack(std::ostream& os) { return _e->dumpStack(os, true); } bool EnvI::dumpPath(std::ostream& os, bool force) { force = force ? force : fopts.collectMznPaths; if (callStack.size() > maxPathDepth) { if (!force && currentPassNumber >= finalPassNumber - 1) { return false; } maxPathDepth = static_cast(callStack.size()); } auto lastError = static_cast(callStack.size()); std::string major_sep = ";"; std::string minor_sep = "|"; for (unsigned int i = 0; i < lastError; i++) { Expression* e = callStack[i]->untag(); bool isCompIter = callStack[i]->isTagged(); Location loc = e->loc(); auto findFilename = _filenameSet.find(loc.filename()); if (findFilename == _filenameSet.end()) { if (!force && currentPassNumber >= finalPassNumber - 1) { return false; } _filenameSet.insert(loc.filename()); } // If this call is not a dummy StringLit with empty Location (so that deferred compilation // doesn't drop the paths) if (e->eid() != Expression::E_STRINGLIT || (loc.firstLine() != 0U) || (loc.firstColumn() != 0U) || (loc.lastLine() != 0U) || (loc.lastColumn() != 0U)) { os << loc.filename() << minor_sep << loc.firstLine() << minor_sep << loc.firstColumn() << minor_sep << loc.lastLine() << minor_sep << loc.lastColumn() << minor_sep; switch (e->eid()) { case Expression::E_INTLIT: os << "il" << minor_sep << *e; break; case Expression::E_FLOATLIT: os << "fl" << minor_sep << *e; break; case Expression::E_SETLIT: os << "sl" << minor_sep << *e; break; case Expression::E_BOOLLIT: os << "bl" << minor_sep << *e; break; case Expression::E_STRINGLIT: os << "stl" << minor_sep << *e; break; case Expression::E_ID: if (isCompIter) { // if (e->cast()->decl()->e()->type().isPar()) os << *e << "=" << *e->cast()->decl()->e(); // else // os << *e << "=?"; } else { os << "id" << minor_sep << *e; } break; case Expression::E_ANON: os << "anon"; break; case Expression::E_ARRAYLIT: os << "al"; break; case Expression::E_ARRAYACCESS: os << "aa"; break; case Expression::E_COMP: { const Comprehension* cmp = e->cast(); if (cmp->set()) { os << "sc"; } else { os << "ac"; } } break; case Expression::E_ITE: os << "ite"; break; case Expression::E_BINOP: os << "bin" << minor_sep << e->cast()->opToString(); break; case Expression::E_UNOP: os << "un" << minor_sep << e->cast()->opToString(); break; case Expression::E_CALL: if (fopts.onlyToplevelPaths) { return false; } os << "ca" << minor_sep << e->cast()->id(); break; case Expression::E_VARDECL: os << "vd"; break; case Expression::E_LET: os << "l"; break; case Expression::E_TI: os << "ti"; break; case Expression::E_TIID: os << "ty"; break; default: assert(false); os << "unknown expression (internal error)"; break; } os << major_sep; } else { os << e->cast()->v() << major_sep; } } return true; } std::ostream& EnvI::dumpStack(std::ostream& os, bool errStack) { int lastError = 0; std::vector errStackCopy; if (errStack) { errStackCopy.resize(errorStack.size()); for (unsigned int i = 0; i < errorStack.size(); i++) { Expression* e = errorStack[i].first(); if (errorStack[i].second) { e = e->tag(); } errStackCopy[i] = e; } } std::vector& stack = errStack ? errStackCopy : callStack; for (; lastError < stack.size(); lastError++) { Expression* e = stack[lastError]->untag(); bool isCompIter = stack[lastError]->isTagged(); if (e->loc().isIntroduced()) { continue; } if (!isCompIter && e->isa()) { break; } } if (lastError == 0 && !stack.empty() && stack[0]->untag()->isa()) { Expression* e = stack[0]->untag(); ASTString newloc_f = e->loc().filename(); if (!e->loc().isIntroduced()) { unsigned int newloc_l = e->loc().firstLine(); os << " " << newloc_f << ":" << newloc_l << ":" << std::endl; os << " in variable declaration " << *e << std::endl; } } else { ASTString curloc_f; long long int curloc_l = -1; for (int i = lastError - 1; i >= 0; i--) { Expression* e = stack[i]->untag(); bool isCompIter = stack[i]->isTagged(); ASTString newloc_f = e->loc().filename(); if (e->loc().isIntroduced()) { continue; } auto newloc_l = static_cast(e->loc().firstLine()); if (newloc_f != curloc_f || newloc_l != curloc_l) { os << " " << newloc_f << ":" << newloc_l << ":" << std::endl; curloc_f = newloc_f; curloc_l = newloc_l; } if (isCompIter) { os << " with "; } else { os << " in "; } switch (e->eid()) { case Expression::E_INTLIT: os << "integer literal" << std::endl; break; case Expression::E_FLOATLIT: os << "float literal" << std::endl; break; case Expression::E_SETLIT: os << "set literal" << std::endl; break; case Expression::E_BOOLLIT: os << "bool literal" << std::endl; break; case Expression::E_STRINGLIT: os << "string literal" << std::endl; break; case Expression::E_ID: if (isCompIter) { if ((e->cast()->decl()->e() != nullptr) && e->cast()->decl()->e()->type().isPar()) { os << *e << " = " << *e->cast()->decl()->e() << std::endl; } else { os << *e << " = " << std::endl; } } else { os << "identifier" << *e << std::endl; } break; case Expression::E_ANON: os << "anonymous variable" << std::endl; break; case Expression::E_ARRAYLIT: os << "array literal" << std::endl; break; case Expression::E_ARRAYACCESS: os << "array access" << std::endl; break; case Expression::E_COMP: { const Comprehension* cmp = e->cast(); if (cmp->set()) { os << "set "; } else { os << "array "; } os << "comprehension expression" << std::endl; } break; case Expression::E_ITE: os << "if-then-else expression" << std::endl; break; case Expression::E_BINOP: os << "binary " << e->cast()->opToString() << " operator expression" << std::endl; break; case Expression::E_UNOP: os << "unary " << e->cast()->opToString() << " operator expression" << std::endl; break; case Expression::E_CALL: os << "call '" << e->cast()->id() << "'" << std::endl; break; case Expression::E_VARDECL: { GCLock lock; os << "variable declaration for '" << e->cast()->id()->str() << "'" << std::endl; } break; case Expression::E_LET: os << "let expression" << std::endl; break; case Expression::E_TI: os << "type-inst expression" << std::endl; break; case Expression::E_TIID: os << "type identifier" << std::endl; break; default: assert(false); os << "unknown expression (internal error)" << std::endl; break; } } } return os; } void populate_output(Env& env) { EnvI& envi = env.envi(); Model* _flat = envi.flat(); Model* _output = envi.output; std::vector outputVars; for (VarDeclIterator it = _flat->vardecls().begin(); it != _flat->vardecls().end(); ++it) { VarDecl* vd = it->e(); Annotation& ann = vd->ann(); ArrayLit* dims = nullptr; bool has_output_ann = false; if (!ann.isEmpty()) { for (ExpressionSetIter ait = ann.begin(); ait != ann.end(); ++ait) { if (Call* c = (*ait)->dynamicCast()) { if (c->id() == constants().ann.output_array) { dims = c->arg(0)->cast(); has_output_ann = true; break; } } else if ((*ait)->isa() && (*ait)->cast()->str() == constants().ann.output_var->str()) { has_output_ann = true; } } if (has_output_ann) { std::ostringstream s; s << vd->id()->str() << " = "; auto* vd_output = copy(env.envi(), vd)->cast(); Type vd_t = vd_output->type(); vd_t.ti(Type::TI_PAR); vd_output->type(vd_t); vd_output->ti()->type(vd_t); if (dims != nullptr) { std::vector ranges(dims->size()); s << "array" << dims->size() << "d("; for (unsigned int i = 0; i < dims->size(); i++) { IntSetVal* idxset = eval_intset(envi, (*dims)[i]); ranges[i] = new TypeInst(Location().introduce(), Type(), new SetLit(Location().introduce(), idxset)); s << *idxset << ","; } Type t = vd_t; vd_t.dim(static_cast(dims->size())); vd_output->type(t); vd_output->ti(new TypeInst(Location().introduce(), vd_t, ranges)); } _output->addItem(new VarDeclI(Location().introduce(), vd_output)); auto* sl = new StringLit(Location().introduce(), s.str()); outputVars.push_back(sl); std::vector showArgs(1); showArgs[0] = vd_output->id(); Call* show = new Call(Location().introduce(), constants().ids.show, showArgs); show->type(Type::parstring()); FunctionI* fi = _flat->matchFn(envi, show, false); assert(fi); show->decl(fi); outputVars.push_back(show); std::string ends = dims != nullptr ? ")" : ""; ends += ";\n"; auto* eol = new StringLit(Location().introduce(), ends); outputVars.push_back(eol); } } } auto* newOutputItem = new OutputI(Location().introduce(), new ArrayLit(Location().introduce(), outputVars)); _output->addItem(newOutputItem); envi.flat()->mergeStdLib(envi, _output); } std::ostream& EnvI::evalOutput(std::ostream& os, std::ostream& log) { GCLock lock; warnings.clear(); ArrayLit* al = eval_array_lit(*this, output->outputItem()->e()); bool fLastEOL = true; for (unsigned int i = 0; i < al->size(); i++) { std::string s = eval_string(*this, (*al)[i]); if (!s.empty()) { os << s; fLastEOL = ('\n' == s.back()); } } if (!fLastEOL) { os << '\n'; } for (auto w : warnings) { log << " WARNING: " << w << "\n"; } return os; } const std::vector& Env::warnings() { return envi().warnings; } void Env::clearWarnings() { envi().warnings.clear(); } unsigned int Env::maxCallStack() const { return envi().maxCallStack; } void check_index_sets(EnvI& env, VarDecl* vd, Expression* e) { ASTExprVec tis = vd->ti()->ranges(); std::vector newtis(tis.size()); bool needNewTypeInst = false; GCLock lock; switch (e->eid()) { case Expression::E_ID: { Id* id = e->cast(); ASTExprVec e_tis = id->decl()->ti()->ranges(); assert(tis.size() == e_tis.size()); for (unsigned int i = 0; i < tis.size(); i++) { if (tis[i]->domain() == nullptr) { newtis[i] = e_tis[i]; needNewTypeInst = true; } else { IntSetVal* isv0 = eval_intset(env, tis[i]->domain()); IntSetVal* isv1 = eval_intset(env, e_tis[i]->domain()); if (!isv0->equal(isv1)) { std::ostringstream oss; oss << "Index set mismatch. Declared index " << (tis.size() == 1 ? "set" : "sets"); oss << " of `" << *vd->id() << "' " << (tis.size() == 1 ? "is [" : "are ["); for (unsigned int j = 0; j < tis.size(); j++) { if (tis[j]->domain() != nullptr) { oss << *eval_intset(env, tis[j]->domain()); } else { oss << "int"; } if (j < tis.size() - 1) { oss << ", "; } } oss << "], but is assigned to array `" << *id << "' with index " << (tis.size() == 1 ? "set [" : "sets ["); for (unsigned int j = 0; j < e_tis.size(); j++) { oss << *eval_intset(env, e_tis[j]->domain()); if (j < e_tis.size() - 1) { oss << ", "; } } oss << "]. You may need to coerce the index sets using the array" << tis.size() << "d function."; throw EvalError(env, vd->loc(), oss.str()); } newtis[i] = tis[i]; } } } break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); for (unsigned int i = 0; i < tis.size(); i++) { if (tis[i]->domain() == nullptr) { newtis[i] = new TypeInst( Location().introduce(), Type(), new SetLit(Location().introduce(), IntSetVal::a(al->min(i), al->max(i)))); needNewTypeInst = true; } else if (i == 0 || al->size() != 0) { IntSetVal* isv = eval_intset(env, tis[i]->domain()); assert(isv->size() <= 1); if ((isv->size() == 0 && al->min(i) <= al->max(i)) || (isv->size() != 0 && (isv->min(0) != al->min(i) || isv->max(0) != al->max(i)))) { std::ostringstream oss; oss << "Index set mismatch. Declared index " << (tis.size() == 1 ? "set" : "sets"); oss << " of `" << *vd->id() << "' " << (tis.size() == 1 ? "is [" : "are ["); for (unsigned int j = 0; j < tis.size(); j++) { if (tis[j]->domain() != nullptr) { oss << *eval_intset(env, tis[j]->domain()); } else { oss << "int"; } if (j < tis.size() - 1) { oss << ","; } } oss << "], but is assigned to array with index " << (tis.size() == 1 ? "set [" : "sets ["); for (unsigned int j = 0; j < al->dims(); j++) { oss << al->min(j) << ".." << al->max(j); if (j < al->dims() - 1) { oss << ", "; } } oss << "]. You may need to coerce the index sets using the array" << tis.size() << "d function."; throw EvalError(env, vd->loc(), oss.str()); } newtis[i] = tis[i]; } } } break; default: throw InternalError("not supported yet"); } if (needNewTypeInst) { auto* tic = copy(env, vd->ti())->cast(); tic->setRanges(newtis); vd->ti(tic); } } /// Turn \a c into domain constraints if possible. /// Return whether \a c is still required in the model. bool check_domain_constraints(EnvI& env, Call* c) { if (env.fopts.recordDomainChanges) { return true; } if (c->id() == constants().ids.int_.le) { Expression* e0 = c->arg(0); Expression* e1 = c->arg(1); if (e0->type().isPar() && e1->isa()) { // greater than Id* id = e1->cast(); IntVal lb = eval_int(env, e0); if (id->decl()->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, id->decl()->ti()->domain()); if (domain->min() >= lb) { return false; } if (domain->max() < lb) { env.fail(); return false; } IntSetRanges dr(domain); Ranges::Const cr(lb, IntVal::infinity()); Ranges::Inter> i(dr, cr); IntSetVal* newibv = IntSetVal::ai(i); id->decl()->ti()->domain(new SetLit(Location().introduce(), newibv)); id->decl()->ti()->setComputedDomain(false); } else { id->decl()->ti()->domain( new SetLit(Location().introduce(), IntSetVal::a(lb, IntVal::infinity()))); } return false; } if (e1->type().isPar() && e0->isa()) { // less than Id* id = e0->cast(); IntVal ub = eval_int(env, e1); if (id->decl()->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, id->decl()->ti()->domain()); if (domain->max() <= ub) { return false; } if (domain->min() > ub) { env.fail(); return false; } IntSetRanges dr(domain); Ranges::Const cr(-IntVal::infinity(), ub); Ranges::Inter> i(dr, cr); IntSetVal* newibv = IntSetVal::ai(i); id->decl()->ti()->domain(new SetLit(Location().introduce(), newibv)); id->decl()->ti()->setComputedDomain(false); } else { id->decl()->ti()->domain( new SetLit(Location().introduce(), IntSetVal::a(-IntVal::infinity(), ub))); } } } else if (c->id() == constants().ids.int_.lin_le) { auto* al_c = follow_id(c->arg(0))->cast(); if (al_c->size() == 1) { auto* al_x = follow_id(c->arg(1))->cast(); IntVal coeff = eval_int(env, (*al_c)[0]); IntVal y = eval_int(env, c->arg(2)); IntVal lb = -IntVal::infinity(); IntVal ub = IntVal::infinity(); IntVal r = y % coeff; if (coeff >= 0) { ub = y / coeff; if (r < 0) { --ub; } } else { lb = y / coeff; if (r < 0) { ++lb; } } if (Id* id = (*al_x)[0]->dynamicCast()) { if (id->decl()->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, id->decl()->ti()->domain()); if (domain->max() <= ub && domain->min() >= lb) { return false; } if (domain->min() > ub || domain->max() < lb) { env.fail(); return false; } IntSetRanges dr(domain); Ranges::Const cr(lb, ub); Ranges::Inter> i(dr, cr); IntSetVal* newibv = IntSetVal::ai(i); id->decl()->ti()->domain(new SetLit(Location().introduce(), newibv)); id->decl()->ti()->setComputedDomain(false); } else { id->decl()->ti()->domain(new SetLit(Location().introduce(), IntSetVal::a(lb, ub))); } return false; } } } return true; } KeepAlive bind(EnvI& env, Ctx ctx, VarDecl* vd, Expression* e) { assert(e == nullptr || !e->isa()); if (vd == constants().varIgnore) { return e; } if (Id* ident = e->dynamicCast()) { if (ident->decl() != nullptr) { auto* e_vd = follow_id_to_decl(ident)->cast(); e = e_vd->id(); if (!env.inReverseMapVar && ctx.b != C_ROOT && e->type() == Type::varbool()) { add_ctx_ann(e_vd, ctx.b); if (e_vd != ident->decl()) { add_ctx_ann(ident->decl(), ctx.b); } } } } if (ctx.neg) { assert(e->type().bt() == Type::BT_BOOL); if (vd == constants().varTrue) { if (!isfalse(env, e)) { if (Id* id = e->dynamicCast()) { while (id != nullptr) { assert(id->decl() != nullptr); if ((id->decl()->ti()->domain() != nullptr) && istrue(env, id->decl()->ti()->domain())) { GCLock lock; env.flatAddItem(new ConstraintI(Location().introduce(), constants().literalFalse)); } else { GCLock lock; std::vector args(2); args[0] = id; args[1] = constants().literalFalse; Call* c = new Call(Location().introduce(), constants().ids.bool_eq, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); if (c->decl()->e() != nullptr) { flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } set_computed_domain(env, id->decl(), constants().literalFalse, id->decl()->ti()->computedDomain()); } id = id->decl()->e() != nullptr ? id->decl()->e()->dynamicCast() : nullptr; } return constants().literalTrue; } GC::lock(); Call* bn = new Call(e->loc(), constants().ids.bool_not, {e}); bn->type(e->type()); bn->decl(env.model->matchFn(env, bn, false)); KeepAlive ka(bn); GC::unlock(); EE ee = flat_exp(env, Ctx(), bn, vd, constants().varTrue); return ee.r; } return constants().literalTrue; } GC::lock(); Call* bn = new Call(e->loc(), constants().ids.bool_not, {e}); bn->type(e->type()); bn->decl(env.model->matchFn(env, bn, false)); KeepAlive ka(bn); GC::unlock(); EE ee = flat_exp(env, Ctx(), bn, vd, constants().varTrue); return ee.r; } if (vd == constants().varTrue) { if (!istrue(env, e)) { if (Id* id = e->dynamicCast()) { assert(id->decl() != nullptr); while (id != nullptr) { if ((id->decl()->ti()->domain() != nullptr) && isfalse(env, id->decl()->ti()->domain())) { GCLock lock; env.flatAddItem(new ConstraintI(Location().introduce(), constants().literalFalse)); } else if (id->decl()->ti()->domain() == nullptr) { GCLock lock; std::vector args(2); args[0] = id; args[1] = constants().literalTrue; Call* c = new Call(Location().introduce(), constants().ids.bool_eq, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); if (c->decl()->e() != nullptr) { flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } set_computed_domain(env, id->decl(), constants().literalTrue, id->decl()->ti()->computedDomain()); } id = id->decl()->e() != nullptr ? id->decl()->e()->dynamicCast() : nullptr; } } else { GCLock lock; // extract domain information from added constraint if possible if (!e->isa() || check_domain_constraints(env, e->cast())) { env.flatAddItem(new ConstraintI(Location().introduce(), e)); } } } return constants().literalTrue; } if (vd == constants().varFalse) { if (!isfalse(env, e)) { throw InternalError("not supported yet"); } return constants().literalTrue; } if (vd == nullptr) { if (e == nullptr) { return nullptr; } switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_ID: case Expression::E_TIID: case Expression::E_SETLIT: case Expression::E_VARDECL: case Expression::E_BINOP: // TODO: should not happen once operators are evaluated case Expression::E_UNOP: // TODO: should not happen once operators are evaluated return e; case Expression::E_ARRAYACCESS: case Expression::E_COMP: case Expression::E_ITE: case Expression::E_LET: case Expression::E_TI: throw InternalError("unevaluated expression"); case Expression::E_ARRAYLIT: { GCLock lock; auto* al = e->cast(); /// TODO: review if limit of 10 is a sensible choice if (al->type().bt() == Type::BT_ANN || al->size() <= 10) { return e; } auto it = env.cseMapFind(al); if (it != env.cseMapEnd()) { return it->second.r()->cast()->id(); } std::vector ranges(al->dims()); for (unsigned int i = 0; i < ranges.size(); i++) { ranges[i] = new TypeInst( e->loc(), Type(), new SetLit(Location().introduce(), IntSetVal::a(al->min(i), al->max(i)))); } ASTExprVec ranges_v(ranges); assert(!al->type().isbot()); Expression* domain = nullptr; if (al->size() > 0 && (*al)[0]->type().isint()) { IntVal min = IntVal::infinity(); IntVal max = -IntVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { IntBounds ib = compute_int_bounds(env, (*al)[i]); if (!ib.valid) { min = -IntVal::infinity(); max = IntVal::infinity(); break; } min = std::min(min, ib.l); max = std::max(max, ib.u); } if (min != -IntVal::infinity() && max != IntVal::infinity()) { domain = new SetLit(Location().introduce(), IntSetVal::a(min, max)); } } auto* ti = new TypeInst(e->loc(), al->type(), ranges_v, domain); if (domain != nullptr) { ti->setComputedDomain(true); } VarDecl* nvd = new_vardecl(env, ctx, ti, nullptr, nullptr, al); EE ee(nvd, nullptr); env.cseMapInsert(al, ee); env.cseMapInsert(nvd->e(), ee); return nvd->id(); } case Expression::E_CALL: { if (e->type().isAnn()) { return e; } GCLock lock; /// TODO: handle array types auto* ti = new TypeInst(Location().introduce(), e->type()); VarDecl* nvd = new_vardecl(env, ctx, ti, nullptr, nullptr, e); if (nvd->e()->type().bt() == Type::BT_INT && nvd->e()->type().dim() == 0) { IntSetVal* ibv = nullptr; if (nvd->e()->type().isSet()) { ibv = compute_intset_bounds(env, nvd->e()); } else { IntBounds ib = compute_int_bounds(env, nvd->e()); if (ib.valid) { ibv = IntSetVal::a(ib.l, ib.u); } } if (ibv != nullptr) { Id* id = nvd->id(); while (id != nullptr) { bool is_computed = id->decl()->ti()->computedDomain(); if (id->decl()->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, id->decl()->ti()->domain()); IntSetRanges dr(domain); IntSetRanges ibr(ibv); Ranges::Inter i(dr, ibr); IntSetVal* newibv = IntSetVal::ai(i); if (ibv->card() == newibv->card()) { is_computed = true; } else { ibv = newibv; } } else { is_computed = true; } if (id->type().st() == Type::ST_PLAIN && ibv->size() == 0) { env.fail(); } else { set_computed_domain(env, id->decl(), new SetLit(Location().introduce(), ibv), is_computed); } id = id->decl()->e() != nullptr ? id->decl()->e()->dynamicCast() : nullptr; } } } else if (nvd->e()->type().isbool()) { add_ctx_ann(nvd, ctx.b); } else if (nvd->e()->type().bt() == Type::BT_FLOAT && nvd->e()->type().dim() == 0) { FloatBounds fb = compute_float_bounds(env, nvd->e()); FloatSetVal* ibv = LinearTraits::intersectDomain(nullptr, fb.l, fb.u); if (fb.valid) { Id* id = nvd->id(); while (id != nullptr) { bool is_computed = id->decl()->ti()->computedDomain(); if (id->decl()->ti()->domain() != nullptr) { FloatSetVal* domain = eval_floatset(env, id->decl()->ti()->domain()); FloatSetVal* ndomain = LinearTraits::intersectDomain(domain, fb.l, fb.u); if ((ibv != nullptr) && ndomain == domain) { is_computed = true; } else { ibv = ndomain; } } else { is_computed = true; } if (LinearTraits::domainEmpty(ibv)) { env.fail(); } else { set_computed_domain(env, id->decl(), new SetLit(Location().introduce(), ibv), is_computed); } id = id->decl()->e() != nullptr ? id->decl()->e()->dynamicCast() : nullptr; } } } return nvd->id(); } default: assert(false); return nullptr; } } else { if (vd->e() == nullptr) { Expression* ret = e; if (e == nullptr || (e->type().isPar() && e->type().isbool())) { GCLock lock; bool isTrue = (e == nullptr || eval_bool(env, e)); // Check if redefinition of bool_eq exists, if yes call it std::vector args(2); args[0] = vd->id(); args[1] = constants().boollit(isTrue); Call* c = new Call(Location().introduce(), constants().ids.bool_eq, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); bool didRewrite = false; if (c->decl()->e() != nullptr) { flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); didRewrite = true; } vd->e(constants().boollit(isTrue)); if (vd->ti()->domain() != nullptr) { if (vd->ti()->domain() != vd->e()) { env.fail(); return vd->id(); } } else { set_computed_domain(env, vd, vd->e(), true); } if (didRewrite) { return vd->id(); } } else { if (e->type().dim() > 0) { // Check that index sets match env.errorStack.clear(); check_index_sets(env, vd, e); auto* al = Expression::dynamicCast(e->isa() ? e->cast()->decl()->e() : e); if ((al != nullptr) && (vd->ti()->domain() != nullptr) && !vd->ti()->domain()->isa()) { if (e->type().bt() == Type::BT_INT) { IntSetVal* isv = eval_intset(env, vd->ti()->domain()); for (unsigned int i = 0; i < al->size(); i++) { if (Id* id = (*al)[i]->dynamicCast()) { if (id == constants().absent) { continue; } VarDecl* vdi = id->decl(); if (vdi->ti()->domain() == nullptr) { set_computed_domain(env, vdi, vd->ti()->domain(), vdi->ti()->computedDomain()); } else { IntSetVal* vdi_dom = eval_intset(env, vdi->ti()->domain()); IntSetRanges isvr(isv); IntSetRanges vdi_domr(vdi_dom); Ranges::Inter inter(isvr, vdi_domr); IntSetVal* newdom = IntSetVal::ai(inter); if (newdom->size() == 0) { env.fail(); } else { IntSetRanges vdi_domr2(vdi_dom); IntSetRanges newdomr(newdom); if (!Ranges::equal(vdi_domr2, newdomr)) { set_computed_domain(env, vdi, new SetLit(Location().introduce(), newdom), false); } } } } else { // at this point, can only be a constant assert((*al)[i]->type().isPar()); if (e->type().st() == Type::ST_PLAIN) { IntVal iv = eval_int(env, (*al)[i]); if (!isv->contains(iv)) { std::ostringstream oss; oss << "value " << iv << " outside declared array domain " << *isv; env.fail(oss.str()); } } else { IntSetVal* aisv = eval_intset(env, (*al)[i]); IntSetRanges aisv_r(aisv); IntSetRanges isv_r(isv); if (!Ranges::subset(aisv_r, isv_r)) { std::ostringstream oss; oss << "value " << *aisv << " outside declared array domain " << *isv; env.fail(oss.str()); } } } } vd->ti()->setComputedDomain(true); } else if (e->type().bt() == Type::BT_FLOAT) { FloatSetVal* fsv = eval_floatset(env, vd->ti()->domain()); for (unsigned int i = 0; i < al->size(); i++) { if (Id* id = (*al)[i]->dynamicCast()) { VarDecl* vdi = id->decl(); if (vdi->ti()->domain() == nullptr) { set_computed_domain(env, vdi, vd->ti()->domain(), vdi->ti()->computedDomain()); } else { FloatSetVal* vdi_dom = eval_floatset(env, vdi->ti()->domain()); FloatSetRanges fsvr(fsv); FloatSetRanges vdi_domr(vdi_dom); Ranges::Inter inter(fsvr, vdi_domr); FloatSetVal* newdom = FloatSetVal::ai(inter); if (newdom->size() == 0) { env.fail(); } else { FloatSetRanges vdi_domr2(vdi_dom); FloatSetRanges newdomr(newdom); if (!Ranges::equal(vdi_domr2, newdomr)) { set_computed_domain(env, vdi, new SetLit(Location().introduce(), newdom), false); } } } } else { // at this point, can only be a constant assert((*al)[i]->type().isPar()); FloatVal fv = eval_float(env, (*al)[i]); if (!fsv->contains(fv)) { std::ostringstream oss; oss << "value " << fv << " outside declared array domain " << *fsv; env.fail(oss.str()); } } } vd->ti()->setComputedDomain(true); } } } else if (Id* e_id = e->dynamicCast()) { if (e_id == vd->id()) { ret = vd->id(); } else { ASTString cid; if (e->type().isint()) { if (e->type().isOpt()) { cid = ASTString("int_opt_eq"); } else { cid = constants().ids.int_.eq; } } else if (e->type().isbool()) { if (e->type().isOpt()) { cid = ASTString("bool_opt_eq"); } else { cid = constants().ids.bool_eq; } } else if (e->type().isSet()) { cid = constants().ids.set_eq; } else if (e->type().isfloat()) { cid = constants().ids.float_.eq; } if (cid != "" && env.hasReverseMapper(vd->id())) { GCLock lock; std::vector args(2); args[0] = vd->id(); args[1] = e_id; Call* c = new Call(Location().introduce(), cid, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); if (c->type().isbool() && ctx.b != C_ROOT) { add_ctx_ann(vd, ctx.b); add_ctx_ann(e_id->decl(), ctx.b); } if (c->decl()->e() != nullptr) { flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); ret = vd->id(); vd->e(e); env.voAddExp(vd); } } } } if (ret != vd->id()) { vd->e(ret); add_path_annotation(env, ret); env.voAddExp(vd); ret = vd->id(); } Id* vde_id = Expression::dynamicCast(vd->e()); if (vde_id == constants().absent) { // no need to do anything } else if ((vde_id != nullptr) && vde_id->decl()->ti()->domain() == nullptr) { if (vd->ti()->domain() != nullptr) { GCLock lock; Expression* vd_dom = eval_par(env, vd->ti()->domain()); set_computed_domain(env, vde_id->decl(), vd_dom, vde_id->decl()->ti()->computedDomain()); } } else if ((vd->e() != nullptr) && vd->e()->type().bt() == Type::BT_INT && vd->e()->type().dim() == 0) { GCLock lock; IntSetVal* ibv = nullptr; if (vd->e()->type().isSet()) { ibv = compute_intset_bounds(env, vd->e()); } else { IntBounds ib = compute_int_bounds(env, vd->e()); if (ib.valid) { Call* call = vd->e()->dynamicCast(); if ((call != nullptr) && call->id() == constants().ids.lin_exp) { ArrayLit* al = eval_array_lit(env, call->arg(1)); if (al->size() == 1) { IntBounds check_zeroone = compute_int_bounds(env, (*al)[0]); if (check_zeroone.l == 0 && check_zeroone.u == 1) { ArrayLit* coeffs = eval_array_lit(env, call->arg(0)); std::vector newdom(2); newdom[0] = 0; newdom[1] = eval_int(env, (*coeffs)[0]) + eval_int(env, call->arg(2)); ibv = IntSetVal::a(newdom); } } } if (ibv == nullptr) { ibv = IntSetVal::a(ib.l, ib.u); } } } if (ibv != nullptr) { if (vd->ti()->domain() != nullptr) { IntSetVal* domain = eval_intset(env, vd->ti()->domain()); IntSetRanges dr(domain); IntSetRanges ibr(ibv); Ranges::Inter i(dr, ibr); IntSetVal* newibv = IntSetVal::ai(i); if (newibv->card() == 0) { env.fail(); } else if (ibv->card() == newibv->card()) { vd->ti()->setComputedDomain(true); } else { ibv = newibv; } } else { vd->ti()->setComputedDomain(true); } SetLit* ibv_l = nullptr; if (Id* rhs_ident = vd->e()->dynamicCast()) { if (rhs_ident->decl()->ti()->domain() != nullptr) { IntSetVal* rhs_domain = eval_intset(env, rhs_ident->decl()->ti()->domain()); IntSetRanges dr(rhs_domain); IntSetRanges ibr(ibv); Ranges::Inter i(dr, ibr); IntSetVal* rhs_newibv = IntSetVal::ai(i); if (rhs_domain->card() != rhs_newibv->card()) { ibv_l = new SetLit(Location().introduce(), rhs_newibv); set_computed_domain(env, rhs_ident->decl(), ibv_l, false); if (rhs_ident->decl()->type().isOpt()) { std::vector args(2); args[0] = rhs_ident; args[1] = ibv_l; Call* c = new Call(Location().introduce(), "var_dom", args); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); (void)flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } } else if (ibv->card() != rhs_newibv->card()) { ibv_l = new SetLit(Location().introduce(), rhs_newibv); } } } if (ibv_l == nullptr) { ibv_l = new SetLit(Location().introduce(), ibv); } set_computed_domain(env, vd, ibv_l, vd->ti()->computedDomain()); if (vd->type().isOpt()) { std::vector args(2); args[0] = vd->id(); args[1] = ibv_l; Call* c = new Call(Location().introduce(), "var_dom", args); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); (void)flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } } } else if ((vd->e() != nullptr) && vd->e()->type().bt() == Type::BT_FLOAT && vd->e()->type().dim() == 0) { GCLock lock; FloatSetVal* fbv = nullptr; FloatBounds fb = compute_float_bounds(env, vd->e()); if (fb.valid) { fbv = FloatSetVal::a(fb.l, fb.u); } if (fbv != nullptr) { if (vd->ti()->domain() != nullptr) { FloatSetVal* domain = eval_floatset(env, vd->ti()->domain()); FloatSetRanges dr(domain); FloatSetRanges fbr(fbv); Ranges::Inter i(dr, fbr); FloatSetVal* newfbv = FloatSetVal::ai(i); if (newfbv->size() == 0) { env.fail(); } FloatSetRanges dr_eq(domain); FloatSetRanges newfbv_eq(newfbv); if (Ranges::equal(dr_eq, newfbv_eq)) { vd->ti()->setComputedDomain(true); } else { fbv = newfbv; } } else { vd->ti()->setComputedDomain(true); } SetLit* fbv_l = nullptr; if (Id* rhs_ident = vd->e()->dynamicCast()) { if (rhs_ident->decl()->ti()->domain() != nullptr) { FloatSetVal* rhs_domain = eval_floatset(env, rhs_ident->decl()->ti()->domain()); FloatSetRanges dr(rhs_domain); FloatSetRanges ibr(fbv); Ranges::Inter i(dr, ibr); FloatSetVal* rhs_newfbv = FloatSetVal::ai(i); if (rhs_domain->card() != rhs_newfbv->card()) { fbv_l = new SetLit(Location().introduce(), rhs_newfbv); set_computed_domain(env, rhs_ident->decl(), fbv_l, false); if (rhs_ident->decl()->type().isOpt()) { std::vector args(2); args[0] = rhs_ident; args[1] = fbv_l; Call* c = new Call(Location().introduce(), "var_dom", args); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); (void)flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } } else if (fbv->card() != rhs_newfbv->card()) { fbv_l = new SetLit(Location().introduce(), rhs_newfbv); } } } fbv_l = new SetLit(Location().introduce(), fbv); set_computed_domain(env, vd, fbv_l, vd->ti()->computedDomain()); if (vd->type().isOpt()) { std::vector args(2); args[0] = vd->id(); args[1] = fbv_l; Call* c = new Call(Location().introduce(), "var_dom", args); c->type(Type::varbool()); c->decl(env.model->matchFn(env, c, false)); (void)flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } } } } return ret; } if (vd == e) { return vd->id(); } if (vd->e() != e) { e = follow_id_to_decl(e); if (vd == e) { return vd->id(); } switch (e->eid()) { case Expression::E_BOOLLIT: { Id* id = vd->id(); while (id != nullptr) { if ((id->decl()->ti()->domain() != nullptr) && eval_bool(env, id->decl()->ti()->domain()) == e->cast()->v()) { return constants().literalTrue; } if ((id->decl()->ti()->domain() != nullptr) && eval_bool(env, id->decl()->ti()->domain()) != e->cast()->v()) { GCLock lock; env.flatAddItem(new ConstraintI(Location().introduce(), constants().literalFalse)); } else { GCLock lock; std::vector args(2); args[0] = id; args[1] = e; Call* c = new Call(Location().introduce(), constants().ids.bool_eq, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); if (c->decl()->e() != nullptr) { flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); } set_computed_domain(env, id->decl(), e, id->decl()->ti()->computedDomain()); } id = id->decl()->e() != nullptr ? id->decl()->e()->dynamicCast() : nullptr; } return constants().literalTrue; } case Expression::E_VARDECL: { auto* e_vd = e->cast(); if (vd->e() == e_vd->id() || e_vd->e() == vd->id()) { return vd->id(); } if (e->type().dim() != 0) { throw InternalError("not supported yet"); } GCLock lock; ASTString cid; if (e->type().isint()) { cid = constants().ids.int_.eq; } else if (e->type().isbool()) { cid = constants().ids.bool_eq; } else if (e->type().isSet()) { cid = constants().ids.set_eq; } else if (e->type().isfloat()) { cid = constants().ids.float_.eq; } else { throw InternalError("not yet implemented"); } std::vector args(2); args[0] = vd->id(); args[1] = e_vd->id(); Call* c = new Call(vd->loc().introduce(), cid, args); c->decl(env.model->matchFn(env, c, false)); c->type(c->decl()->rtype(env, args, false)); flat_exp(env, Ctx(), c, constants().varTrue, constants().varTrue); return vd->id(); } case Expression::E_CALL: { Call* c = e->cast(); GCLock lock; Call* nc; std::vector args; if (c->id() == constants().ids.lin_exp) { auto* le_c = follow_id(c->arg(0))->cast(); std::vector ncoeff(le_c->size()); for (auto i = static_cast(ncoeff.size()); (i--) != 0U;) { ncoeff[i] = (*le_c)[i]; } ncoeff.push_back(IntLit::a(-1)); args.push_back(new ArrayLit(Location().introduce(), ncoeff)); args[0]->type(le_c->type()); auto* le_x = follow_id(c->arg(1))->cast(); std::vector nx(le_x->size()); for (auto i = static_cast(nx.size()); (i--) != 0U;) { nx[i] = (*le_x)[i]; } nx.push_back(vd->id()); args.push_back(new ArrayLit(Location().introduce(), nx)); args[1]->type(le_x->type()); args.push_back(c->arg(2)); nc = new Call(c->loc().introduce(), constants().ids.lin_exp, args); nc->decl(env.model->matchFn(env, nc, false)); if (nc->decl() == nullptr) { std::ostringstream ss; ss << "undeclared function or predicate " << nc->id(); throw InternalError(ss.str()); } nc->type(nc->decl()->rtype(env, args, false)); auto* bop = new BinOp(nc->loc(), nc, BOT_EQ, IntLit::a(0)); bop->type(Type::varbool()); flat_exp(env, Ctx(), bop, constants().varTrue, constants().varTrue); return vd->id(); } args.resize(c->argCount()); for (auto i = static_cast(args.size()); (i--) != 0U;) { args[i] = c->arg(i); } args.push_back(vd->id()); ASTString nid = c->id(); if (c->id() == constants().ids.exists) { nid = constants().ids.array_bool_or; } else if (c->id() == constants().ids.forall) { nid = constants().ids.array_bool_and; } else if (vd->type().isbool()) { if (env.fopts.enableHalfReification && vd->ann().contains(constants().ctx.pos)) { nid = env.halfReifyId(c->id()); if (env.model->matchFn(env, nid, args, false) == nullptr) { nid = env.reifyId(c->id()); } } else { nid = env.reifyId(c->id()); } } nc = new Call(c->loc().introduce(), nid, args); FunctionI* nc_decl = env.model->matchFn(env, nc, false); if (nc_decl == nullptr) { std::ostringstream ss; ss << "undeclared function or predicate " << nc->id(); throw InternalError(ss.str()); } nc->decl(nc_decl); nc->type(nc->decl()->rtype(env, args, false)); make_defined_var(vd, nc); flat_exp(env, Ctx(), nc, constants().varTrue, constants().varTrue); return vd->id(); } break; default: throw InternalError("not supported yet"); } } else { return e; } } } KeepAlive conj(EnvI& env, VarDecl* b, const Ctx& ctx, const std::vector& e) { if (!ctx.neg) { std::vector nontrue; for (const auto& i : e) { if (istrue(env, i.b())) { continue; } if (isfalse(env, i.b())) { return bind(env, Ctx(), b, constants().literalFalse); } nontrue.push_back(i.b()); } if (nontrue.empty()) { return bind(env, Ctx(), b, constants().literalTrue); } if (nontrue.size() == 1) { return bind(env, ctx, b, nontrue[0]); } if (b == constants().varTrue) { for (auto& i : nontrue) { bind(env, ctx, b, i); } return constants().literalTrue; } GC::lock(); std::vector args; auto* al = new ArrayLit(Location().introduce(), nontrue); al->type(Type::varbool(1)); args.push_back(al); Call* ret = new Call(nontrue[0]->loc().introduce(), constants().ids.forall, args); ret->decl(env.model->matchFn(env, ret, false)); ret->type(ret->decl()->rtype(env, args, false)); KeepAlive ka(ret); GC::unlock(); return flat_exp(env, ctx, ret, b, constants().varTrue).r; } Ctx nctx = ctx; nctx.neg = false; nctx.b = -nctx.b; // negated std::vector nonfalse; for (const auto& i : e) { if (istrue(env, i.b())) { continue; } if (isfalse(env, i.b())) { return bind(env, Ctx(), b, constants().literalTrue); } nonfalse.push_back(i.b()); } if (nonfalse.empty()) { return bind(env, Ctx(), b, constants().literalFalse); } if (nonfalse.size() == 1) { GC::lock(); UnOp* uo = new UnOp(nonfalse[0]->loc(), UOT_NOT, nonfalse[0]); uo->type(Type::varbool()); KeepAlive ka(uo); GC::unlock(); return flat_exp(env, nctx, uo, b, constants().varTrue).r; } if (b == constants().varFalse) { for (auto& i : nonfalse) { bind(env, nctx, b, i); } return constants().literalFalse; } GC::lock(); std::vector args; for (auto& i : nonfalse) { UnOp* uo = new UnOp(i->loc(), UOT_NOT, i); uo->type(Type::varbool()); i = uo; } auto* al = new ArrayLit(Location().introduce(), nonfalse); al->type(Type::varbool(1)); args.push_back(al); Call* ret = new Call(Location().introduce(), constants().ids.exists, args); ret->decl(env.model->matchFn(env, ret, false)); ret->type(ret->decl()->rtype(env, args, false)); assert(ret->decl()); KeepAlive ka(ret); GC::unlock(); return flat_exp(env, nctx, ret, b, constants().varTrue).r; } TypeInst* eval_typeinst(EnvI& env, const Ctx& ctx, VarDecl* vd) { bool hasTiVars = (vd->ti()->domain() != nullptr) && vd->ti()->domain()->isa(); for (unsigned int i = 0; i < vd->ti()->ranges().size(); i++) { hasTiVars = hasTiVars || ((vd->ti()->ranges()[i]->domain() != nullptr) && vd->ti()->ranges()[i]->domain()->isa()); } if (hasTiVars) { assert(vd->e()); if (vd->e()->type().dim() == 0) { return new TypeInst(Location().introduce(), vd->e()->type()); } ArrayLit* al = eval_array_lit(env, vd->e()); std::vector dims(al->dims()); for (unsigned int i = 0; i < dims.size(); i++) { dims[i] = new TypeInst(Location().introduce(), Type(), new SetLit(Location().introduce(), IntSetVal::a(al->min(i), al->max(i)))); } return new TypeInst(Location().introduce(), vd->e()->type(), dims, flat_cv_exp(env, ctx, vd->ti()->domain())()); } std::vector dims(vd->ti()->ranges().size()); for (unsigned int i = 0; i < vd->ti()->ranges().size(); i++) { if (vd->ti()->ranges()[i]->domain() != nullptr) { KeepAlive range = flat_cv_exp(env, ctx, vd->ti()->ranges()[i]->domain()); IntSetVal* isv = eval_intset(env, range()); if (isv->size() > 1) { throw EvalError(env, vd->ti()->ranges()[i]->domain()->loc(), "array index set must be contiguous range"); } auto* sl = new SetLit(vd->ti()->ranges()[i]->loc(), isv); sl->type(Type::parsetint()); dims[i] = new TypeInst(vd->ti()->ranges()[i]->loc(), Type(), sl); } else { dims[i] = new TypeInst(vd->ti()->ranges()[i]->loc(), Type(), nullptr); } } Type t = ((vd->e() != nullptr) && !vd->e()->type().isbot()) ? vd->e()->type() : vd->ti()->type(); return new TypeInst(vd->ti()->loc(), t, dims, flat_cv_exp(env, ctx, vd->ti()->domain())()); } KeepAlive flat_cv_exp(EnvI& env, Ctx ctx, Expression* e) { if (e == nullptr) { return nullptr; } GCLock lock; if (e->type().isPar() && !e->type().cv()) { return eval_par(env, e); } if (e->type().isvar()) { EE ee = flat_exp(env, ctx, e, nullptr, nullptr); if (isfalse(env, ee.b())) { throw ResultUndefinedError(env, e->loc(), ""); } return ee.r(); } switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_TIID: case Expression::E_VARDECL: case Expression::E_TI: case Expression::E_ANON: assert(false); return nullptr; case Expression::E_ID: { Id* id = e->cast(); return flat_cv_exp(env, ctx, id->decl()->e()); } case Expression::E_SETLIT: { auto* sl = e->cast(); if ((sl->isv() != nullptr) || (sl->fsv() != nullptr)) { return sl; } std::vector es(sl->v().size()); GCLock lock; for (unsigned int i = 0; i < sl->v().size(); i++) { es[i] = flat_cv_exp(env, ctx, sl->v()[i])(); } auto* sl_ret = new SetLit(Location().introduce(), es); Type t = sl->type(); t.cv(false); sl_ret->type(t); return eval_par(env, sl_ret); } case Expression::E_ARRAYLIT: { auto* al = e->cast(); std::vector es(al->size()); GCLock lock; for (unsigned int i = 0; i < al->size(); i++) { es[i] = flat_cv_exp(env, ctx, (*al)[i])(); } std::vector> dims(al->dims()); for (int i = 0; i < al->dims(); i++) { dims[i] = std::make_pair(al->min(i), al->max(i)); } Expression* al_ret = eval_par(env, new ArrayLit(Location().introduce(), es, dims)); Type t = al->type(); t.cv(false); al_ret->type(t); return al_ret; } case Expression::E_ARRAYACCESS: { auto* aa = e->cast(); GCLock lock; Expression* av = flat_cv_exp(env, ctx, aa->v())(); std::vector idx(aa->idx().size()); for (unsigned int i = 0; i < aa->idx().size(); i++) { idx[i] = flat_cv_exp(env, ctx, aa->idx()[i])(); } auto* aa_ret = new ArrayAccess(Location().introduce(), av, idx); Type t = aa->type(); t.cv(false); aa_ret->type(t); return eval_par(env, aa_ret); } case Expression::E_COMP: { auto* c = e->cast(); GCLock lock; class EvalFlatCvExp : public EvalBase { public: Ctx ctx; EvalFlatCvExp(Ctx& ctx0) : ctx(ctx0) {} typedef Expression* ArrayVal; Expression* e(EnvI& env, Expression* e) const { return flat_cv_exp(env, ctx, e)(); } static Expression* exp(Expression* e) { return e; } static Expression* flatten(EnvI& env, Expression* e0) { return flat_exp(env, Ctx(), e0, nullptr, constants().varTrue).r(); } } eval(ctx); std::vector a = eval_comp(env, eval, c); Type t = Type::bot(); bool allPar = true; for (auto& i : a) { if (t == Type::bot()) { t = i->type(); } if (!i->type().isPar()) { allPar = false; } } if (!allPar) { t.ti(Type::TI_VAR); } if (c->set()) { t.st(Type::ST_SET); } else { t.dim(c->type().dim()); } t.cv(false); if (c->set()) { if (c->type().isPar() && allPar) { auto* sl = new SetLit(c->loc().introduce(), a); sl->type(t); Expression* slr = eval_par(env, sl); slr->type(t); return slr; } throw InternalError("var set comprehensions not supported yet"); } auto* alr = new ArrayLit(Location().introduce(), a); alr->type(t); alr->flat(true); return alr; } case Expression::E_ITE: { ITE* ite = e->cast(); for (int i = 0; i < ite->size(); i++) { KeepAlive ka = flat_cv_exp(env, ctx, ite->ifExpr(i)); if (eval_bool(env, ka())) { return flat_cv_exp(env, ctx, ite->thenExpr(i)); } } return flat_cv_exp(env, ctx, ite->elseExpr()); } case Expression::E_BINOP: { auto* bo = e->cast(); if (bo->op() == BOT_AND) { GCLock lock; Expression* lhs = flat_cv_exp(env, ctx, bo->lhs())(); if (!eval_bool(env, lhs)) { return constants().literalFalse; } return eval_par(env, flat_cv_exp(env, ctx, bo->rhs())()); } if (bo->op() == BOT_OR) { GCLock lock; Expression* lhs = flat_cv_exp(env, ctx, bo->lhs())(); if (eval_bool(env, lhs)) { return constants().literalTrue; } return eval_par(env, flat_cv_exp(env, ctx, bo->rhs())()); } GCLock lock; auto* nbo = new BinOp(bo->loc().introduce(), flat_cv_exp(env, ctx, bo->lhs())(), bo->op(), flat_cv_exp(env, ctx, bo->rhs())()); nbo->type(bo->type()); nbo->decl(bo->decl()); return eval_par(env, nbo); } case Expression::E_UNOP: { UnOp* uo = e->cast(); GCLock lock; UnOp* nuo = new UnOp(uo->loc(), uo->op(), flat_cv_exp(env, ctx, uo->e())()); nuo->type(uo->type()); return eval_par(env, nuo); } case Expression::E_CALL: { Call* c = e->cast(); if (c->id() == "mzn_in_root_context") { return constants().boollit(ctx.b == C_ROOT); } if (ctx.b == C_ROOT && (c->decl()->e() != nullptr) && c->decl()->e()->isa()) { bool allBool = true; for (unsigned int i = 0; i < c->argCount(); i++) { if (c->arg(i)->type().bt() != Type::BT_BOOL) { allBool = false; break; } } if (allBool) { return c->decl()->e(); } } std::vector args(c->argCount()); GCLock lock; for (unsigned int i = 0; i < c->argCount(); i++) { Ctx c_mix; c_mix.b = C_MIX; c_mix.i = C_MIX; args[i] = flat_cv_exp(env, c_mix, c->arg(i))(); } Call* nc = new Call(c->loc(), c->id(), args); nc->decl(c->decl()); Type nct(c->type()); if ((nc->decl()->e() != nullptr) && nc->decl()->e()->type().cv()) { nct.cv(false); nct.ti(Type::TI_VAR); nc->type(nct); EE ee = flat_exp(env, ctx, nc, nullptr, nullptr); if (isfalse(env, ee.b())) { std::ostringstream ss; ss << "evaluation of `" << nc->id() << "was undefined"; throw ResultUndefinedError(env, e->loc(), ss.str()); } return ee.r(); } nc->type(nct); return eval_par(env, nc); } case Expression::E_LET: { Let* l = e->cast(); EE ee = flat_exp(env, ctx, l, nullptr, nullptr); if (isfalse(env, ee.b())) { throw ResultUndefinedError(env, e->loc(), "evaluation of let expression was undefined"); } return ee.r(); } } throw InternalError("internal error"); } class ItemTimer { public: using TimingMap = std::map, std::chrono::high_resolution_clock::duration>; ItemTimer(const Location& loc, TimingMap* tm) : _loc(loc), _tm(tm), _start(std::chrono::high_resolution_clock::now()) {} ~ItemTimer() { try { if (_tm != nullptr) { std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now(); unsigned int line = _loc.firstLine(); auto it = _tm->find(std::make_pair(_loc.filename(), line)); if (it != _tm->end()) { it->second += end - _start; } else { _tm->insert(std::make_pair(std::make_pair(_loc.filename(), line), end - _start)); } } } catch (std::exception& e) { assert(false); // Invariant: Operations on the TimingMap will not throw an exception } } private: const Location& _loc; TimingMap* _tm; std::chrono::high_resolution_clock::time_point _start; }; void flatten(Env& e, FlatteningOptions opt) { ItemTimer::TimingMap timingMap_o; ItemTimer::TimingMap* timingMap = opt.detailedTiming ? &timingMap_o : nullptr; try { EnvI& env = e.envi(); env.fopts = opt; bool onlyRangeDomains = false; if (opt.onlyRangeDomains) { onlyRangeDomains = true; // compulsory } else { GCLock lock; Call* check_only_range = new Call(Location(), "mzn_check_only_range_domains", std::vector()); check_only_range->type(Type::parbool()); check_only_range->decl(env.model->matchFn(e.envi(), check_only_range, false)); onlyRangeDomains = eval_bool(e.envi(), check_only_range); } bool hadSolveItem = false; // Flatten main model class FV : public ItemVisitor { public: EnvI& env; bool& hadSolveItem; ItemTimer::TimingMap* timingMap; FV(EnvI& env0, bool& hadSolveItem0, ItemTimer::TimingMap* timingMap0) : env(env0), hadSolveItem(hadSolveItem0), timingMap(timingMap0) {} bool enter(Item* i) const { return !(i->isa() && env.failed()); } void vVarDeclI(VarDeclI* v) { ItemTimer item_timer(v->loc(), timingMap); v->e()->ann().remove(constants().ann.output_var); v->e()->ann().removeCall(constants().ann.output_array); if (v->e()->ann().contains(constants().ann.output_only)) { return; } if (v->e()->type().isPar() && !v->e()->type().isOpt() && !v->e()->type().cv() && v->e()->type().dim() > 0 && v->e()->ti()->domain() == nullptr && (v->e()->type().bt() == Type::BT_INT || v->e()->type().bt() == Type::BT_FLOAT)) { // Compute bounds for array literals CallStackItem csi(env, v->e()); GCLock lock; ArrayLit* al = eval_array_lit(env, v->e()->e()); v->e()->e(al); check_index_sets(env, v->e(), v->e()->e()); if (al->size() > 0) { if (v->e()->type().bt() == Type::BT_INT && v->e()->type().st() == Type::ST_PLAIN) { IntVal lb = IntVal::infinity(); IntVal ub = -IntVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { IntVal vi = eval_int(env, (*al)[i]); lb = std::min(lb, vi); ub = std::max(ub, vi); } GCLock lock; set_computed_domain(env, v->e(), new SetLit(Location().introduce(), IntSetVal::a(lb, ub)), true); } else if (v->e()->type().bt() == Type::BT_FLOAT && v->e()->type().st() == Type::ST_PLAIN) { FloatVal lb = FloatVal::infinity(); FloatVal ub = -FloatVal::infinity(); for (unsigned int i = 0; i < al->size(); i++) { FloatVal vi = eval_float(env, (*al)[i]); lb = std::min(lb, vi); ub = std::max(ub, vi); } GCLock lock; set_computed_domain(env, v->e(), new SetLit(Location().introduce(), FloatSetVal::a(lb, ub)), true); } } } else if (v->e()->type().isvar() || v->e()->type().isAnn()) { (void)flatten_id(env, Ctx(), v->e()->id(), nullptr, constants().varTrue, true); } else { if (v->e()->e() == nullptr) { if (!v->e()->type().isAnn()) { throw EvalError(env, v->e()->loc(), "Undefined parameter", v->e()->id()->v()); } } else { CallStackItem csi(env, v->e()); GCLock lock; Location v_loc = v->e()->e()->loc(); if (!v->e()->e()->type().cv()) { v->e()->e(eval_par(env, v->e()->e())); } else { EE ee = flat_exp(env, Ctx(), v->e()->e(), nullptr, constants().varTrue); v->e()->e(ee.r()); } check_par_declaration(env, v->e()); } } } void vConstraintI(ConstraintI* ci) { ItemTimer item_timer(ci->loc(), timingMap); (void)flat_exp(env, Ctx(), ci->e(), constants().varTrue, constants().varTrue); } void vSolveI(SolveI* si) { if (hadSolveItem) { throw FlatteningError(env, si->loc(), "Only one solve item allowed"); } ItemTimer item_timer(si->loc(), timingMap); hadSolveItem = true; GCLock lock; SolveI* nsi = nullptr; switch (si->st()) { case SolveI::ST_SAT: nsi = SolveI::sat(Location()); break; case SolveI::ST_MIN: { Ctx ctx; ctx.i = C_NEG; nsi = SolveI::min(Location().introduce(), flat_exp(env, ctx, si->e(), nullptr, constants().varTrue).r()); } break; case SolveI::ST_MAX: { Ctx ctx; ctx.i = C_POS; nsi = SolveI::max(Location().introduce(), flat_exp(env, Ctx(), si->e(), nullptr, constants().varTrue).r()); } break; } for (ExpressionSetIter it = si->ann().begin(); it != si->ann().end(); ++it) { nsi->ann().add(flat_exp(env, Ctx(), *it, nullptr, constants().varTrue).r()); } env.flatAddItem(nsi); } } _fv(env, hadSolveItem, timingMap); iter_items(_fv, e.model()); if (!hadSolveItem) { GCLock lock; e.envi().flatAddItem(SolveI::sat(Location().introduce())); } // Create output model if (opt.keepOutputInFzn) { copy_output(env); } else { create_output(env, opt.outputMode, opt.outputObjective, opt.outputOutputItem, opt.hasChecker); } // Flatten remaining redefinitions Model& m = *e.flat(); int startItem = 0; int endItem = static_cast(m.size()) - 1; FunctionI* int_lin_eq; { std::vector int_lin_eq_t(3); int_lin_eq_t[0] = Type::parint(1); int_lin_eq_t[1] = Type::varint(1); int_lin_eq_t[2] = Type::parint(0); GCLock lock; FunctionI* fi = env.model->matchFn(env, constants().ids.int_.lin_eq, int_lin_eq_t, false); int_lin_eq = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; } FunctionI* float_lin_eq; { std::vector float_lin_eq_t(3); float_lin_eq_t[0] = Type::parfloat(1); float_lin_eq_t[1] = Type::varfloat(1); float_lin_eq_t[2] = Type::parfloat(0); GCLock lock; FunctionI* fi = env.model->matchFn(env, constants().ids.float_.lin_eq, float_lin_eq_t, false); float_lin_eq = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; } FunctionI* array_bool_and; FunctionI* array_bool_or; FunctionI* array_bool_clause; FunctionI* array_bool_clause_reif; FunctionI* bool_xor; { std::vector array_bool_andor_t(2); array_bool_andor_t[0] = Type::varbool(1); array_bool_andor_t[1] = Type::varbool(0); GCLock lock; FunctionI* fi = env.model->matchFn(env, ASTString("array_bool_and"), array_bool_andor_t, false); array_bool_and = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; fi = env.model->matchFn(env, ASTString("array_bool_or"), array_bool_andor_t, false); array_bool_or = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; array_bool_andor_t[1] = Type::varbool(1); fi = env.model->matchFn(env, ASTString("bool_clause"), array_bool_andor_t, false); array_bool_clause = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; array_bool_andor_t.push_back(Type::varbool()); fi = env.model->matchFn(env, ASTString("bool_clause_reif"), array_bool_andor_t, false); array_bool_clause_reif = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; std::vector bool_xor_t(3); bool_xor_t[0] = Type::varbool(); bool_xor_t[1] = Type::varbool(); bool_xor_t[2] = Type::varbool(); fi = env.model->matchFn(env, constants().ids.bool_xor, bool_xor_t, false); bool_xor = ((fi != nullptr) && (fi->e() != nullptr)) ? fi : nullptr; } std::vector convertToRangeDomain; env.collectVarDecls(true); while (startItem <= endItem || !env.modifiedVarDecls.empty() || !convertToRangeDomain.empty()) { if (env.failed()) { return; } std::vector agenda; for (int i = startItem; i <= endItem; i++) { agenda.push_back(i); } for (int modifiedVarDecl : env.modifiedVarDecls) { agenda.push_back(modifiedVarDecl); } env.modifiedVarDecls.clear(); bool doConvertToRangeDomain = false; if (agenda.empty()) { for (auto i : convertToRangeDomain) { agenda.push_back(i); } convertToRangeDomain.clear(); doConvertToRangeDomain = true; } for (int i : agenda) { if (auto* vdi = m[i]->dynamicCast()) { if (vdi->removed()) { continue; } /// Look at constraints if (!is_output(vdi->e())) { if (0 < env.varOccurrences.occurrences(vdi->e())) { const auto it = env.varOccurrences.itemMap.find(vdi->e()->id()); if (env.varOccurrences.itemMap.end() != it) { bool hasRedundantOccurrenciesOnly = true; for (const auto& c : it->second) { if (auto* constrI = c->dynamicCast()) { if (auto* call = constrI->e()->dynamicCast()) { if (call->id() == "mzn_reverse_map_var") { continue; // all good } } } hasRedundantOccurrenciesOnly = false; break; } if (hasRedundantOccurrenciesOnly) { env.flatRemoveItem(vdi); env.varOccurrences.removeAllOccurrences(vdi->e()); for (const auto& c : it->second) { c->remove(); } continue; } } } else { // 0 occurrencies if ((vdi->e()->e() != nullptr) && (vdi->e()->ti()->domain() != nullptr)) { if (vdi->e()->type().isvar() && vdi->e()->type().isbool() && !vdi->e()->type().isOpt() && Expression::equal(vdi->e()->ti()->domain(), constants().literalTrue)) { GCLock lock; auto* ci = new ConstraintI(vdi->loc(), vdi->e()->e()); if (vdi->e()->introduced()) { env.flatAddItem(ci); env.flatRemoveItem(vdi); continue; } vdi->e()->e(nullptr); env.flatAddItem(ci); } else if (vdi->e()->type().isPar() || vdi->e()->ti()->computedDomain()) { env.flatRemoveItem(vdi); continue; } } else { env.flatRemoveItem(vdi); continue; } } } if (vdi->e()->type().dim() > 0 && vdi->e()->type().isvar()) { vdi->e()->ti()->domain(nullptr); } if (vdi->e()->type().isint() && vdi->e()->type().isvar() && vdi->e()->ti()->domain() != nullptr) { GCLock lock; IntSetVal* dom = eval_intset(env, vdi->e()->ti()->domain()); bool needRangeDomain = onlyRangeDomains; if (!needRangeDomain && dom->size() > 0) { if (dom->min(0).isMinusInfinity() || dom->max(dom->size() - 1).isPlusInfinity()) { needRangeDomain = true; } } if (needRangeDomain) { if (doConvertToRangeDomain) { if (dom->min(0).isMinusInfinity() || dom->max(dom->size() - 1).isPlusInfinity()) { auto* nti = copy(env, vdi->e()->ti())->cast(); nti->domain(nullptr); vdi->e()->ti(nti); if (dom->min(0).isFinite()) { std::vector args(2); args[0] = IntLit::a(dom->min(0)); args[1] = vdi->e()->id(); Call* call = new Call(Location().introduce(), constants().ids.int_.le, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } else if (dom->max(dom->size() - 1).isFinite()) { std::vector args(2); args[0] = vdi->e()->id(); args[1] = IntLit::a(dom->max(dom->size() - 1)); Call* call = new Call(Location().introduce(), constants().ids.int_.le, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } } else if (dom->size() > 1) { auto* newDom = new SetLit(Location().introduce(), IntSetVal::a(dom->min(0), dom->max(dom->size() - 1))); auto* nti = copy(env, vdi->e()->ti())->cast(); nti->domain(newDom); vdi->e()->ti(nti); } if (dom->size() > 1) { std::vector args(2); args[0] = vdi->e()->id(); args[1] = new SetLit(vdi->e()->loc(), dom); Call* call = new Call(vdi->e()->loc(), constants().ids.set_in, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); // Give distinct call stack Annotation& ann = vdi->e()->ann(); Expression* tmp = call; if (Expression* mznpath_ann = ann.getCall(constants().ann.mzn_path)) { tmp = mznpath_ann->cast()->arg(0); } CallStackItem csi(env, tmp); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } } else { convertToRangeDomain.push_back(i); } } } if (vdi->e()->type().isfloat() && vdi->e()->type().isvar() && vdi->e()->ti()->domain() != nullptr) { GCLock lock; FloatSetVal* vdi_dom = eval_floatset(env, vdi->e()->ti()->domain()); FloatVal vmin = vdi_dom->min(); FloatVal vmax = vdi_dom->max(); if (vmin == -FloatVal::infinity() && vmax == FloatVal::infinity()) { vdi->e()->ti()->domain(nullptr); } else if (vmin == -FloatVal::infinity()) { vdi->e()->ti()->domain(nullptr); std::vector args(2); args[0] = vdi->e()->id(); args[1] = FloatLit::a(vmax); Call* call = new Call(Location().introduce(), constants().ids.float_.le, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } else if (vmax == FloatVal::infinity()) { vdi->e()->ti()->domain(nullptr); std::vector args(2); args[0] = FloatLit::a(vmin); args[1] = vdi->e()->id(); Call* call = new Call(Location().introduce(), constants().ids.float_.le, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } else if (vdi_dom->size() > 1) { auto* dom_ranges = new BinOp(vdi->e()->ti()->domain()->loc().introduce(), FloatLit::a(vmin), BOT_DOTDOT, FloatLit::a(vmax)); vdi->e()->ti()->domain(dom_ranges); std::vector ranges; for (FloatSetRanges vdi_r(vdi_dom); vdi_r(); ++vdi_r) { ranges.push_back(FloatLit::a(vdi_r.min())); ranges.push_back(FloatLit::a(vdi_r.max())); } auto* al = new ArrayLit(Location().introduce(), ranges); al->type(Type::parfloat(1)); std::vector args(2); args[0] = vdi->e()->id(); args[1] = al; Call* call = new Call(Location().introduce(), constants().ids.float_.dom, args); call->type(Type::varbool()); call->decl(env.model->matchFn(env, call, false)); env.flatAddItem(new ConstraintI(Location().introduce(), call)); } } } } // rewrite some constraints if there are redefinitions for (int i : agenda) { if (m[i]->removed()) { continue; } if (auto* vdi = m[i]->dynamicCast()) { VarDecl* vd = vdi->e(); if (vd->e() != nullptr) { bool isTrueVar = vd->type().isbool() && Expression::equal(vd->ti()->domain(), constants().literalTrue); if (Call* c = vd->e()->dynamicCast()) { GCLock lock; Call* nc = nullptr; if (c->id() == constants().ids.lin_exp) { if (c->type().isfloat() && (float_lin_eq != nullptr)) { std::vector args(c->argCount()); auto* le_c = follow_id(c->arg(0))->cast(); std::vector nc_c(le_c->size()); for (auto ii = static_cast(nc_c.size()); (ii--) != 0U;) { nc_c[ii] = (*le_c)[ii]; } nc_c.push_back(FloatLit::a(-1)); args[0] = new ArrayLit(Location().introduce(), nc_c); args[0]->type(Type::parfloat(1)); auto* le_x = follow_id(c->arg(1))->cast(); std::vector nx(le_x->size()); for (auto ii = static_cast(nx.size()); (ii--) != 0U;) { nx[ii] = (*le_x)[ii]; } nx.push_back(vd->id()); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(Type::varfloat(1)); FloatVal d = c->arg(2)->cast()->v(); args[2] = FloatLit::a(-d); args[2]->type(Type::parfloat(0)); nc = new Call(c->loc().introduce(), ASTString("float_lin_eq"), args); nc->type(Type::varbool()); nc->decl(float_lin_eq); } else if (int_lin_eq != nullptr) { assert(c->type().isint()); std::vector args(c->argCount()); auto* le_c = follow_id(c->arg(0))->cast(); std::vector nc_c(le_c->size()); for (auto ii = static_cast(nc_c.size()); (ii--) != 0U;) { nc_c[ii] = (*le_c)[ii]; } nc_c.push_back(IntLit::a(-1)); args[0] = new ArrayLit(Location().introduce(), nc_c); args[0]->type(Type::parint(1)); auto* le_x = follow_id(c->arg(1))->cast(); std::vector nx(le_x->size()); for (auto ii = static_cast(nx.size()); (ii--) != 0U;) { nx[ii] = (*le_x)[ii]; } nx.push_back(vd->id()); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(Type::varint(1)); IntVal d = c->arg(2)->cast()->v(); args[2] = IntLit::a(-d); args[2]->type(Type::parint(0)); nc = new Call(c->loc().introduce(), ASTString("int_lin_eq"), args); nc->type(Type::varbool()); nc->decl(int_lin_eq); } } else if (c->id() == constants().ids.exists) { if (array_bool_or != nullptr) { std::vector args(2); args[0] = c->arg(0); args[1] = vd->id(); nc = new Call(c->loc().introduce(), array_bool_or->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_or); } } else if (!isTrueVar && c->id() == constants().ids.forall) { if (array_bool_and != nullptr) { std::vector args(2); args[0] = c->arg(0); args[1] = vd->id(); nc = new Call(c->loc().introduce(), array_bool_and->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_and); } } else if (isTrueVar && c->id() == constants().ids.clause && (array_bool_clause != nullptr)) { std::vector args(2); args[0] = c->arg(0); args[1] = c->arg(1); nc = new Call(c->loc().introduce(), array_bool_clause->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_clause); } else if (c->id() == constants().ids.clause && (array_bool_clause_reif != nullptr)) { std::vector args(3); args[0] = c->arg(0); args[1] = c->arg(1); args[2] = vd->id(); nc = new Call(c->loc().introduce(), array_bool_clause_reif->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_clause_reif); } else if (c->id() == constants().ids.bool_not && c->argCount() == 1 && c->decl()->e() == nullptr) { bool isFalseVar = Expression::equal(vd->ti()->domain(), constants().literalFalse); if (c->arg(0) == constants().boollit(true)) { if (isTrueVar) { env.fail(); } else { env.flatRemoveExpr(c, vdi); env.cseMapRemove(c); vd->e(constants().literalFalse); vd->ti()->domain(constants().literalFalse); } } else if (c->arg(0) == constants().boollit(false)) { if (isFalseVar) { env.fail(); } else { env.flatRemoveExpr(c, vdi); env.cseMapRemove(c); vd->e(constants().literalTrue); vd->ti()->domain(constants().literalTrue); } } else if (c->arg(0)->isa() && (isTrueVar || isFalseVar)) { VarDecl* arg_vd = c->arg(0)->cast()->decl(); if (arg_vd->ti()->domain() == nullptr) { arg_vd->e(constants().boollit(!isTrueVar)); arg_vd->ti()->domain(constants().boollit(!isTrueVar)); } else if (arg_vd->ti()->domain() == constants().boollit(isTrueVar)) { env.fail(); } else { arg_vd->e(arg_vd->ti()->domain()); } env.flatRemoveExpr(c, vdi); vd->e(nullptr); // Need to remove right hand side from CSE map, otherwise // flattening of nc could assume c has already been flattened // to vd env.cseMapRemove(c); } else { // don't know how to handle, use bool_not/2 nc = new Call(c->loc().introduce(), c->id(), {c->arg(0), vd->id()}); nc->type(Type::varbool()); nc->decl(env.model->matchFn(env, nc, false)); } } else { if (isTrueVar) { FunctionI* decl = env.model->matchFn(env, c, false); env.cseMapRemove(c); if ((decl->e() != nullptr) || c->id() == constants().ids.forall) { if (decl->e() != nullptr) { add_path_annotation(env, decl->e()); } c->decl(decl); nc = c; } } else { std::vector args(c->argCount()); for (auto i = static_cast(args.size()); (i--) != 0U;) { args[i] = c->arg(i); } args.push_back(vd->id()); ASTString cid = c->id(); if (cid == constants().ids.clause && (array_bool_clause_reif != nullptr)) { nc = new Call(c->loc().introduce(), array_bool_clause_reif->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_clause_reif); } else { FunctionI* decl = nullptr; if (c->type().isbool() && vd->type().isbool()) { if (env.fopts.enableHalfReification && vd->ann().contains(constants().ctx.pos)) { cid = env.halfReifyId(c->id()); decl = env.model->matchFn(env, cid, args, false); if (decl == nullptr) { cid = env.reifyId(c->id()); decl = env.model->matchFn(env, cid, args, false); } } else { cid = env.reifyId(c->id()); decl = env.model->matchFn(env, cid, args, false); } if (decl == nullptr) { std::ostringstream ss; ss << "'" << c->id() << "' is used in a reified context but no reified version is " "available"; throw FlatteningError(env, c->loc(), ss.str()); } } else { decl = env.model->matchFn(env, cid, args, false); } if ((decl != nullptr) && (decl->e() != nullptr)) { add_path_annotation(env, decl->e()); nc = new Call(c->loc().introduce(), cid, args); nc->type(Type::varbool()); nc->decl(decl); } } } } if (nc != nullptr) { // Note: Removal of VarDecl's referenced by c must be delayed // until nc is flattened std::vector toRemove; CollectDecls cd(env.varOccurrences, toRemove, vdi); top_down(cd, c); vd->e(nullptr); // Need to remove right hand side from CSE map, otherwise // flattening of nc could assume c has already been flattened // to vd env.cseMapRemove(c); /// TODO: check if removing variables here makes sense: // if (!is_output(vd) && env.varOccurrences.occurrences(vd)==0) { // removedItems.push_back(vdi); // } if (nc != c) { make_defined_var(vd, nc); for (ExpressionSetIter it = c->ann().begin(); it != c->ann().end(); ++it) { EE ee_ann = flat_exp(env, Ctx(), *it, nullptr, constants().varTrue); nc->addAnnotation(ee_ann.r()); } } StringLit* vsl = get_longest_mzn_path_annotation(env, vdi->e()); StringLit* csl = get_longest_mzn_path_annotation(env, c); CallStackItem* vsi = nullptr; CallStackItem* csi = nullptr; if (vsl != nullptr) { vsi = new CallStackItem(env, vsl); } if (csl != nullptr) { csi = new CallStackItem(env, csl); } Location orig_loc = nc->loc(); if (csl != nullptr) { ASTString loc = csl->v(); size_t sep = loc.find('|'); std::string filename = loc.substr(0, sep); std::string start_line_s = loc.substr(sep + 1, loc.find('|', sep + 1) - sep - 1); int start_line = std::stoi(start_line_s); Location new_loc(ASTString(filename), start_line, 0, start_line, 0); orig_loc = new_loc; } ItemTimer item_timer(orig_loc, timingMap); (void)flat_exp(env, Ctx(), nc, constants().varTrue, constants().varTrue); delete csi; delete vsi; // Remove VarDecls becoming unused through the removal of c // because they are not used by nc while (!toRemove.empty()) { VarDecl* cur = toRemove.back(); toRemove.pop_back(); if (env.varOccurrences.occurrences(cur) == 0 && CollectDecls::varIsFree(cur)) { auto cur_idx = env.varOccurrences.idx.find(cur->id()); if (cur_idx != env.varOccurrences.idx.end()) { auto* vdi = m[cur_idx->second]->cast(); if (!is_output(cur) && !m[cur_idx->second]->removed()) { CollectDecls cd(env.varOccurrences, toRemove, vdi); top_down(cd, vdi->e()->e()); vdi->remove(); } } } } } } } } else if (auto* ci = m[i]->dynamicCast()) { if (Call* c = ci->e()->dynamicCast()) { GCLock lock; Call* nc = nullptr; if (c->id() == constants().ids.exists) { if (array_bool_or != nullptr) { std::vector args(2); args[0] = c->arg(0); args[1] = constants().literalTrue; nc = new Call(c->loc().introduce(), array_bool_or->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_or); } } else if (c->id() == constants().ids.forall) { if (array_bool_and != nullptr) { std::vector args(2); args[0] = c->arg(0); args[1] = constants().literalTrue; nc = new Call(c->loc().introduce(), array_bool_and->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_and); } } else if (c->id() == constants().ids.clause) { if (array_bool_clause != nullptr) { std::vector args(2); args[0] = c->arg(0); args[1] = c->arg(1); nc = new Call(c->loc().introduce(), array_bool_clause->id(), args); nc->type(Type::varbool()); nc->decl(array_bool_clause); } } else if (c->id() == constants().ids.bool_xor) { if (bool_xor != nullptr) { std::vector args(3); args[0] = c->arg(0); args[1] = c->arg(1); args[2] = c->argCount() == 2 ? constants().literalTrue : c->arg(2); nc = new Call(c->loc().introduce(), bool_xor->id(), args); nc->type(Type::varbool()); nc->decl(bool_xor); } } else if (c->id() == constants().ids.bool_not && c->argCount() == 1 && c->decl()->e() == nullptr) { if (c->arg(0) == constants().boollit(true)) { env.fail(); } else if (c->arg(0) == constants().boollit(false)) { // nothing to do, not false = true } else if (c->arg(0)->isa()) { VarDecl* vd = c->arg(0)->cast()->decl(); if (vd->ti()->domain() == nullptr) { vd->ti()->domain(constants().boollit(false)); } else if (vd->ti()->domain() == constants().boollit(true)) { env.fail(); } } else { // don't know how to handle, use bool_not/2 nc = new Call(c->loc().introduce(), c->id(), {c->arg(0), constants().boollit(true)}); nc->type(Type::varbool()); nc->decl(env.model->matchFn(env, nc, false)); } if (nc == nullptr) { env.flatRemoveItem(ci); } } else { FunctionI* decl = env.model->matchFn(env, c, false); if ((decl != nullptr) && (decl->e() != nullptr)) { nc = c; nc->decl(decl); } } if (nc != nullptr) { if (nc != c) { for (ExpressionSetIter it = c->ann().begin(); it != c->ann().end(); ++it) { EE ee_ann = flat_exp(env, Ctx(), *it, nullptr, constants().varTrue); nc->addAnnotation(ee_ann.r()); } } StringLit* sl = get_longest_mzn_path_annotation(env, c); CallStackItem* csi = nullptr; if (sl != nullptr) { csi = new CallStackItem(env, sl); } ItemTimer item_timer(nc->loc(), timingMap); (void)flat_exp(env, Ctx(), nc, constants().varTrue, constants().varTrue); env.flatRemoveItem(ci); delete csi; } } } } startItem = endItem + 1; endItem = static_cast(m.size()) - 1; } // Add redefinitions for output variables that may have been redefined since create_output for (unsigned int i = 0; i < env.output->size(); i++) { if (auto* vdi = (*env.output)[i]->dynamicCast()) { IdMap::iterator it; if (vdi->e()->e() == nullptr && (it = env.reverseMappers.find(vdi->e()->id())) != env.reverseMappers.end()) { GCLock lock; Call* rhs = copy(env, env.cmap, it->second())->cast(); check_output_par_fn(env, rhs); output_vardecls(env, vdi, rhs); remove_is_output(vdi->e()->flat()); vdi->e()->e(rhs); } } } if (!opt.keepOutputInFzn) { finalise_output(env); } for (auto& i : m) { if (auto* ci = i->dynamicCast()) { if (Call* c = ci->e()->dynamicCast()) { if (c->decl() == constants().varRedef) { env.flatRemoveItem(ci); } } } } cleanup_output(env); } catch (ModelInconsistent&) { } if (opt.detailedTiming) { e.envi().outstream << "% Compilation profile (file,line,milliseconds)\n"; if (opt.collectMznPaths) { e.envi().outstream << "% (time is allocated to toplevel item)\n"; } else { e.envi().outstream << "% (locations are approximate, use --keep-paths to allocate times to " "toplevel items)\n"; } for (auto& entry : *timingMap) { std::chrono::milliseconds time_taken = std::chrono::duration_cast(entry.second); if (time_taken > std::chrono::milliseconds(0)) { e.envi().outstream << "%%%mzn-stat: profiling=[\"" << entry.first.first << "\"," << entry.first.second << "," << time_taken.count() << "]\n"; } } e.envi().outstream << "%%%mzn-stat-end\n"; } } void clear_internal_annotations(Expression* e, bool keepDefinesVar) { e->ann().remove(constants().ann.promise_total); e->ann().remove(constants().ann.maybe_partial); e->ann().remove(constants().ann.add_to_output); e->ann().remove(constants().ann.rhs_from_assignment); e->ann().remove(constants().ann.mzn_was_undefined); // Remove defines_var(x) annotation where x is par std::vector removeAnns; for (ExpressionSetIter anns = e->ann().begin(); anns != e->ann().end(); ++anns) { if (Call* c = (*anns)->dynamicCast()) { if (c->id() == constants().ann.defines_var && (!keepDefinesVar || c->arg(0)->type().isPar())) { removeAnns.push_back(c); } } } for (auto& removeAnn : removeAnns) { e->ann().remove(removeAnn); } } std::vector cleanup_vardecl(EnvI& env, VarDeclI* vdi, VarDecl* vd, bool keepDefinesVar) { std::vector added_constraints; // In FlatZinc par variables have RHSs, not domains if (vd->type().isPar()) { vd->ann().clear(); vd->introduced(false); vd->ti()->domain(nullptr); } // In FlatZinc the RHS of a VarDecl must be a literal, Id or empty // Example: // var 1..5: x = function(y) // becomes: // var 1..5: x; // relation(x, y); if (vd->type().isvar() && vd->type().isbool()) { bool is_fixed = (vd->ti()->domain() != nullptr); if (Expression::equal(vd->ti()->domain(), constants().literalTrue)) { // Ex: var true: b = e() // Store RHS Expression* ve = vd->e(); vd->e(constants().literalTrue); vd->ti()->domain(nullptr); // Ex: var bool: b = true // If vd had a RHS if (ve != nullptr) { if (Call* vcc = ve->dynamicCast()) { // Convert functions to relations: // exists([x]) => array_bool_or([x],true) // forall([x]) => array_bool_and([x],true) // clause([x]) => bool_clause([x]) ASTString cid; std::vector args; if (vcc->id() == constants().ids.exists) { cid = constants().ids.array_bool_or; args.push_back(vcc->arg(0)); args.push_back(constants().literalTrue); } else if (vcc->id() == constants().ids.forall) { cid = constants().ids.array_bool_and; args.push_back(vcc->arg(0)); args.push_back(constants().literalTrue); } else if (vcc->id() == constants().ids.clause) { cid = constants().ids.bool_clause; args.push_back(vcc->arg(0)); args.push_back(vcc->arg(1)); } if (args.empty()) { // Post original RHS as stand alone constraint ve = vcc; } else { // Create new call, retain annotations from original RHS Call* nc = new Call(vcc->loc().introduce(), cid, args); nc->type(vcc->type()); nc->ann().merge(vcc->ann()); ve = nc; } } else if (Id* id = ve->dynamicCast()) { if (id->decl()->ti()->domain() != constants().literalTrue) { // Inconsistent assignment: post bool_eq(y, true) std::vector args(2); args[0] = id; args[1] = constants().literalTrue; GCLock lock; ve = new Call(Location().introduce(), constants().ids.bool_eq, args); } else { // Don't post this ve = constants().literalTrue; } } // Post new constraint if (ve != constants().literalTrue) { clear_internal_annotations(ve, keepDefinesVar); added_constraints.push_back(ve); } } } else { // Ex: var false: b = e() if (vd->e() != nullptr) { if (vd->e()->eid() == Expression::E_CALL) { // Convert functions to relations: // var false: b = exists([x]) => array_bool_or([x], b) // var false: b = forall([x]) => array_bool_and([x], b) // var false: b = clause([x]) => bool_clause_reif([x], b) const Call* c = vd->e()->cast(); GCLock lock; vd->e(nullptr); ASTString cid; std::vector args(c->argCount()); for (unsigned int i = args.size(); (i--) != 0U;) { args[i] = c->arg(i); } if (is_fixed) { args.push_back(constants().literalFalse); } else { args.push_back(vd->id()); } if (c->id() == constants().ids.exists) { cid = constants().ids.array_bool_or; } else if (c->id() == constants().ids.forall) { cid = constants().ids.array_bool_and; } else if (c->id() == constants().ids.clause) { cid = constants().ids.bool_clause_reif; } else { if (env.fopts.enableHalfReification && vd->ann().contains(constants().ctx.pos)) { cid = env.halfReifyId(c->id()); if (env.model->matchFn(env, cid, args, false) == nullptr) { cid = env.reifyId(c->id()); } } else { cid = env.reifyId(c->id()); } } Call* nc = new Call(c->loc().introduce(), cid, args); nc->type(c->type()); FunctionI* decl = env.model->matchFn(env, nc, false); if (decl == nullptr) { std::ostringstream ss; ss << "'" << c->id() << "' is used in a reified context but no reified version is available"; throw FlatteningError(env, c->loc(), ss.str()); } nc->decl(decl); if (!is_fixed) { make_defined_var(vd, nc); } nc->ann().merge(c->ann()); clear_internal_annotations(nc, keepDefinesVar); added_constraints.push_back(nc); } else { assert(vd->e()->eid() == Expression::E_ID || vd->e()->eid() == Expression::E_BOOLLIT); } } if (Expression::equal(vd->ti()->domain(), constants().literalFalse)) { vd->ti()->domain(nullptr); vd->e(constants().literalFalse); } } if (vdi != nullptr && is_fixed && env.varOccurrences.occurrences(vd) == 0) { if (is_output(vd)) { VarDecl* vd_output = (*env.output)[env.outputFlatVarOccurrences.find(vd)]->cast()->e(); if (vd_output->e() == nullptr) { vd_output->e(vd->e()); } } env.flatRemoveItem(vdi); } } else if (vd->type().isvar() && vd->type().dim() == 0) { // Int or Float var if (vd->e() != nullptr) { if (const Call* cc = vd->e()->dynamicCast()) { // Remove RHS from vd vd->e(nullptr); std::vector args(cc->argCount()); ASTString cid; if (cc->id() == constants().ids.lin_exp) { // a = lin_exp([1],[b],5) => int_lin_eq([1,-1],[b,a],-5):: defines_var(a) auto* le_c = follow_id(cc->arg(0))->cast(); std::vector nc(le_c->size()); for (auto i = static_cast(nc.size()); (i--) != 0U;) { nc[i] = (*le_c)[i]; } if (le_c->type().bt() == Type::BT_INT) { cid = constants().ids.int_.lin_eq; nc.push_back(IntLit::a(-1)); args[0] = new ArrayLit(Location().introduce(), nc); args[0]->type(Type::parint(1)); auto* le_x = follow_id(cc->arg(1))->cast(); std::vector nx(le_x->size()); for (auto i = static_cast(nx.size()); (i--) != 0U;) { nx[i] = (*le_x)[i]; } nx.push_back(vd->id()); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(le_x->type()); IntVal d = cc->arg(2)->cast()->v(); args[2] = IntLit::a(-d); } else { // float cid = constants().ids.float_.lin_eq; nc.push_back(FloatLit::a(-1.0)); args[0] = new ArrayLit(Location().introduce(), nc); args[0]->type(Type::parfloat(1)); auto* le_x = follow_id(cc->arg(1))->cast(); std::vector nx(le_x->size()); for (auto i = static_cast(nx.size()); (i--) != 0U;) { nx[i] = (*le_x)[i]; } nx.push_back(vd->id()); args[1] = new ArrayLit(Location().introduce(), nx); args[1]->type(le_x->type()); FloatVal d = cc->arg(2)->cast()->v(); args[2] = FloatLit::a(-d); } } else { if (cc->id() == "card") { // card is 'set_card' in old FlatZinc cid = constants().ids.set_card; } else { cid = cc->id(); } for (auto i = static_cast(args.size()); (i--) != 0U;) { args[i] = cc->arg(i); } args.push_back(vd->id()); } Call* nc = new Call(cc->loc().introduce(), cid, args); nc->type(cc->type()); make_defined_var(vd, nc); nc->ann().merge(cc->ann()); clear_internal_annotations(nc, keepDefinesVar); added_constraints.push_back(nc); } else { // RHS must be literal or Id assert(vd->e()->eid() == Expression::E_ID || vd->e()->eid() == Expression::E_INTLIT || vd->e()->eid() == Expression::E_FLOATLIT || vd->e()->eid() == Expression::E_BOOLLIT || vd->e()->eid() == Expression::E_SETLIT); } } } else if (vd->type().dim() > 0) { // vd is an array // If RHS is an Id, follow id to RHS // a = [1,2,3]; b = a; // vd = b => vd = [1,2,3] if (!vd->e()->isa()) { vd->e(follow_id(vd->e())); } // If empty array or 1 indexed, continue if (vd->ti()->ranges().size() == 1 && vd->ti()->ranges()[0]->domain() != nullptr && vd->ti()->ranges()[0]->domain()->isa()) { IntSetVal* isv = vd->ti()->ranges()[0]->domain()->cast()->isv(); if ((isv != nullptr) && (isv->size() == 0 || isv->min(0) == 1)) { return added_constraints; } } // Array should be 1 indexed since ArrayLit is 1 indexed assert(vd->e() != nullptr); ArrayLit* al = nullptr; Expression* e = vd->e(); while (al == nullptr) { switch (e->eid()) { case Expression::E_ARRAYLIT: al = e->cast(); break; case Expression::E_ID: e = e->cast()->decl()->e(); break; default: assert(false); } } al->make1d(); IntSetVal* isv = IntSetVal::a(1, al->length()); if (vd->ti()->ranges().size() == 1) { vd->ti()->ranges()[0]->domain(new SetLit(Location().introduce(), isv)); } else { std::vector r(1); r[0] = new TypeInst(vd->ti()->ranges()[0]->loc(), vd->ti()->ranges()[0]->type(), new SetLit(Location().introduce(), isv)); ASTExprVec ranges(r); auto* ti = new TypeInst(vd->ti()->loc(), vd->ti()->type(), ranges, vd->ti()->domain()); vd->ti(ti); } } // Remove boolean context annotations used only on compilation vd->ann().remove(constants().ctx.mix); vd->ann().remove(constants().ctx.pos); vd->ann().remove(constants().ctx.neg); vd->ann().remove(constants().ctx.root); vd->ann().remove(constants().ann.promise_total); vd->ann().remove(constants().ann.add_to_output); vd->ann().remove(constants().ann.mzn_check_var); vd->ann().remove(constants().ann.rhs_from_assignment); vd->ann().remove(constants().ann.mzn_was_undefined); vd->ann().removeCall(constants().ann.mzn_check_enum_var); return added_constraints; } Expression* cleanup_constraint(EnvI& env, std::unordered_set& globals, Expression* ce, bool keepDefinesVar) { clear_internal_annotations(ce, keepDefinesVar); if (Call* vc = ce->dynamicCast()) { for (unsigned int i = 0; i < vc->argCount(); i++) { // Change array indicies to be 1 indexed if (auto* al = vc->arg(i)->dynamicCast()) { if (al->dims() > 1 || al->min(0) != 1) { al->make1d(); } } } // Convert functions to relations: // exists([x]) => array_bool_or([x],true) // forall([x]) => array_bool_and([x],true) // clause([x]) => bool_clause([x]) // bool_xor([x],[y]) => bool_xor([x],[y],true) if (vc->id() == constants().ids.exists) { GCLock lock; vc->id(constants().ids.array_bool_or); std::vector args(2); args[0] = vc->arg(0); args[1] = constants().literalTrue; ASTExprVec argsv(args); vc->args(argsv); vc->decl(env.model->matchFn(env, vc, false)); } else if (vc->id() == constants().ids.forall) { GCLock lock; vc->id(constants().ids.array_bool_and); std::vector args(2); args[0] = vc->arg(0); args[1] = constants().literalTrue; ASTExprVec argsv(args); vc->args(argsv); vc->decl(env.model->matchFn(env, vc, false)); } else if (vc->id() == constants().ids.clause) { GCLock lock; vc->id(constants().ids.bool_clause); vc->decl(env.model->matchFn(env, vc, false)); } else if (vc->id() == constants().ids.bool_xor && vc->argCount() == 2) { GCLock lock; std::vector args(3); args[0] = vc->arg(0); args[1] = vc->arg(1); args[2] = constants().literalTrue; ASTExprVec argsv(args); vc->args(argsv); vc->decl(env.model->matchFn(env, vc, false)); } // If vc->decl() is a solver builtin and has not been added to the // FlatZinc, add it if ((vc->decl() != nullptr) && vc->decl() != constants().varRedef && !vc->decl()->fromStdLib() && globals.find(vc->decl()) == globals.end()) { std::vector params(vc->decl()->params().size()); for (unsigned int i = 0; i < params.size(); i++) { params[i] = vc->decl()->params()[i]; } GCLock lock; auto* vc_decl_copy = new FunctionI(vc->decl()->loc(), vc->decl()->id(), vc->decl()->ti(), params, vc->decl()->e()); env.flatAddItem(vc_decl_copy); globals.insert(vc->decl()); } return ce; } if (Id* id = ce->dynamicCast()) { // Ex: constraint b; => constraint bool_eq(b, true); std::vector args(2); args[0] = id; args[1] = constants().literalTrue; GCLock lock; return new Call(Location().introduce(), constants().ids.bool_eq, args); } if (auto* bl = ce->dynamicCast()) { // Ex: true => delete; false => bool_eq(false, true); if (!bl->v()) { GCLock lock; std::vector args(2); args[0] = constants().literalFalse; args[1] = constants().literalTrue; Call* neq = new Call(Location().introduce(), constants().ids.bool_eq, args); return neq; } return nullptr; } return ce; } void oldflatzinc(Env& e) { Model* m = e.flat(); // Check wheter we need to keep defines_var annotations bool keepDefinesVar = true; { GCLock lock; Call* c = new Call(Location().introduce(), "mzn_check_annotate_defines_var", {}); c->type(Type::parbool()); FunctionI* fi = e.model()->matchFn(e.envi(), c, true); if (fi != nullptr) { c->decl(fi); keepDefinesVar = eval_bool(e.envi(), c); } } // Mark annotations and optional variables for removal, and clear flags for (auto& vdi : m->vardecls()) { if (vdi.e()->type().ot() == Type::OT_OPTIONAL || vdi.e()->type().bt() == Type::BT_ANN) { vdi.remove(); } } EnvI& env = e.envi(); unsigned int msize = m->size(); // Predicate declarations of solver builtins std::unordered_set globals; // Variables mapped to the index of the constraint that defines them enum DFS_STATUS { DFS_UNKNOWN, DFS_SEEN, DFS_DONE }; std::unordered_map> definition_map; // Record indices of VarDeclIs with Id RHS for sorting & unification std::vector declsWithIds; for (int i = 0; i < msize; i++) { if ((*m)[i]->removed()) { continue; } if (auto* vdi = (*m)[i]->dynamicCast()) { GCLock lock; VarDecl* vd = vdi->e(); std::vector added_constraints = cleanup_vardecl(e.envi(), vdi, vd, keepDefinesVar); // Record whether this VarDecl is equal to an Id (aliasing) if ((vd->e() != nullptr) && vd->e()->isa()) { declsWithIds.push_back(i); vdi->e()->payload(-static_cast(i) - 1); } else { vdi->e()->payload(i); } for (auto* nc : added_constraints) { Expression* new_ce = cleanup_constraint(e.envi(), globals, nc, keepDefinesVar); if (new_ce != nullptr) { e.envi().flatAddItem(new ConstraintI(Location().introduce(), new_ce)); } } } else if (auto* ci = (*m)[i]->dynamicCast()) { Expression* new_ce = cleanup_constraint(e.envi(), globals, ci->e(), keepDefinesVar); if (new_ce != nullptr) { ci->e(new_ce); if (keepDefinesVar) { if (Call* defines_var = new_ce->ann().getCall(constants().ann.defines_var)) { if (Id* ident = defines_var->arg(0)->dynamicCast()) { if (definition_map.find(ident->decl()) != definition_map.end()) { // This is the second definition, remove it new_ce->ann().removeCall(constants().ann.defines_var); } else { definition_map.insert({ident->decl(), {i, DFS_UNKNOWN}}); } } } } } else { ci->remove(); } } else if (auto* fi = (*m)[i]->dynamicCast()) { if (Let* let = Expression::dynamicCast(fi->e())) { GCLock lock; std::vector new_let; for (unsigned int i = 0; i < let->let().size(); i++) { Expression* let_e = let->let()[i]; if (auto* vd = let_e->dynamicCast()) { std::vector added_constraints = cleanup_vardecl(e.envi(), nullptr, vd, keepDefinesVar); new_let.push_back(vd); for (auto* nc : added_constraints) { new_let.push_back(nc); } } else { Expression* new_ce = cleanup_constraint(e.envi(), globals, let_e, keepDefinesVar); if (new_ce != nullptr) { new_let.push_back(new_ce); } } } fi->e(new Let(let->loc(), new_let, let->in())); } } else if (auto* si = (*m)[i]->dynamicCast()) { if ((si->e() != nullptr) && si->e()->type().isPar()) { // Introduce VarDecl if objective expression is par GCLock lock; auto* ti = new TypeInst(Location().introduce(), si->e()->type(), nullptr); auto* constantobj = new VarDecl(Location().introduce(), ti, e.envi().genId(), si->e()); si->e(constantobj->id()); e.envi().flatAddItem(new VarDeclI(Location().introduce(), constantobj)); } } } if (keepDefinesVar) { // Detect and break cycles in defines_var annotations std::vector definesStack; auto checkId = [&definesStack, &definition_map, &m](VarDecl* cur, Id* ident) { if (cur == ident->decl()) { // Never push the variable we're currently looking at return; } auto it = definition_map.find(ident->decl()); if (it != definition_map.end()) { if (it->second.second == 0) { // not yet visited, push definesStack.push_back(it->first); } else if (it->second.second == 1) { // Found a cycle through variable ident // Break cycle by removing annotations ident->decl()->ann().remove(constants().ann.is_defined_var); Call* c = (*m)[it->second.first]->cast()->e()->cast(); c->ann().removeCall(constants().ann.defines_var); } } }; for (auto& it : definition_map) { if (it.second.second == 0) { // not yet visited definesStack.push_back(it.first); while (!definesStack.empty()) { VarDecl* cur = definesStack.back(); if (definition_map[cur].second != DFS_UNKNOWN) { // already visited (or already finished), now finished definition_map[cur].second = DFS_DONE; definesStack.pop_back(); } else { // now visited and on stack definition_map[cur].second = DFS_SEEN; if (Call* c = (*m)[definition_map[cur].first] ->cast() ->e() ->dynamicCast()) { // Variable is defined by a call, push all arguments for (unsigned int i = 0; i < c->argCount(); i++) { if (c->arg(i)->type().isPar()) { continue; } if (Id* ident = c->arg(i)->dynamicCast()) { if (ident->type().dim() > 0) { if (auto* al = Expression::dynamicCast(ident->decl()->e())) { for (auto* e : al->getVec()) { if (auto* ident = e->dynamicCast()) { checkId(cur, ident); } } } } else if (ident->type().isvar()) { checkId(cur, ident); } } else if (auto* al = c->arg(i)->dynamicCast()) { for (auto* e : al->getVec()) { if (auto* ident = e->dynamicCast()) { checkId(cur, ident); } } } } } } } } } } // Sort VarDecls in FlatZinc so that VarDecls are declared before use std::vector sortedVarDecls(declsWithIds.size()); int vdCount = 0; for (int declsWithId : declsWithIds) { VarDecl* cur = (*m)[declsWithId]->cast()->e(); std::vector stack; while ((cur != nullptr) && cur->payload() < 0) { stack.push_back(cur->payload()); if (Id* id = cur->e()->dynamicCast()) { cur = id->decl(); } else { cur = nullptr; } } for (auto i = static_cast(stack.size()); (i--) != 0U;) { auto* vdi = (*m)[-stack[i] - 1]->cast(); vdi->e()->payload(-vdi->e()->payload() - 1); sortedVarDecls[vdCount++] = vdi; } } for (unsigned int i = 0; i < declsWithIds.size(); i++) { (*m)[declsWithIds[i]] = sortedVarDecls[i]; } // Remove marked items m->compact(); e.envi().output->compact(); for (auto& it : env.varOccurrences.itemMap) { std::vector toRemove; for (auto* iit : it.second) { if (iit->removed()) { toRemove.push_back(iit); } } for (auto& i : toRemove) { it.second.erase(i); } } class Cmp { public: bool operator()(Item* i, Item* j) { if (i->iid() == Item::II_FUN || j->iid() == Item::II_FUN) { if (i->iid() == j->iid()) { return false; } return i->iid() == Item::II_FUN; } if (i->iid() == Item::II_SOL) { assert(j->iid() != i->iid()); return false; } if (j->iid() == Item::II_SOL) { assert(j->iid() != i->iid()); return true; } if (i->iid() == Item::II_VD) { if (j->iid() != i->iid()) { return true; } if (i->cast()->e()->type().isPar() && j->cast()->e()->type().isvar()) { return true; } if (j->cast()->e()->type().isPar() && i->cast()->e()->type().isvar()) { return false; } if (i->cast()->e()->type().dim() == 0 && j->cast()->e()->type().dim() != 0) { return true; } if (i->cast()->e()->type().dim() != 0 && j->cast()->e()->type().dim() == 0) { return false; } if (i->cast()->e()->e() == nullptr && j->cast()->e()->e() != nullptr) { return true; } if ((i->cast()->e()->e() != nullptr) && (j->cast()->e()->e() != nullptr) && !i->cast()->e()->e()->isa() && j->cast()->e()->e()->isa()) { return true; } } return false; } } _cmp; // Perform final sorting std::stable_sort(m->begin(), m->end(), _cmp); } FlatModelStatistics statistics(Env& m) { Model* flat = m.flat(); FlatModelStatistics stats; stats.n_reif_ct = m.envi().counters.reifConstraints; stats.n_imp_ct = m.envi().counters.impConstraints; stats.n_imp_del = m.envi().counters.impDel; stats.n_lin_del = m.envi().counters.linDel; for (auto& i : *flat) { if (!i->removed()) { if (auto* vdi = i->dynamicCast()) { Type t = vdi->e()->type(); if (t.isvar() && t.dim() == 0) { if (t.isSet()) { stats.n_set_vars++; } else if (t.isint()) { stats.n_int_vars++; } else if (t.isbool()) { stats.n_bool_vars++; } else if (t.isfloat()) { stats.n_float_vars++; } } } else if (auto* ci = i->dynamicCast()) { if (Call* call = ci->e()->dynamicCast()) { if (call->id().endsWith("_reif")) { stats.n_reif_ct++; } else if (call->id().endsWith("_imp")) { stats.n_imp_ct++; } if (call->argCount() > 0) { Type all_t; for (unsigned int i = 0; i < call->argCount(); i++) { Type t = call->arg(i)->type(); if (t.isvar()) { if (t.st() == Type::ST_SET || (t.bt() == Type::BT_FLOAT && all_t.st() != Type::ST_SET) || (t.bt() == Type::BT_INT && all_t.bt() != Type::BT_FLOAT && all_t.st() != Type::ST_SET) || (t.bt() == Type::BT_BOOL && all_t.bt() != Type::BT_INT && all_t.bt() != Type::BT_FLOAT && all_t.st() != Type::ST_SET)) { all_t = t; } } } if (all_t.isvar()) { if (all_t.st() == Type::ST_SET) { stats.n_set_ct++; } else if (all_t.bt() == Type::BT_INT) { stats.n_int_ct++; } else if (all_t.bt() == Type::BT_BOOL) { stats.n_bool_ct++; } else if (all_t.bt() == Type::BT_FLOAT) { stats.n_float_ct++; } } } } } } } return stats; } } // namespace MiniZinc libminizinc-2.5.3/lib/pathfileprinter.cpp0000644000175000017500000001272713757304533017163 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include namespace MiniZinc { using std::string; using std::vector; PathFilePrinter::PathFilePrinter(std::ostream& o, EnvI& /*env*/) : _os(o), _constraintIndex(0) {} void PathFilePrinter::addBetterName(Id* id, const string& name, const string& path, bool overwrite = false) { string oname; string opath; auto it = _betternames.find(id); if (it != _betternames.end()) { oname = it->second.first; opath = it->second.second; } if (!name.empty() && (overwrite || oname.empty())) { oname = name; } if (!path.empty() && (overwrite || opath.empty())) { opath = path; } _betternames[id] = NamePair(oname, opath); } string path2name(const string& path) { std::stringstream name; size_t idpos = path.rfind("id:"); if (idpos != string::npos) { idpos += 3; size_t semi = path.find(';', idpos); if (semi != string::npos) { // Variable name name << path.substr(idpos, semi - idpos); // Check for array int dim = 0; size_t ilpos = semi - idpos; do { ilpos = path.find("il:", ilpos); if (ilpos != string::npos) { ilpos += 3; semi = path.find(';', ilpos); if (semi != string::npos) { if (dim == 0) { name << "["; } else { name << ","; } name << path.substr(ilpos, semi - ilpos); dim++; } } } while (ilpos != string::npos); if (dim > 0) { name << "?]"; } // Check for anon if (path.find(":anon") != string::npos || path.find('=') != string::npos) { name.str(""); name.clear(); } } } return name.str(); } void PathFilePrinter::print(Model* m) { // Build map for (VarDeclIterator vdit = m->vardecls().begin(); vdit != m->vardecls().end(); ++vdit) { VarDecl* e = vdit->e(); for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { if (Call* ca = (*it)->dynamicCast()) { ASTString cid = ca->id(); if (cid == constants().ann.output_array) { if (auto* rhs = e->e()->dynamicCast()) { for (unsigned int ind = 0; ind < rhs->size(); ind++) { if (Id* id = (*rhs)[ind]->dynamicCast()) { std::stringstream bettername; bettername << *e->id() << "["; // Array of sets ArrayLit& dimsets = *ca->arg(0)->cast(); vector dims(dimsets.size(), 1); for (unsigned int i = 0; i < dimsets.size(); i++) { auto* sl = dimsets[i]->cast(); dims[i] = sl->isv()->card(); } vector dimspan(dims.size(), 1); for (unsigned int i = 0; i < dims.size(); i++) { for (unsigned int j = i + 1; j < dims.size(); j++) { dimspan[i] *= dims[j]; } } IntVal curind = ind; for (unsigned int i = 0; i < dims.size() - 1; i++) { IntVal thisind = curind / dimspan[i]; curind -= thisind * dimspan[i]; bettername << dimsets[i]->cast()->isv()->min() + thisind << ","; } bettername << dimsets[dimsets.size() - 1]->cast()->isv()->min() + curind << "]"; addBetterName(id, bettername.str(), "", true); } } } } else if (ca->id() == constants().ann.mzn_path) { auto* sl = ca->arg(0)->cast(); addBetterName(e->id(), path2name(string(sl->v().c_str(), sl->v().size())), string(sl->v().c_str())); } } } } // Print values for (Item* item : *m) { print(item); } } void PathFilePrinter::print(Item* item) { if (auto* vdi = item->dynamicCast()) { Id* id = vdi->e()->id(); NamePair np = _betternames[id]; if (!np.first.empty() || !np.second.empty()) { // FlatZinc name _os << *id << "\t"; // Nice name if (np.first.empty()) { _os << *id << "\t"; } else { string name = np.first; _os << name; if (name.find('?') != string::npos) { _os << "(" << *id << ")"; } _os << "\t"; } // Path _os << np.second << std::endl; } } else if (auto* ci = item->dynamicCast()) { StringLit* sl = nullptr; Expression* e = ci->e(); for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { if (Call* ca = (*it)->dynamicCast()) { ASTString cid = ca->id(); if (cid == constants().ann.mzn_path) { sl = ca->arg(0)->cast(); } } } _os << _constraintIndex << "\t"; _os << _constraintIndex << "\t"; if (sl != nullptr) { _os << sl->v(); } else { _os << ""; } _os << std::endl; _constraintIndex++; } } } // namespace MiniZinc libminizinc-2.5.3/lib/cencode.c0000644000175000017500000000542413757304533015017 0ustar kaolkaol/* cencoder.c - c source to a base64 encoding algorithm implementation This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #include const int CHARS_PER_LINE = 72; void base64_init_encodestate(base64_encodestate* state_in) { state_in->step = step_A; state_in->result = 0; state_in->stepcount = 0; } char base64_encode_value(char value_in) { static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; if (value_in > 63) return '='; return encoding[(int)value_in]; } int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) { const char* plainchar = plaintext_in; const char* const plaintextend = plaintext_in + length_in; char* codechar = code_out; char result; char fragment; result = state_in->result; switch (state_in->step) { while (1) { case step_A: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_A; return codechar - code_out; } fragment = *plainchar++; result = (fragment & 0x0fc) >> 2; *codechar++ = base64_encode_value(result); result = (fragment & 0x003) << 4; case step_B: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_B; return codechar - code_out; } fragment = *plainchar++; result |= (fragment & 0x0f0) >> 4; *codechar++ = base64_encode_value(result); result = (fragment & 0x00f) << 2; case step_C: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_C; return codechar - code_out; } fragment = *plainchar++; result |= (fragment & 0x0c0) >> 6; *codechar++ = base64_encode_value(result); result = (fragment & 0x03f) >> 0; *codechar++ = base64_encode_value(result); ++(state_in->stepcount); if (state_in->stepcount == CHARS_PER_LINE / 4) { *codechar++ = '\n'; state_in->stepcount = 0; } } } /* control should not reach here */ return codechar - code_out; } int base64_encode_blockend(char* code_out, base64_encodestate* state_in) { char* codechar = code_out; switch (state_in->step) { case step_B: *codechar++ = base64_encode_value(state_in->result); *codechar++ = '='; *codechar++ = '='; break; case step_C: *codechar++ = base64_encode_value(state_in->result); *codechar++ = '='; break; case step_A: break; } *codechar++ = '\n'; return codechar - code_out; } libminizinc-2.5.3/lib/optimize.cpp0000644000175000017500000021157013757304533015620 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { void VarOccurrences::addIndex(VarDeclI* i, int idx_i) { idx.insert(i->e()->id(), idx_i); } void VarOccurrences::addIndex(VarDecl* e, int idx_i) { assert(find(e) == -1); idx.insert(e->id(), idx_i); } int VarOccurrences::find(VarDecl* vd) { auto it = idx.find(vd->id()); return it == idx.end() ? -1 : it->second; } void VarOccurrences::remove(VarDecl* vd) { idx.remove(vd->id()); } void VarOccurrences::add(VarDecl* v, Item* i) { auto vi = itemMap.find(v->id()->decl()->id()); if (vi == itemMap.end()) { Items items; items.insert(i); itemMap.insert(v->id()->decl()->id(), items); } else { vi->second.insert(i); } } int VarOccurrences::remove(VarDecl* v, Item* i) { auto vi = itemMap.find(v->id()->decl()->id()); assert(vi != itemMap.end()); vi->second.erase(i); return static_cast(vi->second.size()); } void VarOccurrences::removeAllOccurrences(VarDecl* v) { auto vi = itemMap.find(v->id()->decl()->id()); assert(vi != itemMap.end()); vi->second.clear(); } void VarOccurrences::unify(EnvI& env, Model* m, Id* id0_0, Id* id1_0) { Id* id0 = id0_0->decl()->id(); Id* id1 = id1_0->decl()->id(); VarDecl* v0 = id0->decl(); VarDecl* v1 = id1->decl(); if (v0 == v1) { return; } int v0idx = find(v0); assert(v0idx != -1); (*env.flat())[v0idx]->remove(); auto vi0 = itemMap.find(v0->id()); if (vi0 != itemMap.end()) { auto vi1 = itemMap.find(v1->id()); if (vi1 == itemMap.end()) { itemMap.insert(v1->id(), vi0->second); } else { vi1->second.insert(vi0->second.begin(), vi0->second.end()); } itemMap.remove(v0->id()); } remove(v0); id0->redirect(id1); } void VarOccurrences::clear() { itemMap.clear(); idx.clear(); } int VarOccurrences::occurrences(VarDecl* v) { auto vi = itemMap.find(v->id()->decl()->id()); return (vi == itemMap.end() ? 0 : static_cast(vi->second.size())); } std::pair VarOccurrences::usages(VarDecl* v) { bool is_output = v->ann().contains(constants().ann.output_var) || v->ann().containsCall(constants().ann.output_array); auto vi = itemMap.find(v->id()->decl()->id()); if (vi == itemMap.end()) { return std::make_pair(0, is_output); } int count = 0; for (Item* i : vi->second) { auto* vd = i->dynamicCast(); if ((vd != nullptr) && (vd->e() != nullptr) && (vd->e()->e() != nullptr) && (vd->e()->e()->isa() || vd->e()->e()->isa())) { auto u = usages(vd->e()); is_output = is_output || u.second; count += u.first; } else { count++; } } return std::make_pair(count, is_output); } void CollectOccurrencesI::vVarDeclI(VarDeclI* v) { CollectOccurrencesE ce(vo, v); top_down(ce, v->e()); } void CollectOccurrencesI::vConstraintI(ConstraintI* ci) { CollectOccurrencesE ce(vo, ci); top_down(ce, ci->e()); for (ExpressionSetIter it = ci->e()->ann().begin(); it != ci->e()->ann().end(); ++it) { top_down(ce, *it); } } void CollectOccurrencesI::vSolveI(SolveI* si) { CollectOccurrencesE ce(vo, si); top_down(ce, si->e()); for (ExpressionSetIter it = si->ann().begin(); it != si->ann().end(); ++si) { top_down(ce, *it); } } bool is_output(VarDecl* vd) { for (ExpressionSetIter it = vd->ann().begin(); it != vd->ann().end(); ++it) { if (*it != nullptr) { if (*it == constants().ann.output_var) { return true; } if (Call* c = (*it)->dynamicCast()) { if (c->id() == constants().ann.output_array) { return true; } } } } return false; } void unify(EnvI& env, std::vector& deletedVarDecls, Id* id0, Id* id1) { if (id0->decl() != id1->decl()) { if (is_output(id0->decl())) { std::swap(id0, id1); } if (id0->decl()->e() != nullptr && !Expression::equal(id0->decl()->e(), id1->decl()->id())) { Expression* rhs = id0->decl()->e(); auto* vdi1 = (*env.flat())[env.varOccurrences.find(id1->decl())]->cast(); CollectOccurrencesE ce(env.varOccurrences, vdi1); top_down(ce, rhs); id1->decl()->e(rhs); id0->decl()->e(nullptr); auto* vdi0 = (*env.flat())[env.varOccurrences.find(id0->decl())]->cast(); CollectDecls cd(env.varOccurrences, deletedVarDecls, vdi0); top_down(cd, rhs); } if (Expression::equal(id1->decl()->e(), id0->decl()->id())) { auto* vdi1 = (*env.flat())[env.varOccurrences.find(id1->decl())]->cast(); CollectDecls cd(env.varOccurrences, deletedVarDecls, vdi1); Expression* rhs = id1->decl()->e(); top_down(cd, rhs); id1->decl()->e(nullptr); } // Compute intersection of domains if (id0->decl()->ti()->domain() != nullptr) { if (id1->decl()->ti()->domain() != nullptr) { if (id0->type().isint() || id0->type().isIntSet()) { IntSetVal* isv0 = eval_intset(env, id0->decl()->ti()->domain()); IntSetVal* isv1 = eval_intset(env, id1->decl()->ti()->domain()); IntSetRanges isv0r(isv0); IntSetRanges isv1r(isv1); Ranges::Inter inter(isv0r, isv1r); IntSetVal* nd = IntSetVal::ai(inter); if (nd->size() == 0) { env.fail(); } else if (nd->card() != isv1->card()) { id1->decl()->ti()->domain(new SetLit(Location(), nd)); if (nd->card() == isv0->card()) { id1->decl()->ti()->setComputedDomain(id0->decl()->ti()->computedDomain()); } else { id1->decl()->ti()->setComputedDomain(false); } } } else if (id0->type().isbool()) { if (eval_bool(env, id0->decl()->ti()->domain()) != eval_bool(env, id1->decl()->ti()->domain())) { env.fail(); } } else { // float FloatSetVal* isv0 = eval_floatset(env, id0->decl()->ti()->domain()); FloatSetVal* isv1 = eval_floatset(env, id1->decl()->ti()->domain()); FloatSetRanges isv0r(isv0); FloatSetRanges isv1r(isv1); Ranges::Inter inter(isv0r, isv1r); FloatSetVal* nd = FloatSetVal::ai(inter); FloatSetRanges nd_r(nd); FloatSetRanges isv1r_2(isv1); if (nd->size() == 0) { env.fail(); } else if (!Ranges::equal(nd_r, isv1r_2)) { id1->decl()->ti()->domain(new SetLit(Location(), nd)); FloatSetRanges nd_r_2(nd); FloatSetRanges isv0r_2(isv0); if (Ranges::equal(nd_r_2, isv0r_2)) { id1->decl()->ti()->setComputedDomain(id0->decl()->ti()->computedDomain()); } else { id1->decl()->ti()->setComputedDomain(false); } } } } else { id1->decl()->ti()->domain(id0->decl()->ti()->domain()); } } // If both variables are output variables, unify them in the output model if (is_output(id0->decl())) { assert(env.outputFlatVarOccurrences.find(id0->decl()) != -1); VarDecl* id0_output = (*env.output)[env.outputFlatVarOccurrences.find(id0->decl())]->cast()->e(); assert(env.outputFlatVarOccurrences.find(id1->decl()) != -1); VarDecl* id1_output = (*env.output)[env.outputFlatVarOccurrences.find(id1->decl())]->cast()->e(); if (id0_output->e() == nullptr) { id0_output->e(id1_output->id()); } } env.varOccurrences.unify(env, env.flat(), id0, id1); } } void substitute_fixed_vars(EnvI& env, Item* ii, std::vector& deletedVarDecls); void simplify_bool_constraint(EnvI& env, Item* ii, VarDecl* vd, bool& remove, std::deque& vardeclQueue, std::deque& constraintQueue, std::vector& toRemove, std::vector& deletedVarDecls, std::unordered_map& nonFixedLiteralCount); bool simplify_constraint(EnvI& env, Item* ii, std::vector& deletedVarDecls, std::deque& constraintQueue, std::deque& vardeclQueue); void push_vardecl(EnvI& env, VarDeclI* vdi, unsigned int vd_idx, std::deque& q) { if (!vdi->removed() && !vdi->flag()) { vdi->flag(true); q.push_back(vd_idx); } } void push_vardecl(EnvI& env, unsigned int vd_idx, std::deque& q) { push_vardecl(env, (*env.flat())[vd_idx]->cast(), vd_idx, q); } void push_dependent_constraints(EnvI& env, Id* id, std::deque& q) { auto it = env.varOccurrences.itemMap.find(id->decl()->id()); if (it != env.varOccurrences.itemMap.end()) { for (auto* item : it->second) { if (auto* ci = item->dynamicCast()) { if (!ci->removed() && !ci->flag()) { ci->flag(true); q.push_back(ci); } } else if (auto* vdi = item->dynamicCast()) { if (vdi->e()->id()->decl() != vdi->e()) { vdi = (*env.flat())[env.varOccurrences.find(vdi->e()->id()->decl())]->cast(); } if (!vdi->removed() && !vdi->flag() && (vdi->e()->e() != nullptr)) { vdi->flag(true); q.push_back(vdi); } } } } } void optimize(Env& env, bool chain_compression) { if (env.envi().failed()) { return; } try { EnvI& envi = env.envi(); Model& m = *envi.flat(); std::vector toAssignBoolVars; std::vector toRemoveConstraints; std::vector deletedVarDecls; // Queue of constraint and variable items that still need to be optimised std::deque constraintQueue; // Queue of variable declarations (indexes into the model) that still need to be optimised std::deque vardeclQueue; std::vector boolConstraints; GCLock lock; // Phase 0: clean up // - clear flags for all constraint and variable declaration items // (flags are used to indicate whether an item is already queued or not) for (auto& i : m) { if (!i->removed()) { if (auto* ci = i->dynamicCast()) { ci->flag(false); } else if (auto* vdi = i->dynamicCast()) { vdi->flag(false); } } } // Phase 1: initialise queues // - remove equality constraints between identifiers // - remove toplevel forall constraints // - collect exists, clauses and reified foralls in boolConstraints // - remove "constraint x" where x is a bool var // - unify variables that are assigned to an identifier // - push bool vars that are fixed and have a RHS (to propagate the RHS constraint) // - push int vars that are fixed (either have a RHS or a singleton domain) for (unsigned int i = 0; i < m.size(); i++) { if (m[i]->removed()) { continue; } if (auto* ci = m[i]->dynamicCast()) { ci->flag(false); if (!ci->removed()) { if (Call* c = ci->e()->dynamicCast()) { if ((c->id() == constants().ids.int_.eq || c->id() == constants().ids.bool_eq || c->id() == constants().ids.float_.eq || c->id() == constants().ids.set_eq) && c->arg(0)->isa() && c->arg(1)->isa() && (c->arg(0)->cast()->decl()->e() == nullptr || c->arg(1)->cast()->decl()->e() == nullptr)) { // Equality constraint between two identifiers: unify if (Call* defVar = c->ann().getCall(constants().ann.defines_var)) { // First, remove defines_var/is_defined_var annotations if present if (Expression::equal(defVar->arg(0), c->arg(0))) { c->arg(0)->cast()->decl()->ann().remove(constants().ann.is_defined_var); } else { c->arg(1)->cast()->decl()->ann().remove(constants().ann.is_defined_var); } } unify(envi, deletedVarDecls, c->arg(0)->cast(), c->arg(1)->cast()); { VarDecl* vd = c->arg(0)->cast()->decl(); int v0idx = envi.varOccurrences.find(vd); push_vardecl(envi, m[v0idx]->cast(), v0idx, vardeclQueue); } push_dependent_constraints(envi, c->arg(0)->cast(), constraintQueue); CollectDecls cd(envi.varOccurrences, deletedVarDecls, ci); top_down(cd, c); ci->e(constants().literalTrue); ci->remove(); } else if (c->id() == constants().ids.int_.lin_eq && Expression::equal(c->arg(2), IntLit::a(0))) { auto* al_c = follow_id(c->arg(0))->cast(); if (al_c->size() == 2 && (*al_c)[0]->cast()->v() == -(*al_c)[1]->cast()->v()) { auto* al_x = follow_id(c->arg(1))->cast(); if ((*al_x)[0]->isa() && (*al_x)[1]->isa() && ((*al_x)[0]->cast()->decl()->e() == nullptr || (*al_x)[1]->cast()->decl()->e() == nullptr)) { // Equality constraint between two identifiers: unify if (Call* defVar = c->ann().getCall(constants().ann.defines_var)) { // First, remove defines_var/is_defined_var annotations if present if (Expression::equal(defVar->arg(0), (*al_x)[0])) { (*al_x)[0]->cast()->decl()->ann().remove(constants().ann.is_defined_var); } else { (*al_x)[1]->cast()->decl()->ann().remove(constants().ann.is_defined_var); } } unify(envi, deletedVarDecls, (*al_x)[0]->cast(), (*al_x)[1]->cast()); { VarDecl* vd = (*al_x)[0]->cast()->decl(); int v0idx = envi.varOccurrences.find(vd); push_vardecl(envi, m[v0idx]->cast(), v0idx, vardeclQueue); } push_dependent_constraints(envi, (*al_x)[0]->cast(), constraintQueue); CollectDecls cd(envi.varOccurrences, deletedVarDecls, ci); top_down(cd, c); ci->e(constants().literalTrue); ci->remove(); } } } else if (c->id() == constants().ids.forall) { // Remove forall constraints, assign variables inside the forall to true auto* al = follow_id(c->arg(0))->cast(); for (unsigned int j = al->size(); (j--) != 0U;) { if (Id* id = (*al)[j]->dynamicCast()) { if (id->decl()->ti()->domain() == nullptr) { toAssignBoolVars.push_back( envi.varOccurrences.idx.find(id->decl()->id())->second); } else if (id->decl()->ti()->domain() == constants().literalFalse) { env.envi().fail(); id->decl()->e(constants().literalTrue); } } // todo: check else case (fixed bool inside a forall at this stage) } toRemoveConstraints.push_back(i); } else if (c->id() == constants().ids.exists || c->id() == constants().ids.clause) { // Add disjunctive constraints to the boolConstraints list boolConstraints.push_back(i); } } else if (Id* id = ci->e()->dynamicCast()) { if (id->decl()->ti()->domain() == constants().literalFalse) { env.envi().fail(); ci->e(constants().literalFalse); } else { if (id->decl()->ti()->domain() == nullptr) { toAssignBoolVars.push_back(envi.varOccurrences.idx.find(id->decl()->id())->second); } toRemoveConstraints.push_back(i); } } } } else if (auto* vdi = m[i]->dynamicCast()) { vdi->flag(false); if ((vdi->e()->e() != nullptr) && vdi->e()->e()->isa() && vdi->e()->type().dim() == 0) { // unify variable with the identifier it's assigned to Id* id1 = vdi->e()->e()->cast(); vdi->e()->e(nullptr); // Transfer is_defined_var annotation if (id1->decl()->ann().contains(constants().ann.is_defined_var)) { vdi->e()->ann().add(constants().ann.is_defined_var); } else if (vdi->e()->ann().contains(constants().ann.is_defined_var)) { id1->decl()->ann().add(constants().ann.is_defined_var); } unify(envi, deletedVarDecls, vdi->e()->id(), id1); push_dependent_constraints(envi, id1, constraintQueue); } if (vdi->e()->type().isbool() && vdi->e()->type().dim() == 0 && (vdi->e()->ti()->domain() == constants().literalTrue || vdi->e()->ti()->domain() == constants().literalFalse)) { // push RHS onto constraint queue since this bool var is fixed push_vardecl(envi, vdi, i, vardeclQueue); push_dependent_constraints(envi, vdi->e()->id(), constraintQueue); } if (Call* c = Expression::dynamicCast(vdi->e()->e())) { if (c->id() == constants().ids.forall || c->id() == constants().ids.exists || c->id() == constants().ids.clause) { // push reified foralls, exists, clauses boolConstraints.push_back(i); } } if (vdi->e()->type().isint()) { if (((vdi->e()->e() != nullptr) && vdi->e()->e()->isa()) || ((vdi->e()->ti()->domain() != nullptr) && vdi->e()->ti()->domain()->isa() && vdi->e()->ti()->domain()->cast()->isv()->size() == 1 && vdi->e()->ti()->domain()->cast()->isv()->min() == vdi->e()->ti()->domain()->cast()->isv()->max())) { // Variable is assigned an integer, or has a singleton domain push_vardecl(envi, vdi, i, vardeclQueue); push_dependent_constraints(envi, vdi->e()->id(), constraintQueue); } } } } // Phase 2: handle boolean constraints // - check if any boolean constraint is subsumed (e.g. a fixed false in a forall, or a fixed // true in a disjunction) // - check if any boolean constraint has a single non-fixed literal left, then fix that literal for (auto i = static_cast(boolConstraints.size()); (i--) != 0U;) { Item* bi = m[boolConstraints[i]]; if (bi->removed()) { continue; } Call* c; if (bi->isa()) { c = bi->cast()->e()->dynamicCast(); } else { c = bi->cast()->e()->e()->dynamicCast(); } if (c == nullptr) { continue; } bool isConjunction = (c->id() == constants().ids.forall); bool subsumed = false; Id* finalId = nullptr; bool finalIdNeg = false; int idCount = 0; std::vector pos; std::vector neg; for (unsigned int j = 0; j < c->argCount(); j++) { bool unit = (j == 0 ? isConjunction : !isConjunction); auto* al = follow_id(c->arg(j))->cast(); for (unsigned int k = 0; k < al->size(); k++) { if (Id* ident = (*al)[k]->dynamicCast()) { if ((ident->decl()->ti()->domain() != nullptr) || ((ident->decl()->e() != nullptr) && ident->decl()->e()->type().isPar())) { bool identValue = ident->decl()->ti()->domain() != nullptr ? eval_bool(envi, ident->decl()->ti()->domain()) : eval_bool(envi, ident->decl()->e()); if (identValue != unit) { subsumed = true; goto subsumed_check_done; } } else { idCount++; finalId = ident; finalIdNeg = (j == 1); if (j == 0) { pos.push_back(ident->decl()); } else { neg.push_back(ident->decl()); } } } else { if ((*al)[k]->cast()->v() != unit) { subsumed = true; goto subsumed_check_done; } } } } if (!pos.empty() && !neg.empty()) { std::sort(pos.begin(), pos.end()); std::sort(neg.begin(), neg.end()); unsigned int ix = 0; unsigned int iy = 0; for (;;) { if (pos[ix] == neg[iy]) { subsumed = true; break; } if (pos[ix] < neg[iy]) { ix++; } else { iy++; } if (ix == pos.size() || iy == neg.size()) { break; } } } subsumed_check_done: if (subsumed) { if (isConjunction) { if (bi->isa()) { env.envi().fail(); } else { if (bi->cast()->e()->ti()->domain() != nullptr) { if (eval_bool(envi, bi->cast()->e()->ti()->domain())) { envi.fail(); } } else { CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()->e()); bi->cast()->e()->ti()->domain(constants().literalFalse); bi->cast()->e()->ti()->setComputedDomain(true); bi->cast()->e()->e(constants().literalFalse); push_vardecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); push_dependent_constraints(envi, bi->cast()->e()->id(), constraintQueue); } } } else { if (bi->isa()) { CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()); bi->remove(); } else { if (bi->cast()->e()->ti()->domain() != nullptr) { if (!eval_bool(envi, bi->cast()->e()->ti()->domain())) { envi.fail(); } } else { CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()->e()); bi->cast()->e()->ti()->domain(constants().literalTrue); bi->cast()->e()->ti()->setComputedDomain(true); bi->cast()->e()->e(constants().literalTrue); push_vardecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); push_dependent_constraints(envi, bi->cast()->e()->id(), constraintQueue); } } } } else if (idCount == 1 && bi->isa()) { assert(finalId->decl()->ti()->domain() == nullptr); finalId->decl()->ti()->domain(constants().boollit(!finalIdNeg)); if (finalId->decl()->e() == nullptr) { finalId->decl()->e(constants().boollit(!finalIdNeg)); } CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()); bi->remove(); push_vardecl(envi, envi.varOccurrences.idx.find(finalId->decl()->id())->second, vardeclQueue); push_dependent_constraints(envi, finalId, constraintQueue); } // todo: for var decls, we could unify the variable with the remaining finalId (the RHS) } // Fix all bool vars in toAssignBoolVars to true and push their declarations and constraints for (unsigned int i = static_cast(toAssignBoolVars.size()); (i--) != 0U;) { if (m[toAssignBoolVars[i]]->removed()) { continue; } auto* vdi = m[toAssignBoolVars[i]]->cast(); if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().literalTrue); push_vardecl(envi, vdi, toAssignBoolVars[i], vardeclQueue); push_dependent_constraints(envi, vdi->e()->id(), constraintQueue); } } // Phase 3: fixpoint of constraint and variable simplification std::unordered_map nonFixedLiteralCount; while (!vardeclQueue.empty() || !constraintQueue.empty()) { while (!vardeclQueue.empty()) { int var_idx = vardeclQueue.front(); vardeclQueue.pop_front(); m[var_idx]->cast()->flag(false); VarDecl* vd = m[var_idx]->cast()->e(); if (vd->type().isbool() && (vd->ti()->domain() != nullptr)) { bool isTrue = vd->ti()->domain() == constants().literalTrue; bool remove = false; if (vd->e() != nullptr) { if (Id* id = vd->e()->dynamicCast()) { // Variable assigned to id, so fix id if (id->decl()->ti()->domain() == nullptr) { id->decl()->ti()->domain(vd->ti()->domain()); push_vardecl(envi, envi.varOccurrences.idx.find(id->decl()->id())->second, vardeclQueue); } else if (id->decl()->ti()->domain() != vd->ti()->domain()) { env.envi().fail(); } remove = true; } else if (Call* c = vd->e()->dynamicCast()) { if (isTrue && c->id() == constants().ids.forall) { // Reified forall is now fixed to true, so make all elements of the conjunction true remove = true; auto* al = follow_id(c->arg(0))->cast(); for (unsigned int i = 0; i < al->size(); i++) { if (Id* id = (*al)[i]->dynamicCast()) { if (id->decl()->ti()->domain() == nullptr) { id->decl()->ti()->domain(constants().literalTrue); push_vardecl(envi, envi.varOccurrences.idx.find(id->decl()->id())->second, vardeclQueue); } else if (id->decl()->ti()->domain() == constants().literalFalse) { env.envi().fail(); remove = true; } } } } else if (!isTrue && (c->id() == constants().ids.exists || c->id() == constants().ids.clause)) { // Reified disjunction is now fixed to false, so make all elements of the // disjunction false remove = true; for (unsigned int i = 0; i < c->argCount(); i++) { bool ispos = i == 0; auto* al = follow_id(c->arg(i))->cast(); for (unsigned int j = 0; j < al->size(); j++) { if (Id* id = (*al)[j]->dynamicCast()) { if (id->decl()->ti()->domain() == nullptr) { id->decl()->ti()->domain(constants().boollit(!ispos)); push_vardecl(envi, envi.varOccurrences.idx.find(id->decl()->id())->second, vardeclQueue); } else if (id->decl()->ti()->domain() == constants().boollit(ispos)) { env.envi().fail(); remove = true; } } } } } } } else { // If bool variable doesn't have a RHS, just remove it remove = true; } push_dependent_constraints(envi, vd->id(), constraintQueue); std::vector toRemove; auto it = envi.varOccurrences.itemMap.find(vd->id()->decl()->id()); // Handle all boolean constraints that involve this variable if (it != envi.varOccurrences.itemMap.end()) { for (auto item = it->second.begin(); item != it->second.end(); ++item) { if ((*item)->removed()) { continue; } if (auto* vdi = (*item)->dynamicCast()) { // The variable occurs in the RHS of another variable, so // if that is an array variable, simplify all constraints that // mention the array variable if ((vdi->e()->e() != nullptr) && vdi->e()->e()->isa()) { auto ait = envi.varOccurrences.itemMap.find(vdi->e()->id()->decl()->id()); if (ait != envi.varOccurrences.itemMap.end()) { for (auto* aitem : ait->second) { simplify_bool_constraint(envi, aitem, vd, remove, vardeclQueue, constraintQueue, toRemove, deletedVarDecls, nonFixedLiteralCount); } } continue; } } // Simplify the constraint *item (which depends on this variable) simplify_bool_constraint(envi, *item, vd, remove, vardeclQueue, constraintQueue, toRemove, deletedVarDecls, nonFixedLiteralCount); } } // Actually remove all items that have become unnecessary in the step above for (auto i = static_cast(toRemove.size()); (i--) != 0U;) { if (auto* ci = toRemove[i]->dynamicCast()) { CollectDecls cd(envi.varOccurrences, deletedVarDecls, ci); top_down(cd, ci->e()); ci->remove(); } else { auto* vdi = toRemove[i]->cast(); CollectDecls cd(envi.varOccurrences, deletedVarDecls, vdi); top_down(cd, vdi->e()->e()); vdi->e()->e(nullptr); } } if (remove) { deletedVarDecls.push_back(vd); } else { simplify_constraint(envi, m[var_idx], deletedVarDecls, constraintQueue, vardeclQueue); } } else if (vd->type().isint() && (vd->ti()->domain() != nullptr)) { IntSetVal* isv = eval_intset(envi, vd->ti()->domain()); if (isv->size() == 1 && isv->card() == 1) { simplify_constraint(envi, m[var_idx], deletedVarDecls, constraintQueue, vardeclQueue); } } } // end of processing of variable queue // Now handle all non-boolean constraints (i.e. anything except forall, clause, exists) bool handledConstraint = false; while (!handledConstraint && !constraintQueue.empty()) { Item* item = constraintQueue.front(); constraintQueue.pop_front(); Call* c; ArrayLit* al = nullptr; if (auto* ci = item->dynamicCast()) { ci->flag(false); c = Expression::dynamicCast(ci->e()); } else { if (item->removed()) { // This variable was removed because of unification, so we look up the // variable it was unified to item = m[envi.varOccurrences.find(item->cast()->e()->id()->decl())] ->cast(); } item->cast()->flag(false); c = Expression::dynamicCast(item->cast()->e()->e()); al = Expression::dynamicCast(item->cast()->e()->e()); } if (!item->removed()) { if (al != nullptr) { // Substitute all fixed variables by their values in array literals, then // push all constraints that depend on the array substitute_fixed_vars(envi, item, deletedVarDecls); push_dependent_constraints(envi, item->cast()->e()->id(), constraintQueue); } else if ((c == nullptr) || !(c->id() == constants().ids.forall || c->id() == constants().ids.exists || c->id() == constants().ids.clause)) { // For any constraint that is not forall, exists or clause, // substitute fixed arguments, then simplify it substitute_fixed_vars(envi, item, deletedVarDecls); handledConstraint = simplify_constraint(envi, item, deletedVarDecls, constraintQueue, vardeclQueue); } } } } // Clean up constraints that have been removed in the previous phase for (auto i = static_cast(toRemoveConstraints.size()); (i--) != 0U;) { auto* ci = m[toRemoveConstraints[i]]->cast(); CollectDecls cd(envi.varOccurrences, deletedVarDecls, ci); top_down(cd, ci->e()); ci->remove(); } // Phase 4: Chain Breaking if (chain_compression) { ImpCompressor imp(envi, m, deletedVarDecls, boolConstraints); LECompressor le(envi, m, deletedVarDecls); for (auto& item : m) { imp.trackItem(item); le.trackItem(item); } imp.compress(); le.compress(); } // Phase 5: handle boolean constraints again (todo: check if we can // refactor this into a separate function) // // Difference to phase 2: constraint argument arrays are actually shortened here if possible for (auto i = static_cast(boolConstraints.size()); (i--) != 0U;) { Item* bi = m[boolConstraints[i]]; if (bi->removed()) { continue; } Call* c; std::vector removedVarDecls; if (bi->isa()) { c = bi->cast()->e()->dynamicCast(); } else { c = Expression::dynamicCast(bi->cast()->e()->e()); } if (c == nullptr || !(c->id() == constants().ids.forall || c->id() == constants().ids.exists || c->id() == constants().ids.clause)) { continue; } bool isConjunction = (c->id() == constants().ids.forall); bool subsumed = false; for (unsigned int j = 0; j < c->argCount(); j++) { bool unit = (j == 0 ? isConjunction : !isConjunction); auto* al = follow_id(c->arg(j))->cast(); std::vector compactedAl; for (unsigned int k = 0; k < al->size(); k++) { if (Id* ident = (*al)[k]->dynamicCast()) { if (ident->decl()->ti()->domain() != nullptr) { if (!(ident->decl()->ti()->domain() == constants().boollit(unit))) { subsumed = true; } removedVarDecls.push_back(ident->decl()); } else { compactedAl.push_back(ident); } } else { if ((*al)[k]->cast()->v() != unit) { subsumed = true; } } } if (compactedAl.size() < al->size()) { c->arg(j, new ArrayLit(al->loc(), compactedAl)); c->arg(j)->type(Type::varbool(1)); } } if (subsumed) { if (isConjunction) { if (bi->isa()) { env.envi().fail(); } else { auto* al = follow_id(c->arg(0))->cast(); for (unsigned int j = 0; j < al->size(); j++) { removedVarDecls.push_back((*al)[j]->cast()->decl()); } bi->cast()->e()->ti()->domain(constants().literalFalse); bi->cast()->e()->ti()->setComputedDomain(true); bi->cast()->e()->e(constants().literalFalse); } } else { if (bi->isa()) { CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()); bi->remove(); } else { CollectDecls cd(envi.varOccurrences, deletedVarDecls, bi); top_down(cd, bi->cast()->e()->e()); bi->cast()->e()->ti()->domain(constants().literalTrue); bi->cast()->e()->ti()->setComputedDomain(true); bi->cast()->e()->e(constants().literalTrue); } } } for (auto& removedVarDecl : removedVarDecls) { if (env.envi().varOccurrences.remove(removedVarDecl, bi) == 0) { if ((removedVarDecl->e() == nullptr || removedVarDecl->ti()->domain() == nullptr || removedVarDecl->ti()->computedDomain()) && !is_output(removedVarDecl)) { deletedVarDecls.push_back(removedVarDecl); } } } if (auto* vdi = bi->dynamicCast()) { if (envi.varOccurrences.occurrences(vdi->e()) == 0) { if ((vdi->e()->e() == nullptr || vdi->e()->ti()->domain() == nullptr || vdi->e()->ti()->computedDomain()) && !is_output(vdi->e())) { deletedVarDecls.push_back(vdi->e()); } } } } // Phase 6: remove deleted variables if possible // TODO: The delayed deletion could be done eagerly by the creation of // env.optRemoveItem() which contains the logic in this while loop. while (!deletedVarDecls.empty()) { VarDecl* cur = deletedVarDecls.back(); deletedVarDecls.pop_back(); if (envi.varOccurrences.occurrences(cur) == 0) { auto cur_idx = envi.varOccurrences.idx.find(cur->id()); if (cur_idx != envi.varOccurrences.idx.end() && !m[cur_idx->second]->removed()) { if (is_output(cur)) { // We have to change the output model if we remove this variable Expression* val = nullptr; if (cur->type().isbool() && (cur->ti()->domain() != nullptr)) { val = cur->ti()->domain(); } else if (cur->type().isint()) { if ((cur->e() != nullptr) && cur->e()->isa()) { val = cur->e(); } else if ((cur->ti()->domain() != nullptr) && cur->ti()->domain()->isa() && cur->ti()->domain()->cast()->isv()->size() == 1 && cur->ti()->domain()->cast()->isv()->min() == cur->ti()->domain()->cast()->isv()->max()) { val = IntLit::a(cur->ti()->domain()->cast()->isv()->min()); } } if (val != nullptr) { // Find corresponding variable in output model and fix it VarDecl* vd_out = (*envi.output)[envi.outputFlatVarOccurrences.find(cur)]->cast()->e(); vd_out->e(val); CollectDecls cd(envi.varOccurrences, deletedVarDecls, m[cur_idx->second]->cast()); top_down(cd, cur->e()); (*envi.flat())[cur_idx->second]->remove(); } } else { CollectDecls cd(envi.varOccurrences, deletedVarDecls, m[cur_idx->second]->cast()); top_down(cd, cur->e()); (*envi.flat())[cur_idx->second]->remove(); } } } } } catch (ModelInconsistent&) { } } class SubstitutionVisitor : public EVisitor { protected: std::vector _removed; Expression* subst(Expression* e) { if (auto* vd = follow_id_to_decl(e)->dynamicCast()) { if (vd->type().isbool() && (vd->ti()->domain() != nullptr)) { _removed.push_back(vd); return vd->ti()->domain(); } if (vd->type().isint()) { if ((vd->e() != nullptr) && vd->e()->isa()) { _removed.push_back(vd); return vd->e(); } if ((vd->ti()->domain() != nullptr) && vd->ti()->domain()->isa() && vd->ti()->domain()->cast()->isv()->size() == 1 && vd->ti()->domain()->cast()->isv()->min() == vd->ti()->domain()->cast()->isv()->max()) { _removed.push_back(vd); return IntLit::a(vd->ti()->domain()->cast()->isv()->min()); } } } return e; } public: /// Visit array literal void vArrayLit(ArrayLit& al) { for (unsigned int i = 0; i < al.size(); i++) { al.set(i, subst(al[i])); } } /// Visit call void vCall(Call& c) { for (unsigned int i = 0; i < c.argCount(); i++) { c.arg(i, subst(c.arg(i))); } } /// Determine whether to enter node static bool enter(Expression* e) { return !e->isa(); } void remove(EnvI& env, Item* item, std::vector& deletedVarDecls) { for (auto& i : _removed) { i->ann().remove(constants().ann.is_defined_var); if (env.varOccurrences.remove(i, item) == 0) { if ((i->e() == nullptr || i->ti()->domain() == nullptr || i->ti()->computedDomain()) && !is_output(i)) { deletedVarDecls.push_back(i); } } } } }; void substitute_fixed_vars(EnvI& env, Item* ii, std::vector& deletedVarDecls) { SubstitutionVisitor sv; if (auto* ci = ii->dynamicCast()) { top_down(sv, ci->e()); for (ExpressionSetIter it = ci->e()->ann().begin(); it != ci->e()->ann().end(); ++it) { top_down(sv, *it); } } else if (auto* vdi = ii->dynamicCast()) { top_down(sv, vdi->e()); for (ExpressionSetIter it = vdi->e()->ann().begin(); it != vdi->e()->ann().end(); ++it) { top_down(sv, *it); } } else { auto* si = ii->cast(); top_down(sv, si->e()); for (ExpressionSetIter it = si->ann().begin(); it != si->ann().end(); ++it) { top_down(sv, *it); } } sv.remove(env, ii, deletedVarDecls); } bool simplify_constraint(EnvI& env, Item* ii, std::vector& deletedVarDecls, std::deque& constraintQueue, std::deque& vardeclQueue) { Expression* con_e; bool is_true; bool is_false; if (auto* ci = ii->dynamicCast()) { con_e = ci->e(); is_true = true; is_false = false; } else { auto* vdi = ii->cast(); con_e = vdi->e()->e(); is_true = (vdi->e()->type().isbool() && vdi->e()->ti()->domain() == constants().literalTrue); is_false = (vdi->e()->type().isbool() && vdi->e()->ti()->domain() == constants().literalFalse); assert(is_true || is_false || !vdi->e()->type().isbool() || vdi->e()->ti()->domain() == nullptr); } if (Call* c = Expression::dynamicCast(con_e)) { if (c->id() == constants().ids.int_.eq || c->id() == constants().ids.bool_eq || c->id() == constants().ids.float_.eq) { if (is_true && c->arg(0)->isa() && c->arg(1)->isa() && (c->arg(0)->cast()->decl()->e() == nullptr || c->arg(1)->cast()->decl()->e() == nullptr)) { if (Call* defVar = c->ann().getCall(constants().ann.defines_var)) { // First, remove defines_var/is_defined_var annotations if present if (Expression::equal(defVar->arg(0), c->arg(0))) { c->arg(0)->cast()->decl()->ann().remove(constants().ann.is_defined_var); } else { c->arg(1)->cast()->decl()->ann().remove(constants().ann.is_defined_var); } } unify(env, deletedVarDecls, c->arg(0)->cast(), c->arg(1)->cast()); push_dependent_constraints(env, c->arg(0)->cast(), constraintQueue); CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } else if (c->arg(0)->type().isPar() && c->arg(1)->type().isPar()) { Expression* e0 = eval_par(env, c->arg(0)); Expression* e1 = eval_par(env, c->arg(1)); bool is_equal = Expression::equal(e0, e1); if ((is_true && is_equal) || (is_false && !is_equal)) { // do nothing } else if ((is_true && !is_equal) || (is_false && is_equal)) { env.fail(); } else { auto* vdi = ii->cast(); CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); vdi->e()->e(constants().boollit(is_equal)); vdi->e()->ti()->domain(constants().boollit(is_equal)); vdi->e()->ti()->setComputedDomain(true); push_vardecl(env, vdi, env.varOccurrences.find(vdi->e()), vardeclQueue); push_dependent_constraints(env, vdi->e()->id(), constraintQueue); } if (ii->isa()) { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } } else if (is_true && ((c->arg(0)->isa() && c->arg(1)->type().isPar()) || (c->arg(1)->isa() && c->arg(0)->type().isPar()))) { Id* ident = c->arg(0)->isa() ? c->arg(0)->cast() : c->arg(1)->cast(); Expression* arg = c->arg(0)->isa() ? c->arg(1) : c->arg(0); bool canRemove = false; TypeInst* ti = ident->decl()->ti(); switch (ident->type().bt()) { case Type::BT_BOOL: if (ti->domain() == nullptr) { ti->domain(constants().boollit(eval_bool(env, arg))); ti->setComputedDomain(false); canRemove = true; } else { if (eval_bool(env, ti->domain()) == eval_bool(env, arg)) { canRemove = true; } else { env.fail(); canRemove = true; } } break; case Type::BT_INT: { IntVal d = eval_int(env, arg); if (ti->domain() == nullptr) { ti->domain(new SetLit(Location().introduce(), IntSetVal::a(d, d))); ti->setComputedDomain(false); canRemove = true; } else { IntSetVal* isv = eval_intset(env, ti->domain()); if (isv->contains(d)) { ident->decl()->ti()->domain(new SetLit(Location().introduce(), IntSetVal::a(d, d))); ident->decl()->ti()->setComputedDomain(false); canRemove = true; } else { env.fail(); canRemove = true; } } } break; case Type::BT_FLOAT: { if (ti->domain() == nullptr) { ti->domain(new BinOp(Location().introduce(), arg, BOT_DOTDOT, arg)); ti->setComputedDomain(false); canRemove = true; } else { FloatVal value = eval_float(env, arg); if (LinearTraits::domainContains(eval_floatset(env, ti->domain()), value)) { ti->domain(new BinOp(Location().introduce(), arg, BOT_DOTDOT, arg)); ti->setComputedDomain(false); canRemove = true; } else { env.fail(); canRemove = true; } } } break; default: break; } if (ident->decl()->e() == nullptr) { ident->decl()->e(c->arg(0)->isa() ? c->arg(1) : c->arg(0)); ti->setComputedDomain(true); canRemove = true; } if (ident->decl()->e()->isa()) { constraintQueue.push_back((*env.flat())[env.varOccurrences.find(ident->decl())]); } push_dependent_constraints(env, ident, constraintQueue); if (canRemove) { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } } } else if ((is_true || is_false) && c->id() == constants().ids.int_.le && ((c->arg(0)->isa() && c->arg(1)->type().isPar()) || (c->arg(1)->isa() && c->arg(0)->type().isPar()))) { Id* ident = c->arg(0)->isa() ? c->arg(0)->cast() : c->arg(1)->cast(); Expression* arg = c->arg(0)->isa() ? c->arg(1) : c->arg(0); IntSetVal* domain = ident->decl()->ti()->domain() != nullptr ? eval_intset(env, ident->decl()->ti()->domain()) : nullptr; if (domain != nullptr) { BinOpType bot = c->arg(0)->isa() ? (is_true ? BOT_LQ : BOT_GR) : (is_true ? BOT_GQ : BOT_LE); IntSetVal* newDomain = LinearTraits::limitDomain(bot, domain, eval_int(env, arg)); if (newDomain->card() == 0) { env.fail(); } else { ident->decl()->ti()->domain(new SetLit(Location().introduce(), newDomain)); ident->decl()->ti()->setComputedDomain(false); if (newDomain->min() == newDomain->max()) { push_dependent_constraints(env, ident, constraintQueue); } CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); if (auto* vdi = ii->dynamicCast()) { vdi->e()->e(constants().boollit(is_true)); push_dependent_constraints(env, vdi->e()->id(), constraintQueue); if (env.varOccurrences.occurrences(vdi->e()) == 0) { if (is_output(vdi->e())) { VarDecl* vd_out = (*env.output)[env.outputFlatVarOccurrences.find(vdi->e())] ->cast() ->e(); vd_out->e(constants().boollit(is_true)); } vdi->remove(); } } else { ii->remove(); } } } } else if (c->id() == constants().ids.bool2int) { auto* vdi = ii->dynamicCast(); VarDecl* vd; bool fixed = false; bool b_val = false; if (vdi != nullptr) { vd = vdi->e(); } else if (Id* ident = c->arg(1)->dynamicCast()) { vd = ident->decl(); } else { vd = nullptr; } IntSetVal* vd_dom = nullptr; if (vd != nullptr) { if (vd->ti()->domain() != nullptr) { vd_dom = eval_intset(env, vd->ti()->domain()); if (vd_dom->max() < 0 || vd_dom->min() > 1) { env.fail(); return true; } fixed = vd_dom->min() == vd_dom->max(); b_val = (vd_dom->min() == 1); } } else { fixed = true; b_val = (eval_int(env, c->arg(1)) == 1); } if (fixed) { if (c->arg(0)->type().isPar()) { bool b2i_val = eval_bool(env, c->arg(0)); if (b2i_val != b_val) { env.fail(); } else { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } } else { Id* ident = c->arg(0)->cast(); TypeInst* ti = ident->decl()->ti(); if (ti->domain() == nullptr) { ti->domain(constants().boollit(b_val)); ti->setComputedDomain(false); } else if (eval_bool(env, ti->domain()) != b_val) { env.fail(); } CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); if (vd != nullptr) { vd->e(IntLit::a(static_cast(b_val))); vd->ti()->setComputedDomain(true); } push_dependent_constraints(env, ident, constraintQueue); if (vdi != nullptr) { if (env.varOccurrences.occurrences(vd) == 0) { vdi->remove(); } } else { ii->remove(); } } } else { IntVal v = -1; if (auto* bl = c->arg(0)->dynamicCast()) { v = bl->v() ? 1 : 0; } else if (Id* ident = c->arg(0)->dynamicCast()) { if (ident->decl()->ti()->domain() != nullptr) { v = eval_bool(env, ident->decl()->ti()->domain()) ? 1 : 0; } } if (v != -1) { if ((vd_dom != nullptr) && !vd_dom->contains(v)) { env.fail(); } else { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); vd->e(IntLit::a(v)); vd->ti()->domain(new SetLit(Location().introduce(), IntSetVal::a(v, v))); vd->ti()->setComputedDomain(true); push_vardecl(env, env.varOccurrences.find(vd), vardeclQueue); push_dependent_constraints(env, vd->id(), constraintQueue); } } } } else { // General propagation: call a propagator registered for this constraint type Expression* rewrite = nullptr; GCLock lock; switch (OptimizeRegistry::registry().process(env, ii, c, rewrite)) { case OptimizeRegistry::CS_NONE: return false; case OptimizeRegistry::CS_OK: return true; case OptimizeRegistry::CS_FAILED: if (is_true) { env.fail(); return true; } else if (is_false) { if (ii->isa()) { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } else { deletedVarDecls.push_back(ii->cast()->e()); } return true; } else { auto* vdi = ii->cast(); vdi->e()->ti()->domain(constants().literalFalse); CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); vdi->e()->e(constants().literalFalse); push_vardecl(env, vdi, env.varOccurrences.find(vdi->e()), vardeclQueue); return true; } case OptimizeRegistry::CS_ENTAILED: if (is_true) { if (ii->isa()) { CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); ii->remove(); } else { deletedVarDecls.push_back(ii->cast()->e()); } return true; } else if (is_false) { env.fail(); return true; } else { auto* vdi = ii->cast(); vdi->e()->ti()->domain(constants().literalTrue); CollectDecls cd(env.varOccurrences, deletedVarDecls, ii); top_down(cd, c); vdi->e()->e(constants().literalTrue); push_vardecl(env, vdi, env.varOccurrences.find(vdi->e()), vardeclQueue); return true; } case OptimizeRegistry::CS_REWRITE: { std::vector tdv; CollectDecls cd(env.varOccurrences, tdv, ii); top_down(cd, c); CollectOccurrencesE ce(env.varOccurrences, ii); top_down(ce, rewrite); for (auto& i : tdv) { if (env.varOccurrences.occurrences(i) == 0) { deletedVarDecls.push_back(i); } } assert(rewrite != nullptr); if (auto* ci = ii->dynamicCast()) { ci->e(rewrite); constraintQueue.push_back(ii); } else { auto* vdi = ii->cast(); vdi->e()->e(rewrite); if ((vdi->e()->e() != nullptr) && vdi->e()->e()->isa() && vdi->e()->type().dim() == 0) { Id* id1 = vdi->e()->e()->cast(); vdi->e()->e(nullptr); // Transfer is_defined_var annotation if (id1->decl()->ann().contains(constants().ann.is_defined_var)) { vdi->e()->ann().add(constants().ann.is_defined_var); } else if (vdi->e()->ann().contains(constants().ann.is_defined_var)) { id1->decl()->ann().add(constants().ann.is_defined_var); } unify(env, deletedVarDecls, vdi->e()->id(), id1); push_dependent_constraints(env, id1, constraintQueue); } if ((vdi->e()->e() != nullptr) && vdi->e()->e()->type().isPar() && (vdi->e()->ti()->domain() != nullptr)) { if (vdi->e()->e()->type().isint()) { IntVal iv = eval_int(env, vdi->e()->e()); IntSetVal* dom = eval_intset(env, vdi->e()->ti()->domain()); if (!dom->contains(iv)) { env.fail(); } } else if (vdi->e()->e()->type().isIntSet()) { IntSetVal* isv = eval_intset(env, vdi->e()->e()); IntSetVal* dom = eval_intset(env, vdi->e()->ti()->domain()); IntSetRanges isv_r(isv); IntSetRanges dom_r(dom); if (!Ranges::subset(isv_r, dom_r)) { env.fail(); } } else if (vdi->e()->e()->type().isfloat()) { FloatVal fv = eval_float(env, vdi->e()->e()); FloatSetVal* dom = eval_floatset(env, vdi->e()->ti()->domain()); if (!dom->contains(fv)) { env.fail(); } } } if (vdi->e()->ti()->type() != Type::varbool() || vdi->e()->ti()->domain() == nullptr) { push_vardecl(env, vdi, env.varOccurrences.find(vdi->e()), vardeclQueue); } if (is_true) { constraintQueue.push_back(ii); } } return true; } } } } return false; } int bool_state(EnvI& env, Expression* e) { if (e->type().isPar()) { return static_cast(eval_bool(env, e)); } Id* id = e->cast(); if (id->decl()->ti()->domain() == nullptr) { return 2; } return static_cast(id->decl()->ti()->domain() == constants().literalTrue); } int decrement_non_fixed_vars(std::unordered_map& nonFixedLiteralCount, Call* c) { auto it = nonFixedLiteralCount.find(c); if (it == nonFixedLiteralCount.end()) { int nonFixedVars = 0; for (unsigned int i = 0; i < c->argCount(); i++) { auto* al = follow_id(c->arg(i))->cast(); nonFixedVars += static_cast(al->size()); for (unsigned int j = al->size(); (j--) != 0U;) { if ((*al)[j]->type().isPar()) { nonFixedVars--; } } } nonFixedLiteralCount.insert(std::make_pair(c, nonFixedVars)); return nonFixedVars; } it->second--; return it->second; } void simplify_bool_constraint(EnvI& env, Item* ii, VarDecl* vd, bool& remove, std::deque& vardeclQueue, std::deque& constraintQueue, std::vector& toRemove, std::vector& deletedVarDecls, std::unordered_map& nonFixedLiteralCount) { if (ii->isa()) { remove = false; return; } bool isTrue = vd->ti()->domain() == constants().literalTrue; Expression* e = nullptr; auto* ci = ii->dynamicCast(); auto* vdi = ii->dynamicCast(); if (ci != nullptr) { e = ci->e(); if (vd->ti()->domain() != nullptr) { if (Call* definedVarCall = e->ann().getCall(constants().ann.defines_var)) { if (Expression::equal(definedVarCall->arg(0), vd->id())) { e->ann().removeCall(constants().ann.defines_var); vd->ann().remove(constants().ann.is_defined_var); } } } } else if (vdi != nullptr) { e = vdi->e()->e(); if (e == nullptr) { return; } if (Id* id = e->dynamicCast()) { assert(id->decl() == vd); if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().boollit(isTrue)); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (id->decl()->ti()->domain() == constants().boollit(!isTrue)) { env.fail(); remove = false; } return; } } if (Id* ident = e->dynamicCast()) { assert(ident->decl() == vd); return; } if (e->isa()) { if (e == constants().literalTrue && (ci != nullptr)) { toRemove.push_back(ci); } return; } Call* c = e->cast(); if (c->id() == constants().ids.bool_eq) { Expression* b0 = c->arg(0); Expression* b1 = c->arg(1); int b0s = bool_state(env, b0); int b1s = bool_state(env, b1); if (b0s == 2) { std::swap(b0, b1); std::swap(b0s, b1s); } assert(b0s != 2); if ((ci != nullptr) || vdi->e()->ti()->domain() == constants().literalTrue) { if (b0s != b1s) { if (b1s == 2) { b1->cast()->decl()->ti()->domain(constants().boollit(isTrue)); vardeclQueue.push_back(env.varOccurrences.idx.find(b1->cast()->decl()->id())->second); if (ci != nullptr) { toRemove.push_back(ci); } } else { env.fail(); remove = false; } } else { if (ci != nullptr) { toRemove.push_back(ci); } } } else if ((vdi != nullptr) && vdi->e()->ti()->domain() == constants().literalFalse) { if (b0s != b1s) { if (b1s == 2) { b1->cast()->decl()->ti()->domain(constants().boollit(isTrue)); vardeclQueue.push_back(env.varOccurrences.idx.find(b1->cast()->decl()->id())->second); } } else { env.fail(); remove = false; } } else { remove = false; } } else if (c->id() == constants().ids.forall || c->id() == constants().ids.exists || c->id() == constants().ids.clause) { if (isTrue && c->id() == constants().ids.exists) { if (ci != nullptr) { toRemove.push_back(ci); } else { if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().literalTrue); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (vdi->e()->ti()->domain() != constants().literalTrue) { env.fail(); vdi->e()->e(constants().literalTrue); } } } else if (!isTrue && c->id() == constants().ids.forall) { if (ci != nullptr) { env.fail(); toRemove.push_back(ci); } else { if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().literalFalse); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (vdi->e()->ti()->domain() != constants().literalFalse) { env.fail(); vdi->e()->e(constants().literalFalse); } } } else { int nonfixed = decrement_non_fixed_vars(nonFixedLiteralCount, c); bool isConjunction = (c->id() == constants().ids.forall); assert(nonfixed >= 0); if (nonfixed <= 1) { bool subsumed = false; int nonfixed_i = -1; int nonfixed_j = -1; int realNonFixed = 0; for (unsigned int i = 0; i < c->argCount(); i++) { bool unit = (i == 0 ? isConjunction : !isConjunction); auto* al = follow_id(c->arg(i))->cast(); realNonFixed += static_cast(al->size()); for (unsigned int j = al->size(); (j--) != 0U;) { if ((*al)[j]->type().isPar() || ((*al)[j]->cast()->decl()->ti()->domain() != nullptr)) { realNonFixed--; } if ((*al)[j]->type().isPar() && eval_bool(env, (*al)[j]) != unit) { subsumed = true; i = 2; // break out of outer loop break; } if (Id* id = (*al)[j]->dynamicCast()) { if (id->decl()->ti()->domain() != nullptr) { bool idv = (id->decl()->ti()->domain() == constants().literalTrue); if (unit != idv) { subsumed = true; i = 2; // break out of outer loop break; } } else { nonfixed_i = static_cast(i); nonfixed_j = static_cast(j); } } } } if (subsumed) { if (ci != nullptr) { if (isConjunction) { env.fail(); ci->e(constants().literalFalse); } else { toRemove.push_back(ci); } } else { if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().boollit(!isConjunction)); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (vdi->e()->ti()->domain() != constants().boollit(!isConjunction)) { env.fail(); vdi->e()->e(constants().boollit(!isConjunction)); } } } else if (realNonFixed == 0) { if (ci != nullptr) { if (isConjunction) { toRemove.push_back(ci); } else { env.fail(); ci->e(constants().literalFalse); } } else { if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().boollit(isConjunction)); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (vdi->e()->ti()->domain() != constants().boollit(isConjunction)) { env.fail(); vdi->e()->e(constants().boollit(isConjunction)); } toRemove.push_back(vdi); } } else if (realNonFixed == 1) { // not subsumed, nonfixed==1 assert(nonfixed_i != -1); auto* al = follow_id(c->arg(nonfixed_i))->cast(); Id* ident = (*al)[nonfixed_j]->cast(); if ((ci != nullptr) || (vdi->e()->ti()->domain() != nullptr)) { bool result = nonfixed_i == 0; if ((vdi != nullptr) && vdi->e()->ti()->domain() == constants().literalFalse) { result = !result; } VarDecl* decl = ident->decl(); if (decl->ti()->domain() == nullptr) { decl->ti()->domain(constants().boollit(result)); vardeclQueue.push_back(env.varOccurrences.idx.find(decl->id())->second); } else if (vd->ti()->domain() != constants().boollit(result)) { env.fail(); decl->e(constants().literalTrue); } } else { if (nonfixed_i == 0) { // this is a clause, exists or forall with a single non-fixed variable, // assigned to a non-fixed variable => turn into simple equality vdi->e()->e(nullptr); // Transfer is_defined_var annotation if (ident->decl()->ann().contains(constants().ann.is_defined_var)) { vdi->e()->ann().add(constants().ann.is_defined_var); } else if (vdi->e()->ann().contains(constants().ann.is_defined_var)) { ident->decl()->ann().add(constants().ann.is_defined_var); } unify(env, deletedVarDecls, vdi->e()->id(), ident); push_dependent_constraints(env, ident, constraintQueue); } else { remove = false; } } } else { remove = false; } } else if (c->id() == constants().ids.clause) { int posOrNeg = isTrue ? 0 : 1; auto* al = follow_id(c->arg(posOrNeg))->cast(); auto* al_other = follow_id(c->arg(1 - posOrNeg))->cast(); if ((ci != nullptr) && al->size() == 1 && (*al)[0] != vd->id() && al_other->size() == 1) { // simple implication assert((*al_other)[0] == vd->id()); if (ci != nullptr) { if ((*al)[0]->type().isPar()) { if (eval_bool(env, (*al)[0]) == isTrue) { toRemove.push_back(ci); } else { env.fail(); remove = false; } } else { Id* id = (*al)[0]->cast(); if (id->decl()->ti()->domain() == nullptr) { id->decl()->ti()->domain(constants().boollit(isTrue)); vardeclQueue.push_back(env.varOccurrences.idx.find(id->decl()->id())->second); } else { if (id->decl()->ti()->domain() == constants().boollit(isTrue)) { toRemove.push_back(ci); } else { env.fail(); remove = false; } } } } } else { // proper clause for (unsigned int i = 0; i < al->size(); i++) { if ((*al)[i] == vd->id()) { if (ci != nullptr) { toRemove.push_back(ci); } else { if (vdi->e()->ti()->domain() == nullptr) { vdi->e()->ti()->domain(constants().literalTrue); vardeclQueue.push_back(env.varOccurrences.idx.find(vdi->e()->id())->second); } else if (vdi->e()->ti()->domain() != constants().literalTrue) { env.fail(); vdi->e()->e(constants().literalTrue); } } break; } } } } } } else { remove = false; } } } // namespace MiniZinc libminizinc-2.5.3/lib/astvec.cpp0000644000175000017500000000140313757304533015235 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include namespace MiniZinc { ASTIntVecO::ASTIntVecO(const std::vector& v) : ASTChunk(sizeof(int) * v.size()) { for (auto i = static_cast(v.size()); (i--) != 0U;) { (*this)[i] = v[i]; } } ASTIntVecO* ASTIntVecO::a(const std::vector& v) { auto* ao = static_cast(alloc(sizeof(int) * v.size())); new (ao) ASTIntVecO(v); return ao; } } // namespace MiniZinclibminizinc-2.5.3/lib/utils_savestream.cpp0000644000175000017500000000227513757304533017352 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was ! distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #include #else #include #endif #include #include using namespace std; using namespace MiniZinc; // StreamRedir::StreamRedir(FILE *s0) : d_s0(s0) { } StreamRedir::StreamRedir(FILE* s0, FILE* s1, bool fFlush) : _file0(s0) { replaceStream(s1, fFlush); } StreamRedir::~StreamRedir() { restore(); } void StreamRedir::replaceStream(FILE* s1, bool fFlush) { if (fFlush) { fflush(_file0); } fgetpos(_file0, &(_streamInfo.pos)); _streamInfo.fd = dup(fileno(_file0)); dup2(fileno(s1), fileno(_file0)); } void StreamRedir::restore(bool fFLush) { if (fFLush) { fflush(_file0); } dup2(_streamInfo.fd, fileno(_file0)); close(_streamInfo.fd); clearerr(_file0); fsetpos(_file0, &(_streamInfo.pos)); } libminizinc-2.5.3/lib/param_config.cpp0000644000175000017500000001144413757304533016403 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jason Nguyen */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include namespace MiniZinc { void ParamConfig::load(const std::string& filename) { if (JSONParser::fileIsJSON(filename)) { try { Env confenv; JSONParser jp(confenv.envi()); Model m; GCLock lock; jp.parse(&m, filename, false); for (auto& i : m) { if (auto* ai = i->dynamicCast()) { addValue(ai->id(), ai->e()); } else if (auto* ii = i->dynamicCast()) { auto flag = ParamConfig::flagName(ii->f()); if (_blacklist.count(flag) > 0) { throw ParamException("Parameter '" + flag + "' is not allowed in configuration file"); } _values.push_back(flag); _values.push_back(ParamConfig::modelToString(*(ii->m()))); } } } catch (ParamException& e) { throw; } catch (Exception& e) { throw ParamException(e.what()); } } else { throw ParamException("Invalid configuration file"); } } void ParamConfig::addValue(const ASTString& flag_input, Expression* e) { auto flag = ParamConfig::flagName(flag_input); if (_blacklist.count(flag) > 0) { throw ParamException("Parameter '" + flag + "' is not allowed in configuration file"); } std::stringstream val_ss; switch (e->eid()) { case Expression::E_ARRAYLIT: { auto* al = e->cast(); for (auto* exp : al->getVec()) { addValue(flag, exp); } break; } case Expression::E_BOOLLIT: { if (e->cast()->v()) { _values.push_back(flag); } else { // If this flag has a negated version, use it auto it = _boolSwitches.find(flag); if (it != _boolSwitches.end()) { _values.push_back(it->second); } } break; } case Expression::E_STRINGLIT: _values.push_back(flag); val_ss << e->cast()->v(); _values.push_back(val_ss.str()); break; case Expression::E_INTLIT: _values.push_back(flag); val_ss << e->cast()->v(); _values.push_back(val_ss.str()); break; case Expression::E_FLOATLIT: _values.push_back(flag); val_ss << e->cast()->v(); val_ss << e; _values.push_back(val_ss.str()); break; break; default: throw ParamException("Unsupported parameter type for '" + flag + "'"); } } std::string ParamConfig::flagName(const ASTString& flag_input) { std::stringstream flag_ss; if (!flag_input.beginsWith("-")) { flag_ss << "--"; } flag_ss << flag_input; return flag_ss.str(); } std::string ParamConfig::modelToString(Model& model) { std::stringstream ss; for (auto& i : model) { if (auto* ai = i->dynamicCast()) { auto flag = ParamConfig::flagName(ai->id()); auto* e = ai->e(); switch (e->eid()) { case Expression::E_ARRAYLIT: { auto* al = e->cast(); for (auto* exp : al->getVec()) { ss << " " << flag; ss << " " << exp; } break; } case Expression::E_BOOLLIT: if (e->cast()->v()) { ss << " " << flag; } break; case Expression::E_STRINGLIT: ss << " " << flag; ss << " " << ai->e()->cast()->v(); break; case Expression::E_INTLIT: ss << " " << flag; ss << " " << ai->e()->cast()->v(); break; case Expression::E_FLOATLIT: ss << " " << flag; ss << " " << ai->e()->cast()->v(); break; default: throw ParamException("Unsupported parameter type for '" + flag + "'"); } } else if (auto* ii = i->dynamicCast()) { ss << " " << ParamConfig::flagName(ii->f()); ss << " \"" << Printer::escapeStringLit(modelToString(*(ii->m()))) << "\""; } } return ss.str().substr(1); } const std::vector& ParamConfig::argv() { return _values; } void ParamConfig::blacklist(const std::string& disallowed) { _blacklist.insert(disallowed); } void ParamConfig::blacklist(const std::vector& disallowed) { for (const auto& param : disallowed) { _blacklist.insert(param); } } void ParamConfig::negatedFlag(const std::string& flag, const std::string& negated) { _boolSwitches.insert(std::make_pair(flag, negated)); } } // namespace MiniZinc libminizinc-2.5.3/lib/solver_config.cpp0000644000175000017500000007315413757304533016623 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include using namespace std; namespace MiniZinc { bool SolverConfig::ExtraFlag::validate(const std::string& v) const { try { switch (flagType) { case FlagType::T_BOOL: case FlagType::T_STRING: return range.empty() || std::find(range.begin(), range.end(), v) != range.end(); case FlagType::T_INT: { long long i = stoll(v); return range.empty() || (i >= stoll(range[0]) && i <= stoll(range[1])); } case FlagType::T_FLOAT: { double i = stod(v); return range.empty() || (i >= stod(range[0]) && i <= stod(range[1])); } } } catch (const invalid_argument&) { return false; } catch (const out_of_range&) { return false; } return false; } namespace { std::string get_string(AssignI* ai) { if (auto* sl = ai->e()->dynamicCast()) { return std::string(sl->v().c_str(), sl->v().size()); } throw ConfigException("invalid configuration item (right hand side must be string)"); } bool get_bool(AssignI* ai) { if (auto* bl = ai->e()->dynamicCast()) { return bl->v(); } throw ConfigException("invalid configuration item (right hand side must be bool)"); } int get_int(AssignI* ai) { if (auto* il = ai->e()->dynamicCast()) { return static_cast(il->v().toInt()); } throw ConfigException("invalid configuration item (right hand side must be int)"); } std::vector get_string_list(AssignI* ai) { if (auto* al = ai->e()->dynamicCast()) { std::vector ret; for (unsigned int i = 0; i < al->size(); i++) { if (auto* sl = (*al)[i]->dynamicCast()) { ret.emplace_back(sl->v().c_str(), sl->v().size()); } else { throw ConfigException( "invalid configuration item (right hand side must be a list of strings)"); } } return ret; } throw ConfigException("invalid configuration item (right hand side must be a list of strings)"); } std::vector > get_string_pair_list(AssignI* ai) { if (auto* al = ai->e()->dynamicCast()) { std::vector > ret; if (al->dims() != 2 || al->min(1) != 1 || al->max(1) != 2) { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } for (unsigned int i = 0; i < al->size(); i += 2) { auto* sl1 = (*al)[i]->dynamicCast(); auto* sl2 = (*al)[i + 1]->dynamicCast(); if ((sl1 != nullptr) && (sl2 != nullptr)) { ret.emplace_back(std::string(sl1->v().c_str(), sl1->v().size()), std::string(sl2->v().c_str(), sl2->v().size())); } else { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } } return ret; } throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } std::vector > get_default_option_list(AssignI* ai) { if (auto* al = ai->e()->dynamicCast()) { std::vector > ret; if (al->size() == 0) { return ret; } if (al->dims() != 2) { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } int nCols = al->max(1) - al->min(1) + 1; if (nCols != 3) { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings with 3 " "columns)"); } for (unsigned int i = 0; i < al->size(); i += nCols) { auto* sl0 = (*al)[i]->dynamicCast(); auto* sl1 = (*al)[i + 1]->dynamicCast(); auto* sl2 = (*al)[i + 2]->dynamicCast(); if ((sl0 != nullptr) && (sl1 != nullptr) && (sl2 != nullptr)) { ret.push_back(std::vector({std::string(sl0->v().c_str(), sl0->v().size()), std::string(sl1->v().c_str(), sl1->v().size()), std::string(sl2->v().c_str(), sl2->v().size())})); } else { throw ConfigException( "invalid configuration item (right hand side must be a list of strings)"); } } return ret; } throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } std::vector get_extra_flag_list(AssignI* ai) { if (auto* al = ai->e()->dynamicCast()) { std::vector ret; if (al->size() == 0) { return ret; } if (al->dims() != 2) { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } int nCols = al->max(1) - al->min(1) + 1; if (nCols < 2 || nCols > 4) { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } bool haveType = (nCols >= 3); bool haveDefault = (nCols >= 4); for (unsigned int i = 0; i < al->size(); i += nCols) { auto* sl1 = (*al)[i]->dynamicCast(); auto* sl2 = (*al)[i + 1]->dynamicCast(); StringLit* sl3 = haveType ? (*al)[i + 2]->dynamicCast() : nullptr; StringLit* sl4 = haveDefault ? (*al)[i + 3]->dynamicCast() : nullptr; std::string opt_type_full = sl3 != nullptr ? std::string(sl3->v().c_str(), sl3->v().size()) : "bool"; std::vector opt_range; std::string opt_def; if (sl4 != nullptr) { opt_def = std::string(sl4->v().c_str(), sl4->v().size()); } else if (opt_type_full == "bool") { opt_def = "false"; } else if (opt_type_full == "int") { opt_def = "0"; } else if (opt_type_full == "float") { opt_def = "0.0"; } size_t split = opt_type_full.find(":"); std::string opt_type = opt_type_full.substr(0, split); SolverConfig::ExtraFlag::FlagType flag_type; if (opt_type == "bool") { flag_type = SolverConfig::ExtraFlag::FlagType::T_BOOL; } else if (opt_type == "int") { flag_type = SolverConfig::ExtraFlag::FlagType::T_INT; } else if (opt_type == "float") { flag_type = SolverConfig::ExtraFlag::FlagType::T_FLOAT; } else if (opt_type == "string" || opt_type == "opt") { flag_type = SolverConfig::ExtraFlag::FlagType::T_STRING; } if (split != std::string::npos) { opt_type_full = opt_type_full.substr(split + 1); while (!opt_type_full.empty()) { split = opt_type_full.find(":"); opt_range.push_back(opt_type_full.substr(0, split)); opt_type_full = split == std::string::npos ? "" : opt_type_full.substr(split + 1); } } if ((sl1 != nullptr) && (sl2 != nullptr)) { ret.emplace_back(std::string(sl1->v().c_str(), sl1->v().size()), std::string(sl2->v().c_str(), sl2->v().size()), flag_type, opt_range, opt_def); } else { throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } } return ret; } throw ConfigException( "invalid configuration item (right hand side must be a 2d array of strings)"); } std::string get_env(const char* v) { std::string ret; #ifdef _MSC_VER size_t len; getenv_s(&len, nullptr, 0, v); if (len > 0) { char* p = static_cast(malloc(len * sizeof(char))); getenv_s(&len, p, len, v); if (len > 0) { ret = p; } free(p); } #else char* p = getenv(v); if (p != nullptr) { ret = p; } #endif return ret; } char char_to_lower(char c) { return static_cast(std::tolower(static_cast(c))); } std::string string_to_lower(std::string s) { std::transform(s.begin(), s.end(), s.begin(), char_to_lower); return s; } struct SortByLowercase { bool operator()(const std::string& n1, const std::string& n2) { for (size_t i = 0; i < n1.size() && i < n2.size(); i++) { if (std::tolower(n1[i]) != std::tolower(n2[i])) { return std::tolower(n1[i]) < std::tolower(n2[i]); } } return n1.size() < n2.size(); } }; struct SortByName { const std::vector& solvers; SortByLowercase sortByLowercase; SortByName(const std::vector& solvers0) : solvers(solvers0) {} bool operator()(int idx1, int idx2) { return sortByLowercase(solvers[idx1].name(), solvers[idx2].name()); } }; } // namespace SolverConfig SolverConfig::load(const string& filename) { SolverConfig sc; sc._configFile = FileUtils::file_path(filename); ostringstream errstream; try { Env confenv; Model* m = nullptr; if (JSONParser::fileIsJSON(filename)) { JSONParser jp(confenv.envi()); try { m = new Model; GCLock lock; jp.parse(m, filename, false); } catch (JSONError& e) { delete m; m = nullptr; throw ConfigException(e.msg()); } } else { vector filenames; filenames.push_back(filename); m = parse(confenv, filenames, vector(), "", "", vector(), false, true, false, false, errstream); } if (m != nullptr) { bool hadId = false; bool hadVersion = false; bool hadName = false; string basePath = FileUtils::dir_name(sc._configFile); for (auto& i : *m) { if (auto* ai = i->dynamicCast()) { if (ai->id() == "id") { sc._id = get_string(ai); hadId = true; } else if (ai->id() == "name") { sc._name = get_string(ai); hadName = true; } else if (ai->id() == "executable") { std::string exePath = get_string(ai); sc._executable = exePath; std::string exe = FileUtils::find_executable(FileUtils::file_path(exePath, basePath)); int nr_found = (int)(!exe.empty()); std::string tmp = FileUtils::file_path(FileUtils::find_executable(exePath)); nr_found += (int)((!tmp.empty()) && tmp != exe); exe = exe.empty() ? tmp : exe; if (nr_found > 0) { sc._executableResolved = exe; if (nr_found > 1) { std::cerr << "Warning: multiple executables '" << exePath << "' found on the system, using '" << exe << "'" << std::endl; } } } else if (ai->id() == "mznlib") { std::string libPath = get_string(ai); sc._mznlib = libPath; if (!libPath.empty()) { if (libPath[0] == '-') { sc._mznlibResolved = libPath; } else { sc._mznlibResolved = FileUtils::file_path(libPath, basePath); } } } else if (ai->id() == "version") { sc._version = get_string(ai); hadVersion = true; } else if (ai->id() == "mznlibVersion") { sc._mznlibVersion = get_int(ai); } else if (ai->id() == "description") { sc._description = get_string(ai); } else if (ai->id() == "contact") { sc._contact = get_string(ai); } else if (ai->id() == "website") { sc._website = get_string(ai); } else if (ai->id() == "supportsMzn") { sc._supportsMzn = get_bool(ai); } else if (ai->id() == "supportsFzn") { sc._supportsFzn = get_bool(ai); } else if (ai->id() == "supportsNL") { sc._supportsNL = get_bool(ai); } else if (ai->id() == "needsSolns2Out") { sc._needsSolns2Out = get_bool(ai); } else if (ai->id() == "isGUIApplication") { sc._isGUIApplication = get_bool(ai); } else if (ai->id() == "needsMznExecutable") { sc._needsMznExecutable = get_bool(ai); } else if (ai->id() == "needsStdlibDir") { sc._needsStdlibDir = get_bool(ai); } else if (ai->id() == "needsPathsFile") { sc._needsPathsFile = get_bool(ai); } else if (ai->id() == "tags") { sc._tags = get_string_list(ai); } else if (ai->id() == "stdFlags") { sc._stdFlags = get_string_list(ai); } else if (ai->id() == "requiredFlags") { sc._requiredFlags = get_string_list(ai); } else if (ai->id() == "extraFlags") { sc._extraFlags = get_extra_flag_list(ai); } else { std::ostringstream ss; ss << "invalid configuration item (" << ai->id() << ")"; throw ConfigException(ss.str()); } } else { throw ConfigException("invalid configuration item"); } } if (!hadId) { throw ConfigException("invalid solver configuration (missing id)"); } if (!hadVersion) { throw ConfigException("invalid solver configuration (missing version)"); } if (!hadName) { throw ConfigException("invalid solver configuration (missing name)"); } } else { throw ConfigException(errstream.str()); } } catch (ConfigException&) { throw; } catch (Exception& e) { throw ConfigException(e.what()); } return sc; } std::string SolverConfig::toJSON(const SolverConfigs& configs) const { GCLock lock; std::ostringstream oss; auto def_id = configs.defaultSolver(""); oss << "{\n"; oss << " \"extraInfo\": {\n"; if (!def_id.empty() && def_id == id()) { oss << " \"isDefault\": true,\n"; } if (!mznlibResolved().empty()) { oss << " \"mznlib\": \"" << Printer::escapeStringLit(mznlibResolved()) << "\",\n"; } if (!executableResolved().empty()) { oss << " \"executable\": \"" << Printer::escapeStringLit(executableResolved()) << "\",\n"; } oss << " \"configFile\": \"" << Printer::escapeStringLit(configFile()) << "\""; if (!defaultFlags().empty()) { oss << ",\n \"defaultFlags\": ["; for (unsigned int j = 0; j < defaultFlags().size(); j++) { oss << "\"" << Printer::escapeStringLit(defaultFlags()[j]) << "\""; if (j < defaultFlags().size() - 1) { oss << ","; } } oss << "]"; } oss << "\n"; oss << " },\n"; oss << " \"id\": \"" << Printer::escapeStringLit(id()) << "\",\n"; oss << " \"name\": \"" << Printer::escapeStringLit(name()) << "\",\n"; oss << " \"version\": \"" << Printer::escapeStringLit(version()) << "\",\n"; if (!mznlib().empty()) { oss << " \"mznlib\": \"" << Printer::escapeStringLit(mznlib()) << "\",\n"; } if (!executable().empty()) { oss << " \"executable\": \"" << Printer::escapeStringLit(executable()) << "\",\n"; } oss << " \"mznlibVersion\": " << mznlibVersion() << ",\n"; if (!description().empty()) { oss << " \"description\": \"" << Printer::escapeStringLit(description()) << "\",\n"; } if (!contact().empty()) { oss << " \"contact\": \"" << Printer::escapeStringLit(contact()) << "\",\n"; } if (!website().empty()) { oss << " \"website\": \"" << Printer::escapeStringLit(website()) << "\",\n"; } if (!requiredFlags().empty()) { oss << " \"requiredFlags\": ["; for (unsigned int j = 0; j < requiredFlags().size(); j++) { oss << "\"" << requiredFlags()[j] << "\""; if (j < requiredFlags().size() - 1) { oss << ","; } } oss << "],\n"; } if (!stdFlags().empty()) { oss << " \"stdFlags\": ["; for (unsigned int j = 0; j < stdFlags().size(); j++) { oss << "\"" << stdFlags()[j] << "\""; if (j < stdFlags().size() - 1) { oss << ","; } } oss << "],\n"; } if (!extraFlags().empty()) { oss << " \"extraFlags\": ["; for (unsigned int j = 0; j < extraFlags().size(); j++) { oss << "\n [" << "\"" << Printer::escapeStringLit(extraFlags()[j].flag) << "\",\"" << Printer::escapeStringLit(extraFlags()[j].description) << "\",\""; switch (extraFlags()[j].flagType) { case ExtraFlag::FlagType::T_BOOL: oss << "bool"; break; case ExtraFlag::FlagType::T_INT: oss << "int"; break; case ExtraFlag::FlagType::T_FLOAT: oss << "float"; break; case ExtraFlag::FlagType::T_STRING: oss << (extraFlags()[j].range.empty() ? "string" : "opt"); break; } for (const auto& v : extraFlags()[j].range) { oss << ":" << Printer::escapeStringLit(v); } oss << "\",\"" << Printer::escapeStringLit(extraFlags()[j].defaultValue) << "\"]"; if (j < extraFlags().size() - 1) { oss << ","; } } oss << "\n ],\n"; } if (!tags().empty()) { oss << " \"tags\": ["; for (unsigned int j = 0; j < tags().size(); j++) { oss << "\"" << Printer::escapeStringLit(tags()[j]) << "\""; if (j < tags().size() - 1) { oss << ","; } } oss << "],\n"; } oss << " \"supportsMzn\": " << (supportsMzn() ? "true" : "false") << ",\n"; oss << " \"supportsFzn\": " << (supportsFzn() ? "true" : "false") << ",\n"; oss << " \"supportsNL\": " << (supportsNL() ? "true" : "false") << ",\n"; oss << " \"needsSolns2Out\": " << (needsSolns2Out() ? "true" : "false") << ",\n"; oss << " \"needsMznExecutable\": " << (needsMznExecutable() ? "true" : "false") << ",\n"; oss << " \"needsStdlibDir\": " << (needsStdlibDir() ? "true" : "false") << ",\n"; oss << " \"needsPathsFile\": " << (needsPathsFile() ? "true" : "false") << ",\n"; oss << " \"isGUIApplication\": " << (isGUIApplication() ? "true" : "false") << "\n"; oss << "}"; return oss.str(); } class BuiltinSolverConfigs { public: std::unordered_map builtinSolvers; }; BuiltinSolverConfigs& builtin_solver_configs() { static BuiltinSolverConfigs c; return c; } void SolverConfigs::addConfig(const MiniZinc::SolverConfig& sc) { int newIdx = static_cast(_solvers.size()); _solvers.push_back(sc); std::vector sc_tags = sc.tags(); std::string id = string_to_lower(sc.id()); std::string name = string_to_lower(sc.name()); sc_tags.push_back(id); size_t last_dot = id.find_last_of('.'); if (last_dot != std::string::npos) { std::string last_id = id.substr(last_dot + 1); if (last_id != name) { sc_tags.push_back(last_id); } } sc_tags.push_back(name); for (const auto& t : sc_tags) { auto it = _tags.find(t); if (it == _tags.end()) { _tags.insert(std::make_pair(t, std::vector({newIdx}))); } else { it->second.push_back(newIdx); } } } std::vector SolverConfigs::solverConfigsPath() const { return _solverPath; } SolverConfigs::SolverConfigs(std::ostream& log) { #ifdef _MSC_VER const char* PATHSEP = ";"; #else const char* PATHSEP = ":"; #endif std::string mzn_solver_path = get_env("MZN_SOLVER_PATH"); while (!mzn_solver_path.empty()) { size_t next_sep = mzn_solver_path.find(PATHSEP); string cur_path = mzn_solver_path.substr(0, next_sep); _solverPath.push_back(cur_path); if (next_sep != string::npos) { mzn_solver_path = mzn_solver_path.substr(next_sep + 1, string::npos); } else { mzn_solver_path = ""; } } std::string userConfigDir = FileUtils::user_config_dir(); if (FileUtils::directory_exists(userConfigDir + "/solvers")) { _solverPath.push_back(userConfigDir + "/solvers"); } std::vector configFiles( {FileUtils::global_config_file(), FileUtils::user_config_file()}); for (auto& cf : configFiles) { if (!cf.empty() && FileUtils::file_exists(cf)) { ostringstream errstream; try { Env userconfenv; Model* m = nullptr; if (JSONParser::fileIsJSON(cf)) { JSONParser jp(userconfenv.envi()); try { m = new Model; GCLock lock; jp.parse(m, cf, false); } catch (JSONError&) { delete m; m = nullptr; } } if (m != nullptr) { for (auto& i : *m) { if (auto* ai = i->dynamicCast()) { if (ai->id() == "mzn_solver_path") { std::vector sp = get_string_list(ai); for (const auto& s : sp) { _solverPath.push_back(s); } } else if (ai->id() == "mzn_lib_dir") { _mznlibDir = get_string(ai); } else if (ai->id() == "tagDefaults") { std::vector > tagDefs = get_string_pair_list(ai); for (auto& td : tagDefs) { std::string tag = td.first; std::string solver_id = td.second; _tagDefault[tag] = solver_id; } } else if (ai->id() == "solverDefaults") { std::vector > solverDefs = get_default_option_list(ai); for (auto& sd : solverDefs) { assert(sd.size() == 3); std::string solver = sd[0]; auto it = _solverDefaultOptions.find(solver); if (it == _solverDefaultOptions.end()) { std::vector solverOptions({sd[1], sd[2]}); _solverDefaultOptions.insert(std::make_pair(solver, solverOptions)); } else { std::vector& opts = it->second; bool found = false; for (unsigned int i = 0; i < opts.size(); i += 2) { if (opts[i] == sd[1]) { // Override existing option value opts[i + 1] = sd[2]; found = true; break; } } if (!found) { // Option didn't exist, add to end of list opts.push_back(sd[1]); opts.push_back(sd[2]); } } } } else { throw ConfigException("invalid configuration item"); } } else { throw ConfigException("invalid configuration item"); } } } else { std::cerr << errstream.str(); throw ConfigException("internal error"); } } catch (ConfigException& e) { log << "Warning: invalid configuration file: " << e.msg() << "\n"; } catch (Exception& e) { log << "Warning: invalid configuration file: " << e.what() << "\n"; } } } if (_mznlibDir.empty()) { _mznlibDir = FileUtils::file_path(FileUtils::share_directory()); } if (!_mznlibDir.empty()) { _solverPath.push_back(_mznlibDir + "/solvers"); } #ifndef _MSC_VER if (_mznlibDir != "/usr/local/share/minizinc" && FileUtils::directory_exists("/usr/local/share")) { _solverPath.emplace_back("/usr/local/share/minizinc/solvers"); } if (_mznlibDir != "/usr/share/minizinc" && FileUtils::directory_exists("/usr/share")) { _solverPath.emplace_back("/usr/share/minizinc/solvers"); } #endif } void SolverConfigs::populate(std::ostream& log) { for (const auto& sc : builtin_solver_configs().builtinSolvers) { addConfig(sc.second); } for (const string& cur_path : _solverPath) { std::vector configFiles = FileUtils::directory_list(cur_path, "msc"); for (auto& configFile : configFiles) { try { SolverConfig sc = SolverConfig::load(cur_path + "/" + configFile); addConfig(sc); } catch (ConfigException& e) { log << "Warning: error loading solver configuration from file " << cur_path << "/" << configFile << "\n"; log << "Error was:\n" << e.msg() << "\n"; } } } // Add default options to loaded solver configurations for (auto& sc : _solvers) { sc.defaultFlags(defaultOptions(sc.id())); } } vector SolverConfigs::solvers() const { // Find default solver, if present std::string def_id; auto def_it = _tagDefault.find(""); if (def_it != _tagDefault.end()) { def_id = def_it->second; } // Create sorted list of solvers vector s; for (const auto& sc : _solvers) { if (std::find(sc.tags().begin(), sc.tags().end(), "__internal__") != sc.tags().end()) { continue; } std::ostringstream oss; oss << sc.name() << " " << sc.version() << " (" << sc.id(); if (!def_id.empty() && sc.id() == def_id) { oss << ", default solver"; } for (const std::string& t : sc.tags()) { oss << ", " << t; } oss << ")"; s.push_back(oss.str()); } SortByLowercase sortByLowercase; std::sort(s.begin(), s.end(), sortByLowercase); return s; } std::string SolverConfigs::solverConfigsJSON() const { std::ostringstream oss; SortByName sortByName(_solvers); std::vector solversIdx(_solvers.size()); for (unsigned int i = 0; i < solversIdx.size(); i++) { solversIdx[i] = i; } std::sort(solversIdx.begin(), solversIdx.end(), sortByName); bool hadSolver = false; oss << "["; for (unsigned int i = 0; i < _solvers.size(); i++) { const SolverConfig& sc = _solvers[solversIdx[i]]; if (std::find(sc.tags().begin(), sc.tags().end(), "__internal__") != sc.tags().end()) { continue; } if (hadSolver) { oss << ","; } hadSolver = true; std::istringstream iss(sc.toJSON(*this)); std::string line; while (std::getline(iss, line)) { oss << "\n " << line; } } oss << "\n]\n"; return oss.str(); } namespace { std::string get_tag(const std::string& t) { return t.substr(0, t.find('@')); } std::string get_version(const std::string& t) { size_t sep = t.find('@'); return sep == string::npos ? "" : t.substr(sep + 1); } } // namespace const SolverConfig& SolverConfigs::config(const std::string& _s) { std::string s; if (_s.size() > 4 && _s.substr(_s.size() - 4) == ".msc") { SolverConfig sc = SolverConfig::load(_s); addConfig(sc); s = sc.id() + "@" + sc.version(); } else { s = _s; } s = string_to_lower(s); std::vector tags; std::istringstream iss(s); std::string next_s; while (std::getline(iss, next_s, ',')) { tags.push_back(next_s); } std::set defaultSolvers; std::set selectedSolvers; std::string firstTag; if (tags.empty()) { DefaultMap::const_iterator def_it = _tagDefault.find(""); if (def_it != _tagDefault.end()) { firstTag = def_it->second; } else { throw ConfigException("no solver selected"); } } else { firstTag = tags[0]; } TagMap::const_iterator tag_it = _tags.find(get_tag(firstTag)); if (tag_it == _tags.end()) { throw ConfigException("no solver with tag " + get_tag(firstTag) + " found"); } std::string tv = get_version(firstTag); for (int sidx : tag_it->second) { if (tv.empty() || tv == _solvers[sidx].version()) { selectedSolvers.insert(sidx); } } if (selectedSolvers.empty()) { // No matching version, only matching tag for (int sidx : tag_it->second) { selectedSolvers.insert(sidx); } } DefaultMap::const_iterator def_it = _tagDefault.find(get_tag(firstTag)); if (def_it != _tagDefault.end()) { defaultSolvers.insert(def_it->second); } for (unsigned int i = 1; i < tags.size(); i++) { tag_it = _tags.find(get_tag(tags[i])); if (tag_it == _tags.end()) { throw ConfigException("no solver with tag " + tags[i] + " found"); } tv = get_version(tags[i]); std::set newSolvers; for (int sidx : tag_it->second) { if (tv.empty() || tv == _solvers[sidx].version()) { newSolvers.insert(sidx); } } std::set intersection; std::set_intersection(selectedSolvers.begin(), selectedSolvers.end(), newSolvers.begin(), newSolvers.end(), std::inserter(intersection, intersection.begin())); selectedSolvers = intersection; if (selectedSolvers.empty()) { throw ConfigException("no solver with tags " + s + " found"); } def_it = _tagDefault.find(get_tag(tags[i])); if (def_it != _tagDefault.end()) { defaultSolvers.insert(def_it->second); } } int selectedSolver = -1; if (selectedSolvers.size() > 1) { // use default information for the tags to select a solver for (int sc_idx : selectedSolvers) { if (defaultSolvers.find(_solvers[sc_idx].id()) != defaultSolvers.end()) { selectedSolver = sc_idx; break; } } if (selectedSolver == -1) { selectedSolver = *selectedSolvers.begin(); } } else { selectedSolver = *selectedSolvers.begin(); } return _solvers[selectedSolver]; } std::vector SolverConfigs::defaultOptions(const std::string& id) { auto it = _solverDefaultOptions.find(id); if (it != _solverDefaultOptions.end()) { std::vector defaultOptions; for (const auto& df : it->second) { if (!df.empty()) { defaultOptions.push_back(df); } } return defaultOptions; } return {}; } void SolverConfigs::registerBuiltinSolver(const SolverConfig& sc) { builtin_solver_configs().builtinSolvers.insert(make_pair(sc.id(), sc)); } } // namespace MiniZinc libminizinc-2.5.3/lib/copy.cpp0000644000175000017500000004354513757304533014737 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include namespace MiniZinc { void CopyMap::insert(Expression* e0, Expression* e1) { if (!e0->isUnboxedVal() && !e1->isUnboxedVal()) { _nodeMap.insert(e0, e1); } } Expression* CopyMap::find(Expression* e) { return static_cast(_nodeMap.find(e)); } void CopyMap::insert(Item* e0, Item* e1) { _nodeMap.insert(e0, e1); } Item* CopyMap::find(Item* e) { return static_cast(_nodeMap.find(e)); } void CopyMap::insert(Model* e0, Model* e1) { _modelMap.insert(std::make_pair(e0, e1)); } Model* CopyMap::find(Model* e) { auto it = _modelMap.find(e); if (it == _modelMap.end()) { return nullptr; } return it->second; } void CopyMap::insert(IntSetVal* e0, IntSetVal* e1) { _nodeMap.insert(e0, e1); } IntSetVal* CopyMap::find(IntSetVal* e) { return static_cast(_nodeMap.find(e)); } void CopyMap::insert(FloatSetVal* e0, FloatSetVal* e1) { _nodeMap.insert(e0, e1); } FloatSetVal* CopyMap::find(FloatSetVal* e) { return static_cast(_nodeMap.find(e)); } Location copy_location(CopyMap& m, const Location& _loc) { return _loc; } Location copy_location(CopyMap& m, Expression* e) { return copy_location(m, e->loc()); } Location copy_location(CopyMap& m, Item* i) { return copy_location(m, i->loc()); } void copy_ann(EnvI& env, CopyMap& m, Annotation& oldAnn, Annotation& newAnn, bool followIds, bool copyFundecls, bool isFlatModel); Expression* copy(EnvI& env, CopyMap& m, Expression* e, bool followIds, bool copyFundecls, bool isFlatModel) { if (e == nullptr) { return nullptr; } if (Expression* cached = m.find(e)) { return cached; } Expression* ret = nullptr; switch (e->eid()) { case Expression::E_INTLIT: { IntLit* c = IntLit::a(e->cast()->v()); m.insert(e, c); ret = c; } break; case Expression::E_FLOATLIT: { FloatLit* c = FloatLit::a(e->cast()->v()); m.insert(e, c); ret = c; } break; case Expression::E_SETLIT: { auto* s = e->cast(); auto* c = new SetLit(copy_location(m, e), static_cast(nullptr)); m.insert(e, c); if (s->isv() != nullptr) { IntSetVal* isv; if (IntSetVal* isvc = m.find(s->isv())) { isv = isvc; } else { IntSetRanges r(s->isv()); isv = IntSetVal::ai(r); m.insert(s->isv(), isv); } c->isv(isv); } else if (s->fsv() != nullptr) { FloatSetVal* fsv; if (FloatSetVal* fsvc = m.find(s->fsv())) { fsv = fsvc; } else { FloatSetRanges r(s->fsv()); fsv = FloatSetVal::ai(r); m.insert(s->fsv(), fsv); } c->fsv(fsv); } else { if (ASTExprVecO* ve = m.find(s->v())) { c->v(ASTExprVec(ve)); } else { std::vector elems(s->v().size()); for (unsigned int i = s->v().size(); (i--) != 0U;) { elems[i] = copy(env, m, s->v()[i], followIds, copyFundecls, isFlatModel); } ASTExprVec ce(elems); m.insert(s->v(), ce); c->v(ce); } } c->type(s->type()); ret = c; } break; case Expression::E_BOOLLIT: { ret = e; } break; case Expression::E_STRINGLIT: { auto* sl = e->cast(); auto* c = new StringLit(copy_location(m, e), sl->v()); m.insert(e, c); ret = c; } break; case Expression::E_ID: { if (e == constants().absent) { return e; } Id* id = e->cast(); if (followIds) { Id* prevId = id; Expression* cur = e; bool done = false; do { if (cur == nullptr) { cur = prevId; done = true; } else { switch (cur->eid()) { case Expression::E_ID: prevId = cur->cast(); cur = prevId->decl(); break; case Expression::E_VARDECL: if (cur->cast()->e() != nullptr) { cur = cur->cast()->e(); } else { cur = prevId; done = true; } break; default: done = true; } } } while (!done); if (!cur->isa()) { return copy(env, m, cur, false); } Id* curId = cur->cast(); if (id->decl() != nullptr) { if (Expression* cached = m.find(id->decl())) { return cached->cast()->id(); } } return curId; } Id* c; if (id->decl() != nullptr) { auto* vd = static_cast(copy(env, m, id->decl(), followIds, copyFundecls, isFlatModel)); c = vd->id(); } else { if (id->idn() != -1) { c = new Id(copy_location(m, e), id->idn(), nullptr); } else { c = new Id(copy_location(m, e), id->v(), nullptr); } } m.insert(e, c); ret = c; } break; case Expression::E_ANON: { auto* c = new AnonVar(copy_location(m, e)); m.insert(e, c); ret = c; } break; case Expression::E_ARRAYLIT: { auto* al = e->cast(); std::vector> dims(al->dims()); for (unsigned int i = 0; i < dims.size(); i++) { dims[i].first = al->min(i); dims[i].second = al->max(i); } if (ArrayLit* sliceView = al->getSliceLiteral()) { ASTIntVec dimsInternal = al->dimsInternal(); unsigned int sliceDims = sliceView->dims(); unsigned int dimsOffset = al->dims() * 2; std::vector> slice(sliceDims); for (unsigned int i = 0; i < sliceDims; i++) { slice[i].first = dimsInternal[dimsOffset + i * 2]; slice[i].second = dimsInternal[dimsOffset + i * 2 + 1]; } auto* c = new ArrayLit( copy_location(m, e), copy(env, m, sliceView, followIds, copyFundecls, isFlatModel)->cast(), dims, slice); m.insert(e, c); ret = c; } else { auto* c = new ArrayLit(copy_location(m, e), std::vector(), dims); m.insert(e, c); ASTExprVecO* v; if (ASTExprVecO* cv = m.find(al->getVec())) { v = cv; } else { std::vector elems(al->size()); for (unsigned int i = al->size(); (i--) != 0U;) { elems[i] = copy(env, m, (*al)[i], followIds, copyFundecls, isFlatModel); } ASTExprVec ce(elems); m.insert(al->getVec(), ce); v = ce.vec(); } c->setVec(ASTExprVec(v)); ret = c; } } break; case Expression::E_ARRAYACCESS: { auto* aa = e->cast(); auto* c = new ArrayAccess(copy_location(m, e), nullptr, std::vector()); m.insert(e, c); ASTExprVecO* idx; if (ASTExprVecO* cidx = m.find(aa->idx())) { idx = cidx; } else { std::vector elems(aa->idx().size()); for (unsigned int i = aa->idx().size(); (i--) != 0U;) { elems[i] = copy(env, m, aa->idx()[i], followIds, copyFundecls, isFlatModel); } ASTExprVec ce(elems); m.insert(aa->idx(), ce); idx = ce.vec(); } c->v(copy(env, m, aa->v(), followIds, copyFundecls, isFlatModel)); c->idx(ASTExprVec(idx)); ret = c; } break; case Expression::E_COMP: { auto* c = e->cast(); Generators g; auto* cc = new Comprehension(copy_location(m, e), nullptr, g, c->set()); m.insert(c, cc); for (int i = 0; i < c->numberOfGenerators(); i++) { std::vector vv; for (int j = 0; j < c->numberOfDecls(i); j++) { vv.push_back(static_cast( copy(env, m, c->decl(i, j), followIds, copyFundecls, isFlatModel))); // Comprehension VarDecl should not be assigned to a particular value when copying the // full comprehension assert(!c->decl(i, j)->e()); } g.g.emplace_back(vv, copy(env, m, c->in(i), followIds, copyFundecls, isFlatModel), copy(env, m, c->where(i), followIds, copyFundecls, isFlatModel)); } cc->init(copy(env, m, c->e(), followIds, copyFundecls, isFlatModel), g); ret = cc; } break; case Expression::E_ITE: { ITE* ite = e->cast(); ITE* c = new ITE(copy_location(m, e), std::vector(), nullptr); m.insert(e, c); std::vector ifthen(2 * ite->size()); for (unsigned int i = ite->size(); (i--) != 0U;) { ifthen[2 * i] = copy(env, m, ite->ifExpr(i), followIds, copyFundecls, isFlatModel); ifthen[2 * i + 1] = copy(env, m, ite->thenExpr(i), followIds, copyFundecls, isFlatModel); } c->init(ifthen, copy(env, m, ite->elseExpr(), followIds, copyFundecls, isFlatModel)); ret = c; } break; case Expression::E_BINOP: { auto* b = e->cast(); auto* c = new BinOp(copy_location(m, e), nullptr, b->op(), nullptr); if (b->decl() != nullptr) { if (copyFundecls) { c->decl(Item::cast(copy(env, m, b->decl()))); } else { c->decl(b->decl()); } } m.insert(e, c); c->lhs(copy(env, m, b->lhs(), followIds, copyFundecls, isFlatModel)); c->rhs(copy(env, m, b->rhs(), followIds, copyFundecls, isFlatModel)); ret = c; } break; case Expression::E_UNOP: { UnOp* b = e->cast(); UnOp* c = new UnOp(copy_location(m, e), b->op(), nullptr); if (b->decl() != nullptr) { if (copyFundecls) { c->decl(Item::cast(copy(env, m, b->decl()))); } else { c->decl(b->decl()); } } m.insert(e, c); c->e(copy(env, m, b->e(), followIds, copyFundecls, isFlatModel)); ret = c; } break; case Expression::E_CALL: { Call* ca = e->cast(); Call* c = new Call(copy_location(m, e), ca->id(), std::vector()); if (ca->decl() != nullptr) { if (copyFundecls) { c->decl(Item::cast(copy(env, m, ca->decl()))); } else { c->decl(ca->decl()); } } m.insert(e, c); std::vector args(ca->argCount()); for (auto i = static_cast(args.size()); (i--) != 0U;) { args[i] = copy(env, m, ca->arg(i), followIds, copyFundecls, isFlatModel); } c->args(args); ret = c; } break; case Expression::E_VARDECL: { auto* vd = e->cast(); VarDecl* c; if (vd->id()->hasStr()) { c = new VarDecl(copy_location(m, e), nullptr, vd->id()->v(), nullptr); } else { c = new VarDecl(copy_location(m, e), nullptr, vd->id()->idn(), nullptr); } c->toplevel(vd->toplevel()); c->introduced(vd->introduced()); if (isFlatModel && vd->flat() == vd) { c->flat(c); } else { c->flat(vd->flat()); } c->payload(vd->payload()); m.insert(e, c); m.insert(c, c); c->ti(static_cast(copy(env, m, vd->ti(), followIds, copyFundecls, isFlatModel))); c->e(copy(env, m, vd->e(), followIds, copyFundecls, isFlatModel)); c->type(c->ti()->type()); c->id()->type(c->type()); ret = c; } break; case Expression::E_LET: { Let* l = e->cast(); std::vector let(l->let().size()); for (unsigned int i = l->let().size(); (i--) != 0U;) { let[i] = copy(env, m, l->let()[i], followIds, copyFundecls, isFlatModel); } Let* c = new Let(copy_location(m, e), let, copy(env, m, l->in(), followIds, copyFundecls, isFlatModel)); for (unsigned int i = l->_letOrig.size(); (i--) != 0U;) { c->_letOrig[i] = copy(env, m, l->_letOrig[i], followIds, copyFundecls, isFlatModel); } m.insert(e, c); ret = c; } break; case Expression::E_TI: { auto* t = e->cast(); ASTExprVecO* r; if (t->ranges().size() == 0) { r = nullptr; } else if (ASTExprVecO* cr = m.find(t->ranges())) { r = cr; } else { std::vector rr(t->ranges().size()); for (unsigned int i = t->ranges().size(); (i--) != 0U;) { rr[i] = static_cast( copy(env, m, t->ranges()[i], followIds, copyFundecls, isFlatModel)); } r = ASTExprVecO::a(rr); } auto* c = new TypeInst(copy_location(m, e), t->type(), ASTExprVec(r), copy(env, m, t->domain(), followIds, copyFundecls, isFlatModel)); c->setIsEnum(t->isEnum()); m.insert(e, c); ret = c; } break; case Expression::E_TIID: { TIId* t = e->cast(); TIId* c = new TIId(copy_location(m, e), t->v()); m.insert(e, c); ret = c; } break; default: assert(false); } if (!ret->isa() || ret->cast()->decl() == nullptr) { ret->type(e->type()); } copy_ann(env, m, e->ann(), ret->ann(), followIds, copyFundecls, isFlatModel); return ret; } void copy_ann(EnvI& env, CopyMap& m, Annotation& oldAnn, Annotation& newAnn, bool followIds, bool copyFundecls, bool isFlatModel) { for (ExpressionSetIter it = oldAnn.begin(); it != oldAnn.end(); ++it) { newAnn.add(copy(env, m, *it, followIds, copyFundecls, isFlatModel)); } } Expression* copy(EnvI& env, Expression* e, bool followIds, bool copyFundecls, bool isFlatModel) { CopyMap m; return copy(env, m, e, followIds, copyFundecls, isFlatModel); } Item* copy(EnvI& env, CopyMap& m, Item* i, bool followIds, bool copyFundecls, bool isFlatModel) { if (i == nullptr) { return nullptr; } if (Item* cached = m.find(i)) { return cached; } switch (i->iid()) { case Item::II_INC: { auto* ii = i->cast(); auto* c = new IncludeI(copy_location(m, i), ii->f()); m.insert(i, c); c->m(copy(env, m, ii->m()), ii->own()); return c; } case Item::II_VD: { auto* v = i->cast(); auto* c = new VarDeclI(copy_location(m, i), nullptr); m.insert(i, c); c->e(static_cast(copy(env, m, v->e(), followIds, copyFundecls, isFlatModel))); return c; } case Item::II_ASN: { auto* a = i->cast(); auto* c = new AssignI(copy_location(m, i), a->id(), nullptr); m.insert(i, c); c->e(copy(env, m, a->e(), followIds, copyFundecls, isFlatModel)); c->decl(static_cast(copy(env, m, a->decl(), followIds, copyFundecls, isFlatModel))); return c; } case Item::II_CON: { auto* cc = i->cast(); auto* c = new ConstraintI(copy_location(m, i), nullptr); m.insert(i, c); c->e(copy(env, m, cc->e(), followIds, copyFundecls, isFlatModel)); return c; } case Item::II_SOL: { auto* s = i->cast(); SolveI* c; switch (s->st()) { case SolveI::ST_SAT: c = SolveI::sat(Location()); break; case SolveI::ST_MIN: c = SolveI::min(Location(), copy(env, m, s->e(), followIds, copyFundecls, isFlatModel)); break; case SolveI::ST_MAX: c = SolveI::max(Location(), copy(env, m, s->e(), followIds, copyFundecls, isFlatModel)); break; } copy_ann(env, m, s->ann(), c->ann(), followIds, copyFundecls, isFlatModel); m.insert(i, c); return c; } case Item::II_OUT: { auto* o = i->cast(); auto* c = new OutputI(copy_location(m, i), copy(env, m, o->e(), followIds, copyFundecls, isFlatModel)); m.insert(i, c); return c; } case Item::II_FUN: { auto* f = i->cast(); std::vector params(f->params().size()); for (unsigned int j = f->params().size(); (j--) != 0U;) { params[j] = static_cast( copy(env, m, f->params()[j], followIds, copyFundecls, isFlatModel)); } auto* c = new FunctionI( copy_location(m, i), f->id(), static_cast(copy(env, m, f->ti(), followIds, copyFundecls, isFlatModel)), params, copy(env, m, f->e(), followIds, copyFundecls, isFlatModel)); c->builtins.e = f->builtins.e; c->builtins.i = f->builtins.i; c->builtins.f = f->builtins.f; c->builtins.b = f->builtins.b; c->builtins.s = f->builtins.s; c->builtins.str = f->builtins.str; copy_ann(env, m, f->ann(), c->ann(), followIds, copyFundecls, isFlatModel); m.insert(i, c); return c; } default: assert(false); return nullptr; } } Item* copy(EnvI& env, Item* i, bool followIds, bool copyFundecls, bool isFlatModel) { CopyMap m; return copy(env, m, i, followIds, copyFundecls, isFlatModel); } Model* copy(EnvI& env, CopyMap& cm, Model* m, bool isFlatModel) { if (m == nullptr) { return nullptr; } if (Model* cached = cm.find(m)) { return cached; } auto* c = new Model; for (auto& i : *m) { c->addItem(copy(env, cm, i, false, true)); } for (auto& it : m->_fnmap) { for (auto& i : it.second) { c->registerFn(env, copy(env, cm, i.fi, false, true, isFlatModel)->cast()); } } cm.insert(m, c); return c; } Model* copy(EnvI& env, Model* m) { CopyMap cm; return copy(env, cm, m); } } // namespace MiniZinc libminizinc-2.5.3/lib/aststring.cpp0000644000175000017500000000412713757304533015774 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #ifndef HAS_MEMCPY_S namespace { void memcpy_s(char* dest, size_t /*size*/, const char* src, size_t count) { memcpy(dest, src, count); } } // namespace #endif namespace MiniZinc { int ASTString::levenshteinDistance(const ASTString& other) const { int m = size(); int n = other.size(); const char* s = c_str(); const char* t = other.c_str(); assert(m > 0); assert(n > 0); // dynamic programming matrix std::vector dp0(n + 1); std::vector dp1(n + 1, 0); // initialise matrix for (int i = 0; i <= n; i++) { dp0[i] = i; } for (int i = 1; i <= m; i++) { dp1[0] = i; for (int j = 1; j <= n; j++) { int del = dp0[j] + 1; int ins = dp1[j - 1] + 1; int sub = dp0[j - 1] + static_cast(s[i - 1] != t[j - 1]); dp1[j] = std::min(del, std::min(ins, sub)); } std::swap(dp0, dp1); } return dp0[n]; } ASTStringData::Interner& ASTStringData::interner() { static Interner _interner; return _interner; } ASTStringData::ASTStringData(const std::string& s) : ASTChunk(s.size() + sizeof(size_t) + 1, ASTNode::NID_STR) { memcpy_s(_data + sizeof(size_t), s.size() + 1, s.c_str(), s.size()); *(_data + sizeof(size_t) + s.size()) = 0; std::hash h; reinterpret_cast(_data)[0] = h(s); } ASTStringData* ASTStringData::a(const std::string& s) { if (s.empty()) { return nullptr; } auto it = interner().find({s.c_str(), s.size()}); if (it != interner().end()) { return it->second; } auto* as = static_cast(alloc(1 + sizeof(size_t) + s.size())); new (as) ASTStringData(s); interner().emplace(std::make_pair(as->c_str(), as->size()), as); return as; } } // namespace MiniZinc libminizinc-2.5.3/lib/output.cpp0000644000175000017500000014245513757304533015325 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include namespace MiniZinc { namespace { // Test if all parameters and the return type are par bool is_completely_par(EnvI& env, FunctionI* fi, const std::vector& tv) { if (fi->e() != nullptr) { // This is not a builtin, so check parameters for (auto* p : fi->params()) { if (p->type().isvar()) { return false; } } } return fi->rtype(env, tv, false).isPar(); } } // namespace void check_output_par_fn(EnvI& env, Call* rhs) { std::vector tv(rhs->argCount()); for (unsigned int i = rhs->argCount(); (i--) != 0U;) { tv[i] = rhs->arg(i)->type(); tv[i].ti(Type::TI_PAR); } FunctionI* decl = env.output->matchFn(env, rhs->id(), tv, false); if (decl == nullptr) { FunctionI* origdecl = env.model->matchFn(env, rhs->id(), tv, false); if (origdecl == nullptr || !is_completely_par(env, origdecl, tv)) { std::ostringstream ss; ss << "function " << rhs->id() << " is used in output, par version needed"; throw FlatteningError(env, rhs->loc(), ss.str()); } if (!origdecl->fromStdLib()) { decl = copy(env, env.cmap, origdecl)->cast(); CollectOccurrencesE ce(env.outputVarOccurrences, decl); top_down(ce, decl->e()); top_down(ce, decl->ti()); for (unsigned int i = decl->params().size(); (i--) != 0U;) { top_down(ce, decl->params()[i]); } (void)env.output->registerFn(env, decl, true); env.output->addItem(decl); } else { decl = origdecl; } } rhs->type(decl->rtype(env, tv, false)); rhs->decl(decl); } bool cannot_use_rhs_for_output(EnvI& env, Expression* e, std::unordered_set& seen_functions) { if (e == nullptr) { return true; } class V : public EVisitor { public: EnvI& env; std::unordered_set& seenFunctions; bool success; V(EnvI& env0, std::unordered_set& seenFunctions0) : env(env0), seenFunctions(seenFunctions0), success(true) {} /// Visit anonymous variable void vAnonVar(const AnonVar& /*v*/) { success = false; } /// Visit array literal void vArrayLit(const ArrayLit& /*al*/) {} /// Visit array access void vArrayAccess(const ArrayAccess& /*aa*/) {} /// Visit array comprehension void vComprehension(const Comprehension& /*c*/) {} /// Visit if-then-else void vITE(const ITE& /*ite*/) {} /// Visit binary operator void vBinOp(const BinOp& /*bo*/) {} /// Visit unary operator void vUnOp(const UnOp& /*uo*/) {} /// Visit call void vCall(Call& c) { std::vector tv(c.argCount()); for (unsigned int i = c.argCount(); (i--) != 0U;) { tv[i] = c.arg(i)->type(); tv[i].ti(Type::TI_PAR); } FunctionI* decl = env.output->matchFn(env, c.id(), tv, false); Type t; if (decl == nullptr) { FunctionI* origdecl = env.model->matchFn(env, c.id(), tv, false); if (origdecl == nullptr) { std::ostringstream ss; ss << "function " << c.id() << " is used in output, par version needed"; throw FlatteningError(env, c.loc(), ss.str()); } bool seen = (seenFunctions.find(origdecl) != seenFunctions.end()); if (seen) { success = false; } else { seenFunctions.insert(origdecl); if ((origdecl->e() != nullptr) && cannot_use_rhs_for_output(env, origdecl->e(), seenFunctions)) { success = false; } else { if (!origdecl->fromStdLib()) { decl = copy(env, env.cmap, origdecl)->cast(); CollectOccurrencesE ce(env.outputVarOccurrences, decl); top_down(ce, decl->e()); top_down(ce, decl->ti()); for (unsigned int i = decl->params().size(); (i--) != 0U;) { top_down(ce, decl->params()[i]); } (void)env.output->registerFn(env, decl, true); env.output->addItem(decl); output_vardecls(env, origdecl, decl->e()); output_vardecls(env, origdecl, decl->ti()); } else { decl = origdecl; } c.decl(decl); } } } if (success) { t = decl->rtype(env, tv, false); if (!t.isPar()) { success = false; } } } void vId(const Id& /*id*/) {} /// Visit let void vLet(const Let& /*let*/) { success = false; } /// Visit variable declaration void vVarDecl(const VarDecl& /*vd*/) {} /// Visit type inst void vTypeInst(const TypeInst& /*ti*/) {} /// Visit TIId void vTIId(const TIId& /*tiid*/) {} /// Determine whether to enter node bool enter(Expression* /*e*/) const { return success; } } _v(env, seen_functions); top_down(_v, e); return !_v.success; } bool cannot_use_rhs_for_output(EnvI& env, Expression* e) { std::unordered_set seen_functions; return cannot_use_rhs_for_output(env, e, seen_functions); } void remove_is_output(VarDecl* vd) { if (vd == nullptr) { return; } vd->ann().remove(constants().ann.output_var); vd->ann().removeCall(constants().ann.output_array); } void copy_output(EnvI& e) { struct CopyOutput : public EVisitor { EnvI& env; CopyOutput(EnvI& env0) : env(env0) {} static void vId(Id& _id) { _id.decl(_id.decl()->flat()); } void vCall(Call& c) { std::vector tv(c.argCount()); for (unsigned int i = c.argCount(); (i--) != 0U;) { tv[i] = c.arg(i)->type(); tv[i].ti(Type::TI_PAR); } FunctionI* decl = c.decl(); if (!decl->fromStdLib()) { env.flatAddItem(decl); } } }; if (OutputI* oi = e.model->outputItem()) { GCLock lock; auto* noi = copy(e, oi)->cast(); CopyOutput co(e); top_down(co, noi->e()); e.flatAddItem(noi); } } void cleanup_output(EnvI& env) { for (auto& i : *env.output) { if (auto* vdi = i->dynamicCast()) { vdi->e()->flat(nullptr); } } } void make_par(EnvI& env, Expression* e) { class OutputJSON : public EVisitor { public: EnvI& env; OutputJSON(EnvI& env0) : env(env0) {} void vCall(Call& c) { if (c.id() == "outputJSON") { bool outputObjective = (c.argCount() == 1 && eval_bool(env, c.arg(0))); c.id(ASTString("array1d")); Expression* json = copy(env, env.cmap, create__json_output(env, outputObjective, false, false)); std::vector new_args({json}); new_args[0]->type(Type::parstring(1)); c.args(new_args); } } } _outputJSON(env); top_down(_outputJSON, e); class Par : public EVisitor { public: /// Visit variable declaration static void vVarDecl(VarDecl& vd) { vd.ti()->type(vd.type()); } /// Determine whether to enter node static bool enter(Expression* e) { Type t = e->type(); t.ti(Type::TI_PAR); t.cv(false); e->type(t); return true; } } _par; top_down(_par, e); class Decls : public EVisitor { public: EnvI& env; Decls(EnvI& env0) : env(env0) {} void vCall(Call& c) { if (c.id() == "format" || c.id() == "show" || c.id() == "showDzn" || c.id() == "showJSON") { unsigned int enumId = c.arg(c.argCount() - 1)->type().enumId(); if (enumId != 0U && c.arg(c.argCount() - 1)->type().dim() != 0) { const std::vector& enumIds = env.getArrayEnum(enumId); enumId = enumIds[enumIds.size() - 1]; } if (enumId > 0) { GCLock lock; Expression* obj = c.arg(c.argCount() - 1); Id* ti_id = env.getEnum(enumId)->e()->id(); std::string enumName = create_enum_to_string_name(ti_id, "_toString_"); bool is_json = c.id() == "showJSON"; const int dimensions = obj->type().dim(); if (is_json && dimensions > 1) { // Create generators for dimensions selection std::vector slice_dimensions(dimensions); std::vector generators; generators.reserve(dimensions - 1); auto* idx_ti = new TypeInst(Location().introduce(), Type::parint()); for (int i = 0; i < dimensions - 1; ++i) { auto* idx_i = new VarDecl(Location().introduce(), idx_ti, env.genId()); idx_i->toplevel(false); Call* index_set_xx = new Call( Location().introduce(), "index_set_" + std::to_string(i + 1) + "of" + std::to_string(dimensions), {obj}); index_set_xx->type(Type::parsetint()); generators.push_back(Generator({idx_i}, index_set_xx, nullptr)); slice_dimensions[i] = new BinOp(Location().introduce(), idx_i->id(), BOT_DOTDOT, idx_i->id()); slice_dimensions[i]->type(Type::parsetint()); } // Construct innermost slicing operation Call* index_set_n = new Call( Location().introduce(), "index_set_" + std::to_string(dimensions) + "of" + std::to_string(dimensions), {obj}); index_set_n->type(Type::parsetint()); slice_dimensions[dimensions - 1] = index_set_n; auto* al_slice_dim = new ArrayLit(Location().introduce(), slice_dimensions); al_slice_dim->type(Type::parsetint(1)); auto* slice_call = new Call(Location().introduce(), "slice_1d", {obj, al_slice_dim, index_set_n}); Type tt = obj->type(); tt.dim(1); slice_call->type(tt); Call* _toString_ENUM = new Call(Location().introduce(), enumName, {slice_call, constants().boollit(false), constants().boollit(true)}); _toString_ENUM->type(Type::parstring()); // Build multi-level JSON Array string auto* comma = new StringLit(Location().introduce(), ", "); comma->type(Type::parstring()); auto join = [&](Expression* expr, Generator gen) -> Expression* { Generators generators; generators.g.push_back(gen); auto* comp = new Comprehension(Location().introduce(), expr, generators, false); comp->type(Type::parstring(1)); Call* cc = new Call(Location().introduce(), "join", {comma, comp}); cc->type(Type::parstring()); return cc; }; auto* sl_open = new StringLit(Location().introduce(), "["); sl_open->type(Type::parstring()); auto* sl_close = new StringLit(Location().introduce(), "]"); sl_close->type(Type::parstring()); auto* al_concat = new ArrayLit( Location().introduce(), std::vector( {sl_open, join(_toString_ENUM, generators[dimensions - 2]), sl_close})); al_concat->type(Type::parstring(1)); for (int i = dimensions - 3; i >= 0; --i) { Call* concat = new Call(Location().introduce(), "concat", {al_concat}); concat->type(Type::parstring()); al_concat = new ArrayLit( Location().introduce(), std::vector({sl_open, join(concat, generators[i]), sl_close})); al_concat->type(Type::parstring(1)); } std::vector args = {al_concat}; c.args(args); c.id(ASTString("concat")); } else { std::vector args = {obj, constants().boollit(c.id() == "showDzn"), constants().boollit(is_json)}; c.args(args); c.id(ASTString(enumName)); } } if (c.id() == "showDzn" || (c.id() == "showJSON" && enumId > 0)) { c.id(constants().ids.show); } } c.decl(env.model->matchFn(env, &c, false)); } void vBinOp(BinOp& bo) { std::vector args = {bo.lhs(), bo.rhs()}; bo.decl(env.model->matchFn(env, bo.opToString(), args, false)); } void vUnop(UnOp& uo) { std::vector args = {uo.e()}; uo.decl(env.model->matchFn(env, uo.opToString(), args, false)); } } _decls(env); top_down(_decls, e); } void check_rename_var(EnvI& e, VarDecl* vd) { if (vd->id()->idn() != vd->flat()->id()->idn()) { auto* vd_rename_ti = copy(e, e.cmap, vd->ti())->cast(); auto* vd_rename = new VarDecl(Location().introduce(), vd_rename_ti, vd->flat()->id()->idn(), nullptr); vd_rename->flat(vd->flat()); make_par(e, vd_rename); vd->e(vd_rename->id()); e.output->addItem(new VarDeclI(Location().introduce(), vd_rename)); } } class ClearAnnotations { public: /// Push all elements of \a v onto \a stack template static void pushVec(std::vector& stack, ASTExprVec v) { for (unsigned int i = 0; i < v.size(); i++) { stack.push_back(v[i]); } } static void run(Expression* root) { std::vector stack; stack.push_back(root); while (!stack.empty()) { Expression* e = stack.back(); stack.pop_back(); if (e == nullptr) { continue; } e->ann().clear(); switch (e->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ID: case Expression::E_ANON: case Expression::E_TIID: break; case Expression::E_SETLIT: pushVec(stack, e->template cast()->v()); break; case Expression::E_ARRAYLIT: for (unsigned int i = 0; i < e->cast()->size(); i++) { stack.push_back((*e->cast())[i]); } break; case Expression::E_ARRAYACCESS: pushVec(stack, e->template cast()->idx()); stack.push_back(e->template cast()->v()); break; case Expression::E_COMP: { auto* comp = e->template cast(); for (unsigned int i = comp->numberOfGenerators(); (i--) != 0U;) { stack.push_back(comp->where(i)); stack.push_back(comp->in(i)); for (unsigned int j = comp->numberOfDecls(i); (j--) != 0U;) { stack.push_back(comp->decl(i, j)); } } stack.push_back(comp->e()); } break; case Expression::E_ITE: { ITE* ite = e->template cast(); stack.push_back(ite->elseExpr()); for (int i = 0; i < ite->size(); i++) { stack.push_back(ite->ifExpr(i)); stack.push_back(ite->thenExpr(i)); } } break; case Expression::E_BINOP: stack.push_back(e->template cast()->rhs()); stack.push_back(e->template cast()->lhs()); break; case Expression::E_UNOP: stack.push_back(e->template cast()->e()); break; case Expression::E_CALL: for (unsigned int i = 0; i < e->template cast()->argCount(); i++) { stack.push_back(e->template cast()->arg(i)); } break; case Expression::E_VARDECL: stack.push_back(e->template cast()->e()); stack.push_back(e->template cast()->ti()); break; case Expression::E_LET: stack.push_back(e->template cast()->in()); pushVec(stack, e->template cast()->let()); break; case Expression::E_TI: stack.push_back(e->template cast()->domain()); pushVec(stack, e->template cast()->ranges()); break; } } } }; void output_vardecls(EnvI& env, Item* ci, Expression* e) { class O : public EVisitor { public: EnvI& env; Item* ci; O(EnvI& env0, Item* ci0) : env(env0), ci(ci0) {} void vId(Id& id) { if (&id == constants().absent) { return; } if (!id.decl()->toplevel()) { return; } VarDecl* vd = id.decl(); VarDecl* reallyFlat = vd->flat(); while (reallyFlat != nullptr && reallyFlat != reallyFlat->flat()) { reallyFlat = reallyFlat->flat(); } auto idx = reallyFlat != nullptr ? env.outputFlatVarOccurrences.idx.find(reallyFlat->id()) : env.outputFlatVarOccurrences.idx.end(); auto idx2 = env.outputVarOccurrences.idx.find(vd->id()); if (idx == env.outputFlatVarOccurrences.idx.end() && idx2 == env.outputVarOccurrences.idx.end()) { auto* nvi = new VarDeclI(Location().introduce(), copy(env, env.cmap, vd)->cast()); Type t = nvi->e()->ti()->type(); if (t.ti() != Type::TI_PAR) { t.ti(Type::TI_PAR); } make_par(env, nvi->e()); nvi->e()->ti()->domain(nullptr); nvi->e()->flat(vd->flat()); ClearAnnotations::run(nvi->e()); nvi->e()->introduced(false); if (reallyFlat != nullptr) { env.outputFlatVarOccurrences.addIndex(reallyFlat, static_cast(env.output->size())); } env.outputVarOccurrences.addIndex(nvi, static_cast(env.output->size())); env.outputVarOccurrences.add(nvi->e(), ci); env.output->addItem(nvi); IdMap::iterator it; if ((it = env.reverseMappers.find(nvi->e()->id())) != env.reverseMappers.end()) { Call* rhs = copy(env, env.cmap, it->second())->cast(); check_output_par_fn(env, rhs); output_vardecls(env, nvi, it->second()); nvi->e()->e(rhs); } else if ((reallyFlat != nullptr) && cannot_use_rhs_for_output(env, reallyFlat->e())) { assert(nvi->e()->flat()); nvi->e()->e(nullptr); if (nvi->e()->type().dim() == 0) { reallyFlat->addAnnotation(constants().ann.output_var); } else { std::vector args(reallyFlat->e()->type().dim()); for (unsigned int i = 0; i < args.size(); i++) { if (nvi->e()->ti()->ranges()[i]->domain() == nullptr) { args[i] = new SetLit(Location().introduce(), eval_intset(env, reallyFlat->ti()->ranges()[i]->domain())); } else { args[i] = new SetLit(Location().introduce(), eval_intset(env, nvi->e()->ti()->ranges()[i]->domain())); } } auto* al = new ArrayLit(Location().introduce(), args); args.resize(1); args[0] = al; reallyFlat->addAnnotation( new Call(Location().introduce(), constants().ann.output_array, args)); } check_rename_var(env, nvi->e()); } else { output_vardecls(env, nvi, nvi->e()->ti()); output_vardecls(env, nvi, nvi->e()->e()); } CollectOccurrencesE ce(env.outputVarOccurrences, nvi); top_down(ce, nvi->e()); } } } _o(env, ci); top_down(_o, e); } void process_deletions(EnvI& e) { std::vector deletedVarDecls; for (unsigned int i = 0; i < e.output->size(); i++) { if (auto* vdi = (*e.output)[i]->dynamicCast()) { if (!vdi->removed() && e.outputVarOccurrences.occurrences(vdi->e()) == 0 && !vdi->e()->ann().contains(constants().ann.mzn_check_var) && !(vdi->e()->id()->idn() == -1 && (vdi->e()->id()->v() == "_mzn_solution_checker" || vdi->e()->id()->v() == "_mzn_stats_checker"))) { CollectDecls cd(e.outputVarOccurrences, deletedVarDecls, vdi); top_down(cd, vdi->e()->e()); remove_is_output(vdi->e()->flat()); if (e.outputVarOccurrences.find(vdi->e()) != -1) { e.outputVarOccurrences.remove(vdi->e()); } vdi->remove(); } } } while (!deletedVarDecls.empty()) { VarDecl* cur = deletedVarDecls.back(); deletedVarDecls.pop_back(); if (e.outputVarOccurrences.occurrences(cur) == 0) { auto cur_idx = e.outputVarOccurrences.idx.find(cur->id()); if (cur_idx != e.outputVarOccurrences.idx.end()) { auto* vdi = (*e.output)[cur_idx->second]->cast(); if (!vdi->removed()) { CollectDecls cd(e.outputVarOccurrences, deletedVarDecls, vdi); top_down(cd, cur->e()); remove_is_output(vdi->e()->flat()); if (e.outputVarOccurrences.find(vdi->e()) != -1) { e.outputVarOccurrences.remove(vdi->e()); } vdi->remove(); } } } } for (auto& it : e.outputVarOccurrences.itemMap) { std::vector toRemove; for (auto* iit : it.second) { if (iit->removed()) { toRemove.push_back(iit); } } for (auto& i : toRemove) { it.second.erase(i); } } } void create_dzn_output_item(EnvI& e, bool outputObjective, bool includeOutputItem, bool hasChecker, bool outputForChecker) { std::vector outputVars; class DZNOVisitor : public ItemVisitor { protected: EnvI& _e; bool _outputObjective; bool _includeOutputItem; bool _outputForChecker; std::vector& _outputVars; bool _hadAddToOutput; public: DZNOVisitor(EnvI& e, bool outputObjective, bool includeOutputItem, bool outputForChecker, std::vector& outputVars) : _e(e), _outputObjective(outputObjective), _includeOutputItem(includeOutputItem), _outputForChecker(outputForChecker), _outputVars(outputVars), _hadAddToOutput(false) {} void vVarDeclI(VarDeclI* vdi) { VarDecl* vd = vdi->e(); bool process_var = false; if (_outputForChecker) { if (vd->ann().contains(constants().ann.mzn_check_var)) { process_var = true; } } else { if (_outputObjective && vd->id()->idn() == -1 && vd->id()->v() == "_objective") { process_var = true; } else { if (vd->ann().contains(constants().ann.add_to_output)) { if (!_hadAddToOutput) { _outputVars.clear(); } _hadAddToOutput = true; process_var = true; } else { if (!_hadAddToOutput) { process_var = false; if (vd->type().isvar()) { if (vd->e() != nullptr) { if (auto* al = vd->e()->dynamicCast()) { for (unsigned int i = 0; i < al->size(); i++) { if ((*al)[i]->isa()) { process_var = true; break; } } } else if (vd->ann().contains(constants().ann.rhs_from_assignment)) { process_var = true; } } else { process_var = true; } } } } } } if (process_var) { std::ostringstream s; s << vd->id()->str() << " = "; bool needArrayXd = false; if (vd->type().dim() > 0) { ArrayLit* al = nullptr; if ((vd->flat() != nullptr) && (vd->flat()->e() != nullptr)) { al = eval_array_lit(_e, vd->flat()->e()); } else if (vd->e() != nullptr) { al = eval_array_lit(_e, vd->e()); } if (al->size() > 0) { needArrayXd = true; s << "array" << vd->type().dim() << "d("; for (int i = 0; i < vd->type().dim(); i++) { unsigned int enumId = (vd->type().enumId() != 0 ? _e.getArrayEnum(vd->type().enumId())[i] : 0); if (enumId != 0) { s << _e.getEnum(enumId)->e()->id()->str() << ", "; } else if (al != nullptr) { s << al->min(i) << ".." << al->max(i) << ", "; } else { IntSetVal* idxset = eval_intset(_e, vd->ti()->ranges()[i]->domain()); s << *idxset << ", "; } } } } auto* sl = new StringLit(Location().introduce(), s.str()); _outputVars.push_back(sl); std::vector showArgs(1); showArgs[0] = vd->id(); Call* show = new Call(Location().introduce(), ASTString("showDzn"), showArgs); show->type(Type::parstring()); FunctionI* fi = _e.model->matchFn(_e, show, false); assert(fi); show->decl(fi); _outputVars.push_back(show); std::string ends = needArrayXd ? ")" : ""; ends += ";\n"; auto* eol = new StringLit(Location().introduce(), ends); _outputVars.push_back(eol); } } void vOutputI(OutputI* oi) { if (_includeOutputItem) { _outputVars.push_back(new StringLit(Location().introduce(), "_output = ")); Call* concat = new Call(Location().introduce(), ASTString("concat"), {oi->e()}); concat->type(Type::parstring()); FunctionI* fi = _e.model->matchFn(_e, concat, false); assert(fi); concat->decl(fi); Call* show = new Call(Location().introduce(), ASTString("showDzn"), {concat}); show->type(Type::parstring()); fi = _e.model->matchFn(_e, show, false); assert(fi); show->decl(fi); _outputVars.push_back(show); _outputVars.push_back(new StringLit(Location().introduce(), ";\n")); } oi->remove(); } } dznov(e, outputObjective, includeOutputItem, outputForChecker, outputVars); iter_items(dznov, e.model); if (hasChecker && !outputForChecker) { outputVars.push_back(new StringLit(Location().introduce(), "_checker = ")); auto* checker_output = new Call(Location().introduce(), ASTString("showCheckerOutput"), {}); checker_output->type(Type::parstring()); FunctionI* fi = e.model->matchFn(e, checker_output, false); assert(fi); checker_output->decl(fi); auto* show = new Call(Location().introduce(), ASTString("showDzn"), {checker_output}); show->type(Type::parstring()); fi = e.model->matchFn(e, show, false); assert(fi); show->decl(fi); outputVars.push_back(show); outputVars.push_back(new StringLit(Location().introduce(), ";\n")); } auto* newOutputItem = new OutputI(Location().introduce(), new ArrayLit(Location().introduce(), outputVars)); e.model->addItem(newOutputItem); } ArrayLit* create__json_output(EnvI& e, bool outputObjective, bool includeOutputItem, bool hasChecker) { std::vector outputVars; outputVars.push_back(new StringLit(Location().introduce(), "{\n")); class JSONOVisitor : public ItemVisitor { protected: EnvI& _e; bool _outputObjective; bool _includeOutputItem; std::vector& _outputVars; bool _hadAddToOutput; public: bool firstVar; JSONOVisitor(EnvI& e, bool outputObjective, bool includeOutputItem, std::vector& outputVars) : _e(e), _outputObjective(outputObjective), _outputVars(outputVars), _includeOutputItem(includeOutputItem), _hadAddToOutput(false), firstVar(true) {} void vVarDeclI(VarDeclI* vdi) { VarDecl* vd = vdi->e(); bool process_var = false; if (_outputObjective && vd->id()->idn() == -1 && vd->id()->v() == "_objective") { process_var = true; } else { if (vd->ann().contains(constants().ann.add_to_output)) { if (!_hadAddToOutput) { _outputVars.clear(); _outputVars.push_back(new StringLit(Location().introduce(), "{\n")); firstVar = true; } _hadAddToOutput = true; process_var = true; } else { if (!_hadAddToOutput) { process_var = vd->type().isvar() && (vd->e() == nullptr || vd->ann().contains(constants().ann.rhs_from_assignment)); } } } if (process_var) { std::ostringstream s; if (firstVar) { firstVar = false; } else { s << ",\n"; } s << " \"" << vd->id()->str() << "\"" << " : "; auto* sl = new StringLit(Location().introduce(), s.str()); _outputVars.push_back(sl); std::vector showArgs(1); showArgs[0] = vd->id(); Call* show = new Call(Location().introduce(), "showJSON", showArgs); show->type(Type::parstring()); FunctionI* fi = _e.model->matchFn(_e, show, false); assert(fi); show->decl(fi); _outputVars.push_back(show); } } void vOutputI(OutputI* oi) { if (_includeOutputItem) { std::ostringstream s; if (firstVar) { firstVar = false; } else { s << ",\n"; } s << " \"_output\"" << " : "; auto* sl = new StringLit(Location().introduce(), s.str()); _outputVars.push_back(sl); Call* concat = new Call(Location().introduce(), ASTString("concat"), {oi->e()}); concat->type(Type::parstring()); FunctionI* fi = _e.model->matchFn(_e, concat, false); assert(fi); concat->decl(fi); Call* show = new Call(Location().introduce(), ASTString("showJSON"), {concat}); show->type(Type::parstring()); fi = _e.model->matchFn(_e, show, false); assert(fi); show->decl(fi); _outputVars.push_back(show); } oi->remove(); } } jsonov(e, outputObjective, includeOutputItem, outputVars); iter_items(jsonov, e.model); if (hasChecker) { std::ostringstream s; if (jsonov.firstVar) { jsonov.firstVar = false; } else { s << ",\n"; } s << " \"_checker\"" << " : "; auto* sl = new StringLit(Location().introduce(), s.str()); outputVars.push_back(sl); Call* checker_output = new Call(Location().introduce(), ASTString("showCheckerOutput"), {}); checker_output->type(Type::parstring()); FunctionI* fi = e.model->matchFn(e, checker_output, false); assert(fi); checker_output->decl(fi); Call* show = new Call(Location().introduce(), ASTString("showJSON"), {checker_output}); show->type(Type::parstring()); fi = e.model->matchFn(e, show, false); assert(fi); show->decl(fi); outputVars.push_back(show); } outputVars.push_back(new StringLit(Location().introduce(), "\n}\n")); return new ArrayLit(Location().introduce(), outputVars); } void create_json_output_item(EnvI& e, bool outputObjective, bool includeOutputItem, bool hasChecker) { auto* newOutputItem = new OutputI(Location().introduce(), create__json_output(e, outputObjective, includeOutputItem, hasChecker)); e.model->addItem(newOutputItem); } void create_output(EnvI& e, FlatteningOptions::OutputMode outputMode, bool outputObjective, bool includeOutputItem, bool hasChecker) { // Create new output model OutputI* outputItem = nullptr; GCLock lock; switch (outputMode) { case FlatteningOptions::OUTPUT_DZN: create_dzn_output_item(e, outputObjective, includeOutputItem, hasChecker, false); break; case FlatteningOptions::OUTPUT_JSON: create_json_output_item(e, outputObjective, includeOutputItem, hasChecker); break; case FlatteningOptions::OUTPUT_CHECKER: create_dzn_output_item(e, outputObjective, includeOutputItem, hasChecker, true); break; default: if (e.model->outputItem() == nullptr) { create_dzn_output_item(e, outputObjective, false, false, false); } break; } // Copy output item from model into output model outputItem = copy(e, e.cmap, e.model->outputItem())->cast(); make_par(e, outputItem->e()); e.output->addItem(outputItem); // Copy all function definitions that are required for output into the output model class CollectFunctions : public EVisitor { public: EnvI& env; CollectFunctions(EnvI& env0) : env(env0) {} static bool enter(Expression* e) { if (e->type().isvar()) { Type t = e->type(); t.ti(Type::TI_PAR); e->type(t); } return true; } void vId(Id& i) { // Also collect functions from output_only variables we depend on if ((i.decl() != nullptr) && i.decl()->ann().contains(constants().ann.output_only)) { top_down(*this, i.decl()->e()); } } void vCall(Call& c) { std::vector tv(c.argCount()); for (unsigned int i = c.argCount(); (i--) != 0U;) { tv[i] = c.arg(i)->type(); tv[i].ti(Type::TI_PAR); } FunctionI* decl = env.output->matchFn(env, c.id(), tv, false); FunctionI* origdecl = env.model->matchFn(env, c.id(), tv, false); bool canReuseDecl = (decl != nullptr); if (canReuseDecl && (origdecl != nullptr)) { // Check if this is the exact same overloaded declaration as in the model for (unsigned int i = 0; i < decl->params().size(); i++) { if (decl->params()[i]->type() != origdecl->params()[i]->type()) { // no, the types don't match, so we have to copy the original decl canReuseDecl = false; break; } } } Type t; if (!canReuseDecl) { if (origdecl == nullptr || !is_completely_par(env, origdecl, tv)) { std::ostringstream ss; ss << "function " << c.id() << " is used in output, par version needed"; throw FlatteningError(env, c.loc(), ss.str()); } if (!origdecl->fromStdLib()) { auto* decl_copy = copy(env, env.cmap, origdecl)->cast(); if (decl_copy != decl) { decl = decl_copy; (void)env.output->registerFn(env, decl, true); env.output->addItem(decl); if (decl->e() != nullptr) { make_par(env, decl->e()); top_down(*this, decl->e()); } CollectOccurrencesE ce(env.outputVarOccurrences, decl); top_down(ce, decl->e()); top_down(ce, decl->ti()); for (unsigned int i = decl->params().size(); (i--) != 0U;) { top_down(ce, decl->params()[i]); } } } else { decl = origdecl; } } c.decl(decl); } } _cf(e); top_down(_cf, outputItem->e()); // If we are checking solutions using a checker model, all parameters of the checker model // have to be made available in the output model class OV1 : public ItemVisitor { public: EnvI& env; CollectFunctions& cf; OV1(EnvI& env0, CollectFunctions& cf0) : env(env0), cf(cf0) {} void vVarDeclI(VarDeclI* vdi) { if (vdi->e()->ann().contains(constants().ann.mzn_check_var)) { auto* output_vd = copy(env, env.cmap, vdi->e())->cast(); top_down(cf, output_vd); } } } _ov1(e, _cf); iter_items(_ov1, e.model); // Copying the output item and the functions it depends on has created copies // of all dependent VarDecls. However the output model does not contain VarDeclIs for // these VarDecls yet. This iterator processes all variable declarations of the // original model, and if they were copied (i.e., if the output model depends on them), // the corresponding VarDeclI is created in the output model. class OV2 : public ItemVisitor { public: EnvI& env; OV2(EnvI& env0) : env(env0) {} void vVarDeclI(VarDeclI* vdi) { auto idx = env.outputVarOccurrences.idx.find(vdi->e()->id()); if (idx != env.outputVarOccurrences.idx.end()) { return; } if (Expression* vd_e = env.cmap.find(vdi->e())) { // We found a copied VarDecl, now need to create a VarDeclI auto* vd = vd_e->cast(); auto* vdi_copy = copy(env, env.cmap, vdi)->cast(); Type t = vdi_copy->e()->ti()->type(); t.ti(Type::TI_PAR); vdi_copy->e()->ti()->domain(nullptr); vdi_copy->e()->flat(vdi->e()->flat()); bool isCheckVar = vdi_copy->e()->ann().contains(constants().ann.mzn_check_var); Call* checkVarEnum = vdi_copy->e()->ann().getCall(constants().ann.mzn_check_enum_var); vdi_copy->e()->ann().clear(); if (isCheckVar) { vdi_copy->e()->ann().add(constants().ann.mzn_check_var); } if (checkVarEnum != nullptr) { vdi_copy->e()->ann().add(checkVarEnum); } vdi_copy->e()->introduced(false); IdMap::iterator it; if (!vdi->e()->type().isPar()) { if (vd->flat() == nullptr && vdi->e()->e() != nullptr && vdi->e()->e()->type().isPar()) { // Don't have a flat version of this variable, but the original has a right hand // side that is par, so we can use that. Expression* flate = eval_par(env, vdi->e()->e()); output_vardecls(env, vdi_copy, flate); vd->e(flate); } else { vd = follow_id_to_decl(vd->id())->cast(); VarDecl* reallyFlat = vd->flat(); while ((reallyFlat != nullptr) && reallyFlat != reallyFlat->flat()) { reallyFlat = reallyFlat->flat(); } if (reallyFlat == nullptr) { // The variable doesn't have a flat version. This can only happen if // the original variable had type-inst var, but a right-hand-side that // was par, so follow_id_to_decl lead to a par variable. assert(vd->e() && vd->e()->type().isPar()); Expression* flate = eval_par(env, vd->e()); output_vardecls(env, vdi_copy, flate); vd->e(flate); } else if ((vd->flat()->e() != nullptr) && vd->flat()->e()->type().isPar()) { // We can use the right hand side of the flat version of this variable Expression* flate = copy(env, env.cmap, follow_id(reallyFlat->id())); output_vardecls(env, vdi_copy, flate); vd->e(flate); } else if ((it = env.reverseMappers.find(vd->id())) != env.reverseMappers.end()) { // Found a reverse mapper, so we need to add the mapping function to the // output model to map the FlatZinc value back to the model variable. Call* rhs = copy(env, env.cmap, it->second())->cast(); check_output_par_fn(env, rhs); output_vardecls(env, vdi_copy, rhs); vd->e(rhs); } else if (cannot_use_rhs_for_output(env, vd->e())) { // If the VarDecl does not have a usable right hand side, it needs to be // marked as output in the FlatZinc vd->e(nullptr); assert(vd->flat()); if (vd->type().dim() == 0) { vd->flat()->addAnnotation(constants().ann.output_var); check_rename_var(env, vd); } else { bool needOutputAnn = true; if ((reallyFlat->e() != nullptr) && reallyFlat->e()->isa()) { auto* al = reallyFlat->e()->cast(); for (unsigned int i = 0; i < al->size(); i++) { if (Id* id = (*al)[i]->dynamicCast()) { if (env.reverseMappers.find(id) != env.reverseMappers.end()) { needOutputAnn = false; break; } } } if (!needOutputAnn) { output_vardecls(env, vdi_copy, al); vd->e(copy(env, env.cmap, al)); } } if (needOutputAnn) { std::vector args(vdi->e()->type().dim()); for (unsigned int i = 0; i < args.size(); i++) { if (vdi->e()->ti()->ranges()[i]->domain() == nullptr) { args[i] = new SetLit(Location().introduce(), eval_intset(env, vd->flat()->ti()->ranges()[i]->domain())); } else { args[i] = new SetLit(Location().introduce(), eval_intset(env, vd->ti()->ranges()[i]->domain())); } } auto* al = new ArrayLit(Location().introduce(), args); args.resize(1); args[0] = al; vd->flat()->addAnnotation( new Call(Location().introduce(), constants().ann.output_array, args)); check_rename_var(env, vd); } } } if ((reallyFlat != nullptr) && env.outputFlatVarOccurrences.find(reallyFlat) == -1) { env.outputFlatVarOccurrences.addIndex(reallyFlat, static_cast(env.output->size())); } } } else { if (vd->flat() == nullptr && vdi->e()->e() != nullptr) { // Need to process right hand side of variable, since it may contain // identifiers that are only in the FlatZinc and that we would // therefore fail to copy into the output model output_vardecls(env, vdi_copy, vdi->e()->e()); } } make_par(env, vdi_copy->e()); env.outputVarOccurrences.addIndex(vdi_copy, static_cast(env.output->size())); CollectOccurrencesE ce(env.outputVarOccurrences, vdi_copy); top_down(ce, vdi_copy->e()); env.output->addItem(vdi_copy); } } } _ov2(e); iter_items(_ov2, e.model); CollectOccurrencesE ce(e.outputVarOccurrences, outputItem); top_down(ce, outputItem->e()); e.model->mergeStdLib(e, e.output); process_deletions(e); } Expression* is_fixed_domain(EnvI& env, VarDecl* vd) { if (vd->type() != Type::varbool() && vd->type() != Type::varint() && vd->type() != Type::varfloat()) { return nullptr; } Expression* e = vd->ti()->domain(); if (e == constants().literalTrue || e == constants().literalFalse) { return e; } if (auto* sl = Expression::dynamicCast(e)) { if (sl->type().bt() == Type::BT_INT) { IntSetVal* isv = eval_intset(env, sl); return isv->min() == isv->max() ? IntLit::a(isv->min()) : nullptr; } if (sl->type().bt() == Type::BT_FLOAT) { FloatSetVal* fsv = eval_floatset(env, sl); return fsv->min() == fsv->max() ? FloatLit::a(fsv->min()) : nullptr; } } return nullptr; } void finalise_output(EnvI& e) { if (e.output->size() > 0) { // Adapt existing output model // (generated by repeated flattening) e.outputVarOccurrences.clear(); for (unsigned int i = 0; i < e.output->size(); i++) { Item* item = (*e.output)[i]; if (item->removed()) { continue; } switch (item->iid()) { case Item::II_VD: { VarDecl* vd = item->cast()->e(); IdMap::iterator it; GCLock lock; VarDecl* reallyFlat = vd->flat(); while ((reallyFlat != nullptr) && reallyFlat != reallyFlat->flat()) { reallyFlat = reallyFlat->flat(); } if (vd->e() == nullptr) { if (((vd->flat()->e() != nullptr) && vd->flat()->e()->type().isPar()) || (is_fixed_domain(e, vd->flat()) != nullptr)) { VarDecl* reallyFlat = vd->flat(); while (reallyFlat != reallyFlat->flat()) { reallyFlat = reallyFlat->flat(); } remove_is_output(reallyFlat); Expression* flate; if (Expression* fd = is_fixed_domain(e, vd->flat())) { flate = fd; } else { flate = copy(e, e.cmap, follow_id(reallyFlat->id())); } output_vardecls(e, item, flate); vd->e(flate); } else if ((it = e.reverseMappers.find(vd->id())) != e.reverseMappers.end()) { Call* rhs = copy(e, e.cmap, it->second())->cast(); check_output_par_fn(e, rhs); remove_is_output(reallyFlat); output_vardecls(e, item, it->second()->cast()); vd->e(rhs); if (e.varOccurrences.occurrences(reallyFlat) == 0 && reallyFlat->e() == nullptr) { auto it = e.varOccurrences.idx.find(reallyFlat->id()); assert(it != e.varOccurrences.idx.end()); e.flatRemoveItem((*e.flat())[it->second]->cast()); } } else { // If the VarDecl does not have a usable right hand side, it needs to be // marked as output in the FlatZinc assert(vd->flat()); bool needOutputAnn = true; if ((reallyFlat->e() != nullptr) && reallyFlat->e()->isa()) { Id* ident = reallyFlat->e()->cast(); if (e.reverseMappers.find(ident) != e.reverseMappers.end()) { needOutputAnn = false; remove_is_output(vd); remove_is_output(reallyFlat); vd->e(copy(e, e.cmap, ident)); Type al_t(vd->e()->type()); al_t.ti(Type::TI_PAR); vd->e()->type(al_t); output_vardecls(e, item, ident); if (e.varOccurrences.occurrences(reallyFlat) == 0) { auto it = e.varOccurrences.idx.find(reallyFlat->id()); assert(it != e.varOccurrences.idx.end()); e.flatRemoveItem((*e.flat())[it->second]->cast()); } } } else if ((reallyFlat->e() != nullptr) && reallyFlat->e()->isa()) { auto* al = reallyFlat->e()->cast(); for (unsigned int i = 0; i < al->size(); i++) { if (Id* ident = follow_id_to_value((*al)[i])->dynamicCast()) { if (e.reverseMappers.find(ident) != e.reverseMappers.end()) { needOutputAnn = false; break; } } } if (!needOutputAnn) { remove_is_output(vd); remove_is_output(reallyFlat); if (e.varOccurrences.occurrences(reallyFlat) == 0) { auto it = e.varOccurrences.idx.find(reallyFlat->id()); assert(it != e.varOccurrences.idx.end()); e.flatRemoveItem((*e.flat())[it->second]->cast()); } output_vardecls(e, item, al); vd->e(copy(e, e.cmap, al)); Type al_t(vd->e()->type()); al_t.ti(Type::TI_PAR); vd->e()->type(al_t); } } if (needOutputAnn) { if (!is_output(vd->flat())) { GCLock lock; if (vd->type().dim() == 0) { vd->flat()->addAnnotation(constants().ann.output_var); } else { std::vector args(vd->type().dim()); for (unsigned int i = 0; i < args.size(); i++) { if (vd->ti()->ranges()[i]->domain() == nullptr) { args[i] = new SetLit(Location().introduce(), eval_intset(e, vd->flat()->ti()->ranges()[i]->domain())); } else { args[i] = new SetLit(Location().introduce(), eval_intset(e, vd->ti()->ranges()[i]->domain())); } } auto* al = new ArrayLit(Location().introduce(), args); args.resize(1); args[0] = al; vd->flat()->addAnnotation( new Call(Location().introduce(), constants().ann.output_array, args)); } check_rename_var(e, vd); } } } vd->flat(nullptr); // Remove enum type Type vdt = vd->type(); vdt.enumId(0); vd->type(vdt); vd->ti()->type(vdt); } e.outputVarOccurrences.addIndex(item->cast(), static_cast(i)); CollectOccurrencesE ce(e.outputVarOccurrences, item); top_down(ce, vd); } break; case Item::II_OUT: { CollectOccurrencesE ce(e.outputVarOccurrences, item); top_down(ce, item->cast()->e()); } break; case Item::II_FUN: { CollectOccurrencesE ce(e.outputVarOccurrences, item); top_down(ce, item->cast()->e()); top_down(ce, item->cast()->ti()); for (unsigned int i = item->cast()->params().size(); (i--) != 0U;) { top_down(ce, item->cast()->params()[i]); } } break; default: throw FlatteningError(e, item->loc(), "invalid item in output model"); } } } process_deletions(e); } } // namespace MiniZinc libminizinc-2.5.3/lib/lexer.lxx0000644000175000017500000003701213757304533015125 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ %option reentrant %option bison-bridge bison-locations %option noyywrap %option stack %{ #if defined __GNUC__ #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wdeprecated" #elif defined _MSC_VER #pragma warning(push, 1) #endif namespace MiniZinc{ class ParserLocation; } #define YYLTYPE MiniZinc::ParserLocation #define YYLTYPE_IS_DECLARED 1 #define YYLTYPE_IS_TRIVIAL 0 #include namespace MiniZinc { int utf8len(const char* s) { int l=0; for (int i=0; s[i] != '\0'; i++) if ((s[i] & 0xc0) != 0x80) l++; return l; } int yy_input_proc(char* buf, int size, yyscan_t yyscanner); } #define YY_INPUT(buf, result, max_size) \ result = ::MiniZinc::yy_input_proc(buf, max_size, yyscanner); #define YY_USER_ACTION \ { MiniZinc::ParserState* parm = \ static_cast(yyget_extra(yyscanner)); \ yylloc->firstLine(yylloc->lastLine()); \ yylloc->firstColumn(yylloc->lastColumn()+1); \ if(parm->hadNewline) { \ parm->hadNewline=false; \ parm->lineStartPos += parm->nTokenNextStart; \ parm->nTokenNextStart=1; \ yylloc->lastLine(yylloc->lastLine()+1); \ yylloc->firstLine(yylloc->lastLine()); \ yylloc->firstColumn(1); \ } \ if(yytext[0] == '\n') { \ parm->hadNewline=true; \ parm->nTokenNextStart+=0; \ } else { \ parm->nTokenNextStart+=yyleng; \ } \ yylloc->lastColumn(yylloc->firstColumn()+::MiniZinc::utf8len(yytext)-1); \ } namespace MiniZinc { bool hexstrtointval(const char* s, long long int& v) { std::istringstream iss(s); iss >> std::hex >> v; return !iss.fail(); } bool octstrtointval(const char* s, long long int& v) { std::istringstream iss(s); iss >> std::oct >> v; return !iss.fail(); } bool fast_strtointval(const char* s, long long int& v) { MiniZinc::IntVal x = 0; try { for (; *s != '\0'; ++s) { x = (x*10) + (*s - '0'); } } catch (MiniZinc::ArithmeticError&) { return false; } v = x.toInt(); return true; } bool strtofloatval(const char* s, double& v) { std::istringstream iss(s); iss >> v; return !iss.fail(); } void clearBuffer(void* parm) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer = ""; } void appendBufferString(void* parm, const char* s) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer += s; } void appendBufferChar(void* parm, char s) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer += s; } char* bufferData(void* parm) { MiniZinc::ParserState* pp = static_cast(parm); return strdup(pp->stringBuffer.c_str()); } } %} %x string %x string_quote %x multilinecomment %x doccomment %x doccomment_file %s bracket_exp %s quoted_exp %% <*>\x0 { return MZN_INVALID_NULL; } \xa { } [ \f\xd\t] { /* ignore whitespace */ } "/**" { yy_push_state(doccomment,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } { "*/" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_DOC_COMMENT; } [^*\xa]+ { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } "*" { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } \xa { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } } "/***" { yy_push_state(doccomment_file,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } { "*/" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_DOC_FILE_COMMENT; } [^*\xa]+ { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } "*" { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } \xa { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } } "/*" { yy_push_state(multilinecomment,yyscanner); } { "*/" { yy_pop_state(yyscanner); } [^*\xa]+ { } "*" { } \xa { } } "[" { return MZN_LEFT_BRACKET; } "[|" { return MZN_LEFT_2D_BRACKET; } "]" { return MZN_RIGHT_BRACKET; } "|]" { return MZN_RIGHT_2D_BRACKET; } %[^\xa]* { /* ignore comments */ } "true" { yylval->iValue = 1; return MZN_BOOL_LITERAL; } "false" { yylval->iValue = 0; return MZN_BOOL_LITERAL; } 0[xX]([0-9a-fA-F]*\.[0-9a-fA-F]+|[0-9a-fA-F]+\.)([pP][+-]?[0-9]+)|(0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+) { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } 0[xX][0-9A-Fa-f]+ { if (::MiniZinc::hexstrtointval(yytext+2, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } 0o[0-7]+ { if (::MiniZinc::octstrtointval(yytext+2, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } [0-9]+ { if (::MiniZinc::fast_strtointval(yytext, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } [0-9]+\.[0-9]+ { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } [0-9]+\.[0-9]+[Ee][+-]?[0-9]+ { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } [0-9]+[Ee][+-]?[0-9]+ { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } [:;|{},\[\]\.] { return *yytext; } \.\. { return MZN_DOTDOT; } "'\.\.'" { return MZN_DOTDOT_QUOTED; } :: { return MZN_COLONCOLON; } _ { return MZN_UNDERSCORE; } "ann" { return MZN_ANN; } "annotation" { return MZN_ANNOTATION; } "any" { return MZN_ANY; } "array" { return MZN_ARRAY; } "bool" { return MZN_BOOL; } "case" { return MZN_CASE; } "constraint" { return MZN_CONSTRAINT; } "default" { return MZN_DEFAULT; } "div" { return MZN_IDIV; } "'div'" { return MZN_IDIV_QUOTED; } "diff" { return MZN_DIFF; } "'diff'" { return MZN_DIFF_QUOTED; } "else" { return MZN_ELSE; } "elseif" { return MZN_ELSEIF; } "endif" { return MZN_ENDIF; } "enum" { return MZN_ENUM; } "float" { return MZN_FLOAT; } "function" { return MZN_FUNCTION; } "if" { return MZN_IF; } "include" { return MZN_INCLUDE; } "infinity" { return MZN_INFINITY; } "intersect" { return MZN_INTERSECT; } "'intersect'" { return MZN_INTERSECT_QUOTED; } "in" { return MZN_IN; } "'in'" { return MZN_IN_QUOTED; } "int" { return MZN_INT; } "let" { return MZN_LET; } "list" { return MZN_LIST; } "maximize" { yylval->bValue = false; return MZN_MAXIMIZE; } "minimize" { yylval->bValue = true; return MZN_MINIMIZE; } "mod" { return MZN_MOD; } "'mod'" { return MZN_MOD_QUOTED; } "not" { return MZN_NOT; } "'not'" { return MZN_NOT_QUOTED; } "of" { return MZN_OF; } "output" { return MZN_OUTPUT; } "opt" { return MZN_OPT; } "par" { return MZN_PAR; } "predicate" { return MZN_PREDICATE; } "record" { return MZN_RECORD; } "satisfy" { return MZN_SATISFY; } "set" { return MZN_SET; } "solve" { return MZN_SOLVE; } "string" { return MZN_STRING; } "subset" { return MZN_SUBSET; } "'subset'" { return MZN_SUBSET_QUOTED; } "superset" { return MZN_SUPERSET; } "'superset'" { return MZN_SUPERSET_QUOTED; } "symdiff" { return MZN_SYMDIFF; } "'symdiff'" { return MZN_SYMDIFF_QUOTED; } "test" { return MZN_TEST; } "then" { return MZN_THEN; } "tuple" { return MZN_TUPLE; } "type" { return MZN_TYPE; } "union" { return MZN_UNION; } "'union'" { return MZN_UNION_QUOTED; } "var" { return MZN_VAR; } "variant_record" { return MZN_VARIANT_RECORD; } "where" { return MZN_WHERE; } "xor" { return MZN_XOR; } "'xor'" { return MZN_XOR_QUOTED; } "+" { return MZN_PLUS; } "'+'" { return MZN_PLUS_QUOTED; } "-" { return MZN_MINUS; } "'-'" { return MZN_MINUS_QUOTED; } "*" { return MZN_MULT; } "'*'" { return MZN_MULT_QUOTED; } "/" { return MZN_DIV; } "'/'" { return MZN_DIV_QUOTED; } "^-1" { return MZN_POW_MINUS1; } "^" { return MZN_POW; } "'^'" { return MZN_POW_QUOTED; } "++" { return MZN_PLUSPLUS; } "'++'" { return MZN_PLUSPLUS_QUOTED; } "<>" { return MZN_ABSENT; } "<" { return MZN_LE; } "'<'" { return MZN_LE_QUOTED; } "<=" { return MZN_LQ; } "'<='" { return MZN_LQ_QUOTED; } ">" { return MZN_GR; } "'>'" { return MZN_GR_QUOTED; } ">=" { return MZN_GQ; } "'>='" { return MZN_GQ_QUOTED; } "==" { return MZN_EQ; } "'=='" { return MZN_EQ_QUOTED; } "=" { return MZN_EQ; } "'='" { return MZN_EQ_QUOTED; } "!=" { return MZN_NQ; } "'!='" { return MZN_NQ_QUOTED; } "->" { return MZN_IMPL; } "'->'" { return MZN_IMPL_QUOTED; } "<-" { return MZN_RIMPL; } "'<-'" { return MZN_RIMPL_QUOTED; } "<->" { return MZN_EQUIV; } "'<->'" { return MZN_EQUIV_QUOTED; } "\\/" { return MZN_OR; } "'\\/'" { return MZN_OR_QUOTED; } "/\\" { return MZN_AND; } "'/\\'" { return MZN_AND_QUOTED; } "~+" { return MZN_WEAK_PLUS; } "~*" { return MZN_WEAK_MULT; } "~=" { return MZN_WEAK_EQ; } "~-" { return MZN_WEAK_MINUS; } "'~"[+*=-]"'" { yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; return MZN_IDENTIFIER; } "_objective" { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } [A-Za-z][A-Za-z0-9_]* { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } "'"[^\\'\xa\xd\x0]*"'" { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } _[A-Za-z][A-Za-z0-9_]* { MiniZinc::ParserState* parm = static_cast(yyget_extra(yyscanner)); if (parm->isFlatZinc) { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } else { return FLATZINC_IDENTIFIER; } } "\xE2\x88\x80" { yylval->sValue = strdup("forall"); return MZN_IDENTIFIER; } "\xE2\x88\x83" { yylval->sValue = strdup("exists"); return MZN_IDENTIFIER; } "\xE2\x88\x88" { return MZN_IN; } "\xE2\x8A\x86" { return MZN_SUBSET; } "\xE2\x8A\x87" { return MZN_SUPERSET; } "\xE2\x88\x9E" { return MZN_INFINITY; } "\xC2\xAC" { return MZN_NOT; } "\xE2\x86\x90" { return MZN_RIMPL; } "\xE2\x86\x92" { return MZN_IMPL; } "\xE2\x86\x94" { return MZN_EQUIV; } "\xE2\x88\xA7" { return MZN_AND; } "\xE2\x88\xA8" { return MZN_OR; } "\xE2\x89\xA0" { return MZN_NQ; } "\xE2\x89\xA4" { return MZN_LQ; } "\xE2\x89\xA5" { return MZN_GQ; } "\xE2\x88\xAA" { return MZN_UNION; } "\xE2\x88\xA9" { return MZN_INTERSECT; } "\xE2\x81\xBB\xC2\xB9" { return MZN_POW_MINUS1; } $$[A-Za-z][A-Za-z0-9_]* { yylval->sValue = strdup(yytext+1); return MZN_TI_ENUM_IDENTIFIER; } $[A-Za-z][A-Za-z0-9_]* { yylval->sValue = strdup(yytext+1); return MZN_TI_IDENTIFIER; } "(" { yy_push_state(bracket_exp,yyscanner); return *yytext; } ")" { yy_pop_state(yyscanner); return *yytext; } ")" { yy_pop_state(yyscanner); yy_pop_state(yyscanner); yy_push_state(string_quote,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } \" { yy_push_state(string,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } [^\\"\xa\xd\x0]* { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } \\n { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), '\n'); } \\t { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), '\t'); } \\[\\'] { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), yytext[1]); } \\[\\"] { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), yytext[1]); } \\"(" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_push_state(quoted_exp,yyscanner); return MZN_STRING_QUOTE_START; } \\"(" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_push_state(quoted_exp,yyscanner); return MZN_STRING_QUOTE_MID; } \" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_STRING_LITERAL; } \" { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_STRING_QUOTE_END; } . { return (unsigned char)yytext[0]; } [\xa\xd\x0] { return MZN_END_OF_LINE_IN_STRING; } <> { yy_pop_state(yyscanner); return MZN_UNTERMINATED_STRING; } `[A-Za-z][A-Za-z0-9_]*` { yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; return MZN_QUOTED_IDENTIFIER; } . { return (unsigned char)yytext[0]; } %% namespace MiniZinc { int yy_input_proc(char* buf, int size, yyscan_t yyscanner) { MiniZinc::ParserState* parm = static_cast(yyget_extra(yyscanner)); return parm->fillBuffer(buf, size); // work around warning that yyunput is unused yyunput (0,buf,yyscanner); } } libminizinc-2.5.3/lib/gc.cpp0000644000175000017500000005333513757304533014354 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include namespace MiniZinc { GC*& GC::gc() { #if defined(HAS_DECLSPEC_THREAD) __declspec(thread) static GC* gc = nullptr; #elif defined(HAS_ATTR_THREAD) static __thread GC* gc = nullptr; #else #error Need thread-local storage #endif return gc; } bool GC::locked() { assert(gc()); return gc()->_lockCount > 0; } GCLock::GCLock() { GC::lock(); } GCLock::~GCLock() { GC::unlock(); } class FreeListNode : public ASTNode { public: FreeListNode* next; size_t size; FreeListNode(size_t s, FreeListNode* n) : ASTNode(ASTNode::NID_FL), next(n), size(s) { _gcMark = 1; } FreeListNode(size_t s) : ASTNode(ASTNode::NID_FL), next(nullptr), size(s) {} }; class HeapPage { public: HeapPage* next; size_t size; size_t used; char data[1]; HeapPage(HeapPage* n, size_t s) : next(n), size(s), used(0) {} }; /// Memory managed by the garbage collector class GC::Heap { friend class GC; #if defined(MINIZINC_GC_STATS) static const char* _nodeid[Item::II_END + 1]; std::map gc_stats; #endif protected: static const size_t _min_gcThreshold; HeapPage* _page; GCMarker* _rootset; KeepAlive* _roots; WeakRef* _weakRefs; ASTNodeWeakMap* _nodeWeakMaps; static const int _max_fl = 5; FreeListNode* _fl[_max_fl + 1]; static const size_t _fl_size[_max_fl + 1]; static int freelistSlot(size_t _size) { size_t size = _size; assert(size <= _fl_size[_max_fl]); assert(size >= _fl_size[0]); size -= sizeof(Item); assert(size % sizeof(void*) == 0); size /= sizeof(void*); assert(size >= 1); int slot = static_cast(size) - 1; return slot; } /// Total amount of memory allocated size_t _allocedMem; /// Total amount of memory currently free size_t _freeMem; /// Memory threshold for next garbage collection size_t _gcThreshold; /// High water mark of all allocated memory size_t _maxAllocedMem; /// A trail item struct TItem { Expression** l; Expression* v; bool mark; TItem(Expression** l0, Expression* v0) : l(l0), v(v0), mark(false) {} }; /// Trail std::vector _trail; Heap() : _page(nullptr), _rootset(nullptr), _roots(nullptr), _weakRefs(nullptr), _nodeWeakMaps(nullptr), _allocedMem(0), _freeMem(0), _gcThreshold(_min_gcThreshold), _maxAllocedMem(0) { for (int i = _max_fl + 1; (i--) != 0;) { _fl[i] = nullptr; } } /// Default size of pages to allocate static const size_t pageSize = 1 << 20; HeapPage* allocPage(size_t s, bool exact = false) { if (!exact) { s = std::max(s, pageSize); } auto* newPage = static_cast(::malloc(sizeof(HeapPage) + s - 1)); if (newPage == nullptr) { throw InternalError("out of memory"); } #ifndef NDEBUG memset(newPage, 255, sizeof(HeapPage) + s - 1); #endif _allocedMem += s; _maxAllocedMem = std::max(_maxAllocedMem, _allocedMem); _freeMem += s; if (exact && (_page != nullptr)) { new (newPage) HeapPage(_page->next, s); _page->next = newPage; } else { if (_page != nullptr) { size_t ns = _page->size - _page->used; assert(ns <= _fl_size[_max_fl]); if (ns >= _fl_size[0]) { // Remainder of page can be added to free lists auto* fln = reinterpret_cast(_page->data + _page->used); _page->used += ns; new (fln) FreeListNode(ns, _fl[freelistSlot(ns)]); _fl[freelistSlot(ns)] = fln; } else { // Waste a little memory (less than smallest free list slot) _freeMem -= ns; assert(_allocedMem >= _freeMem); } } new (newPage) HeapPage(_page, s); _page = newPage; } return newPage; } void* alloc(size_t size, bool exact = false) { assert(size <= 80 || exact); /// Align to word boundary size += ((8 - (size & 7)) & 7); HeapPage* p = _page; if (exact || _page == nullptr || _page->used + size >= _page->size) { p = allocPage(size, exact); } char* ret = p->data + p->used; p->used += size; _freeMem -= size; if (p->size - p->used < _fl_size[0]) { _freeMem -= (p->size - p->used); _allocedMem -= (p->size - p->used); p->size = p->used; } assert(_allocedMem >= _freeMem); return ret; } /// Allocate one object of type T (no initialisation) template T* alloc() { return static_cast(alloc(sizeof(T))); } /// Allocate \a n objects of type T (no initialisation) template T* alloc(int n) { return static_cast(alloc(n * sizeof(T))); } void* fl(size_t size) { int slot = freelistSlot(size); assert(slot <= _max_fl); if (_fl[slot] != nullptr) { FreeListNode* p = _fl[slot]; _fl[slot] = p->next; _freeMem -= size; return p; } return alloc(size); } void trigger() { #ifdef MINIZINC_GC_STATS std::cerr << "GC\n\talloced " << (_allocedMem / 1024) << "\n\tfree " << (_freeMem / 1024) << "\n\tdiff " << ((_allocedMem - _freeMem) / 1024) << "\n\tthreshold " << (_gcThreshold / 1024) << "\n"; #endif size_t old_free = _freeMem; mark(); sweep(); // GC strategy: // increase threshold if either // a) we haven't been able to put much on the free list (comapred to before GC), or // b) the free list memory (after GC) is less than 50% of the allocated memory // otherwise (i.e., we have been able to increase the free list, and it is now more // than 50% of overall allocated memory), keep threshold at allocated memory if ((old_free != 0 && static_cast(old_free) / static_cast(_freeMem) > 0.9) || static_cast(_freeMem) / _allocedMem < 0.5) { _gcThreshold = std::max(_min_gcThreshold, static_cast(_allocedMem * 1.5)); } else { _gcThreshold = std::max(_min_gcThreshold, _allocedMem); } #ifdef MINIZINC_GC_STATS std::cerr << "done\n\talloced " << (_allocedMem / 1024) << "\n\tfree " << (_freeMem / 1024) << "\n\tdiff " << ((_allocedMem - _freeMem) / 1024) << "\n\tthreshold " << (_gcThreshold / 1024) << "\n"; #endif } void rungc() { if (_allocedMem > _gcThreshold) { trigger(); } } void mark(); void sweep(); static size_t nodesize(ASTNode* n) { static const size_t _nodesize[Item::II_END + 1] = { 0, // NID_FL 0, // NID_CHUNK 0, // NID_VEC 0, // NID_STR sizeof(IntLit), // E_INTLIT sizeof(FloatLit), // E_FLOATLIT sizeof(SetLit), // E_SETLIT sizeof(BoolLit), // E_BOOLLIT sizeof(StringLit), // E_STRINGLIT sizeof(Id), // E_ID sizeof(AnonVar), // E_ANON sizeof(ArrayLit), // E_ARRAYLIT sizeof(ArrayAccess), // E_ARRAYACCESS sizeof(Comprehension), // E_COMP sizeof(ITE), // E_ITE sizeof(BinOp), // E_BINOP sizeof(UnOp), // E_UNOP sizeof(Call), // E_CALL sizeof(VarDecl), // E_VARDECL sizeof(Let), // E_LET sizeof(TypeInst), // E_TI sizeof(TIId), // E_TIID sizeof(IncludeI), // II_INC sizeof(VarDeclI), // II_VD sizeof(AssignI), // II_ASN sizeof(ConstraintI), // II_CON sizeof(SolveI), // II_SOL sizeof(OutputI), // II_OUT sizeof(FunctionI) // II_FUN }; size_t ns; switch (static_cast(n->_id)) { case ASTNode::NID_FL: ns = static_cast(n)->size; break; case ASTNode::NID_CHUNK: case ASTNode::NID_STR: ns = static_cast(n)->memsize(); break; case ASTNode::NID_VEC: ns = static_cast(n)->memsize(); break; case Call::eid: ns = n->_flag1 ? _nodesize[BinOp::eid] : _nodesize[Call::eid]; break; default: assert(n->_id <= Item::II_END); ns = _nodesize[n->_id]; break; } ns += ((8 - (ns & 7)) & 7); return ns; } }; const size_t GC::Heap::_min_gcThreshold = 10LL * 1024LL; #ifdef MINIZINC_GC_STATS const char* GC::Heap::_nodeid[] = { "FreeList ", // NID_FL "Chunk ", // NID_CHUNK "Vec ", // NID_VEC "Str ", // NID_STR "IntLit ", // E_INTLIT "FloatLit ", // E_FLOATLIT "SetLit ", // E_SETLIT "BoolLit ", // E_BOOLLIT "StringLit ", // E_STRINGLIT "Id ", // E_ID "AnonVar ", // E_ANON "ArrayLit ", // E_ARRAYLIT "ArrayAccess ", // E_ARRAYACCESS "Comprehension ", // E_COMP "ITE ", // E_ITE "BinOp ", // E_BINOP "UnOp ", // E_UNOP "Call ", // E_CALL "VarDecl ", // E_VARDECL "Let ", // E_LET "TypeInst ", // E_TI "TIId ", // E_TIID "IncludeI ", // II_INC "VarDeclI ", // II_VD "AssignI ", // II_ASN "ConstraintI ", // II_CON "SolveI ", // II_SOL "OutputI ", // II_OUT "FunctionI " // II_FUN }; #endif void GC::setTimeout(unsigned long long int t) { if (gc() == nullptr) { gc() = new GC(); } gc()->_timeout = t; gc()->_timeoutTimer.reset(); } void GC::lock() { if (gc() == nullptr) { gc() = new GC(); } // If a timeout has been specified, first check counter // before checking timer (counter is much cheaper, introduces // less overhead) if (gc()->_timeout > 0 && gc()->_timeoutCount++ > 500) { gc()->_timeoutCount = 0; if (gc()->_timeoutTimer.ms() > gc()->_timeout) { gc()->_timeout = 0; gc()->_timeoutCount = 0; throw Timeout(); } } if (gc()->_lockCount == 0) { gc()->_heap->rungc(); } gc()->_lockCount++; } void GC::unlock() { assert(locked()); gc()->_lockCount--; } void GC::trigger() { if (!locked()) { gc()->_heap->trigger(); } } const size_t GC::Heap::pageSize; const size_t GC::Heap::_fl_size[GC::Heap::_max_fl + 1] = { sizeof(Item) + 1 * sizeof(void*), sizeof(Item) + 2 * sizeof(void*), sizeof(Item) + 3 * sizeof(void*), sizeof(Item) + 4 * sizeof(void*), sizeof(Item) + 5 * sizeof(void*), sizeof(Item) + 6 * sizeof(void*), }; GC::GC() : _heap(new Heap()), _lockCount(0), _timeout(0), _timeoutCount(0) {} void GC::add(GCMarker* m) { GC* gc = GC::gc(); if (gc->_heap->_rootset != nullptr) { m->_rootsNext = gc->_heap->_rootset; m->_rootsPrev = m->_rootsNext->_rootsPrev; m->_rootsPrev->_rootsNext = m; m->_rootsNext->_rootsPrev = m; } else { gc->_heap->_rootset = m->_rootsNext = m->_rootsPrev = m; } } void GC::remove(GCMarker* m) { GC* gc = GC::gc(); if (m->_rootsNext == m) { gc->_heap->_rootset = nullptr; } else { m->_rootsNext->_rootsPrev = m->_rootsPrev; m->_rootsPrev->_rootsNext = m->_rootsNext; if (m == gc->_heap->_rootset) { gc->_heap->_rootset = m->_rootsPrev; } } } void* GC::alloc(size_t size) { assert(locked()); void* ret; if (size < GC::Heap::_fl_size[0] || size > GC::Heap::_fl_size[GC::Heap::_max_fl]) { ret = _heap->alloc(size, true); } else { ret = _heap->fl(size); } new (ret) FreeListNode(size); return ret; } void GC::Heap::mark() { #if defined(MINIZINC_GC_STATS) std::cerr << "================= mark =================: "; gc_stats.clear(); #endif for (KeepAlive* e = _roots; e != nullptr; e = e->next()) { if (((*e)() != nullptr) && (*e)()->_gcMark == 0U) { Expression::mark((*e)()); #if defined(MINIZINC_GC_STATS) gc_stats[(*e)()->_id].keepalive++; #endif } } #if defined(MINIZINC_GC_STATS) std::cerr << "+"; #endif GCMarker* m = _rootset; if (m == nullptr) { return; } do { m->mark(); m = m->_rootsNext; } while (m != _rootset); for (auto i = static_cast(_trail.size()); (i--) != 0U;) { Expression::mark(_trail[i].v); } bool fixPrev = false; WeakRef* prevWr = nullptr; for (WeakRef* wr = _weakRefs; wr != nullptr; wr = wr->next()) { if (fixPrev) { fixPrev = false; removeWeakRef(prevWr); prevWr->_n = nullptr; prevWr->_p = nullptr; } if (((*wr)() != nullptr) && (*wr)()->_gcMark == 0U) { wr->_e = nullptr; wr->_valid = false; fixPrev = true; prevWr = wr; } } if (fixPrev) { removeWeakRef(prevWr); prevWr->_n = nullptr; prevWr->_p = nullptr; } for (ASTNodeWeakMap* wr = _nodeWeakMaps; wr != nullptr; wr = wr->next()) { std::vector toRemove; for (auto n : wr->_m) { if (n.first->_gcMark == 0U || n.second->_gcMark == 0U) { toRemove.push_back(n.first); } } for (auto* n : toRemove) { wr->_m.erase(n); } } #if defined(MINIZINC_GC_STATS) std::cerr << "+"; std::cerr << "\n"; #endif } void GC::Heap::sweep() { #if defined(MINIZINC_GC_STATS) std::cerr << "=============== GC sweep =============\n"; #endif HeapPage* p = _page; HeapPage* prev = nullptr; while (p != nullptr) { size_t off = 0; bool wholepage = true; struct NodeInfo { ASTNode* n; size_t ns; NodeInfo(ASTNode* n0, size_t ns0) : n(n0), ns(ns0) {} }; std::vector freeNodes; freeNodes.reserve(100); while (off < p->used) { auto* n = reinterpret_cast(p->data + off); size_t ns = nodesize(n); assert(ns != 0); #if defined(MINIZINC_GC_STATS) GCStat& stats = gc_stats[n->_id]; stats.first++; stats.total += ns; #endif if (n->_gcMark == 0U) { switch (static_cast(n->_id)) { case Item::II_FUN: static_cast(n)->ann().~Annotation(); break; case Item::II_SOL: static_cast(n)->ann().~Annotation(); break; case ASTNode::NID_STR: static_cast(n)->destroy(); break; case Expression::E_VARDECL: // Reset WeakRef inside VarDecl static_cast(n)->flat(nullptr); // fall through default: if (n->_id >= static_cast(ASTNode::NID_END) + 1 && n->_id <= static_cast(Expression::EID_END)) { static_cast(n)->ann().~Annotation(); } } if (ns >= _fl_size[0] && ns <= _fl_size[_max_fl]) { freeNodes.emplace_back(n, ns); } else { assert(off == 0); assert(p->used == p->size); } } else { #if defined(MINIZINC_GC_STATS) stats.second++; #endif wholepage = false; if (n->_id != static_cast(ASTNode::NID_FL)) { n->_gcMark = 0; } } off += ns; } if (wholepage) { #ifndef NDEBUG memset(p->data, 42, p->size); #endif if (prev != nullptr) { prev->next = p->next; } else { assert(p == _page); _page = p->next; } HeapPage* pf = p; p = p->next; _allocedMem -= pf->size; if (pf->size - pf->used >= _fl_size[0]) { _freeMem -= (pf->size - pf->used); } assert(_allocedMem >= _freeMem); ::free(pf); } else { for (auto ni : freeNodes) { auto* fln = static_cast(ni.n); new (fln) FreeListNode(ni.ns, _fl[freelistSlot(ni.ns)]); _fl[freelistSlot(ni.ns)] = fln; _freeMem += ni.ns; #if defined(MINIZINC_GC_STATS) gc_stats[fln->_id].second++; #endif } assert(_allocedMem >= _freeMem); prev = p; p = p->next; } } #if defined(MINIZINC_GC_STATS) for (auto stat : gc_stats) { std::cerr << _nodeid[stat.first] << ":\t" << stat.second.first << " / " << stat.second.second << " / " << stat.second.keepalive << " / " << stat.second.inmodel << " / "; if (stat.second.total > 1024) { if (stat.second.total > 1024 * 1024) { std::cerr << (stat.second.total / 1024 / 1024) << "M"; } else { std::cerr << (stat.second.total / 1024) << "K"; } } else { std::cerr << (stat.second.total); } std::cerr << std::endl; } #endif } ASTVec::ASTVec(size_t size) : ASTNode(NID_VEC), _size(size) {} void* ASTVec::alloc(size_t size) { size_t s = sizeof(ASTVec) + (size <= 2 ? 0 : size - 2) * sizeof(void*); s += ((8 - (s & 7)) & 7); return GC::gc()->alloc(s); } ASTChunk::ASTChunk(size_t size, unsigned int id) : ASTNode(id), _size(size) {} void* ASTChunk::alloc(size_t size) { size_t s = sizeof(ASTChunk) + (size <= 4 ? 0 : size - 4) * sizeof(char); s += ((8 - (s & 7)) & 7); return GC::gc()->alloc(s); } void GC::mark() { GC* gc = GC::gc(); gc->_heap->_trail.emplace_back(nullptr, nullptr); gc->_heap->_trail.back().mark = true; } void GC::trail(Expression** l, Expression* v) { GC* gc = GC::gc(); gc->_heap->_trail.emplace_back(l, v); } void GC::untrail() { GC* gc = GC::gc(); while (!gc->_heap->_trail.back().mark) { *gc->_heap->_trail.back().l = gc->_heap->_trail.back().v; gc->_heap->_trail.pop_back(); } assert(gc->_heap->_trail.back().mark); assert(!gc->_heap->_trail.empty()); gc->_heap->_trail.pop_back(); } size_t GC::maxMem() { GC* gc = GC::gc(); return gc->_heap->_maxAllocedMem; } void* ASTNode::operator new(size_t size) { return GC::gc()->alloc(size); } void GC::addKeepAlive(KeepAlive* e) { assert(e->_p == nullptr); assert(e->_n == nullptr); e->_n = GC::gc()->_heap->_roots; if (GC::gc()->_heap->_roots != nullptr) { GC::gc()->_heap->_roots->_p = e; } GC::gc()->_heap->_roots = e; } void GC::removeKeepAlive(KeepAlive* e) { if (e->_p != nullptr) { e->_p->_n = e->_n; } else { assert(GC::gc()->_heap->_roots == e); GC::gc()->_heap->_roots = e->_n; } if (e->_n != nullptr) { e->_n->_p = e->_p; } } KeepAlive::KeepAlive(Expression* e) : _e(e), _p(nullptr), _n(nullptr) { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->addKeepAlive(this); } } KeepAlive::~KeepAlive() { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->removeKeepAlive(this); } } KeepAlive::KeepAlive(const KeepAlive& e) : _e(e._e), _p(nullptr), _n(nullptr) { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->addKeepAlive(this); } } KeepAlive& KeepAlive::operator=(const KeepAlive& e) { if (this != &e) { if ((_e != nullptr) && !_e->isUnboxedVal()) { if (e._e == nullptr || e._e->isUnboxedVal()) { GC::gc()->removeKeepAlive(this); _p = _n = nullptr; } } else { if (e._e != nullptr && !e._e->isUnboxedVal()) { GC::gc()->addKeepAlive(this); } } _e = e._e; } return *this; } void GC::addWeakRef(WeakRef* e) { assert(e->_p == nullptr); assert(e->_n == nullptr); e->_n = GC::gc()->_heap->_weakRefs; if (GC::gc()->_heap->_weakRefs != nullptr) { GC::gc()->_heap->_weakRefs->_p = e; } GC::gc()->_heap->_weakRefs = e; } void GC::removeWeakRef(MiniZinc::WeakRef* e) { if (e->_p != nullptr) { e->_p->_n = e->_n; } else { assert(GC::gc()->_heap->_weakRefs == e); GC::gc()->_heap->_weakRefs = e->_n; } if (e->_n != nullptr) { e->_n->_p = e->_p; } } void GC::addNodeWeakMap(ASTNodeWeakMap* m) { assert(m->_p == nullptr); assert(m->_n == nullptr); m->_n = GC::gc()->_heap->_nodeWeakMaps; if (GC::gc()->_heap->_nodeWeakMaps != nullptr) { GC::gc()->_heap->_nodeWeakMaps->_p = m; } GC::gc()->_heap->_nodeWeakMaps = m; } void GC::removeNodeWeakMap(ASTNodeWeakMap* m) { if (m->_p != nullptr) { m->_p->_n = m->_n; } else { assert(GC::gc()->_heap->_nodeWeakMaps == m); GC::gc()->_heap->_nodeWeakMaps = m->_n; } if (m->_n != nullptr) { m->_n->_p = m->_p; } } WeakRef::WeakRef(Expression* e) : _e(e), _p(nullptr), _n(nullptr), _valid(true) { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->addWeakRef(this); } } WeakRef::~WeakRef() { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->removeWeakRef(this); } } WeakRef::WeakRef(const WeakRef& e) : _e(e()), _p(nullptr), _n(nullptr), _valid(true) { if ((_e != nullptr) && !_e->isUnboxedVal()) { GC::gc()->addWeakRef(this); } } WeakRef& WeakRef::operator=(const WeakRef& e) { if (this != &e) { // Test if this WeakRef is currently active in the GC bool isActive = ((_e != nullptr) && !_e->isUnboxedVal()); if (isActive) { // Yes, active WeakRef. // If after assigning WeakRef should be inactive, remove it. if (e() == nullptr || e()->isUnboxedVal()) { GC::gc()->removeWeakRef(this); _n = _p = nullptr; } } _e = e(); _valid = true; // If this WeakRef was not active but now should be, add it if (!isActive && _e != nullptr && !_e->isUnboxedVal()) { GC::gc()->addWeakRef(this); } } return *this; } ASTNodeWeakMap::ASTNodeWeakMap() : _p(nullptr), _n(nullptr) { GC::gc()->addNodeWeakMap(this); } ASTNodeWeakMap::~ASTNodeWeakMap() { GC::gc()->removeNodeWeakMap(this); } void ASTNodeWeakMap::insert(ASTNode* n0, ASTNode* n1) { _m.insert(std::make_pair(n0, n1)); } ASTNode* ASTNodeWeakMap::find(ASTNode* n) { auto it = _m.find(n); if (it == _m.end()) { return nullptr; } return it->second; } } // namespace MiniZinc libminizinc-2.5.3/lib/algorithms/0000755000175000017500000000000013757304533015417 5ustar kaolkaollibminizinc-2.5.3/lib/algorithms/min_cut.cpp0000644000175000017500000000604413757304533017565 0ustar kaolkaol#include #include #include #ifdef COMPILE_BOOST_MINCUT #include #include #include #include #include #include #endif void Algorithms::MinCut::solve() { #ifndef COMPILE_BOOST_MINCUT throw std::runtime_error( "MIP/circuit: Subtour Elimination Constraints: MinCut::solve not compiled. " "Compile with COMPILE_BOOST_MINCUT (needs boost), or use -D nSECcuts=0 for flattening."); #else typedef std::pair edge_t; // A graphic of the min-cut is available at // using namespace std; typedef boost::adjacency_list > undirected_graph; typedef boost::property_map::type weight_map_type; typedef boost::property_traits::value_type weight_type; // define the 16 edges of the graph. {3, 4} means an undirected edge between vertices 3 and 4. // edge_t edges[] = {{3, 4}, {3, 6}, {3, 5}, {0, 4}, {0, 1}, {0, 6}, {0, 7}, // {0, 5}, {0, 2}, {4, 1}, {1, 6}, {1, 5}, {6, 7}, {7, 5}, {5, 2}, {3, 4}}; std::vector edges_array; // = edges; // std::vector< weight_type > ws_array; edges_array.reserve(edges.size()); for (const auto& edg : edges) edges_array.push_back(std::pair(edg.first, edg.second)); // for each of the 16 edges, define the associated edge weight. ws[i] is the weight for the edge // that is described by edges[i]. // weight_type ws[] = // {0.2, 3.1, 1.3, 3.7, 1.5, 2.6, 6.44, 1.26, 8.77, 1.29, 1.95, 80.74, 2.23, 1.94, 1.23, 4.957}; // construct the graph object. 8 is the number of vertices, which are numbered from 0 // through 7, and 16 is the number of edges. undirected_graph g(edges_array.data(), edges_array.data() + edges_array.size(), weights.data(), nNodes, edges_array.size()); // define a property map, `parities`, that will store a boolean value for each vertex. // Vertices that have the same parity after `stoer_wagner_min_cut` runs are on the same side of // the min-cut. BOOST_AUTO(parities00, boost::make_one_bit_color_map(num_vertices(g), get(boost::vertex_index, g))); // run the Stoer-Wagner algorithm to obtain the min-cut weight. `parities` is also filled in. wMinCut = boost::stoer_wagner_min_cut(g, get(boost::edge_weight, g), boost::parity_map(parities00)); assert(nNodes == num_vertices(g)); // parities = parities00; parities.clear(); parities.reserve(nNodes); for (size_t i = 0; i < num_vertices(g); ++i) { parities.push_back(get(parities00, i)); } #endif } libminizinc-2.5.3/lib/support/0000755000175000017500000000000013757304533014762 5ustar kaolkaollibminizinc-2.5.3/lib/support/regex/0000755000175000017500000000000013757304533016074 5ustar kaolkaollibminizinc-2.5.3/lib/support/regex/parser.yxx0000644000175000017500000000773113757304533020152 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ %define api.header.include {} %{ #include #include #include #include using namespace Gecode; using namespace MiniZinc; typedef struct yy_buffer_state *YY_BUFFER_STATE; YY_BUFFER_STATE regex_yy_scan_string ( const char* yy_str ); extern int yylex(); extern FILE* yyin; typedef struct REContext{ REG* expr; const IntSetVal& dom; } REContext; void yyerror(REContext& ctx, const char* s); %} %union { int iValue; char* sValue; std::set* setValue; Gecode::REG* rValue; } %parse-param {REContext& ctx} %token R_INTEGER %token R_GROUP_OPEN "(" %token R_GROUP_CLOSE ")" %token R_STAR "*" %token R_PLUS "+" %token R_ANY "." %token R_UNION "|" %token R_OPTIONAL "?" %token R_QUANT_OPEN "{" %token R_QUANT_CLOSE "}" %token R_COMMA "," %token R_CLASS_OPEN "[" %token R_CLASS_CLOSE "]" %token R_CLASS_RANGE "-" %token R_CLASS_NEG "^" %token R_IDENTIFIER %type regex expression term factor atom %type set_item set_items %start regex %% regex: expression { *ctx.expr = (*$1); delete $1; } expression: term | term "|" expression { *$1 = *$1 | *$3; delete $3; $$ = $1; } term: factor | factor term { *$1 = *$1 + *$2; delete $2; $$ = $1; } factor: atom | atom "*" { *$1 = *(*$1); $$ = $1; } | atom "+" { *$1 = +(*$1); $$ = $1; } | atom "?" { *$1 = (*$1)(0, 1); $$ = $1; } | atom "{" R_INTEGER "}" { *$1 = (*$1)($3, $3); $$ = $1; } | atom "{" R_INTEGER "," "}" { *$1 = (*$1)($3); $$ = $1; } | atom "{" R_INTEGER "," R_INTEGER "}" { *$1 = (*$1)($3, $5); $$ = $1; } atom: R_INTEGER { $$ = new REG($1); } | "." { IntArgs range = IntArgs::create(ctx.dom.max().toInt() - ctx.dom.min().toInt() + 1, ctx.dom.min().toInt()); $$ = new REG(range); } | "[" set_items "]" { std::vector v; v.reserve($2->size()); for(auto i : *$2) { v.push_back(i); } delete $2; $$ = new REG(IntArgs(v)); } | "[" "^" set_items "]" { std::vector diff; std::set domain; for(int i = ctx.dom.min().toInt(); i<=ctx.dom.max().toInt(); ++i) { domain.insert(i); } std::set_difference( domain.begin(), domain.end(), $3->begin(), $3->end(), std::inserter(diff, diff.begin()) ); delete $3; $$ = new REG(IntArgs(diff)); } | "(" expression ")" { $$ = $2; } set_items: set_item | set_item set_items { $$ = $1; for (auto i : *$2) { $1->insert(i); } delete $2; } set_item: R_INTEGER { $$ = new std::set({$1}); } | R_INTEGER "-" R_INTEGER { int from = $1; int to = $3; if (to < from) { std::swap(from,to); } $$ = new std::set; for(int i = from; i<=to; ++i) { $$->insert(i); } } %% void yyerror(REContext& ctx, const char* s) { // TODO: Add error location throw std::runtime_error("Cannot parse regular expression: " + std::string(s)); } std::unique_ptr regex_from_string(const std::string& regex_str, const IntSetVal& domain) { REG* expr = new REG(); regex_yy_scan_string(regex_str.c_str()); REContext rctx = REContext{expr, domain}; int err = yyparse(rctx); if (err != 0) { throw std::runtime_error("Cannot parse regular expression, error code " + std::to_string(err)); } return std::unique_ptr(expr); } libminizinc-2.5.3/lib/support/regex/lexer.lxx0000644000175000017500000000222213757304533017746 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ %option noyywrap %option prefix="regex_yy" %{ #include #define YY_DECL int yylex() #include %} %% [ \t\n] { /* ignore white space */ } [0-9]+ { regex_yylval.iValue = std::atoi(regex_yytext); return R_INTEGER; } "|" { return R_UNION; } "+" { return R_PLUS; } "*" { return R_STAR; } "(" { return R_GROUP_OPEN; } ")" { return R_GROUP_CLOSE; } "?" { return R_OPTIONAL; } "{" { return R_QUANT_OPEN; } "}" { return R_QUANT_CLOSE; } "," { return R_COMMA; } "." { return R_ANY; } "[" { return R_CLASS_OPEN; } "]" { return R_CLASS_CLOSE; } "-" { return R_CLASS_RANGE; } "^" { return R_CLASS_NEG; } . { /* Catch all */ throw std::runtime_error("Illegal token in regular expression: '" + std::string(regex_yytext) + "'"); } %% libminizinc-2.5.3/lib/model.cpp0000644000175000017500000005075713757304533015070 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #undef MZN_DEBUG_FUNCTION_REGISTRY namespace MiniZinc { Model::FnEntry::FnEntry(FunctionI* fi0) : t(fi0->params().size()), fi(fi0), isPolymorphic(false) { for (unsigned int i = 0; i < fi->params().size(); i++) { t[i] = fi->params()[i]->type(); isPolymorphic |= (t[i].bt() == Type::BT_TOP); } } bool Model::FnEntry::operator<(const Model::FnEntry& f) const { assert(!compare(*this, f) || !compare(f, *this)); return compare(*this, f); } bool Model::FnEntry::compare(const Model::FnEntry& e1, const Model::FnEntry& e2) { if (e1.t.size() < e2.t.size()) { return true; } if (e1.t.size() == e2.t.size()) { for (unsigned int i = 0; i < e1.t.size(); i++) { if (e1.t[i] != e2.t[i]) { if (e1.t[i].isSubtypeOf(e2.t[i], true)) { return true; } if (e2.t[i].isSubtypeOf(e1.t[i], true)) { return false; } switch (e1.t[i].cmp(e2.t[i])) { case -1: return true; case 1: return false; default: assert(false); } } } } return false; } Model::Model() : _parent(nullptr), _solveItem(nullptr), _outputItem(nullptr) {} Model::~Model() { for (auto* i : _items) { if (auto* ii = i->dynamicCast()) { if (ii->own()) { delete ii->m(); ii->m(nullptr); } } } } VarDeclIteratorContainer Model::vardecls() { return VarDeclIteratorContainer(this); } ConstraintIteratorContainer Model::constraints() { return ConstraintIteratorContainer(this); } FunctionIteratorContainer Model::functions() { return FunctionIteratorContainer(this); } VarDeclIterator VarDeclIteratorContainer::begin() { return VarDeclIterator(_m, _m->begin()); } VarDeclIterator VarDeclIteratorContainer::end() { return VarDeclIterator(_m, _m->end()); } ConstraintIterator ConstraintIteratorContainer::begin() { return ConstraintIterator(_m, _m->begin()); } ConstraintIterator ConstraintIteratorContainer::end() { return ConstraintIterator(_m, _m->end()); } FunctionIterator FunctionIteratorContainer::begin() { return FunctionIterator(_m, _m->begin()); } FunctionIterator FunctionIteratorContainer::end() { return FunctionIterator(_m, _m->end()); } SolveI* Model::solveItem() { return _solveItem; } OutputI* Model::outputItem() { return _outputItem; } void Model::addItem(Item* i) { _items.push_back(i); if (i->isa()) { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } m->_solveItem = i->cast(); } else if (i->isa()) { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } m->_outputItem = i->cast(); } } void Model::setOutputItem(OutputI* oi) { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } m->_outputItem = oi; } namespace { /// Return lowest possible base type given other type-inst restrictions Type::BaseType lowest_bt(const Type& t) { if (t.st() == Type::ST_SET && t.ti() == Type::TI_VAR) { return Type::BT_INT; } return Type::BT_BOOL; } /// Return highest possible base type given other type-inst restrictions Type::BaseType highest_bt(const Type& t) { if (t.st() == Type::ST_SET && t.ti() == Type::TI_VAR) { return Type::BT_INT; } if (t.ti() == Type::TI_VAR || t.st() == Type::ST_SET) { return Type::BT_FLOAT; } return Type::BT_ANN; } } // namespace void Model::addPolymorphicInstances(Model::FnEntry& fe, std::vector& entries) { entries.push_back(fe); if (fe.isPolymorphic) { FnEntry cur = fe; std::vector > type_ids; // First step: initialise all type variables to bool // and collect them in the stack vector for (unsigned int i = 0; i < cur.t.size(); i++) { if (cur.t[i].bt() == Type::BT_TOP) { std::vector t; for (unsigned int j = i; j < cur.t.size(); j++) { assert(cur.fi->params()[i]->ti()->domain() && cur.fi->params()[i]->ti()->domain()->isa()); if ((cur.fi->params()[j]->ti()->domain() != nullptr) && cur.fi->params()[j]->ti()->domain()->isa()) { TIId* id0 = cur.fi->params()[i]->ti()->domain()->cast(); TIId* id1 = cur.fi->params()[j]->ti()->domain()->cast(); if (id0->v() == id1->v()) { // Found parameter with same type variable // Initialise to lowest concrete base type (bool) cur.t[j].bt(lowest_bt(cur.t[j])); t.push_back(&cur.t[j]); } } } type_ids.push_back(t); } } std::vector stack; for (unsigned int i = 0; i < type_ids.size(); i++) { stack.push_back(i); } int final_id = static_cast(type_ids.size()) - 1; while (!stack.empty()) { if (stack.back() == final_id) { // If this instance isn't in entries yet, add it bool alreadyDefined = false; for (auto& entry : entries) { if (entry.t == cur.t) { alreadyDefined = true; break; } } if (!alreadyDefined) { entries.push_back(cur); } } Type& back_t = *type_ids[stack.back()][0]; if (back_t.bt() == highest_bt(back_t) && back_t.st() == Type::ST_SET) { // last type, remove this item stack.pop_back(); } else { if (back_t.bt() == highest_bt(back_t)) { // Create set type for current item for (auto& i : type_ids[stack.back()]) { i->st(Type::ST_SET); i->bt(lowest_bt(*i)); } } else { // Increment type of current item auto nextType = static_cast(back_t.bt() + 1); for (auto& i : type_ids[stack.back()]) { i->bt(nextType); } } // Reset types of all further items and push them for (unsigned int i = stack.back() + 1; i < type_ids.size(); i++) { for (auto& j : type_ids[i]) { j->bt(lowest_bt(*j)); } stack.push_back(i); } } } } } bool Model::registerFn(EnvI& env, FunctionI* fi, bool keepSorted, bool throwIfDuplicate) { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } auto i_id = m->_fnmap.find(fi->id()); if (i_id == m->_fnmap.end()) { // new element std::vector v; FnEntry fe(fi); addPolymorphicInstances(fe, v); m->_fnmap.insert(std::pair >(fi->id(), v)); } else { // add to list of existing elements std::vector& v = i_id->second; for (auto& i : v) { if (i.fi == fi) { return true; } if (i.fi->params().size() == fi->params().size()) { bool alleq = true; for (unsigned int j = 0; j < fi->params().size(); j++) { Type t1 = i.fi->params()[j]->type(); Type t2 = fi->params()[j]->type(); t1.enumId(0); t2.enumId(0); if (t1 != t2) { alleq = false; break; } } if (alleq) { if ((i.fi->e() != nullptr) && (fi->e() != nullptr) && !i.isPolymorphic) { if (throwIfDuplicate) { throw TypeError( env, fi->loc(), "function with the same type already defined in " + i.fi->loc().toString()); } return false; } if ((fi->e() != nullptr) || i.isPolymorphic) { if (Call* deprecated = i.fi->ann().getCall(constants().ann.mzn_deprecated)) { fi->ann().add(deprecated); } i = fi; } else if (Call* deprecated = fi->ann().getCall(constants().ann.mzn_deprecated)) { i.fi->ann().add(deprecated); } return true; } } } FnEntry fe(fi); addPolymorphicInstances(fe, v); if (keepSorted) { std::sort(i_id->second.begin(), i_id->second.end()); } } if (fi->id() == "mzn_reverse_map_var") { if (fi->params().size() != 1 || fi->ti()->type() != Type::varbool()) { throw TypeError(env, fi->loc(), "functions called `mzn_reverse_map_var` must have a single argument and " "return type var bool"); } Type t = fi->params()[0]->type(); _revmapmap.insert(std::pair(t.toInt(), fi)); } return true; } FunctionI* Model::matchFn(EnvI& env, const ASTString& id, const std::vector& t, bool strictEnums) { if (id == constants().varRedef->id()) { return constants().varRedef; } Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } auto i_id = m->_fnmap.find(id); if (i_id == m->_fnmap.end()) { return nullptr; } std::vector& v = i_id->second; for (auto& i : v) { std::vector& fi_t = i.t; #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << "try " << *i.fi; #endif if (fi_t.size() == t.size()) { bool match = true; for (unsigned int j = 0; j < t.size(); j++) { if (!env.isSubtype(t[j], fi_t[j], strictEnums)) { #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << t[j].toString(env) << " does not match " << fi_t[j].toString(env) << "\n"; #endif match = false; break; } } if (match) { return i.fi; } } } return nullptr; } void Model::mergeStdLib(EnvI& env, Model* m) const { for (const auto& it : _fnmap) { for (const auto& cit : it.second) { if (cit.fi->fromStdLib()) { (void)m->registerFn(env, cit.fi); } } } m->sortFn(); } void Model::sortFn() { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } for (auto& it : m->_fnmap) { // Sort all functions by type std::sort(it.second.begin(), it.second.end()); } } void Model::fixFnMap() { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } for (auto& it : m->_fnmap) { for (auto& i : it.second) { for (unsigned int j = 0; j < i.t.size(); j++) { if (i.t[j].isunknown()) { i.t[j] = i.fi->params()[j]->type(); } } } } } void Model::checkFnOverloading(EnvI& env) { Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } for (auto& it : m->_fnmap) { std::vector& fs = it.second; for (unsigned int i = 0; i < fs.size() - 1; i++) { FunctionI* cur = fs[i].fi; for (unsigned int j = i + 1; j < fs.size(); j++) { FunctionI* cmp = fs[j].fi; if (cur == cmp || cur->params().size() != cmp->params().size()) { break; } bool allEqual = true; for (unsigned int i = 0; i < cur->params().size(); i++) { Type t1 = cur->params()[i]->type(); Type t2 = cmp->params()[i]->type(); t1.enumId(0); t2.enumId(0); if (t1 != t2) { allEqual = false; break; } } if (allEqual) { throw TypeError(env, cur->loc(), "unsupported type of overloading. \nFunction/predicate with equivalent " "signature defined in " + cmp->loc().toString()); } } } } } namespace { int match_idx(std::vector& matched, Expression*& botarg, EnvI& env, const std::vector& v, const std::vector& args, bool strictEnums) { botarg = nullptr; for (unsigned int i = 0; i < v.size(); i++) { const std::vector& fi_t = v[i].t; #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << "try " << *v[i].fi; #endif if (fi_t.size() == args.size()) { bool match = true; for (unsigned int j = 0; j < args.size(); j++) { if (!env.isSubtype(args[j]->type(), fi_t[j], strictEnums)) { #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << args[j]->type().toString(env) << " does not match " << fi_t[j].toString(env) << "\n"; #endif match = false; break; } if (args[j]->type().isbot() && fi_t[j].bt() != Type::BT_TOP) { botarg = args[j]; } } if (match) { matched.push_back(v[i].fi); if (botarg == nullptr) { return static_cast(i); } } } } return -1; } } // namespace FunctionI* Model::matchFn(EnvI& env, const ASTString& id, const std::vector& args, bool strictEnums) const { if (id == constants().varRedef->id()) { return constants().varRedef; } const Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } auto it = m->_fnmap.find(id); if (it == m->_fnmap.end()) { return nullptr; } const std::vector& v = it->second; std::vector matched; Expression* botarg; (void)match_idx(matched, botarg, env, v, args, strictEnums); if (matched.empty()) { return nullptr; } if (matched.size() == 1) { return matched[0]; } Type t = matched[0]->ti()->type(); t.ti(Type::TI_PAR); for (unsigned int i = 1; i < matched.size(); i++) { if (!env.isSubtype(t, matched[i]->ti()->type(), strictEnums)) { throw TypeError(env, botarg->loc(), "ambiguous overloading on return type of function"); } } return matched[0]; } FunctionI* Model::matchFn(EnvI& env, Call* c, bool strictEnums, bool throwIfNotFound) const { if (c->id() == constants().varRedef->id()) { return constants().varRedef; } const Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } auto it = m->_fnmap.find(c->id()); if (it == m->_fnmap.end()) { if (throwIfNotFound) { std::ostringstream oss; oss << "no function or predicate with name `"; oss << c->id() << "' found"; ASTString mostSimilar; int minEdits = 3; for (const auto& decls : m->_fnmap) { if (std::abs(static_cast(c->id().size()) - static_cast(decls.first.size())) <= 3) { int edits = c->id().levenshteinDistance(decls.first); if (edits < minEdits && edits < std::min(c->id().size(), decls.first.size())) { minEdits = edits; mostSimilar = decls.first; } } } if (mostSimilar.size() > 0) { oss << ", did you mean `" << mostSimilar << "'?"; } throw TypeError(env, c->loc(), oss.str()); } return nullptr; } const std::vector& v = it->second; std::vector matched; Expression* botarg = nullptr; for (const auto& i : v) { const std::vector& fi_t = i.t; #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << "try " << *i.fi; #endif if (fi_t.size() == c->argCount()) { bool match = true; for (unsigned int j = 0; j < c->argCount(); j++) { if (!env.isSubtype(c->arg(j)->type(), fi_t[j], strictEnums)) { #ifdef MZN_DEBUG_FUNCTION_REGISTRY std::cerr << c->arg(j)->type().toString(env) << " does not match " << fi_t[j].toString(env) << "\n"; std::cerr << "Wrong argument is " << *c->arg(j); #endif match = false; break; } if (c->arg(j)->type().isbot() && fi_t[j].bt() != Type::BT_TOP) { botarg = c->arg(j); } } if (match) { if (botarg != nullptr) { matched.push_back(i.fi); } else { return i.fi; } } } } if (matched.empty()) { if (throwIfNotFound) { std::ostringstream oss; oss << "no function or predicate with this signature found: `"; oss << c->id() << "("; for (unsigned int i = 0; i < c->argCount(); i++) { oss << c->arg(i)->type().toString(env); if (i < c->argCount() - 1) { oss << ","; } } oss << ")'\n"; oss << "Cannot use the following functions or predicates with the same identifier:\n"; Printer pp(oss, 0, false, &env); for (const auto& i : v) { const std::vector& fi_t = i.t; Expression* body = i.fi->e(); i.fi->e(nullptr); pp.print(i.fi); i.fi->e(body); if (fi_t.size() == c->argCount()) { for (unsigned int j = 0; j < c->argCount(); j++) { if (!env.isSubtype(c->arg(j)->type(), fi_t[j], strictEnums)) { oss << " (argument " << (j + 1) << " expects type " << fi_t[j].toString(env); oss << ", but type " << c->arg(j)->type().toString(env) << " given)\n"; } if (c->arg(j)->type().isbot() && fi_t[j].bt() != Type::BT_TOP) { botarg = c->arg(j); } } } else { oss << " (requires " << i.fi->params().size() << " argument" << (i.fi->params().size() == 1 ? "" : "s") << ", but " << c->argCount() << " given)\n"; } } throw TypeError(env, c->loc(), oss.str()); } return nullptr; } if (matched.size() == 1) { return matched[0]; } Type t = matched[0]->ti()->type(); t.ti(Type::TI_PAR); for (unsigned int i = 1; i < matched.size(); i++) { if (!env.isSubtype(t, matched[i]->ti()->type(), strictEnums)) { throw TypeError(env, botarg->loc(), "ambiguous overloading on return type of function"); } } return matched[0]; } namespace { int first_overloaded(EnvI& env, const std::vector& v_f, int i_f) { int first_i_f = i_f; for (; (first_i_f--) != 0;) { // find first instance overloaded on subtypes if (v_f[first_i_f].t.size() != v_f[i_f].t.size()) { break; } bool allSubtypes = true; for (unsigned int i = 0; i < v_f[first_i_f].t.size(); i++) { if (!env.isSubtype(v_f[first_i_f].t[i], v_f[i_f].t[i], false)) { allSubtypes = false; break; } } if (!allSubtypes) { break; } } return first_i_f + 1; } } // namespace bool Model::sameOverloading(EnvI& env, const std::vector& args, FunctionI* f, FunctionI* g) const { const Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } auto it_f = m->_fnmap.find(f->id()); auto it_g = m->_fnmap.find(g->id()); assert(it_f != m->_fnmap.end()); assert(it_g != m->_fnmap.end()); const std::vector& v_f = it_f->second; const std::vector& v_g = it_g->second; std::vector dummyMatched; Expression* dummyBotarg; int i_f = match_idx(dummyMatched, dummyBotarg, env, v_f, args, true); if (i_f == -1) { return false; } int i_g = match_idx(dummyMatched, dummyBotarg, env, v_g, args, true); if (i_g == -1) { return false; } assert(i_f < v_f.size()); assert(i_g < v_g.size()); unsigned int first_i_f = first_overloaded(env, v_f, i_f); unsigned int first_i_g = first_overloaded(env, v_g, i_g); if (i_f - first_i_f != i_g - first_i_g) { // not the same number of overloaded versions return false; } for (; first_i_f <= i_f; first_i_f++, first_i_g++) { if (!(v_f[first_i_f].t == v_g[first_i_g].t)) { // one of the overloaded versions does not agree in the types return false; } } return true; } FunctionI* Model::matchRevMap(EnvI& env, const Type& t0) const { const Model* m = this; while (m->_parent != nullptr) { m = m->_parent; } Type t = t0; t.enumId(0); auto it = _revmapmap.find(t.toInt()); if (it != _revmapmap.end()) { return it->second; } return nullptr; } Item*& Model::operator[](unsigned int i) { assert(i < _items.size()); return _items[i]; } const Item* Model::operator[](unsigned int i) const { assert(i < _items.size()); return _items[i]; } unsigned int Model::size() const { return static_cast(_items.size()); } std::vector::iterator Model::begin() { return _items.begin(); } std::vector::const_iterator Model::begin() const { return _items.begin(); } std::vector::iterator Model::end() { return _items.end(); } std::vector::const_iterator Model::end() const { return _items.end(); } void Model::compact() { struct { bool operator()(const Item* i) { return i->removed(); } } isremoved; _items.erase(remove_if(_items.begin(), _items.end(), isremoved), _items.end()); } } // namespace MiniZinc libminizinc-2.5.3/lib/cached/0000755000175000017500000000000013757304533014455 5ustar kaolkaollibminizinc-2.5.3/lib/cached/md5_cached.cmake0000644000175000017500000000040113757304533017426 0ustar kaolkaolset(lexer_lxx_md5_cached "6346180a9a94e9f5218239f10ce67a32") set(parser_yxx_md5_cached "dca3042b18c4db1f1e625d1d46bdb3d1") set(regex_lexer_lxx_md5_cached "8906a52bfa0c5ae26354cb272348e656") set(regex_parser_yxx_md5_cached "68ec070becef5e161c3b97d085b0810e")libminizinc-2.5.3/lib/cached/minizinc/0000755000175000017500000000000013757304533016275 5ustar kaolkaollibminizinc-2.5.3/lib/cached/minizinc/parser.tab.hh0000644000175000017500000002446113757304533020666 0ustar kaolkaol/* A Bison parser, made by GNU Bison 3.6.4. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_MZN_YY_USERS_TACK_PROGRAMMING_MINIZINC_LIBMZN_DEVELOP_BUILD_INCLUDE_MINIZINC_PARSER_TAB_HH_INCLUDED # define YY_MZN_YY_USERS_TACK_PROGRAMMING_MINIZINC_LIBMZN_DEVELOP_BUILD_INCLUDE_MINIZINC_PARSER_TAB_HH_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int mzn_yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, END = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ MZN_INTEGER_LITERAL = 258, /* "integer literal" */ MZN_BOOL_LITERAL = 259, /* "bool literal" */ MZN_FLOAT_LITERAL = 260, /* "float literal" */ MZN_IDENTIFIER = 261, /* "identifier" */ MZN_QUOTED_IDENTIFIER = 262, /* "quoted identifier" */ MZN_STRING_LITERAL = 263, /* "string literal" */ MZN_STRING_QUOTE_START = 264, /* "interpolated string start" */ MZN_STRING_QUOTE_MID = 265, /* "interpolated string middle" */ MZN_STRING_QUOTE_END = 266, /* "interpolated string end" */ MZN_TI_IDENTIFIER = 267, /* "type-inst identifier" */ MZN_TI_ENUM_IDENTIFIER = 268, /* "type-inst enum identifier" */ MZN_DOC_COMMENT = 269, /* "documentation comment" */ MZN_DOC_FILE_COMMENT = 270, /* "file-level documentation comment" */ MZN_VAR = 271, /* "var" */ MZN_PAR = 272, /* "par" */ MZN_ABSENT = 273, /* "<>" */ MZN_ANN = 274, /* "ann" */ MZN_ANNOTATION = 275, /* "annotation" */ MZN_ANY = 276, /* "any" */ MZN_ARRAY = 277, /* "array" */ MZN_BOOL = 278, /* "bool" */ MZN_CASE = 279, /* "case" */ MZN_CONSTRAINT = 280, /* "constraint" */ MZN_DEFAULT = 281, /* "default" */ MZN_ELSE = 282, /* "else" */ MZN_ELSEIF = 283, /* "elseif" */ MZN_ENDIF = 284, /* "endif" */ MZN_ENUM = 285, /* "enum" */ MZN_FLOAT = 286, /* "float" */ MZN_FUNCTION = 287, /* "function" */ MZN_IF = 288, /* "if" */ MZN_INCLUDE = 289, /* "include" */ MZN_INFINITY = 290, /* "infinity" */ MZN_INT = 291, /* "int" */ MZN_LET = 292, /* "let" */ MZN_LIST = 293, /* "list" */ MZN_MAXIMIZE = 294, /* "maximize" */ MZN_MINIMIZE = 295, /* "minimize" */ MZN_OF = 296, /* "of" */ MZN_OPT = 297, /* "opt" */ MZN_SATISFY = 298, /* "satisfy" */ MZN_OUTPUT = 299, /* "output" */ MZN_PREDICATE = 300, /* "predicate" */ MZN_RECORD = 301, /* "record" */ MZN_SET = 302, /* "set" */ MZN_SOLVE = 303, /* "solve" */ MZN_STRING = 304, /* "string" */ MZN_TEST = 305, /* "test" */ MZN_THEN = 306, /* "then" */ MZN_TUPLE = 307, /* "tuple" */ MZN_TYPE = 308, /* "type" */ MZN_UNDERSCORE = 309, /* "_" */ MZN_VARIANT_RECORD = 310, /* "variant_record" */ MZN_WHERE = 311, /* "where" */ MZN_LEFT_BRACKET = 312, /* "[" */ MZN_LEFT_2D_BRACKET = 313, /* "[|" */ MZN_RIGHT_BRACKET = 314, /* "]" */ MZN_RIGHT_2D_BRACKET = 315, /* "|]" */ FLATZINC_IDENTIFIER = 316, /* FLATZINC_IDENTIFIER */ MZN_INVALID_INTEGER_LITERAL = 317, /* "invalid integer literal" */ MZN_INVALID_FLOAT_LITERAL = 318, /* "invalid float literal" */ MZN_UNTERMINATED_STRING = 319, /* "unterminated string" */ MZN_END_OF_LINE_IN_STRING = 320, /* "end of line inside string literal" */ MZN_INVALID_NULL = 321, /* "null character" */ MZN_EQUIV = 322, /* "<->" */ MZN_IMPL = 323, /* "->" */ MZN_RIMPL = 324, /* "<-" */ MZN_OR = 325, /* "\\/" */ MZN_XOR = 326, /* "xor" */ MZN_AND = 327, /* "/\\" */ MZN_LE = 328, /* "<" */ MZN_GR = 329, /* ">" */ MZN_LQ = 330, /* "<=" */ MZN_GQ = 331, /* ">=" */ MZN_EQ = 332, /* "=" */ MZN_NQ = 333, /* "!=" */ MZN_WEAK_EQ = 334, /* "~=" */ MZN_IN = 335, /* "in" */ MZN_SUBSET = 336, /* "subset" */ MZN_SUPERSET = 337, /* "superset" */ MZN_UNION = 338, /* "union" */ MZN_DIFF = 339, /* "diff" */ MZN_SYMDIFF = 340, /* "symdiff" */ MZN_DOTDOT = 341, /* ".." */ MZN_PLUS = 342, /* "+" */ MZN_MINUS = 343, /* "-" */ MZN_WEAK_PLUS = 344, /* "~+" */ MZN_WEAK_MINUS = 345, /* "~-" */ MZN_MULT = 346, /* "*" */ MZN_DIV = 347, /* "/" */ MZN_IDIV = 348, /* "div" */ MZN_MOD = 349, /* "mod" */ MZN_INTERSECT = 350, /* "intersect" */ MZN_WEAK_MULT = 351, /* "~*" */ MZN_POW = 352, /* "^" */ MZN_POW_MINUS1 = 353, /* "^-1" */ MZN_NOT = 354, /* "not" */ MZN_PLUSPLUS = 355, /* "++" */ MZN_COLONCOLON = 356, /* "::" */ PREC_ANNO = 357, /* PREC_ANNO */ MZN_EQUIV_QUOTED = 358, /* "'<->'" */ MZN_IMPL_QUOTED = 359, /* "'->'" */ MZN_RIMPL_QUOTED = 360, /* "'<-'" */ MZN_OR_QUOTED = 361, /* "'\\/'" */ MZN_XOR_QUOTED = 362, /* "'xor'" */ MZN_AND_QUOTED = 363, /* "'/\\'" */ MZN_LE_QUOTED = 364, /* "'<'" */ MZN_GR_QUOTED = 365, /* "'>'" */ MZN_LQ_QUOTED = 366, /* "'<='" */ MZN_GQ_QUOTED = 367, /* "'>='" */ MZN_EQ_QUOTED = 368, /* "'='" */ MZN_NQ_QUOTED = 369, /* "'!='" */ MZN_IN_QUOTED = 370, /* "'in'" */ MZN_SUBSET_QUOTED = 371, /* "'subset'" */ MZN_SUPERSET_QUOTED = 372, /* "'superset'" */ MZN_UNION_QUOTED = 373, /* "'union'" */ MZN_DIFF_QUOTED = 374, /* "'diff'" */ MZN_SYMDIFF_QUOTED = 375, /* "'symdiff'" */ MZN_DOTDOT_QUOTED = 376, /* "'..'" */ MZN_PLUS_QUOTED = 377, /* "'+'" */ MZN_MINUS_QUOTED = 378, /* "'-'" */ MZN_MULT_QUOTED = 379, /* "'*'" */ MZN_DIV_QUOTED = 380, /* "'/'" */ MZN_IDIV_QUOTED = 381, /* "'div'" */ MZN_MOD_QUOTED = 382, /* "'mod'" */ MZN_INTERSECT_QUOTED = 383, /* "'intersect'" */ MZN_POW_QUOTED = 384, /* "'^'" */ MZN_NOT_QUOTED = 385, /* "'not'" */ MZN_COLONCOLON_QUOTED = 386, /* "'::'" */ MZN_PLUSPLUS_QUOTED = 387 /* "'++'" */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { long long int iValue; char* sValue; bool bValue; double dValue; MiniZinc::Item* item; MiniZinc::VarDecl* vardeclexpr; std::vector* vardeclexprs; MiniZinc::TypeInst* tiexpr; std::vector* tiexprs; MiniZinc::Expression* expression; std::vector* expressions1d; std::vector >* expressions2d; std::vector > >* expressions3d; MiniZinc::Generator* generator; std::vector* generators; std::vector* strings; std::vector >* expressionPairs; MiniZinc::Generators* generatorsPointer; }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif /* Location type. */ #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED typedef struct YYLTYPE YYLTYPE; struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; }; # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif int mzn_yyparse (void *parm); #endif /* !YY_MZN_YY_USERS_TACK_PROGRAMMING_MINIZINC_LIBMZN_DEVELOP_BUILD_INCLUDE_MINIZINC_PARSER_TAB_HH_INCLUDED */ libminizinc-2.5.3/lib/cached/minizinc/support/0000755000175000017500000000000013757304533020011 5ustar kaolkaollibminizinc-2.5.3/lib/cached/minizinc/support/regex_parser.tab.hh0000644000175000017500000000706113757304533023571 0ustar kaolkaol/* A Bison parser, made by GNU Bison 3.7.2. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_REGEX_YY_USERS_JDEK0001_DROPBOX_DEVELOPMENT_MINIZINC_BUILD_INCLUDE_MINIZINC_SUPPORT_REGEX_PARSER_TAB_HH_INCLUDED # define YY_REGEX_YY_USERS_JDEK0001_DROPBOX_DEVELOPMENT_MINIZINC_BUILD_INCLUDE_MINIZINC_SUPPORT_REGEX_PARSER_TAB_HH_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int regex_yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ R_INTEGER = 258, /* R_INTEGER */ R_GROUP_OPEN = 259, /* "(" */ R_GROUP_CLOSE = 260, /* ")" */ R_STAR = 261, /* "*" */ R_PLUS = 262, /* "+" */ R_ANY = 263, /* "." */ R_UNION = 264, /* "|" */ R_OPTIONAL = 265, /* "?" */ R_QUANT_OPEN = 266, /* "{" */ R_QUANT_CLOSE = 267, /* "}" */ R_COMMA = 268, /* "," */ R_CLASS_OPEN = 269, /* "[" */ R_CLASS_CLOSE = 270, /* "]" */ R_CLASS_RANGE = 271, /* "-" */ R_CLASS_NEG = 272, /* "^" */ R_IDENTIFIER = 273 /* R_IDENTIFIER */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { int iValue; char* sValue; std::set* setValue; Gecode::REG* rValue; }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE regex_yylval; int regex_yyparse (REContext& ctx); #endif /* !YY_REGEX_YY_USERS_JDEK0001_DROPBOX_DEVELOPMENT_MINIZINC_BUILD_INCLUDE_MINIZINC_SUPPORT_REGEX_PARSER_TAB_HH_INCLUDED */ libminizinc-2.5.3/lib/cached/regex_parser.tab.cpp0000644000175000017500000013234613757304533020425 0ustar kaolkaol/* A Bison parser, made by GNU Bison 3.7.2. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.7.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Substitute the variable and function names. */ #define yyparse regex_yyparse #define yylex regex_yylex #define yyerror regex_yyerror #define yydebug regex_yydebug #define yynerrs regex_yynerrs #define yylval regex_yylval #define yychar regex_yychar /* First part of user prologue. */ #include #include #include #include #undef ERROR using namespace Gecode; using namespace MiniZinc; typedef struct yy_buffer_state *YY_BUFFER_STATE; YY_BUFFER_STATE regex_yy_scan_string ( const char* yy_str ); extern int yylex(); extern FILE* yyin; typedef struct REContext{ REG* expr; const IntSetVal& dom; } REContext; void yyerror(REContext& ctx, const char* s); # ifndef YY_CAST # ifdef __cplusplus # define YY_CAST(Type, Val) static_cast (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif #include /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_R_INTEGER = 3, /* R_INTEGER */ YYSYMBOL_R_GROUP_OPEN = 4, /* "(" */ YYSYMBOL_R_GROUP_CLOSE = 5, /* ")" */ YYSYMBOL_R_STAR = 6, /* "*" */ YYSYMBOL_R_PLUS = 7, /* "+" */ YYSYMBOL_R_ANY = 8, /* "." */ YYSYMBOL_R_UNION = 9, /* "|" */ YYSYMBOL_R_OPTIONAL = 10, /* "?" */ YYSYMBOL_R_QUANT_OPEN = 11, /* "{" */ YYSYMBOL_R_QUANT_CLOSE = 12, /* "}" */ YYSYMBOL_R_COMMA = 13, /* "," */ YYSYMBOL_R_CLASS_OPEN = 14, /* "[" */ YYSYMBOL_R_CLASS_CLOSE = 15, /* "]" */ YYSYMBOL_R_CLASS_RANGE = 16, /* "-" */ YYSYMBOL_R_CLASS_NEG = 17, /* "^" */ YYSYMBOL_R_IDENTIFIER = 18, /* R_IDENTIFIER */ YYSYMBOL_YYACCEPT = 19, /* $accept */ YYSYMBOL_regex = 20, /* regex */ YYSYMBOL_expression = 21, /* expression */ YYSYMBOL_term = 22, /* term */ YYSYMBOL_factor = 23, /* factor */ YYSYMBOL_atom = 24, /* atom */ YYSYMBOL_set_items = 25, /* set_items */ YYSYMBOL_set_item = 26 /* set_item */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int8 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 15 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 28 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 19 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 8 /* YYNRULES -- Number of rules. */ #define YYNRULES 22 /* YYNSTATES -- Number of states. */ #define YYNSTATES 36 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 273 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 73, 73, 80, 81, 89, 90, 98, 99, 104, 109, 114, 119, 124, 131, 133, 138, 148, 163, 167, 168, 178, 182 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if YYDEBUG || 0 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "R_INTEGER", "\"(\"", "\")\"", "\"*\"", "\"+\"", "\".\"", "\"|\"", "\"?\"", "\"{\"", "\"}\"", "\",\"", "\"[\"", "\"]\"", "\"-\"", "\"^\"", "R_IDENTIFIER", "$accept", "regex", "expression", "term", "factor", "atom", "set_items", "set_item", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_int16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273 }; #endif #define YYPACT_NINF (-11) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-1) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int8 yypact[] = { 2, -11, 2, -11, -3, 9, -11, 4, 2, 11, 6, 3, 17, 8, 17, -11, 2, -11, -11, -11, -11, 21, -11, 22, 12, -11, -11, -11, -5, -11, -11, -11, 0, 14, -11, -11 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_int8 yydefact[] = { 0, 14, 0, 15, 0, 0, 2, 3, 5, 7, 0, 21, 0, 0, 19, 1, 0, 6, 8, 9, 10, 0, 18, 0, 0, 16, 20, 4, 0, 22, 17, 11, 0, 0, 12, 13 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -11, -11, -1, 20, -11, -11, -10, -11 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 5, 6, 7, 8, 9, 13, 14 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { 11, 10, 24, 33, 26, 1, 2, 31, 32, 15, 3, 22, 34, 16, 12, 27, 4, 18, 19, 23, 11, 20, 21, 25, 28, 29, 35, 30, 17 }; static const yytype_int8 yycheck[] = { 3, 2, 12, 3, 14, 3, 4, 12, 13, 0, 8, 5, 12, 9, 17, 16, 14, 6, 7, 16, 3, 10, 11, 15, 3, 3, 12, 15, 8 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { 0, 3, 4, 8, 14, 20, 21, 22, 23, 24, 21, 3, 17, 25, 26, 0, 9, 22, 6, 7, 10, 11, 5, 16, 25, 15, 25, 21, 3, 3, 15, 12, 13, 3, 12, 12 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_int8 yyr1[] = { 0, 19, 20, 21, 21, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 26, 26 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 1, 3, 1, 2, 1, 2, 2, 2, 4, 5, 6, 1, 1, 3, 4, 3, 1, 2, 1, 3 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (ctx, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* This macro is provided for backward compatibility. */ # ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value, ctx); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, REContext& ctx) { FILE *yyoutput = yyo; YYUSE (yyoutput); YYUSE (ctx); if (!yyvaluep) return; # ifdef YYPRINT if (yykind < YYNTOKENS) YYPRINT (yyo, yytoknum[yykind], *yyvaluep); # endif YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, REContext& ctx) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); yy_symbol_value_print (yyo, yykind, yyvaluep, ctx); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, REContext& ctx) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)], ctx); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule, ctx); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, REContext& ctx) { YYUSE (yyvaluep); YYUSE (ctx); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* Lookahead token kind. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (REContext& ctx) { yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize = YYINITDEPTH; /* The state stack: array, bottom, top. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss = yyssa; yy_state_t *yyssp = yyss; /* The semantic value stack: array, bottom, top. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp = yyvs; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead symbol kind. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE goto yyexhaustedlab; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = YYEOF; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* regex: expression */ { *ctx.expr = (*(yyvsp[0].rValue)); delete (yyvsp[0].rValue); } break; case 4: /* expression: term "|" expression */ { *(yyvsp[-2].rValue) = *(yyvsp[-2].rValue) | *(yyvsp[0].rValue); delete (yyvsp[0].rValue); (yyval.rValue) = (yyvsp[-2].rValue); } break; case 6: /* term: factor term */ { *(yyvsp[-1].rValue) = *(yyvsp[-1].rValue) + *(yyvsp[0].rValue); delete (yyvsp[0].rValue); (yyval.rValue) = (yyvsp[-1].rValue); } break; case 8: /* factor: atom "*" */ { *(yyvsp[-1].rValue) = *(*(yyvsp[-1].rValue)); (yyval.rValue) = (yyvsp[-1].rValue); } break; case 9: /* factor: atom "+" */ { *(yyvsp[-1].rValue) = +(*(yyvsp[-1].rValue)); (yyval.rValue) = (yyvsp[-1].rValue); } break; case 10: /* factor: atom "?" */ { *(yyvsp[-1].rValue) = (*(yyvsp[-1].rValue))(0, 1); (yyval.rValue) = (yyvsp[-1].rValue); } break; case 11: /* factor: atom "{" R_INTEGER "}" */ { *(yyvsp[-3].rValue) = (*(yyvsp[-3].rValue))((yyvsp[-1].iValue), (yyvsp[-1].iValue)); (yyval.rValue) = (yyvsp[-3].rValue); } break; case 12: /* factor: atom "{" R_INTEGER "," "}" */ { *(yyvsp[-4].rValue) = (*(yyvsp[-4].rValue))((yyvsp[-2].iValue)); (yyval.rValue) = (yyvsp[-4].rValue); } break; case 13: /* factor: atom "{" R_INTEGER "," R_INTEGER "}" */ { *(yyvsp[-5].rValue) = (*(yyvsp[-5].rValue))((yyvsp[-3].iValue), (yyvsp[-1].iValue)); (yyval.rValue) = (yyvsp[-5].rValue); } break; case 14: /* atom: R_INTEGER */ { (yyval.rValue) = new REG((yyvsp[0].iValue)); } break; case 15: /* atom: "." */ { IntArgs range = IntArgs::create(ctx.dom.max().toInt() - ctx.dom.min().toInt() + 1, ctx.dom.min().toInt()); (yyval.rValue) = new REG(range); } break; case 16: /* atom: "[" set_items "]" */ { std::vector v; v.reserve((yyvsp[-1].setValue)->size()); for(auto i : *(yyvsp[-1].setValue)) { v.push_back(i); } delete (yyvsp[-1].setValue); (yyval.rValue) = new REG(IntArgs(v)); } break; case 17: /* atom: "[" "^" set_items "]" */ { std::vector diff; std::set domain; for(int i = ctx.dom.min().toInt(); i<=ctx.dom.max().toInt(); ++i) { domain.insert(i); } std::set_difference( domain.begin(), domain.end(), (yyvsp[-1].setValue)->begin(), (yyvsp[-1].setValue)->end(), std::inserter(diff, diff.begin()) ); delete (yyvsp[-1].setValue); (yyval.rValue) = new REG(IntArgs(diff)); } break; case 18: /* atom: "(" expression ")" */ { (yyval.rValue) = (yyvsp[-1].rValue); } break; case 20: /* set_items: set_item set_items */ { (yyval.setValue) = (yyvsp[-1].setValue); for (auto i : *(yyvsp[0].setValue)) { (yyvsp[-1].setValue)->insert(i); } delete (yyvsp[0].setValue); } break; case 21: /* set_item: R_INTEGER */ { (yyval.setValue) = new std::set({(yyvsp[0].iValue)}); } break; case 22: /* set_item: R_INTEGER "-" R_INTEGER */ { int from = (yyvsp[-2].iValue); int to = (yyvsp[0].iValue); if (to < from) { std::swap(from,to); } (yyval.setValue) = new std::set; for(int i = from; i<=to; ++i) { (yyval.setValue)->insert(i); } } break; default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; yyerror (ctx, YY_("syntax error")); } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, ctx); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp, ctx); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (ctx, YY_("memory exhausted")); yyresult = 2; goto yyreturn; #endif /*-------------------------------------------------------. | yyreturn -- parsing is finished, clean up and return. | `-------------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, ctx); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, ctx); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } void yyerror(REContext& ctx, const char* s) { // TODO: Add error location throw std::runtime_error("Cannot parse regular expression: " + std::string(s)); } std::unique_ptr regex_from_string(const std::string& regex_str, const IntSetVal& domain) { REG* expr = new REG(); regex_yy_scan_string(regex_str.c_str()); REContext rctx = REContext{expr, domain}; int err = yyparse(rctx); if (err != 0) { throw std::runtime_error("Cannot parse regular expression, error code " + std::to_string(err)); } return std::unique_ptr(expr); } libminizinc-2.5.3/lib/cached/regex_lexer.yy.cpp0000644000175000017500000014460613757304533020145 0ustar kaolkaol #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer regex_yy_create_buffer #define yy_delete_buffer regex_yy_delete_buffer #define yy_scan_buffer regex_yy_scan_buffer #define yy_scan_string regex_yy_scan_string #define yy_scan_bytes regex_yy_scan_bytes #define yy_init_buffer regex_yy_init_buffer #define yy_flush_buffer regex_yy_flush_buffer #define yy_load_buffer_state regex_yy_load_buffer_state #define yy_switch_to_buffer regex_yy_switch_to_buffer #define yypush_buffer_state regex_yypush_buffer_state #define yypop_buffer_state regex_yypop_buffer_state #define yyensure_buffer_stack regex_yyensure_buffer_stack #define yy_flex_debug regex_yy_flex_debug #define yyin regex_yyin #define yyleng regex_yyleng #define yylex regex_yylex #define yylineno regex_yylineno #define yyout regex_yyout #define yyrestart regex_yyrestart #define yytext regex_yytext #define yywrap regex_yywrap #define yyalloc regex_yyalloc #define yyrealloc regex_yyrealloc #define yyfree regex_yyfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define regex_yy_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer regex_yy_create_buffer #endif #ifdef yy_delete_buffer #define regex_yy_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer regex_yy_delete_buffer #endif #ifdef yy_scan_buffer #define regex_yy_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer regex_yy_scan_buffer #endif #ifdef yy_scan_string #define regex_yy_scan_string_ALREADY_DEFINED #else #define yy_scan_string regex_yy_scan_string #endif #ifdef yy_scan_bytes #define regex_yy_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes regex_yy_scan_bytes #endif #ifdef yy_init_buffer #define regex_yy_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer regex_yy_init_buffer #endif #ifdef yy_flush_buffer #define regex_yy_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer regex_yy_flush_buffer #endif #ifdef yy_load_buffer_state #define regex_yy_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state regex_yy_load_buffer_state #endif #ifdef yy_switch_to_buffer #define regex_yy_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer regex_yy_switch_to_buffer #endif #ifdef yypush_buffer_state #define regex_yypush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state regex_yypush_buffer_state #endif #ifdef yypop_buffer_state #define regex_yypop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state regex_yypop_buffer_state #endif #ifdef yyensure_buffer_stack #define regex_yyensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack regex_yyensure_buffer_stack #endif #ifdef yylex #define regex_yylex_ALREADY_DEFINED #else #define yylex regex_yylex #endif #ifdef yyrestart #define regex_yyrestart_ALREADY_DEFINED #else #define yyrestart regex_yyrestart #endif #ifdef yylex_init #define regex_yylex_init_ALREADY_DEFINED #else #define yylex_init regex_yylex_init #endif #ifdef yylex_init_extra #define regex_yylex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra regex_yylex_init_extra #endif #ifdef yylex_destroy #define regex_yylex_destroy_ALREADY_DEFINED #else #define yylex_destroy regex_yylex_destroy #endif #ifdef yyget_debug #define regex_yyget_debug_ALREADY_DEFINED #else #define yyget_debug regex_yyget_debug #endif #ifdef yyset_debug #define regex_yyset_debug_ALREADY_DEFINED #else #define yyset_debug regex_yyset_debug #endif #ifdef yyget_extra #define regex_yyget_extra_ALREADY_DEFINED #else #define yyget_extra regex_yyget_extra #endif #ifdef yyset_extra #define regex_yyset_extra_ALREADY_DEFINED #else #define yyset_extra regex_yyset_extra #endif #ifdef yyget_in #define regex_yyget_in_ALREADY_DEFINED #else #define yyget_in regex_yyget_in #endif #ifdef yyset_in #define regex_yyset_in_ALREADY_DEFINED #else #define yyset_in regex_yyset_in #endif #ifdef yyget_out #define regex_yyget_out_ALREADY_DEFINED #else #define yyget_out regex_yyget_out #endif #ifdef yyset_out #define regex_yyset_out_ALREADY_DEFINED #else #define yyset_out regex_yyset_out #endif #ifdef yyget_leng #define regex_yyget_leng_ALREADY_DEFINED #else #define yyget_leng regex_yyget_leng #endif #ifdef yyget_text #define regex_yyget_text_ALREADY_DEFINED #else #define yyget_text regex_yyget_text #endif #ifdef yyget_lineno #define regex_yyget_lineno_ALREADY_DEFINED #else #define yyget_lineno regex_yyget_lineno #endif #ifdef yyset_lineno #define regex_yyset_lineno_ALREADY_DEFINED #else #define yyset_lineno regex_yyset_lineno #endif #ifdef yywrap #define regex_yywrap_ALREADY_DEFINED #else #define yywrap regex_yywrap #endif #ifdef yyalloc #define regex_yyalloc_ALREADY_DEFINED #else #define yyalloc regex_yyalloc #endif #ifdef yyrealloc #define regex_yyrealloc_ALREADY_DEFINED #else #define yyrealloc regex_yyrealloc #endif #ifdef yyfree #define regex_yyfree_ALREADY_DEFINED #else #define yyfree regex_yyfree #endif #ifdef yytext #define regex_yytext_ALREADY_DEFINED #else #define yytext regex_yytext #endif #ifdef yyleng #define regex_yyleng_ALREADY_DEFINED #else #define yyleng regex_yyleng #endif #ifdef yyin #define regex_yyin_ALREADY_DEFINED #else #define yyin regex_yyin #endif #ifdef yyout #define regex_yyout_ALREADY_DEFINED #else #define yyout regex_yyout #endif #ifdef yy_flex_debug #define regex_yy_flex_debug_ALREADY_DEFINED #else #define yy_flex_debug regex_yy_flex_debug #endif #ifdef yylineno #define regex_yylineno_ALREADY_DEFINED #else #define yylineno regex_yylineno #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart ( FILE *input_file ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); void yy_delete_buffer ( YY_BUFFER_STATE b ); void yy_flush_buffer ( YY_BUFFER_STATE b ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); void yypop_buffer_state ( void ); static void yyensure_buffer_stack ( void ); static void yy_load_buffer_state ( void ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); void *yyalloc ( yy_size_t ); void *yyrealloc ( void *, yy_size_t ); void yyfree ( void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define regex_yywrap() (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext static yy_state_type yy_get_previous_state ( void ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); static int yy_get_next_buffer ( void ); static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 18 #define YY_END_OF_BUFFER 19 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[24] = { 0, 0, 0, 19, 17, 1, 1, 6, 7, 5, 4, 11, 15, 12, 2, 8, 13, 14, 16, 9, 3, 10, 2, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 14, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 17, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[19] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const flex_int16_t yy_base[24] = { 0, 0, 0, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 9, 22, 22, 22, 22, 22, 22, 22, 8, 22 } ; static const flex_int16_t yy_def[24] = { 0, 23, 1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0 } ; static const flex_int16_t yy_nxt[41] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 3, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23 } ; static const flex_int16_t yy_chk[41] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 14, 3, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #define YY_DECL int yylex() #include #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( void ); int yyget_debug ( void ); void yyset_debug ( int debug_flag ); YY_EXTRA_TYPE yyget_extra ( void ); void yyset_extra ( YY_EXTRA_TYPE user_defined ); FILE *yyget_in ( void ); void yyset_in ( FILE * _in_str ); FILE *yyget_out ( void ); void yyset_out ( FILE * _out_str ); int yyget_leng ( void ); char *yyget_text ( void ); int yyget_lineno ( void ); void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( void ); #else extern int yywrap ( void ); #endif #endif #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( void ); #else static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 24 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 22 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP { /* ignore white space */ } YY_BREAK case 2: YY_RULE_SETUP { regex_yylval.iValue = std::atoi(regex_yytext); return R_INTEGER; } YY_BREAK case 3: YY_RULE_SETUP { return R_UNION; } YY_BREAK case 4: YY_RULE_SETUP { return R_PLUS; } YY_BREAK case 5: YY_RULE_SETUP { return R_STAR; } YY_BREAK case 6: YY_RULE_SETUP { return R_GROUP_OPEN; } YY_BREAK case 7: YY_RULE_SETUP { return R_GROUP_CLOSE; } YY_BREAK case 8: YY_RULE_SETUP { return R_OPTIONAL; } YY_BREAK case 9: YY_RULE_SETUP { return R_QUANT_OPEN; } YY_BREAK case 10: YY_RULE_SETUP { return R_QUANT_CLOSE; } YY_BREAK case 11: YY_RULE_SETUP { return R_COMMA; } YY_BREAK case 12: YY_RULE_SETUP { return R_ANY; } YY_BREAK case 13: YY_RULE_SETUP { return R_CLASS_OPEN; } YY_BREAK case 14: YY_RULE_SETUP { return R_CLASS_CLOSE; } YY_BREAK case 15: YY_RULE_SETUP { return R_CLASS_RANGE; } YY_BREAK case 16: YY_RULE_SETUP { return R_CLASS_NEG; } YY_BREAK case 17: YY_RULE_SETUP { /* Catch all */ throw std::runtime_error("Illegal token in regular expression: '" + std::string(regex_yytext) + "'"); } YY_BREAK case 18: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { yy_state_type yy_current_state; char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 24 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { int yy_is_jam; char *yy_cp = (yy_c_buf_p); YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 24 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 23); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf ); yyfree( (void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr ) { return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg ) { fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" libminizinc-2.5.3/lib/cached/lexer.yy.cpp0000644000175000017500000030647413757304533016756 0ustar kaolkaol #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define mzn_yy_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer mzn_yy_create_buffer #endif #ifdef yy_delete_buffer #define mzn_yy_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer mzn_yy_delete_buffer #endif #ifdef yy_scan_buffer #define mzn_yy_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer mzn_yy_scan_buffer #endif #ifdef yy_scan_string #define mzn_yy_scan_string_ALREADY_DEFINED #else #define yy_scan_string mzn_yy_scan_string #endif #ifdef yy_scan_bytes #define mzn_yy_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes mzn_yy_scan_bytes #endif #ifdef yy_init_buffer #define mzn_yy_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer mzn_yy_init_buffer #endif #ifdef yy_flush_buffer #define mzn_yy_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer mzn_yy_flush_buffer #endif #ifdef yy_load_buffer_state #define mzn_yy_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state mzn_yy_load_buffer_state #endif #ifdef yy_switch_to_buffer #define mzn_yy_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer mzn_yy_switch_to_buffer #endif #ifdef yypush_buffer_state #define mzn_yypush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state mzn_yypush_buffer_state #endif #ifdef yypop_buffer_state #define mzn_yypop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state mzn_yypop_buffer_state #endif #ifdef yyensure_buffer_stack #define mzn_yyensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack mzn_yyensure_buffer_stack #endif #ifdef yylex #define mzn_yylex_ALREADY_DEFINED #else #define yylex mzn_yylex #endif #ifdef yyrestart #define mzn_yyrestart_ALREADY_DEFINED #else #define yyrestart mzn_yyrestart #endif #ifdef yylex_init #define mzn_yylex_init_ALREADY_DEFINED #else #define yylex_init mzn_yylex_init #endif #ifdef yylex_init_extra #define mzn_yylex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra mzn_yylex_init_extra #endif #ifdef yylex_destroy #define mzn_yylex_destroy_ALREADY_DEFINED #else #define yylex_destroy mzn_yylex_destroy #endif #ifdef yyget_debug #define mzn_yyget_debug_ALREADY_DEFINED #else #define yyget_debug mzn_yyget_debug #endif #ifdef yyset_debug #define mzn_yyset_debug_ALREADY_DEFINED #else #define yyset_debug mzn_yyset_debug #endif #ifdef yyget_extra #define mzn_yyget_extra_ALREADY_DEFINED #else #define yyget_extra mzn_yyget_extra #endif #ifdef yyset_extra #define mzn_yyset_extra_ALREADY_DEFINED #else #define yyset_extra mzn_yyset_extra #endif #ifdef yyget_in #define mzn_yyget_in_ALREADY_DEFINED #else #define yyget_in mzn_yyget_in #endif #ifdef yyset_in #define mzn_yyset_in_ALREADY_DEFINED #else #define yyset_in mzn_yyset_in #endif #ifdef yyget_out #define mzn_yyget_out_ALREADY_DEFINED #else #define yyget_out mzn_yyget_out #endif #ifdef yyset_out #define mzn_yyset_out_ALREADY_DEFINED #else #define yyset_out mzn_yyset_out #endif #ifdef yyget_leng #define mzn_yyget_leng_ALREADY_DEFINED #else #define yyget_leng mzn_yyget_leng #endif #ifdef yyget_text #define mzn_yyget_text_ALREADY_DEFINED #else #define yyget_text mzn_yyget_text #endif #ifdef yyget_lineno #define mzn_yyget_lineno_ALREADY_DEFINED #else #define yyget_lineno mzn_yyget_lineno #endif #ifdef yyset_lineno #define mzn_yyset_lineno_ALREADY_DEFINED #else #define yyset_lineno mzn_yyset_lineno #endif #ifdef yyget_column #define mzn_yyget_column_ALREADY_DEFINED #else #define yyget_column mzn_yyget_column #endif #ifdef yyset_column #define mzn_yyset_column_ALREADY_DEFINED #else #define yyset_column mzn_yyset_column #endif #ifdef yywrap #define mzn_yywrap_ALREADY_DEFINED #else #define yywrap mzn_yywrap #endif #ifdef yyget_lval #define mzn_yyget_lval_ALREADY_DEFINED #else #define yyget_lval mzn_yyget_lval #endif #ifdef yyset_lval #define mzn_yyset_lval_ALREADY_DEFINED #else #define yyset_lval mzn_yyset_lval #endif #ifdef yyget_lloc #define mzn_yyget_lloc_ALREADY_DEFINED #else #define yyget_lloc mzn_yyget_lloc #endif #ifdef yyset_lloc #define mzn_yyset_lloc_ALREADY_DEFINED #else #define yyset_lloc mzn_yyset_lloc #endif #ifdef yyalloc #define mzn_yyalloc_ALREADY_DEFINED #else #define yyalloc mzn_yyalloc #endif #ifdef yyrealloc #define mzn_yyrealloc_ALREADY_DEFINED #else #define yyrealloc mzn_yyrealloc #endif #ifdef yyfree #define mzn_yyfree_ALREADY_DEFINED #else #define yyfree mzn_yyfree #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin , yyscanner ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = yyg->yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] void yyrestart ( FILE *input_file , yyscan_t yyscanner ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); void yypop_buffer_state ( yyscan_t yyscanner ); static void yyensure_buffer_stack ( yyscan_t yyscanner ); static void yy_load_buffer_state ( yyscan_t yyscanner ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); void *yyalloc ( yy_size_t , yyscan_t yyscanner ); void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); void yyfree ( void * , yyscan_t yyscanner ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define mzn_yywrap(yyscanner) (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); static int yy_get_next_buffer ( yyscan_t yyscanner ); static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 183 #define YY_END_OF_BUFFER 184 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[506] = { 0, 0, 0, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 182, 3, 2, 182, 169, 182, 23, 182, 166, 103, 99, 33, 101, 33, 105, 29, 29, 33, 113, 123, 117, 143, 19, 182, 21, 108, 37, 182, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 33, 182, 182, 182, 1, 170, 180, 179, 177, 179, 1, 178, 179, 16, 18, 17, 1, 6, 8, 7, 1, 11, 13, 12, 1, 167, 168, 125, 0, 165, 23, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 127, 34, 14, 135, 0, 29, 0, 0, 0, 36, 129, 115, 112, 121, 119, 143, 20, 133, 0, 145, 145, 0, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 56, 61, 143, 143, 143, 143, 143, 143, 72, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 22, 138, 137, 140, 139, 152, 0, 0, 0, 0, 0, 170, 174, 173, 175, 173, 171, 172, 176, 16, 15, 6, 5, 11, 10, 164, 165, 0, 104, 100, 0, 102, 0, 0, 106, 0, 114, 0, 0, 124, 0, 118, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 30, 0, 32, 0, 27, 28, 131, 107, 145, 145, 0, 181, 38, 40, 143, 143, 143, 143, 143, 143, 46, 143, 143, 143, 143, 143, 143, 143, 143, 63, 64, 143, 143, 143, 68, 70, 74, 143, 75, 143, 143, 143, 79, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 94, 143, 97, 0, 153, 154, 155, 146, 147, 148, 151, 156, 157, 162, 161, 158, 159, 160, 149, 150, 164, 126, 111, 128, 35, 136, 130, 0, 116, 122, 120, 134, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 141, 9, 0, 0, 0, 0, 145, 143, 143, 42, 43, 143, 143, 48, 50, 143, 53, 143, 143, 143, 143, 143, 143, 65, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 88, 89, 24, 143, 91, 143, 143, 143, 0, 132, 0, 47, 0, 69, 71, 0, 0, 0, 0, 98, 0, 31, 0, 0, 26, 145, 143, 41, 143, 143, 143, 52, 25, 54, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 80, 143, 143, 143, 143, 90, 92, 143, 96, 163, 49, 0, 0, 0, 0, 0, 0, 26, 145, 143, 143, 143, 51, 143, 143, 143, 143, 143, 143, 73, 143, 77, 143, 81, 82, 143, 143, 143, 0, 0, 0, 0, 93, 145, 143, 143, 45, 143, 57, 143, 143, 143, 143, 143, 78, 143, 86, 143, 0, 83, 0, 0, 145, 143, 143, 55, 58, 143, 66, 67, 143, 84, 143, 0, 0, 87, 145, 143, 143, 59, 76, 143, 0, 85, 142, 39, 44, 143, 60, 143, 143, 143, 95, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 1, 7, 8, 1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 21, 21, 22, 14, 23, 24, 25, 1, 1, 26, 26, 26, 26, 27, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 28, 28, 28, 28, 28, 28, 28, 30, 28, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 28, 47, 48, 49, 50, 51, 28, 52, 53, 54, 55, 56, 57, 58, 59, 60, 14, 61, 14, 62, 1, 63, 64, 1, 65, 1, 1, 66, 67, 68, 69, 70, 1, 1, 1, 1, 1, 71, 1, 72, 1, 73, 1, 1, 1, 1, 1, 1, 1, 1, 1, 74, 1, 75, 1, 1, 1, 76, 77, 1, 78, 79, 80, 81, 1, 82, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 84, 1, 1, 1, 1, 1, 1, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[88] = { 0, 1, 1, 2, 3, 1, 4, 5, 1, 1, 1, 1, 6, 1, 1, 1, 7, 1, 8, 8, 8, 8, 1, 1, 1, 1, 9, 9, 10, 9, 10, 1, 4, 1, 1, 11, 12, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 } ; static const flex_int16_t yy_base[527] = { 0, 0, 0, 85, 89, 93, 97, 95, 99, 101, 102, 103, 106, 881, 880, 879, 878, 888, 893, 893, 893, 863, 893, 879, 0, 189, 893, 893, 872, 893, 859, 867, 78, 112, 125, 860, 111, 857, 856, 0, 818, 861, 893, 862, 826, 0, 67, 825, 87, 67, 73, 101, 85, 106, 113, 824, 113, 117, 832, 124, 156, 823, 834, 826, 819, 835, 204, 785, 156, 893, 0, 893, 893, 893, 186, 893, 893, 221, 0, 893, 849, 0, 0, 893, 848, 0, 0, 893, 847, 0, 893, 893, 893, 0, 0, 0, 178, 224, 893, 200, 230, 227, 241, 232, 245, 252, 254, 846, 236, 240, 249, 256, 257, 258, 262, 265, 290, 893, 893, 893, 850, 893, 300, 307, 317, 323, 273, 893, 836, 893, 893, 893, 893, 0, 893, 893, 841, 0, 821, 822, 100, 805, 806, 802, 805, 811, 115, 799, 120, 804, 800, 800, 0, 241, 794, 794, 788, 796, 804, 789, 0, 788, 787, 788, 798, 799, 783, 782, 788, 782, 249, 785, 779, 790, 775, 778, 777, 782, 774, 784, 772, 893, 893, 893, 893, 893, 893, 739, 237, 303, 270, 285, 0, 893, 893, 893, 893, 893, 893, 893, 0, 893, 0, 893, 0, 893, 0, 0, 292, 893, 893, 322, 893, 324, 344, 893, 813, 893, 348, 346, 893, 358, 893, 360, 812, 893, 361, 365, 366, 370, 363, 377, 376, 378, 379, 808, 408, 413, 418, 424, 389, 428, 893, 893, 0, 773, 782, 893, 767, 0, 779, 768, 773, 760, 775, 769, 0, 769, 764, 760, 754, 769, 766, 757, 758, 761, 0, 747, 755, 754, 0, 0, 0, 747, 0, 757, 746, 750, 0, 738, 748, 739, 750, 750, 735, 739, 746, 739, 744, 734, 738, 730, 0, 696, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 0, 893, 893, 893, 893, 893, 893, 380, 893, 893, 893, 893, 443, 390, 893, 445, 391, 444, 446, 447, 449, 448, 450, 893, 893, 482, 148, 152, 491, 739, 725, 719, 0, 0, 723, 721, 0, 730, 732, 0, 732, 718, 717, 715, 720, 716, 0, 689, 685, 670, 676, 661, 656, 658, 649, 656, 626, 632, 0, 0, 0, 624, 0, 612, 623, 618, 525, 893, 451, 893, 461, 893, 893, 464, 462, 475, 459, 893, 497, 503, 512, 516, 520, 568, 569, 0, 552, 556, 560, 0, 0, 0, 556, 560, 554, 545, 552, 551, 541, 555, 553, 550, 0, 543, 531, 525, 535, 0, 0, 527, 0, 893, 893, 510, 517, 519, 520, 458, 525, 535, 521, 520, 532, 513, 0, 515, 518, 494, 446, 414, 412, 0, 404, 0, 361, 0, 0, 375, 373, 359, 538, 460, 541, 548, 893, 362, 359, 351, 0, 345, 0, 332, 320, 317, 299, 275, 0, 262, 0, 277, 549, 893, 551, 552, 248, 246, 233, 0, 0, 225, 0, 0, 214, 0, 194, 555, 557, 893, 166, 142, 131, 0, 0, 132, 559, 893, 0, 0, 0, 128, 893, 90, 71, 54, 0, 893, 609, 621, 633, 645, 653, 663, 675, 680, 683, 685, 695, 707, 719, 731, 735, 738, 742, 746, 751, 756, 758 } ; static const flex_int16_t yy_def[527] = { 0, 505, 1, 506, 506, 506, 506, 507, 507, 508, 508, 509, 509, 1, 1, 1, 1, 505, 505, 505, 505, 505, 505, 510, 511, 512, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 513, 505, 505, 505, 505, 514, 515, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 505, 505, 505, 505, 505, 516, 505, 505, 505, 505, 505, 505, 505, 517, 505, 505, 517, 518, 505, 505, 518, 519, 505, 505, 519, 505, 505, 505, 520, 521, 511, 512, 512, 505, 512, 512, 512, 512, 512, 512, 512, 512, 505, 512, 512, 512, 512, 512, 512, 512, 512, 512, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 513, 505, 505, 505, 522, 522, 523, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 516, 505, 505, 505, 505, 505, 505, 505, 517, 505, 518, 505, 519, 505, 524, 521, 512, 505, 505, 512, 505, 512, 512, 505, 505, 505, 512, 512, 505, 512, 505, 512, 505, 505, 512, 512, 512, 512, 512, 512, 512, 512, 512, 505, 505, 505, 505, 505, 525, 505, 505, 505, 522, 522, 523, 505, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 524, 505, 505, 505, 505, 505, 505, 512, 505, 505, 505, 505, 512, 512, 505, 512, 512, 512, 512, 512, 512, 512, 512, 505, 505, 505, 526, 526, 505, 522, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 505, 505, 512, 505, 512, 505, 505, 512, 512, 512, 512, 505, 505, 505, 505, 505, 505, 522, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 505, 505, 512, 512, 512, 512, 512, 505, 505, 522, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 512, 512, 512, 512, 505, 522, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 512, 505, 512, 512, 522, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 512, 512, 505, 522, 513, 513, 513, 513, 513, 512, 505, 522, 513, 513, 513, 505, 513, 513, 513, 513, 0, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505 } ; static const flex_int16_t yy_nxt[981] = { 0, 18, 19, 20, 19, 21, 22, 23, 24, 25, 26, 18, 27, 28, 29, 30, 31, 32, 33, 34, 34, 34, 35, 36, 37, 38, 39, 39, 39, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 39, 39, 52, 39, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 39, 39, 65, 66, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 67, 68, 69, 71, 72, 120, 73, 71, 72, 504, 73, 71, 72, 79, 76, 71, 72, 79, 76, 83, 83, 87, 80, 145, 87, 121, 80, 146, 84, 84, 88, 140, 74, 88, 141, 147, 74, 148, 503, 143, 77, 128, 152, 122, 77, 123, 123, 123, 123, 153, 129, 130, 144, 149, 124, 502, 122, 125, 123, 123, 123, 123, 154, 150, 248, 156, 155, 124, 124, 163, 160, 151, 255, 157, 249, 258, 166, 126, 158, 161, 167, 124, 501, 162, 164, 125, 256, 75, 499, 168, 259, 75, 390, 169, 170, 75, 390, 81, 171, 75, 498, 81, 98, 85, 85, 89, 497, 193, 89, 97, 194, 195, 172, 98, 390, 173, 99, 100, 390, 101, 102, 103, 496, 174, 209, 505, 175, 104, 105, 106, 176, 182, 183, 196, 184, 187, 107, 188, 108, 189, 190, 191, 193, 185, 109, 194, 199, 505, 98, 110, 197, 212, 111, 112, 210, 198, 215, 113, 211, 114, 225, 493, 115, 208, 98, 98, 116, 213, 196, 217, 492, 505, 214, 98, 505, 218, 220, 505, 222, 216, 98, 98, 98, 505, 219, 197, 98, 505, 505, 98, 198, 221, 505, 223, 491, 263, 505, 490, 264, 505, 226, 505, 281, 505, 505, 505, 241, 241, 241, 505, 265, 489, 505, 227, 98, 282, 311, 234, 234, 488, 234, 228, 229, 294, 295, 296, 232, 484, 230, 234, 233, 483, 231, 236, 236, 236, 236, 505, 122, 505, 123, 123, 123, 123, 482, 237, 312, 237, 313, 124, 238, 238, 238, 238, 239, 481, 240, 240, 240, 240, 305, 306, 307, 124, 240, 240, 308, 309, 314, 505, 318, 505, 316, 480, 479, 240, 240, 240, 240, 240, 240, 297, 319, 298, 320, 98, 299, 98, 317, 324, 98, 505, 300, 505, 98, 505, 301, 302, 303, 304, 98, 98, 98, 333, 377, 505, 478, 505, 505, 477, 505, 476, 505, 505, 379, 381, 328, 505, 322, 475, 337, 326, 474, 505, 505, 505, 505, 505, 469, 329, 468, 467, 323, 338, 325, 466, 331, 505, 505, 327, 330, 236, 236, 236, 236, 332, 238, 238, 238, 238, 335, 238, 238, 238, 238, 338, 465, 336, 336, 336, 336, 241, 241, 241, 335, 336, 336, 98, 382, 98, 98, 98, 98, 98, 387, 422, 336, 336, 336, 336, 336, 336, 454, 98, 471, 98, 98, 464, 98, 463, 505, 505, 505, 505, 505, 505, 505, 505, 505, 98, 378, 380, 462, 384, 385, 505, 505, 505, 505, 505, 388, 505, 388, 386, 383, 389, 389, 389, 389, 391, 424, 391, 505, 427, 392, 392, 392, 392, 423, 425, 389, 389, 389, 389, 98, 426, 389, 389, 389, 389, 428, 98, 428, 98, 98, 429, 429, 429, 429, 392, 392, 392, 392, 392, 392, 392, 392, 505, 429, 429, 429, 429, 98, 461, 505, 98, 505, 505, 429, 429, 429, 429, 98, 98, 460, 98, 487, 453, 450, 98, 459, 495, 458, 500, 457, 505, 451, 452, 505, 456, 455, 449, 448, 447, 470, 505, 505, 472, 505, 505, 446, 445, 505, 485, 505, 473, 505, 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, 486, 431, 430, 421, 494, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 94, 420, 419, 418, 94, 94, 95, 417, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 416, 415, 96, 96, 96, 96, 96, 96, 96, 96, 96, 133, 133, 133, 133, 137, 137, 139, 139, 192, 414, 413, 412, 192, 192, 192, 192, 192, 192, 192, 192, 200, 411, 200, 200, 200, 410, 200, 200, 200, 200, 200, 200, 202, 409, 202, 202, 202, 408, 202, 202, 202, 202, 202, 202, 204, 407, 204, 204, 204, 406, 204, 204, 204, 204, 204, 204, 206, 206, 207, 207, 207, 207, 244, 244, 244, 244, 246, 246, 246, 246, 246, 310, 310, 310, 310, 240, 240, 240, 336, 336, 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 247, 339, 334, 321, 315, 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, 283, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, 262, 261, 260, 257, 254, 253, 252, 251, 250, 247, 245, 243, 242, 235, 224, 205, 203, 201, 186, 181, 180, 179, 178, 177, 165, 159, 142, 138, 136, 135, 134, 132, 131, 127, 119, 118, 117, 93, 92, 505, 91, 91, 90, 90, 17, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505 } ; static const flex_int16_t yy_chk[981] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 32, 3, 4, 4, 503, 4, 5, 5, 7, 5, 6, 6, 8, 6, 9, 10, 11, 7, 49, 12, 32, 8, 49, 9, 10, 11, 46, 3, 12, 46, 50, 4, 50, 502, 48, 5, 36, 52, 33, 6, 33, 33, 33, 33, 52, 36, 36, 48, 51, 33, 501, 34, 33, 34, 34, 34, 34, 53, 51, 140, 54, 53, 34, 33, 57, 56, 51, 146, 54, 140, 148, 59, 33, 54, 56, 59, 34, 499, 56, 57, 33, 146, 3, 493, 59, 148, 4, 336, 59, 59, 5, 337, 7, 59, 6, 490, 8, 96, 9, 10, 11, 489, 74, 12, 25, 74, 74, 60, 25, 336, 60, 25, 25, 337, 25, 25, 25, 488, 60, 99, 96, 60, 25, 25, 25, 60, 66, 66, 74, 66, 68, 25, 68, 25, 68, 68, 68, 77, 66, 25, 77, 77, 99, 97, 25, 74, 101, 25, 25, 100, 74, 103, 25, 100, 25, 108, 484, 25, 97, 109, 102, 25, 101, 77, 104, 482, 97, 102, 110, 101, 104, 105, 100, 106, 103, 111, 112, 113, 108, 104, 77, 114, 109, 102, 115, 77, 105, 104, 106, 479, 153, 110, 476, 153, 105, 109, 106, 170, 111, 112, 113, 126, 126, 126, 114, 153, 475, 115, 110, 116, 170, 208, 116, 116, 474, 116, 111, 112, 188, 188, 188, 114, 469, 113, 116, 115, 467, 113, 122, 122, 122, 122, 116, 123, 208, 123, 123, 123, 123, 465, 124, 211, 124, 213, 123, 124, 124, 124, 124, 125, 464, 125, 125, 125, 125, 190, 190, 190, 123, 125, 125, 191, 191, 214, 211, 219, 213, 218, 463, 462, 125, 125, 125, 125, 125, 125, 189, 221, 189, 223, 226, 189, 230, 218, 227, 228, 214, 189, 219, 229, 218, 189, 189, 189, 189, 232, 231, 233, 234, 317, 221, 461, 223, 226, 459, 230, 457, 227, 228, 323, 326, 230, 229, 226, 456, 240, 228, 455, 232, 231, 233, 234, 317, 449, 230, 448, 447, 226, 240, 227, 444, 232, 323, 326, 229, 231, 236, 236, 236, 236, 233, 237, 237, 237, 237, 236, 238, 238, 238, 238, 240, 442, 239, 239, 239, 239, 241, 241, 241, 236, 239, 239, 322, 327, 325, 328, 329, 331, 330, 332, 378, 239, 239, 239, 239, 239, 239, 427, 386, 451, 380, 384, 440, 383, 439, 322, 327, 325, 328, 329, 331, 330, 332, 378, 385, 322, 325, 438, 329, 330, 427, 386, 451, 380, 384, 335, 383, 335, 331, 328, 335, 335, 335, 335, 338, 383, 338, 385, 386, 338, 338, 338, 338, 380, 384, 388, 388, 388, 388, 423, 385, 389, 389, 389, 389, 390, 424, 390, 425, 426, 390, 390, 390, 390, 391, 391, 391, 391, 392, 392, 392, 392, 423, 428, 428, 428, 428, 450, 437, 424, 452, 425, 426, 429, 429, 429, 429, 453, 470, 436, 472, 473, 426, 423, 485, 435, 486, 433, 494, 432, 450, 424, 425, 452, 431, 430, 419, 416, 415, 450, 453, 470, 452, 472, 473, 414, 413, 485, 470, 486, 453, 494, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 398, 397, 396, 472, 394, 393, 376, 485, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 375, 374, 373, 510, 510, 511, 371, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 512, 367, 366, 512, 512, 512, 512, 512, 512, 512, 512, 512, 513, 513, 513, 513, 514, 514, 515, 515, 516, 365, 364, 363, 516, 516, 516, 516, 516, 516, 516, 516, 517, 362, 517, 517, 517, 361, 517, 517, 517, 517, 517, 517, 518, 360, 518, 518, 518, 359, 518, 518, 518, 518, 518, 518, 519, 358, 519, 519, 519, 357, 519, 519, 519, 519, 519, 519, 520, 520, 521, 521, 521, 521, 522, 522, 522, 522, 523, 523, 523, 523, 523, 524, 524, 524, 524, 525, 525, 525, 526, 526, 355, 354, 353, 352, 351, 350, 348, 347, 345, 344, 341, 340, 339, 293, 291, 290, 289, 288, 287, 286, 285, 284, 283, 282, 281, 280, 279, 277, 276, 275, 273, 269, 268, 267, 265, 264, 263, 262, 261, 260, 259, 258, 257, 255, 254, 253, 252, 251, 250, 248, 246, 245, 235, 224, 216, 187, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 169, 168, 167, 166, 165, 164, 163, 162, 161, 159, 158, 157, 156, 155, 154, 151, 150, 149, 147, 145, 144, 143, 142, 141, 139, 138, 136, 128, 120, 107, 88, 84, 80, 67, 65, 64, 63, 62, 61, 58, 55, 47, 44, 43, 41, 40, 38, 37, 35, 31, 30, 28, 23, 21, 17, 16, 15, 14, 13, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #if defined __GNUC__ #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wdeprecated" #elif defined _MSC_VER #pragma warning(push, 1) #endif namespace MiniZinc{ class ParserLocation; } #define YYLTYPE MiniZinc::ParserLocation #define YYLTYPE_IS_DECLARED 1 #define YYLTYPE_IS_TRIVIAL 0 #include namespace MiniZinc { int utf8len(const char* s) { int l=0; for (int i=0; s[i] != '\0'; i++) if ((s[i] & 0xc0) != 0x80) l++; return l; } int yy_input_proc(char* buf, int size, yyscan_t yyscanner); } #define YY_INPUT(buf, result, max_size) \ result = ::MiniZinc::yy_input_proc(buf, max_size, yyscanner); #define YY_USER_ACTION \ { MiniZinc::ParserState* parm = \ static_cast(yyget_extra(yyscanner)); \ yylloc->firstLine(yylloc->lastLine()); \ yylloc->firstColumn(yylloc->lastColumn()+1); \ if(parm->hadNewline) { \ parm->hadNewline=false; \ parm->lineStartPos += parm->nTokenNextStart; \ parm->nTokenNextStart=1; \ yylloc->lastLine(yylloc->lastLine()+1); \ yylloc->firstLine(yylloc->lastLine()); \ yylloc->firstColumn(1); \ } \ if(yytext[0] == '\n') { \ parm->hadNewline=true; \ parm->nTokenNextStart+=0; \ } else { \ parm->nTokenNextStart+=yyleng; \ } \ yylloc->lastColumn(yylloc->firstColumn()+::MiniZinc::utf8len(yytext)-1); \ } namespace MiniZinc { bool hexstrtointval(const char* s, long long int& v) { std::istringstream iss(s); iss >> std::hex >> v; return !iss.fail(); } bool octstrtointval(const char* s, long long int& v) { std::istringstream iss(s); iss >> std::oct >> v; return !iss.fail(); } bool fast_strtointval(const char* s, long long int& v) { MiniZinc::IntVal x = 0; try { for (; *s != '\0'; ++s) { x = (x*10) + (*s - '0'); } } catch (MiniZinc::ArithmeticError&) { return false; } v = x.toInt(); return true; } bool strtofloatval(const char* s, double& v) { std::istringstream iss(s); iss >> v; return !iss.fail(); } void clearBuffer(void* parm) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer = ""; } void appendBufferString(void* parm, const char* s) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer += s; } void appendBufferChar(void* parm, char s) { MiniZinc::ParserState* pp = static_cast(parm); pp->stringBuffer += s; } char* bufferData(void* parm) { MiniZinc::ParserState* pp = static_cast(parm); return strdup(pp->stringBuffer.c_str()); } } #define INITIAL 0 #define string 1 #define string_quote 2 #define multilinecomment 3 #define doccomment 4 #define doccomment_file 5 #define bracket_exp 6 #define quoted_exp 7 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* Holds the entire state of the reentrant scanner. */ struct yyguts_t { /* User-defined. Not touched by flex. */ YY_EXTRA_TYPE yyextra_r; /* The rest are the same as the globals declared in the non-reentrant scanner. */ FILE *yyin_r, *yyout_r; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; int yy_n_chars; int yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; int yy_did_buffer_switch_on_eof; int yy_start_stack_ptr; int yy_start_stack_depth; int *yy_start_stack; yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; int yylineno_r; int yy_flex_debug_r; char *yytext_r; int yy_more_flag; int yy_more_len; YYSTYPE * yylval_r; YYLTYPE * yylloc_r; }; /* end struct yyguts_t */ static int yy_init_globals ( yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ # define yylval yyg->yylval_r # define yylloc yyg->yylloc_r int yylex_init (yyscan_t* scanner); int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( yyscan_t yyscanner ); int yyget_debug ( yyscan_t yyscanner ); void yyset_debug ( int debug_flag , yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); FILE *yyget_in ( yyscan_t yyscanner ); void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); FILE *yyget_out ( yyscan_t yyscanner ); void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); int yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); int yyget_lineno ( yyscan_t yyscanner ); void yyset_lineno ( int _line_number , yyscan_t yyscanner ); int yyget_column ( yyscan_t yyscanner ); void yyset_column ( int _column_no , yyscan_t yyscanner ); YYSTYPE * yyget_lval ( yyscan_t yyscanner ); void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( yyscan_t yyscanner ); #else extern int yywrap ( yyscan_t yyscanner ); #endif #endif #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr , yyscan_t yyscanner); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * , yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( yyscan_t yyscanner ); #else static int input ( yyscan_t yyscanner ); #endif #endif static void yy_push_state ( int _new_state , yyscan_t yyscanner); static void yy_pop_state ( yyscan_t yyscanner ); static int yy_top_state ( yyscan_t yyscanner ); /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex \ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); #define YY_DECL int yylex \ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; yylloc = yylloc_param; if ( !yyg->yy_init ) { yyg->yy_init = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_load_buffer_state( yyscanner ); } { while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; /* Support of yytext. */ *yy_cp = yyg->yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yyg->yy_start; yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 506 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 893 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yyg->yy_hold_char; yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP { return MZN_INVALID_NULL; } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP { } YY_BREAK case 3: YY_RULE_SETUP { /* ignore whitespace */ } YY_BREAK case 4: YY_RULE_SETUP { yy_push_state(doccomment,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } YY_BREAK case 5: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_DOC_COMMENT; } YY_BREAK case 6: YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 7: YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 9: YY_RULE_SETUP { yy_push_state(doccomment_file,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } YY_BREAK case 10: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_DOC_FILE_COMMENT; } YY_BREAK case 11: YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 12: YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 14: YY_RULE_SETUP { yy_push_state(multilinecomment,yyscanner); } YY_BREAK case 15: YY_RULE_SETUP { yy_pop_state(yyscanner); } YY_BREAK case 16: YY_RULE_SETUP { } YY_BREAK case 17: YY_RULE_SETUP { } YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP { } YY_BREAK case 19: YY_RULE_SETUP { return MZN_LEFT_BRACKET; } YY_BREAK case 20: YY_RULE_SETUP { return MZN_LEFT_2D_BRACKET; } YY_BREAK case 21: YY_RULE_SETUP { return MZN_RIGHT_BRACKET; } YY_BREAK case 22: YY_RULE_SETUP { return MZN_RIGHT_2D_BRACKET; } YY_BREAK case 23: YY_RULE_SETUP { /* ignore comments */ } YY_BREAK case 24: YY_RULE_SETUP { yylval->iValue = 1; return MZN_BOOL_LITERAL; } YY_BREAK case 25: YY_RULE_SETUP { yylval->iValue = 0; return MZN_BOOL_LITERAL; } YY_BREAK case 26: YY_RULE_SETUP { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } YY_BREAK case 27: YY_RULE_SETUP { if (::MiniZinc::hexstrtointval(yytext+2, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } YY_BREAK case 28: YY_RULE_SETUP { if (::MiniZinc::octstrtointval(yytext+2, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } YY_BREAK case 29: YY_RULE_SETUP { if (::MiniZinc::fast_strtointval(yytext, yylval->iValue)) return MZN_INTEGER_LITERAL; else return MZN_INVALID_INTEGER_LITERAL; } YY_BREAK case 30: YY_RULE_SETUP { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } YY_BREAK case 31: YY_RULE_SETUP { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } YY_BREAK case 32: YY_RULE_SETUP { if (::MiniZinc::strtofloatval(yytext, yylval->dValue)) return MZN_FLOAT_LITERAL; else return MZN_INVALID_FLOAT_LITERAL; } YY_BREAK case 33: YY_RULE_SETUP { return *yytext; } YY_BREAK case 34: YY_RULE_SETUP { return MZN_DOTDOT; } YY_BREAK case 35: YY_RULE_SETUP { return MZN_DOTDOT_QUOTED; } YY_BREAK case 36: YY_RULE_SETUP { return MZN_COLONCOLON; } YY_BREAK case 37: YY_RULE_SETUP { return MZN_UNDERSCORE; } YY_BREAK case 38: YY_RULE_SETUP { return MZN_ANN; } YY_BREAK case 39: YY_RULE_SETUP { return MZN_ANNOTATION; } YY_BREAK case 40: YY_RULE_SETUP { return MZN_ANY; } YY_BREAK case 41: YY_RULE_SETUP { return MZN_ARRAY; } YY_BREAK case 42: YY_RULE_SETUP { return MZN_BOOL; } YY_BREAK case 43: YY_RULE_SETUP { return MZN_CASE; } YY_BREAK case 44: YY_RULE_SETUP { return MZN_CONSTRAINT; } YY_BREAK case 45: YY_RULE_SETUP { return MZN_DEFAULT; } YY_BREAK case 46: YY_RULE_SETUP { return MZN_IDIV; } YY_BREAK case 47: YY_RULE_SETUP { return MZN_IDIV_QUOTED; } YY_BREAK case 48: YY_RULE_SETUP { return MZN_DIFF; } YY_BREAK case 49: YY_RULE_SETUP { return MZN_DIFF_QUOTED; } YY_BREAK case 50: YY_RULE_SETUP { return MZN_ELSE; } YY_BREAK case 51: YY_RULE_SETUP { return MZN_ELSEIF; } YY_BREAK case 52: YY_RULE_SETUP { return MZN_ENDIF; } YY_BREAK case 53: YY_RULE_SETUP { return MZN_ENUM; } YY_BREAK case 54: YY_RULE_SETUP { return MZN_FLOAT; } YY_BREAK case 55: YY_RULE_SETUP { return MZN_FUNCTION; } YY_BREAK case 56: YY_RULE_SETUP { return MZN_IF; } YY_BREAK case 57: YY_RULE_SETUP { return MZN_INCLUDE; } YY_BREAK case 58: YY_RULE_SETUP { return MZN_INFINITY; } YY_BREAK case 59: YY_RULE_SETUP { return MZN_INTERSECT; } YY_BREAK case 60: YY_RULE_SETUP { return MZN_INTERSECT_QUOTED; } YY_BREAK case 61: YY_RULE_SETUP { return MZN_IN; } YY_BREAK case 62: YY_RULE_SETUP { return MZN_IN_QUOTED; } YY_BREAK case 63: YY_RULE_SETUP { return MZN_INT; } YY_BREAK case 64: YY_RULE_SETUP { return MZN_LET; } YY_BREAK case 65: YY_RULE_SETUP { return MZN_LIST; } YY_BREAK case 66: YY_RULE_SETUP { yylval->bValue = false; return MZN_MAXIMIZE; } YY_BREAK case 67: YY_RULE_SETUP { yylval->bValue = true; return MZN_MINIMIZE; } YY_BREAK case 68: YY_RULE_SETUP { return MZN_MOD; } YY_BREAK case 69: YY_RULE_SETUP { return MZN_MOD_QUOTED; } YY_BREAK case 70: YY_RULE_SETUP { return MZN_NOT; } YY_BREAK case 71: YY_RULE_SETUP { return MZN_NOT_QUOTED; } YY_BREAK case 72: YY_RULE_SETUP { return MZN_OF; } YY_BREAK case 73: YY_RULE_SETUP { return MZN_OUTPUT; } YY_BREAK case 74: YY_RULE_SETUP { return MZN_OPT; } YY_BREAK case 75: YY_RULE_SETUP { return MZN_PAR; } YY_BREAK case 76: YY_RULE_SETUP { return MZN_PREDICATE; } YY_BREAK case 77: YY_RULE_SETUP { return MZN_RECORD; } YY_BREAK case 78: YY_RULE_SETUP { return MZN_SATISFY; } YY_BREAK case 79: YY_RULE_SETUP { return MZN_SET; } YY_BREAK case 80: YY_RULE_SETUP { return MZN_SOLVE; } YY_BREAK case 81: YY_RULE_SETUP { return MZN_STRING; } YY_BREAK case 82: YY_RULE_SETUP { return MZN_SUBSET; } YY_BREAK case 83: YY_RULE_SETUP { return MZN_SUBSET_QUOTED; } YY_BREAK case 84: YY_RULE_SETUP { return MZN_SUPERSET; } YY_BREAK case 85: YY_RULE_SETUP { return MZN_SUPERSET_QUOTED; } YY_BREAK case 86: YY_RULE_SETUP { return MZN_SYMDIFF; } YY_BREAK case 87: YY_RULE_SETUP { return MZN_SYMDIFF_QUOTED; } YY_BREAK case 88: YY_RULE_SETUP { return MZN_TEST; } YY_BREAK case 89: YY_RULE_SETUP { return MZN_THEN; } YY_BREAK case 90: YY_RULE_SETUP { return MZN_TUPLE; } YY_BREAK case 91: YY_RULE_SETUP { return MZN_TYPE; } YY_BREAK case 92: YY_RULE_SETUP { return MZN_UNION; } YY_BREAK case 93: YY_RULE_SETUP { return MZN_UNION_QUOTED; } YY_BREAK case 94: YY_RULE_SETUP { return MZN_VAR; } YY_BREAK case 95: YY_RULE_SETUP { return MZN_VARIANT_RECORD; } YY_BREAK case 96: YY_RULE_SETUP { return MZN_WHERE; } YY_BREAK case 97: YY_RULE_SETUP { return MZN_XOR; } YY_BREAK case 98: YY_RULE_SETUP { return MZN_XOR_QUOTED; } YY_BREAK case 99: YY_RULE_SETUP { return MZN_PLUS; } YY_BREAK case 100: YY_RULE_SETUP { return MZN_PLUS_QUOTED; } YY_BREAK case 101: YY_RULE_SETUP { return MZN_MINUS; } YY_BREAK case 102: YY_RULE_SETUP { return MZN_MINUS_QUOTED; } YY_BREAK case 103: YY_RULE_SETUP { return MZN_MULT; } YY_BREAK case 104: YY_RULE_SETUP { return MZN_MULT_QUOTED; } YY_BREAK case 105: YY_RULE_SETUP { return MZN_DIV; } YY_BREAK case 106: YY_RULE_SETUP { return MZN_DIV_QUOTED; } YY_BREAK case 107: YY_RULE_SETUP { return MZN_POW_MINUS1; } YY_BREAK case 108: YY_RULE_SETUP { return MZN_POW; } YY_BREAK case 109: YY_RULE_SETUP { return MZN_POW_QUOTED; } YY_BREAK case 110: YY_RULE_SETUP { return MZN_PLUSPLUS; } YY_BREAK case 111: YY_RULE_SETUP { return MZN_PLUSPLUS_QUOTED; } YY_BREAK case 112: YY_RULE_SETUP { return MZN_ABSENT; } YY_BREAK case 113: YY_RULE_SETUP { return MZN_LE; } YY_BREAK case 114: YY_RULE_SETUP { return MZN_LE_QUOTED; } YY_BREAK case 115: YY_RULE_SETUP { return MZN_LQ; } YY_BREAK case 116: YY_RULE_SETUP { return MZN_LQ_QUOTED; } YY_BREAK case 117: YY_RULE_SETUP { return MZN_GR; } YY_BREAK case 118: YY_RULE_SETUP { return MZN_GR_QUOTED; } YY_BREAK case 119: YY_RULE_SETUP { return MZN_GQ; } YY_BREAK case 120: YY_RULE_SETUP { return MZN_GQ_QUOTED; } YY_BREAK case 121: YY_RULE_SETUP { return MZN_EQ; } YY_BREAK case 122: YY_RULE_SETUP { return MZN_EQ_QUOTED; } YY_BREAK case 123: YY_RULE_SETUP { return MZN_EQ; } YY_BREAK case 124: YY_RULE_SETUP { return MZN_EQ_QUOTED; } YY_BREAK case 125: YY_RULE_SETUP { return MZN_NQ; } YY_BREAK case 126: YY_RULE_SETUP { return MZN_NQ_QUOTED; } YY_BREAK case 127: YY_RULE_SETUP { return MZN_IMPL; } YY_BREAK case 128: YY_RULE_SETUP { return MZN_IMPL_QUOTED; } YY_BREAK case 129: YY_RULE_SETUP { return MZN_RIMPL; } YY_BREAK case 130: YY_RULE_SETUP { return MZN_RIMPL_QUOTED; } YY_BREAK case 131: YY_RULE_SETUP { return MZN_EQUIV; } YY_BREAK case 132: YY_RULE_SETUP { return MZN_EQUIV_QUOTED; } YY_BREAK case 133: YY_RULE_SETUP { return MZN_OR; } YY_BREAK case 134: YY_RULE_SETUP { return MZN_OR_QUOTED; } YY_BREAK case 135: YY_RULE_SETUP { return MZN_AND; } YY_BREAK case 136: YY_RULE_SETUP { return MZN_AND_QUOTED; } YY_BREAK case 137: YY_RULE_SETUP { return MZN_WEAK_PLUS; } YY_BREAK case 138: YY_RULE_SETUP { return MZN_WEAK_MULT; } YY_BREAK case 139: YY_RULE_SETUP { return MZN_WEAK_EQ; } YY_BREAK case 140: YY_RULE_SETUP { return MZN_WEAK_MINUS; } YY_BREAK case 141: YY_RULE_SETUP { yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; return MZN_IDENTIFIER; } YY_BREAK case 142: YY_RULE_SETUP { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } YY_BREAK case 143: YY_RULE_SETUP { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } YY_BREAK case 144: YY_RULE_SETUP { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } YY_BREAK case 145: YY_RULE_SETUP { MiniZinc::ParserState* parm = static_cast(yyget_extra(yyscanner)); if (parm->isFlatZinc) { yylval->sValue = strdup(yytext); return MZN_IDENTIFIER; } else { return FLATZINC_IDENTIFIER; } } YY_BREAK case 146: YY_RULE_SETUP { yylval->sValue = strdup("forall"); return MZN_IDENTIFIER; } YY_BREAK case 147: YY_RULE_SETUP { yylval->sValue = strdup("exists"); return MZN_IDENTIFIER; } YY_BREAK case 148: YY_RULE_SETUP { return MZN_IN; } YY_BREAK case 149: YY_RULE_SETUP { return MZN_SUBSET; } YY_BREAK case 150: YY_RULE_SETUP { return MZN_SUPERSET; } YY_BREAK case 151: YY_RULE_SETUP { return MZN_INFINITY; } YY_BREAK case 152: YY_RULE_SETUP { return MZN_NOT; } YY_BREAK case 153: YY_RULE_SETUP { return MZN_RIMPL; } YY_BREAK case 154: YY_RULE_SETUP { return MZN_IMPL; } YY_BREAK case 155: YY_RULE_SETUP { return MZN_EQUIV; } YY_BREAK case 156: YY_RULE_SETUP { return MZN_AND; } YY_BREAK case 157: YY_RULE_SETUP { return MZN_OR; } YY_BREAK case 158: YY_RULE_SETUP { return MZN_NQ; } YY_BREAK case 159: YY_RULE_SETUP { return MZN_LQ; } YY_BREAK case 160: YY_RULE_SETUP { return MZN_GQ; } YY_BREAK case 161: YY_RULE_SETUP { return MZN_UNION; } YY_BREAK case 162: YY_RULE_SETUP { return MZN_INTERSECT; } YY_BREAK case 163: YY_RULE_SETUP { return MZN_POW_MINUS1; } YY_BREAK case 164: YY_RULE_SETUP { yylval->sValue = strdup(yytext+1); return MZN_TI_ENUM_IDENTIFIER; } YY_BREAK case 165: YY_RULE_SETUP { yylval->sValue = strdup(yytext+1); return MZN_TI_IDENTIFIER; } YY_BREAK case 166: YY_RULE_SETUP { yy_push_state(bracket_exp,yyscanner); return *yytext; } YY_BREAK case 167: YY_RULE_SETUP { yy_pop_state(yyscanner); return *yytext; } YY_BREAK case 168: YY_RULE_SETUP { yy_pop_state(yyscanner); yy_pop_state(yyscanner); yy_push_state(string_quote,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } YY_BREAK case 169: YY_RULE_SETUP { yy_push_state(string,yyscanner); ::MiniZinc::clearBuffer(yyget_extra(yyscanner)); } YY_BREAK case 170: YY_RULE_SETUP { ::MiniZinc::appendBufferString(yyget_extra(yyscanner), yytext); } YY_BREAK case 171: YY_RULE_SETUP { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), '\n'); } YY_BREAK case 172: YY_RULE_SETUP { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), '\t'); } YY_BREAK case 173: YY_RULE_SETUP { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), yytext[1]); } YY_BREAK case 174: YY_RULE_SETUP { ::MiniZinc::appendBufferChar(yyget_extra(yyscanner), yytext[1]); } YY_BREAK case 175: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_push_state(quoted_exp,yyscanner); return MZN_STRING_QUOTE_START; } YY_BREAK case 176: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_push_state(quoted_exp,yyscanner); return MZN_STRING_QUOTE_MID; } YY_BREAK case 177: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_STRING_LITERAL; } YY_BREAK case 178: YY_RULE_SETUP { yylval->sValue = ::MiniZinc::bufferData(yyget_extra(yyscanner)); yy_pop_state(yyscanner); return MZN_STRING_QUOTE_END; } YY_BREAK case 179: YY_RULE_SETUP { return (unsigned char)yytext[0]; } YY_BREAK case 180: /* rule 180 can match eol */ YY_RULE_SETUP { return MZN_END_OF_LINE_IN_STRING; } YY_BREAK case YY_STATE_EOF(string): case YY_STATE_EOF(string_quote): { yy_pop_state(yyscanner); return MZN_UNTERMINATED_STRING; } YY_BREAK case 181: YY_RULE_SETUP { yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; return MZN_QUOTED_IDENTIFIER; } YY_BREAK case 182: YY_RULE_SETUP { return (unsigned char)yytext[0]; } YY_BREAK case 183: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(multilinecomment): case YY_STATE_EOF(doccomment): case YY_STATE_EOF(doccomment_file): case YY_STATE_EOF(bracket_exp): case YY_STATE_EOF(quoted_exp): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yyg->yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yyg->yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yyg->yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_END_OF_FILE: { yyg->yy_did_buffer_switch_on_eof = 0; if ( yywrap( yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = yyg->yytext_ptr; int number_to_move, i; int ret_val; if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) (yyg->yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } if ( yyg->yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin , yyscanner); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } yyg->yy_n_chars += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (yyscan_t yyscanner) { yy_state_type yy_current_state; char *yy_cp; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_current_state = yyg->yy_start; for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 87); if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 506 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) { int yy_is_jam; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ char *yy_cp = yyg->yy_c_buf_p; YY_CHAR yy_c = 87; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 506 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 505); (void)yyg; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp , yyscan_t yyscanner) { char *yy_cp; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_cp = yyg->yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yyg->yy_hold_char; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = yyg->yy_n_chars + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; yyg->yytext_ptr = yy_bp; yyg->yy_hold_char = *yy_cp; yyg->yy_c_buf_p = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) #else static int input (yyscan_t yyscanner) #endif { int c; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; *yyg->yy_c_buf_p = yyg->yy_hold_char; if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) /* This was really a NUL. */ *yyg->yy_c_buf_p = '\0'; else { /* need more input */ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); ++yyg->yy_c_buf_p; switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin , yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( yyscanner ) ) return 0; if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(yyscanner); #else return input(yyscanner); #endif } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + offset; break; } } } c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ yyg->yy_hold_char = *++yyg->yy_c_buf_p; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); yy_load_buffer_state( yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( yyscanner ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } static void yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; yyg->yy_hold_char = *yyg->yy_c_buf_p; } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * @param yyscanner The scanner object. * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file , yyscanner); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * @param yyscanner The scanner object. */ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf , yyscanner ); yyfree( (void *) b , yyscanner ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flush_buffer( b , yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( yyscanner ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * @param yyscanner The scanner object. */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; yyensure_buffer_stack(yyscanner); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * @param yyscanner The scanner object. */ void yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (yyscan_t yyscanner) { yy_size_t num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!yyg->yy_buffer_stack) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; } if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b , yyscanner ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) { return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n , yyscanner ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n , yyscanner); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } static void yy_push_state (int _new_state , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth ) { yy_size_t new_size; yyg->yy_start_stack_depth += YY_START_STACK_INCR; new_size = (yy_size_t) yyg->yy_start_stack_depth * sizeof( int ); if ( ! yyg->yy_start_stack ) yyg->yy_start_stack = (int *) yyalloc( new_size , yyscanner ); else yyg->yy_start_stack = (int *) yyrealloc( (void *) yyg->yy_start_stack, new_size , yyscanner ); if ( ! yyg->yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START; BEGIN(_new_state); } static void yy_pop_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( --yyg->yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]); } static int yy_top_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ yyg->yy_hold_char = *yyg->yy_c_buf_p; \ *yyg->yy_c_buf_p = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; } /** Get the current line number. * @param yyscanner The scanner object. */ int yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yylineno; } /** Get the current column number. * @param yyscanner The scanner object. */ int yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yycolumn; } /** Get the input stream. * @param yyscanner The scanner object. */ FILE *yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; } /** Get the output stream. * @param yyscanner The scanner object. */ FILE *yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; } /** Get the length of the current token. * @param yyscanner The scanner object. */ int yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; } /** Get the current token. * @param yyscanner The scanner object. */ char *yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; } /** Set the user-defined data. This data is never touched by the scanner. * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. * @param _line_number line number * @param yyscanner The scanner object. */ void yyset_lineno (int _line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); yylineno = _line_number; } /** Set the current column. * @param _column_no column number * @param yyscanner The scanner object. */ void yyset_column (int _column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_column called with no buffer" ); yycolumn = _column_no; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * @param yyscanner The scanner object. * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyin = _in_str ; } void yyset_out (FILE * _out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyout = _out_str ; } int yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } void yyset_debug (int _bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flex_debug = _bdebug ; } /* Accessor methods for yylval and yylloc */ YYSTYPE * yyget_lval (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylval; } void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; } YYLTYPE *yyget_lloc (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylloc; } void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylloc = yylloc_param; } /* User-visible API */ /* yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ int yylex_init(yyscan_t* ptr_yy_globals) { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); return yy_init_globals ( *ptr_yy_globals ); } /* yylex_init_extra has the same functionality as yylex_init, but follows the * convention of taking the scanner as the last argument. Note however, that * this is a *pointer* to a scanner, as it will be allocated by this call (and * is the reason, too, why this function also must handle its own declaration). * The user defined value in the first argument will be available to yyalloc in * the yyextra field. */ int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) { struct yyguts_t dummy_yyguts; yyset_extra (yy_user_defined, &dummy_yyguts); if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); yyset_extra (yy_user_defined, *ptr_yy_globals); return yy_init_globals ( *ptr_yy_globals ); } static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ yyg->yy_buffer_stack = NULL; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; yyg->yy_c_buf_p = NULL; yyg->yy_init = 0; yyg->yy_start = 0; yyg->yy_start_stack_ptr = 0; yyg->yy_start_stack_depth = 0; yyg->yy_start_stack = NULL; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ yyfree(yyg->yy_buffer_stack , yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ yyfree( yyg->yy_start_stack , yyscanner ); yyg->yy_start_stack = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s , yyscan_t yyscanner) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" namespace MiniZinc { int yy_input_proc(char* buf, int size, yyscan_t yyscanner) { MiniZinc::ParserState* parm = static_cast(yyget_extra(yyscanner)); return parm->fillBuffer(buf, size); // work around warning that yyunput is unused yyunput (0,buf,yyscanner); } } libminizinc-2.5.3/lib/cached/parser.tab.cpp0000644000175000017500000072143313757304533017234 0ustar kaolkaol/* A Bison parser, made by GNU Bison 3.6.4. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.6.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Substitute the variable and function names. */ #define yyparse mzn_yyparse #define yylex mzn_yylex #define yyerror mzn_yyerror #define yydebug mzn_yydebug #define yynerrs mzn_yynerrs /* First part of user prologue. */ #define SCANNER static_cast(parm)->yyscanner #include #include #include #include namespace MiniZinc{ class ParserLocation; } #define YYLTYPE MiniZinc::ParserLocation #define YYLTYPE_IS_DECLARED 1 #define YYLTYPE_IS_TRIVIAL 0 #define YYMAXDEPTH 10000 #define YYINITDEPTH 10000 #include #include using namespace std; using namespace MiniZinc; #define YYLLOC_DEFAULT(Current, Rhs, N) \ do { \ if (N > 0) { \ (Current).filename(YYRHSLOC(Rhs, 1).filename()); \ (Current).firstLine(YYRHSLOC(Rhs, 1).firstLine()); \ (Current).firstColumn(YYRHSLOC(Rhs, 1).firstColumn()); \ (Current).lastLine(YYRHSLOC(Rhs, N).lastLine()); \ (Current).lastColumn(YYRHSLOC(Rhs, N).lastColumn()); \ } else { \ (Current).filename(YYRHSLOC(Rhs, 0).filename()); \ (Current).firstLine(YYRHSLOC(Rhs, 0).lastLine()); \ (Current).firstColumn(YYRHSLOC(Rhs, 0).lastColumn()); \ (Current).lastLine(YYRHSLOC(Rhs, 0).lastLine()); \ (Current).lastColumn(YYRHSLOC(Rhs, 0).lastColumn()); \ } \ } while (false) int mzn_yyparse(void*); int mzn_yylex(YYSTYPE*, YYLTYPE*, void* scanner); int mzn_yylex_init (void** scanner); int mzn_yylex_destroy (void* scanner); int mzn_yyget_lineno (void* scanner); void mzn_yyset_extra (void* user_defined ,void* yyscanner ); extern int yydebug; namespace MiniZinc { void yyerror(YYLTYPE* location, void* parm, const string& str) { ParserState* pp = static_cast(parm); Model* m = pp->model; while (m->parent() != nullptr) { m = m->parent(); pp->err << "(included from file '" << m->filename() << "')" << endl; } pp->err << location->toString() << ":" << endl; pp->printCurrentLine(location->firstColumn(),location->lastColumn()); pp->err << "Error: " << str << std::endl; pp->hadError = true; pp->syntaxErrors.push_back(SyntaxError(Location(*location), str)); } bool notInDatafile(YYLTYPE* location, void* parm, const string& item) { ParserState* pp = static_cast(parm); if (pp->isDatafile) { yyerror(location,parm,item+" item not allowed in data file"); return false; } return true; } Expression* createDocComment(const ParserLocation& loc, const std::string& s) { std::vector args(1); args[0] = new StringLit(loc, s); Call* c = new Call(Location(loc), constants().ann.doc_comment, args); c->type(Type::ann()); return c; } Expression* createArrayAccess(const ParserLocation& loc, Expression* e, std::vector >& idx) { Expression* ret = e; for (unsigned int i=0; i (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif #include /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_MZN_INTEGER_LITERAL = 3, /* "integer literal" */ YYSYMBOL_MZN_BOOL_LITERAL = 4, /* "bool literal" */ YYSYMBOL_MZN_FLOAT_LITERAL = 5, /* "float literal" */ YYSYMBOL_MZN_IDENTIFIER = 6, /* "identifier" */ YYSYMBOL_MZN_QUOTED_IDENTIFIER = 7, /* "quoted identifier" */ YYSYMBOL_MZN_STRING_LITERAL = 8, /* "string literal" */ YYSYMBOL_MZN_STRING_QUOTE_START = 9, /* "interpolated string start" */ YYSYMBOL_MZN_STRING_QUOTE_MID = 10, /* "interpolated string middle" */ YYSYMBOL_MZN_STRING_QUOTE_END = 11, /* "interpolated string end" */ YYSYMBOL_MZN_TI_IDENTIFIER = 12, /* "type-inst identifier" */ YYSYMBOL_MZN_TI_ENUM_IDENTIFIER = 13, /* "type-inst enum identifier" */ YYSYMBOL_MZN_DOC_COMMENT = 14, /* "documentation comment" */ YYSYMBOL_MZN_DOC_FILE_COMMENT = 15, /* "file-level documentation comment" */ YYSYMBOL_MZN_VAR = 16, /* "var" */ YYSYMBOL_MZN_PAR = 17, /* "par" */ YYSYMBOL_MZN_ABSENT = 18, /* "<>" */ YYSYMBOL_MZN_ANN = 19, /* "ann" */ YYSYMBOL_MZN_ANNOTATION = 20, /* "annotation" */ YYSYMBOL_MZN_ANY = 21, /* "any" */ YYSYMBOL_MZN_ARRAY = 22, /* "array" */ YYSYMBOL_MZN_BOOL = 23, /* "bool" */ YYSYMBOL_MZN_CASE = 24, /* "case" */ YYSYMBOL_MZN_CONSTRAINT = 25, /* "constraint" */ YYSYMBOL_MZN_DEFAULT = 26, /* "default" */ YYSYMBOL_MZN_ELSE = 27, /* "else" */ YYSYMBOL_MZN_ELSEIF = 28, /* "elseif" */ YYSYMBOL_MZN_ENDIF = 29, /* "endif" */ YYSYMBOL_MZN_ENUM = 30, /* "enum" */ YYSYMBOL_MZN_FLOAT = 31, /* "float" */ YYSYMBOL_MZN_FUNCTION = 32, /* "function" */ YYSYMBOL_MZN_IF = 33, /* "if" */ YYSYMBOL_MZN_INCLUDE = 34, /* "include" */ YYSYMBOL_MZN_INFINITY = 35, /* "infinity" */ YYSYMBOL_MZN_INT = 36, /* "int" */ YYSYMBOL_MZN_LET = 37, /* "let" */ YYSYMBOL_MZN_LIST = 38, /* "list" */ YYSYMBOL_MZN_MAXIMIZE = 39, /* "maximize" */ YYSYMBOL_MZN_MINIMIZE = 40, /* "minimize" */ YYSYMBOL_MZN_OF = 41, /* "of" */ YYSYMBOL_MZN_OPT = 42, /* "opt" */ YYSYMBOL_MZN_SATISFY = 43, /* "satisfy" */ YYSYMBOL_MZN_OUTPUT = 44, /* "output" */ YYSYMBOL_MZN_PREDICATE = 45, /* "predicate" */ YYSYMBOL_MZN_RECORD = 46, /* "record" */ YYSYMBOL_MZN_SET = 47, /* "set" */ YYSYMBOL_MZN_SOLVE = 48, /* "solve" */ YYSYMBOL_MZN_STRING = 49, /* "string" */ YYSYMBOL_MZN_TEST = 50, /* "test" */ YYSYMBOL_MZN_THEN = 51, /* "then" */ YYSYMBOL_MZN_TUPLE = 52, /* "tuple" */ YYSYMBOL_MZN_TYPE = 53, /* "type" */ YYSYMBOL_MZN_UNDERSCORE = 54, /* "_" */ YYSYMBOL_MZN_VARIANT_RECORD = 55, /* "variant_record" */ YYSYMBOL_MZN_WHERE = 56, /* "where" */ YYSYMBOL_MZN_LEFT_BRACKET = 57, /* "[" */ YYSYMBOL_MZN_LEFT_2D_BRACKET = 58, /* "[|" */ YYSYMBOL_MZN_RIGHT_BRACKET = 59, /* "]" */ YYSYMBOL_MZN_RIGHT_2D_BRACKET = 60, /* "|]" */ YYSYMBOL_FLATZINC_IDENTIFIER = 61, /* FLATZINC_IDENTIFIER */ YYSYMBOL_MZN_INVALID_INTEGER_LITERAL = 62, /* "invalid integer literal" */ YYSYMBOL_MZN_INVALID_FLOAT_LITERAL = 63, /* "invalid float literal" */ YYSYMBOL_MZN_UNTERMINATED_STRING = 64, /* "unterminated string" */ YYSYMBOL_MZN_END_OF_LINE_IN_STRING = 65, /* "end of line inside string literal" */ YYSYMBOL_MZN_INVALID_NULL = 66, /* "null character" */ YYSYMBOL_MZN_EQUIV = 67, /* "<->" */ YYSYMBOL_MZN_IMPL = 68, /* "->" */ YYSYMBOL_MZN_RIMPL = 69, /* "<-" */ YYSYMBOL_MZN_OR = 70, /* "\\/" */ YYSYMBOL_MZN_XOR = 71, /* "xor" */ YYSYMBOL_MZN_AND = 72, /* "/\\" */ YYSYMBOL_MZN_LE = 73, /* "<" */ YYSYMBOL_MZN_GR = 74, /* ">" */ YYSYMBOL_MZN_LQ = 75, /* "<=" */ YYSYMBOL_MZN_GQ = 76, /* ">=" */ YYSYMBOL_MZN_EQ = 77, /* "=" */ YYSYMBOL_MZN_NQ = 78, /* "!=" */ YYSYMBOL_MZN_WEAK_EQ = 79, /* "~=" */ YYSYMBOL_MZN_IN = 80, /* "in" */ YYSYMBOL_MZN_SUBSET = 81, /* "subset" */ YYSYMBOL_MZN_SUPERSET = 82, /* "superset" */ YYSYMBOL_MZN_UNION = 83, /* "union" */ YYSYMBOL_MZN_DIFF = 84, /* "diff" */ YYSYMBOL_MZN_SYMDIFF = 85, /* "symdiff" */ YYSYMBOL_MZN_DOTDOT = 86, /* ".." */ YYSYMBOL_MZN_PLUS = 87, /* "+" */ YYSYMBOL_MZN_MINUS = 88, /* "-" */ YYSYMBOL_MZN_WEAK_PLUS = 89, /* "~+" */ YYSYMBOL_MZN_WEAK_MINUS = 90, /* "~-" */ YYSYMBOL_MZN_MULT = 91, /* "*" */ YYSYMBOL_MZN_DIV = 92, /* "/" */ YYSYMBOL_MZN_IDIV = 93, /* "div" */ YYSYMBOL_MZN_MOD = 94, /* "mod" */ YYSYMBOL_MZN_INTERSECT = 95, /* "intersect" */ YYSYMBOL_MZN_WEAK_MULT = 96, /* "~*" */ YYSYMBOL_MZN_POW = 97, /* "^" */ YYSYMBOL_MZN_POW_MINUS1 = 98, /* "^-1" */ YYSYMBOL_MZN_NOT = 99, /* "not" */ YYSYMBOL_MZN_PLUSPLUS = 100, /* "++" */ YYSYMBOL_MZN_COLONCOLON = 101, /* "::" */ YYSYMBOL_PREC_ANNO = 102, /* PREC_ANNO */ YYSYMBOL_MZN_EQUIV_QUOTED = 103, /* "'<->'" */ YYSYMBOL_MZN_IMPL_QUOTED = 104, /* "'->'" */ YYSYMBOL_MZN_RIMPL_QUOTED = 105, /* "'<-'" */ YYSYMBOL_MZN_OR_QUOTED = 106, /* "'\\/'" */ YYSYMBOL_MZN_XOR_QUOTED = 107, /* "'xor'" */ YYSYMBOL_MZN_AND_QUOTED = 108, /* "'/\\'" */ YYSYMBOL_MZN_LE_QUOTED = 109, /* "'<'" */ YYSYMBOL_MZN_GR_QUOTED = 110, /* "'>'" */ YYSYMBOL_MZN_LQ_QUOTED = 111, /* "'<='" */ YYSYMBOL_MZN_GQ_QUOTED = 112, /* "'>='" */ YYSYMBOL_MZN_EQ_QUOTED = 113, /* "'='" */ YYSYMBOL_MZN_NQ_QUOTED = 114, /* "'!='" */ YYSYMBOL_MZN_IN_QUOTED = 115, /* "'in'" */ YYSYMBOL_MZN_SUBSET_QUOTED = 116, /* "'subset'" */ YYSYMBOL_MZN_SUPERSET_QUOTED = 117, /* "'superset'" */ YYSYMBOL_MZN_UNION_QUOTED = 118, /* "'union'" */ YYSYMBOL_MZN_DIFF_QUOTED = 119, /* "'diff'" */ YYSYMBOL_MZN_SYMDIFF_QUOTED = 120, /* "'symdiff'" */ YYSYMBOL_MZN_DOTDOT_QUOTED = 121, /* "'..'" */ YYSYMBOL_MZN_PLUS_QUOTED = 122, /* "'+'" */ YYSYMBOL_MZN_MINUS_QUOTED = 123, /* "'-'" */ YYSYMBOL_MZN_MULT_QUOTED = 124, /* "'*'" */ YYSYMBOL_MZN_DIV_QUOTED = 125, /* "'/'" */ YYSYMBOL_MZN_IDIV_QUOTED = 126, /* "'div'" */ YYSYMBOL_MZN_MOD_QUOTED = 127, /* "'mod'" */ YYSYMBOL_MZN_INTERSECT_QUOTED = 128, /* "'intersect'" */ YYSYMBOL_MZN_POW_QUOTED = 129, /* "'^'" */ YYSYMBOL_MZN_NOT_QUOTED = 130, /* "'not'" */ YYSYMBOL_MZN_COLONCOLON_QUOTED = 131, /* "'::'" */ YYSYMBOL_MZN_PLUSPLUS_QUOTED = 132, /* "'++'" */ YYSYMBOL_133_ = 133, /* ';' */ YYSYMBOL_134_ = 134, /* '{' */ YYSYMBOL_135_ = 135, /* '}' */ YYSYMBOL_136_ = 136, /* '(' */ YYSYMBOL_137_ = 137, /* ')' */ YYSYMBOL_138_ = 138, /* ',' */ YYSYMBOL_139_ = 139, /* ':' */ YYSYMBOL_140_ = 140, /* '|' */ YYSYMBOL_YYACCEPT = 141, /* $accept */ YYSYMBOL_model = 142, /* model */ YYSYMBOL_item_list = 143, /* item_list */ YYSYMBOL_item_list_head = 144, /* item_list_head */ YYSYMBOL_doc_file_comments = 145, /* doc_file_comments */ YYSYMBOL_semi_or_none = 146, /* semi_or_none */ YYSYMBOL_item = 147, /* item */ YYSYMBOL_item_tail = 148, /* item_tail */ YYSYMBOL_error_item_start = 149, /* error_item_start */ YYSYMBOL_include_item = 150, /* include_item */ YYSYMBOL_vardecl_item = 151, /* vardecl_item */ YYSYMBOL_enum_init = 152, /* enum_init */ YYSYMBOL_enum_construct = 153, /* enum_construct */ YYSYMBOL_string_lit_list = 154, /* string_lit_list */ YYSYMBOL_enum_id_list = 155, /* enum_id_list */ YYSYMBOL_assign_item = 156, /* assign_item */ YYSYMBOL_constraint_item = 157, /* constraint_item */ YYSYMBOL_solve_item = 158, /* solve_item */ YYSYMBOL_output_item = 159, /* output_item */ YYSYMBOL_predicate_item = 160, /* predicate_item */ YYSYMBOL_function_item = 161, /* function_item */ YYSYMBOL_annotation_item = 162, /* annotation_item */ YYSYMBOL_operation_item_tail = 163, /* operation_item_tail */ YYSYMBOL_params = 164, /* params */ YYSYMBOL_params_list = 165, /* params_list */ YYSYMBOL_params_list_head = 166, /* params_list_head */ YYSYMBOL_comma_or_none = 167, /* comma_or_none */ YYSYMBOL_ti_expr_and_id_or_anon = 168, /* ti_expr_and_id_or_anon */ YYSYMBOL_ti_expr_and_id = 169, /* ti_expr_and_id */ YYSYMBOL_ti_expr_list = 170, /* ti_expr_list */ YYSYMBOL_ti_expr_list_head = 171, /* ti_expr_list_head */ YYSYMBOL_ti_expr = 172, /* ti_expr */ YYSYMBOL_base_ti_expr = 173, /* base_ti_expr */ YYSYMBOL_opt_opt = 174, /* opt_opt */ YYSYMBOL_base_ti_expr_tail = 175, /* base_ti_expr_tail */ YYSYMBOL_array_access_expr_list = 176, /* array_access_expr_list */ YYSYMBOL_array_access_expr_list_head = 177, /* array_access_expr_list_head */ YYSYMBOL_array_access_expr = 178, /* array_access_expr */ YYSYMBOL_expr_list = 179, /* expr_list */ YYSYMBOL_expr_list_head = 180, /* expr_list_head */ YYSYMBOL_set_expr = 181, /* set_expr */ YYSYMBOL_expr = 182, /* expr */ YYSYMBOL_expr_atom_head = 183, /* expr_atom_head */ YYSYMBOL_expr_atom_head_nonstring = 184, /* expr_atom_head_nonstring */ YYSYMBOL_string_expr = 185, /* string_expr */ YYSYMBOL_string_quote_rest = 186, /* string_quote_rest */ YYSYMBOL_array_access_tail = 187, /* array_access_tail */ YYSYMBOL_set_literal = 188, /* set_literal */ YYSYMBOL_set_comp = 189, /* set_comp */ YYSYMBOL_comp_tail = 190, /* comp_tail */ YYSYMBOL_generator_list = 191, /* generator_list */ YYSYMBOL_generator_list_head = 192, /* generator_list_head */ YYSYMBOL_generator = 193, /* generator */ YYSYMBOL_generator_eq = 194, /* generator_eq */ YYSYMBOL_id_list = 195, /* id_list */ YYSYMBOL_id_list_head = 196, /* id_list_head */ YYSYMBOL_simple_array_literal = 197, /* simple_array_literal */ YYSYMBOL_simple_array_literal_2d = 198, /* simple_array_literal_2d */ YYSYMBOL_simple_array_literal_3d_list = 199, /* simple_array_literal_3d_list */ YYSYMBOL_simple_array_literal_2d_list = 200, /* simple_array_literal_2d_list */ YYSYMBOL_simple_array_comp = 201, /* simple_array_comp */ YYSYMBOL_if_then_else_expr = 202, /* if_then_else_expr */ YYSYMBOL_elseif_list = 203, /* elseif_list */ YYSYMBOL_quoted_op = 204, /* quoted_op */ YYSYMBOL_quoted_op_call = 205, /* quoted_op_call */ YYSYMBOL_call_expr = 206, /* call_expr */ YYSYMBOL_comp_or_expr = 207, /* comp_or_expr */ YYSYMBOL_comp_or_expr_head = 208, /* comp_or_expr_head */ YYSYMBOL_let_expr = 209, /* let_expr */ YYSYMBOL_let_vardecl_item_list = 210, /* let_vardecl_item_list */ YYSYMBOL_comma_or_semi = 211, /* comma_or_semi */ YYSYMBOL_let_vardecl_item = 212, /* let_vardecl_item */ YYSYMBOL_annotations = 213, /* annotations */ YYSYMBOL_annotation_expr = 214, /* annotation_expr */ YYSYMBOL_ne_annotations = 215, /* ne_annotations */ YYSYMBOL_id_or_quoted_op = 216 /* id_or_quoted_op */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int16 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if 1 /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* 1 */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; YYLTYPE yyls_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \ + YYSIZEOF (YYLTYPE)) \ + 2 * YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 166 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 5229 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 141 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 76 /* YYNRULES -- Number of rules. */ #define YYNRULES 356 /* YYNSTATES -- Number of states. */ #define YYNSTATES 588 #define YYMAXUTOK 387 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 136, 137, 2, 2, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 133, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 134, 140, 135, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { 0, 286, 286, 288, 290, 293, 302, 311, 320, 329, 331, 334, 342, 351, 351, 353, 369, 373, 375, 377, 378, 380, 382, 384, 386, 388, 391, 391, 391, 392, 392, 392, 392, 392, 393, 396, 419, 425, 432, 442, 460, 476, 480, 489, 494, 503, 504, 508, 516, 517, 521, 525, 531, 533, 540, 545, 550, 557, 561, 571, 581, 589, 599, 608, 619, 632, 642, 643, 648, 649, 651, 656, 657, 661, 665, 670, 670, 673, 675, 679, 687, 691, 693, 697, 698, 704, 713, 716, 724, 732, 741, 749, 758, 767, 780, 781, 785, 787, 789, 791, 793, 795, 797, 802, 808, 811, 813, 817, 819, 821, 830, 841, 844, 846, 852, 853, 855, 857, 859, 861, 870, 879, 881, 883, 885, 887, 889, 891, 893, 895, 897, 902, 907, 912, 917, 923, 925, 938, 939, 941, 943, 945, 947, 949, 951, 953, 955, 957, 959, 961, 963, 965, 967, 969, 971, 973, 975, 977, 986, 995, 997, 999, 1001, 1003, 1005, 1007, 1009, 1011, 1013, 1018, 1023, 1028, 1033, 1039, 1041, 1048, 1060, 1062, 1066, 1068, 1070, 1072, 1074, 1076, 1079, 1081, 1084, 1086, 1089, 1091, 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108, 1110, 1112, 1114, 1115, 1118, 1120, 1123, 1124, 1127, 1129, 1132, 1133, 1136, 1138, 1141, 1142, 1145, 1147, 1150, 1151, 1154, 1156, 1159, 1160, 1163, 1165, 1168, 1169, 1170, 1173, 1174, 1179, 1181, 1187, 1192, 1200, 1207, 1216, 1218, 1223, 1229, 1232, 1235, 1237, 1239, 1245, 1247, 1249, 1257, 1259, 1262, 1265, 1268, 1270, 1274, 1276, 1280, 1282, 1293, 1304, 1344, 1347, 1352, 1359, 1364, 1368, 1374, 1381, 1397, 1398, 1402, 1404, 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1460, 1468, 1500, 1502, 1504, 1505, 1525, 1579, 1599, 1654, 1657, 1663, 1669, 1671, 1675, 1682, 1691, 1693, 1701, 1703, 1712, 1712, 1715, 1721, 1732, 1733, 1736, 1738, 1742, 1746, 1750, 1752, 1754, 1756, 1758, 1760, 1762, 1764, 1766, 1768, 1770, 1772, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1790, 1792, 1794, 1796, 1798, 1800, 1802, 1804, 1806, 1808, 1810 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if 1 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "\"integer literal\"", "\"bool literal\"", "\"float literal\"", "\"identifier\"", "\"quoted identifier\"", "\"string literal\"", "\"interpolated string start\"", "\"interpolated string middle\"", "\"interpolated string end\"", "\"type-inst identifier\"", "\"type-inst enum identifier\"", "\"documentation comment\"", "\"file-level documentation comment\"", "\"var\"", "\"par\"", "\"<>\"", "\"ann\"", "\"annotation\"", "\"any\"", "\"array\"", "\"bool\"", "\"case\"", "\"constraint\"", "\"default\"", "\"else\"", "\"elseif\"", "\"endif\"", "\"enum\"", "\"float\"", "\"function\"", "\"if\"", "\"include\"", "\"infinity\"", "\"int\"", "\"let\"", "\"list\"", "\"maximize\"", "\"minimize\"", "\"of\"", "\"opt\"", "\"satisfy\"", "\"output\"", "\"predicate\"", "\"record\"", "\"set\"", "\"solve\"", "\"string\"", "\"test\"", "\"then\"", "\"tuple\"", "\"type\"", "\"_\"", "\"variant_record\"", "\"where\"", "\"[\"", "\"[|\"", "\"]\"", "\"|]\"", "FLATZINC_IDENTIFIER", "\"invalid integer literal\"", "\"invalid float literal\"", "\"unterminated string\"", "\"end of line inside string literal\"", "\"null character\"", "\"<->\"", "\"->\"", "\"<-\"", "\"\\\\/\"", "\"xor\"", "\"/\\\\\"", "\"<\"", "\">\"", "\"<=\"", "\">=\"", "\"=\"", "\"!=\"", "\"~=\"", "\"in\"", "\"subset\"", "\"superset\"", "\"union\"", "\"diff\"", "\"symdiff\"", "\"..\"", "\"+\"", "\"-\"", "\"~+\"", "\"~-\"", "\"*\"", "\"/\"", "\"div\"", "\"mod\"", "\"intersect\"", "\"~*\"", "\"^\"", "\"^-1\"", "\"not\"", "\"++\"", "\"::\"", "PREC_ANNO", "\"'<->'\"", "\"'->'\"", "\"'<-'\"", "\"'\\\\/'\"", "\"'xor'\"", "\"'/\\\\'\"", "\"'<'\"", "\"'>'\"", "\"'<='\"", "\"'>='\"", "\"'='\"", "\"'!='\"", "\"'in'\"", "\"'subset'\"", "\"'superset'\"", "\"'union'\"", "\"'diff'\"", "\"'symdiff'\"", "\"'..'\"", "\"'+'\"", "\"'-'\"", "\"'*'\"", "\"'/'\"", "\"'div'\"", "\"'mod'\"", "\"'intersect'\"", "\"'^'\"", "\"'not'\"", "\"'::'\"", "\"'++'\"", "';'", "'{'", "'}'", "'('", "')'", "','", "':'", "'|'", "$accept", "model", "item_list", "item_list_head", "doc_file_comments", "semi_or_none", "item", "item_tail", "error_item_start", "include_item", "vardecl_item", "enum_init", "enum_construct", "string_lit_list", "enum_id_list", "assign_item", "constraint_item", "solve_item", "output_item", "predicate_item", "function_item", "annotation_item", "operation_item_tail", "params", "params_list", "params_list_head", "comma_or_none", "ti_expr_and_id_or_anon", "ti_expr_and_id", "ti_expr_list", "ti_expr_list_head", "ti_expr", "base_ti_expr", "opt_opt", "base_ti_expr_tail", "array_access_expr_list", "array_access_expr_list_head", "array_access_expr", "expr_list", "expr_list_head", "set_expr", "expr", "expr_atom_head", "expr_atom_head_nonstring", "string_expr", "string_quote_rest", "array_access_tail", "set_literal", "set_comp", "comp_tail", "generator_list", "generator_list_head", "generator", "generator_eq", "id_list", "id_list_head", "simple_array_literal", "simple_array_literal_2d", "simple_array_literal_3d_list", "simple_array_literal_2d_list", "simple_array_comp", "if_then_else_expr", "elseif_list", "quoted_op", "quoted_op_call", "call_expr", "comp_or_expr", "comp_or_expr_head", "let_expr", "let_vardecl_item_list", "comma_or_semi", "let_vardecl_item", "annotations", "annotation_expr", "ne_annotations", "id_or_quoted_op", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_int16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 59, 123, 125, 40, 41, 44, 58, 124 }; #endif #define YYPACT_NINF (-427) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-72) #define yytable_value_is_error(Yyn) \ ((Yyn) == YYTABLE_NINF) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { 888, -78, -39, -38, -16, -9, -427, 3705, -427, -427, 1829, -427, 20, 20, -6, -427, 77, 38, -427, 3035, 107, -427, 2231, 3705, 110, 48, -427, 18, 114, 2499, 3705, 109, 117, 72, -427, 171, -37, 3169, 569, 3839, 3839, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, 45, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, 3303, 3705, 185, -427, 53, 1427, 300, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, 72, 52, -427, -427, 354, -427, -427, -427, -35, -12, -4, 7, 9, 10, 58, -427, 23, -427, 1695, -427, -427, -427, 3437, 3705, 65, 1157, 55, 8, 3705, 3705, 3705, 66, 5, 5000, -427, -427, -427, -427, 2633, 2767, -427, 67, 2231, 27, 5000, 72, 68, 4721, -427, -427, 2097, 2365, 163, -427, 5000, -61, 2901, 607, 140, 105, -49, -427, 84, -427, 149, 71, 3909, -427, 750, -427, -27, -31, 37, 37, 3705, -427, 76, 4000, 4252, -427, 1561, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, 135, 252, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 3839, 607, -427, 100, -427, 115, -427, 119, -427, 159, -427, 211, -427, 214, 3705, -427, 216, -427, 3705, 205, 128, -427, 5037, 5000, 1292, -427, 4763, 132, 134, 3437, -427, 49, 49, 49, 3705, 3705, -427, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 607, 234, -427, 236, -427, 1022, 204, 223, 145, -427, 3705, 208, 3908, 3705, -427, 72, 147, -95, -427, -427, 2901, 67, 72, -427, -427, -427, -427, 3705, 3705, -427, 607, 67, 72, -427, -427, 3705, -427, 278, -427, 148, -427, 150, -427, 3571, 4126, -427, 278, 217, 1427, -427, 3705, 153, 190, 1112, 74, 74, 74, 207, 32, 32, 32, 32, 34, 34, 34, 34, 74, 34, 37, 16, -427, -427, -427, -427, -427, -427, -427, 4035, -427, 5000, -427, 3437, -427, 3705, -427, 168, 3705, 170, 3705, -427, 254, 4161, -427, 5000, 210, 5091, 1146, 1146, 1281, 1281, 1416, 5128, 5128, 5128, 5128, 5128, 5128, 5128, 731, 731, 731, 1244, 1244, 1244, 2987, 96, 96, 96, 96, 39, 39, 39, 39, 1244, 39, 49, 19, -427, 2901, 2901, 181, 186, 184, -427, -427, 147, 3705, 283, 2231, -427, 5000, 22, 228, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, 67, 4665, 250, 322, -427, 249, -427, 1963, -427, 72, 259, 5000, 5000, -427, 72, 259, 260, 272, -427, 201, -427, 285, 262, 209, 3705, 3705, -427, -427, 3705, 218, -427, 219, -427, 5000, 2231, -427, 3705, -427, 213, 5000, 3705, 4813, -427, 3705, -427, -427, -427, -427, 2231, -427, 5000, 2365, -427, 220, 335, 345, 255, -427, -427, 72, -427, 30, 3705, -427, 3705, 274, -427, -427, 259, 3705, -427, 259, -427, 3705, -427, 278, -427, 3705, 3705, 351, -427, 224, 4287, -427, -427, 222, 4378, 3705, 4413, 3705, 4504, -427, -427, 3705, -427, -28, -427, -88, 13, 259, 3705, 3705, 5000, 5000, 3705, -427, 5000, -427, 5000, -427, 307, 5000, 4855, -427, 3705, -427, 72, -427, 4539, -427, 5000, -427, 4630, -427, 357, -427, 360, -427, -427, 4946, 4909, 5000, 3705, 3705, 259, -427, -427, -427, -427, -427, 3705, 5000, 5000, -427, 5000 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_int16 yydefact[] = { 0, 0, 192, 190, 196, 182, 229, 0, 102, 103, 0, 11, 94, 94, 198, 100, 0, 0, 97, 0, 0, 98, 0, 0, 0, 194, 96, 0, 0, 0, 0, 0, 0, 320, 99, 0, 186, 0, 0, 0, 0, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 0, 286, 287, 288, 290, 291, 292, 293, 289, 295, 294, 0, 0, 0, 2, 13, 0, 5, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 320, 0, 83, 86, 101, 114, 176, 177, 200, 204, 208, 212, 216, 220, 0, 300, 225, 224, 0, 193, 191, 197, 0, 0, 184, 0, 183, 182, 0, 0, 0, 0, 0, 112, 137, 230, 15, 95, 0, 0, 199, 68, 0, 0, 52, 320, 0, 0, 35, 195, 0, 0, 0, 87, 57, 68, 0, 0, 0, 321, 68, 188, 187, 252, 0, 75, 112, 254, 0, 261, 0, 0, 135, 136, 0, 235, 0, 112, 0, 1, 14, 4, 12, 6, 34, 29, 27, 32, 26, 28, 31, 30, 33, 9, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 201, 206, 205, 210, 209, 214, 213, 218, 217, 222, 221, 0, 227, 226, 10, 108, 0, 75, 105, 107, 51, 0, 298, 306, 0, 75, 0, 185, 174, 175, 173, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 88, 0, 64, 0, 75, 81, 0, 38, 0, 0, 313, 320, 0, 0, 312, 85, 0, 68, 320, 90, 322, 323, 324, 0, 0, 54, 0, 68, 320, 189, 253, 76, 111, 0, 258, 0, 257, 0, 255, 0, 0, 236, 0, 178, 0, 7, 0, 79, 134, 133, 116, 117, 118, 119, 123, 124, 130, 131, 125, 126, 127, 128, 121, 132, 129, 122, 115, 203, 207, 211, 215, 219, 223, 0, 228, 109, 233, 76, 104, 110, 299, 0, 0, 301, 76, 305, 0, 0, 232, 113, 172, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 171, 151, 152, 153, 154, 155, 156, 157, 161, 162, 168, 169, 163, 164, 165, 166, 159, 170, 167, 160, 138, 0, 0, 0, 0, 75, 73, 77, 78, 0, 0, 76, 80, 53, 0, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 353, 354, 350, 355, 356, 68, 266, 318, 0, 317, 0, 316, 0, 91, 320, 66, 56, 55, 325, 320, 66, 250, 0, 238, 75, 240, 241, 0, 75, 259, 0, 256, 262, 0, 0, 180, 179, 8, 37, 71, 297, 0, 106, 303, 307, 0, 308, 234, 0, 93, 92, 70, 69, 76, 72, 65, 0, 82, 0, 45, 48, 39, 41, 327, 320, 264, 0, 0, 79, 0, 0, 315, 314, 66, 0, 58, 66, 59, 0, 263, 76, 239, 0, 0, 76, 249, 0, 0, 237, 181, 0, 0, 0, 0, 0, 0, 74, 84, 0, 46, 0, 49, 0, 0, 66, 0, 0, 319, 310, 0, 60, 67, 61, 248, 243, 244, 242, 246, 251, 260, 120, 320, 296, 0, 302, 309, 158, 0, 40, 0, 43, 0, 42, 62, 0, 0, 311, 0, 0, 66, 304, 44, 47, 50, 265, 0, 245, 247, 63, 267 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -427, -427, -427, -427, 200, -427, -63, 358, -427, -427, -427, -427, -172, -427, -427, -427, -134, -427, -427, -427, -427, -427, -426, -133, -107, -427, -203, -120, -131, -427, -427, -15, -136, 359, -24, 144, -427, 25, -36, 17, 215, -19, 352, -123, -117, 143, -26, -427, -427, 62, -427, -427, -138, -135, -427, -427, -427, -427, -427, -147, -427, -427, -427, -427, -427, -427, 158, -427, -427, -427, -427, -66, -33, -171, -427, -427 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 72, 73, 74, 75, 168, 76, 77, 180, 78, 79, 499, 500, 538, 540, 80, 81, 82, 83, 84, 85, 86, 513, 277, 402, 403, 307, 404, 87, 278, 279, 88, 89, 125, 90, 219, 220, 221, 156, 152, 91, 120, 121, 93, 94, 122, 113, 95, 96, 460, 461, 462, 463, 464, 465, 466, 97, 98, 157, 158, 99, 100, 504, 101, 102, 103, 227, 228, 104, 288, 450, 289, 145, 297, 146, 443 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 131, 151, 290, 285, 134, 140, 286, 133, 310, 293, 149, 141, 170, 281, 303, 235, 236, 353, 153, 496, 109, 295, 109, 183, 119, 360, 238, 296, 496, 313, 341, 566, 515, 311, 163, 6, 7, 292, 447, 183, 448, 183, 217, 449, 183, 109, 238, 568, 109, 302, 569, 164, 165, 109, 181, 105, 238, 543, 544, 106, 107, 148, 124, 202, 109, 109, 109, 109, 110, 203, 205, 207, 209, 211, 213, 276, 410, 216, 295, 497, 109, 183, 108, 128, 296, 548, 204, 276, 550, 111, 222, 223, 127, 226, 206, 129, 231, 232, 233, 282, 398, 273, 275, 238, 320, 208, 111, 210, 212, 314, 567, 312, 229, 132, 280, 142, 571, 201, 135, 294, 271, 215, 287, 193, 194, 195, 196, 112, 198, 199, 456, 199, 200, 201, 200, 201, 269, 200, 201, 270, 271, 229, 315, 237, 112, 405, 136, 498, 295, 270, 271, 586, 137, 230, 296, 138, 498, 229, 143, 452, 188, 189, 190, 191, 192, 193, 194, 195, 196, 457, 198, 199, 229, 144, 200, 201, 229, 147, 295, 298, 299, 161, 304, 300, 296, 166, 167, 263, 264, 265, 266, 182, 268, 269, 214, 348, 270, 271, 342, 350, 492, 224, 234, 276, 291, 226, 301, 283, 305, 306, 222, 316, 321, 343, 183, 362, 229, 344, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 119, 445, 159, 160, 475, 345, 322, 519, 453, 406, 411, 523, 351, 444, 352, 451, 229, 358, 458, 229, 359, 229, 109, 399, 229, 400, 470, 454, 455, 407, 408, 409, 459, 412, 446, 364, 467, 477, 468, 201, 474, -72, 189, 190, 191, 192, 193, 194, 195, 196, 476, 198, 199, 481, 483, 200, 201, 346, 502, 271, 347, 485, 349, 473, 509, 527, 489, 286, 171, 524, 491, 490, 494, 172, 501, 505, 506, 507, 173, 517, 174, 222, 175, 385, 512, 516, 482, 518, 484, 520, 521, 537, 176, 177, 405, 522, 178, 530, 179, 539, 92, 526, 547, 541, 536, 556, 535, 559, 405, 183, 92, 575, 557, 580, 581, 319, 123, 570, 528, 534, 126, 361, 92, 487, 488, 480, 363, 472, 552, 92, 356, 553, 510, 0, 0, 0, 493, 0, 0, 92, 92, 0, 495, 0, 0, 0, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 0, 0, 0, 511, 0, 0, 0, 0, 514, 0, 0, 92, 0, 0, 0, 470, 0, 184, 0, 287, 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 525, 0, 200, 201, 0, 92, 0, 0, 529, 0, 406, 0, 531, 0, 0, 533, 0, 542, 0, 0, 0, 0, 0, 0, 406, 92, 92, 0, 0, 92, 0, 0, 0, 0, 545, 0, 546, 92, 92, 0, 0, 549, 0, 92, 0, 551, 0, 0, 0, 554, 555, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 563, 0, 0, 0, 565, 0, 92, 0, 470, 0, 0, 572, 573, 577, 0, 574, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 584, 585, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 36, 0, 14, 37, 38, 92, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 92, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 117, 0, 0, 92, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 0, 0, 0, 155, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 60, 61, 62, 63, 64, 65, 66, 67, 68, 238, 69, 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, 0, 92, 92, 2, 3, 4, 114, 0, 6, 7, 0, 92, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 36, 0, 0, 37, 38, 0, 0, -72, -72, -72, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 92, 0, 270, 271, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 92, 0, 0, 92, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 0, -3, 1, 309, 2, 3, 4, 5, 0, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 0, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, 0, 30, 31, 0, 32, 33, 34, 35, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 401, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 28, 0, 0, 0, 29, 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 238, 69, 0, 70, 0, 71, -71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, -72, 25, 0, 27, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 0, 36, 200, 201, 37, 38, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 115, 116, 270, 271, 0, 0, 0, 238, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 238, 69, 0, 70, 0, 71, 225, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 258, 259, 260, 261, 262, 263, 264, 265, 266, 0, 268, 269, 0, 0, 270, 271, 36, 0, 0, 37, 38, 0, 0, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 115, 116, 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 238, 69, 0, 70, 0, 71, 355, 2, 3, 4, 5, 0, 6, 7, 0, 0, 8, 9, 10, 169, 12, 13, 14, 15, 16, 0, 17, 18, 0, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, 0, 30, 31, 0, 32, 33, 34, 35, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 39, 40, 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 5, 0, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 0, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, 0, 30, 31, 0, 32, 33, 34, 35, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 5, 0, 6, 7, 0, 0, 8, 9, 10, 0, 12, 13, 14, 15, 16, 0, 17, 18, 0, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, 0, 30, 31, 0, 32, 33, 34, 35, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 5, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 16, 0, 17, 18, 0, 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, 0, 30, 31, 0, 32, 33, 34, 35, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 17, 18, 0, 19, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 28, 0, 0, 0, 29, 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 508, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 17, 18, 0, 19, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 28, 0, 0, 0, 29, 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 28, 0, 0, 0, 29, 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 12, 13, 14, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 0, 0, 0, 0, 29, 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 0, 0, 14, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 0, 0, 14, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 0, 0, 14, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 8, 9, 0, 0, 0, 0, 14, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, -72, 259, 260, 261, 262, 263, 264, 265, 266, 0, 268, 269, 0, 0, 270, 271, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 130, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 162, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 118, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 2, 3, 4, 114, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 25, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 69, 0, 70, 0, 71, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, 442, 0, 238, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 478, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 503, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 579, 0, 0, 238, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 357, 238, 270, 271, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 238, 270, 271, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 576, 0, 270, 271, 0, 238, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 354, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 238, 0, 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271, 0, 0, 0, 0, 0, 0, 0, 0, -72, -72, -72, -72, -72, -72, -72, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 0, 0, 270, 271 }; static const yytype_int16 yycheck[] = { 19, 37, 138, 137, 23, 29, 137, 22, 155, 142, 36, 30, 75, 130, 147, 10, 11, 220, 37, 6, 57, 144, 57, 7, 7, 228, 7, 144, 6, 60, 201, 59, 458, 60, 70, 8, 9, 98, 133, 7, 135, 7, 105, 138, 7, 57, 7, 135, 57, 98, 138, 70, 71, 57, 87, 133, 7, 27, 28, 98, 98, 98, 42, 98, 57, 57, 57, 57, 77, 95, 96, 97, 98, 99, 100, 136, 279, 103, 201, 57, 57, 7, 98, 6, 201, 511, 98, 136, 514, 98, 109, 110, 98, 112, 98, 57, 115, 116, 117, 132, 271, 125, 126, 7, 167, 98, 98, 98, 98, 140, 138, 138, 57, 6, 129, 6, 542, 101, 8, 143, 101, 98, 137, 91, 92, 93, 94, 136, 96, 97, 301, 97, 100, 101, 100, 101, 97, 100, 101, 100, 101, 57, 161, 138, 136, 276, 98, 134, 271, 100, 101, 577, 134, 98, 271, 41, 134, 57, 41, 292, 86, 87, 88, 89, 90, 91, 92, 93, 94, 302, 96, 97, 57, 101, 100, 101, 57, 6, 301, 39, 40, 136, 98, 43, 301, 0, 133, 91, 92, 93, 94, 139, 96, 97, 136, 214, 100, 101, 98, 218, 403, 136, 136, 136, 41, 224, 101, 139, 59, 138, 229, 135, 77, 98, 7, 234, 57, 98, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 235, 286, 39, 40, 319, 98, 6, 462, 293, 276, 281, 466, 59, 284, 138, 291, 57, 137, 303, 57, 138, 57, 57, 41, 57, 41, 314, 298, 299, 77, 59, 138, 6, 77, 139, 306, 140, 136, 140, 101, 318, 86, 87, 88, 89, 90, 91, 92, 93, 94, 321, 96, 97, 137, 136, 100, 101, 98, 443, 101, 98, 59, 98, 98, 450, 98, 137, 450, 20, 468, 138, 137, 41, 25, 98, 77, 6, 80, 30, 59, 32, 352, 34, 354, 77, 77, 357, 138, 359, 56, 80, 8, 44, 45, 477, 138, 48, 136, 50, 6, 0, 135, 80, 100, 136, 6, 494, 137, 491, 7, 10, 56, 140, 8, 6, 167, 10, 541, 477, 491, 13, 229, 22, 399, 400, 352, 235, 317, 518, 29, 224, 518, 450, -1, -1, -1, 407, -1, -1, 39, 40, -1, 409, -1, -1, -1, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, -1, -1, 452, -1, -1, -1, -1, 457, -1, -1, 75, -1, -1, -1, 467, -1, 79, -1, 450, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 471, -1, 100, 101, -1, 105, -1, -1, 479, -1, 477, -1, 483, -1, -1, 486, -1, 502, -1, -1, -1, -1, -1, -1, 491, 125, 126, -1, -1, 129, -1, -1, -1, -1, 505, -1, 507, 137, 138, -1, -1, 512, -1, 143, -1, 516, -1, -1, -1, 520, 521, -1, -1, -1, -1, -1, -1, -1, -1, 530, -1, 532, -1, -1, -1, 536, -1, 167, -1, 557, -1, -1, 543, 544, 559, -1, 547, -1, -1, -1, -1, -1, -1, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, -1, -1, 575, 576, -1, -1, -1, -1, -1, -1, 583, -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, 54, -1, 18, 57, 58, 276, 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, 291, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, 99, -1, -1, 319, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, -1, -1, -1, 140, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, 129, 130, 7, 132, -1, 134, -1, 136, -1, -1, -1, -1, -1, -1, -1, 399, 400, 3, 4, 5, 6, -1, 8, 9, -1, 409, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 450, -1, 54, -1, -1, 57, 58, -1, -1, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 477, -1, 100, 101, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, 491, -1, -1, 494, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, -1, 0, 1, 140, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, -1, 25, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, 42, -1, 44, 45, -1, 47, 48, 49, 50, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, 1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, 38, -1, -1, -1, 42, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 7, 132, -1, 134, -1, 136, 137, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 79, 35, -1, 37, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, 54, 100, 101, 57, 58, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 87, 88, 100, 101, -1, -1, -1, 7, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 7, 132, -1, 134, -1, 136, 137, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, 96, 97, -1, -1, 100, 101, 54, -1, -1, 57, 58, -1, -1, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 87, 88, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 7, 132, -1, 134, -1, 136, 137, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, -1, 25, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, 42, -1, 44, 45, -1, 47, 48, 49, 50, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 87, 88, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, -1, 25, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, 42, -1, 44, 45, -1, 47, 48, 49, 50, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, 14, -1, 16, 17, 18, 19, 20, -1, 22, 23, -1, 25, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, 42, -1, 44, 45, -1, 47, 48, 49, 50, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, 20, -1, 22, 23, -1, 25, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, 42, -1, 44, 45, -1, 47, 48, 49, 50, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, -1, -1, 22, 23, -1, 25, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, 38, -1, -1, -1, 42, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, 135, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, -1, -1, 22, 23, -1, 25, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, 38, -1, -1, -1, 42, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, 38, -1, -1, -1, 42, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, -1, -1, -1, -1, 42, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, -1, -1, 18, 19, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, -1, -1, 18, 19, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, -1, -1, 18, 19, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, 12, 13, -1, -1, -1, -1, 18, 19, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, 35, 36, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, 96, 97, -1, -1, 100, 101, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, 101, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, 135, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 3, 4, 5, 6, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 57, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 134, -1, 136, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, -1, 132, -1, 7, -1, -1, -1, -1, -1, -1, 140, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, -1, 140, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, 137, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, 137, -1, -1, 7, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 56, 7, 100, 101, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, 7, 100, 101, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 56, -1, 100, 101, -1, 7, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 7, -1, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, 100, 101 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 1, 3, 4, 5, 6, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 30, 31, 32, 33, 34, 35, 36, 37, 38, 42, 44, 45, 47, 48, 49, 50, 54, 57, 58, 87, 88, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 132, 134, 136, 142, 143, 144, 145, 147, 148, 150, 151, 156, 157, 158, 159, 160, 161, 162, 169, 172, 173, 175, 181, 183, 184, 185, 188, 189, 197, 198, 201, 202, 204, 205, 206, 209, 133, 98, 98, 98, 57, 77, 98, 136, 187, 6, 87, 88, 99, 121, 180, 182, 183, 186, 148, 42, 174, 174, 98, 6, 57, 101, 182, 6, 172, 182, 8, 98, 134, 41, 47, 175, 182, 6, 41, 101, 213, 215, 6, 98, 187, 59, 179, 180, 182, 60, 140, 179, 199, 200, 181, 181, 136, 135, 179, 182, 182, 0, 133, 146, 15, 147, 20, 25, 30, 32, 34, 44, 45, 48, 50, 149, 213, 139, 7, 79, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 100, 101, 98, 187, 98, 187, 98, 187, 98, 187, 98, 187, 98, 187, 136, 98, 187, 147, 86, 176, 177, 178, 182, 182, 136, 137, 182, 207, 208, 57, 98, 182, 182, 182, 136, 10, 11, 138, 7, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 100, 101, 47, 175, 47, 175, 136, 164, 170, 171, 172, 185, 213, 139, 51, 157, 169, 172, 210, 212, 173, 41, 98, 164, 175, 184, 185, 214, 39, 40, 43, 101, 98, 164, 98, 59, 138, 167, 140, 140, 200, 60, 138, 60, 140, 182, 135, 140, 137, 145, 147, 77, 6, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 214, 98, 98, 98, 98, 98, 98, 182, 98, 182, 59, 138, 167, 86, 137, 207, 56, 137, 138, 167, 176, 182, 186, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 214, 41, 41, 1, 165, 166, 168, 169, 172, 77, 59, 138, 167, 182, 77, 6, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 132, 216, 182, 213, 139, 133, 135, 138, 211, 175, 164, 213, 182, 182, 214, 164, 213, 6, 190, 191, 192, 193, 194, 195, 196, 140, 140, 60, 179, 138, 190, 98, 187, 147, 182, 136, 137, 138, 178, 137, 182, 136, 182, 59, 138, 175, 175, 137, 137, 138, 167, 182, 41, 172, 6, 57, 134, 152, 153, 98, 164, 29, 203, 77, 6, 80, 135, 157, 212, 213, 77, 163, 213, 163, 77, 59, 138, 167, 56, 80, 138, 167, 200, 182, 135, 98, 165, 182, 136, 182, 56, 182, 168, 173, 136, 8, 154, 6, 155, 100, 213, 27, 28, 182, 182, 80, 163, 182, 163, 182, 193, 194, 182, 182, 6, 140, 137, 137, 137, 182, 137, 182, 137, 182, 59, 138, 135, 138, 153, 163, 182, 182, 182, 56, 56, 213, 137, 137, 8, 6, 29, 51, 182, 182, 163, 182 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 141, 142, 143, 143, 144, 144, 144, 144, 144, 144, 145, 145, 146, 146, 147, 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 150, 151, 151, 151, 151, 151, 152, 152, 153, 153, 154, 154, 154, 155, 155, 155, 156, 157, 157, 158, 158, 158, 159, 160, 160, 160, 160, 161, 161, 162, 162, 163, 163, 164, 164, 164, 165, 165, 166, 166, 167, 167, 168, 168, 169, 170, 171, 171, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, 176, 177, 177, 178, 178, 178, 178, 179, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 190, 191, 192, 192, 192, 192, 192, 192, 193, 193, 194, 195, 196, 196, 197, 197, 198, 198, 198, 198, 199, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 206, 206, 206, 206, 206, 206, 206, 207, 208, 208, 208, 208, 209, 209, 210, 210, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 0, 2, 1, 2, 3, 4, 2, 3, 1, 2, 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 4, 3, 5, 7, 1, 3, 3, 4, 0, 1, 3, 0, 1, 3, 3, 2, 4, 3, 4, 4, 2, 5, 5, 6, 6, 7, 8, 3, 5, 0, 2, 0, 3, 3, 0, 2, 1, 3, 0, 1, 1, 1, 3, 2, 1, 3, 1, 6, 3, 1, 2, 3, 3, 3, 4, 5, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 2, 2, 2, 1, 3, 1, 3, 3, 3, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 3, 4, 4, 5, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 1, 2, 2, 3, 1, 2, 2, 3, 3, 4, 2, 3, 5, 1, 2, 1, 1, 3, 3, 3, 5, 3, 5, 3, 2, 1, 3, 2, 3, 2, 3, 4, 3, 2, 3, 5, 1, 3, 5, 5, 8, 0, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 4, 3, 4, 1, 4, 7, 5, 8, 2, 1, 3, 3, 5, 6, 7, 1, 1, 3, 3, 1, 1, 2, 4, 0, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (&yylloc, parm, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (N) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (0) #endif #define YYRHSLOC(Rhs, K) ((Rhs)[K]) /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ # ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ YY_ATTRIBUTE_UNUSED static int yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) { int res = 0; int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; if (0 <= yylocp->first_line) { res += YYFPRINTF (yyo, "%d", yylocp->first_line); if (0 <= yylocp->first_column) res += YYFPRINTF (yyo, ".%d", yylocp->first_column); } if (0 <= yylocp->last_line) { if (yylocp->first_line < yylocp->last_line) { res += YYFPRINTF (yyo, "-%d", yylocp->last_line); if (0 <= end_col) res += YYFPRINTF (yyo, ".%d", end_col); } else if (0 <= end_col && yylocp->first_column < end_col) res += YYFPRINTF (yyo, "-%d", end_col); } return res; } # define YY_LOCATION_PRINT(File, Loc) \ yy_location_print_ (File, &(Loc)) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif # endif /* !defined YY_LOCATION_PRINT */ # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value, Location, parm); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, void *parm) { FILE *yyoutput = yyo; YYUSE (yyoutput); YYUSE (yylocationp); YYUSE (parm); if (!yyvaluep) return; # ifdef YYPRINT if (yykind < YYNTOKENS) YYPRINT (yyo, yytoknum[yykind], *yyvaluep); # endif YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, void *parm) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); YY_LOCATION_PRINT (yyo, *yylocationp); YYFPRINTF (yyo, ": "); yy_symbol_value_print (yyo, yykind, yyvaluep, yylocationp, parm); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, void *parm) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)], &(yylsp[(yyi + 1) - (yynrhs)]), parm); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, yylsp, Rule, parm); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /* Context of a parse error. */ typedef struct { yy_state_t *yyssp; yysymbol_kind_t yytoken; YYLTYPE *yylloc; } yypcontext_t; /* Put in YYARG at most YYARGN of the expected tokens given the current YYCTX, and return the number of tokens stored in YYARG. If YYARG is null, return the number of expected tokens (guaranteed to be less than YYNTOKENS). Return YYENOMEM on memory exhaustion. Return 0 if there are more than YYARGN expected tokens, yet fill YYARG up to YYARGN. */ static int yypcontext_expected_tokens (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; int yyn = yypact[+*yyctx->yyssp]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror && !yytable_value_is_error (yytable[yyx + yyn])) { if (!yyarg) ++yycount; else if (yycount == yyargn) return 0; else yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx); } } if (yyarg && yycount == 0 && 0 < yyargn) yyarg[0] = YYSYMBOL_YYEMPTY; return yycount; } #ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) # else /* Return the length of YYSTR. */ static YYPTRDIFF_T yystrlen (const char *yystr) { YYPTRDIFF_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif #endif #ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif #endif #ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYPTRDIFF_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYPTRDIFF_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; else goto append; append: default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (yyres) return yystpcpy (yyres, yystr) - yyres; else return yystrlen (yystr); } #endif static int yy_syntax_error_arguments (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yyctx->yytoken != YYSYMBOL_YYEMPTY) { int yyn; if (yyarg) yyarg[yycount] = yyctx->yytoken; ++yycount; yyn = yypcontext_expected_tokens (yyctx, yyarg ? yyarg + 1 : yyarg, yyargn - 1); if (yyn == YYENOMEM) return YYENOMEM; else yycount += yyn; } return yycount; } /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the required number of bytes is too large to store. */ static int yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, const yypcontext_t *yyctx) { enum { YYARGS_MAX = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat: reported tokens (one for the "unexpected", one per "expected"). */ yysymbol_kind_t yyarg[YYARGS_MAX]; /* Cumulated lengths of YYARG. */ YYPTRDIFF_T yysize = 0; /* Actual size of YYARG. */ int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX); if (yycount == YYENOMEM) return YYENOMEM; switch (yycount) { #define YYCASE_(N, S) \ case N: \ yyformat = S; \ break default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); #undef YYCASE_ } /* Compute error message size. Don't count the "%s"s, but reserve room for the terminator. */ yysize = yystrlen (yyformat) - 2 * yycount + 1; { int yyi; for (yyi = 0; yyi < yycount; ++yyi) { YYPTRDIFF_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]); if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) yysize = yysize1; else return YYENOMEM; } } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return -1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]); yyformat += 2; } else { ++yyp; ++yyformat; } } return 0; } /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, void *parm) { YYUSE (yyvaluep); YYUSE (yylocationp); YYUSE (parm); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*----------. | yyparse. | `----------*/ int yyparse (void *parm) { /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ YY_INITIAL_VALUE (static YYSTYPE yyval_default;) YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Location data for the lookahead symbol. */ static YYLTYPE yyloc_default # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL = { 1, 1, 1, 1 } # endif ; YYLTYPE yylloc = yyloc_default; /* Number of syntax errors so far. */ int yynerrs; yy_state_fast_t yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: 'yyss': related to states. 'yyvs': related to semantic values. 'yyls': related to locations. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize; /* The state stack. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss; yy_state_t *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; /* The location stack. */ YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls; YYLTYPE *yylsp; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead token as an internal (translated) token number. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; YYLTYPE yyloc; /* The locations where the error started and ended. */ YYLTYPE yyerror_range[3]; /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yynerrs = 0; yystate = 0; yyerrstatus = 0; yystacksize = YYINITDEPTH; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yylsp = yyls = yylsa; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ /* User initialization code. */ { GCLock lock; yylloc.filename(ASTString(static_cast(parm)->filename)); } yylsp[0] = yylloc; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE goto yyexhaustedlab; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; YYLTYPE *yyls1 = yyls; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yyls1, yysize * YYSIZEOF (*yylsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; yyls = yyls1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); YYSTACK_RELOCATE (yyls_alloc, yyls); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; yylsp = yyls + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (&yylval, &yylloc, SCANNER); } if (yychar <= END) { yychar = END; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; yyerror_range[1] = yylloc; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END *++yylsp = yylloc; /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; /* Default location. */ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); yyerror_range[1] = yyloc; YY_REDUCE_PRINT (yyn); switch (yyn) { case 5: { ParserState* pp = static_cast(parm); if ((yyvsp[0].item)) { pp->model->addItem((yyvsp[0].item)); GC::unlock(); GC::lock(); } } break; case 6: { ParserState* pp = static_cast(parm); if ((yyvsp[0].item)) { pp->model->addItem((yyvsp[0].item)); GC::unlock(); GC::lock(); } } break; case 7: { ParserState* pp = static_cast(parm); if ((yyvsp[0].item)) { pp->model->addItem((yyvsp[0].item)); GC::unlock(); GC::lock(); } } break; case 8: { ParserState* pp = static_cast(parm); if ((yyvsp[0].item)) { pp->model->addItem((yyvsp[0].item)); GC::unlock(); GC::lock(); } } break; case 9: { yyerror(&(yylsp[0]), parm, "unexpected item, expecting ';' or end of file"); YYERROR; } break; case 11: { ParserState* pp = static_cast(parm); if (pp->parseDocComments && (yyvsp[0].sValue)) { pp->model->addDocComment((yyvsp[0].sValue)); } free((yyvsp[0].sValue)); } break; case 12: { ParserState* pp = static_cast(parm); if (pp->parseDocComments && (yyvsp[0].sValue)) { pp->model->addDocComment((yyvsp[0].sValue)); } free((yyvsp[0].sValue)); } break; case 15: { (yyval.item) = (yyvsp[0].item); ParserState* pp = static_cast(parm); if (FunctionI* fi = Item::dynamicCast((yyval.item))) { if (pp->parseDocComments) { fi->ann().add(createDocComment((yylsp[-1]),(yyvsp[-1].sValue))); } } else if (VarDeclI* vdi = Item::dynamicCast((yyval.item))) { if (pp->parseDocComments) { vdi->e()->addAnnotation(createDocComment((yylsp[-1]),(yyvsp[-1].sValue))); } } else { yyerror(&(yylsp[0]), parm, "documentation comments are only supported for function, predicate and variable declarations"); } free((yyvsp[-1].sValue)); } break; case 16: { (yyval.item) = (yyvsp[0].item); } break; case 17: { (yyval.item)=notInDatafile(&(yyloc),parm,"include") ? (yyvsp[0].item) : nullptr; } break; case 18: { (yyval.item)=notInDatafile(&(yyloc),parm,"variable declaration") ? (yyvsp[0].item) : nullptr; } break; case 20: { (yyval.item)=notInDatafile(&(yyloc),parm,"constraint") ? (yyvsp[0].item) : nullptr; } break; case 21: { (yyval.item)=notInDatafile(&(yyloc),parm,"solve") ? (yyvsp[0].item) : nullptr; } break; case 22: { (yyval.item)=notInDatafile(&(yyloc),parm,"output") ? (yyvsp[0].item) : nullptr; } break; case 23: { (yyval.item)=notInDatafile(&(yyloc),parm,"predicate") ? (yyvsp[0].item) : nullptr; } break; case 24: { (yyval.item)=notInDatafile(&(yyloc),parm,"predicate") ? (yyvsp[0].item) : nullptr; } break; case 25: { (yyval.item)=notInDatafile(&(yyloc),parm,"annotation") ? (yyvsp[0].item) : nullptr; } break; case 35: { ParserState* pp = static_cast(parm); map::iterator ret = pp->seenModels.find((yyvsp[0].sValue)); IncludeI* ii = new IncludeI((yyloc),ASTString((yyvsp[0].sValue))); (yyval.item) = ii; if (ret == pp->seenModels.end()) { Model* im = new Model; im->setParent(pp->model); im->setFilename((yyvsp[0].sValue)); string fpath = FileUtils::dir_name(pp->filename); string fbase = FileUtils::base_name(pp->filename); if (fpath=="") fpath="./"; pp->files.emplace_back(im, ii, fpath, (yyvsp[0].sValue), pp->isSTDLib); ii->m(im); pp->seenModels.insert(pair((yyvsp[0].sValue),im)); } else { ii->m(ret->second, false); } free((yyvsp[0].sValue)); } break; case 36: { if ((yyvsp[-1].vardeclexpr) && (yyvsp[0].expressions1d)) (yyvsp[-1].vardeclexpr)->addAnnotations(*(yyvsp[0].expressions1d)); if ((yyvsp[-1].vardeclexpr)) (yyval.item) = new VarDeclI((yyloc),(yyvsp[-1].vardeclexpr)); delete (yyvsp[0].expressions1d); } break; case 37: { if ((yyvsp[-3].vardeclexpr)) (yyvsp[-3].vardeclexpr)->e((yyvsp[0].expression)); if ((yyvsp[-3].vardeclexpr) && (yyvsp[-2].expressions1d)) (yyvsp[-3].vardeclexpr)->addAnnotations(*(yyvsp[-2].expressions1d)); if ((yyvsp[-3].vardeclexpr)) (yyval.item) = new VarDeclI((yyloc),(yyvsp[-3].vardeclexpr)); delete (yyvsp[-2].expressions1d); } break; case 38: { TypeInst* ti = new TypeInst((yyloc),Type::parsetint()); ti->setIsEnum(true); VarDecl* vd = new VarDecl((yyloc),ti,(yyvsp[-1].sValue)); if ((yyvsp[-1].sValue) && (yyvsp[0].expressions1d)) vd->addAnnotations(*(yyvsp[0].expressions1d)); free((yyvsp[-1].sValue)); (yyval.item) = new VarDeclI((yyloc),vd); } break; case 39: { if ((yyvsp[0].expressions1d)) { TypeInst* ti = new TypeInst((yyloc),Type::parsetint()); ti->setIsEnum(true); Expression* e; if ((yyvsp[0].expressions1d)->size()==1) { e = (*(yyvsp[0].expressions1d))[0]; } else { ArrayLit* al = new ArrayLit((yyloc),*(yyvsp[0].expressions1d)); e = new Call((yyloc), ASTString("enumFromConstructors"), {al}); } VarDecl* vd = new VarDecl((yyloc),ti,(yyvsp[-3].sValue),e); (yyval.item) = new VarDeclI((yyloc),vd); } free((yyvsp[-3].sValue)); delete (yyvsp[0].expressions1d); } break; case 40: { TypeInst* ti = new TypeInst((yyloc),Type::parsetint()); ti->setIsEnum(true); vector args; args.push_back(new ArrayLit((yyloc),*(yyvsp[-1].expressions1d))); Call* sl = new Call((yyloc), constants().ids.anonEnumFromStrings, args); VarDecl* vd = new VarDecl((yyloc),ti,(yyvsp[-5].sValue),sl); if ((yyvsp[-5].sValue) && (yyvsp[-4].expressions1d)) vd->addAnnotations(*(yyvsp[-4].expressions1d)); free((yyvsp[-5].sValue)); delete (yyvsp[-1].expressions1d); (yyval.item) = new VarDeclI((yyloc),vd); } break; case 41: { (yyval.expressions1d) = new std::vector({(yyvsp[0].expression)}); } break; case 42: { (yyval.expressions1d) = (yyvsp[-2].expressions1d); if ((yyval.expressions1d)) { (yyval.expressions1d)->push_back((yyvsp[0].expression)); } } break; case 43: { (yyval.expression) = new SetLit((yyloc), *(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } break; case 44: { vector args({(yyvsp[-1].expression)}); (yyval.expression) = new Call((yyloc), ASTString((yyvsp[-3].sValue)), args); free((yyvsp[-3].sValue)); } break; case 45: { (yyval.expressions1d) = new std::vector(); } break; case 46: { (yyval.expressions1d) = new std::vector(); (yyval.expressions1d)->push_back(new StringLit((yyloc), (yyvsp[0].sValue))); free((yyvsp[0].sValue)); } break; case 47: { (yyval.expressions1d) = (yyvsp[-2].expressions1d); if ((yyval.expressions1d)) (yyval.expressions1d)->push_back(new StringLit((yyloc), (yyvsp[0].sValue))); free((yyvsp[0].sValue)); } break; case 48: { (yyval.expressions1d) = new std::vector(); } break; case 49: { (yyval.expressions1d) = new std::vector(); (yyval.expressions1d)->push_back(new Id((yyloc),(yyvsp[0].sValue),nullptr)); free((yyvsp[0].sValue)); } break; case 50: { (yyval.expressions1d) = (yyvsp[-2].expressions1d); if ((yyval.expressions1d)) (yyval.expressions1d)->push_back(new Id((yyloc),(yyvsp[0].sValue),nullptr)); free((yyvsp[0].sValue)); } break; case 51: { (yyval.item) = new AssignI((yyloc),(yyvsp[-2].sValue),(yyvsp[0].expression)); free((yyvsp[-2].sValue)); } break; case 52: { (yyval.item) = new ConstraintI((yyloc),(yyvsp[0].expression));} break; case 53: { (yyval.item) = new ConstraintI((yyloc),(yyvsp[0].expression)); if ((yyvsp[0].expression) && (yyvsp[-1].expression)) (yyval.item)->cast()->e()->ann().add(new Call((yylsp[-2]), ASTString("mzn_constraint_name"), {(yyvsp[-1].expression)})); } break; case 54: { (yyval.item) = SolveI::sat((yyloc)); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } break; case 55: { (yyval.item) = SolveI::min((yyloc),(yyvsp[0].expression)); if ((yyval.item) && (yyvsp[-2].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-2].expressions1d)); delete (yyvsp[-2].expressions1d); } break; case 56: { (yyval.item) = SolveI::max((yyloc),(yyvsp[0].expression)); if ((yyval.item) && (yyvsp[-2].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-2].expressions1d)); delete (yyvsp[-2].expressions1d); } break; case 57: { (yyval.item) = new OutputI((yyloc),(yyvsp[0].expression));} break; case 58: { ParserState* pp = static_cast(parm); if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),(yyvsp[-3].sValue),new TypeInst((yyloc), Type::varbool()),*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression),pp->isSTDLib); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-3].sValue)); delete (yyvsp[-2].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 59: { ParserState* pp = static_cast(parm); if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),(yyvsp[-3].sValue),new TypeInst((yyloc), Type::parbool()),*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression),pp->isSTDLib); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-3].sValue)); delete (yyvsp[-2].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 60: { if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),std::string((yyvsp[-4].sValue))+"⁻¹",new TypeInst((yyloc), Type::varbool()),*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression)); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-4].sValue)); delete (yyvsp[-2].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 61: { if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),std::string((yyvsp[-4].sValue))+"⁻¹",new TypeInst((yyloc), Type::parbool()),*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression)); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-4].sValue)); delete (yyvsp[-2].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 62: { ParserState* pp = static_cast(parm); if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),(yyvsp[-3].sValue),(yyvsp[-5].tiexpr),*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression),pp->isSTDLib); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-3].sValue)); delete (yyvsp[-2].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 63: { ParserState* pp = static_cast(parm); if ((yyvsp[-3].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),(yyvsp[-5].sValue),(yyvsp[-7].tiexpr),*(yyvsp[-3].vardeclexprs),(yyvsp[0].expression),pp->isSTDLib); if ((yyval.item) && (yyvsp[-1].expressions1d)) (yyval.item)->cast()->ann().add(*(yyvsp[-1].expressions1d)); free((yyvsp[-5].sValue)); delete (yyvsp[-3].vardeclexprs); delete (yyvsp[-1].expressions1d); } break; case 64: { ParserState* pp = static_cast(parm); TypeInst* ti=new TypeInst((yylsp[-2]),Type::ann()); if ((yyvsp[0].vardeclexprs)==nullptr || (yyvsp[0].vardeclexprs)->empty()) { VarDecl* vd = new VarDecl((yyloc),ti,(yyvsp[-1].sValue)); (yyval.item) = new VarDeclI((yyloc),vd); } else { (yyval.item) = new FunctionI((yyloc),(yyvsp[-1].sValue),ti,*(yyvsp[0].vardeclexprs),nullptr,pp->isSTDLib); } free((yyvsp[-1].sValue)); delete (yyvsp[0].vardeclexprs); } break; case 65: { ParserState* pp = static_cast(parm); TypeInst* ti=new TypeInst((yylsp[-4]),Type::ann()); if ((yyvsp[-2].vardeclexprs)) (yyval.item) = new FunctionI((yyloc),(yyvsp[-3].sValue),ti,*(yyvsp[-2].vardeclexprs),(yyvsp[0].expression),pp->isSTDLib); delete (yyvsp[-2].vardeclexprs); } break; case 66: { (yyval.expression)=nullptr; } break; case 67: { (yyval.expression)=(yyvsp[0].expression); } break; case 68: { (yyval.vardeclexprs)=new vector(); } break; case 69: { (yyval.vardeclexprs)=(yyvsp[-1].vardeclexprs); } break; case 70: { (yyval.vardeclexprs)=new vector(); } break; case 71: { (yyval.vardeclexprs)=new vector(); } break; case 72: { (yyval.vardeclexprs)=(yyvsp[-1].vardeclexprs); } break; case 73: { (yyval.vardeclexprs)=new vector(); if ((yyvsp[0].vardeclexpr)) (yyvsp[0].vardeclexpr)->toplevel(false); if ((yyvsp[0].vardeclexpr)) (yyval.vardeclexprs)->push_back((yyvsp[0].vardeclexpr)); } break; case 74: { (yyval.vardeclexprs)=(yyvsp[-2].vardeclexprs); if ((yyvsp[0].vardeclexpr)) (yyvsp[0].vardeclexpr)->toplevel(false); if ((yyvsp[-2].vardeclexprs) && (yyvsp[0].vardeclexpr)) (yyvsp[-2].vardeclexprs)->push_back((yyvsp[0].vardeclexpr)); } break; case 77: { (yyval.vardeclexpr)=(yyvsp[0].vardeclexpr); } break; case 78: { if ((yyvsp[0].tiexpr)) (yyval.vardeclexpr)=new VarDecl((yyloc), (yyvsp[0].tiexpr), ""); } break; case 79: { if ((yyvsp[-2].tiexpr) && (yyvsp[0].sValue)) { Id* ident = new Id((yylsp[0]), (yyvsp[0].sValue), nullptr); (yyval.vardeclexpr) = new VarDecl((yyloc), (yyvsp[-2].tiexpr), ident); } free((yyvsp[0].sValue)); } break; case 80: { (yyval.tiexprs)=(yyvsp[-1].tiexprs); } break; case 81: { (yyval.tiexprs)=new vector(); (yyval.tiexprs)->push_back((yyvsp[0].tiexpr)); } break; case 82: { (yyval.tiexprs)=(yyvsp[-2].tiexprs); if ((yyvsp[-2].tiexprs) && (yyvsp[0].tiexpr)) (yyvsp[-2].tiexprs)->push_back((yyvsp[0].tiexpr)); } break; case 84: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr) && (yyvsp[-3].tiexprs)) (yyval.tiexpr)->setRanges(*(yyvsp[-3].tiexprs)); delete (yyvsp[-3].tiexprs); } break; case 85: { (yyval.tiexpr) = (yyvsp[0].tiexpr); std::vector ti(1); ti[0] = new TypeInst((yyloc),Type::parint()); if ((yyval.tiexpr)) (yyval.tiexpr)->setRanges(ti); } break; case 86: { (yyval.tiexpr) = (yyvsp[0].tiexpr); } break; case 87: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 88: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr) && (yyvsp[-1].bValue)) { Type tt = (yyval.tiexpr)->type(); tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 89: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.ti(Type::TI_VAR); if ((yyvsp[-1].bValue)) tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 90: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.st(Type::ST_SET); (yyval.tiexpr)->type(tt); } } break; case 91: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.st(Type::ST_SET); tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 92: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.st(Type::ST_SET); if ((yyvsp[-3].bValue)) tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 93: { (yyval.tiexpr) = (yyvsp[0].tiexpr); if ((yyval.tiexpr)) { Type tt = (yyval.tiexpr)->type(); tt.ti(Type::TI_VAR); tt.st(Type::ST_SET); if ((yyvsp[-3].bValue)) tt.ot(Type::OT_OPTIONAL); (yyval.tiexpr)->type(tt); } } break; case 94: { (yyval.bValue) = false; } break; case 95: { (yyval.bValue) = true; } break; case 96: { (yyval.tiexpr) = new TypeInst((yyloc),Type::parint()); } break; case 97: { (yyval.tiexpr) = new TypeInst((yyloc),Type::parbool()); } break; case 98: { (yyval.tiexpr) = new TypeInst((yyloc),Type::parfloat()); } break; case 99: { (yyval.tiexpr) = new TypeInst((yyloc),Type::parstring()); } break; case 100: { (yyval.tiexpr) = new TypeInst((yyloc),Type::ann()); } break; case 101: { if ((yyvsp[0].expression)) (yyval.tiexpr) = new TypeInst((yyloc),Type(),(yyvsp[0].expression)); } break; case 102: { (yyval.tiexpr) = new TypeInst((yyloc),Type::top(), new TIId((yyloc), (yyvsp[0].sValue))); free((yyvsp[0].sValue)); } break; case 103: { (yyval.tiexpr) = new TypeInst((yyloc),Type::parint(), new TIId((yyloc), (yyvsp[0].sValue))); free((yyvsp[0].sValue)); } break; case 105: { (yyval.expressions1d)=new std::vector; (yyval.expressions1d)->push_back((yyvsp[0].expression)); } break; case 106: { (yyval.expressions1d)=(yyvsp[-2].expressions1d); if ((yyval.expressions1d) && (yyvsp[0].expression)) (yyval.expressions1d)->push_back((yyvsp[0].expression)); } break; case 107: { (yyval.expression) = (yyvsp[0].expression); } break; case 108: { (yyval.expression)=new SetLit((yyloc), IntSetVal::a(-IntVal::infinity(),IntVal::infinity())); } break; case 109: { if ((yyvsp[0].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[0].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a(-IntVal::infinity(),(yyvsp[0].expression)->cast()->v())); } else { (yyval.expression)=new BinOp((yyloc), IntLit::a(-IntVal::infinity()), BOT_DOTDOT, (yyvsp[0].expression)); } } break; case 110: { if ((yyvsp[-1].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[-1].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a((yyvsp[-1].expression)->cast()->v(),IntVal::infinity())); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-1].expression), BOT_DOTDOT, IntLit::a(IntVal::infinity())); } } break; case 112: { (yyval.expressions1d)=new std::vector; (yyval.expressions1d)->push_back((yyvsp[0].expression)); } break; case 113: { (yyval.expressions1d)=(yyvsp[-2].expressions1d); if ((yyval.expressions1d) && (yyvsp[0].expression)) (yyval.expressions1d)->push_back((yyvsp[0].expression)); } break; case 115: { if ((yyvsp[-2].expression) && (yyvsp[0].expression)) (yyvsp[-2].expression)->addAnnotation((yyvsp[0].expression)); (yyval.expression)=(yyvsp[-2].expression); } break; case 116: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_UNION, (yyvsp[0].expression)); } break; case 117: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DIFF, (yyvsp[0].expression)); } break; case 118: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_SYMDIFF, (yyvsp[0].expression)); } break; case 119: { if ((yyvsp[-2].expression)==nullptr || (yyvsp[0].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[-2].expression)->isa() && (yyvsp[0].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a((yyvsp[-2].expression)->cast()->v(),(yyvsp[0].expression)->cast()->v())); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DOTDOT, (yyvsp[0].expression)); } } break; case 120: { if ((yyvsp[-3].expression)==nullptr || (yyvsp[-1].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[-3].expression)->isa() && (yyvsp[-1].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a((yyvsp[-3].expression)->cast()->v(),(yyvsp[-1].expression)->cast()->v())); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-3].expression), BOT_DOTDOT, (yyvsp[-1].expression)); } } break; case 121: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_INTERSECT, (yyvsp[0].expression)); } break; case 122: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_PLUSPLUS, (yyvsp[0].expression)); } break; case 123: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_PLUS, (yyvsp[0].expression)); } break; case 124: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MINUS, (yyvsp[0].expression)); } break; case 125: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MULT, (yyvsp[0].expression)); } break; case 126: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DIV, (yyvsp[0].expression)); } break; case 127: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_IDIV, (yyvsp[0].expression)); } break; case 128: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MOD, (yyvsp[0].expression)); } break; case 129: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_POW, (yyvsp[0].expression)); } break; case 130: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~+"), args); } break; case 131: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~-"), args); } break; case 132: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~*"), args); } break; case 133: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~="), args); } break; case 134: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), (yyvsp[-1].sValue), args); free((yyvsp[-1].sValue)); } break; case 135: { (yyval.expression)=new UnOp((yyloc), UOT_PLUS, (yyvsp[0].expression)); } break; case 136: { if ((yyvsp[0].expression) && (yyvsp[0].expression)->isa()) { (yyval.expression) = IntLit::a(-(yyvsp[0].expression)->cast()->v()); } else if ((yyvsp[0].expression) && (yyvsp[0].expression)->isa()) { (yyval.expression) = FloatLit::a(-(yyvsp[0].expression)->cast()->v()); } else { (yyval.expression)=new UnOp((yyloc), UOT_MINUS, (yyvsp[0].expression)); } } break; case 138: { if ((yyvsp[-2].expression) && (yyvsp[0].expression)) (yyvsp[-2].expression)->addAnnotation((yyvsp[0].expression)); (yyval.expression)=(yyvsp[-2].expression); } break; case 139: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_EQUIV, (yyvsp[0].expression)); } break; case 140: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_IMPL, (yyvsp[0].expression)); } break; case 141: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_RIMPL, (yyvsp[0].expression)); } break; case 142: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_OR, (yyvsp[0].expression)); } break; case 143: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_XOR, (yyvsp[0].expression)); } break; case 144: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_AND, (yyvsp[0].expression)); } break; case 145: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_LE, (yyvsp[0].expression)); } break; case 146: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_GR, (yyvsp[0].expression)); } break; case 147: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_LQ, (yyvsp[0].expression)); } break; case 148: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_GQ, (yyvsp[0].expression)); } break; case 149: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_EQ, (yyvsp[0].expression)); } break; case 150: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_NQ, (yyvsp[0].expression)); } break; case 151: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_IN, (yyvsp[0].expression)); } break; case 152: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_SUBSET, (yyvsp[0].expression)); } break; case 153: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_SUPERSET, (yyvsp[0].expression)); } break; case 154: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_UNION, (yyvsp[0].expression)); } break; case 155: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DIFF, (yyvsp[0].expression)); } break; case 156: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_SYMDIFF, (yyvsp[0].expression)); } break; case 157: { if ((yyvsp[-2].expression)==nullptr || (yyvsp[0].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[-2].expression)->isa() && (yyvsp[0].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a((yyvsp[-2].expression)->cast()->v(),(yyvsp[0].expression)->cast()->v())); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DOTDOT, (yyvsp[0].expression)); } } break; case 158: { if ((yyvsp[-3].expression)==nullptr || (yyvsp[-1].expression)==nullptr) { (yyval.expression) = nullptr; } else if ((yyvsp[-3].expression)->isa() && (yyvsp[-1].expression)->isa()) { (yyval.expression)=new SetLit((yyloc), IntSetVal::a((yyvsp[-3].expression)->cast()->v(),(yyvsp[-1].expression)->cast()->v())); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-3].expression), BOT_DOTDOT, (yyvsp[-1].expression)); } } break; case 159: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_INTERSECT, (yyvsp[0].expression)); } break; case 160: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_PLUSPLUS, (yyvsp[0].expression)); } break; case 161: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_PLUS, (yyvsp[0].expression)); } break; case 162: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MINUS, (yyvsp[0].expression)); } break; case 163: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MULT, (yyvsp[0].expression)); } break; case 164: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_DIV, (yyvsp[0].expression)); } break; case 165: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_IDIV, (yyvsp[0].expression)); } break; case 166: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_MOD, (yyvsp[0].expression)); } break; case 167: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_POW, (yyvsp[0].expression)); } break; case 168: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~+"), args); } break; case 169: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~-"), args); } break; case 170: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~*"), args); } break; case 171: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), ASTString("~="), args); } break; case 172: { vector args; args.push_back((yyvsp[-2].expression)); args.push_back((yyvsp[0].expression)); (yyval.expression)=new Call((yyloc), (yyvsp[-1].sValue), args); free((yyvsp[-1].sValue)); } break; case 173: { (yyval.expression)=new UnOp((yyloc), UOT_NOT, (yyvsp[0].expression)); } break; case 174: { if (((yyvsp[0].expression) && (yyvsp[0].expression)->isa()) || ((yyvsp[0].expression) && (yyvsp[0].expression)->isa())) { (yyval.expression) = (yyvsp[0].expression); } else { (yyval.expression)=new UnOp((yyloc), UOT_PLUS, (yyvsp[0].expression)); } } break; case 175: { if ((yyvsp[0].expression) && (yyvsp[0].expression)->isa()) { (yyval.expression) = IntLit::a(-(yyvsp[0].expression)->cast()->v()); } else if ((yyvsp[0].expression) && (yyvsp[0].expression)->isa()) { (yyval.expression) = FloatLit::a(-(yyvsp[0].expression)->cast()->v()); } else { (yyval.expression)=new UnOp((yyloc), UOT_MINUS, (yyvsp[0].expression)); } } break; case 176: { (yyval.expression)=(yyvsp[0].expression); } break; case 177: { (yyval.expression)=(yyvsp[0].expression); } break; case 178: { (yyval.expression)=(yyvsp[-1].expression); } break; case 179: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 180: { (yyval.expression)=new BinOp((yyloc), (yyvsp[-2].expression), BOT_POW, IntLit::a(-1)); } break; case 181: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-3].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 182: { (yyval.expression)=new Id((yyloc), (yyvsp[0].sValue), nullptr); free((yyvsp[0].sValue)); } break; case 183: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), new Id((yylsp[-1]),(yyvsp[-1].sValue),nullptr), *(yyvsp[0].expressions2d)); free((yyvsp[-1].sValue)); delete (yyvsp[0].expressions2d); } break; case 184: { (yyval.expression)=new BinOp((yyloc),new Id((yyloc), (yyvsp[-1].sValue), nullptr), BOT_POW, IntLit::a(-1)); free((yyvsp[-1].sValue)); } break; case 185: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), new Id((yylsp[-2]),(yyvsp[-2].sValue),nullptr), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); free((yyvsp[-2].sValue)); delete (yyvsp[-1].expressions2d); } break; case 186: { (yyval.expression)=new AnonVar((yyloc)); } break; case 187: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), new AnonVar((yyloc)), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 188: { (yyval.expression)=new BinOp((yyloc),new AnonVar((yyloc)), BOT_POW, IntLit::a(-1)); } break; case 189: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), new AnonVar((yyloc)), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 190: { (yyval.expression)=constants().boollit(((yyvsp[0].iValue)!=0)); } break; case 191: { (yyval.expression)=new BinOp((yyloc),constants().boollit(((yyvsp[-1].iValue)!=0)), BOT_POW, IntLit::a(-1)); } break; case 192: { (yyval.expression)=IntLit::a((yyvsp[0].iValue)); } break; case 193: { (yyval.expression)=new BinOp((yyloc),IntLit::a((yyvsp[-1].iValue)), BOT_POW, IntLit::a(-1)); } break; case 194: { (yyval.expression)=IntLit::a(IntVal::infinity()); } break; case 195: { (yyval.expression)=new BinOp((yyloc),IntLit::a(IntVal::infinity()), BOT_POW, IntLit::a(-1)); } break; case 196: { (yyval.expression)=FloatLit::a((yyvsp[0].dValue)); } break; case 197: { (yyval.expression)=new BinOp((yyloc),FloatLit::a((yyvsp[-1].dValue)), BOT_POW, IntLit::a(-1)); } break; case 198: { (yyval.expression)=constants().absent; } break; case 199: { (yyval.expression)=constants().absent; } break; case 201: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 202: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 203: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 205: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 206: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 207: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 209: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 210: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 211: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 213: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 214: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 215: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 217: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 218: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 219: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 221: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 222: { (yyval.expression) = new BinOp((yyloc),(yyvsp[-1].expression), BOT_POW, IntLit::a(-1)); } break; case 223: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=new BinOp((yyloc),createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)), BOT_POW, IntLit::a(-1)); delete (yyvsp[-1].expressions2d); } break; case 226: { if ((yyvsp[0].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-1].expression), *(yyvsp[0].expressions2d)); delete (yyvsp[0].expressions2d); } break; case 228: { if ((yyvsp[-1].expressions2d)) (yyval.expression)=createArrayAccess((yyloc), (yyvsp[-2].expression), *(yyvsp[-1].expressions2d)); delete (yyvsp[-1].expressions2d); } break; case 229: { (yyval.expression)=new StringLit((yyloc), (yyvsp[0].sValue)); free((yyvsp[0].sValue)); } break; case 230: { (yyval.expression)=new BinOp((yyloc), new StringLit((yyloc), (yyvsp[-1].sValue)), BOT_PLUSPLUS, (yyvsp[0].expression)); free((yyvsp[-1].sValue)); } break; case 231: { if ((yyvsp[-1].expressions1d)) (yyval.expression)=new BinOp((yyloc), new Call((yyloc), ASTString("format"), *(yyvsp[-1].expressions1d)), BOT_PLUSPLUS, new StringLit((yyloc),(yyvsp[0].sValue))); free((yyvsp[0].sValue)); delete (yyvsp[-1].expressions1d); } break; case 232: { if ((yyvsp[-2].expressions1d)) (yyval.expression)=new BinOp((yyloc), new Call((yyloc), ASTString("format"), *(yyvsp[-2].expressions1d)), BOT_PLUSPLUS, new BinOp((yyloc), new StringLit((yyloc),(yyvsp[-1].sValue)), BOT_PLUSPLUS, (yyvsp[0].expression))); free((yyvsp[-1].sValue)); delete (yyvsp[-2].expressions1d); } break; case 233: { (yyval.expressions2d)=new std::vector >(); if ((yyvsp[-1].expressions1d)) { (yyval.expressions2d)->push_back(*(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } } break; case 234: { (yyval.expressions2d)=(yyvsp[-3].expressions2d); if ((yyval.expressions2d) && (yyvsp[-1].expressions1d)) { (yyval.expressions2d)->push_back(*(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } } break; case 235: { (yyval.expression) = new SetLit((yyloc), std::vector()); } break; case 236: { if ((yyvsp[-1].expressions1d)) (yyval.expression) = new SetLit((yyloc), *(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } break; case 237: { if ((yyvsp[-1].generatorsPointer)) (yyval.expression) = new Comprehension((yyloc), (yyvsp[-3].expression), *(yyvsp[-1].generatorsPointer), true); delete (yyvsp[-1].generatorsPointer); } break; case 238: { if ((yyvsp[0].generators)) (yyval.generatorsPointer)=new Generators; (yyval.generatorsPointer)->g = *(yyvsp[0].generators); delete (yyvsp[0].generators); } break; case 240: { (yyval.generators)=new std::vector; if ((yyvsp[0].generator)) (yyval.generators)->push_back(*(yyvsp[0].generator)); delete (yyvsp[0].generator); } break; case 241: { (yyval.generators)=new std::vector; if ((yyvsp[0].generator)) (yyval.generators)->push_back(*(yyvsp[0].generator)); delete (yyvsp[0].generator); } break; case 242: { (yyval.generators)=new std::vector; if ((yyvsp[-2].generator)) (yyval.generators)->push_back(*(yyvsp[-2].generator)); if ((yyvsp[-2].generator) && (yyvsp[0].expression)) (yyval.generators)->push_back(Generator((yyval.generators)->size(),(yyvsp[0].expression))); delete (yyvsp[-2].generator); } break; case 243: { (yyval.generators)=(yyvsp[-2].generators); if ((yyval.generators) && (yyvsp[0].generator)) (yyval.generators)->push_back(*(yyvsp[0].generator)); delete (yyvsp[0].generator); } break; case 244: { (yyval.generators)=(yyvsp[-2].generators); if ((yyval.generators) && (yyvsp[0].generator)) (yyval.generators)->push_back(*(yyvsp[0].generator)); delete (yyvsp[0].generator); } break; case 245: { (yyval.generators)=(yyvsp[-4].generators); if ((yyval.generators) && (yyvsp[-2].generator)) (yyval.generators)->push_back(*(yyvsp[-2].generator)); if ((yyval.generators) && (yyvsp[-2].generator) && (yyvsp[0].expression)) (yyval.generators)->push_back(Generator((yyval.generators)->size(),(yyvsp[0].expression))); delete (yyvsp[-2].generator); } break; case 246: { if ((yyvsp[-2].strings) && (yyvsp[0].expression)) (yyval.generator)=new Generator(*(yyvsp[-2].strings),(yyvsp[0].expression),nullptr); else (yyval.generator)=nullptr; delete (yyvsp[-2].strings); } break; case 247: { if ((yyvsp[-4].strings) && (yyvsp[-2].expression)) (yyval.generator)=new Generator(*(yyvsp[-4].strings),(yyvsp[-2].expression),(yyvsp[0].expression)); else (yyval.generator)=nullptr; delete (yyvsp[-4].strings); } break; case 248: { if ((yyvsp[0].expression)) (yyval.generator)=new Generator({(yyvsp[-2].sValue)},nullptr,(yyvsp[0].expression)); else (yyval.generator)=nullptr; free((yyvsp[-2].sValue)); } break; case 250: { (yyval.strings)=new std::vector; (yyval.strings)->push_back((yyvsp[0].sValue)); free((yyvsp[0].sValue)); } break; case 251: { (yyval.strings)=(yyvsp[-2].strings); if ((yyval.strings) && (yyvsp[0].sValue)) (yyval.strings)->push_back((yyvsp[0].sValue)); free((yyvsp[0].sValue)); } break; case 252: { (yyval.expression)=new ArrayLit((yyloc), std::vector()); } break; case 253: { if ((yyvsp[-1].expressions1d)) (yyval.expression)=new ArrayLit((yyloc), *(yyvsp[-1].expressions1d)); delete (yyvsp[-1].expressions1d); } break; case 254: { (yyval.expression)=new ArrayLit((yyloc), std::vector >()); } break; case 255: { if ((yyvsp[-1].expressions2d)) { (yyval.expression)=new ArrayLit((yyloc), *(yyvsp[-1].expressions2d)); for (unsigned int i=1; i<(yyvsp[-1].expressions2d)->size(); i++) if ((*(yyvsp[-1].expressions2d))[i].size() != (*(yyvsp[-1].expressions2d))[i-1].size()) yyerror(&(yylsp[-1]), parm, "syntax error, all sub-arrays of 2d array literal must have the same length"); delete (yyvsp[-1].expressions2d); } else { (yyval.expression) = nullptr; } } break; case 256: { if ((yyvsp[-2].expressions2d)) { (yyval.expression)=new ArrayLit((yyloc), *(yyvsp[-2].expressions2d)); for (unsigned int i=1; i<(yyvsp[-2].expressions2d)->size(); i++) if ((*(yyvsp[-2].expressions2d))[i].size() != (*(yyvsp[-2].expressions2d))[i-1].size()) yyerror(&(yylsp[-2]), parm, "syntax error, all sub-arrays of 2d array literal must have the same length"); delete (yyvsp[-2].expressions2d); } else { (yyval.expression) = nullptr; } } break; case 257: { if ((yyvsp[-1].expressions3d)) { std::vector > dims(3); dims[0] = std::pair(1,static_cast((yyvsp[-1].expressions3d)->size())); if ((yyvsp[-1].expressions3d)->size()==0) { dims[1] = std::pair(1,0); dims[2] = std::pair(1,0); } else { dims[1] = std::pair(1,static_cast((*(yyvsp[-1].expressions3d))[0].size())); if ((*(yyvsp[-1].expressions3d))[0].size()==0) { dims[2] = std::pair(1,0); } else { dims[2] = std::pair(1,static_cast((*(yyvsp[-1].expressions3d))[0][0].size())); } } std::vector a; for (int i=0; i > >; } break; case 259: { (yyval.expressions3d)=new std::vector > >; if ((yyvsp[-1].expressions2d)) (yyval.expressions3d)->push_back(*(yyvsp[-1].expressions2d)); delete (yyvsp[-1].expressions2d); } break; case 260: { (yyval.expressions3d)=(yyvsp[-4].expressions3d); if ((yyval.expressions3d) && (yyvsp[-1].expressions2d)) (yyval.expressions3d)->push_back(*(yyvsp[-1].expressions2d)); delete (yyvsp[-1].expressions2d); } break; case 261: { (yyval.expressions2d)=new std::vector >; if ((yyvsp[0].expressions1d)) (yyval.expressions2d)->push_back(*(yyvsp[0].expressions1d)); delete (yyvsp[0].expressions1d); } break; case 262: { (yyval.expressions2d)=(yyvsp[-2].expressions2d); if ((yyval.expressions2d) && (yyvsp[0].expressions1d)) (yyval.expressions2d)->push_back(*(yyvsp[0].expressions1d)); delete (yyvsp[0].expressions1d); } break; case 263: { if ((yyvsp[-1].generatorsPointer)) (yyval.expression)=new Comprehension((yyloc), (yyvsp[-3].expression), *(yyvsp[-1].generatorsPointer), false); delete (yyvsp[-1].generatorsPointer); } break; case 264: { std::vector iexps; iexps.push_back((yyvsp[-3].expression)); iexps.push_back((yyvsp[-1].expression)); (yyval.expression)=new ITE((yyloc), iexps, nullptr); } break; case 265: { std::vector iexps; iexps.push_back((yyvsp[-6].expression)); iexps.push_back((yyvsp[-4].expression)); if ((yyvsp[-3].expressions1d)) { for (unsigned int i=0; i<(yyvsp[-3].expressions1d)->size(); i+=2) { iexps.push_back((*(yyvsp[-3].expressions1d))[i]); iexps.push_back((*(yyvsp[-3].expressions1d))[i+1]); } } (yyval.expression)=new ITE((yyloc), iexps,(yyvsp[-1].expression)); delete (yyvsp[-3].expressions1d); } break; case 266: { (yyval.expressions1d)=new std::vector; } break; case 267: { (yyval.expressions1d)=(yyvsp[-4].expressions1d); if ((yyval.expressions1d) && (yyvsp[-2].expression) && (yyvsp[0].expression)) { (yyval.expressions1d)->push_back((yyvsp[-2].expression)); (yyval.expressions1d)->push_back((yyvsp[0].expression)); } } break; case 268: { (yyval.iValue)=BOT_EQUIV; } break; case 269: { (yyval.iValue)=BOT_IMPL; } break; case 270: { (yyval.iValue)=BOT_RIMPL; } break; case 271: { (yyval.iValue)=BOT_OR; } break; case 272: { (yyval.iValue)=BOT_XOR; } break; case 273: { (yyval.iValue)=BOT_AND; } break; case 274: { (yyval.iValue)=BOT_LE; } break; case 275: { (yyval.iValue)=BOT_GR; } break; case 276: { (yyval.iValue)=BOT_LQ; } break; case 277: { (yyval.iValue)=BOT_GQ; } break; case 278: { (yyval.iValue)=BOT_EQ; } break; case 279: { (yyval.iValue)=BOT_NQ; } break; case 280: { (yyval.iValue)=BOT_IN; } break; case 281: { (yyval.iValue)=BOT_SUBSET; } break; case 282: { (yyval.iValue)=BOT_SUPERSET; } break; case 283: { (yyval.iValue)=BOT_UNION; } break; case 284: { (yyval.iValue)=BOT_DIFF; } break; case 285: { (yyval.iValue)=BOT_SYMDIFF; } break; case 286: { (yyval.iValue)=BOT_PLUS; } break; case 287: { (yyval.iValue)=BOT_MINUS; } break; case 288: { (yyval.iValue)=BOT_MULT; } break; case 289: { (yyval.iValue)=BOT_POW; } break; case 290: { (yyval.iValue)=BOT_DIV; } break; case 291: { (yyval.iValue)=BOT_IDIV; } break; case 292: { (yyval.iValue)=BOT_MOD; } break; case 293: { (yyval.iValue)=BOT_INTERSECT; } break; case 294: { (yyval.iValue)=BOT_PLUSPLUS; } break; case 295: { (yyval.iValue)=-1; } break; case 296: { if ((yyvsp[-5].iValue)==-1) { (yyval.expression)=nullptr; yyerror(&(yylsp[-3]), parm, "syntax error, unary operator with two arguments"); } else { (yyval.expression)=new BinOp((yyloc), (yyvsp[-3].expression),static_cast((yyvsp[-5].iValue)),(yyvsp[-1].expression)); } } break; case 297: { int uot=-1; switch ((yyvsp[-3].iValue)) { case -1: uot = UOT_NOT; break; case BOT_MINUS: uot = UOT_MINUS; break; case BOT_PLUS: uot = UOT_PLUS; break; default: yyerror(&(yylsp[-1]), parm, "syntax error, binary operator with unary argument list"); break; } if (uot==-1) (yyval.expression)=nullptr; else { if (uot==UOT_PLUS && (yyvsp[-1].expression) && ((yyvsp[-1].expression)->isa() || (yyvsp[-1].expression)->isa())) { (yyval.expression) = (yyvsp[-1].expression); } else if (uot==UOT_MINUS && (yyvsp[-1].expression) && (yyvsp[-1].expression)->isa()) { (yyval.expression) = IntLit::a(-(yyvsp[-1].expression)->cast()->v()); } else if (uot==UOT_MINUS && (yyvsp[-1].expression) && (yyvsp[-1].expression)->isa()) { (yyval.expression) = FloatLit::a(-(yyvsp[-1].expression)->cast()->v()); } else { (yyval.expression)=new UnOp((yyloc), static_cast(uot),(yyvsp[-1].expression)); } } } break; case 298: { (yyval.expression)=new Call((yyloc), (yyvsp[-2].sValue), std::vector()); free((yyvsp[-2].sValue)); } break; case 299: { (yyval.expression)=new Call((yyloc), std::string((yyvsp[-3].sValue))+"⁻¹", std::vector()); free((yyvsp[-3].sValue)); } break; case 301: { if ((yyvsp[-1].expressionPairs)!=nullptr) { bool hadWhere = false; std::vector args; for (unsigned int i=0; i<(yyvsp[-1].expressionPairs)->size(); i++) { if ((*(yyvsp[-1].expressionPairs))[i].second) { yyerror(&(yylsp[-1]), parm, "syntax error, 'where' expression outside generator call"); hadWhere = true; (yyval.expression)=nullptr; } args.push_back((*(yyvsp[-1].expressionPairs))[i].first); } if (!hadWhere) { (yyval.expression)=new Call((yyloc), (yyvsp[-3].sValue), args); } } free((yyvsp[-3].sValue)); delete (yyvsp[-1].expressionPairs); } break; case 302: { vector gens; vector ids; if ((yyvsp[-4].expressionPairs)) { for (unsigned int i=0; i<(yyvsp[-4].expressionPairs)->size(); i++) { if (Id* id = Expression::dynamicCast((*(yyvsp[-4].expressionPairs))[i].first)) { if ((*(yyvsp[-4].expressionPairs))[i].second) { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].second->loc().parserLocation(); yyerror(&loc, parm, "illegal where expression in generator call"); } ids.push_back(id); } else { if (BinOp* boe = Expression::dynamicCast((*(yyvsp[-4].expressionPairs))[i].first)) { if (boe->lhs() && boe->rhs()) { Id* id = Expression::dynamicCast(boe->lhs()); if (id && boe->op() == BOT_IN) { ids.push_back(id); gens.push_back(Generator(ids,boe->rhs(),(*(yyvsp[-4].expressionPairs))[i].second)); ids = vector(); } else if (id && boe->op() == BOT_EQ && ids.empty()) { ids.push_back(id); gens.push_back(Generator(ids,nullptr,boe->rhs())); if ((*(yyvsp[-4].expressionPairs))[i].second) { gens.push_back(Generator(gens.size(),(*(yyvsp[-4].expressionPairs))[i].second)); } ids = vector(); } else { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } else { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } } if (ids.size() != 0) { yyerror(&(yylsp[-4]), parm, "illegal expression in generator call"); } ParserState* pp = static_cast(parm); if (pp->hadError) { (yyval.expression)=nullptr; } else { Generators g; g.g = gens; Comprehension* ac = new Comprehension((yyloc), (yyvsp[-1].expression),g,false); vector args; args.push_back(ac); (yyval.expression)=new Call((yyloc), (yyvsp[-6].sValue), args); } free((yyvsp[-6].sValue)); delete (yyvsp[-4].expressionPairs); } break; case 303: { if ((yyvsp[-1].expressionPairs)!=nullptr) { bool hadWhere = false; std::vector args; for (unsigned int i=0; i<(yyvsp[-1].expressionPairs)->size(); i++) { if ((*(yyvsp[-1].expressionPairs))[i].second) { yyerror(&(yylsp[-1]), parm, "syntax error, 'where' expression outside generator call"); hadWhere = true; (yyval.expression)=nullptr; } args.push_back((*(yyvsp[-1].expressionPairs))[i].first); } if (!hadWhere) { (yyval.expression)=new Call((yyloc), std::string((yyvsp[-4].sValue))+"⁻¹", args); } } free((yyvsp[-4].sValue)); delete (yyvsp[-1].expressionPairs); } break; case 304: { vector gens; vector ids; if ((yyvsp[-4].expressionPairs)) { for (unsigned int i=0; i<(yyvsp[-4].expressionPairs)->size(); i++) { if (Id* id = Expression::dynamicCast((*(yyvsp[-4].expressionPairs))[i].first)) { if ((*(yyvsp[-4].expressionPairs))[i].second) { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].second->loc().parserLocation(); yyerror(&loc, parm, "illegal where expression in generator call"); } ids.push_back(id); } else { if (BinOp* boe = Expression::dynamicCast((*(yyvsp[-4].expressionPairs))[i].first)) { if (boe->lhs() && boe->rhs()) { Id* id = Expression::dynamicCast(boe->lhs()); if (id && boe->op() == BOT_IN) { ids.push_back(id); gens.push_back(Generator(ids,boe->rhs(),(*(yyvsp[-4].expressionPairs))[i].second)); ids = vector(); } else if (id && boe->op() == BOT_EQ && ids.empty()) { ids.push_back(id); gens.push_back(Generator(ids,nullptr,boe->rhs())); if ((*(yyvsp[-4].expressionPairs))[i].second) { gens.push_back(Generator(gens.size(),(*(yyvsp[-4].expressionPairs))[i].second)); } ids = vector(); } else { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } else { ParserLocation loc = (*(yyvsp[-4].expressionPairs))[i].first->loc().parserLocation(); yyerror(&loc, parm, "illegal expression in generator call"); } } } } if (ids.size() != 0) { yyerror(&(yylsp[-4]), parm, "illegal expression in generator call"); } ParserState* pp = static_cast(parm); if (pp->hadError) { (yyval.expression)=nullptr; } else { Generators g; g.g = gens; Comprehension* ac = new Comprehension((yyloc), (yyvsp[-1].expression),g,false); vector args; args.push_back(ac); (yyval.expression)=new Call((yyloc), std::string((yyvsp[-7].sValue))+"⁻¹", args); } free((yyvsp[-7].sValue)); delete (yyvsp[-4].expressionPairs); } break; case 306: { (yyval.expressionPairs)=new vector >; if ((yyvsp[0].expression)) { (yyval.expressionPairs)->push_back(pair((yyvsp[0].expression),nullptr)); } } break; case 307: { (yyval.expressionPairs)=new vector >; if ((yyvsp[-2].expression) && (yyvsp[0].expression)) { (yyval.expressionPairs)->push_back(pair((yyvsp[-2].expression),(yyvsp[0].expression))); } } break; case 308: { (yyval.expressionPairs)=(yyvsp[-2].expressionPairs); if ((yyval.expressionPairs) && (yyvsp[0].expression)) (yyval.expressionPairs)->push_back(pair((yyvsp[0].expression),nullptr)); } break; case 309: { (yyval.expressionPairs)=(yyvsp[-4].expressionPairs); if ((yyval.expressionPairs) && (yyvsp[-2].expression) && (yyvsp[0].expression)) (yyval.expressionPairs)->push_back(pair((yyvsp[-2].expression),(yyvsp[0].expression))); } break; case 310: { if ((yyvsp[-3].expressions1d) && (yyvsp[0].expression)) { (yyval.expression)=new Let((yyloc), *(yyvsp[-3].expressions1d), (yyvsp[0].expression)); delete (yyvsp[-3].expressions1d); } else { (yyval.expression)=nullptr; } } break; case 311: { if ((yyvsp[-4].expressions1d) && (yyvsp[0].expression)) { (yyval.expression)=new Let((yyloc), *(yyvsp[-4].expressions1d), (yyvsp[0].expression)); delete (yyvsp[-4].expressions1d); } else { (yyval.expression)=nullptr; } } break; case 312: { (yyval.expressions1d)=new vector; (yyval.expressions1d)->push_back((yyvsp[0].vardeclexpr)); } break; case 313: { (yyval.expressions1d)=new vector; if ((yyvsp[0].item)) { ConstraintI* ce = (yyvsp[0].item)->cast(); (yyval.expressions1d)->push_back(ce->e()); ce->e(nullptr); } } break; case 314: { (yyval.expressions1d)=(yyvsp[-2].expressions1d); if ((yyval.expressions1d) && (yyvsp[0].vardeclexpr)) (yyval.expressions1d)->push_back((yyvsp[0].vardeclexpr)); } break; case 315: { (yyval.expressions1d)=(yyvsp[-2].expressions1d); if ((yyval.expressions1d) && (yyvsp[0].item)) { ConstraintI* ce = (yyvsp[0].item)->cast(); (yyval.expressions1d)->push_back(ce->e()); ce->e(nullptr); } } break; case 318: { (yyval.vardeclexpr) = (yyvsp[-1].vardeclexpr); if ((yyval.vardeclexpr)) (yyval.vardeclexpr)->toplevel(false); if ((yyval.vardeclexpr) && (yyvsp[0].expressions1d)) (yyval.vardeclexpr)->addAnnotations(*(yyvsp[0].expressions1d)); delete (yyvsp[0].expressions1d); } break; case 319: { if ((yyvsp[-3].vardeclexpr)) (yyvsp[-3].vardeclexpr)->e((yyvsp[0].expression)); (yyval.vardeclexpr) = (yyvsp[-3].vardeclexpr); if ((yyval.vardeclexpr)) (yyval.vardeclexpr)->loc((yyloc)); if ((yyval.vardeclexpr)) (yyval.vardeclexpr)->toplevel(false); if ((yyval.vardeclexpr) && (yyvsp[-2].expressions1d)) (yyval.vardeclexpr)->addAnnotations(*(yyvsp[-2].expressions1d)); delete (yyvsp[-2].expressions1d); } break; case 320: { (yyval.expressions1d)=nullptr; } break; case 322: { (yyval.expression) = (yyvsp[0].expression); } break; case 323: { (yyval.expression) = new Call((yylsp[0]), ASTString("mzn_expression_name"), {(yyvsp[0].expression)}); } break; case 324: { (yyval.expressions1d)=new std::vector(1); (*(yyval.expressions1d))[0] = (yyvsp[0].expression); } break; case 325: { (yyval.expressions1d)=(yyvsp[-2].expressions1d); if ((yyval.expressions1d)) (yyval.expressions1d)->push_back((yyvsp[0].expression)); } break; case 326: { (yyval.sValue)=(yyvsp[0].sValue); } break; case 327: { (yyval.sValue)=strdup((std::string((yyvsp[-1].sValue))+"⁻¹").c_str()); } break; case 328: { (yyval.sValue)=strdup("'<->'"); } break; case 329: { (yyval.sValue)=strdup("'->'"); } break; case 330: { (yyval.sValue)=strdup("'<-'"); } break; case 331: { (yyval.sValue)=strdup("'\\/'"); } break; case 332: { (yyval.sValue)=strdup("'xor'"); } break; case 333: { (yyval.sValue)=strdup("'/\\'"); } break; case 334: { (yyval.sValue)=strdup("'<'"); } break; case 335: { (yyval.sValue)=strdup("'>'"); } break; case 336: { (yyval.sValue)=strdup("'<='"); } break; case 337: { (yyval.sValue)=strdup("'>='"); } break; case 338: { (yyval.sValue)=strdup("'='"); } break; case 339: { (yyval.sValue)=strdup("'!='"); } break; case 340: { (yyval.sValue)=strdup("'in'"); } break; case 341: { (yyval.sValue)=strdup("'subset'"); } break; case 342: { (yyval.sValue)=strdup("'superset'"); } break; case 343: { (yyval.sValue)=strdup("'union'"); } break; case 344: { (yyval.sValue)=strdup("'diff'"); } break; case 345: { (yyval.sValue)=strdup("'symdiff'"); } break; case 346: { (yyval.sValue)=strdup("'..'"); } break; case 347: { (yyval.sValue)=strdup("'+'"); } break; case 348: { (yyval.sValue)=strdup("'-'"); } break; case 349: { (yyval.sValue)=strdup("'*'"); } break; case 350: { (yyval.sValue)=strdup("'^'"); } break; case 351: { (yyval.sValue)=strdup("'/'"); } break; case 352: { (yyval.sValue)=strdup("'div'"); } break; case 353: { (yyval.sValue)=strdup("'mod'"); } break; case 354: { (yyval.sValue)=strdup("'intersect'"); } break; case 355: { (yyval.sValue)=strdup("'not'"); } break; case 356: { (yyval.sValue)=strdup("'++'"); } break; default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; *++yylsp = yyloc; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; { yypcontext_t yyctx = {yyssp, yytoken, &yylloc}; char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == -1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); if (yymsg) { yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); yymsgp = yymsg; } else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = YYENOMEM; } } yyerror (&yylloc, parm, yymsgp); if (yysyntax_error_status == YYENOMEM) goto yyexhaustedlab; } } yyerror_range[1] = yylloc; if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= END) { /* Return failure if at end of input. */ if (yychar == END) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, &yylloc, parm); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yyerror_range[1] = *yylsp; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp, parm); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END yyerror_range[2] = yylloc; ++yylsp; YYLLOC_DEFAULT (*yylsp, yyerror_range, 2); /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if 1 /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (&yylloc, parm, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif /*-----------------------------------------------------. | yyreturn -- parsing is finished, return the result. | `-----------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc, parm); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp, parm); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); return yyresult; } libminizinc-2.5.3/tests/0000755000175000017500000000000013757304533013642 5ustar kaolkaollibminizinc-2.5.3/tests/README.md0000644000175000017500000001102113757304533015114 0ustar kaolkaolMiniZinc Testing ================ ## Setup Requires Python 3 (on Windows 3.8 is required). Make sure you're in the `tests/` directory. ```sh pip install -r requirements.txt ``` ## Running Test Suite To run the full test suite: ```sh pytest ``` An HTML report will be generated at `output/report.html`. Use the `--solvers` option to specify a subset of solvers to use in the tests. Tests which use a solver not in this list will be skipped. ```sh pytest --solvers gecode,chuffed ``` Use the `--driver` option to specify the directory containing the minizinc executable. Otherwise, default directories and PATH will be used to locate it. ```sh pytest --driver=../build ``` ## Multiple test suites To facilitate running the test suite with different minizinc options, `specs/suites.yml` contains configurations for running tests, or a subset of tests using different options. ```yaml my-test-suite: !Suite includes: ['*'] # Globs for included .mzn files solvers: [gecode, chuffed] # The allowed solvers (if the test case itself specifies a different solver it will be skipped) strict: false # Allow tests to pass if they check against another solver (default true) options: -O3: true # Default options to pass to minizinc (merged and overwritten by individual test cases) ``` For example, to run the `optimize-2` and `no-mip-domains` configurations only: ```sh pytest --suite optimize-2 --suite no-mip-domains ``` ## Creating/editing test cases with the web interface A web interface can be used to create and edit test cases graphically. Python 3.8.1 or newer and Flask is required. ```sh pip install flask ``` Start the web interface with ```sh cd tests python -m minizinc_testing.create ``` Then open `http://localhost:5000`. The web interface detects `.mzn` files in the `tests/spec` directory. To add a new test, simply create a `.mzn` containing the model, and then open the file in the web interface. Test cases can then be generated accordingly. ## Creating/editing test cases manually The test cases are defined using `YAML` inside the minizinc `.mzn` files. This YAML definition must be inside a block comment like the following: ```c /*** !Test expected: !Result solution: x: 1 ***/ ``` Multiple cases can be specified for one `.mzn` file: ```c /*** --- !Test ... --- !Test ... --- !Test ... ***/ ``` ### YAML format The format of the test case spec is as follows: ```yaml !Test solvers: [gecode, cbc, chuffed] # List of solvers to use (omit if all solvers should be tested) check_against: [gecode, cbc, chuffed] # List of solvers used to check results (omit if no checking is needed) extra_files: [datafile.dzn] # Data files to use if any options: # Options passed to minizinc-python's solve(), usually all_solutions if present all_solutions: true timeout: !Duration 10s expected: # The obtained result must match one of these - !Result status: SATISFIED # Result status solution: !Solution s: 1 t: !!set {1, 2, 3} # The set containing 1, 2 and 3 u: !Range 1..10 # The range 1 to 10 (inclusive) v: [1, 2, 3] # The array with 1, 2, 3 x: !Unordered [3, 2, 1] # Ignore the order of elements in this array _output_item: !Trim | trimmed output item gets leading/trailing whitespace ignored - !Error type: MiniZincError # Name of the error type message: Exact error message # Exact error message string (avoid using this as it's generally not portable) regex: .*type-inst must be par set.* # Regex the start of the string must match (run with M and S flags) ``` For a test to pass, at least one expected result must be a subset of the obtained result. That is, the obtained result can have more attributes, but not less, and corresponding attributes must match. If a solution is produced that does not match any given expected output, the result is checked using another solver. If this check passes then the test passes with a warning. ### Multiple solutions When setting `all_solutions: true` and the order of the returned solutions often does not matter, use `!SolutionSet` for the list of solutions: ```yaml !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: 1 - !Solution x: 2 ``` ### Testing FlatZinc output Use `type: compile` on a test to enable only flattening. Then `!FlatZinc filename.fzn` to give files with expected results. ```yaml !Test solvers: [gecode] type: compile expected: !FlatZinc expected.fzn ``` ## TODO - Tool for generating test cases - Tweak YAML parsing so not so many !Tags are required - Better documentation of how the framework operateslibminizinc-2.5.3/tests/spec/0000755000175000017500000000000013757304533014574 5ustar kaolkaollibminizinc-2.5.3/tests/spec/examples/0000755000175000017500000000000013757304533016412 5ustar kaolkaollibminizinc-2.5.3/tests/spec/examples/singHoist2.mzn0000644000175000017500000000640513757304533021176 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution Entry: - 62 - 4 - 18 - 47 Period: 25 Removal: - 0 - 14 - 43 - 57 objective: 25 ***/ %------------------------------------------------------------------------------% % singHoist2.mzn % Peter Stuckey % September 30 2006 %------------------------------------------------------------------------------% %------------------------------------------------------------------------------% % singHoist2.zinc % Jakob Puchinger % Wed Jun 21 %------------------------------------------------------------------------------% %------------------------------------------------------------------------------% % Minizinc model of one-hoist scheduling % % Robert Rodosek and Mark Wallace % A Generic Model and Hybrid Algorithm for Hoist Scheduling Problems % in Michael J. Maher and Jean-Francois Puget eds. % Principles and Practice of Constraint Programming - CP98, % Springer, Lecture Notes in Computer Science, volume 1520, 1998. %------------------------------------------------------------------------------% % constants int: NumTanks; int: NumJobs; array [0..NumTanks, 0..NumTanks] of int: Empty; array [0..NumTanks] of int: Full; array [1..NumTanks] of int: MinTime; array [1..NumTanks] of int: MaxTime; %------------------------------------------------------------------------------% % decision variables int: PerMax = sum([MaxTime[i] | i in 1..NumTanks]); array [0..NumTanks] of var 0..(NumJobs * PerMax): Entry; array [0..NumTanks] of var 0..(NumJobs * PerMax): Removal; var 0..PerMax : Period; %------------------------------------------------------------------------------% % model solve minimize Period; constraint forall (Tank in 0..NumTanks) ( Removal[Tank] + Full[Tank] = Entry[(Tank + 1) mod (NumTanks+1)] ); constraint forall (Tank in 1..NumTanks) ( Entry[Tank] + MinTime[Tank] <= Removal[Tank] /\ Entry[Tank] + MaxTime[Tank] >= Removal[Tank] ); constraint Removal[NumTanks] + Full[NumTanks] <= NumJobs * Period; % disjoint constraint constraint forall (T1 in 0..NumTanks-1, T2 in T1+1..NumTanks, K in 1..NumJobs-1) ( Entry[(T1 + 1) mod (NumTanks+1)] + Empty[(T1+1) mod (NumTanks+1), T2] + K * Period <= Removal[T2] \/ Entry[(T2 + 1) mod (NumTanks+1)] + Empty[(T2 + 1) mod (NumTanks+1), T1] <= Removal[T1] + K * Period ); constraint Removal[0] = 0; %------------------------------------------------------------------------------% % Test case. NumTanks = 3; NumJobs = 3; Empty = array2d(0..NumTanks, 0..NumTanks, [ 0, 2, 3, 3, 2, 0, 2, 3, 3, 2, 0, 2, 3, 3, 2, 0]); Full = array1d(0..NumTanks, [4, 4, 4, 5]); MinTime = [10, 25, 10]; MaxTime = [10, 25, 10]; constraint 0 <= Period /\ Period <= sum([MaxTime[i] | i in 1..NumTanks]); output [ "singHoist2:\n", "Period = ", show(Period), "\n", "Entry[] = [", show(Entry[0]), " ", show(Entry[1]), " ", show(Entry[2]), " ", show(Entry[3]), "]\n", "Removal[] = [", show(Removal[0]), " ", show(Removal[1]), " ", show(Removal[2]), " ", show(Removal[3]), "]\n" ]; libminizinc-2.5.3/tests/spec/examples/blocksworld_instance_1.mzn0000644000175000017500000000074113757304533023573 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution 'on': - [2, -2, 1] - [2, -2, -3] - [-1, -2, -3] - [2, 3, -3] ***/ % blocksworld_instance_1.mzn % vim: ft=zinc ts=4 sw=4 et tw=0 include "blocksworld.model"; n_blocks = 3; int: a = 1; int: b = 2; int: c = 3; % Initial state: % % C % A % B % --- % A B C initial_loc = [b, Table, a]; % Goal state: % % A % B % C % --- % A B C final_loc = [b, c, Table]; n_steps = 4; libminizinc-2.5.3/tests/spec/examples/langford.mzn0000644000175000017500000001057513757304533020744 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution Num: [1, 25, 2, 16, 3, 22, 4, 13, 19, 5, 17, 26, 6, 14, 23, 10, 20, 18, 7, 15, 11, 27, 8, 24, 21, 12, 9] Pos: [1, 3, 5, 7, 10, 13, 19, 23, 27, 16, 21, 26, 8, 14, 20, 4, 11, 18, 9, 17, 25, 6, 15, 24, 2, 12, 22] - !Result solution: !Solution Num: [19, 13, 7, 22, 16, 25, 8, 14, 20, 10, 9, 17, 23, 15, 11, 26, 21, 4, 18, 12, 5, 24, 1, 6, 2, 27, 3] Pos: [23, 25, 27, 18, 21, 24, 3, 7, 11, 10, 15, 20, 2, 8, 14, 5, 12, 19, 1, 9, 17, 4, 13, 22, 6, 16, 26] - !Result solution: !Solution Num: [1, 25, 2, 4, 3, 22, 5, 10, 16, 6, 19, 26, 11, 13, 23, 17, 7, 12, 20, 14, 8, 27, 18, 24, 9, 15, 21] Pos: [1, 3, 5, 4, 7, 10, 17, 21, 25, 8, 13, 18, 14, 20, 26, 9, 16, 23, 11, 19, 27, 6, 15, 24, 2, 12, 22] - !Result solution: !Solution Num: [1, 22, 2, 25, 3, 13, 4, 16, 19, 5, 23, 14, 6, 26, 17, 10, 20, 15, 7, 24, 11, 18, 8, 27, 21, 12, 9] Pos: [1, 3, 5, 7, 10, 13, 19, 23, 27, 16, 21, 26, 6, 12, 18, 8, 15, 22, 9, 17, 25, 2, 11, 20, 4, 14, 24] - !Result solution: !Solution Num: [7, 10, 19, 22, 8, 25, 11, 13, 9, 16, 20, 12, 23, 14, 4, 26, 17, 5, 21, 15, 6, 24, 1, 18, 2, 27, 3] Pos: [23, 25, 27, 15, 18, 21, 1, 5, 9, 2, 7, 12, 8, 14, 20, 10, 17, 24, 3, 11, 19, 4, 13, 22, 6, 16, 26] - !Result solution: !Solution Num: [7, 10, 19, 25, 8, 16, 11, 22, 9, 13, 20, 12, 17, 26, 4, 14, 23, 5, 21, 18, 6, 15, 1, 27, 2, 24, 3] Pos: [23, 25, 27, 15, 18, 21, 1, 5, 9, 2, 7, 12, 10, 16, 22, 6, 13, 20, 3, 11, 19, 8, 17, 26, 4, 14, 24] ***/ %-----------------------------------------------------------------------------% % Langford's Problem (CSPlib problem 24) % % June 2006; Sebastian Brand % % Instance L(k,n): % Arrange k sets of numbers 1 to n so that each appearance of the number m is m % numbers on from the last. For example, the L(3,9) problem is to arrange 3 % sets of the numbers 1 to 9 so that the first two 1's and the second two 1's % appear one number apart, the first two 2's and the second two 2's appear two % numbers apart, etc. %-----------------------------------------------------------------------------% % MiniZinc version % Peter Stuckey September 30 include "globals.mzn"; %-----------------------------------------------------------------------------% % Instance %-----------------------------------------------------------------------------% % int: n = 10; % numbers 1..n % int: k = 2; % sets 1..k int: n = 9; int: k = 3; %-----------------------------------------------------------------------------% % Input %-----------------------------------------------------------------------------% set of int: numbers = 1..n; % numbers set of int: sets = 1..k; % sets of numbers set of int: num_set = 1..n*k; set of int: positions = 1..n*k; % positions of (number, set) pairs %-----------------------------------------------------------------------------% % Primal model %-----------------------------------------------------------------------------% array[num_set] of var positions: Pos; % Pos[ns]: position of (number, set) % pair in the sought sequence constraint forall(i in 1..n, j in 1..k-1) ( Pos[k*(i-1) + j+1] - Pos[k*(i-1) + j] = i+1 ); constraint alldifferent(Pos); %-----------------------------------------------------------------------------% % Dual model (partial) %-----------------------------------------------------------------------------% array[positions] of var num_set: Num; % Num[p]: (number, set) pair at % position p in the sought sequence constraint alldifferent(Num); %-----------------------------------------------------------------------------% % Channelling between primal model and dual model %-----------------------------------------------------------------------------% constraint forall(i in numbers, j in sets, p in positions) ( (Pos[k*(i-1) + j] = p) <-> (Num[p] = k*(i-1) + j) ); %-----------------------------------------------------------------------------% % Without specifying a sensible search order this problem takes % forever to solve. % solve :: int_search(Pos, first_fail, indomain_split, complete) satisfy; output [ if j = 1 then "\n" ++ show(i) ++ "s at " else ", " endif ++ show(Pos[k*(i-1) + j]) | i in 1..n, j in 1..k ] ++ [ "\n" ]; libminizinc-2.5.3/tests/spec/examples/blocksworld.model0000644000175000017500000000555513757304533021773 0ustar kaolkaol% blocksworld_model.mzn % vim: ft=zinc ts=4 sw=4 et tw=0 % % A state-based blocks-world model. include "globals.mzn"; % Instance parameter: the number of steps to consider in the plan. % int: n_steps; set of int: steps = 1..n_steps; % The last step. % int: end = n_steps; % Instance parameter: the number of blocks in the problem. % int: n_blocks; set of int: blocks = 1..n_blocks; % Block 0 denotes the table, which has enough space for all the blocks. % int: Table = 0; set of int: table_or_blocks = {Table} union blocks; % Instance parameter: the starting locations of blocks in the problem. % array [blocks] of table_or_blocks: initial_loc; % Instance parameter: the finishing locations of blocks in the problem. % array [blocks] of table_or_blocks: final_loc; % If a block has a negative location then it's on the table. % Block a has its own "free" spot on the table at location -a. % set of int: locs = -n_blocks..n_blocks; % Decision variables: block locations at each step. % array [steps, blocks] of var locs: on; % Constrain the starting state. % constraint forall (b in blocks) ( if initial_loc[b] = Table then on[1, b] = -b else on[1, b] = initial_loc[b] endif ); % Constrain the goal state. % constraint forall (b in blocks) ( if final_loc[b] = Table then on[end, b] = -b else on[end, b] = final_loc[b] endif ); % Ensure each block cannot be put in the wrong place on the table % (this simplifies the model and allows us to use alldifferent below) % or on itself. % constraint forall (b in blocks, s in steps) ( on[s, b] in {c | c in blocks where c != b} union {-b} ); % No two blocks can occupy the same location at the same time. % constraint forall (s in steps) (alldifferent (b in blocks) (on[s, b])); % A clear block is one that has no other block on top of it. % The table is always clear. % predicate clear(steps: s, var locs: l) = l < 0 \/ forall (b in blocks) (on[s, b] != l); % If a block moves then it must (a) be clear and (b) its destination % must be clear. % constraint forall (s in steps, b in blocks where s < n_steps) ( on[s, b] != on[s + 1, b] -> ( clear(s, b) /\ clear(s, on[s + 1, b]) ) ); solve :: int_search( [on[s, b] | s in steps, b in blocks], first_fail, indomain_split, complete ) satisfy; output [ "[Negative locations denote the table.]\n" ] ++ [ if b = 1 then "Step " ++ show(s) ++ ":\n" else "" endif ++ " block " ++ show(b) ++ " on " ++ show(on[s, b]) ++ "\n" | s in 1..n_steps, b in 1..n_blocks ]; libminizinc-2.5.3/tests/spec/examples/tenpenki_3.mzn0000644000175000017500000000140413757304533021176 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [true, true, false, true, true] - [true, true, false, true, true] - [false, false, false, false, false] - [false, true, false, false, true] - [false, false, true, true, false] ***/ include "tenpenki.mzn.model"; nrows = 5; ncols = 5; constraint row_constraint(1, [2, 2]); constraint row_constraint(2, [2, 2]); constraint row_constraint(3, []); constraint row_constraint(4, [1, 1]); constraint row_constraint(5, [2]); constraint col_constraint(1, [2]); constraint col_constraint(2, [2, 1]); constraint col_constraint(3, [1]); constraint col_constraint(4, [2, 1]); constraint col_constraint(5, [2, 1]); % Solution: % % # # . # # % # # . # # % . . . . . % . # . . # % . . # # . libminizinc-2.5.3/tests/spec/examples/battleships_2.mzn0000644000175000017500000000370313757304533021706 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 2, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 2, 0, 1, 2, 0] - [0, 0, 0, 3, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0] col_sums: [2, 0, 4, 0, 2, 2] row_sums: [2, 2, 1, 1, 3, 1] - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 2, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 2, 0] - [0, 0, 0, 1, 0, 0, 0, 0] - [0, 1, 0, 2, 0, 0, 1, 0] - [0, 0, 0, 3, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0] col_sums: [2, 0, 4, 1, 0, 3] row_sums: [2, 2, 1, 1, 3, 1] - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 1, 0] - [0, 0, 0, 2, 0, 0, 2, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0] - [0, 1, 0, 1, 0, 0, 2, 0] - [0, 0, 0, 0, 0, 0, 3, 0] - [0, 0, 0, 0, 0, 0, 0, 0] col_sums: [2, 0, 3, 0, 0, 5] row_sums: [2, 2, 1, 1, 3, 1] - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 2, 0, 0, 1, 0] - [0, 0, 0, 3, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 1, 2, 0, 2, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0] col_sums: [2, 0, 4, 1, 0, 3] row_sums: [2, 2, 1, 1, 3, 1] ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 6; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[2, 4] > 0; constraint a[3, 7] > 0; constraint a[6, 7] > 0; row_sums = [2, 2, 1, 1, _, 1]; col_sums = [2, 0, _, _, _, _]; n_classes = 3; class_sizes = [3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/battleships.mzn.model0000644000175000017500000000755213757304533022572 0ustar kaolkaol% battleships.mzn.model % Ralph Becket % Wed Dec 10 13:51:12 EST 2008 % vim: ft=zinc ts=4 sw=4 et tw=0 % % A battleships puzzle involves working out where each of a fleet of ships % lies on a square grid. Clues are given in two ways: some parts of the % grid may be revealed as containing open water or part of a ship; and the % total number of parts of ships appearing in a row or column may also be % specified. Individual ships are always surrounded by open water, even % at the corners. % % The following example is taken from % http://wpc.puzzles.com/history/tests/1999qtest/test.htm % % w _ _ _ _ w _ _ _ 2 Fleet: % S w _ _ _ _ _ _ _ 2 1 battleship SSSS % _ _ _ _ _ _ _ _ _ 3 2 cruisers SSS SSS % w _ _ _ _ _ _ w _ 2 3 destroyers SS SS SS % _ _ _ _ _ _ _ _ _ 2 4 submarines S S S S % _ w S w _ _ _ _ _ 1 % _ _ w _ _ _ _ S _ 5 % _ _ _ _ _ _ _ _ _ 1 % _ _ _ _ _ _ _ _ _ 2 % % 4 0 3 2 2 2 1 4 2 % % In this model, each square on the grid is a number from 0..4 % (0 being water, 4 denoting the bows of a battleship). A Cruiser, % for instance, is described by a contiguous pattern 0 1 2 3 0 on % the board. Consider the following neighbourhood: % % a b c % d x e % f g h % % Precisely one of the following must hold: % - x is 0 % - x is b + 1 and d = e = 0 % - x is d + 1 and b = g = 0 % % We also need to specify constraints on diagonally adjacent squares: % - if x < b then d = e = 0 % - if x < d then b = g = 0 % % The column (row) constraints specify how many non-zero elements a % column (row) must have. % % The fleet constraints specify how many instances of each positive number % must appear on the board. include "count.mzn"; % Parameter: the length of side of the grid. % int: n; % Parameter: the number of ships of each class. % int: n_classes; set of int: class = 1..n_classes; array [class] of int: class_sizes; set of int: sq = {0} union class; % The row and column sums. % array [1..n] of var 0..n: row_sums; array [1..n] of var 0..n: col_sums; % We extend the board by one in each direction to add a sea border. % set of int: row = 2..(n + 1); set of int: col = 2..(n + 1); set of int: ROW = 1..(n + 2); set of int: COL = 1..(n + 2); array [ROW, COL] of var sq: a; % Add the sea border to the board. % constraint forall (r in {1, n + 2}, c in COL) (a[r, c] = 0); constraint forall (r in ROW, c in {1, n + 2}) (a[r, c] = 0); % Add the ship constraints. % constraint forall (r in row, c in col) ( ( a[r, c] = 0 ) \/ ( a[r, c] = a[r, c - 1] + 1 /\ a[r - 1, c] = 0 /\ a[r + 1, c] = 0 ) \/ ( a[r, c] = a[r - 1, c] + 1 /\ a[r, c - 1] = 0 /\ a[r, c + 1] = 0 ) ); % Add the diagonal constraints. % constraint forall (r in row, c in col) ( ( a[r, c] < a[r, c - 1] ) -> ( a[r - 1, c] = 0 /\ a[r + 1, c] = 0 ) ); constraint forall (r in row, c in col) ( ( a[r, c] < a[r - 1, c] ) -> ( a[r, c - 1] = 0 /\ a[r, c + 1] = 0 ) ); % Add the row and column constraints. % constraint forall (r in row) (count([a[r, c] | c in col], 0, n - row_sums[r - 1])); constraint forall (c in col) (count([a[r, c] | r in row], 0, n - col_sums[c - 1])); % Add the fleet constraints (a_flat is the 1D flattenning of the board, a). % array [1..(n * n)] of var sq: a_flat = [a[r, c] | r in row, c in col]; constraint forall (s in class) ( count(a_flat, s, sum (i in class where i >= s) (class_sizes[i])) ); solve :: int_search(a_flat, first_fail, indomain_max, complete) satisfy; output [ show(a[r, c]) ++ if c = n then "\n" else " " endif | r in row, c in col ]; libminizinc-2.5.3/tests/spec/examples/2DPacking.mzn0000644000175000017500000000676513757304533020720 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution bin: [0, 1] item: - [0, 0, 0, 0] - [1, 1, 1, 1] obj: 1 objective: 1 - !Result solution: !Solution bin: - 1 - 0 item: - [1, 1, 1, 1] - [0, 0, 0, 0] obj: 1 objective: 1 ***/ %------------------------------------------------------------------------------% % 2DPacking.mzn % Jakob Puchinger % October 29 2007 % vim: ft=zinc ts=4 sw=4 et tw=0 %------------------------------------------------------------------------------% % Two-dimensional Bin Packing % % n rectangular items with given height and width have to be packed into % rectangular bins of size W x H % It is assumed that the items are sorted according to non-increasing height. % %------------------------------------------------------------------------------% % Upper Bound on the number of Bins used int: K; % Width of the Bin int: W; % Height of the Bin int: H; % Number of items to be packed int: N; % Widths of the items array[1..N] of int: ItemWidth; % Heights of the items array[1..N] of int: ItemHeight; % Variable indicating if bin k is used. array[1..K] of var 0..1: bin; % Variable indicating if item i is in bin k. array[1..K, 1..N] of var 0..1: item; % The total number of bins has to be minimized solve minimize sum( k in 1..K ) ( bin[k] ) ; % Each item has to be packed. constraint forall( j in 1..N ) ( sum( k in 1..K ) ( item[k, j] ) = 1 ); % subproblem constraints constraint forall( k in 1..K ) ( is_feasible_packing(bin[k], [ item[k, j] | j in 1..N ]) ); % This predicate defines a feasible packing % as a 2-stage guillotine pattern (level pattern). % A Bin consists of one or several levels % and each level consist of one or several items. % The height of a level is given by its highest (first) item. % Variable x[i, j] indicates if item i is put in level j % x[j, j] also indicate that level j is used. % % Note, k is locally fixed, so this is the pattern for the k'th bin. % predicate is_feasible_packing(var 0..1: s_bin, array[1..N] of var 0..1: s_item) = ( let {array[1..N, 1..N] of var 0..1: x} in ( forall ( i in 1..N ) ( % Width of items on level can not exceed W sum( j in i..N ) ( ItemWidth[j] * x[i, j] ) <= W * x[i, i] /\ % first item in level is highest % XXX do not need to generate those variables (use default) forall( j in 1..i-1 ) ( x[i, j] = 0 ) ) /\ % Height of levels on bin can not exceed H sum( i in 1..N ) ( ItemHeight[i] * x[i, i] ) <= s_bin * H /\ % for all items associate item on bin with item on level. forall(j in 1..N) ( s_item[j] = sum( i in 1..j ) ( x[i, j] ) ) ) ); % required for showing the objective function var int: obj; constraint obj = sum( k in 1..K )( bin[k] ); output [ "Number of used bins = ", show( obj ), "\n"] ++ [ "Items in bins = \n\t"] ++ [ show(item[k, j]) ++ if j = N then "\n\t" else " " endif | k in 1..K, j in 1..N ] ++ [ "\n" ]; %------------------------------------------------------------------------------% % % Test data (Not in separate file, so that mzn2lp can handle it). % N = 4; W = 5; H = 10; K = 2; ItemWidth = [ 1, 1, 2, 3 ]; ItemHeight = [ 4, 4, 4, 3 ]; %N = 6; %W = 5; %H = 10; %K = N; %ItemWidth = [ 4, 4, 1, 1, 2, 3 ]; %ItemHeight = [ 6, 5, 4, 4, 4, 3 ]; libminizinc-2.5.3/tests/spec/examples/blocksworld_instance_2.mzn0000644000175000017500000000116313757304533023573 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution 'on': - [-1, 1, 2, 3, 4] - [-1, 1, 2, 3, -5] - [-1, 1, 2, -4, -5] - [-1, 1, -3, -4, -5] - [-1, -2, -3, -4, -5] - [2, 3, 4, 5, -5] ***/ % blocksworld_instance_2.mzn % vim: ft=zinc ts=4 sw=4 et tw=0 include "blocksworld.model"; n_blocks = 5; int: a = 1; int: b = 2; int: c = 3; int: d = 4; int: e = 5; % Initial state: % % E % D % C % B % A % --- % A B C D E initial_loc = [Table, a, b, c, d]; % Goal state: % % A % B % C % D % E % --- % A B C D E final_loc = [b, c, d, e, Table]; n_steps = 6; libminizinc-2.5.3/tests/spec/examples/battleships_5.mzn0000644000175000017500000000267013757304533021713 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0] - [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0] - [0, 1, 0, 0, 0, 3, 0, 1, 0, 0, 2, 0] - [0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 3, 0, 1, 0, 0] - [0, 0, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0] - [0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] col_sums: [1, 3, 0, 2, 5, 0, 5, 1, 1, 2] row_sums: [3, 2, 4, 2, 3, 3, 1, 1, 1, 0] ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, _, _, 0, _, 0 | 0, 0, _, _, _, _, _, _, _, _, _, 0 | 0, _, 0, _, _, _, _, _, _, _, _, 0 | 0, 0, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, 0, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[4, 2] > 0; row_sums = [3, 2, 4, 2, 3, 3, 1, 1, 1, 0]; col_sums = [1, 3, 0, 2, 5, 0, 5, 1, 1, 2]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/golomb.mzn0000644000175000017500000000235413757304533020423 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution mark: - 0 - 1 - 4 - 6 objective: 6 ***/ %------------------------------------------------------------------------% % Golomb rulers % prob006 in csplib %------------------------------------------------------------------------% % From csplib: % A Golomb ruler may be defined as a set of m integers 0 = a_1 < a_2 < % ... < a_m such that the m(m-1)/2 differences a_j - a_i, 1 <= i < j % <= m are distinct. Such a ruler is said to contain m marks and is of % length a_m. The objective is to find optimal (minimum length) or % near optimal rulers. % % This is the "ternary constraints and an alldifferent" model %------------------------------------------------------------------------% include "globals.mzn"; int: m = 4; int: n = m*m; array[1..m] of var 0..n: mark; array[int] of var 0..n: differences = [ mark[j] - mark[i] | i in 1..m, j in i+1..m]; constraint mark[1] = 0; constraint forall ( i in 1..m-1 ) ( mark[i] < mark[i+1] ); constraint alldifferent(differences); % Symmetry breaking constraint differences[1] < differences[(m*(m-1)) div 2]; solve :: int_search(mark, input_order, indomain, complete) minimize mark[m]; output ["golomb ", show(mark), "\n"]; libminizinc-2.5.3/tests/spec/examples/magicsq_3.mzn0000644000175000017500000000111213757304533021001 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [8, 1, 6] - [3, 5, 7] - [4, 9, 2] - !Result solution: !Solution a: - [6, 7, 2] - [1, 5, 9] - [8, 3, 4] - !Result solution: !Solution a: - [2, 7, 6] - [9, 5, 1] - [4, 3, 8] - !Result solution: !Solution a: - [4, 3, 8] - [9, 5, 1] - [2, 7, 6] - !Result solution: !Solution a: - [8, 3, 4] - [1, 5, 9] - [6, 7, 2] - !Result solution: !Solution a: - [2, 9, 4] - [7, 5, 3] - [6, 1, 8] ***/ include "magicsq.mzn.model"; n = 3; libminizinc-2.5.3/tests/spec/examples/sudoku.mzn0000644000175000017500000000324613757304533020457 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution puzzle: - [5, 9, 3, 7, 6, 2, 8, 1, 4] - [2, 6, 8, 4, 3, 1, 5, 7, 9] - [7, 1, 4, 9, 8, 5, 2, 3, 6] - [3, 2, 6, 8, 5, 9, 1, 4, 7] - [1, 8, 7, 3, 2, 4, 9, 6, 5] - [4, 5, 9, 1, 7, 6, 3, 2, 8] - [9, 4, 2, 6, 1, 8, 7, 5, 3] - [8, 3, 5, 2, 4, 7, 6, 9, 1] - [6, 7, 1, 5, 9, 3, 4, 8, 2] ***/ % %-----------------------------------------------------------------------------% % Sudoku for squares of arbitrary size N = (S x S) %-----------------------------------------------------------------------------% int: S; int: N = S * S; array[1..N,1..N] of var 1..N: puzzle; include "alldifferent.mzn"; % All cells in a row, in a column, and in a subsquare are different. constraint forall(i in 1..N)( alldifferent(j in 1..N)( puzzle[i,j] )) /\ forall(j in 1..N)( alldifferent(i in 1..N)( puzzle[i,j] )) /\ forall(i,j in 1..S) ( alldifferent(p,q in 1..S)( puzzle[S*(i-1)+p, S*(j-1)+q] )); solve satisfy; output [ "sudoku:\n" ] ++ [ show(puzzle[i,j]) ++ if j = N then if i mod S = 0 /\ i < N then "\n\n" else "\n" endif else if j mod S = 0 then " " else " " endif endif | i,j in 1..N ]; %-----------------------------------------------------------------------------% % % The data for the puzzle that causes satz to make 1 backtrack (normally none % are made). % S=3; puzzle=[| _, _, _, _, _, _, _, _, _| _, 6, 8, 4, _, 1, _, 7, _| _, _, _, _, 8, 5, _, 3, _| _, 2, 6, 8, _, 9, _, 4, _| _, _, 7, _, _, _, 9, _, _| _, 5, _, 1, _, 6, 3, 2, _| _, 4, _, 6, 1, _, _, _, _| _, 3, _, 2, _, 7, 6, 9, _| _, _, _, _, _, _, _, _, _| |]; libminizinc-2.5.3/tests/spec/examples/magicsq_5.mzn0000644000175000017500000000211313757304533021005 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] # Too slow on cbc expected: - !Result solution: !Solution a: - [20, 7, 3, 24, 11] - [4, 19, 14, 10, 18] - [6, 9, 17, 21, 12] - [13, 5, 16, 8, 23] - [22, 25, 15, 2, 1] - !Result solution: !Solution a: - [16, 5, 4, 17, 23] - [9, 18, 8, 6, 24] - [12, 7, 11, 21, 14] - [13, 10, 20, 19, 3] - [15, 25, 22, 2, 1] - !Result solution: !Solution a: - [7, 5, 9, 21, 23] - [19, 14, 22, 6, 4] - [25, 24, 11, 3, 2] - [1, 12, 15, 17, 20] - [13, 10, 8, 18, 16] - !Result solution: !Solution a: - [23, 5, 13, 17, 7] - [3, 21, 9, 14, 18] - [6, 4, 12, 24, 19] - [11, 10, 16, 8, 20] - [22, 25, 15, 2, 1] - !Result solution: !Solution a: - [25, 5, 9, 3, 23] - [4, 24, 15, 14, 8] - [20, 7, 1, 16, 21] - [6, 17, 18, 13, 11] - [10, 12, 22, 19, 2] - !Result solution: !Solution a: - [11, 21, 17, 10, 6] - [22, 8, 12, 19, 4] - [16, 15, 18, 9, 7] - [14, 20, 5, 3, 23] - [2, 1, 13, 24, 25] ***/ include "magicsq.mzn.model"; n = 5; libminizinc-2.5.3/tests/spec/examples/battleships_9.mzn0000644000175000017500000000263713757304533021722 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0] - [0, 0, 3, 0, 0, 3, 0, 1, 2, 3, 4, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] col_sums: [0, 7, 0, 0, 6, 1, 1, 2, 1, 2] row_sums: [5, 0, 2, 2, 6, 0, 2, 2, 0, 1] ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); row_sums = [5, _, 2, 2, 6, _, _, _, 0, 1]; col_sums = [_, 7, _, _, 6, 1, _, _, 1, _]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/battleships10.mzn0000644000175000017500000000266013757304533021627 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0] - [0, 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 2, 0, 0, 1, 2, 3, 0, 1, 2, 0] - [0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 2, 0, 1, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] col_sums: [1, 4, 1, 2, 3, 1, 3, 0, 4, 1] row_sums: [2, 1, 5, 0, 0, 0, 1, 6, 1, 4] ***/ % Example battleships problem for bs.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, 0, _, 0, 0 | 0, 0, _, _, _, _, _, _, _, 0, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[3, 10] > 1; row_sums = [2, 1, 5, 0, 0, 0, 1, 6, 1, 4]; col_sums = [1, 4, 1, 2, 3, 1, 3, 0, 4, 1]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/product_fd.mzn0000644000175000017500000000373213757304533021276 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inside: [40, 0, 0] objective: 37200 outside: [60, 200, 300] ***/ % RUNS OM minizinc_cpx %% Product example from the OPL book! %% product_int.mzn %% Ralph Becket June 26 2007 %% %% This is a version of product.mzn changed to use FD integers rather than %% LP floats (everything has been scaled up by 10). %enum Products = {kluski, capellini, fettucine}; int: NumProducts = 3; set of int: Products = 1..NumProducts; int: kluski = 0; int: capellini = 1; int: fettucine = 2; %enum Resources = {flour, eggs}; int: NumResources = 2; set of int: Resources = 1..NumResources; int: flour = 0; int: eggs = 1; array[Products] of int: demand = [100, 200, 300]; array[Products] of int: insideCost = [60, 80, 30]; array[Products] of int: outsideCost = [80, 90, 40]; array[Products, Resources] of int: consumption = [|5, 2 |4, 4 |3, 6 |]; array[Resources] of int: capacity = [200, 400]; % Original specification: % % array[Products] of var int: inside; % array[Products] of var int: outside; % % Preprocessed one restricting the domains to relevant finite ranges: array[Products] of var 0..max(capacity): inside; % from constraints 1 and 2 array[Products] of var 0..max(demand): outside; % from constraints 1 and 3 constraint forall (p in Products) ( inside[p] >= 0 /\ outside[p] >= 0 ); constraint forall(r in Resources) ( sum (p in Products) ( consumption[p, r] * inside[p] ) <= capacity[r] ); constraint forall(p in Products) ( inside[p] + outside[p] >= demand[p] ); solve minimize sum (p in Products) ( insideCost[p]*inside[p] + outsideCost[p]*outside[p] ); output [ "production planning (FD version)\n", " \tkluski\t\tfettucine\tcapellini\n", "make inside: \t", show(inside[1]), "\t\t", show(inside[2]), "\t\t", show(inside[3]), "\n", "make outside: \t", show(outside[1]), "\t\t", show(outside[2]), "\t\t", show(outside[3]), "\n" ]; libminizinc-2.5.3/tests/spec/examples/tenpenki.mzn.model0000644000175000017500000000511013757304533022051 0ustar kaolkaol% tenpenki.mzn % vim: ft=zinc ts=4 sw=4 et % Ralph Becket % Thu Aug 14 15:23:11 EST 2008 % % A tenpenki puzzle involves filling out the pixels in a grid to make % a picture. Each row/column constraint specifies the distinct % runs of "black" pixels in that row/column. For example, % % 1 1 % 1 2 1 1 % 1 1 5 2 1 % +-----------+ % 1 3 | # . # # # | % 2 | . # # . . | % 5 | # # # # # | % 2 | . . # # . | % 3 1 | # # # . # | % +-----------+ % The dimensions of the board. % int: nrows; int: ncols; set of int: row = 1..nrows; set of int: col = 1..ncols; set of int: row_plus_one = 1..(nrows + 1); set of int: col_plus_one = 1..(ncols + 1); % The grid. % array [row, col] of var bool: a; % A generic row constraint. % predicate row_constraint(row: r, array [int] of col: x) = if index_set(x) = {} then forall (c in col) (a[r, c] = false) else let { int: n = max(index_set(x)), array [1..n] of var col: s % The starting col of each block. } in ( % There must be at least one white cell between each black block. % forall (i in 1..(n - 1)) (s[i + 1] > s[i] + x[i]) /\ % The final black block mustn't overrun the row. % s[n] + x[n] <= ncols + 1 /\ % Ensure that the pixels in this row are coloured in appropriately. % forall (c in col) ( a[r, c] <-> exists (i in 1..n) (s[i] <= c /\ c < s[i] + x[i]) ) ) endif; % A generic col constraint. % predicate col_constraint(col: c, array [int] of row: x) = if index_set(x) = {} then forall (r in row) (a[r, c] = false) else let { int: n = max(index_set(x)), array [1..n] of var row: s % The starting row of each block. } in ( % There must be at least one white cell between each black block. % forall (i in 1..(n - 1)) (s[i + 1] > s[i] + x[i]) /\ % The final black block mustn't overrun the col. % s[n] + x[n] <= ncols + 1 /\ % Ensure that the pixels in this col are coloured in appropriately. % forall (r in row) ( a[r, c] <-> exists (i in 1..n) (s[i] <= r /\ r < s[i] + x[i]) ) ) endif; solve satisfy; output [ if fix(a[r, c]) then "# " else ". " endif ++ if c = ncols then "\n" else "" endif | r in row, c in col ]; libminizinc-2.5.3/tests/spec/examples/perfsq.mzn0000644000175000017500000000267613757304533020453 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution j: 4 k: 10 objective: 4 s: [7, 5, 4, 3, 1, 0, 0, 0, 0, 0, 0] ***/ % perfsq.mzn % vim: ft=zinc ts=4 sw=4 et % Ralph Becket % Thu May 31 11:44:33 EST 2007 % % Perfect squares: find a set of integers the sum of whose squares is % itself a square. int: z = 10; array [0..z] of 0..z*z: sq = array1d(0..z, [x*x | x in 0..z]); array [0..z] of var 0..z: s; % Decreasing indices into sq. var 0..z: k; % We are summing to sq[k]; var 1..z: j; % We want this many sub-squares. % Symmetry breaking: s is an array of indices into sq. The indices are % strictly decreasing until they reach zero, whereupon the remainder are % also zero. % constraint forall ( i in 1..z ) ( s[i] > 0 -> s[i - 1] > s[i] ); % sq[k], sq[k + 1], ... can't appear in the solution. % constraint s[0] < k; % We want the sum of the squares to be square. % constraint sum ( i in 0..z ) ( sq[s[i]] ) = sq[k]; % We want the longest such sequence. % constraint s[j] > 0; solve maximize j; output [ "perfsq\n", show(k), "^2 = ", show(s[0]), "^2 + ", show(s[1]), "^2 + ", show(s[2]), "^2 + ", show(s[3]), "^2 + ", show(s[4]), "^2 + ", show(s[5]), "^2 + ", show(s[6]), "^2 + ", show(s[7]), "^2 + ", show(s[8]), "^2 + ", show(s[9]), "^2 + ", show(s[10]), "^2\n", ]; libminizinc-2.5.3/tests/spec/examples/eq20.mzn0000644000175000017500000000527213757304533017715 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 4, 6, 6, 6, 3, 1] ***/ %----------------------------------------------------------------------------- % Solving 20 linear equations % % Guido Tack, tack@gecode.org % 2007-02-22 % % Ported from the Gecode example % %----------------------------------------------------------------------------- array[0..6] of var 0..10: x; constraint -76706*x[0] + 98205*x[1] + 23445*x[2] + 67921*x[3] + 24111*x[4] + -48614*x[5] + -41906*x[6] = 821228 /\ 87059*x[0] + -29101*x[1] + -5513*x[2] + -21219*x[3] + 22128*x[4] + 7276*x[5] + 57308*x[6] = 22167 /\ -60113*x[0] + 29475*x[1] + 34421*x[2] + -76870*x[3] + 62646*x[4] + 29278*x[5] + -15212*x[6] = 251591 /\ 49149*x[0] + 52871*x[1] + -7132*x[2] + 56728*x[3] + -33576*x[4] + -49530*x[5] + -62089*x[6] = 146074 /\ -10343*x[0] + 87758*x[1] + -11782*x[2] + 19346*x[3] + 70072*x[4] + -36991*x[5] + 44529*x[6] = 740061 /\ 85176*x[0] + -95332*x[1] + -1268*x[2] + 57898*x[3] + 15883*x[4] + 50547*x[5] + 83287*x[6] = 373854 /\ -85698*x[0] + 29958*x[1] + 57308*x[2] + 48789*x[3] + -78219*x[4] + 4657*x[5] + 34539*x[6] = 249912 /\ -67456*x[0] + 84750*x[1] + -51553*x[2] + 21239*x[3] + 81675*x[4] + -99395*x[5] + -4254*x[6] = 277271 /\ 94016*x[0] + -82071*x[1] + 35961*x[2] + 66597*x[3] + -30705*x[4] + -44404*x[5] + -38304*x[6] = 25334 /\ -60301*x[0] + 31227*x[1] + 93951*x[2] + 73889*x[3] + 81526*x[4] + -72702*x[5] + 68026*x[6] = 1410723 /\ -16835*x[0] + 47385*x[1] + 97715*x[2] + -12640*x[3] + 69028*x[4] + 76212*x[5] + -81102*x[6] = 1244857 /\ -43277*x[0] + 43525*x[1] + 92298*x[2] + 58630*x[3] + 92590*x[4] + -9372*x[5] + -60227*x[6] = 1503588 /\ -64919*x[0] + 80460*x[1] + 90840*x[2] + -59624*x[3] + -75542*x[4] + 25145*x[5] + -47935*x[6] = 18465 /\ -45086*x[0] + 51830*x[1] + -4578*x[2] + 96120*x[3] + 21231*x[4] + 97919*x[5] + 65651*x[6] = 1198280 /\ 85268*x[0] + 54180*x[1] + -18810*x[2] + -48219*x[3] + 6013*x[4] + 78169*x[5] + -79785*x[6] = 90614 /\ 8874*x[0] + -58412*x[1] + 73947*x[2] + 17147*x[3] + 62335*x[4] + 16005*x[5] + 8632*x[6] = 752447 /\ 71202*x[0] + -11119*x[1] + 73017*x[2] + -38875*x[3] + -14413*x[4] + -29234*x[5] + 72370*x[6] = 129768 /\ 1671*x[0] + -34121*x[1] + 10763*x[2] + 80609*x[3] + 42532*x[4] + 93520*x[5] + -33488*x[6] = 915683 /\ 51637*x[0] + 67761*x[1] + 95951*x[2] + 3834*x[3] + -96722*x[4] + 59190*x[5] + 15280*x[6] = 533909 /\ -16105*x[0] + 62397*x[1] + -6704*x[2] + 43340*x[3] + 95100*x[4] + -68610*x[5] + 58301*x[6] = 876370 ; solve satisfy; output [ "eq20 ", show(x[0]), " ", show(x[1]), " ", show(x[2]), " ", show(x[3]), " ", show(x[4]), " ", show(x[5]), "\n" ]; libminizinc-2.5.3/tests/spec/examples/tenpenki_1.mzn0000644000175000017500000000140613757304533021176 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [true, false, true, true, true] - [false, true, true, false, false] - [true, true, true, true, true] - [false, false, true, true, false] - [true, true, true, false, true] ***/ include "tenpenki.mzn.model"; nrows = 5; ncols = 5; constraint row_constraint(1, [1, 3]); constraint row_constraint(2, [2]); constraint row_constraint(3, [5]); constraint row_constraint(4, [2]); constraint row_constraint(5, [3, 1]); constraint col_constraint(1, [1, 1, 1]); constraint col_constraint(2, [2, 1]); constraint col_constraint(3, [5]); constraint col_constraint(4, [1, 2]); constraint col_constraint(5, [1, 1, 1]); % Solution: % % # . # # # % . # # . . % # # # # # % . . # # . % # # # . # libminizinc-2.5.3/tests/spec/examples/battleships_1.mzn0000644000175000017500000000251213757304533021702 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0] - [0, 2, 0, 0, 0, 1, 0, 0, 3, 0, 0] - [0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0] - [0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 1, 2, 3, 4, 0] - [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] col_sums: [4, 0, 3, 2, 2, 2, 1, 4, 2] row_sums: [2, 2, 3, 2, 2, 1, 5, 1, 2] ***/ % Example battleships problem for battleships.mzn.model % include "battleships.mzn.model"; n = 9; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, 0, _, _, _, _, 0, _, _, _, 0 | 0, _, 0, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, 0 | 0, 0, _, _, _, _, _, _, 0, _, 0 | 0, _, _, _, _, _, _, _, _, _, 0 | 0, _, 0, _, 0, _, _, _, _, _, 0 | 0, _, _, 0, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[3, 2] > 0; constraint a[7, 4] > 0; constraint a[8, 9] > 0; row_sums = [2, 2, 3, 2, 2, 1, 5, 1, 2]; col_sums = [4, 0, 3, 2, 2, 2, 1, 4, 2]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/latin_squares_fd.mzn0000644000175000017500000003025213757304533022465 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: - - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - !Result solution: !Solution x: - - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - !Result solution: !Solution x: - - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - !Result solution: !Solution x: - - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - - [1, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 1] ***/ % latin_squares_fd.mzn % vim: ft=zinc ts=4 sw=4 et tw=0 % Author: Peter Stuckey % Edited: Ralph Becket % % Latin squares FD only. int: size = 9; set of int: range = 1..size; array[range, range, range] of var 0..1: x; constraint forall (i, j in range) ((sum (k in range) (x[i,j,k]) = 1)); constraint forall (i, k in range) ((sum (j in range) (x[i,j,k]) = 1)); constraint forall (j, k in range) ((sum (i in range) (x[i,j,k]) = 1)); solve satisfy; output [ if j = 1 /\ k = 1 then "\n" else "" endif ++ if fix(x[i,j,k]) = 1 then show(k) else "" endif | i, j, k in range ] ++ ["\n"]; libminizinc-2.5.3/tests/spec/examples/magicsq_4.mzn0000644000175000017500000000151113757304533021005 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] # Too slow on cbc expected: - !Result solution: !Solution a: - [16, 1, 15, 2] - [5, 8, 10, 11] - [4, 13, 3, 14] - [9, 12, 6, 7] - !Result solution: !Solution a: - [12, 1, 14, 7] - [15, 4, 9, 6] - [2, 13, 8, 11] - [5, 16, 3, 10] - !Result solution: !Solution a: - [10, 5, 11, 8] - [6, 9, 7, 12] - [3, 4, 14, 13] - [15, 16, 2, 1] - !Result solution: !Solution a: - [10, 11, 5, 8] - [6, 7, 9, 12] - [3, 2, 16, 13] - [15, 14, 4, 1] - !Result solution: !Solution a: - [16, 2, 9, 7] - [3, 13, 6, 12] - [5, 11, 4, 14] - [10, 8, 15, 1] - !Result solution: !Solution a: - [8, 11, 6, 9] - [13, 7, 10, 4] - [12, 14, 3, 5] - [1, 2, 15, 16] ***/ include "magicsq.mzn.model"; n = 4; libminizinc-2.5.3/tests/spec/examples/knights.mzn0000644000175000017500000000365713757304533020622 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] # Too slow on cbc expected: - !Result solution: !Solution p: [1, 9, 5, 16, 3, 7, 15, 2, 10, 6, 17, 30, 34, 26, 13, 21, 32, 19, 8, 4, 12, 23, 36, 28, 20, 31, 27, 35, 24, 11, 22, 18, 29, 33, 25, 14] ***/ % knights.mzn % Ralph Becket % vim: ft=zinc ts=4 sw=4 et % Tue Aug 26 14:24:28 EST 2008 % % Find a closed knight's tour of a chessboard (every square is visited exactly % once, the tour forms a loop). include "globals.mzn"; % n is the length of side of the chessboard. % int: n = 6; % The ith square (r, c) on the path is given by p[i] = (r - 1) * n + c. % int: nn = n * n; set of int: sq = 1..nn; array [sq] of var sq: p; set of int: row = 1..n; set of int: col = 1..n; % Break some symmetry by specifying the first and last moves. % constraint p[1] = 1; constraint p[2] = n + 3; constraint p[nn] = 2 * n + 2; % All points along the path must be unique. % constraint alldifferent(p); array [sq] of set of sq: neighbours = [ { n * (R - 1) + C | i in 1..8, R in {R0 + [-1, -2, -2, -1, 1, 2, 2, 1][i]}, C in {C0 + [-2, -1, 1, 2, 2, 1, -1, -2][i]} where R in row /\ C in col } | R0 in row, C0 in col ]; constraint forall (i in sq where i > 1) (p[i] in neighbours[p[i - 1]]); solve :: int_search( p, input_order, indomain_min, complete ) satisfy; % It has been observed that Warnsdorf's heuristic of choosing the next % square as the one with the fewest remaining neighbours leads almost % directly to a solution. How might we express this in MiniZinc? output ["p = " ++ show(p) ++ ";\n"]; % Invert the path to show the tour. % % array [sq] of var sq: q; % % constraint forall (i in sq) (q[p[i]] = i); % % output [ show(q[i]) ++ if i mod n = 0 then "\n" else " " endif % | i in sq % ] ++ % [ "\n" % ]; libminizinc-2.5.3/tests/spec/examples/factory_planning_instance.mzn0000644000175000017500000001700313757304533024362 0ustar kaolkaol/*** !Test check_against: [] expected: - !Result solution: !Solution last_step: 5 extra_files: [] markers: [] options: all_solutions: false solvers: - gecode - cbc - chuffed type: solve ***/ % A factory has three kinds of machines: % - input machines, where products enter the factory; % - output machines, where finished products leave the factory; % - work machines, which can hold at most one product and which may % add some attributes to that product. % % A product can move from one machine to another iff there is a direct % connection between the two machines (we model staying at a particular % machine by making the connection graph reflexive). % % In this model all actions are assumed to take the same amount of time. % % The goal is to complete a set of products in the shortest time. % XXX Optimisation is currently very expensive; we settle instead % for merely finding a consistent solution. % These values must be supplied by a data file. % int: n_machines; % The number of machines. int: n_products; % The number of products. int: n_attributes; % The number of attributes. int: n_steps; % The number of plan steps. set of int: machines = 1..n_machines; set of int: products = 1..n_products; set of int: attributes = 1..n_attributes; set of int: steps = 1..n_steps; % These values must be supplied by a data file: % - input_machines - the set of machines where products can start; % - output_machines - the set of machines where products may finish; % - connected - the (reflexive) graph of inter-machine connections; % - can_add_attr - table of which machines can add which attributes; % - prod_attr_goal - table of goal attributes for each product; % - prod_start_mach - table of starting machines for each product. % set of machines: input_machines; set of machines: output_machines; array [machines, machines] of 0..1: connected; array [machines, attributes] of 0..1: can_add_attr; array [products, attributes] of 0..1: prod_attr_goal; array [products] of input_machines: prod_start_mach; % Decision variables: % - step_prod_attr[s, p, a] - at step s, product p has attribute a; % - step_prod_mach[s, p] = m - at step s, product p is at machine m; % - last_step - the step at which the goal is achieved. % array [steps, products, attributes] of var 0..1: step_prod_attr; array [steps, products] of var machines: step_prod_mach; var steps: last_step; % Work machines are those that are neither input machines or output machines. % set of machines: work_machines = machines diff (input_machines union output_machines); % Products start at particular machines. % constraint forall (p in products) ( step_prod_mach[1, p] = prod_start_mach[p] ); % Products start with no attributes. % constraint forall (p in products, a in attributes) ( step_prod_attr[1, p, a] = 0 ); % The attributes of a product at step s are a subset of its % attributes at step s+1. % constraint forall (s in steps, p in products, a in attributes where s < n_steps) ( step_prod_attr[s, p, a] <= step_prod_attr[s + 1, p, a] ); % No two products can occupy the same work machine at the same step. % constraint forall (s in steps, p, q in products, m in work_machines where p < q) ( step_prod_mach[s, p] = m -> step_prod_mach[s, q] != m ); % At t = last_step all goals should be achieved: % - each product should have (precisely) its goal set of attributes; % - each product should be in an output machine. % constraint forall (p in products, a in attributes) ( step_prod_attr[last_step, p, a] = prod_attr_goal[p, a] ); constraint forall (p in products) ( step_prod_mach[last_step, p] in output_machines ); % Products can only move between directly connected machines. % constraint forall (s in steps, p in products where s < n_steps) ( connected[step_prod_mach[s, p], step_prod_mach[s + 1, p]] = 1 ); % A product can have an attribute added while at a particular machine. % constraint forall (s in steps, p in products, a in attributes where s < n_steps) ( step_prod_attr[s + 1, p, a] <= step_prod_attr[s, p, a] + can_add_attr[step_prod_mach[s, p], a] ); % XXX Trying to optimize for last_step currently takes forever, even for % relatively simple problems. % % solve minimize last_step; % last_step = n_steps; % solve satisfy; % Instance data n_machines = 5; n_products = 2; n_attributes = 3; n_steps = 5; input_machines = {1}; output_machines = {5}; % Connections: % % M1 --- M2 ----. % | | | % |----- M3 --- M5 % | | | % '----- M4 ----' connected = [| 1, 1, 1, 1, 0, | 1, 1, 1, 0, 1, | 1, 1, 1, 1, 1, | 1, 0, 1, 1, 1, | 0, 1, 1, 1, 1 |]; can_add_attr = [| 0, 0, 0 | 1, 0, 0 | 0, 1, 0 | 0, 0, 1 | 0, 0, 0 |]; prod_start_mach = [ 1, 1 ]; prod_attr_goal = [| 1, 1, 0 | 1, 0, 1 |]; solve satisfy; output [ "factory planning instance\n", "step | product | location | a1 a2 a3\n", "-----+---------+----------+---------\n", " 1 | 1 | ", show(step_prod_mach[1, 1]), " | ", show(step_prod_attr[1, 1, 1]), " ", show(step_prod_attr[1, 1, 2]), " ", show(step_prod_attr[1, 1, 3]), "\n", " | 2 | ", show(step_prod_mach[1, 2]), " | ", show(step_prod_attr[1, 2, 1]), " ", show(step_prod_attr[1, 2, 2]), " ", show(step_prod_attr[1, 2, 3]), "\n", "-----+---------+----------+---------\n", " 2 | 1 | ", show(step_prod_mach[2, 1]), " | ", show(step_prod_attr[2, 1, 1]), " ", show(step_prod_attr[2, 1, 2]), " ", show(step_prod_attr[2, 1, 3]), "\n", " | 2 | ", show(step_prod_mach[2, 2]), " | ", show(step_prod_attr[2, 2, 1]), " ", show(step_prod_attr[2, 2, 2]), " ", show(step_prod_attr[2, 2, 3]), "\n", "-----+---------+----------+---------\n", " 3 | 1 | ", show(step_prod_mach[3, 1]), " | ", show(step_prod_attr[3, 1, 1]), " ", show(step_prod_attr[3, 1, 2]), " ", show(step_prod_attr[3, 1, 3]), "\n", " | 2 | ", show(step_prod_mach[3, 2]), " | ", show(step_prod_attr[3, 2, 1]), " ", show(step_prod_attr[3, 2, 2]), " ", show(step_prod_attr[3, 2, 3]), "\n", "-----+---------+----------+---------\n", " 4 | 1 | ", show(step_prod_mach[4, 1]), " | ", show(step_prod_attr[4, 1, 1]), " ", show(step_prod_attr[4, 1, 2]), " ", show(step_prod_attr[4, 1, 3]), "\n", " | 2 | ", show(step_prod_mach[4, 2]), " | ", show(step_prod_attr[4, 2, 1]), " ", show(step_prod_attr[4, 2, 2]), " ", show(step_prod_attr[4, 2, 3]), "\n", "-----+---------+----------+---------\n", " 5 | 1 | ", show(step_prod_mach[5, 1]), " | ", show(step_prod_attr[5, 1, 1]), " ", show(step_prod_attr[5, 1, 2]), " ", show(step_prod_attr[5, 1, 3]), "\n", " | 2 | ", show(step_prod_mach[5, 2]), " | ", show(step_prod_attr[5, 2, 1]), " ", show(step_prod_attr[5, 2, 2]), " ", show(step_prod_attr[5, 2, 3]), "\n", "-----+---------+----------+---------\n" ]; libminizinc-2.5.3/tests/spec/examples/wolf_goat_cabbage.mzn0000644000175000017500000006534113757304533022556 0ustar kaolkaol/*** --- !Test solvers: [cbc] check_against: [gecode] expected: !Result status: SATISFIED --- !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - !Result solution: !Solution cabbage: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] farmer: - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] goat: - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [false, true, false] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [false, true, false] - [true, false, false] - [true, false, false] wolf: - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, false, true] - [false, true, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] - [true, false, false] ***/ %-----------------------------------------------------------------------------% % The wolf, goat, cabbage problem % % A farmer has to take a wolf, goat and cabbage across a bridge % He can only take one thing at a time % The wolf and goat can't be left together alone (without the farmer) % The goat and cabbage can't be left alone together %-----------------------------------------------------------------------------% % horizon is the maximum number of steps that might be required in the plan int: horizon = 20; %-----------------------------------------------------------------------------% % 1..3 represent the three locations: % 1 is on the left bank of the river % 2 is on the bridge % 3 is on the right bank % A boolean, for each object, time and location, % holds if the object is at the location at that time array [1..horizon,1..3] of var bool: wolf; array [1..horizon,1..3] of var bool: goat; array [1..horizon,1..3] of var bool: cabbage; array [1..horizon,1..3] of var bool: farmer; %-----------------------------------------------------------------------------% % Things can only move from bank to bridge, or from bridge to bank, in one step constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3) (wolf[t-1,loc1] /\ wolf[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2); constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3) (goat[t-1,loc1] /\ goat[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2); constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3) (cabbage[t-1,loc1] /\ cabbage[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2); constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3) (farmer[t-1,loc1] /\ farmer[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2); % Can't leave wolf and goat, or goat and cabbage, together constraint (forall(t in 1..horizon,loc in 1..3) ( (wolf[t,loc] /\ goat[t,loc] -> farmer[t,loc]) /\ (goat[t,loc] /\ cabbage[t,loc] -> farmer[t,loc]) ) ); % The wolf is somewhere at each time point, and is only in one place constraint forall(t in 1..horizon) (exists(loc in 1..3) (wolf[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc) (not wolf[t,loc2]) ) ); % Similarly for the goat, cabbage and farmer... constraint forall(t in 1..horizon) (exists(loc in 1..3) (goat[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc) (not goat[t,loc2]) ) ); constraint forall(t in 1..horizon) (exists(loc in 1..3) (cabbage[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc) (not cabbage[t,loc2]) ) ); constraint forall(t in 1..horizon) (exists(loc in 1..3) (farmer[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc) (not farmer[t,loc2]) ) ); % The wolf can ony be on the bridge if: % (a) The farmer is on the bridge, and neither the goat nor the cabbage is % (b) The farmer was previously on the same bank as the wolf % (c) The farmer goes subsequently to the same bank as the wolf constraint forall(t in 2..horizon-1) ((wolf[t,2] -> farmer[t,2] /\ not goat[t,2] /\ not cabbage[t,2] /\ (wolf[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2] /\ (wolf[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2]) /\ % Similarly for the cabbage (cabbage[t,2] -> farmer[t,2] /\ not goat[t,2] /\ not wolf[t,2] /\ (cabbage[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2] /\ (cabbage[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2]) /\ % and for the goat (goat[t,2] -> farmer[t,2] /\ not wolf[t,2] /\ not cabbage[t,2] /\ (goat[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2] /\ (goat[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2]) ); % The animals all start on the right bank and finish on the left bank constraint (wolf[1,3] /\ goat[1,3] /\ cabbage[1,3] /\ wolf[horizon,1] /\ goat[horizon,1] /\ cabbage[horizon,1] ); solve ::bool_search(array1d(1..3*horizon,wolf)++array1d(1..3*horizon,goat)++array1d(1..3*horizon,cabbage)++array1d(1..3*horizon,farmer), input_order, indomain_max, complete) satisfy; %-----------------------------------------------------------------------------% output [ "wolf : ", show(wolf), "\n", "goat : ", show(goat), "\n", "cabbage : ", show(cabbage), "\n", "farmer : ", show(farmer), "\n" ]; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/trucking.mzn0000644000175000017500000000464513757304533020777 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution obj: 224 objective: 224 x: - [0, 0, 0, 1, 0, 0] - [1, 0, 1, 0, 1, 1] - [0, 1, 0, 0, 1, 0] - [1, 0, 0, 0, 0, 1] - !Result solution: !Solution obj: 224 objective: 224 x: - [0, 0, 0, 1, 0, 0] - [0, 1, 1, 0, 1, 1] - [1, 0, 0, 0, 1, 0] - [1, 0, 0, 0, 0, 1] - !Result solution: !Solution obj: 224 objective: 224 x: - [0, 0, 0, 1, 0, 0] - [1, 1, 0, 0, 1, 1] - [0, 0, 1, 0, 0, 1] - [1, 0, 0, 0, 1, 0] - !Result solution: !Solution obj: 224 objective: 224 x: - [0, 0, 0, 1, 0, 0] - [1, 0, 1, 0, 1, 1] - [1, 0, 0, 0, 1, 0] - [0, 1, 0, 0, 0, 1] ***/ %------------------------------------------------------------------------------% % trucking.mzn % Jakob Puchinger % December 2007 % vim: ft=zinc ts=4 sw=4 et tw=0 % Original model comes from Peters Student Tim % There are N Trucks which have to can be used in every time period, % Each truck can transport a given Load of material. % Each truck has an associated cost. % In each time period a demand has to be fulfilled. % Truck1 and Truck2 have some further constraints, disallowing % them to be used more than once in consecutive or two consecutive time periods. % The goal is to minimise the cost %------------------------------------------------------------------------------% % Time Periods int: T; % Trucks int: N; 1..N: Truck1; 1..N: Truck2; array[1..T] of int: Demand; array[1..N] of int: Cost; array[1..N] of int: Loads; array[1..N, 1..T] of var 0..1: x; constraint forall(t in 1..T)( sum(i in 1..N)( Loads[i] * x[i,t]) >= Demand[t] ); constraint forall(tau in 1..T-2)( sum(t in tau..tau+2)( x[Truck1, t] ) <= 1 ); constraint forall(tau in 1..T-1)( sum(t in tau..tau+1)( x[Truck2, t] ) <= 1 ); solve minimize sum(i in 1..N)(sum(t in 1..T )( Cost[i] * x[i,t] )); % required for showing the objective function var int: obj; constraint obj = sum(i in 1..N)(sum(t in 1..T )( Cost[i] * x[i,t] )); output [ "Cost = ", show( obj ), "\n" ] ++ [ "X = \n\t" ] ++ [ show(x[i, t]) ++ if t = T then "\n\t" else " " endif | i in 1..N, t in 1..T ] ++ [ "\n" ]; %------------------------------------------------------------------------------% % Data T = 6; N = 4; Cost = [30, 27, 23, 20]; Loads = [20, 18, 15, 13]; Demand = [27, 11, 14, 19, 25, 22]; Truck1 = 3; Truck2 = 4; libminizinc-2.5.3/tests/spec/examples/steiner-triples.mzn0000644000175000017500000000407713757304533022301 0ustar kaolkaol/*** !Test solvers: [] # Remove once set ordering has been fixed expected: - !Result solution: !Solution sets: - !Range 5..7 - !!set {3, 4, 7} - !!set {2, 4, 6} - !!set {2, 3, 5} - !!set {1, 4, 5} - !!set {1, 3, 6} - !!set {1, 2, 7} - !Result solution: !Solution sets: - !Range 4..6 - !!set {3, 6, 7} - !!set {2, 4, 7} - !!set {2, 3, 5} - !!set {1, 5, 7} - !!set {1, 3, 4} - !!set {1, 2, 6} - !Result solution: !Solution sets: - !!set {4, 6, 7} - !!set {3, 5, 7} - !!set {2, 5, 6} - !Range '2..4' - !!set {1, 4, 5} - !!set {1, 3, 6} - !!set {1, 2, 7} - !Result solution: !Solution sets: - !!set {4, 6, 7} - !Range 3..5 - !!set {2, 5, 6} - !!set {2, 3, 7} - !!set {1, 5, 7} - !!set {1, 3, 6} - !!set {1, 2, 4} ***/ %-----------------------------------------------------------------------------% % Steiner Triples (CSPlib problem 44) % % March 2008; Mark Wallace, based on the Eclipse version by Joachim Schimpf % % The following program computes so-called Steiner triplets. These are % triplets of numbers from 1 to n such that any two triplets have at most one % element in common. % % One possible solution for n=7 is % { {1, 2, 3}, {1, 4, 5}, {1, 6, 7}, {2, 4, 6}, % {2, 5, 7}, {3, 4, 7}, {3, 5, 6} }. %-----------------------------------------------------------------------------% n = 7; %-----------------------------------------------------------------------------% int: n; int: nb = n * (n-1) div 6 ; array[1..nb] of var set of 1..n: sets; constraint forall(i in 1..nb) ( card(sets[i]) = 3 ); constraint forall(i in 1..nb, j in i+1..nb) ( card(sets[i] intersect sets[j]) <= 1 ); % Symmetry breaking: constraint forall(i in 1..nb-1) ( sets[i] >= sets[i+1] ); solve :: set_search(sets, input_order, indomain_min, complete) satisfy; output [ " " ++ show(sets[i]) | i in 1..nb ] ++ ["\n"]; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/queen_cp2.mzn0000644000175000017500000000201513757304533021017 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution q: [2, 4, 6, 8, 3, 1, 7, 5] - !Result solution: !Solution q: [2, 5, 7, 1, 3, 8, 6, 4] - !Result solution: !Solution q: [2, 5, 7, 4, 1, 8, 6, 3] - !Result solution: !Solution q: [2, 6, 1, 7, 4, 8, 3, 5] - !Result solution: !Solution q: [2, 6, 8, 3, 1, 4, 7, 5] - !Result solution: !Solution q: [2, 7, 3, 6, 8, 5, 1, 4] - !Result solution: !Solution q: [2, 7, 5, 8, 1, 4, 6, 3] - !Result solution: !Solution q: [2, 8, 6, 1, 3, 5, 7, 4] ***/ % n-queens example in Zinc using CP techniques % By Reza Rafeh July 2005 % MiniZinc version % Peter Stuckey September 30 2006 int: n = 8; array [1..n] of var 1..n: q :: add_to_output; constraint alldifferent(q) % rows /\ alldifferent(i in 1..n)(q[i] + i-1) % diagonals /\ alldifferent(i in 1..n)(q[i] + n-i); constraint q[1] = 2; %constraint q[2] = 1; include "alldifferent.mzn"; solve :: int_search( q, first_fail, indomain_min, complete ) satisfy; libminizinc-2.5.3/tests/spec/examples/alpha.mzn0000644000175000017500000000431113757304533020224 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: 5 b: 13 c: 9 d: 16 e: 20 f: 4 g: 24 h: 21 i: 25 j: 17 k: 23 l: 2 m: 8 n: 12 o: 10 p: 19 q: 7 r: 11 s: 15 t: 3 u: 1 v: 26 w: 6 x: 22 y: 14 z: 18 ***/ %----------------------------------------------------------------------------- % Alphabet puzzle, a well-known cryptoarithmetic puzzle % % Guido Tack, tack@gecode.org % 2007-02-22 % % Ported from the Gecode example % %----------------------------------------------------------------------------- include "globals.mzn"; var 1..26: a; var 1..26: b; var 1..26: c; var 1..26: d; var 1..26: e; var 1..26: f; var 1..26: g; var 1..26: h; var 1..26: i; var 1..26: j; var 1..26: k; var 1..26: l; var 1..26: m; var 1..26: n; var 1..26: o; var 1..26: p; var 1..26: q; var 1..26: r; var 1..26: s; var 1..26: t; var 1..26: u; var 1..26: v; var 1..26: w; var 1..26: x; var 1..26: y; var 1..26: z; constraint b+a+l+l+e+t = 45 /\ c+e+l+l+o = 43 /\ c+o+n+c+e+r+t = 74 /\ f+l+u+t+e = 30 /\ f+u+g+u+e = 50 /\ g+l+e+e = 66 /\ j+a+z+z = 58 /\ l+y+r+e = 47 /\ o+b+o+e = 53 /\ o+p+e+r+a = 65 /\ p+o+l+k+a = 59 /\ q+u+a+r+t+e+t = 50 /\ s+a+x+o+p+h+o+n+e = 134 /\ s+c+a+l+e = 51 /\ s+o+l+o = 37 /\ s+o+n+g = 61 /\ s+o+p+r+a+n+o = 82 /\ t+h+e+m+e = 72 /\ v+i+o+l+i+n = 100 /\ w+a+l+t+z = 34; constraint alldifferent([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]); solve satisfy; output [ "a = ", show(a), "\tb = ", show(b), "\tc = ", show(c), "\td = ", show(d), "\te = ", show(e), "\tf = ", show(f), "\ng = ", show(g), "\th = ", show(h), "\ti = ", show(i), "\tj = ", show(j), "\tk = ", show(k), "\tl = ", show(l), "\nm = ", show(m), "\tn = ", show(n), "\to = ", show(o), "\tp = ", show(p), "\tq = ", show(q), "\tr = ", show(r), "\ns = ", show(s), "\tt = ", show(t), "\tu = ", show(u), "\tv = ", show(v), "\tw = ", show(w), "\tx = ", show(x), "\ny = ", show(y), "\tz = ", show(z), "\n" ]; libminizinc-2.5.3/tests/spec/examples/simple_sat.mzn0000644000175000017500000000316613757304533021306 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution assignment: - true - true - true ***/ % % SAT instance based on a DIMACS SAT problem generated by ./dimacs2minizinc.pl % % boolean variables array [1..3] of var bool : assignment; % formula array [1..21] of int: Formula = [ 1, 2, 3, 1, 2, -3, 1, -2, 3, 1, -2, -3, -1, 2, 3, -1, 2, -3, -1, -2, 3 ]; % % constraints % % clause 1 constraint ( ( ( Formula[1] > 0 ) == assignment[1] ) \/ ( ( Formula[2] > 0 ) == assignment[2] ) \/ ( ( Formula[3] > 0 ) == assignment[3] ) ); % clause 2 constraint ( ( ( Formula[4] > 0 ) == assignment[1] ) \/ ( ( Formula[5] > 0 ) == assignment[2] ) \/ ( ( Formula[6] > 0 ) == assignment[3] ) ); % clause 3 constraint ( ( ( Formula[7] > 0 ) == assignment[1] ) \/ ( ( Formula[8] > 0 ) == assignment[2] ) \/ ( ( Formula[9] > 0 ) == assignment[3] ) ); % clause 4 constraint ( ( ( Formula[10] > 0 ) == assignment[1] ) \/ ( ( Formula[11] > 0 ) == assignment[2] ) \/ ( ( Formula[12] > 0 ) == assignment[3] ) ); % clause 5 constraint ( ( ( Formula[13] > 0 ) == assignment[1] ) \/ ( ( Formula[14] > 0 ) == assignment[2] ) \/ ( ( Formula[15] > 0 ) == assignment[3] ) ); % clause 6 constraint ( ( ( Formula[16] > 0 ) == assignment[1] ) \/ ( ( Formula[17] > 0 ) == assignment[2] ) \/ ( ( Formula[18] > 0 ) == assignment[3] ) ); % clause 7 constraint ( ( ( Formula[19] > 0 ) == assignment[1] ) \/ ( ( Formula[20] > 0 ) == assignment[2] ) \/ ( ( Formula[21] > 0 ) == assignment[3] ) ); solve satisfy; output [ "simple sat: ", show(assignment[1]), " ", show(assignment[2]), " ", show(assignment[3]), "\n" ]; libminizinc-2.5.3/tests/spec/examples/battleships_3.mzn0000644000175000017500000000272013757304533021705 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0] - [0, 2, 0, 2, 0, 2, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 1, 0] - [0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 2, 3, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] col_sums: [3, 2, 4, 2, 2, 2, 2, 1, 1, 1] row_sums: [4, 4, 0, 0, 4, 4, 0, 0, 4, 0] ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[3, 8] > 0; constraint a[7, 5] > 0; row_sums = [4, 4, 0, 0, 4, 4, 0, 0, 4, 0]; col_sums = [3, 2, 4, 2, 2, 2, 2, 1, 1, 1]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/multidimknapsack_simple.mzn0000644000175000017500000000233713757304533024056 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 17 x: [0, 1, 0, 1, 1] ***/ %------------------------------------------------------------------------------% % The classical 0/1 multidimensional knapsack problem. % % There is a knapsack with m different capacity constraints and n items with % profits and weights. The goal is to maximise the total profit of the items % in the knapsack while not violating any of the capacity constraints. %------------------------------------------------------------------------------% int: n; int: m; array[1..n] of int: Profits; array[1..n,1..m] of int: Weights; array[1..m] of int: Capacities; array[1..n] of var 0..1: x; constraint forall(i in 1..m) ( sum([Weights[j,i] * x[j] | j in 1..n]) <= Capacities[i] ); solve maximize sum([x[j] * Profits[j] | j in 1..n]); output [ "multidimknapsack_simple " ] ++ [ show(x[i]) ++ if i = n then "\n" else " " endif | i in 1..n ]; %------------------------------------------------------------------------------% % data n = 5; m = 3; Profits = [5,6,3,7,4]; Capacities = [5,10,15]; Weights = [| 2, 3, 2 | 1, 4, 4 | 1, 2, 5 | 3, 2, 3 | 1, 3, 5 |]; libminizinc-2.5.3/tests/spec/examples/tenpenki_6.mzn0000644000175000017500000000305713757304533021207 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [false, false, false, false, false, false, true, true, false, false] - [false, false, false, false, false, false, true, false, true, false] - [true, false, false, false, false, false, true, true, true, true] - [true, false, false, false, false, true, true, true, false, false] - [true, false, false, false, true, true, true, true, false, false] - [true, true, true, true, true, true, true, true, false, false] - [true, true, true, true, true, true, true, false, false, false] - [false, true, true, true, true, true, true, false, false, false] - [false, false, true, true, true, true, false, false, false, false] - [false, false, false, true, true, false, false, false, false, false] ***/ include "tenpenki.mzn.model"; nrows = 10; ncols = 10; constraint row_constraint( 1, [2]); constraint row_constraint( 2, [1, 1]); constraint row_constraint( 3, [1, 4]); constraint row_constraint( 4, [1, 3]); constraint row_constraint( 5, [1, 4]); constraint row_constraint( 6, [8]); constraint row_constraint( 7, [7]); constraint row_constraint( 8, [6]); constraint row_constraint( 9, [4]); constraint row_constraint(10, [2]); constraint col_constraint( 1, [5]); constraint col_constraint( 2, [3]); constraint col_constraint( 3, [4]); constraint col_constraint( 4, [5]); constraint col_constraint( 5, [6]); constraint col_constraint( 6, [6]); constraint col_constraint( 7, [8]); constraint col_constraint( 8, [1, 4]); constraint col_constraint( 9, [2]); constraint col_constraint(10, [1]); libminizinc-2.5.3/tests/spec/examples/tenpenki_2.mzn0000644000175000017500000000460013757304533021176 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [false, true , true , false, false, false, true , true , false, false, true , true , true , false] - [true , false, false, true , false, true , false, false, true , false, true , false, false, true ] - [true , false, false, false, false, false, true , false, false, false, true , false, false, true ] - [true , false, false, false, false, false, false, true , false, false, true , true , true , false] - [true , false, false, true , false, true , false, false, true , false, true , false, false, false] - [false, true , true , false, false, false, true , true , false, false, true , false, false, false] - !Result solution: !Solution a: - [false, true , true , false, false, false, true , true , false, false, true , true , true , false] - [true , false, false, true , false, true , false, false, true , false, true , false, false, true ] - [true , false, false, false, false, false, false, true, false, false, true , false, false, true ] - [true , false, false, false, false, false, true , false, false, false, true , true , true , false] - [true , false, false, true , false, true , false, false, true , false, true , false, false, false] - [false, true , true , false, false, false, true , true , false, false, true , false, false, false] ***/ include "tenpenki.mzn.model"; nrows = 6; ncols = 14; constraint row_constraint(1, [2, 2, 3]); constraint row_constraint(2, [1, 1, 1, 1, 1, 1]); constraint row_constraint(3, [1, 1, 1, 1]); constraint row_constraint(4, [1, 1, 3]); constraint row_constraint(5, [1, 1, 1, 1, 1]); constraint row_constraint(6, [2, 2, 1]); constraint col_constraint( 1, [4]); constraint col_constraint( 2, [1, 1]); constraint col_constraint( 3, [1, 1]); constraint col_constraint( 4, [1, 1]); constraint col_constraint( 5, []); constraint col_constraint( 6, [1, 1]); constraint col_constraint( 7, [1, 1, 1]); constraint col_constraint( 8, [1, 1, 1]); constraint col_constraint( 9, [1, 1]); constraint col_constraint(10, []); constraint col_constraint(11, [6]); constraint col_constraint(12, [1, 1]); constraint col_constraint(13, [1, 1]); constraint col_constraint(14, [2]); % Solution: % % . # # . . . # # . . # # # . % # . . # . # . . # . # . . # % # . . . . . # . . . # . . # % # . . . . . . # . . # # # . % # . . # . # . . # . # . . . % . # # . . . # # . . # . . . libminizinc-2.5.3/tests/spec/examples/radiation.mzn0000644000175000017500000001106313757304533021113 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result status: OPTIMAL_SOLUTION solution: !Solution Beamtime: 21 K: 7 N: [2, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] Q: - - [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - - [1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - - [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] objective: 175 --- !Test solvers: [cbc] check_against: [gecode] expected: !Result status: OPTIMAL_SOLUTION solution: !Solution {} ***/ %-----------------------------------------------------------------------------% % Radiation problem, Minizinc version % % Sebastian Brand % 05/2007 %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% % Instances %-----------------------------------------------------------------------------% m = 5; % Rows n = 5; % Columns Intensity = [| % g5c 7, 2, 14, 8, 9 | 13, 4, 1, 2, 9 | 5, 12, 2, 11, 9 | 10, 2, 4, 9, 7 | 10, 2, 8, 11, 1 |]; %-----------------------------------------------------------------------------% % Parameters %-----------------------------------------------------------------------------% int: m; % Rows int: n; % Columns set of int: Rows = 1..m; set of int: Columns = 1..n; % Intensity matrix array[Rows, Columns] of int: Intensity; set of int: BTimes = 1..Bt_max; int: Bt_max = max(i in Rows, j in Columns) (Intensity[i,j]); int: Ints_sum = sum(i in Rows, j in Columns) (Intensity[i,j]); %-----------------------------------------------------------------------------% % Variables %-----------------------------------------------------------------------------% % Total beam-on time var 0..Ints_sum: Beamtime; % Number of shape matrices var 0..m*n: K; % N[b] is the number of shape matrices with associated beam-on time b array[BTimes] of var 0..m*n: N; % Q[i,j,b] is the number of shape matrices with associated beam-on time % b that expose cell (i,j) array[Rows, Columns, BTimes] of var 0..m*n: Q; %-----------------------------------------------------------------------------% % Constraints %-----------------------------------------------------------------------------% % For FD/LP hybrid solving, all these should go the LP solver % (with a suitable linearisation of the 'max' expressions). constraint Beamtime = sum(b in BTimes) (b * N[b]) /\ K = sum(b in BTimes) (N[b]) /\ forall(i in Rows, j in Columns) ( Intensity[i,j] = sum([b * Q[i,j,b] | b in BTimes]) ) /\ forall(i in Rows, b in BTimes) ( upper_bound_on_increments(N[b], [Q[i,j,b] | j in Columns]) ); predicate upper_bound_on_increments(var int: N_b, array[int] of var int: L) = N_b >= L[1] + sum([ max(L[j] - L[j-1], 0) | j in 2..n ]); %-----------------------------------------------------------------------------% % Objective %-----------------------------------------------------------------------------% solve :: int_search( [Beamtime] ++ N ++ [ Q[i,j,b] | i in Rows, j in Columns, b in BTimes ], input_order, indomain_split, complete) minimize (ub(K) + 1) * Beamtime + K; % really: (Beamtime, K), i.e. in lexicographic order %-----------------------------------------------------------------------------% output ["radiation:\n", "B / K = ", show(Beamtime), " / ", show(K), "\n", % "N = ", show(N), "\n" ]; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/timetabling.mzn0000644000175000017500000000460113757304533021440 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution sum_Cs: 295 ***/ %-----------------------------------------------------------------------------% % Timetabling problem % % Serge Kruk % 04/2007 % % This is a subset of a real timetabling problem. The job is to assign % students to a section of each of the courses they have chosen and assign a % timeslot for all sections of all courses so that students can attend their % assigned sections. %-----------------------------------------------------------------------------% include "globals.mzn"; %-----------------------------------------------------------------------------% int: nS; % Number of students int: nC; % Number of course int: nSC; % Number of sections per course int: nCS; % Number of courses per student int: nT; % Number of timeslots array[1..nS, 1..nCS] of 1..nC: Cs; % Courses of each student % Decision variables array[1..nS, 1..nCS] of var 1..nSC: x; % Sections assigned array[1..nC, 1..nSC] of var 1..nT: z; % Times of each section % All the course-sections of a student must have different times constraint forall (i in 1..nS) ( alldifferent (j in 1..nCS) (z[Cs[i,j], x[i,j]]) ); var int: sum_Cs; constraint sum_Cs == sum(Cs); solve satisfy; %-----------------------------------------------------------------------------% output [ "timetabling:\n", "course sections assigned (1 row per student, 1 col per course):\n" ] ++ [ show(x[i,j]) ++ if j = nCS then "\n" else " " endif | i in 1..nS, j in 1..nCS ] ++ [ "times of each section (1 row per course, 1 col per section):\n" ] ++ [ show(z[i,j]) ++ if j = nSC then "\n" else " " endif | i in 1..nC, j in 1..nSC ]; %-----------------------------------------------------------------------------% % Small data set. nS=20; nC=6; nCS=4; nSC=3; %nT=5; % To make the problem real nT=6; Cs= [| 2, 5, 4, 3 | 4, 6, 3, 1 | 3, 1, 6, 2 | 2, 3, 6, 1 | 6, 4, 3, 1 | 6, 4, 2, 5 | 6, 2, 4, 1 | 6, 1, 4, 3 | 6, 4, 5, 3 | 5, 4, 6, 2 | 4, 2, 1, 5 | 6, 2, 3, 1 | 4, 3, 5, 6 | 6, 3, 2, 4 | 4, 6, 5, 1 | 3, 2, 6, 4 | 3, 6, 5, 1 | 3, 5, 2, 6 | 4, 3, 5, 2 | 5, 4, 6, 2 | |]; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/magicsq.mzn.model0000644000175000017500000000170613757304533021667 0ustar kaolkaol% magicsq.mzn.model % vim: ft=zinc ts=4 sw=4 et tw=0 % % A model for magic square problems. include "globals.mzn"; int: n; % The length of side of the square. int: s = (n * (n * n + 1)) div 2; % The Magic Constant - see % http://mathworld.wolfram.com/MagicSquare.html array [1..n, 1..n] of var 1..(n * n): a; % Every square must have a different value. constraint all_different (r, c in 1..n) (a[r, c]); % Every row, column, and major diagonal must sum to the Magic Constant. constraint forall (c in 1..n) (sum (r in 1..n) (a[r, c]) = s); constraint forall (r in 1..n) (sum (c in 1..n) (a[r, c]) = s); constraint sum (i in 1..n) (a[i, i]) = s; constraint sum (i in 1..n) (a[i, n + 1 - i]) = s; % Any solution will do. solve satisfy; output [ show_int(floor(log10(int2float(n * n))) + 1, a[r, c]) ++ if c = n then "\n" else " " endif | r, c in 1..n ]; libminizinc-2.5.3/tests/spec/examples/quasigroup_qg5.mzn0000644000175000017500000000416613757304533022122 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution q: - [1, 4, 5, 2, 3] - [3, 2, 1, 5, 4] - [4, 5, 3, 1, 2] - [5, 3, 2, 4, 1] - [2, 1, 4, 3, 5] ***/ %% Bennett quasigroup existence problem (QG5). %% %% A quasigroup is just a groupoid whose "multiplication table" is a %% Latin square: each row and each column is a permutation of the %% elements. Bennett's equation (not invented by Frank Bennett but %% studied by him) is (yx.y)y = x which forces the quasigroup to have %% interesting properties such as being orthogonal to certain of its %% conjugates. Idempotent ones are more important than the others. %% %% Bennett quasigroups exist for all positive N except for 2, 6, 10 %% and with the possible exceptions of 14, 18, 26, 30, 38, 42 and 158. %% %% Idempotent ones exist for all positive N not in {2, 3, 4, 6, 9, 10, %% 12, 13, 14, 15, 16} except possibly for N in {18, 20, 22, 24, 26, %% 28, 30, 34, 38, 39, 42, 44, 46, 51, 52, 58, 60, 62, 66, 68, 70, 72, %% 74, 75, 76, 86, 87, 90, 94, 96, 98, 99, 100, 102, 106, 108, 110, %% 114, 116, 118, 122, 132, 142, 146, 154, 158, 164, 170, 174} %% %% The existence of smallish open problems makes this algebraic %% question attractive from the viewpoint of automated reasoning and %% constraint satisfaction. %% %% Reference: %% F. E. Bennett %% Quasigroups %% C. J. Colbourn (ed) %% The CRC Handbook of Combinatorial Designs %% Chapter 36, pp .424-429. include "globals.mzn"; int: N; array[1..N,1..N] of var 1..N: q; constraint forall( x in 1..N ) ( q[x, x] = x ); constraint forall( x in 1..N ) ( alldifferent([q[x,y] | y in 1..N]) ); constraint forall( y in 1..N ) ( alldifferent([q[x,y] | x in 1..N]) ); constraint forall( x in 1..N ) ( q[x, 1] < x + 2 ); constraint forall( x in 1..N, y in 1..N ) ( q[q[q[y, x], y], y] = x ); solve :: int_search(array1d(1..N*N, q), input_order, indomain, complete) satisfy; output ["Bennett quasigroup of size " ++ show(N) ++ ":\n"] ++ [ if y=1 then "\n " else " " endif ++ show(q[x,y]) | x,y in 1..N ] ++ [ "\n" ]; N = 5; % Solutions also exist for N=7, N=8 and N=11. libminizinc-2.5.3/tests/spec/examples/photo.mzn0000644000175000017500000000576513757304533020306 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution ful: [false, false, false, true, false, true, false, false, true, false, false, false, true, true, true, true, true] objective: 8 pos: [0, 1, 4, 3, 2, 8, 5, 6, 7] satisfies: 8 - !Result solution: !Solution ful: [false, true, true, false, true, false, false, false, false, true, true, false, false, true, true, false, true] objective: 8 pos: [3, 8, 6, 0, 2, 1, 5, 4, 7] satisfies: 8 - !Result solution: !Solution ful: [false, true, false, false, false, false, false, true, false, false, true, false, true, true, true, true, true] objective: 8 pos: [1, 3, 4, 2, 0, 8, 5, 6, 7] satisfies: 8 - !Result solution: !Solution ful: [false, true, true, false, true, true, false, false, true, false, true, false, false, true, false, true, false] objective: 8 pos: [5, 8, 2, 3, 4, 0, 1, 6, 7] satisfies: 8 ***/ %----------------------------------------------------------------------------- % Placing people on a photo % % Guido Tack % 2007-02-22 % % Ported from the Gecode example % %----------------------------------------------------------------------------- % A group of people wants to take a group photo. Each person can give % preferences next to whom he or she wants to be placed on the % photo. The problem to be solved is to find a placement that % satisfies as many preferences as possible. include "globals.mzn"; %----------------------------------------------------------------------------- % Specification int: n_names; int: n_prefs; array[1..n_prefs,1..2] of int: prefs; % Instance n_names = 9; n_prefs = 17; prefs = array2d(1..n_prefs, 1..2, [| 1,3 | 1,5 | 1,8 | 2,5 | 2,9 | 3,4 | 3,5 | 4,1 | 4,5 | 5,6 | 5,1 | 6,1 | 6,9 | 7,3 | 7,8 | 8,9 | 8,7 |] ); %----------------------------------------------------------------------------- % Model array[1..n_names] of var 0..n_names-1: pos; var 0..n_names-1: satisfies; array[1..n_prefs] of var bool: ful; constraint forall (i in 1..n_prefs) ( let { int: pa = prefs[i,1], int: pb = prefs[i,2] } in ful[i] = (pos[pb]-pos[pa] == 1 xor pos[pa]-pos[pb] == 1) ); constraint sum (i in 1..n_prefs) (bool2int(ful[i])) = satisfies; constraint alldifferent(pos); % Break some symmetry constraint pos[1] < pos[2]; % Justification for annotation, from Guido: % I've had a closer look at the FlatZinc file for photo again. The real % problem is branching! Currently, if nothing is annotated, I branch on % all the variables, just naively in the order they're given in the source % file. For photo, this is apparently the worst you can do. You have to % branch on the pos array (that's what the Gecode version does), but this % array appears only after loads of Boolean variables. I've added a % search annotation to photo.mzn, which should solve this issue. solve :: int_search(pos, first_fail, indomain, complete) maximize satisfies; output ["Positions: ", show(pos), "\n", "Preferences satisfied: ", show(satisfies), "\n"]; libminizinc-2.5.3/tests/spec/examples/tenpenki_4.mzn0000644000175000017500000000071013757304533021176 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [true, true, true] - [true, true, false] - [true, false, false] ***/ include "tenpenki.mzn.model"; nrows = 3; ncols = 3; constraint row_constraint(1, [3]); constraint row_constraint(2, [2]); constraint row_constraint(3, [1]); constraint col_constraint(1, [3]); constraint col_constraint(2, [2]); constraint col_constraint(3, [1]); % Solution: % % # # # % # # . % # . . libminizinc-2.5.3/tests/spec/examples/queen_ip.mzn0000644000175000017500000000356613757304533020757 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution q: - [0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0] - !Result solution: !Solution q: - [0, 0, 0, 1, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 1, 0, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0] - [0, 0, 0, 0, 1, 0, 0, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - !Result solution: !Solution q: - [0, 0, 0, 0, 1, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 0, 1] - [0, 0, 0, 1, 0, 0, 0, 0] - [1, 0, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 0, 1, 0] - [0, 1, 0, 0, 0, 0, 0, 0] - [0, 0, 0, 0, 0, 1, 0, 0] - [0, 0, 1, 0, 0, 0, 0, 0] ***/ % n-queens example in Zinc using IP techniques % By Ralph Becket % MiniZinc version % Peter Stuckey September 30 2006 int: n = 8; set of int: rg = 0 .. n-1; array [rg, rg] of var 0 .. 1: q :: add_to_output; % % Every row and column has exactly one queen. % Every diagonal has at most one queen. % constraint forall (i in rg) ( ( sum (j in rg) (q[i, j]) = 1 ) /\ ( sum (j in rg) (q[j, i]) = 1 ) /\ ( sum (j, k in rg where j - k = i) (q[j, k]) <= 1 ) /\ ( sum (j, k in rg where j - k = - i) (q[j, k]) <= 1 ) /\ ( sum (j, k in rg where j - k = i) (q[n - 1 - j, k]) <= 1 ) /\ ( sum (j, k in rg where j - k = - i) (q[n - 1 - j, k]) <= 1 ) ); % % Find the first solution. % solve :: int_search( array1d(1..n*n, q), first_fail, indomain_min, complete ) satisfy; output ["8 queens, IP version:"] ++ [ if j = 0 then "\n" else "" endif ++ if fix(q[i, j]) = 1 then "Q " else ". " endif | i, j in rg ] ++ [ "\n" ]; libminizinc-2.5.3/tests/spec/examples/jobshop2x2.mzn0000644000175000017500000000323513757304533021143 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution end: 11 objective: 11 s: - [0, 2] - [2, 7] - !Result solution: !Solution end: 11 objective: 11 s: - [0, 2] - [3, 7] - !Result solution: !Solution end: 11 objective: 11 s: - [0, 2] - [4, 7] ***/ %-----------------------------------------------------------------------------% % Example from the MiniZinc paper: % (square) job shop scheduling in MiniZinc %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% % Instance size = 2; d = [| 2,5 | 3,4 |]; %-----------------------------------------------------------------------------% % Model int: size; % size of problem array [1..size,1..size] of int: d; % task durations int: Total = sum(i,j in 1..size) (d[i,j]); % total duration array [1..size,1..size] of var 0..Total: s; % start times var 0..Total: end; % total end time predicate no_overlap(var int:s1, int:d1, var int:s2, int:d2) = s1 + d1 <= s2 \/ s2 + d2 <= s1; constraint forall(i in 1..size) ( forall(j in 1..size-1) (s[i,j] + d[i,j] <= s[i,j+1]) /\ s[i,size] + d[i,size] <= end /\ forall(j,k in 1..size where j < k) ( no_overlap(s[j,i], d[j,i], s[k,i], d[k,i]) ) ); solve minimize end; output [ "jobshop2x2\n", "s[1..2, 1..2] = [", show(s[1, 1]), " ", show(s[1, 2]), "\n", " ", show(s[2, 1]), " ", show(s[2, 2]), "]\n" ]; %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/template_design.mzn0000644000175000017500000000761613757304533022316 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] # Too slow on cbc expected: - !Result solution: !Solution Production: 442 R: - 167 - 275 Surplus: 313 objective: 442 p: - [0, 1] - [2, 0] - [1, 1] - [3, 0] - [3, 0] - [0, 3] - [0, 4] ***/ %-----------------------------------------------------------------------------% % Template design % Problem 002 in CSPLib %-----------------------------------------------------------------------------% % Based on "ILP and Constraint Programming Approaches to a Template % Design Problem", Les Proll and Barbara Smith, School of Computing % Research Report 97.16, University of Leeds, May 1997. %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% % Instance S = 9; t = 2; n = 7; d = [250, 255, 260, 500, 500, 800, 1100]; %-----------------------------------------------------------------------------% include "globals.mzn"; int: S; % Number of slots per template. int: t; % Number of templates. int: n; % Number of variations. array[1..n] of int: d; % How much of each variation we must print? % Lower and upper bounds for the total production. % int: llower = ceil(sum(i in 1..n)(int2float(d[i]))/int2float(S)); int: lupper = 2*llower; % If t>1, this should be the optimal Production_{t-1}-1. % # Slots allocated to variation i in template j. % array[1..n,1..t] of var 0..S: p; % # Pressings of template j. % array[1..t] of var 1..lupper: R; var llower..lupper: Production; % Sum of all Rj. var 0..lupper-llower: Surplus; % Production x S - sum(d[i]) % First, set up Production to be the sum of the Rj constraint Production = sum(i in 1..t)(R[i]); % the limits on production constraint Production >= llower /\ Production <= lupper; % The number of slots occupied in each template is S. constraint forall(j in 1..t) (sum(i in 1..n)(p[i,j]) = S); % Enough of each variation is printed. constraint forall(i in 1..n) (sum(j in 1..t)(p[i,j]*R[j]) >= d[i]); % Symmetry constraints. % Variations with the same demand are symmetric. constraint forall (i in 1..n-1) ( if d[i] == d[i+1] then lex_lesseq([p[i, j] | j in 1..t], [p[i+1,j] | j in 1..t]) else true endif ); % pseudo symmetry constraint forall(i in 1..n-1) ( if d[i] < d[i+1] then sum (j in 1..t) (p[i,j]*R[j]) < sum (j in 1..t) (p[i+1,j]*R[j]) else true endif ); % implied constraints on the surplus % These are presented in the paper as necessary to get good % performance for this model, but I think bounds consistency on the % sum(R[i]) constraint would produce the same amount of propagation % Set up surplus, which is bounded as production is bounded. constraint Surplus = Production*S - sum(i in 1..n)(d[i]); % The surplus of each variation is also limited by the surplus. constraint forall(k in 1..n) (sum(j in 1..t)(p[k,j]*R[j]-d[k]) <= Surplus); % The surplus of the first k variations is limited by the surplus. constraint forall(k in 2..n-1) (sum(j in 1..t, m in 1..k)( p[m,j]*R[j]-d[m] ) <= Surplus); % Implied constraints on the run length. constraint if t=2 then ( R[1] <= Production div 2 /\ R[2] >= Production div 2 ) else true endif; constraint if t=3 then ( R[1] <= Production div 3 /\ R[2] <= Production div 2 /\ R[3] >= Production div 3 ) else true endif; % Minimize the production. solve :: int_search(array1d(1..n*t,p) ++ R, input_order, indomain_min, complete) minimize Production; output [ if v = 1 then "template #" ++ show(i) ++ ": [" else "" endif ++ show(p[v, i]) ++ if v = n then "], pressings: " ++ show(R[i]) ++ "\n" else ", " endif | i in 1..t, v in 1..n] ++ ["Total pressings: ", show(Production), "\n"]; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/tests/spec/examples/tenpenki_5.mzn0000644000175000017500000000547413757304533021213 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [false, false, false, true, true, true, true, false, true, true, true, true, false, false, false] - [false, false, false, true, false, false, true, true, true, false, false, true, false, false, false] - [false, false, true, true, false, false, true, true, true, false, false, true, true, false, false] - [false, false, true, true, true, true, true, true, true, true, true, true, true, false, false] - [false, false, true, true, true, true, true, true, true, true, true, true, true, true, false] - [false, false, true, true, false, false, true, true, true, false, false, true, true, true, false] - [false, false, false, true, true, true, true, true, true, true, true, true, true, true, false] - [false, false, false, false, true, true, true, false, false, true, true, true, false, true, false] - [false, false, false, false, false, true, false, false, false, true, false, true, false, true, false] - [false, false, false, false, false, true, false, false, false, true, false, true, false, true, false] - [false, false, false, false, false, true, false, false, false, true, false, true, false, true, false] - [false, false, false, false, false, false, false, false, false, false, false, true, true, true, false] - [false, false, false, false, false, false, false, false, false, false, false, false, true, true, false] - [false, false, false, false, false, false, false, false, false, false, false, false, true, true, false] - [false, false, false, false, false, false, false, false, false, false, false, false, true, true, false] ***/ include "tenpenki.mzn.model"; nrows = 15; ncols = 15; constraint row_constraint( 1, [4, 4]); constraint row_constraint( 2, [1, 3, 1]); constraint row_constraint( 3, [2, 3, 2]); constraint row_constraint( 4, [11]); constraint row_constraint( 5, [12]); constraint row_constraint( 6, [2, 3, 3]); constraint row_constraint( 7, [11]); constraint row_constraint( 8, [3, 3, 1]); constraint row_constraint( 9, [1, 1, 1, 1]); constraint row_constraint(10, [1, 1, 1, 1]); constraint row_constraint(11, [1, 1, 1, 1]); constraint row_constraint(12, [3]); constraint row_constraint(13, [2]); constraint row_constraint(14, [2]); constraint row_constraint(15, [2]); constraint col_constraint( 1, []); constraint col_constraint( 2, []); constraint col_constraint( 3, [4]); constraint col_constraint( 4, [7]); constraint col_constraint( 5, [1, 2, 2]); constraint col_constraint( 6, [1, 2, 5]); constraint col_constraint( 7, [8]); constraint col_constraint( 8, [6]); constraint col_constraint( 9, [7]); constraint col_constraint(10, [1, 2, 5]); constraint col_constraint(11, [1, 2, 2]); constraint col_constraint(12, [12]); constraint col_constraint(13, [5, 4]); constraint col_constraint(14, [11]); constraint col_constraint(15, []); libminizinc-2.5.3/tests/spec/examples/battleships_4.mzn0000644000175000017500000002530313757304533021710 0ustar kaolkaol/*** !Test check_against: [] expected: - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 3 - 0 - 0 - 1 - 0 - - 0 - 1 - 2 - 0 - 0 - 4 - 0 - 0 - 0 - 0 - 2 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 2 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 4 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 2 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 1 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 3 - 0 - 3 - 0 - 0 - 0 - 0 - - 0 - 2 - 0 - 0 - 0 - 4 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 2 - 0 - 0 - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 2 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 4 - 0 - 1 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 2 - 0 - 0 - 1 - 0 - - 0 - 1 - 2 - 0 - 0 - 4 - 0 - 3 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 2 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 1 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 4 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 2 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 2 - 1 - 0 - 0 - 5 - 2 - 3 - 1 - 4 - 2 row_sums: - 3 - 2 - 3 - 4 - 0 - 1 - 2 - 2 - 2 - 1 extra_files: [] markers: [] options: all_solutions: false solvers: - gecode - cbc - chuffed type: solve ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, 0, _, 0, 0 | 0, _, _, _, _, _, _, _, _, 0, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[8, 10] > 0; row_sums = [3, 2, 3, 4, 0, 1, 2, 2, 2, 1]; col_sums = [2, 1, 0, 0, 5, 2, 3, 1, 4, 2]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/warehouses.mzn0000644000175000017500000000675613757304533021343 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution Total: 383 cost: [30, 27, 70, 2, 4, 22, 5, 13, 35, 55] objective: 383 open: [true, true, true, false, true] supplier: [5, 2, 5, 1, 5, 2, 2, 3, 2, 3] ***/ %----------------------------------------------------------------------------- % Warehouse allocation % (Problem 034 in CSPLib) % vim: ft=zinc ts=2 sw=2 et tw=0 % % Guido Tack, tack@gecode.org % 2007-02-22 % % Ported from the Gecode example %----------------------------------------------------------------------------- % A company needs to construct warehouses to supply stores with goods. Each % warehouse possibly to be constructed has a certain capacity defining how many % stores it can supply. Constructing a warehouse incurs a fixed cost. Costs % for transportation from warehouses to stores depend on the locations of % warehouses and stores. % % Determine which warehouses should be constructed and which warehouse should % supply which store such that overall cost (transportation cost plus % construction cost) is smallest. %----------------------------------------------------------------------------- include "globals.mzn"; %----------------------------------------------------------------------------- % Instance n_suppliers = 5; n_stores = 10; building_cost = 30; capacity = [1,4,2,1,3]; cost_matrix = [|20, 24, 11, 25, 30 |28, 27, 82, 83, 74 |74, 97, 71, 96, 70 | 2, 55, 73, 69, 61 |46, 96, 59, 83, 4 |42, 22, 29, 67, 59 | 1, 5, 73, 59, 56 |10, 73, 13, 43, 96 |93, 35, 63, 85, 46 |47, 65, 55, 71, 95|]; %----------------------------------------------------------------------------- % Model int: n_suppliers; int: n_stores; int: building_cost; array[1..n_suppliers] of int: capacity; array[1..n_stores,1..n_suppliers] of int: cost_matrix; int: MaxCost = max(i in 1..n_stores, j in 1..n_suppliers)(cost_matrix[i,j]); int: MaxTotal = (n_suppliers * building_cost) + sum(i in 1..n_stores, j in 1..n_suppliers)(cost_matrix[i,j]); array[1..n_stores] of var 1..n_suppliers: supplier; array[1..n_suppliers] of var bool: open; array[1..n_stores] of var 1..MaxCost: cost; var 1..MaxTotal: Total; constraint sum (i in 1..n_suppliers) (building_cost * bool2int(open[i])) + sum (i in 1..n_stores) (cost[i]) = Total; constraint forall (i in 1..n_stores) ( cost_matrix[i,supplier[i]] = cost[i] ); constraint forall (i in 1..n_suppliers) ( let { var int: use } in count(supplier,i,use) /\ use <= capacity[i] ); constraint forall (i in 1..n_suppliers) ( (exists (j in 1..n_stores) (supplier[j] == i)) == open[i] ); solve :: int_search( supplier ++ cost ++ [bool2int(open[i]) | i in 1..n_suppliers], first_fail, indomain_split, complete ) minimize Total; output [ "warehouses:" ] ++ [ "\nTotal = ", show(Total) ] ++ [ "\nsupplier = [\n" ] ++ [ "\t" ++ show(supplier[i]) ++ if i = n_stores then "\n]" elseif i mod 5 = 0 then ",\n" else "," endif | i in 1..n_stores ] ++ [ "\ncost = [\n" ] ++ [ "\t" ++ show(cost[i]) ++ if i = n_stores then "\n]" elseif i mod 5 = 0 then ",\n" else "," endif | i in 1..n_stores ] ++ [ "\nopen = [\n" ] ++ [ "\t" ++ show(open[i]) ++ if i = n_suppliers then "\n]\n" elseif i mod 5 = 0 then ",\n" else "," endif | i in 1..n_suppliers ] %----------------------------------------------------------------------------- %----------------------------------------------------------------------------- libminizinc-2.5.3/tests/spec/examples/cutstock.mzn0000644000175000017500000000354413757304533021005 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution items: - [0, 0, 0] - [0, 0, 0] - [0, 0, 0] - [0, 0, 0] - [0, 0, 2] - [0, 2, 0] - [1, 0, 1] - [1, 0, 1] obj: 4 objective: 4 pieces: [0, 0, 0, 0, 1, 1, 1, 1] - !Result solution: !Solution items: - [0, 0, 3] - [0, 2, 0] - [1, 0, 1] - [1, 0, 1] - [0, 0, 0] - [0, 0, 0] - [0, 0, 0] - [0, 0, 0] obj: 4 objective: 4 pieces: [1, 1, 1, 1, 0, 0, 0, 0] ***/ %------------------------------------------------------------------------------% % cutstock.mzn % Jakob Puchinger % December 2007 % vim: ft=zinc ts=4 sw=4 et tw=0 % % The cutting stock problem: Kantorovitch formulation for colgen. % %------------------------------------------------------------------------------% int: L; % stock length int: K; % upper bound on number of stock pieces int: N; % number of stock pieces array[1..N] of int: i_length; array[1..N] of int: i_demand; array[1..K] of var 0..1: pieces; array[1..K, 1..N] of var int: items; constraint forall(k in 1..K, i in 1..N)( items[k,i] >=0 ); solve ::int_search(array1d(1..K*N,items)++pieces,input_order,indomain_min,complete) minimize sum([ pieces[k] | k in 1..K]); constraint forall(i in 1..N) ( sum( [ items[k, i] | k in 1..K] ) >= i_demand[i] ); constraint forall( k in 1..K ) ( sum(i in 1..N)( items[k,i] * i_length[i] ) <= pieces[k] * L ); % required for showing the objective function var int: obj; constraint obj = sum([ pieces[k] | k in 1..K]); output [ "Cost = ", show( obj ), "\n" ] ++ [ "Pieces = \n\t" ] ++ [show(pieces)] ++ [ "\n" ] ++ [ "Items = \n\t" ] ++ [ show(items[k, i]) ++ if k = K then "\n\t" else " " endif | i in 1..N, k in 1..K ] ++ [ "\n" ]; % data: N = 3; K = sum(i_demand); L = 10; i_length = [7, 5, 3]; i_demand = [2, 2, 4]; libminizinc-2.5.3/tests/spec/examples/perfsq2.mzn0000644000175000017500000000153413757304533020525 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 337561 ***/ % perfsq2.mzn % vim: ft=zinc ts=4 sw=4 et % % Perfect squares: find a square equal to the sum of smaller, distinct squares. int: n = 100; % x[k] = 1 iff k^2 is part of the sum. % array [1..n] of var 0..1: x; % t is the sum of the first n squares, the largest value our sum can have. % int: t = ((n * (n + 1) * (2 * n + 1)) div 6); % squares is the set of square numbers less than t. % set of int: squares = {i * i | i in 1..(n * n) where i * i <= t}; % k is the sum of the squares selected by the x[i]. % var squares: k = sum (i in 1..n) (i * i * x[i]); solve maximize(k); output [show(k), "\n"]; % output % [ show(k), " = sum of " % ] ++ % [ if fix(x[i]) = 1 then show(i * i) ++ " " else "" endif % | i in 1..n % ] ++ % [ "\n" % ]; libminizinc-2.5.3/tests/spec/examples/oss.mzn0000644000175000017500000000460313757304533017747 0ustar kaolkaol/*** !Test check_against: [] expected: - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 507 - 0 - 6 - - 0 - 168 - 663 - - 168 - 663 - 339 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 333 - 1162 - 0 - - 1000 - 0 - 657 - - 0 - 657 - 333 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 339 - 0 - 6 - - 0 - 168 - 663 - - 168 - 663 - 339 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 0 - 1162 - 829 - - 1000 - 505 - 0 - - 829 - 0 - 505 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 339 - 1162 - 0 - - 1000 - 168 - 657 - - 161 - 657 - 333 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 503 - 0 - 6 - - 0 - 169 - 820 - - 168 - 663 - 339 - !Result solution: !Solution makespan: 1168 objective: 1168 start: - - 507 - 0 - 6 - - 0 - 174 - 825 - - 168 - 663 - 339 extra_files: [] markers: [] options: all_solutions: false solvers: - gecode - cbc - chuffed type: solve ***/ int: Endtime; int: NMachines; int: NJobs; set of int: Machines = 1..NMachines; set of int: Jobs = 1..NJobs; array[Machines,Jobs] of int: duration; array[Machines,Jobs] of var 0..Endtime: start; var 0..Endtime: makespan; predicate not_at_same_time(Machines: m1, Jobs: j1, Machines: m2, Jobs: j2) = start[m1,j1] + duration[m1,j1] <= start[m2,j2] \/ start[m2,j2] + duration[m2,j2] <= start[m1,j1]; constraint forall(m in Machines)( forall(j1,j2 in Jobs where j1 < j2)( not_at_same_time(m,j1,m,j2) ) ); constraint forall(j in Jobs)( forall(m1,m2 in Machines where m1 < m2)( not_at_same_time(m1,j,m2,j) ) ); constraint forall(m in Machines)( forall(j in Jobs)( start[m,j] + duration[m,j] <= makespan ) ); solve minimize makespan; output [ "oss:\nmakespan = ", show(makespan), "\nstart = ", show(start), "\n" ]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Endtime = 1509; NMachines = 3; NJobs = 3; duration = [|661,6,333|168,489,343|171,505,324|]; libminizinc-2.5.3/tests/spec/examples/langford2.mzn0000644000175000017500000000600013757304533021012 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: [1, 7, 1, 2, 6, 4, 2, 5, 3, 7, 4, 6, 3, 5] - !Result solution: !Solution a: [1, 7, 1, 2, 5, 6, 2, 3, 4, 7, 5, 3, 6, 4] - !Result solution: !Solution a: [2, 7, 4, 2, 3, 5, 6, 4, 3, 7, 1, 5, 1, 6] - !Result solution: !Solution a: [3, 6, 7, 1, 3, 1, 4, 5, 6, 2, 7, 4, 2, 5] - !Result solution: !Solution a: [2, 6, 7, 2, 1, 5, 1, 4, 6, 3, 7, 5, 4, 3] - !Result solution: !Solution a: [4, 1, 7, 1, 6, 4, 2, 5, 3, 2, 7, 6, 3, 5] - !Result solution: !Solution a: [2, 3, 7, 2, 6, 3, 5, 1, 4, 1, 7, 6, 5, 4] - !Result solution: !Solution a: [2, 4, 7, 2, 3, 6, 4, 5, 3, 1, 7, 1, 6, 5] - !Result solution: !Solution a: [3, 5, 7, 2, 3, 6, 2, 5, 4, 1, 7, 1, 6, 4] - !Result solution: !Solution a: [4, 6, 1, 7, 1, 4, 3, 5, 6, 2, 3, 7, 2, 5] - !Result solution: !Solution a: [1, 6, 1, 7, 2, 4, 5, 2, 6, 3, 4, 7, 5, 3] - !Result solution: !Solution a: [3, 4, 6, 7, 3, 2, 4, 5, 2, 6, 1, 7, 1, 5] - !Result solution: !Solution a: [1, 5, 1, 7, 3, 4, 6, 5, 3, 2, 4, 7, 2, 6] - !Result solution: !Solution a: [2, 6, 3, 2, 7, 4, 3, 5, 6, 1, 4, 1, 7, 5] - !Result solution: !Solution a: [2, 3, 6, 2, 7, 3, 4, 5, 1, 6, 1, 4, 7, 5] - !Result solution: !Solution a: [4, 1, 6, 1, 7, 4, 3, 5, 2, 6, 3, 2, 7, 5] - !Result solution: !Solution a: [1, 5, 1, 6, 7, 2, 4, 5, 2, 3, 6, 4, 7, 3] - !Result solution: !Solution a: [1, 4, 1, 6, 7, 3, 4, 5, 2, 3, 6, 2, 7, 5] - !Result solution: !Solution a: [1, 6, 1, 3, 5, 7, 4, 3, 6, 2, 5, 4, 2, 7] - !Result solution: !Solution a: [2, 6, 3, 2, 5, 7, 3, 4, 6, 1, 5, 1, 4, 7] - !Result solution: !Solution a: [5, 2, 6, 4, 2, 7, 5, 3, 4, 6, 1, 3, 1, 7] - !Result solution: !Solution a: [2, 5, 6, 2, 3, 7, 4, 5, 3, 6, 1, 4, 1, 7] - !Result solution: !Solution a: [5, 2, 4, 6, 2, 7, 5, 4, 3, 1, 6, 1, 3, 7] - !Result solution: !Solution a: [1, 5, 1, 6, 3, 7, 4, 5, 3, 2, 6, 4, 2, 7] - !Result solution: !Solution a: [1, 5, 1, 4, 6, 7, 3, 5, 4, 2, 3, 6, 2, 7] - !Result solution: !Solution a: [1, 4, 1, 5, 6, 7, 4, 2, 3, 5, 2, 6, 3, 7] ***/ % vim: ft=zinc ts=4 sw=4 et % Ralph Becket % Wed Feb 25 16:43:52 EST 2009 % % Langford's problem (see e.g., http://www.lclark.edu/~miller/langford.html) % ------------------ % % Arrange k sets of 1..n such that successive occurrences of any number, k, % are separated by k other numbers. % There should be 26 solutions to this problem. int: k = 2; int: n = 7; int: nk = n * k; array [1..nk] of var 1..n: a; % The sequence. array [1..n] of var 1..nk: Fst; % Fst[k] is position of first k. % Break some symmetry. % constraint a[1] <= a[nk]; % Prune some domains. % constraint forall ( i in 1..n ) ( Fst[i] <= nk - (k - 1) * (i + 1) ); % The nitty gritty. % constraint forall ( i in 1..n, j in 0..(k - 1) ) ( a[Fst[i] + j * (i + 1)] = i ); solve :: int_search(Fst, first_fail, indomain_min, complete) satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/examples/zebra.mzn0000644000175000017500000001031213757304533020240 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution animal: [4, 1, 2, 5, 3] colour: [3, 5, 4, 1, 2] drink: [5, 2, 3, 4, 1] nation: [3, 4, 2, 1, 5] smoke: [3, 1, 2, 4, 5] ***/ % WHO OWNS THE ZEBRA? % % This is a puzzle which has been circulating the net. There are a couple % different versions out there which try to be a little more politically % correct but are essentially the same problem. % 1. There are five houses, each of a different color and inhabited by % men of different nationalities, with different pets, drinks, % and cigarettes. % 2. The Englishman lives in the red house. % 3. The Spaniard owns the dog. % 4. Coffee is drunk in the green house. % 5. The Ukrainian drinks tea. % 6. The green house is immediately to the right of the ivory house. % 7. The Old Gold smoker owns snails. % 8. Kools are smoked in the yellow house. % 9. Milk is drunk in the middle house. % 10. The Norwegian lives in the first house on the left. % 11. The man who smokes Chesterfields lives in the house next to the % man with the fox. % 12. Kools are smoked in the house next to the house where the horse is % kept. % 13. The Lucky Strike smoker drinks orange juice. % 14. The Japanese smoke Parliaments. % 15. The Norwegian lives next to the blue house. % NOW, who drinks water? And who owns the zebra? % MiniZinc Version % Peter Stuckey September 30 2006 include "globals.mzn"; %enum Nationalities = { English, Spanish, Ukrainian, Norwegian, Japanese }; set of int: Nationalities = 0..4; int: English = 0; int: Spanish = 1; int: Ukrainian = 2; int: Norwegian = 3; int: Japanese = 4; %enum Colours = { Red, Green, Ivory, Yellow, Blue }; set of int: Colours = 0..4; int: Red = 0; int: Green = 1; int: Ivory = 2; int: Yellow = 3; int: Blue = 4; %enum Animals = { Dog, Fox, Horse, Zebra, Snails }; set of int: Animals = 0..4; int: Dog = 0; int: Fox = 1; int: Horse = 2; int: Zebra = 3; int: Snails = 4; %enum Drinks = { Coffee, Tea, Milk, OrangeJuice, Water }; set of int: Drinks = 0..4; int: Coffee = 0; int: Tea = 1; int: Milk = 2; int: OrangeJuice = 3; int: Water = 4; %enum Cigarettes = { OldGold, Kools, Chesterfields, LuckyStrike, % Parliaments } ; set of int: Cigarettes = 0..4; int: OldGold = 0; int: Kools = 1; int: Chesterfields = 2; int: LuckyStrike = 3; int: Parliaments = 4; set of int: Houses = 1..5; array[Nationalities] of var Houses: nation; array[Colours] of var Houses: colour; array[Animals] of var Houses: animal; array[Drinks] of var Houses: drink; array[Cigarettes] of var Houses: smoke; predicate nextto(var Houses:h1, var Houses:h2) = h1 == h2 + 1 \/ h2 == h1 + 1; predicate rightof(var Houses:h1, var Houses:h2) = h1 == h2 + 1; predicate middle(var Houses:h) = h == 3; predicate left(var Houses:h) = h = 1; constraint alldifferent(nation) /\ alldifferent(colour) /\ alldifferent(animal) /\ alldifferent(drink) /\ alldifferent(smoke) /\ nation[English] == colour[Red] /\ nation[Spanish] == animal[Dog] /\ drink[Coffee] == colour[Green] /\ nation[Ukrainian] == drink[Tea] /\ colour[Green] `rightof` colour[Ivory] /\ smoke[OldGold] == animal[Snails] /\ smoke[Kools] == colour[Yellow] /\ middle(drink[Milk]) /\ left(nation[Norwegian]) /\ smoke[Chesterfields] `nextto` animal[Fox] /\ smoke[Kools] `nextto` animal[Horse] /\ smoke[LuckyStrike] == drink[OrangeJuice] /\ nation[Japanese] == smoke[Parliaments] /\ nation[Norwegian] `nextto` colour[Blue]; solve satisfy; output [ "zebra:\n", "nation = [", show(nation[0]), ", ", show(nation[1]), ", ", show(nation[2]), ", ", show(nation[3]), ", ", show(nation[4]), "]\n", "colour = [", show(colour[0]), ", ", show(colour[1]), ", ", show(colour[2]), ", ", show(colour[3]), ", ", show(colour[4]), "]\n", "animal = [", show(animal[0]), ", ", show(animal[1]), ", ", show(animal[2]), ", ", show(animal[3]), ", ", show(animal[4]), "]\n", "drink = [", show(drink[0]), ", ", show(drink[1]), ", ", show(drink[2]), ", ", show(drink[3]), ", ", show(drink[4]), "]\n", "smoke = [", show(smoke[0]), ", ", show(smoke[1]), ", ", show(smoke[2]), ", ", show(smoke[3]), ", ", show(smoke[4]), "]\n" ]; libminizinc-2.5.3/tests/spec/examples/product_lp.mzn0000644000175000017500000000360213757304533021314 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inside: [40, 0, 0] objective: 37200 outside: [60, 200, 300] ***/ % RUNS OM minizinc_cpx %% Product example from the OPL book! %% product_lp.mzn %% Ralph Becket June 26 2007 %% %% This is a version of product.mzn changed to use LP integers rather than %% LP floats (everything has been scaled up by 10). % This isn't needed, as "lp" is a built-in annotation in the G12 % implementation (although it's not listed as such in the Zinc spec). %annotation lp; %enum Products = {kluski, capellini, fettucine}; int: NumProducts = 3; set of int: Products = 1..NumProducts; int: kluski = 0; int: capellini = 1; int: fettucine = 2; %enum Resources = {flour, eggs}; int: NumResources = 2; set of int: Resources = 1..NumResources; int: flour = 0; int: eggs = 1; array[Products] of int: demand = [100, 200, 300]; array[Products] of int: insideCost = [60, 80, 30]; array[Products] of int: outsideCost = [80, 90, 40]; array[Products, Resources] of int: consumption = [| 5, 2 | 4, 4 | 3, 6 |]; array[Resources] of int: capacity = [200, 400]; array[Products] of var int: inside; array[Products] of var int: outside; constraint forall (p in Products) ( inside[p] >= 0 /\ outside[p] >= 0 ); constraint forall(r in Resources) ( sum (p in Products) ( consumption[p, r] * inside[p] ) <= capacity[r] ); constraint forall(p in Products) ( inside[p] + outside[p] >= demand[p] ); solve minimize sum (p in Products) ( insideCost[p]*inside[p] + outsideCost[p]*outside[p] ); output [ "production planning (LP version of integer model)\n", " \tkluski\t\tfettucine\tcapellini\n", "make inside: \t", show(inside[1]), "\t\t", show(inside[2]), "\t\t", show(inside[3]), "\n", "make outside: \t", show(outside[1]), "\t\t", show(outside[2]), "\t\t", show(outside[3]), "\n" ]; libminizinc-2.5.3/tests/spec/examples/battleships_7.mzn0000644000175000017500000003377413757304533021726 0ustar kaolkaol/*** !Test check_against: [] expected: - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 2 - 0 - 0 - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 4 - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 - !Result solution: !Solution a: - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 0 - - 0 - 0 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 2 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 4 - 0 - 0 - 0 - 1 - 2 - 3 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 2 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 1 - 0 - 0 - 2 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 col_sums: - 3 - 1 - 4 - 3 - 2 - 2 - 1 - 1 - 2 - 1 row_sums: - 3 - 2 - 2 - 1 - 4 - 0 - 3 - 1 - 3 - 1 extra_files: [] markers: [] options: all_solutions: false solvers: - gecode - cbc - chuffed type: solve ***/ % Example battleships problem for battleships.mzn. % include "battleships.mzn.model"; n = 10; a = array2d(ROW, COL, [| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 0, _, 0, 0, 0, 0, 0, _, _, _, _, 0 | 0, _, 0, _, 0, _, _, _, _, _, _, 0 | 0, 0, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, _, _, _, _, 0, 0, _, _, _, _, 0 | 0, _, _, _, _, 0, _, _, _, _, _, 0 | 0, _, _, _, _, 0, 0, _, _, _, _, 0 | 0, _, _, _, _, _, _, _, _, _, 0, 0 | 0, _, _, _, _, _, _, _, _, _, _, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |] ); constraint a[2, 2] > 0; constraint a[3, 4] > 0; constraint a[8, 7] > 0; row_sums = [3, 2, 2, 1, 4, 0, 3, 1, 3, 1]; col_sums = [3, 1, 4, 3, 2, 2, 1, 1, 2, 1]; n_classes = 4; class_sizes = [4, 3, 2, 1]; libminizinc-2.5.3/tests/spec/examples/halfreif.mzn0000644000175000017500000000052113757304533020716 0ustar kaolkaol/*** !Test expected: !Result status: OPTIMAL_SOLUTION solution: !Solution x: 0 y: 11 b1: false b2: true ***/ %% This is to test half-reification %% Gleb Belov, 2019 var 0..10: x; var 0..11: y; var bool: b1; var bool: b2; constraint b1 -> x<=4; constraint b2 -> y>=7; constraint b1 \/ b2; solve minimize x+b1-y; libminizinc-2.5.3/tests/spec/examples/packing.mzn0000644000175000017500000000422213757304533020554 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] # Too slow on cbc expected: - !Result solution: !Solution x: [0, 70, 75, 0, 79, 50, 0, 50, 46, 27, 52, 35, 59, 35, 35, 50, 27, 52, 46, 75, 50] y: [0, 70, 33, 50, 0, 0, 85, 29, 88, 93, 70, 65, 54, 50, 82, 54, 85, 63, 82, 29, 63] ***/ % TOO LONG mzn20_fd_linear % TOO LONG mzn20_mip %----------------------------------------------------------------------------- % Packing squares into a rectangle % % Guido Tack, tack@gecode.org % 2007-02-22 % % Ported from the Gecode example % %----------------------------------------------------------------------------- %----------------------------------------------------------------------------- % Specification int: pack_x; int: pack_y; int: n; array[1..n] of int: pack_s; % Instance %pack_x = 4; %pack_y = 4; %n = 4; %pack_s = [2,2,2,2]; pack_x = 112; pack_y = 112; n = 21; pack_s = [50,42,37,35,33,29,27,25,24,19,18,17,16,15,11,9,8,7,6,4,2]; %----------------------------------------------------------------------------- % Model array[1..n] of var 0..pack_x-1: x; array[1..n] of var 0..pack_y-1: y; constraint forall (i in 1..n) ( x[i] <= pack_x - pack_s[i] /\ y[i] <= pack_y - pack_s[i] ) /\ forall (i in 1..n, j in i+1..n) ( x[j] - x[i] >= pack_s[i] \/ x[i] - x[j] >= pack_s[j] \/ y[j] - y[i] >= pack_s[i] \/ y[i] - y[j] >= pack_s[j] ); % Symmetry breaking constraint forall (i in 1..n-1) ( if pack_s[i]=pack_s[i+1] then x[i] <= x[i+1] else true endif ); % Capacity constraints constraint forall (cx in 0..pack_x-1) ( sum (i in 1..n) (pack_s[i]*bool2int(x[i] in cx-pack_s[i]+1..cx)) = pack_x ) /\ forall (cy in 0..pack_y-1) ( sum (i in 1..n) (pack_s[i]*bool2int(y[i] in cy-pack_s[i]+1..cy)) = pack_y ); solve ::seq_search([int_search(x,smallest,indomain_min,complete), int_search(y,smallest,indomain_min,complete)]) satisfy; output [ "packing ",show(n)," squares into a ",show(pack_x),"x",show(pack_y), " rectangle:\n"] ++ [ "square "++show(i)++ ", size "++show(pack_s[i])++"x"++show(pack_s[i])++ ", at ("++show(x[i])++", "++show(y[i])++")\n" | i in 1..n]; libminizinc-2.5.3/tests/spec/unit/0000755000175000017500000000000013757304533015553 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/fdlp/0000755000175000017500000000000013757304533016500 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/fdlp/test_lp_solve_satisfy.mzn0000644000175000017500000000047513757304533023660 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution X: 6 - !Result status: SATISFIED solution: !Solution X: 7 - !Result status: SATISFIED solution: !Solution X: 8 - !Result status: SATISFIED solution: !Solution X: 9 ***/ var 0..9: X; constraint X > 5; solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/0000755000175000017500000000000013757304533017113 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/output/bug288c.mzn0000644000175000017500000000054413757304533021026 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: | Ok ***/ % Regression test for bug #288: (see bug288a.mzn for details). Check % that empty strings at the end of an output item do not affect the % detection of whether or not there is a terminating newline. var 1..10: x; solve satisfy; output ["Ok", "\n", "" ++ ""]; libminizinc-2.5.3/tests/spec/unit/output/show_float.mzn0000644000175000017500000000037613757304533022014 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: " 123.46@\n123.46 @\n123 @\n" ***/ float: f = 123.45679123; solve satisfy; output [ show_float(8, 2, f), "@\n", show_float(-8, 2, f), "@\n", show_float(-8, 0, f), "@\n", ]; libminizinc-2.5.3/tests/spec/unit/output/show_empty.mzn0000644000175000017500000000016413757304533022040 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '[]' ***/ output [show([])]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/bug288a.mzn0000644000175000017500000000043713757304533021025 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: 'Ok' ***/ % Regression test for bug #288: in the absence of a final newline in the % output item, solns2out was not outputting the soluion separators on % separate line. var 1..10: x; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/output/arg-reif-output.mzn0000644000175000017500000000024513757304533022674 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincError ***/ test test1(1..10: x) = true; solve satisfy; output [ if test1(11) then "DID NOT WORK" else "WORKED" endif ]; libminizinc-2.5.3/tests/spec/unit/output/test-in-output.mzn0000644000175000017500000000104613757304533022563 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution _output_item: | x = 1 y = 2 NO - !Solution _output_item: | x = 1 y = 2 YES options: all_solutions: true ***/ % Test that test items work in output items. test bar(string: s) = s = "foo" /\ fix(b); var bool: b; var 1..2: x; var 1..2: y; constraint x < y; solve satisfy; output [ "x = ", show(x), "\n", "y = ", show(y), "\n", if bar("foo") then "YES" else "NO" endif, "\n" ]; libminizinc-2.5.3/tests/spec/unit/output/show_float_set.mzn0000644000175000017500000000456413757304533022672 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution: y: - '{}' - '4.0..infinity' - '{2.0,3.0}' - '2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-1.0..1.0' - '-1.0..1.0 union 4.0..infinity' - '-1.0..1.0 union 2.0..2.0 union 3.0..3.0' - '-1.0..1.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '{-3.0,-2.0}' - '-3.0..-3.0 union -2.0..-2.0 union 4.0..infinity' - '{-3.0,-2.0,2.0,3.0}' - '-3.0..-3.0 union -2.0..-2.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-3.0..-3.0 union -2.0..-2.0 union -1.0..1.0' - '-3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 4.0..infinity' - '-3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0' - '-3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-infinity..-4.0' - '-infinity..-4.0 union 4.0..infinity' - '-infinity..-4.0 union 2.0..2.0 union 3.0..3.0' - '-infinity..-4.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-infinity..-4.0 union -1.0..1.0' - '-infinity..-4.0 union -1.0..1.0 union 4.0..infinity' - '-infinity..-4.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0' - '-infinity..-4.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union 4.0..infinity' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union 2.0..2.0 union 3.0..3.0' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union -1.0..1.0' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 4.0..infinity' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0' - '-infinity..-4.0 union -3.0..-3.0 union -2.0..-2.0 union -1.0..1.0 union 2.0..2.0 union 3.0..3.0 union 4.0..infinity' ***/ array [1..5] of set of float: x = [ -infinity..-4.0, {-3.0, -2.0}, -1.0..1.0, {2.0, 3.0}, 4.0..infinity ]; function set of float: s(bool: b, set of float: x) = if b then x else {} endif; array [1..32] of string: y :: add_to_output = [ show( s(a, x[1]) union s(b, x[2]) union s(c, x[3]) union s(d, x[4]) union s(e, x[5]) ) | a, b, c, d, e in [false, true] ];libminizinc-2.5.3/tests/spec/unit/output/bug288b.mzn0000644000175000017500000000045513757304533021026 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: 'Ok' ***/ % Regression test for bug #288: (see bug288a.mzn for details). Check % that we do not get double newlines printed when the output expression % _is_ terminated by a newline. var 1..10: x; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom1.mzn0000644000175000017500000000017713757304533022117 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '{}' ***/ output [show(index_set([]))]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/very_empty_set.mzn0000644000175000017500000000054113757304533022717 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [] ***/ % Regression test: the frontend was not pushing the coercions into *both* % arguments of the array1d cast. This was leading to mzn2fzn to fail % because the types in the assignment did not match. array[1..0] of var set of 1..10: x :: add_to_output = array1d({}, []); solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom6.mzn0000644000175000017500000000026113757304533022116 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '[1, _, _, _, _, _, _, _]' ***/ solve satisfy; output [show(array3d(1..2,1..2,1..2,[1,_,_,_,_,_,_,_]))]; libminizinc-2.5.3/tests/spec/unit/output/very_empty.mzn0000644000175000017500000000053013757304533022042 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [] ***/ % Regression test: the frontend was not pushing the coercions into *both* % arguments of the array1d cast. This was leading to mzn2fzn to fail % because the types in the assignment did not match. array[1..0] of var int: x :: add_to_output = array1d({}, []); solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom5.mzn0000644000175000017500000000022713757304533022117 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '3' ***/ var -10..10: x = length([1, _, _]); solve satisfy; output([show(x)]); libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom4.mzn0000644000175000017500000000022513757304533022114 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '0' ***/ int: x = length([]) + length([]); solve satisfy; output([show(x)]); libminizinc-2.5.3/tests/spec/unit/output/array-ann.mzn0000644000175000017500000000042413757304533021531 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution _output_item: Ok ***/ % Check that arrays of annotation varibles (and assignments to such) do % not get emitted in .ozn files. array[1..3] of ann: foo; solve satisfy; output ["Ok"]; foo = [first_fail, domain, bounds]; libminizinc-2.5.3/tests/spec/unit/output/show_int.mzn0000644000175000017500000000044413757304533021475 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: "561@\n 561@\n561 @\n1234567@\n" ***/ var int: x; constraint x > 560; constraint x < 562; solve satisfy; output [ show_int(0, x), "@\n", show_int(4, x), "@\n", show_int(-4, x), "@\n", show_int(4, 1234567), "@\n" ]; libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom2.mzn0000644000175000017500000000021013757304533022104 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '1..3' ***/ output [show(index_set([1, _, _]))]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/mzn_bottom3.mzn0000644000175000017500000000022313757304533022111 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: '1..2' ***/ output [show(index_set_1of2([|1, _ | 1, _|]))]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/output/show_int_set.mzn0000644000175000017500000000313013757304533022343 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution: y: - '{}' - '7..infinity' - '{3,5}' - '{3,5} union 7..infinity' - '-1..1' - '{-1,0,1} union 7..infinity' - '{-1,0,1,3,5}' - '{-1,0,1,3,5} union 7..infinity' - '{-5,-3}' - '{-5,-3} union 7..infinity' - '{-5,-3,3,5}' - '{-5,-3,3,5} union 7..infinity' - '{-5,-3,-1,0,1}' - '{-5,-3,-1,0,1} union 7..infinity' - '{-5,-3,-1,0,1,3,5}' - '{-5,-3,-1,0,1,3,5} union 7..infinity' - '-infinity..-7' - '-infinity..-7 union {} union 7..infinity' - '-infinity..-7 union {3,5}' - '-infinity..-7 union {3,5} union 7..infinity' - '-infinity..-7 union {-1,0,1}' - '-infinity..-7 union {-1,0,1} union 7..infinity' - '-infinity..-7 union {-1,0,1,3,5}' - '-infinity..-7 union {-1,0,1,3,5} union 7..infinity' - '-infinity..-7 union {-5,-3}' - '-infinity..-7 union {-5,-3} union 7..infinity' - '-infinity..-7 union {-5,-3,3,5}' - '-infinity..-7 union {-5,-3,3,5} union 7..infinity' - '-infinity..-7 union {-5,-3,-1,0,1}' - '-infinity..-7 union {-5,-3,-1,0,1} union 7..infinity' - '-infinity..-7 union {-5,-3,-1,0,1,3,5}' - '-infinity..-7 union {-5,-3,-1,0,1,3,5} union 7..infinity' ***/ array [1..5] of set of int: x = [ -infinity..-7, {-5, -3}, -1..1, {3, 5}, 7..infinity ]; function set of int: s(bool: b, set of int: x) = if b then x else {} endif; array [1..32] of string: y :: add_to_output = [ show( s(a, x[1]) union s(b, x[2]) union s(c, x[3]) union s(d, x[4]) union s(e, x[5]) ) | a, b, c, d, e in [false, true] ];libminizinc-2.5.3/tests/spec/unit/json/0000755000175000017500000000000013757304533016524 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/json/json_input_set.mzn0000644000175000017500000000040313757304533022312 0ustar kaolkaol/*** !Test extra_files: - json_input_set.json expected: !Result solution: !Solution _output_item: 'x = {1,2,3,4,6,9,10,11}, y = 1.0..1.0 union 2.0..4.0 union 6.0..6.0 union 9.0..11.0' ***/ set of int: x; set of float: y; output ["x = \(x), y = \(y)"];libminizinc-2.5.3/tests/spec/unit/json/json_input_str.mzn0000644000175000017500000000031613757304533022332 0ustar kaolkaol/*** !Test extra_files: - json_input_str.json expected: !Result solution: !Solution s: "abcd" ss: ["abc", "def", "ghi"] ***/ string: s ::add_to_output; array[int] of string: ss ::add_to_output; libminizinc-2.5.3/tests/spec/unit/json/json_input_1.json0000644000175000017500000000045013757304533022026 0ustar kaolkaol{ "int_set" : { "set" : [[1,2],[4,5],7,9]}, "float_set" : { "set" : [1.0,2.0]}, "array_1d_float" : [1.0, 2.0, 3.0], "array_2d_bool" : [[true]], "array_3d_int" : [[[1, 2], [3, 4]], [[5, 6], [7, 8]]], "array_opt_float" : [1.5, null], "x" : 1, "y" : 2.0, "z" : true, "o" : null }libminizinc-2.5.3/tests/spec/unit/json/json_input_set.json0000644000175000017500000000017013757304533022460 0ustar kaolkaol{ "x": {"set" : [1, 3, [2, 4], 6, 10, [9, 11]]}, "y": {"set" : [1.0, 3.0, [2.0, 4.0], 6.0, 10.0, [9.0, 11.0]]} }libminizinc-2.5.3/tests/spec/unit/json/coerce_enum_str.json0000644000175000017500000000013713757304533022574 0ustar kaolkaol{ "d": "Mon", "darr": ["Fri", "Sat", "Sun"], "dset" : { "set" : ["Fri", "Sat", "Sun"]} } libminizinc-2.5.3/tests/spec/unit/json/json_input_1.mzn0000644000175000017500000000142313757304533021662 0ustar kaolkaol/*** !Test extra_files: - json_input_1.json expected: !Result solution: !Solution int_set: !!set {1, 2, 4, 5, 7, 9} float_set: !!set {1.0, 2.0} array_1d_float: [1.0, 2.0, 3.0] array_2d_bool: [[true]] array_3d_int: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] array_opt_float: [1.5, null] x: 1 y: 2.0 z: true o: null ***/ set of int: int_set :: add_to_output; set of float: float_set :: add_to_output; array [1..3] of float: array_1d_float :: add_to_output; array [1..1, 1..1] of bool: array_2d_bool :: add_to_output; array [1..2, 1..2, 1..2] of int: array_3d_int :: add_to_output; array [1..2] of opt float: array_opt_float :: add_to_output; int: x :: add_to_output; float: y :: add_to_output; bool: z :: add_to_output; opt int: o :: add_to_output;libminizinc-2.5.3/tests/spec/unit/json/coerce_indices.mzn0000644000175000017500000000107213757304533022210 0ustar kaolkaol/*** !Test extra_files: - coerce_indices.json expected: !Result solution: !Solution offset1d: [-10,-9,-8] offset2d: [[1, 2], [3, 4]] coerce1d: [[[1, 2, 3], [4, 5, 6]]] singleUndef: [1, 2, 3] coerceCalc: [[1, 2], [3, 4]] ndimEmpty: [] ***/ array[-10..-8] of int: offset1d ::add_to_output; array[4..5, 0..1] of int: offset2d ::add_to_output; array[1..1, 1..2, 1..3] of int: coerce1d ::add_to_output; array[2..3, int] of int: coerceCalc ::add_to_output; array[int] of int: singleUndef ::add_to_output; array[int, 1..2] of int: ndimEmpty ::add_to_output; libminizinc-2.5.3/tests/spec/unit/json/coerce_set.mzn0000644000175000017500000000023613757304533021366 0ustar kaolkaol/*** !Test extra_files: - coerce_set.json solvers: [gecode] expected: !Result solution: !Solution s: !!set {1, 2, 3} ***/ set of int: s ::add_to_output; libminizinc-2.5.3/tests/spec/unit/json/coerce_enum_str.mzn0000644000175000017500000000051713757304533022431 0ustar kaolkaol/*** !Test extra_files: - coerce_enum_str.json solvers: [gecode] expected: !Result solution: !Solution d: "Mon" darr: ["Fri", "Sat", "Sun"] dset: !!set {"Fri", "Sat", "Sun"} ***/ enum Day = {Mon, Tue, Wed, Thu, Fri, Sat, Sun}; Day: d ::add_to_output; array[int] of Day: darr ::add_to_output; set of Day: dset ::add_to_output; libminizinc-2.5.3/tests/spec/unit/json/enum_array_xd.mzn0000644000175000017500000000056013757304533022110 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution arr2d: [[A,B],[C,D]] arr3d: [[[E,F],[G,H]],[[I,J],[K,L]]] ***/ include "strictly_increasing.mzn"; enum FOUR = {A,B,C,D}; array[1..2,1..2] of var FOUR: arr2d; constraint strictly_increasing(arr2d); enum EIGHT = {E,F,G,H,I,J,K,L}; array[1..2,1..2,1..2] of var EIGHT: arr3d; constraint strictly_increasing(arr3d); libminizinc-2.5.3/tests/spec/unit/json/coerce_enum_str_err.mzn0000644000175000017500000000041513757304533023276 0ustar kaolkaol/*** !Test extra_files: - coerce_enum_str_err.json solvers: [gecode] expected: !Error regex: .*has invalid type-inst.* ***/ enum Day = {Mon, Tue, Wed, Thu, Fri, Sat, Sun}; enum Month = {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Oct, Nov, Dec}; Day: d ::add_to_output; libminizinc-2.5.3/tests/spec/unit/json/coerce_set.json0000644000175000017500000000002313757304533021525 0ustar kaolkaol{ "s": [1,2,3] } libminizinc-2.5.3/tests/spec/unit/json/coerce_indices.json0000644000175000017500000000025513757304533022357 0ustar kaolkaol{ "offset1d": [-10,-9,-8], "offset2d": [[1, 2], [3, 4]], "coerce1d": [1, 2, 3, 4, 5, 6], "coerceCalc": [1, 2, 3, 4], "singleUndef": [1, 2, 3], "ndimEmpty": [] } libminizinc-2.5.3/tests/spec/unit/json/coerce_enum_str_err.json0000644000175000017500000000002113757304533023434 0ustar kaolkaol{ "d": "Jan" } libminizinc-2.5.3/tests/spec/unit/json/json_input_str.json0000644000175000017500000000006113757304533022474 0ustar kaolkaol{ "s": "abcd", "ss": ["abc", "def", "ghi"] } libminizinc-2.5.3/tests/spec/unit/compilation/0000755000175000017500000000000013757304533020071 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/compilation/optimization.mzn0000644000175000017500000000111013757304533023336 0ustar kaolkaol/*** --- !Test type: compile solvers: [gecode] options: -O0: true expected: !FlatZinc optimization_0.fzn --- !Test type: compile solvers: [gecode] options: -O1: true expected: !FlatZinc optimization_1.fzn --- !Test type: compile solvers: [gecode] options: -O2: true expected: !FlatZinc optimization_2.fzn --- !Test type: compile solvers: [gecode] options: -O3: true expected: !FlatZinc optimization_3.fzn ***/ var 1..10: x; var set of 1..10: y; var bool: z; constraint forall (i in y) (i mod 2 = 1); constraint x >= 5 <-> x in y; constraint x > 2 -> not z; constraint z;libminizinc-2.5.3/tests/spec/unit/compilation/optimization_1.fzn0000644000175000017500000000067213757304533023563 0ustar kaolkaolvar 1..2: x:: output_var; var set of 1..10: y:: output_var; var bool: X_INTRODUCED_20_ ::var_is_introduced :: is_defined_var; constraint set_in_reif(x,y,X_INTRODUCED_20_):: defines_var(X_INTRODUCED_20_); constraint set_in_reif(2,y,false); constraint set_in_reif(4,y,false); constraint set_in_reif(6,y,false); constraint set_in_reif(8,y,false); constraint set_in_reif(10,y,false); constraint int_le_reif(5,x,X_INTRODUCED_20_); solve satisfy; libminizinc-2.5.3/tests/spec/unit/compilation/aggregation.fzn0000644000175000017500000000043013757304533023074 0ustar kaolkaolarray [1..2] of int: X_INTRODUCED_3_ = [1,1]; var 1..4: X_INTRODUCED_0_; var 1..4: X_INTRODUCED_1_; array [1..2] of var int: xs:: output_array([1..2]) = [X_INTRODUCED_0_,X_INTRODUCED_1_]; constraint int_lin_le(X_INTRODUCED_3_,[X_INTRODUCED_0_,X_INTRODUCED_1_],5); solve satisfy; libminizinc-2.5.3/tests/spec/unit/compilation/aggregation.mzn0000644000175000017500000000075413757304533023114 0ustar kaolkaol/*** --- !Test type: compile solvers: [gecode] expected: !FlatZinc aggregation.fzn ***/ % This tests is dependend on the successful aggregation of sum(xs) into the % int_lin_le expression and the removal of intermediate value for sum(xs) that % is created array[1..2] of var 1..4: xs; predicate my_lin(array [int] of int: as,array [int] of var int: bs,int: c); predicate int_lin_eq(array [int] of int: as,array [int] of var int: bs,int: c) = my_lin(as, bs, c); constraint sum(xs) <= 5; libminizinc-2.5.3/tests/spec/unit/compilation/optimization_2.fzn0000644000175000017500000000050013757304533023552 0ustar kaolkaolvar 1..2: x:: output_var; var set of 1..10: y:: output_var; constraint set_in_reif(2,y,false); constraint bool_not(false,true); constraint set_in_reif(4,y,false); constraint set_in_reif(6,y,false); constraint set_in_reif(8,y,false); constraint set_in_reif(10,y,false); constraint set_in_reif(x,y,false); solve satisfy; libminizinc-2.5.3/tests/spec/unit/compilation/cv_domain.mzn0000644000175000017500000000045513757304533022562 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution xs: [3, 3, 3, 3, 3] y: 15 ***/ include "increasing.mzn"; function int: partial_bound(array[int] of var int: xs) = let { constraint increasing(xs); } in 5; array[1..5] of var 3..7: xs; var partial_bound(xs)..15: y; constraint sum(xs) = y; libminizinc-2.5.3/tests/spec/unit/compilation/optimization_3.fzn0000644000175000017500000000050013757304533023553 0ustar kaolkaolvar 1..2: x:: output_var; var set of 1..10: y:: output_var; constraint set_in_reif(2,y,false); constraint bool_not(false,true); constraint set_in_reif(4,y,false); constraint set_in_reif(6,y,false); constraint set_in_reif(8,y,false); constraint set_in_reif(10,y,false); constraint set_in_reif(x,y,false); solve satisfy; libminizinc-2.5.3/tests/spec/unit/compilation/has_ann.mzn0000644000175000017500000000046213757304533022230 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result solution: !Solution b: true ***/ ann: ann_test; predicate add_ann(var int: x) = annotate(x, ann_test); predicate get_ann(var int: x, var bool: b) = b <-> has_ann(x, ann_test); var 1..2: x; var bool: b; constraint add_ann(x); constraint get_ann(x, b); libminizinc-2.5.3/tests/spec/unit/compilation/optimization_0.fzn0000644000175000017500000000415313757304533023560 0ustar kaolkaolpredicate int_le_imp(var int: a,var int: b,var bool: r); var 1..10: x:: output_var; var set of 1..10: y:: output_var; var bool: X_INTRODUCED_2_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_3_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_6_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_7_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_10_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_11_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_14_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_15_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_18_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_19_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_20_ ::var_is_introduced :: is_defined_var; var bool: X_INTRODUCED_21_ ::var_is_introduced :: is_defined_var; var bool: z = true; constraint array_bool_and([true,X_INTRODUCED_3_,true,X_INTRODUCED_7_,true,X_INTRODUCED_11_,true,X_INTRODUCED_15_,true,X_INTRODUCED_19_],true); constraint set_in_reif(x,y,X_INTRODUCED_20_):: defines_var(X_INTRODUCED_20_); constraint bool_clause([X_INTRODUCED_21_],[z]); constraint bool_not(X_INTRODUCED_2_,X_INTRODUCED_3_):: defines_var(X_INTRODUCED_3_); constraint bool_not(X_INTRODUCED_6_,X_INTRODUCED_7_):: defines_var(X_INTRODUCED_7_); constraint bool_not(X_INTRODUCED_10_,X_INTRODUCED_11_):: defines_var(X_INTRODUCED_11_); constraint bool_not(X_INTRODUCED_14_,X_INTRODUCED_15_):: defines_var(X_INTRODUCED_15_); constraint bool_not(X_INTRODUCED_18_,X_INTRODUCED_19_):: defines_var(X_INTRODUCED_19_); constraint set_in_reif(2,y,X_INTRODUCED_2_):: defines_var(X_INTRODUCED_2_); constraint set_in_reif(4,y,X_INTRODUCED_6_):: defines_var(X_INTRODUCED_6_); constraint set_in_reif(6,y,X_INTRODUCED_10_):: defines_var(X_INTRODUCED_10_); constraint set_in_reif(8,y,X_INTRODUCED_14_):: defines_var(X_INTRODUCED_14_); constraint set_in_reif(10,y,X_INTRODUCED_18_):: defines_var(X_INTRODUCED_18_); constraint int_le_reif(5,x,X_INTRODUCED_20_); constraint int_le_imp(x,2,X_INTRODUCED_21_):: defines_var(X_INTRODUCED_21_); solve satisfy; libminizinc-2.5.3/tests/spec/unit/test-globals-float.mzn0000644000175000017500000000347013757304533022010 0ustar kaolkaol/*** !Test solvers: [gecode, cbc] expected: - !Result solution: !Solution inc_avf: [1.0, 2.0, 2.0] min_vf1: !Approx 0.0 min_vf2: !Approx 0.0 max_vf1: !Approx 9.9 max_vf2: !Approx 0.0 - !Result solution: !Solution inc_avf: [1.0, 2.0, 2.0] min_vf1: !Approx 0.0 min_vf2: !Approx 0.0 max_vf1: !Approx 9.9 max_vf2: !Approx 9.9 ***/ %-----------------------------------------------------------------------------% % This file tests the global constraints in globals.mzn that involve % variables of type `var float'. %-----------------------------------------------------------------------------% include "globals.mzn"; % Variable naming scheme: all variables for a constraint get a common % prefix based on the constraint name, eg. "alldiff". %-----------------------------------------------------------------------------% % increasing %-----------------------------------------------------------------------------% % test satisfaction array[1..3] of var float: inc_avf :: add_to_output = [1.0, 2.0, _]; constraint increasing(inc_avf); %-----------------------------------------------------------------------------% % minimum, maximum %-----------------------------------------------------------------------------% var 0.0..20.0: min_vf1 :: add_to_output; var 0.0..20.0: min_vf2 :: add_to_output; var 0.0..20.0: max_vf1 :: add_to_output; var 0.0..20.0: max_vf2 :: add_to_output; % XXX: min/2 for floats not yet handled constraint minimum(min_vf1, [5.5, 3.3, 8.8, 0.0, 4.4]); constraint minimum(0.0, [5.5, 3.3, 8.8, min_vf2, 4.4]); % XXX: max/2 for floats not yet handled constraint maximum(max_vf1, [5.5, 3.3, 8.8, 9.9, 4.4]); constraint maximum(9.9, [5.5, 3.3, 8.8, max_vf2, 4.4]); %-----------------------------------------------------------------------------% solve satisfy; libminizinc-2.5.3/tests/spec/unit/optional/0000755000175000017500000000000013757304533017400 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_var_opt_int.mzn0000644000175000017500000000113413757304533026214 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: 2 - !Solution a: [false, true, true] x: 1 ***/ array [1..3] of var bool: a :: add_to_output; array [1..3] of var opt 1..2: b :: add_to_output; var opt 1..2: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_var_opt_int(a, b, x); constraint absent(b[1]) /\ occurs(b[2]) /\ occurs(b[3]); constraint b[2] < b[3];libminizinc-2.5.3/tests/spec/unit/optional/test-opt-binop-flatten.mzn0000644000175000017500000000047113757304533024447 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed, cbc] expected: !Result solution: !Solution z: 5 status: SATISFIED ***/ % Checks to ensure that correct evaluation is done when flattening vars that are actually par var opt int: x = 10; var opt int: y = 5; var opt int: z :: add_to_output :: mzn_break_here = x - y;libminizinc-2.5.3/tests/spec/unit/optional/test-opt-if-then-else.mzn0000644000175000017500000000147313757304533024170 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: 1 y: null p: false a: 1 b: null c: null - !Solution x: null y: 1 p: false a: 1 b: 1 c: null - !Solution x: null y: 1 p: true a: null b: null c: null - !Solution x: 1 y: null p: true a: null b: 1 c: null status: ALL_SOLUTIONS ***/ % Test various if-then-else cases with opt var opt 1..1: x :: add_to_output; var opt 1..1: y :: add_to_output; var bool: p :: add_to_output; var opt int: a :: add_to_output = if p then <> else 1 endif; var opt int: b :: add_to_output = if p then x else y endif; bool: q = true; opt int: c :: add_to_output = if q then <> else 1 endif; constraint not (x = y);libminizinc-2.5.3/tests/spec/unit/optional/test-opt-compute-bounds.mzn0000644000175000017500000000044313757304533024650 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed, cbc] expected: !Result solution: !Solution z: 10 status: SATISFIED ***/ % Checks to ensure that bounds computation can deal with absent values var opt int: x = 10; var opt int: y = <>; var opt int: z :: add_to_output :: mzn_break_here = x - y;libminizinc-2.5.3/tests/spec/unit/optional/test-opt-int-2.mzn0000644000175000017500000000007013757304533022631 0ustar kaolkaolarray [1..3] of var opt 1..5: x; constraint sum(x) = 5;libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-1.mzn0000644000175000017500000000123113757304533022771 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed, cbc] expected: !Result solution: !Solution conjunction: [true, false, true, false, false, false, true, false, true] disjunction: [false, false, true, false, false, true, true, true, true] negation: [null, true, false] status: SATISFIED ***/ % conjunction of var opt bool array [1..9] of bool: conjunction :: add_to_output = [x /\ y | x, y in [<>, false, true]]; % disjunction of var opt bool array [1..9] of bool: disjunction :: add_to_output = [x \/ y | x, y in [<>, false, true]]; % not of var opt bool array [1..3] of opt bool: negation:: add_to_output = [not x | x in [<>, false, true]]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/optional/test-opt-int-3.mzn0000644000175000017500000000007413757304533022636 0ustar kaolkaolarray [1..3] of var opt 1..5: x; constraint product(x) = 6;libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-6.mzn0000644000175000017500000000216713757304533023007 0ustar kaolkaol/*** !Test expected: - !Result solution: !SolutionSet - !Solution x: - true - null - null - !Solution x: - true - false - null - !Solution x: - true - null - false - !Solution x: [true, false, false] - !Solution x: - null - true - null - !Solution x: - false - true - null - !Solution x: - null - true - false - !Solution x: [false, true, false] - !Solution x: - true - true - null - !Solution x: [true, true, false] - !Solution x: - null - null - true - !Solution x: - false - null - true - !Solution x: - null - false - true - !Solution x: [false, false, true] - !Solution x: - true - null - true - !Solution x: [true, false, true] - !Solution x: - null - true - true - !Solution x: [false, true, true] - !Solution x: [true, true, true] status: ALL_SOLUTIONS options: all_solutions: true solvers: [gecode, chuffed] ***/ array [1..3] of var opt bool: x; constraint exists (x);libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-5.mzn0000644000175000017500000000115213757304533022777 0ustar kaolkaol/*** !Test expected: - !Result solution: !SolutionSet - !Solution x: - null - null - null - !Solution x: - true - null - null - !Solution x: - null - true - null - !Solution x: - true - true - null - !Solution x: - null - null - true - !Solution x: - true - null - true - !Solution x: - null - true - true - !Solution x: [true, true, true] status: ALL_SOLUTIONS options: all_solutions: true solvers: [gecode, chuffed] ***/ array [1..3] of var opt bool: x; constraint forall (x);libminizinc-2.5.3/tests/spec/unit/optional/test-opt-float-1.mzn0000644000175000017500000000116613757304533023152 0ustar kaolkaol/*** !Test solvers: [gecode, cbc] expected: - !Result status: SATISFIED solution: !Solution x: [1.0, null] - !Result status: SATISFIED solution: !Solution x: [null, 1.0] ***/ %-----------------------------------------------------------------------------% % This file tests the opt float vars %-----------------------------------------------------------------------------% include "globals.mzn"; array[1..2] of var opt 1.0..2.0: x::add_to_output; constraint sum(x)=1.0; % This fails: %constraint x[1]+x[2]=1.0; %-----------------------------------------------------------------------------% solve satisfy; libminizinc-2.5.3/tests/spec/unit/optional/test-opt-int-1.mzn0000644000175000017500000000303513757304533022634 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed, cbc] expected: !Result solution: !Solution addn: [0, -2, -1, 0, 1, 2, -2, -4, -3, -2, -1, 0, -1, -3, -2, -1, 0, 1, 0, -2, -1, 0, 1, 2, 1, -1, 0, 1, 2, 3, 2, 0, 1, 2, 3, 4] subn: [null, null, null, null, null, null, -2, 0, -1, -2, -3, -4, -1, 1, 0, -1, -2, -3, 0, 2, 1, 0, -1, -2, 1, 3, 2, 1, 0, -1, 2, 4, 3, 2, 1, 0] prod: [1, -2, -1, 0, 1, 2, -2, 4, 2, 0, -2, -4, -1, 2, 1, 0, -1, -2, 0, 0, 0, 0, 0, 0, 1, -2, -1, 0, 1, 2, 2, -4, -2, 0, 2, 4] divn: [null, null, null, null, null, -2, 1, 2, -2, -1, -1, 0, 1, -1, 0, 1, 0, -1, 1, 0, 2, -1, -2, 2, 1] gt: [true, true, true, true, false, false, true, true, false] ge: [true, true, true, true, true, false, true, true, true] lt: [true, true, true, true, false, true, true, false, false] le: [true, true, true, true, true, true, true, false, true] status: SATISFIED ***/ array [1..36] of int: addn :: add_to_output = [x + y | x, y in [<>, -2, -1, 0, 1, 2]]; array [1..36] of opt int: subn :: add_to_output = [x - y | x, y in [<>, -2, -1, 0, 1, 2]]; array [1..36] of int: prod :: add_to_output = [x * y | x, y in [<>, -2, -1, 0, 1, 2]]; array [1..25] of opt int: divn :: add_to_output = [x div y | x, y in [<>, -2, -1, 1, 2]]; array [1..9] of bool: gt :: add_to_output = [ x > y | x, y in [<>, 0, 1]]; array [1..9] of bool: ge :: add_to_output = [ x >= y | x, y in [<>, 0, 1]]; array [1..9] of bool: lt :: add_to_output = [ x < y | x, y in [<>, 0, 1]]; array [1..9] of bool: le :: add_to_output = [ x <= y | x, y in [<>, 0, 1]]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-2.mzn0000644000175000017500000000053313757304533022776 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: true y: true - !Solution x: true y: null - !Solution x: null y: true - !Solution x: null y: null status: ALL_SOLUTIONS ***/ var opt bool: x; var opt bool: y; constraint x /\ y;libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-3.mzn0000644000175000017500000000060313757304533022775 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: true y: true - !Solution x: true y: null - !Solution x: null y: true - !Solution x: false y: true - !Solution x: true y: false status: ALL_SOLUTIONS ***/ var opt bool: x; var opt bool: y; constraint x \/ y;libminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_opt_int.mzn0000644000175000017500000000073513757304533025352 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: 2 - !Solution a: [false, true, true] x: 1 ***/ array [1..3] of var bool: a :: add_to_output; var opt 1..2: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_opt_int(a, [<>, 1, 2], x);libminizinc-2.5.3/tests/spec/unit/optional/test-opt-bool-4.mzn0000644000175000017500000000051613757304533023001 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: true y: false - !Solution x: false y: true - !Solution x: null y: null status: ALL_SOLUTIONS ***/ var opt bool: x :: add_to_output; var opt bool: y :: add_to_output = not x; libminizinc-2.5.3/tests/spec/unit/optional/test-opt-float-2.mzn0000644000175000017500000000351713757304533023155 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed, cbc] expected: !Result solution: !Solution addn: [0.0, -2.0, -1.0, 0.0, 1.0, 2.0, -2.0, -4.0, -3.0, -2.0, -1.0, 0.0, -1.0, -3.0, -2.0, -1.0, 0.0, 1.0, 0.0, -2.0, -1.0, 0.0, 1.0, 2.0, 1.0, -1.0, 0.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 2.0, 3.0, 4.0] subn: [null, null, null, null, null, null, -2.0, 0.0, -1.0, -2.0, -3.0, -4.0, -1.0, 1.0, 0.0, -1.0, -2.0, -3.0, 0.0, 2.0, 1.0, 0.0, -1.0, -2.0, 1.0, 3.0, 2.0, 1.0, 0.0, -1.0, 2.0, 4.0, 3.0, 2.0, 1.0, 0.0] prod: [1.0, -2.0, -1.0, 0.0, 1.0, 2.0, -2.0, 4.0, 2.0, 0.0, -2.0, -4.0, -1.0, 2.0, 1.0, 0.0, -1.0, -2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -2.0, -1.0, 0.0, 1.0, 2.0, 2.0, -4.0, -2.0, 0.0, 2.0, 4.0] divn: [null, null, null, null, null, -2.0, 1.0, 2.0, -2.0, -1.0, -1.0, 0.5, 1.0, -1.0, -0.5, 1.0, -0.5, -1.0, 1.0, 0.5, 2.0, -1.0, -2.0, 2.0, 1.0] gt: [true, true, true, true, false, false, true, true, false] ge: [true, true, true, true, true, false, true, true, true] lt: [true, true, true, true, false, true, true, false, false] le: [true, true, true, true, true, true, true, false, true] status: SATISFIED ***/ array [1..36] of float: addn :: add_to_output = [x + y | x, y in [<>, -2.0, -1.0, 0.0, 1.0, 2.0]]; array [1..36] of opt float: subn :: add_to_output = [x - y | x, y in [<>, -2.0, -1.0, 0.0, 1.0, 2.0]]; array [1..36] of float: prod :: add_to_output = [x * y | x, y in [<>, -2.0, -1.0, 0.0, 1.0, 2.0]]; array [1..25] of opt float: divn :: add_to_output = [x / y | x, y in [<>, -2.0, -1.0, 1.0, 2.0]]; array [1..9] of bool: gt :: add_to_output = [ x > y | x, y in [<>, 0.0, 1.0]]; array [1..9] of bool: ge :: add_to_output = [ x >= y | x, y in [<>, 0.0, 1.0]]; array [1..9] of bool: lt :: add_to_output = [ x < y | x, y in [<>, 0.0, 1.0]]; array [1..9] of bool: le :: add_to_output = [ x <= y | x, y in [<>, 0.0, 1.0]]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_opt_bool.mzn0000644000175000017500000000075413757304533025514 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: false - !Solution a: [false, true, true] x: true ***/ array [1..3] of var bool: a :: add_to_output; var opt bool: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_opt_bool(a, [<>, true, false], x);libminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_var_opt_bool.mzn0000644000175000017500000000114513757304533026357 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: false - !Solution a: [false, true, true] x: true ***/ array [1..3] of var bool: a :: add_to_output; array [1..3] of var opt bool: b :: add_to_output; var opt bool: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_var_opt_bool(a, b, x); constraint absent(b[1]) /\ occurs(b[2]) /\ occurs(b[3]); constraint b[2] > b[3]; libminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_opt_float.mzn0000644000175000017500000000076613757304533025671 0ustar kaolkaol/*** !Test solvers: [gecode] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: 2.4 - !Solution a: [false, true, true] x: 1.2 ***/ array [1..3] of var bool: a :: add_to_output; var opt {1.2, 2.4}: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_opt_float(a, [<>, 1.2, 2.4], x) :: mzn_break_here;libminizinc-2.5.3/tests/spec/unit/optional/test_if_then_else_var_opt_float.mzn0000644000175000017500000000114513757304533026531 0ustar kaolkaol/*** !Test solvers: [gecode] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: [true, false, true] x: null - !Solution a: [true, true, true] x: null - !Solution a: [false, false, true] x: 2.4 - !Solution a: [false, true, true] x: 1.2 ***/ array [1..3] of var bool: a :: add_to_output; array [1..3] of var opt {1.2, 2.4}: b :: add_to_output; var opt {1.0, 2.0}: x :: add_to_output; constraint a[3]; constraint fzn_if_then_else_var_opt_float(a, b, x); constraint absent(b[1]) /\ occurs(b[2]) /\ occurs(b[3]); constraint b[2] < b[3];libminizinc-2.5.3/tests/spec/unit/search/0000755000175000017500000000000013757304533017020 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/search/int_choice_1.mzn0000644000175000017500000000072313757304533022074 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [1, 5, 8, 6, 3, 7, 2, 4] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, input_order, indomain_min, complete ) satisfy; libminizinc-2.5.3/tests/spec/unit/search/int_choice_2.mzn0000644000175000017500000000072313757304533022075 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [8, 4, 1, 3, 6, 2, 7, 5] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, input_order, indomain_max, complete ) satisfy; libminizinc-2.5.3/tests/spec/unit/search/int_var_select_3.mzn0000644000175000017500000000105313757304533022770 0ustar kaolkaol/*** --- !Test solvers: [chuffed] expected: - !Result solution: !Solution q: [1, 7, 4, 6, 8, 2, 5, 3] - !Result solution: !Solution q: [1, 7, 5, 8, 2, 4, 6, 3] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, anti_first_fail, indomain, complete ) satisfy; output [ show(q) ++ "\n" ]; libminizinc-2.5.3/tests/spec/unit/search/test-large1.mzn0000644000175000017500000000054313757304533021700 0ustar kaolkaol/*** --- !Test solvers: [gecode] expected: !Result solution: !Solution x: 5 y: 8 --- !Test solvers: [chuffed] expected: !Result solution: !Solution x: 6 y: 7 ***/ var 1..10: x; var 2..10: y; constraint 7 < y \/ y > 6; constraint x + y <= 13; solve :: int_search([x,y],largest,indomain_split,complete) maximize x + y; libminizinc-2.5.3/tests/spec/unit/search/test-med1.mzn0000644000175000017500000000036413757304533021354 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution x: 5 y: 6 ***/ var 1..10: x; var 2..10: y; constraint x != y; solve :: int_search([x,y],input_order,indomain_median,complete) satisfy; libminizinc-2.5.3/tests/spec/unit/search/int_var_select_1.mzn0000644000175000017500000000075513757304533022776 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [1, 5, 8, 6, 3, 7, 2, 4] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, input_order, indomain, complete ) satisfy; output [ show(q) ++ "\n" ]; libminizinc-2.5.3/tests/spec/unit/search/int_var_select_6.mzn0000644000175000017500000000071713757304533023001 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [1, 5, 8, 6, 3, 7, 2, 4] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, input_order, indomain, complete ) satisfy; libminizinc-2.5.3/tests/spec/unit/search/int_var_select_4.mzn0000644000175000017500000000101613757304533022770 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution q: [1, 7, 4, 6, 8, 2, 5, 3] - !Result solution: !Solution q: [1, 7, 5, 8, 2, 4, 6, 3] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, smallest, indomain, complete ) satisfy; libminizinc-2.5.3/tests/spec/unit/search/test-ff1.mzn0000644000175000017500000000045413757304533021202 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution x: 3 y: 8 ***/ var 1..8: x; var 1..10: y; constraint x > 1 -> y > 7; constraint x = 1 -> y < 3; constraint x + y <= 11; solve :: int_search([y,x],first_fail,indomain_min,complete) maximize x + y; libminizinc-2.5.3/tests/spec/unit/search/test-ff3.mzn0000644000175000017500000000066313757304533021206 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution x: 5 y: 1 z: 1 w: 3 ***/ var 1..8: x; var 1..10: y; var 1..10: z; var 1..10: w; constraint x = 1 -> x < 1; constraint x > 1 -> y < 5; constraint x > 1 -> z < 5; constraint x > 1 -> w < 5; constraint y = 1 -> x > 4; constraint x > 2 -> w > 2; solve :: int_search([x,y,z,w],first_fail,indomain_min,complete) satisfy; libminizinc-2.5.3/tests/spec/unit/search/test-small1.mzn0000644000175000017500000000046013757304533021714 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution x: 9 y: 2 ***/ var 1..10: x; var 2..10: y; constraint x = 1 -> y > 10; constraint x > 1 -> x > 4; constraint x + y <= 11; solve :: int_search([x,y],smallest,indomain_min,complete) maximize x + y; libminizinc-2.5.3/tests/spec/unit/search/int_choice_6.mzn0000644000175000017500000000076313757304533022105 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [1, 5, 8, 6, 3, 7, 2, 4] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, input_order, indomain_split, complete ) satisfy; output [ show(q) ++ "\n" ]; libminizinc-2.5.3/tests/spec/unit/search/test-ff2.mzn0000644000175000017500000000060613757304533021202 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution x: 5 y: 1 ***/ var 1..8: x; var 1..10: y; var 1..10: z; var 1..10: w; constraint x = 1 -> x < 1; constraint x > 1 -> y < 5; constraint x > 1 -> z < 5; constraint x > 1 -> w < 5; constraint y = 1 -> x > 4; solve :: int_search([x,y,z,w],first_fail,indomain_min,complete) satisfy; libminizinc-2.5.3/tests/spec/unit/search/int_var_select_2.mzn0000644000175000017500000000075413757304533022776 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !Solution q: [1, 5, 8, 6, 3, 7, 2, 4] ***/ int: n = 8; array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve :: int_search( q, first_fail, indomain, complete ) satisfy; output [ show(q) ++ "\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/0000755000175000017500000000000013757304533017176 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex_greatereq/0000755000175000017500000000000013757304533022025 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex_greatereq/globals_lex_greatereq.mzn0000644000175000017500000000312313757304533027104 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 1 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 2 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 3 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 4 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 5 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 6 - 9 - !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 7 - 9 options: all_solutions: true ***/ include "lex_greatereq.mzn"; %-----------------------------------------------------------------------------% % lex_less %-----------------------------------------------------------------------------% array[1..5] of var -100..100: lex_avi1 ::add_to_output = [1,3,5,7,9]; array[4..8] of var 1..10: lex_avi2 ::add_to_output = array1d(4..8, [1,3,5,_,9]); constraint lex_greatereq(lex_avi1, lex_avi2); constraint lex_greatereq([5, 2, 8, 9], [5, 2, 6, 8]); constraint lex_greatereq([5, 2, 3, 9], [5, 2, 3, 9]); solve satisfy; output [ "lex_avi1 = array1d(1..5, ", show(lex_avi1), ");\n", "lex_avi2 = array1d(4..8, ", show(lex_avi2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_closed/0000755000175000017500000000000013757304533024352 5ustar kaolkaol././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_closed/globals_global_cardinality_closed.mznlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_closed/globals_global_cardinality_close0000644000175000017500000000111213757304533033003 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution gcc_c: [5, 1, 2, 1] gcc_x: [6, 7, 6, 8, 6, 9, 6, 8, 6] ***/ include "global_cardinality_closed.mzn"; constraint global_cardinality_closed([3, 3, 5, 6], [3, 5, 6], [2, 1, 1]); array[1..9] of var -100..100: gcc_x ::add_to_output = [6, 7, _, 8, _, 9, _, 8, 6]; array[1..4] of var -100..100: gcc_c ::add_to_output = [5, 1, 2, _]; constraint global_cardinality_closed(gcc_x, [6, 7, 8, 9], gcc_c); solve satisfy; output ["gcc_c = array1d(1..4, ", show(gcc_c), ");\n", "gcc_x = array1d(1..9, ", show(gcc_x), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/distribute/0000755000175000017500000000000013757304533021354 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/distribute/globals_distribute.mzn0000644000175000017500000000151213757304533025762 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution dist_base: [6, 7, 6, 8, 6, 9, 6] dist_card: [4, 1, 1, 1] dist_value: [6, 7, 8, 9] ***/ include "distribute.mzn"; %-----------------------------------------------------------------------------% % distribute %-----------------------------------------------------------------------------% array[1..4] of var -100..100: dist_card ::add_to_output = [4, _, 1, _]; array[1..4] of var -100..100: dist_value ::add_to_output = [_, 7, 8, 9]; array[1..7] of var -100..100: dist_base ::add_to_output = [_, 7, 6, 8, 6, 9, _]; constraint distribute(dist_card, dist_value, dist_base); solve satisfy; output [ "dist_base = array1d(1..7, ", show(dist_base), ");\n", "dist_card = array1d(1..4, ", show(dist_card), ");\n", "dist_value = array1d(1..4, ", show(dist_value), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/partition_set/0000755000175000017500000000000013757304533022062 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/partition_set/globals_partition_set.mzn0000644000175000017500000000112213757304533027173 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution partset_avsi: - !!set {1, 3, 5} - !!set {2, 6, 7, 8, 10} - !!set {} - !!set {4, 9} ***/ include "partition_set.mzn"; %-----------------------------------------------------------------------------% % partition_set %-----------------------------------------------------------------------------% array[1..4] of var set of 1..10: partset_avsi :: add_to_output = [{1,3,5}, _, {}, {4,9}]; constraint partition_set(partset_avsi, 1..10); solve satisfy; output ["partset_avsi = array1d(1..4, ", show(partset_avsi), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/range/0000755000175000017500000000000013757304533020272 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/range/globals_range.mzn0000644000175000017500000000146413757304533023624 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution range_avi1: - 9 - 8 - 7 - !Solution range_avi1: - 8 - 9 - 7 - !Solution range_avi1: - 9 - 7 - 8 - !Solution range_avi1: - 7 - 9 - 8 - !Solution range_avi1: - 8 - 7 - 9 - !Solution range_avi1: - 7 - 8 - 9 options: all_solutions: true ***/ include "range.mzn"; %-----------------------------------------------------------------------------% % range %-----------------------------------------------------------------------------% array[1..3] of var int: range_avi1 ::add_to_output; constraint range(range_avi1, {1, 2, 3}, {7, 8, 9}); solve satisfy; output ["range_avi1 = array1d(1..3, ", show(range_avi1), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/atmost1/0000755000175000017500000000000013757304533020566 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/atmost1/globals_at_most1.mzn0000644000175000017500000000123013757304533024542 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution s: - !!set {} - !!set {} - !!set {} - !Result solution: !Solution s: - !!set {1} - !!set {1} - !Range 1..3 - !Result solution: !Solution s: - !Range 1..3 - !!set {} - !!set {} - !Result solution: !Solution s: - !!set {} - !!set {} - !Range 1..3 - !Result solution: !Solution s: - !!set {3} - !!set {3} - !!set {3} ***/ include "at_most1.mzn"; array[1..3] of var set of 1..3: s; constraint at_most1(s); constraint at_most1([{5,8}, {5}, {5, 6, 7}, {1, 4}]); solve satisfy; output ["s = array1d(1..3, ", show(s), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/increasing/0000755000175000017500000000000013757304533021320 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/increasing/globals_increasing.mzn0000644000175000017500000000217513757304533025700 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inc_avb: [false, true, true, true, true] inc_avi: [1, 1, 3, 3, 5] - !Result solution: !Solution inc_avb: [false, true, true, true, true] inc_avi: [1, 1, 3, 5, 5] - !Result solution: !Solution inc_avb: [false, true, true, true, true] inc_avi: [1, 3, 3, 3, 5] - !Result solution: !Solution inc_avb: [false, true, true, true, true] inc_avi: [1, 3, 3, 5, 5] ***/ include "increasing.mzn"; %-----------------------------------------------------------------------------% % increasing %-----------------------------------------------------------------------------% array[1..5] of var -100..100: inc_avi ::add_to_output = [1, _, 3, _, 5]; array[1..5] of var bool: inc_avb ::add_to_output = [false, true, _, _, _]; %array[1..8] of var set of 1..3: inc_avsi; % XXX :: is_output constraint increasing(inc_avi); constraint increasing(inc_avb); % XXX: comparisons not implemented for sets %constraint increasing(inc_avsi); solve satisfy; output [ "inc_avb = array1d(1..5, ", show(inc_avb), ");\n", "inc_avi = array1d(1..5, ", show(inc_avi), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/increasing/globals_strictly_increasing_opt.mzn0000644000175000017500000000034513757304533030514 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution xs: [1, null, 2] ***/ include "strictly_increasing.mzn"; array[1..3] of var opt 1..2: xs; constraint occurs(xs[1]) /\ occurs(xs[3]); constraint strictly_increasing(xs); libminizinc-2.5.3/tests/spec/unit/globals/minimum/0000755000175000017500000000000013757304533020651 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/minimum/globals_minimum_int.mzn0000644000175000017500000000111713757304533025427 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution min_vi1: 0 min_vi2: 0 ***/ include "minimum.mzn"; include "maximum.mzn"; %-----------------------------------------------------------------------------% % minimum %-----------------------------------------------------------------------------% var 0..20: min_vi1 ::add_to_output; var 0..20: min_vi2 ::add_to_output; constraint minimum(min_vi1, [5, 3, 8, 0, 4]); constraint minimum(0, [5, 3, 8, min_vi2, 4]); solve satisfy; output [ "min_vi1 = ", show(min_vi1), ";\n", "min_vi2 = ", show(min_vi2), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/table/0000755000175000017500000000000013757304533020265 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/table/globals_table_opt.mzn0000644000175000017500000000076313757304533024475 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution xs: [3, 5] - !Solution xs: [4, 5] - !Solution xs: [5, 5] - !Solution xs: [3, null] - !Solution xs: [4, null] - !Solution xs: [5, null] options: all_solutions: true ***/ include "table.mzn"; array[1..2] of var opt 3..5: xs; array[int, 1..2] of opt int: table = [| <>, 5,| 5, 5,| |]; constraint occurs(xs[1]); constraint table(xs, table); libminizinc-2.5.3/tests/spec/unit/globals/table/globals_table.mzn0000644000175000017500000000126313757304533023607 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 1 y: 2 z: 1 - !Result solution: !Solution x: 2 y: 5 z: 2 - !Result solution: !Solution x: 6 y: 5 z: 1 ***/ include "table.mzn"; array[1..10,1..3] of int: t; t = [| 1,1,1 | 1,2,3 | 2,1,3 | 4,1,3 | 2,3,4 | 6,5,1 | 1,3,3 | 2,5,2 | 1,2,1 | 3,4,4 |]; var 1..10: x ::add_to_output; var 1..10: y ::add_to_output; var 1..10: z ::add_to_output; constraint table([x,y,z], t); constraint x != y /\ z < 3; solve satisfy; output [ "x = ", show(x), ";\n", "y = ", show(y), ";\n", "z = ", show(z), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/link_set_to_booleans/0000755000175000017500000000000013757304533023372 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/link_set_to_booleans/globals_link_set_to_booleans.mzn0000644000175000017500000000135313757304533032021 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution link_avb: - false - true - false - true - true link_vsi: !!set {1, 4} ***/ include "link_set_to_booleans.mzn"; %-----------------------------------------------------------------------------% % link_set_to_booleans %-----------------------------------------------------------------------------% var set of 0..4: link_vsi ::add_to_output; array[0..4] of var bool: link_avb ::add_to_output; constraint link_set_to_booleans(link_vsi, array1d(0..4, [false, true, false, false, true])); constraint link_set_to_booleans({1, 3, 4}, link_avb); solve satisfy; output [ "link_avb = array1d(0..4, ", show(link_avb), ");\n", "link_vsi = ", show(link_vsi), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/alldifferent_except_0/0000755000175000017500000000000013757304533023424 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/alldifferent_except_0/test_alldiff_except0.mzn0000644000175000017500000000051013757304533030236 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: Ok ***/ include "alldifferent_except_0.mzn"; constraint alldifferent_except_0([]); constraint alldifferent_except_0([0, 0]); constraint alldifferent_except_0([1, 2, 3]); constraint alldifferent_except_0([-2, -1, 0, 1, 2]); solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/globals/alldifferent_except_0/test_alldiff_except0b.mzn0000644000175000017500000000551613757304533030413 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution vs: [0, 0, 0, -1] - !Solution vs: [1, 0, 0, -1] - !Solution vs: [2, 0, 0, -1] - !Solution vs: [0, 1, 0, -1] - !Solution vs: [2, 1, 0, -1] - !Solution vs: [0, 2, 0, -1] - !Solution vs: [1, 2, 0, -1] - !Solution vs: [0, 0, 1, -1] - !Solution vs: [2, 0, 1, -1] - !Solution vs: [0, 2, 1, -1] - !Solution vs: [0, 0, 2, -1] - !Solution vs: [1, 0, 2, -1] - !Solution vs: [0, 1, 2, -1] - !Solution vs: [0, 0, -1, 0] - !Solution vs: [1, 0, -1, 0] - !Solution vs: [2, 0, -1, 0] - !Solution vs: [0, 1, -1, 0] - !Solution vs: [2, 1, -1, 0] - !Solution vs: [0, 2, -1, 0] - !Solution vs: [1, 2, -1, 0] - !Solution vs: [0, -1, 0, 0] - !Solution vs: [1, -1, 0, 0] - !Solution vs: [2, -1, 0, 0] - !Solution vs: [-1, 0, 0, 0] - !Solution vs: [0, 0, 0, 0] - !Solution vs: [1, 0, 0, 0] - !Solution vs: [2, 0, 0, 0] - !Solution vs: [-1, 1, 0, 0] - !Solution vs: [0, 1, 0, 0] - !Solution vs: [2, 1, 0, 0] - !Solution vs: [-1, 2, 0, 0] - !Solution vs: [0, 2, 0, 0] - !Solution vs: [1, 2, 0, 0] - !Solution vs: [0, -1, 1, 0] - !Solution vs: [2, -1, 1, 0] - !Solution vs: [-1, 0, 1, 0] - !Solution vs: [0, 0, 1, 0] - !Solution vs: [2, 0, 1, 0] - !Solution vs: [-1, 2, 1, 0] - !Solution vs: [0, 2, 1, 0] - !Solution vs: [0, -1, 2, 0] - !Solution vs: [1, -1, 2, 0] - !Solution vs: [-1, 0, 2, 0] - !Solution vs: [0, 0, 2, 0] - !Solution vs: [1, 0, 2, 0] - !Solution vs: [-1, 1, 2, 0] - !Solution vs: [0, 1, 2, 0] - !Solution vs: [0, 0, -1, 1] - !Solution vs: [2, 0, -1, 1] - !Solution vs: [0, 2, -1, 1] - !Solution vs: [0, -1, 0, 1] - !Solution vs: [2, -1, 0, 1] - !Solution vs: [-1, 0, 0, 1] - !Solution vs: [0, 0, 0, 1] - !Solution vs: [2, 0, 0, 1] - !Solution vs: [-1, 2, 0, 1] - !Solution vs: [0, 2, 0, 1] - !Solution vs: [0, -1, 2, 1] - !Solution vs: [-1, 0, 2, 1] - !Solution vs: [0, 0, 2, 1] - !Solution vs: [0, 0, -1, 2] - !Solution vs: [1, 0, -1, 2] - !Solution vs: [0, 1, -1, 2] - !Solution vs: [0, -1, 0, 2] - !Solution vs: [1, -1, 0, 2] - !Solution vs: [-1, 0, 0, 2] - !Solution vs: [0, 0, 0, 2] - !Solution vs: [1, 0, 0, 2] - !Solution vs: [-1, 1, 0, 2] - !Solution vs: [0, 1, 0, 2] - !Solution vs: [0, -1, 1, 2] - !Solution vs: [-1, 0, 1, 2] - !Solution vs: [0, 0, 1, 2] options: all_solutions: true ***/ include "alldifferent_except_0.mzn"; array[1..4] of var -1..2: vs; constraint alldifferent_except_0(vs); solve satisfy; output ["vs = array1d(1..4, ", show(vs), ");"]; libminizinc-2.5.3/tests/spec/unit/globals/atleast/0000755000175000017500000000000013757304533020633 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/atleast/globals_at_least.mzn0000644000175000017500000000152213757304533024660 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution atlm_avi: [4, 5, 5, 6, 6, 6, 6, 6, 8, 8] exact_avi: [4, 5, 5, 6, 6, 6, 6, 6, 8, 8] ***/ include "at_least.mzn"; include "at_most.mzn"; include "exactly.mzn"; %-----------------------------------------------------------------------------% % at_least, at_most, exactly %-----------------------------------------------------------------------------% array[1..10] of var -100..100: atlm_avi ::add_to_output= [4, 5, 5, 6, 6, 6, _, _, 8, 8]; array[1..10] of var -100..100: exact_avi ::add_to_output = [4, 5, 5, 6, 6, 6, _, _, 8, 8]; constraint at_least(5, atlm_avi, 6); constraint at_most (5, atlm_avi, 6); constraint exactly(5, exact_avi, 6); solve satisfy; output [ "atlm_avi = array1d(1..10, ", show(atlm_avi), ");\n", "exact_avi = array1d(1..10, ", show(exact_avi), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/sort/0000755000175000017500000000000013757304533020165 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/sort/globals_sort.mzn0000644000175000017500000000072513757304533023411 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution sort_avi: [1, 2, 3, 3, 5, 5, 8] ***/ include "sort.mzn"; %-----------------------------------------------------------------------------% % sort %-----------------------------------------------------------------------------% array[1..7] of var -100..100: sort_avi ::add_to_output; constraint sort([3, 5, 1, 3, 5, 2, 8], sort_avi); solve satisfy; output ["sort_avi = array1d(1..7, ", show(sort_avi), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/roots/0000755000175000017500000000000013757304533020344 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/roots/test_roots3.mzn0000644000175000017500000000037513757304533023367 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [5, 5, 5] ***/ include "roots.mzn"; array[0..2] of var 0..1000: x ::add_to_output; constraint roots(x, {0, 1, 2}, {5}); solve satisfy; output [ "x = array1d(0..2, ", show(x), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/roots/test_roots.mzn0000644000175000017500000000060513757304533023300 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 1 ***/ var 1..1: x ::add_to_output; % Just so we have something to print out. include "roots.mzn"; constraint roots([], {}, {}); constraint roots([1, 2, 3], {}, {}); constraint roots([1, 3, 1, 2, 3], {2, 4, 5}, {2, 3, 8}); constraint roots([1, 1, 1], {1, 2, 3}, {1, 2}); solve satisfy; output [ "x = ", show(x), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/roots/roots_bad.mzn0000644000175000017500000000033513757304533023047 0ustar kaolkaol/*** !Test expected: !Error ***/ % This should abort since {6} is not a subset of index_set(x). include "roots.mzn"; array[1..5] of var 1..10: x; constraint roots(x, {6}, {1, 2}); solve satisfy; output ["ERROR\n"]; libminizinc-2.5.3/tests/spec/unit/globals/roots/test_roots2.mzn0000644000175000017500000000405213757304533023362 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution s: !Range 1..5 t: !Range 1..5 - !Solution s: !Range 1..5 t: !Range 1..4 - !Solution s: !Range 1..5 t: !!set {1, 2, 3, 5} - !Solution s: !Range 1..5 t: !Range 1..3 - !Solution s: !!set {1, 2, 3, 5} t: !!set {1, 3, 4, 5} - !Solution s: !!set {1, 2, 3, 5} t: !!set {1, 3, 4} - !Solution s: !!set {1, 2, 3, 5} t: !!set {1, 3, 5} - !Solution s: !!set {1, 2, 3, 5} t: !!set {1, 3} - !Solution s: !!set {1, 3, 4} t: !!set {1, 2, 4, 5} - !Solution s: !!set {1, 3, 4} t: !!set {1, 2, 4} - !Solution s: !!set {1, 3, 4} t: !!set {1, 2, 5} - !Solution s: !!set {1, 3, 4} t: !Range 1..2 - !Solution s: !!set {1, 3} t: !!set {1, 4, 5} - !Solution s: !!set {1, 3} t: !!set {1, 4} - !Solution s: !!set {1, 3} t: !!set {1, 5} - !Solution s: !!set {1, 3} t: !!set {1} - !Solution s: !!set {2, 4, 5} t: !Range 2..5 - !Solution s: !!set {2, 4, 5} t: !Range 2..4 - !Solution s: !!set {2, 4, 5} t: !!set {2, 3, 5} - !Solution s: !!set {2, 4, 5} t: !Range 2..3 - !Solution s: !!set {2, 5} t: !Range 3..5 - !Solution s: !!set {2, 5} t: !Range 3..4 - !Solution s: !!set {2, 5} t: !!set {3, 5} - !Solution s: !!set {2, 5} t: !!set {3} - !Solution s: !!set {4} t: !!set {2, 4, 5} - !Solution s: !!set {4} t: !!set {2, 4} - !Solution s: !!set {4} t: !!set {2, 5} - !Solution s: !!set {4} t: !!set {2} - !Solution s: !!set {} t: !Range 4..5 - !Solution s: !!set {} t: !!set {4} - !Solution s: !!set {} t: !!set {5} - !Solution s: !!set {} t: !!set {} options: all_solutions: true ***/ include "roots.mzn"; var set of 1..5: s ::add_to_output; var set of 1..5: t ::add_to_output; constraint roots([1, 3, 1, 2, 3], s, t); solve satisfy; output [ "s = ", show(s), ";\n", "t = ", show(t), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up/0000755000175000017500000000000013757304533024406 5ustar kaolkaol././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up/globals_global_cardinality_low_up.mznlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up/globals_global_cardinality_low_u0000644000175000017500000000120113757304533033056 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [6, 3, 8, 3] - !Result solution: !Solution x: [3, 6, 8, 3] - !Result solution: !Solution x: [3, 3, 8, 6] ***/ include "global_cardinality_low_up.mzn"; array[1..4] of var 0..8: x; % Make one of the array elements a value that is not in the cover. % This is to check that we get the behaviour specified in the global % constraint catalogue. constraint x[3] = 8; constraint global_cardinality_low_up( %[3, 3, 8, 6], x, [3, 5, 6], [2, 0, 1], [3, 2, 1]); solve satisfy; output ["x = array1d(1..4, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/value_precede/0000755000175000017500000000000013757304533022001 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/value_precede/globals_value_precede_int.mzn0000644000175000017500000000143213757304533027707 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: [1, 1, 3] - !Solution x: [1, 3, 3] - !Solution x: [1, 4, 3] - !Solution x: [3, 1, 3] - !Solution x: [3, 3, 3] - !Solution x: [3, 4, 3] - !Solution x: [4, 1, 3] - !Solution x: [4, 2, 3] - !Solution x: [4, 3, 3] - !Solution x: [4, 4, 3] options: all_solutions: true ***/ % A test for the integer version of value_precede/3. include "value_precede.mzn"; array[1..3] of var 1..4: x ::add_to_output; constraint value_precede(19, 10, [1, 3, 5, 19, 3, 10]); constraint value_precede(4, 3, [1, 2, 1, 2, 5]); % s and t not in x. constraint value_precede(4, 2, x) /\ x[3] = 3; solve satisfy; output ["x = array1d(1..3, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/value_precede/globals_value_precede_int_opt.mzn0000644000175000017500000000267713757304533030605 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: [null, null, null] - !Solution x: [1, null, null] - !Solution x: [3, null, null] - !Solution x: [null, 1, null] - !Solution x: [null, 3, null] - !Solution x: [1, 1, null] - !Solution x: [1, 2, null] - !Solution x: [1, 3, null] - !Solution x: [3, 1, null] - !Solution x: [3, 3, null] - !Solution x: [null, null, 1] - !Solution x: [null, null, 3] - !Solution x: [1, null, 1] - !Solution x: [1, null, 2] - !Solution x: [1, null, 3] - !Solution x: [3, null, 1] - !Solution x: [3, null, 3] - !Solution x: [null, 1, 1] - !Solution x: [null, 1, 2] - !Solution x: [null, 1, 3] - !Solution x: [null, 3, 1] - !Solution x: [null, 3, 3] - !Solution x: [1, 1, 1] - !Solution x: [1, 2, 1] - !Solution x: [1, 3, 1] - !Solution x: [1, 1, 2] - !Solution x: [1, 2, 2] - !Solution x: [1, 3, 2] - !Solution x: [1, 1, 3] - !Solution x: [1, 2, 3] - !Solution x: [1, 3, 3] - !Solution x: [3, 1, 1] - !Solution x: [3, 1, 2] - !Solution x: [3, 1, 3] - !Solution x: [3, 3, 1] - !Solution x: [3, 3, 3] options: all_solutions: true ***/ include "value_precede.mzn"; array[1..3] of var opt 1..3: x; constraint fzn_value_precede_int_opt(1,2,x); solve satisfy; libminizinc-2.5.3/tests/spec/unit/globals/value_precede/globals_value_precede_set.mzn0000644000175000017500000005132213757304533027713 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: - !Range 1..3 - !Range 1..3 - !Range 1..3 - !Solution x: - !!set {1, 3} - !Range 1..3 - !Range 1..3 - !Solution x: - !!set {1} - !Range 1..3 - !Range 1..3 - !Solution x: - !Range 2..3 - !Range 1..3 - !Range 1..3 - !Solution x: - !!set {3} - !Range 1..3 - !Range 1..3 - !Solution x: - !!set {} - !Range 1..3 - !Range 1..3 - !Solution x: - !!set {1, 3} - !Range 1..2 - !Range 1..3 - !Solution x: - !!set {3} - !Range 1..2 - !Range 1..3 - !Solution x: - !Range 1..3 - !!set {1, 3} - !Range 1..3 - !Solution x: - !!set {1, 3} - !!set {1, 3} - !Range 1..3 - !Solution x: - !!set {1} - !!set {1, 3} - !Range 1..3 - !Solution x: - !Range 2..3 - !!set {1, 3} - !Range 1..3 - !Solution x: - !!set {3} - !!set {1, 3} - !Range 1..3 - !Solution x: - !!set {} - !!set {1, 3} - !Range 1..3 - !Solution x: - !Range 1..3 - !!set {1} - !Range 1..3 - !Solution x: - !!set {1, 3} - !!set {1} - !Range 1..3 - !Solution x: - !!set {1} - !!set {1} - !Range 1..3 - !Solution x: - !Range 2..3 - !!set {1} - !Range 1..3 - !Solution x: - !!set {3} - !!set {1} - !Range 1..3 - !Solution x: - !!set {} - !!set {1} - !Range 1..3 - !Solution x: - !Range 1..3 - !Range 2..3 - !Range 1..3 - !Solution x: - !!set {1, 3} - !Range 2..3 - !Range 1..3 - !Solution x: - !!set {1} - !Range 2..3 - !Range 1..3 - !Solution x: - !Range 2..3 - !Range 2..3 - !Range 1..3 - !Solution x: - !!set {3} - !Range 2..3 - !Range 1..3 - !Solution x: - !!set {} - !Range 2..3 - !Range 1..3 - !Solution x: - !!set {1, 3} - !!set {2} - !Range 1..3 - !Solution x: - !!set {3} - !!set {2} - !Range 1..3 - !Solution x: - !Range 1..3 - !!set {3} - !Range 1..3 - !Solution x: - !!set {1, 3} - !!set {3} - !Range 1..3 - !Solution x: - !!set {1} - !!set {3} - !Range 1..3 - !Solution x: - !Range 2..3 - !!set {3} - !Range 1..3 - !Solution x: - !!set {3} - !!set {3} - !Range 1..3 - !Solution x: - !!set {} - !!set {3} - !Range 1..3 - !Solution x: - !Range 1..3 - !!set {} - !Range 1..3 - !Solution x: - !!set {1, 3} - !!set {} - !Range 1..3 - !Solution x: - !!set {1} - !!set {} - !Range 1..3 - !Solution x: - !Range 2..3 - !!set {} - !Range 1..3 - !Solution x: - !!set {3} - !!set {} - !Range 1..3 - !Solution x: - !!set {} - !!set {} - !Range 1..3 - !Solution x: - !!set {1, 3} - !Range 1..3 - !Range 1..2 - !Solution x: - !!set {3} - !Range 1..3 - !Range 1..2 - !Solution x: - !!set {1, 3} - !Range 1..2 - !Range 1..2 - !Solution x: - !!set {3} - !Range 1..2 - !Range 1..2 - !Solution x: - !Range 1..3 - !!set {1, 3} - !Range 1..2 - !Solution x: - !!set {1, 3} - !!set {1, 3} - !Range 1..2 - !Solution x: - !!set {1} - !!set {1, 3} - !Range 1..2 - !Solution x: - !Range 2..3 - !!set {1, 3} - !Range 1..2 - !Solution x: - !!set {3} - !!set {1, 3} - !Range 1..2 - !Solution x: - !!set {} - !!set {1, 3} - !Range 1..2 - !Solution x: - !!set {1, 3} - !!set {1} - !Range 1..2 - !Solution x: - !!set {3} - !!set {1} - !Range 1..2 - !Solution x: - !!set {1, 3} - !Range 2..3 - !Range 1..2 - !Solution x: - !!set {3} - !Range 2..3 - !Range 1..2 - !Solution x: - !!set {1, 3} - !!set {2} - !Range 1..2 - !Solution x: - !!set {3} - !!set {2} - !Range 1..2 - !Solution x: - !Range 1..3 - !!set {3} - !Range 1..2 - !Solution x: - !!set {1, 3} - !!set {3} - !Range 1..2 - !Solution x: - !!set {1} - !!set {3} - !Range 1..2 - !Solution x: - !Range 2..3 - !!set {3} - !Range 1..2 - !Solution x: - !!set {3} - !!set {3} - !Range 1..2 - !Solution x: - !!set {} - !!set {3} - !Range 1..2 - !Solution x: - !!set {1, 3} - !!set {} - !Range 1..2 - !Solution x: - !!set {3} - !!set {} - !Range 1..2 - !Solution x: - !Range 1..3 - !Range 1..3 - !!set {1, 3} - !Solution x: - !!set {1, 3} - !Range 1..3 - !!set {1, 3} - !Solution x: - !!set {1} - !Range 1..3 - !!set {1, 3} - !Solution x: - !Range 2..3 - !Range 1..3 - !!set {1, 3} - !Solution x: - !!set {3} - !Range 1..3 - !!set {1, 3} - !Solution x: - !!set {} - !Range 1..3 - !!set {1, 3} - !Solution x: - !!set {1, 3} - !Range 1..2 - !!set {1, 3} - !Solution x: - !!set {3} - !Range 1..2 - !!set {1, 3} - !Solution x: - !Range 1..3 - !!set {1, 3} - !!set {1, 3} - !Solution x: - !!set {1, 3} - !!set {1, 3} - !!set {1, 3} - !Solution x: - !!set {1} - !!set {1, 3} - !!set {1, 3} - !Solution x: - !Range 2..3 - !!set {1, 3} - !!set {1, 3} - !Solution x: - !!set {3} - !!set {1, 3} - !!set {1, 3} - !Solution x: - !!set {} - !!set {1, 3} - !!set {1, 3} - !Solution x: - !Range 1..3 - !!set {1} - !!set {1, 3} - !Solution x: - !!set {1, 3} - !!set {1} - !!set {1, 3} - !Solution x: - !!set {1} - !!set {1} - !!set {1, 3} - !Solution x: - !Range 2..3 - !!set {1} - !!set {1, 3} - !Solution x: - !!set {3} - !!set {1} - !!set {1, 3} - !Solution x: - !!set {} - !!set {1} - !!set {1, 3} - !Solution x: - !Range 1..3 - !Range 2..3 - !!set {1, 3} - !Solution x: - !!set {1, 3} - !Range 2..3 - !!set {1, 3} - !Solution x: - !!set {1} - !Range 2..3 - !!set {1, 3} - !Solution x: - !Range 2..3 - !Range 2..3 - !!set {1, 3} - !Solution x: - !!set {3} - !Range 2..3 - !!set {1, 3} - !Solution x: - !!set {} - !Range 2..3 - !!set {1, 3} - !Solution x: - !!set {1, 3} - !!set {2} - !!set {1, 3} - !Solution x: - !!set {3} - !!set {2} - !!set {1, 3} - !Solution x: - !Range 1..3 - !!set {3} - !!set {1, 3} - !Solution x: - !!set {1, 3} - !!set {3} - !!set {1, 3} - !Solution x: - !!set {1} - !!set {3} - !!set {1, 3} - !Solution x: - !Range 2..3 - !!set {3} - !!set {1, 3} - !Solution x: - !!set {3} - !!set {3} - !!set {1, 3} - !Solution x: - !!set {} - !!set {3} - !!set {1, 3} - !Solution x: - !Range 1..3 - !!set {} - !!set {1, 3} - !Solution x: - !!set {1, 3} - !!set {} - !!set {1, 3} - !Solution x: - !!set {1} - !!set {} - !!set {1, 3} - !Solution x: - !Range 2..3 - !!set {} - !!set {1, 3} - !Solution x: - !!set {3} - !!set {} - !!set {1, 3} - !Solution x: - !!set {} - !!set {} - !!set {1, 3} - !Solution x: - !Range 1..3 - !Range 1..3 - !!set {1} - !Solution x: - !!set {1, 3} - !Range 1..3 - !!set {1} - !Solution x: - !!set {1} - !Range 1..3 - !!set {1} - !Solution x: - !Range 2..3 - !Range 1..3 - !!set {1} - !Solution x: - !!set {3} - !Range 1..3 - !!set {1} - !Solution x: - !!set {} - !Range 1..3 - !!set {1} - !Solution x: - !!set {1, 3} - !Range 1..2 - !!set {1} - !Solution x: - !!set {3} - !Range 1..2 - !!set {1} - !Solution x: - !Range 1..3 - !!set {1, 3} - !!set {1} - !Solution x: - !!set {1, 3} - !!set {1, 3} - !!set {1} - !Solution x: - !!set {1} - !!set {1, 3} - !!set {1} - !Solution x: - !Range 2..3 - !!set {1, 3} - !!set {1} - !Solution x: - !!set {3} - !!set {1, 3} - !!set {1} - !Solution x: - !!set {} - !!set {1, 3} - !!set {1} - !Solution x: - !Range 1..3 - !!set {1} - !!set {1} - !Solution x: - !!set {1, 3} - !!set {1} - !!set {1} - !Solution x: - !!set {1} - !!set {1} - !!set {1} - !Solution x: - !Range 2..3 - !!set {1} - !!set {1} - !Solution x: - !!set {3} - !!set {1} - !!set {1} - !Solution x: - !!set {} - !!set {1} - !!set {1} - !Solution x: - !Range 1..3 - !Range 2..3 - !!set {1} - !Solution x: - !!set {1, 3} - !Range 2..3 - !!set {1} - !Solution x: - !!set {1} - !Range 2..3 - !!set {1} - !Solution x: - !Range 2..3 - !Range 2..3 - !!set {1} - !Solution x: - !!set {3} - !Range 2..3 - !!set {1} - !Solution x: - !!set {} - !Range 2..3 - !!set {1} - !Solution x: - !!set {1, 3} - !!set {2} - !!set {1} - !Solution x: - !!set {3} - !!set {2} - !!set {1} - !Solution x: - !Range 1..3 - !!set {3} - !!set {1} - !Solution x: - !!set {1, 3} - !!set {3} - !!set {1} - !Solution x: - !!set {1} - !!set {3} - !!set {1} - !Solution x: - !Range 2..3 - !!set {3} - !!set {1} - !Solution x: - !!set {3} - !!set {3} - !!set {1} - !Solution x: - !!set {} - !!set {3} - !!set {1} - !Solution x: - !Range 1..3 - !!set {} - !!set {1} - !Solution x: - !!set {1, 3} - !!set {} - !!set {1} - !Solution x: - !!set {1} - !!set {} - !!set {1} - !Solution x: - !Range 2..3 - !!set {} - !!set {1} - !Solution x: - !!set {3} - !!set {} - !!set {1} - !Solution x: - !!set {} - !!set {} - !!set {1} - !Solution x: - !Range 1..3 - !Range 1..3 - !Range 2..3 - !Solution x: - !!set {1, 3} - !Range 1..3 - !Range 2..3 - !Solution x: - !!set {1} - !Range 1..3 - !Range 2..3 - !Solution x: - !Range 2..3 - !Range 1..3 - !Range 2..3 - !Solution x: - !!set {3} - !Range 1..3 - !Range 2..3 - !Solution x: - !!set {} - !Range 1..3 - !Range 2..3 - !Solution x: - !!set {1, 3} - !Range 1..2 - !Range 2..3 - !Solution x: - !!set {3} - !Range 1..2 - !Range 2..3 - !Solution x: - !Range 1..3 - !!set {1, 3} - !Range 2..3 - !Solution x: - !!set {1, 3} - !!set {1, 3} - !Range 2..3 - !Solution x: - !!set {1} - !!set {1, 3} - !Range 2..3 - !Solution x: - !Range 2..3 - !!set {1, 3} - !Range 2..3 - !Solution x: - !!set {3} - !!set {1, 3} - !Range 2..3 - !Solution x: - !!set {} - !!set {1, 3} - !Range 2..3 - !Solution x: - !Range 1..3 - !!set {1} - !Range 2..3 - !Solution x: - !!set {1, 3} - !!set {1} - !Range 2..3 - !Solution x: - !!set {1} - !!set {1} - !Range 2..3 - !Solution x: - !Range 2..3 - !!set {1} - !Range 2..3 - !Solution x: - !!set {3} - !!set {1} - !Range 2..3 - !Solution x: - !!set {} - !!set {1} - !Range 2..3 - !Solution x: - !Range 1..3 - !Range 2..3 - !Range 2..3 - !Solution x: - !!set {1, 3} - !Range 2..3 - !Range 2..3 - !Solution x: - !!set {1} - !Range 2..3 - !Range 2..3 - !Solution x: - !Range 2..3 - !Range 2..3 - !Range 2..3 - !Solution x: - !!set {3} - !Range 2..3 - !Range 2..3 - !Solution x: - !!set {} - !Range 2..3 - !Range 2..3 - !Solution x: - !!set {1, 3} - !!set {2} - !Range 2..3 - !Solution x: - !!set {3} - !!set {2} - !Range 2..3 - !Solution x: - !Range 1..3 - !!set {3} - !Range 2..3 - !Solution x: - !!set {1, 3} - !!set {3} - !Range 2..3 - !Solution x: - !!set {1} - !!set {3} - !Range 2..3 - !Solution x: - !Range 2..3 - !!set {3} - !Range 2..3 - !Solution x: - !!set {3} - !!set {3} - !Range 2..3 - !Solution x: - !!set {} - !!set {3} - !Range 2..3 - !Solution x: - !Range 1..3 - !!set {} - !Range 2..3 - !Solution x: - !!set {1, 3} - !!set {} - !Range 2..3 - !Solution x: - !!set {1} - !!set {} - !Range 2..3 - !Solution x: - !Range 2..3 - !!set {} - !Range 2..3 - !Solution x: - !!set {3} - !!set {} - !Range 2..3 - !Solution x: - !!set {} - !!set {} - !Range 2..3 - !Solution x: - !!set {1, 3} - !Range 1..3 - !!set {2} - !Solution x: - !!set {3} - !Range 1..3 - !!set {2} - !Solution x: - !!set {1, 3} - !Range 1..2 - !!set {2} - !Solution x: - !!set {3} - !Range 1..2 - !!set {2} - !Solution x: - !Range 1..3 - !!set {1, 3} - !!set {2} - !Solution x: - !!set {1, 3} - !!set {1, 3} - !!set {2} - !Solution x: - !!set {1} - !!set {1, 3} - !!set {2} - !Solution x: - !Range 2..3 - !!set {1, 3} - !!set {2} - !Solution x: - !!set {3} - !!set {1, 3} - !!set {2} - !Solution x: - !!set {} - !!set {1, 3} - !!set {2} - !Solution x: - !!set {1, 3} - !!set {1} - !!set {2} - !Solution x: - !!set {3} - !!set {1} - !!set {2} - !Solution x: - !!set {1, 3} - !Range 2..3 - !!set {2} - !Solution x: - !!set {3} - !Range 2..3 - !!set {2} - !Solution x: - !!set {1, 3} - !!set {2} - !!set {2} - !Solution x: - !!set {3} - !!set {2} - !!set {2} - !Solution x: - !Range 1..3 - !!set {3} - !!set {2} - !Solution x: - !!set {1, 3} - !!set {3} - !!set {2} - !Solution x: - !!set {1} - !!set {3} - !!set {2} - !Solution x: - !Range 2..3 - !!set {3} - !!set {2} - !Solution x: - !!set {3} - !!set {3} - !!set {2} - !Solution x: - !!set {} - !!set {3} - !!set {2} - !Solution x: - !!set {1, 3} - !!set {} - !!set {2} - !Solution x: - !!set {3} - !!set {} - !!set {2} - !Solution x: - !Range 1..3 - !Range 1..3 - !!set {3} - !Solution x: - !!set {1, 3} - !Range 1..3 - !!set {3} - !Solution x: - !!set {1} - !Range 1..3 - !!set {3} - !Solution x: - !Range 2..3 - !Range 1..3 - !!set {3} - !Solution x: - !!set {3} - !Range 1..3 - !!set {3} - !Solution x: - !!set {} - !Range 1..3 - !!set {3} - !Solution x: - !!set {1, 3} - !Range 1..2 - !!set {3} - !Solution x: - !!set {3} - !Range 1..2 - !!set {3} - !Solution x: - !Range 1..3 - !!set {1, 3} - !!set {3} - !Solution x: - !!set {1, 3} - !!set {1, 3} - !!set {3} - !Solution x: - !!set {1} - !!set {1, 3} - !!set {3} - !Solution x: - !Range 2..3 - !!set {1, 3} - !!set {3} - !Solution x: - !!set {3} - !!set {1, 3} - !!set {3} - !Solution x: - !!set {} - !!set {1, 3} - !!set {3} - !Solution x: - !Range 1..3 - !!set {1} - !!set {3} - !Solution x: - !!set {1, 3} - !!set {1} - !!set {3} - !Solution x: - !!set {1} - !!set {1} - !!set {3} - !Solution x: - !Range 2..3 - !!set {1} - !!set {3} - !Solution x: - !!set {3} - !!set {1} - !!set {3} - !Solution x: - !!set {} - !!set {1} - !!set {3} - !Solution x: - !Range 1..3 - !Range 2..3 - !!set {3} - !Solution x: - !!set {1, 3} - !Range 2..3 - !!set {3} - !Solution x: - !!set {1} - !Range 2..3 - !!set {3} - !Solution x: - !Range 2..3 - !Range 2..3 - !!set {3} - !Solution x: - !!set {3} - !Range 2..3 - !!set {3} - !Solution x: - !!set {} - !Range 2..3 - !!set {3} - !Solution x: - !!set {1, 3} - !!set {2} - !!set {3} - !Solution x: - !!set {3} - !!set {2} - !!set {3} - !Solution x: - !Range 1..3 - !!set {3} - !!set {3} - !Solution x: - !!set {1, 3} - !!set {3} - !!set {3} - !Solution x: - !!set {1} - !!set {3} - !!set {3} - !Solution x: - !Range 2..3 - !!set {3} - !!set {3} - !Solution x: - !!set {3} - !!set {3} - !!set {3} - !Solution x: - !!set {} - !!set {3} - !!set {3} - !Solution x: - !Range 1..3 - !!set {} - !!set {3} - !Solution x: - !!set {1, 3} - !!set {} - !!set {3} - !Solution x: - !!set {1} - !!set {} - !!set {3} - !Solution x: - !Range 2..3 - !!set {} - !!set {3} - !Solution x: - !!set {3} - !!set {} - !!set {3} - !Solution x: - !!set {} - !!set {} - !!set {3} - !Solution x: - !Range 1..3 - !Range 1..3 - !!set {} - !Solution x: - !!set {1, 3} - !Range 1..3 - !!set {} - !Solution x: - !!set {1} - !Range 1..3 - !!set {} - !Solution x: - !Range 2..3 - !Range 1..3 - !!set {} - !Solution x: - !!set {3} - !Range 1..3 - !!set {} - !Solution x: - !!set {} - !Range 1..3 - !!set {} - !Solution x: - !!set {1, 3} - !Range 1..2 - !!set {} - !Solution x: - !!set {3} - !Range 1..2 - !!set {} - !Solution x: - !Range 1..3 - !!set {1, 3} - !!set {} - !Solution x: - !!set {1, 3} - !!set {1, 3} - !!set {} - !Solution x: - !!set {1} - !!set {1, 3} - !!set {} - !Solution x: - !Range 2..3 - !!set {1, 3} - !!set {} - !Solution x: - !!set {3} - !!set {1, 3} - !!set {} - !Solution x: - !!set {} - !!set {1, 3} - !!set {} - !Solution x: - !Range 1..3 - !!set {1} - !!set {} - !Solution x: - !!set {1, 3} - !!set {1} - !!set {} - !Solution x: - !!set {1} - !!set {1} - !!set {} - !Solution x: - !Range 2..3 - !!set {1} - !!set {} - !Solution x: - !!set {3} - !!set {1} - !!set {} - !Solution x: - !!set {} - !!set {1} - !!set {} - !Solution x: - !Range 1..3 - !Range 2..3 - !!set {} - !Solution x: - !!set {1, 3} - !Range 2..3 - !!set {} - !Solution x: - !!set {1} - !Range 2..3 - !!set {} - !Solution x: - !Range 2..3 - !Range 2..3 - !!set {} - !Solution x: - !!set {3} - !Range 2..3 - !!set {} - !Solution x: - !!set {} - !Range 2..3 - !!set {} - !Solution x: - !!set {1, 3} - !!set {2} - !!set {} - !Solution x: - !!set {3} - !!set {2} - !!set {} - !Solution x: - !Range 1..3 - !!set {3} - !!set {} - !Solution x: - !!set {1, 3} - !!set {3} - !!set {} - !Solution x: - !!set {1} - !!set {3} - !!set {} - !Solution x: - !Range 2..3 - !!set {3} - !!set {} - !Solution x: - !!set {3} - !!set {3} - !!set {} - !Solution x: - !!set {} - !!set {3} - !!set {} - !Solution x: - !Range 1..3 - !!set {} - !!set {} - !Solution x: - !!set {1, 3} - !!set {} - !!set {} - !Solution x: - !!set {1} - !!set {} - !!set {} - !Solution x: - !Range 2..3 - !!set {} - !!set {} - !Solution x: - !!set {3} - !!set {} - !!set {} - !Solution x: - !!set {} - !!set {} - !!set {} options: all_solutions: true ***/ % A test for the set version of value_precede/3. include "value_precede.mzn"; array[1..3] of var set of 1..3: x; constraint value_precede(4, 10, [{4}, {10}, {}]); constraint value_precede(6, 4, [{}, {1}, {2, 3}]); constraint value_precede(3, 2, x); solve satisfy; output ["x = array1d(1..3, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/all_disjoint/0000755000175000017500000000000013757304533021651 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/all_disjoint/globals_all_disjoint.mzn0000644000175000017500000020322713757304533026563 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 3..4, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 3..4, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 3..4, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {3, 5}, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 5}, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 5}, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {3, 6}, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 6}, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 6}, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {3, 7}, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 7}, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 7}, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 6..7, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {5, 7}, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 5..6, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 6..7, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 7}, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 6}, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {5, 7}, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {4, 7}, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 4..5, !Range 7..8, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 5..6, !!set {4, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {4, 6}, !!set {5, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 4..5, !!set {6, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 4..5, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {4, 6}, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {4, 7}, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 5..6, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {5, 7}, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 6..7, !!set {3, 8}, !Range 1..2] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 2..3, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 2..3, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 2..3, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 2..3, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 2..3, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 2..3, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 2..3, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 2..3, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 2..3, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 2..3, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 2..3, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 2..3, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 7}, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 6}, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 7}, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 5}, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 6}, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 5}, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 7}, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 6}, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 7}, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 4}, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 6}, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 4}, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 7}, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 5}, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 7}, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 4}, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 5}, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 4}, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 4}, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 4}, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 5}, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 5}, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 6}, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 6}, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 4}, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 4}, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 4}, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 4}, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 4}, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 4}, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 5}, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 5}, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 5}, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 5}, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 5}, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 5}, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 6}, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 6}, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 6}, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 6}, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 6}, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 6}, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 7}, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 7}, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 7}, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 7}, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 7}, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 7}, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 6..7, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {5, 7}, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 5..6, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 6..7, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 7}, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 6}, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {5, 7}, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {4, 7}, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 4..5, !Range 7..8, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 5..6, !!set {4, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {4, 6}, !!set {5, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 4..5, !!set {6, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 6..7, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {5, 7}, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 5..6, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {4, 7}, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {4, 6}, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 4..5, !!set {2, 8}, !!set {1, 3}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {3, 5}, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 5}, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 5}, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {3, 6}, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 6}, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 6}, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {3, 7}, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 7}, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 7}, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 5..6, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 5..6, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 5..6, !Range 7..8, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {5, 7}, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {5, 7}, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {5, 7}, !!set {6, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 6..7, !!set {2, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 6..7, !!set {3, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 6..7, !!set {5, 8}, !!set {1, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 3..4, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 6}, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 7}, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {4, 6}, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {4, 7}, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 6..7, !!set {2, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {4, 6}, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {4, 7}, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 6..7, !!set {3, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 6}, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 7}, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 6..7, !!set {4, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 3..4, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 7}, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 7}, !!set {6, 8}, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 3..4, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 6}, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 6}, !Range 7..8, !!set {1, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {5, 7}, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 7}, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 4..5, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {5, 7}, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 7}, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 5}, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 7}, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 7}, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 3..4, !Range 7..8, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 4..5, !!set {3, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 5}, !!set {4, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 3..4, !!set {5, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {5, 7}, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 7}, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 4..5, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 7}, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 5}, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 3..4, !!set {2, 8}, !!set {1, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 3..4, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 3..4, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 3..4, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 5}, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 5}, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 5}, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 6}, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 6}, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 6}, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 4..5, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 4..5, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 4..5, !!set {6, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 6}, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 6}, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 6}, !!set {5, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 5..6, !!set {2, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 5..6, !!set {3, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 5..6, !!set {4, 8}, !!set {1, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 6..7, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {5, 7}, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 5..6, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 7}, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {4, 6}, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !Range 4..5, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 6..7, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {5, 7}, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !Range 5..6, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 7}, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 6}, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {3, 5}, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 6..7, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 7}, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {4, 6}, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 7}, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {3, 6}, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !Range 3..4, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {5, 7}, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {4, 7}, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 4..5, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 7}, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {3, 5}, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !Range 3..4, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 5..6, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {4, 6}, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 4..5, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 6}, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {3, 5}, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !Range 3..4, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 6..7, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {5, 7}, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 5..6, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 7}, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 6}, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {2, 5}, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 6..7, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 7}, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {4, 6}, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 7}, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 6}, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {2, 4}, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {5, 7}, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {4, 7}, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 4..5, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 7}, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 5}, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {2, 4}, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 5..6, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {4, 6}, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 4..5, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 6}, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 5}, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {2, 4}, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 6..7, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 7}, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {3, 6}, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 7}, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {2, 6}, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 2..3, !!set {1, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {5, 7}, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 7}, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {3, 5}, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 7}, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {2, 5}, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 2..3, !!set {1, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 5..6, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 6}, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {3, 5}, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 6}, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {2, 5}, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 2..3, !!set {1, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {4, 7}, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {3, 7}, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 3..4, !!set {1, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 7}, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {2, 4}, !!set {1, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 2..3, !!set {1, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {4, 6}, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {3, 6}, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 3..4, !!set {1, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 6}, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {2, 4}, !!set {1, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 2..3, !!set {1, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 4..5, !!set {1, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {3, 5}, !!set {1, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 3..4, !!set {1, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 5}, !!set {1, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {2, 4}, !!set {1, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 2..3, !!set {1, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 4}, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 4}, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 4}, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 5}, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 5}, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 5}, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 6}, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 6}, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 6}, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 7}, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 7}, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 7}, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 4..5, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 4..5, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {4, 6}, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 6}, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {4, 7}, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 7}, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 5..6, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 5..6, !Range 7..8, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {5, 7}, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {5, 7}, !!set {6, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 6..7, !!set {4, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 6..7, !!set {5, 8}, !Range 2..3] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 6..7, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {5, 7}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 5..6, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 6..7, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 7}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 6}, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {5, 7}, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 7}, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 5}, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 5..6, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 6}, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 5}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 7}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 6}, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 7}, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 5}, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 6}, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 5}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 7}, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 3}, !Range 7..8, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 6}, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 3}, !!set {6, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 5}, !!set {3, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 3}, !!set {5, 8}, !!set {2, 4}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 3}, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 3}, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 3}, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 4}, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 4}, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 4}, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 6}, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 6}, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 6}, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 7}, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 7}, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 7}, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 3..4, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 3..4, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 6}, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 6}, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 7}, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 7}, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {4, 6}, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 6}, !Range 7..8, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {4, 7}, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 7}, !!set {6, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 6..7, !!set {3, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 6..7, !!set {4, 8}, !!set {2, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {5, 7}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 7}, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 4..5, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {5, 7}, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 7}, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 5}, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 7}, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 7}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 3..4, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 4..5, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 5}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 3..4, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 7}, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 5}, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 7}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 4}, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 5}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 4}, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 7}, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 3}, !Range 7..8, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 5}, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 3}, !!set {5, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 4}, !!set {3, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 3}, !!set {4, 8}, !!set {2, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 4}, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 5}, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 6}, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 4..5, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 6}, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 5..6, !!set {3, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 3}, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 5}, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 6}, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 5}, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 6}, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 5..6, !!set {4, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 3}, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 4}, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 6}, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 3..4, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 6}, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 6}, !!set {5, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 3}, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 4}, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 5}, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 3..4, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 5}, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 4..5, !!set {6, 8}, !!set {2, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 1..2, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 1..2, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !Range 1..2, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 1..2, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 1..2, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !Range 1..2, !!set {4, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 1..2, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 1..2, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !Range 1..2, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 1..2, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 1..2, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !Range 1..2, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 1..2, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 1..2, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !Range 1..2, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 1..2, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 1..2, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !Range 1..2, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 1..2, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 1..2, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !Range 1..2, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 1..2, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 1..2, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !Range 1..2, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 1..2, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 1..2, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !Range 1..2, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 1..2, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 1..2, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !Range 1..2, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 3}, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 3}, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 3}, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 3}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 3}, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 3}, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 3}, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 3}, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 3}, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 3}, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 3}, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 3}, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 3}, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 3}, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 3}, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 3}, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 3}, !!set {4, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 3}, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 4}, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 4}, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 4}, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 4}, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 4}, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 4}, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 4}, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 4}, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 4}, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 4}, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 4}, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 4}, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 4}, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 4}, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 4}, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 4}, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 4}, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 4}, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 5}, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 5}, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 5}, !!set {4, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 5}, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 5}, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 5}, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 5}, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 5}, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 5}, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 5}, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 5}, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 5}, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 5}, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 5}, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 5}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 5}, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 5}, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 6..7, !!set {1, 5}, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 6}, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 6}, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 6}, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 6}, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 6}, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 6}, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 6}, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 6}, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 6}, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 6}, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 6}, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 7}, !!set {1, 6}, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 6}, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 6}, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 7}, !!set {1, 6}, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 6}, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {4, 7}, !!set {1, 6}, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {5, 7}, !!set {1, 6}, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 5..6, !!set {1, 7}, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 7}, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 7}, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {4, 6}, !!set {1, 7}, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 7}, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 7}, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 4..5, !!set {1, 7}, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 7}, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 7}, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {3, 6}, !!set {1, 7}, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {2, 6}, !!set {1, 7}, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 7}, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {3, 5}, !!set {1, 7}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {2, 5}, !!set {1, 7}, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 7}, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 3..4, !!set {1, 7}, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {2, 4}, !!set {1, 7}, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 2..3, !!set {1, 7}, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 6..7, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {5, 7}, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 5..6, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 6..7, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 7}, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 6}, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {5, 7}, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 7}, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 5}, !Range 7..8, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 5..6, !!set {2, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 6}, !!set {5, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 5}, !!set {6, 8}, !Range 3..4] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {4, 6}, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {4, 7}, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 6..7, !!set {2, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 6}, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 7}, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 6..7, !!set {4, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 4}, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 7}, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 7}, !!set {6, 8}, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 4}, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 6}, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 6}, !Range 7..8, !!set {3, 5}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 4}, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 4}, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 5}, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 5}, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 7}, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 7}, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 4..5, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 4..5, !Range 7..8, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 7}, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 7}, !!set {5, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {5, 7}, !!set {2, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {5, 7}, !!set {4, 8}, !!set {3, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 4..5, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {4, 6}, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 5..6, !!set {2, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 5}, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 6}, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 5..6, !!set {4, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 4}, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 6}, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 6}, !!set {5, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 4}, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 5}, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 4..5, !!set {6, 8}, !!set {3, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 6..7, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 7}, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 6}, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 6..7, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 7}, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 6}, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 7}, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 7}, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 2..3, !Range 7..8, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 6}, !!set {2, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 6}, !!set {3, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 2..3, !!set {6, 8}, !Range 4..5] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 2..3, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 2..3, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 5}, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 5}, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 7}, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 7}, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {3, 5}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 5}, !Range 7..8, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 7}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 7}, !!set {5, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {5, 7}, !!set {2, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {5, 7}, !!set {3, 8}, !!set {4, 6}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {3, 5}, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {3, 6}, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 5..6, !!set {2, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 5}, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 6}, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 5..6, !!set {3, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 2..3, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 6}, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 6}, !!set {5, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 2..3, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 5}, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 5}, !!set {6, 8}, !!set {4, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 3..4, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 7}, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 7}, !!set {2, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !!set {2, 4}, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 7}, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 7}, !!set {3, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 7}, !Range 2..3, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 7}, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 7}, !!set {4, 8}, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 2..3, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 4}, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 3..4, !Range 7..8, !Range 5..6] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 2..3, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 2..3, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !!set {2, 4}, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 4}, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 6}, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 6}, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 6}, !Range 3..4, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 3..4, !!set {6, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 6}, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 6}, !!set {4, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {4, 6}, !!set {2, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {4, 6}, !!set {3, 8}, !!set {5, 7}] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 4..5, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !!set {3, 5}, !!set {4, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!Range 1..2, !Range 3..4, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !Range 4..5, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 5}, !!set {4, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 3}, !!set {2, 4}, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {3, 5}, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !!set {2, 5}, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 4}, !Range 2..3, !!set {5, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 3..4, !!set {2, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !!set {2, 4}, !!set {3, 8}, !Range 6..7] - !Result solution: !Solution alldisj_avsi: [!!set {1, 5}, !Range 2..3, !!set {4, 8}, !Range 6..7] ***/ include "all_disjoint.mzn"; %-----------------------------------------------------------------------------% % all_disjoint %-----------------------------------------------------------------------------% array[1..4] of var set of 1..8: alldisj_avsi :: add_to_output; constraint forall(i in 1..4) ( card(alldisj_avsi[i]) > 1 ); constraint all_disjoint(alldisj_avsi); constraint 8 in alldisj_avsi[3]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/globals/all_equal/0000755000175000017500000000000013757304533021135 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/all_equal/globals_all_equal_set.mzn0000644000175000017500000000111313757304533026174 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 - !Range 1..2 ***/ % Test the set all_equal global constraint. include "all_equal.mzn"; array[1..10] of var set of 1..5: x; constraint all_equal([]); constraint all_equal([{1, 2}, {1, 2}, {1, 2}, {1, 2}]); constraint x[1] = {1, 2}; constraint all_equal(x); constraint all_equal([{}, {1}, {1, 2}]) == false; solve satisfy; output ["x = ", show(x), ";\n"]; libminizinc-2.5.3/tests/spec/unit/globals/all_equal/globals_all_equal_int.mzn0000644000175000017500000000064213757304533026201 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [5, 5, 5, 5, 5, 5, 5, 5, 5, 5] ***/ % Test the integer all_equal global constraint. include "all_equal.mzn"; array[1..10] of var 1..5: x; constraint all_equal([]); constraint all_equal([5, 5, 5, 5]); constraint x[1] = 5; constraint all_equal(x); constraint all_equal([1, 2, 3]) == false; solve satisfy; output ["x = array1d(1..10, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/maximum/0000755000175000017500000000000013757304533020653 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/maximum/globals_maximum_int.mzn0000644000175000017500000000107113757304533025432 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution max_vi1: 9 max_vi2: 9 ***/ include "maximum.mzn"; %-----------------------------------------------------------------------------% % maximum %-----------------------------------------------------------------------------% var 0..20: max_vi1 ::add_to_output; var 0..20: max_vi2 ::add_to_output; constraint maximum(max_vi1, [5, 3, 8, 9, 4]); constraint maximum(9, [5, 3, 8, max_vi2, 4]); solve satisfy; output [ "max_vi1 = ", show(max_vi1), ";\n", "max_vi2 = ", show(max_vi2), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/lex_lesseq/0000755000175000017500000000000013757304533021342 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex_lesseq/test_bool_lex_lesseq.mzn0000644000175000017500000000206713757304533026313 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: - false - false y: - false - false - !Solution x: - false - false y: - true - false - !Solution x: - true - false y: - true - false - !Solution x: - false - true y: - true - false - !Solution x: - false - false y: - false - true - !Solution x: - false - true y: - false - true - !Solution x: - false - false y: - true - true - !Solution x: - true - false y: - true - true - !Solution x: - false - true y: - true - true - !Solution x: - true - true y: - true - true options: all_solutions: true ***/ include "lex_lesseq.mzn"; array[1..2] of var bool: x ::add_to_output; array[1..2] of var bool: y ::add_to_output; constraint lex_lesseq(x, y); solve satisfy; output [ "x = ", show(x), "\n", "y = ", show(y), "\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/lex_lesseq/globals_lex_lesseq.mzn0000644000175000017500000000132713757304533025742 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution lexeq_avi1: - 1 - 3 - 5 - 7 - 9 lexeq_avi2: - 1 - 3 - 5 - 7 - 9 ***/ include "lex_lesseq.mzn"; %-----------------------------------------------------------------------------% % lex_lesseq %-----------------------------------------------------------------------------% array[1..5] of var -100..100: lexeq_avi1 ::add_to_output = [1,3,5,7,9]; array[4..8] of var -100..100: lexeq_avi2 ::add_to_output = array1d(4..8, [1,3,5,7,9]); constraint lex_lesseq(lexeq_avi1, lexeq_avi2); solve satisfy; output [ "lexeq_avi1 = array1d(1..5, ", show(lexeq_avi1), ");\n", "lexeq_avi2 = array1d(4..8, ", show(lexeq_avi2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/regular/0000755000175000017500000000000013757304533020637 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_4.mzn0000644000175000017500000000054413757304533026151 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 1, 1, 2, 2, 4, 4, 4, 4, 4] - !Result solution: !Solution x: [1, 1, 1, 1, 2, 2, 4, 4, 4, 4] - !Result solution: !Solution x: [1, 1, 1, 1, 1, 2, 2, 4, 4, 4] ***/ include "regular_regexp.mzn"; array [1..10] of var 1..4: x :: add_to_output; constraint regular(x, "1{3,5} 2{2} 4+");libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular.mzn0000644000175000017500000000270113757304533024531 0ustar kaolkaol/*** !Test solvers: [gecode] expected: - !Result solution: !Solution reg_input: - 1 - 2 - 3 - 3 - 3 - 2 - 1 reg_input2: - 1 - 2 - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 2 - 1 ***/ include "regular.mzn"; %-----------------------------------------------------------------------------% % regular %-----------------------------------------------------------------------------% % regexp is: 123*21. int: n_states = 5; int: input_max = 3; int: initial_state = 1; set of int: accepting_states = {5}; array[1..5, 1..3] of int: transition_fn = [|2, 0, 0 % transitions from state 1: --1--> state 2 |0, 3, 0 % transitions from state 2: --2--> state 3 |0, 4, 3 % transitions from state 3: --2--> state 4, --3--> state 3 |5, 0, 0 % transitions from state 4: --1--> state 5 |0, 0, 0|];% transitions from state 5: (none) array[-2..4] of var int: reg_input ::add_to_output = array1d(-2..4, [1, 2, _, _, _, 2, 1]); array[44..54] of var int: reg_input2 ::add_to_output; constraint regular(reg_input, n_states, input_max, transition_fn, initial_state, accepting_states); constraint regular(reg_input2, n_states, input_max, transition_fn, initial_state, accepting_states); solve satisfy; output [ "reg_input = array1d(-2..4, ", show(reg_input), ");\n", "reg_input2 = array1d(44..54, ", show(reg_input2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_3.mzn0000644000175000017500000000052613757304533026150 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: [1, 4, 1, 4] - !Solution x: [1, 4, 2, 4] - !Solution x: [1, 4, 3, 4] ***/ include "regular_regexp.mzn"; array [1..4] of var 1..4: x :: add_to_output; constraint regular(x, "1 [^1 2 3] [1-3] 4");libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_5.mzn0000644000175000017500000000043413757304533026150 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: [1, 2] - !Solution x: [2, 2] ***/ include "regular_regexp.mzn"; array [1..2] of var 1..4: x :: add_to_output; constraint regular(x, "1? 2 *");libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_2.mzn0000644000175000017500000000053713757304533026151 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 2, 2, 4] - !Result solution: !Solution x: [1, 2, 3, 4] - !Result solution: !Solution x: [1, 3, 2, 4] - !Result solution: !Solution x: [1, 3, 3, 4] ***/ include "regular_regexp.mzn"; array [1..4] of var 1..4: x :: add_to_output; constraint regular(x, "1 (2|3){2} 4");libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_6.mzn0000644000175000017500000000047213757304533026153 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [A, B, A, C, A, D, A] ***/ include "regular_regexp.mzn"; int: n = 7; enum Letter = {A, B, C, D}; array [1..n] of var Letter: x :: add_to_output; constraint regular(x, "A ((B|C|D) A)*"); constraint forall (i in 1..n-2 where i mod 2 = 0) (x[i] < x[i+2]);libminizinc-2.5.3/tests/spec/unit/globals/regular/globals_regular_regex_1.mzn0000644000175000017500000000027313757304533026145 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [1, 2, 2, 4] ***/ include "regular_regexp.mzn"; array [1..4] of var 1..4: x :: add_to_output; constraint regular(x, "1 2* 4");libminizinc-2.5.3/tests/spec/unit/globals/int_set_channel/0000755000175000017500000000000013757304533022333 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/int_set_channel/globals_int_set_channel.mzn0000644000175000017500000000140513757304533027721 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution chan_avi: [1, 2, 3, 5, 4, 2, 1, 3, 2] chan_avsi: - !!set {1, 7} - !!set {2, 6, 9} - !!set {3, 8} - !!set {5} - !!set {4} ***/ include "int_set_channel.mzn"; %-----------------------------------------------------------------------------% % int_set_channel %-----------------------------------------------------------------------------% array[1..9] of var int: chan_avi :: add_to_output = [_,_,3,_,4,2,_,3,_]; array[1..5] of var set of 1..20: chan_avsi :: add_to_output = [{1,7},{2,6,9},{3,8},{5},{4}]; constraint int_set_channel(chan_avi, chan_avsi); solve satisfy; output [ "chan_avi = array1d(1..9, ", show(chan_avi), ");\n", "chan_avsi = array1d(1..5, ", show(chan_avsi), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/int_set_channel/test_int_set_channel2.mzn0000644000175000017500000000163313757304533027342 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 1, 1, 1, 1, 1, 1, 1, 1] y: - !Range 1..9 - !!set {} - !!set {} - !!set {} - !!set {} - !Result solution: !Solution x: [5, 3, 1, 1, 1, 1, 1, 1, 1] y: - !Range 3..9 - !!set {} - !!set {2} - !!set {} - !!set {1} - !Result solution: !Solution x: [2, 2, 2, 2, 2, 2, 2, 2, 2] y: - !!set {} - !Range 1..9 - !!set {} - !!set {} - !!set {} - !Result solution: !Solution x: [5, 5, 5, 5, 5, 5, 5, 5, 5] y: - !!set {} - !!set {} - !!set {} - !!set {} - !Range 1..9 ***/ include "int_set_channel.mzn"; % Check that the domains of x and y are being restricted % to the index sets. % array[1..9] of var int: x; array[1..5] of var set of 1..20: y; constraint int_set_channel(x, y); solve satisfy; output [ "x = ", show(x), "\n", "y = ", show(y), "\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/decreasing/0000755000175000017500000000000013757304533021302 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/decreasing/globals_decreasing.mzn0000644000175000017500000000204513757304533025640 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inc_avb: [true, false, false, false, false] inc_avi: [5, 3, 3, 1, 1] - !Result solution: !Solution inc_avb: [true, false, false, false, false] inc_avi: [5, 5, 3, 1, 1] - !Result solution: !Solution inc_avb: [true, false, false, false, false] inc_avi: [5, 5, 3, 3, 1] ***/ include "decreasing.mzn"; %-----------------------------------------------------------------------------% % decreasing %-----------------------------------------------------------------------------% array[1..5] of var -100..100: inc_avi ::add_to_output = [5, _, 3, _, 1]; array[1..5] of var bool: inc_avb ::add_to_output = [true, false, _, _, _]; %array[1..8] of var set of 1..3: inc_avsi; % XXX :: is_output constraint decreasing(inc_avi); constraint decreasing(inc_avb); % XXX: comparisons not implemented for sets %constraint increasing(inc_avsi); solve satisfy; output [ "inc_avb = array1d(1..5, ", show(inc_avb), ");\n", "inc_avi = array1d(1..5, ", show(inc_avi), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/inverse_in_range/0000755000175000017500000000000013757304533022513 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/inverse_in_range/globals_inverse_in_range.mzn0000644000175000017500000000215113757304533030260 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inv_f1: [5, 7, 6, 8] inv_f2: [1, 3, 2, 4] - !Result solution: !Solution inv_f1: [5, 7, 6, 4] inv_f2: [1, 3, 2, 5] - !Result solution: !Solution inv_f1: [5, 7, 4, 6] inv_f2: [1, 4, 2, 5] - !Result solution: !Solution inv_f1: [5, 7, 8, 6] inv_f2: [1, 4, 2, 3] - !Result solution: !Solution inv_f1: [5, 7, 4, 4] inv_f2: [1, 5, 2, 5] - !Result solution: !Solution inv_f1: [5, 7, 4, 8] inv_f2: [1, 5, 2, 4] - !Result solution: !Solution inv_f1: [5, 7, 8, 4] inv_f2: [1, 5, 2, 3] ***/ include "inverse_in_range.mzn"; %-----------------------------------------------------------------------------% % inverse %-----------------------------------------------------------------------------% array[1..4] of var 4..8: inv_f1 :: add_to_output = [5, 7, _, _]; array[5..8] of var 1..5: inv_f2 :: add_to_output = array1d(5..8, [1, _, 2, _]); constraint inverse_in_range(inv_f1, inv_f2); solve satisfy; output [ "inv_f1 = array1d(1..4, ", show(inv_f1), ");\n", "inv_f2 = array1d(5..8, ", show(inv_f2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/sum_pred/0000755000175000017500000000000013757304533021014 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/sum_pred/globals_sum_pred.mzn0000644000175000017500000000075013757304533025065 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution sum_s: 13 ***/ include "sum_pred.mzn"; %-----------------------------------------------------------------------------% % sum_pred %-----------------------------------------------------------------------------% % The expected answer for 'sum_s' is 13. var int: sum_s ::add_to_output; constraint sum_pred(3, [{}, {2,3}, {1,3,4}, {4,6}], [1, 3, 5, 7, 9, 11], sum_s); solve satisfy; output ["sum_s = ", show(sum_s), ";\n"]; libminizinc-2.5.3/tests/spec/unit/globals/inverse_set/0000755000175000017500000000000013757304533021524 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/inverse_set/globals_inverse_set.mzn0000644000175000017500000000305113757304533026302 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution invs_f1: - !!set {1} - !Range 3..4 - !Range 2..4 - !Range 1..3 invs_f2: - !!set {1, 4} - !Range 3..4 - !Range 2..4 - !Range 2..3 - !Result solution: !Solution invs_f1: - !!set {1} - !Range 2..4 - !Range 2..4 - !Range 1..2 invs_f2: - !!set {1, 4} - !Range 2..4 - !Range 2..3 - !Range 2..3 - !Result solution: !Solution invs_f1: - !!set {1} - !Range 1..4 - !Range 2..4 - !!set {1} invs_f2: - !!set {1, 2, 4} - !Range 2..3 - !Range 2..3 - !Range 2..3 - !Result solution: !Solution invs_f1: - !!set {1} - !!set {4} - !Range 2..4 - !!set {} invs_f2: - !!set {1} - !!set {3} - !!set {3} - !Range 2..3 - !Result solution: !Solution invs_f1: - !!set {1} - !Range 1..4 - !Range 2..4 - !Range 1..3 invs_f2: - !!set {1, 2, 4} - !Range 2..4 - !Range 2..4 - !Range 2..3 ***/ include "inverse_set.mzn"; %-----------------------------------------------------------------------------% % inverse_set %-----------------------------------------------------------------------------% array[1..4] of var set of 1..5: invs_f1 :: add_to_output = [{1}, _, {2,3,4}, _ ]; array[1..4] of var set of 1..5: invs_f2 :: add_to_output = [_, _, _, {3,2}]; constraint inverse_set(invs_f1, invs_f2); solve satisfy; output [ "invs_f1 = array1d(1..4, ", show(invs_f1), ");\n", "invs_f2 = array1d(1..4, ", show(invs_f2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/cumulative/0000755000175000017500000000000013757304533021354 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/cumulative/globals_cumulative.mzn0000644000175000017500000000106313757304533025763 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution cum_bound: 6 ***/ include "cumulative.mzn"; %-----------------------------------------------------------------------------% % cumulative %-----------------------------------------------------------------------------% var 1..6: cum_bound; constraint cumulative([0, 3, 4, 6, 8, 8], % start [3, 2, 5, 2, 1, 4], % duration [2, 3, 1, 4, 3, 2], % resource usage cum_bound); solve satisfy; output ["cum_bound = ", show(cum_bound), ";\n"]; libminizinc-2.5.3/tests/spec/unit/globals/disjoint/0000755000175000017500000000000013757304533021021 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/disjoint/globals_disjoint.mzn0000644000175000017500000000073213757304533025077 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution disj_s2: !Range 4..5 ***/ include "disjoint.mzn"; %-----------------------------------------------------------------------------% % disjoint %-----------------------------------------------------------------------------% par set of 1..5: disj_s1 = {1,2,3}; var set of 1..5: disj_s2; constraint disjoint(disj_s1, disj_s2); constraint card(disj_s2) = 2; solve satisfy; output ["disj_s2 = ", show(disj_s2), ";\n"]; libminizinc-2.5.3/tests/spec/unit/globals/alldifferent/0000755000175000017500000000000013757304533021635 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/alldifferent/globals_all_different_int.mzn0000644000175000017500000000064613757304533027544 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution alldiff_avi1: [1, 2, 3, 4, 5] ***/ % Test all_different for var int. include "all_different.mzn"; array[5..9] of var 1..5: alldiff_avi1 ::add_to_output = array1d(5..9, [1, _, 3, _, 5]); constraint all_different(alldiff_avi1); constraint alldiff_avi1[6] < alldiff_avi1[8]; solve satisfy; output ["alldiff_avi1 = array1d(5..9, ", show(alldiff_avi1), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/alldifferent/globals_all_different_set.mzn0000644000175000017500000000107413757304533027541 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution alldiff_avsi2: !Unordered - !!set {} - !!set {3} - !!set {2} - !Range 2..3 - !!set {1} - !!set {1, 3} - !Range 1..2 - !Range 1..3 ***/ % Test all_different for var set of int. include "all_different.mzn"; % set of int version % alldiff_avsi2 = [{1, 2, 3}, {1, 2}, {1, 3}, {1}, {2, 3}, {2}, {3}, {}] array[1..8] of var set of 1..3: alldiff_avsi2; constraint all_different(alldiff_avsi2); solve satisfy; output ["alldiff_avsi2 = array1d(1..8, ", show(alldiff_avsi2), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/alldifferent/globals_alldiff_set_nosets.mzn0000644000175000017500000000207413757304533027740 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution alldiff_avsi2: !Unordered - !!set {} - !!set {1} - !Range 1..2 - !Range 1..3 - !!set {1, 3} - !!set {2} - !Range 2..3 - !!set {3} ***/ % Test all_different for var set of int. include "all_different.mzn"; include "nosets.mzn"; % set of int version % alldiff_avsi2 = [{1, 2, 3}, {1, 2}, {1, 3}, {1}, {2, 3}, {2}, {3}, {}] set of int: aa0 = {}; array[1..8] of var set of 1..3: alldiff_avsi2 :: add_to_output = [ aa0, _,_,_,_,_,_,_, ]; constraint alldiff_avsi2[1] = {}; constraint all_different(alldiff_avsi2); constraint forall(i in index_set( alldiff_avsi2 ) diff { max( index_set( alldiff_avsi2 ) ) } ) ( alldiff_avsi2[i] <= alldiff_avsi2[i+1] ); array[int] of var bool: adsab = setarray2bools( alldiff_avsi2 ); solve satisfy; output ["alldiff_avsi2 = array1d(1..8, ", show(alldiff_avsi2), ");\n", % "setaray2bools(alldiff_avsi2) = ", show(adsab), ";\n" ] ++ [ show(set2bools( alldiff_avsi2[i], ub_array(alldiff_avsi2) )) | i in index_set( alldiff_avsi2 ) ] ++ [ "\n" ] ; libminizinc-2.5.3/tests/spec/unit/globals/lex2/0000755000175000017500000000000013757304533020050 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex2/globals_lex2.mzn0000644000175000017500000000235413757304533023157 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution y: - - 1 - 1 - - 1 - 1 - !Solution y: - - 1 - 2 - - 2 - 1 - !Solution y: - - 1 - 1 - - 1 - 2 - !Solution y: - - 1 - 2 - - 1 - 2 - !Solution y: - - 1 - 1 - - 2 - 2 - !Solution y: - - 1 - 2 - - 2 - 2 - !Solution y: - - 2 - 2 - - 2 - 2 options: all_solutions: true --- !Test solvers: [cbc] expected: - !Result solution: !Solution y: - [1, 1] - [1, 1] - !Result solution: !Solution y: - [1, 2] - [2, 1] - !Result solution: !Solution y: - [1, 1] - [1, 2] - !Result solution: !Solution y: - [1, 2] - [1, 2] - !Result solution: !Solution y: - [1, 1] - [2, 2] - !Result solution: !Solution y: - [1, 2] - [2, 2] - !Result solution: !Solution y: - [2, 2] - [2, 2] ***/ include "lex2.mzn"; array[1..2, 1..2] of var 1..2: y ::add_to_output; constraint lex2([|2, 2, 3| 2, 3, 1|]); constraint lex2(y); solve satisfy; output ["y = array2d(1..2, 1..2, ", show(y), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up_closed/0000755000175000017500000000000013757304533025737 5ustar kaolkaol././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up_closed/globals_global_cardinality_low_up_closed.mznlibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality_low_up_closed/globals_global_cardinalit0000644000175000017500000000125113757304533033016 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [6, 5, 3, 3] - !Result solution: !Solution x: [5, 3, 3, 6] - !Result solution: !Solution x: [3, 6, 5, 3] - !Result solution: !Solution x: [3, 3, 5, 6] - !Result solution: !Solution x: [6, 3, 3, 5] - !Result solution: !Solution x: [3, 3, 6, 5] - !Result solution: !Solution x: [5, 6, 3, 3] ***/ include "global_cardinality_low_up_closed.mzn"; array[1..4] of var 0..8: x; constraint global_cardinality_low_up_closed( %[3, 3, 5, 6], x, [3, 5, 6], [2, 1, 1], [3, 2, 1]); solve satisfy; output ["x = array1d(1..4, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/lex_less/0000755000175000017500000000000013757304533021014 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex_less/globals_lex_less.mzn0000644000175000017500000000151213757304533025062 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 100 - 9 - !Result solution: !Solution lex_avi1: - 1 - 3 - 5 - 7 - 9 lex_avi2: - 1 - 3 - 5 - 8 - 9 ***/ include "lex_less.mzn"; %-----------------------------------------------------------------------------% % lex_less %-----------------------------------------------------------------------------% array[1..5] of var -100..100: lex_avi1 ::add_to_output = [1,3,5,7,9]; array[4..8] of var -100..100: lex_avi2 ::add_to_output = array1d(4..8, [1,3,5,_,9]); constraint lex_less(lex_avi1, lex_avi2); solve satisfy; output [ "lex_avi1 = array1d(1..5, ", show(lex_avi1), ");\n", "lex_avi2 = array1d(4..8, ", show(lex_avi2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/lex_less/test_bool_lex_less.mzn0000644000175000017500000000145313757304533025435 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: - false - false y: - true - false - !Solution x: - false - true y: - true - false - !Solution x: - false - false y: - false - true - !Solution x: - false - false y: - true - true - !Solution x: - true - false y: - true - true - !Solution x: - false - true y: - true - true options: all_solutions: true ***/ include "lex_less.mzn"; array[1..2] of var bool: x ::add_to_output; array[1..2] of var bool: y ::add_to_output; constraint lex_less(x, y); solve satisfy; output [ "x = array1d(1..2, ", show(x), ");\n", "y = array1d(1..2, ", show(y), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/count/0000755000175000017500000000000013757304533020326 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/count/globals_count.mzn0000644000175000017500000000310513757304533023706 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution count_avi1: [7, 8, 8, 9, 9, 9, 8, 8] count_avi2: [7, 8, 9, 3, 0, 0, 9, 9] count_avi3: [7, 8, 8, 9, 9, 9, 0, 8] count_avi4: [0, 0, 0, 0, 0, 0, 0, 0] count_vi1: 9 count_vi2: 3 count_vi3: 8 ***/ include "count.mzn"; %-----------------------------------------------------------------------------% % count %-----------------------------------------------------------------------------% var -100..100: count_vi1 ::add_to_output; var -100..100: count_vi2 ::add_to_output; var 8..20: count_vi3 :: add_to_output; array[1..8] of var -100..100: count_avi1 ::add_to_output = [7, 8, 8, 9, 9, 9, _, _]; array[1..8] of var -100..100: count_avi2 ::add_to_output = [7, 8, 9, 3, 0, 0, 9, 9]; array[1..8] of var -100..100: count_avi3 ::add_to_output = [7, 8, 8, 9, 9, 9, 0, 8]; array[1..8] of var -100..100: count_avi4 ::add_to_output; constraint count(count_avi1, 8, 4); % 1st arg unfixed -> [...] constraint count(count_avi2, count_vi1, 3); % 2nd arg unfixed -> 9 constraint count(count_avi3, 8, count_vi2); % 3rd arg unfixed -> 3 constraint count(count_avi4, 0, count_vi3); % 1st arg unfixed -> [0,0,...] solve satisfy; output [ "count_avi1 = array1d(1..8, ", show(count_avi1), ");\n", "count_avi2 = array1d(1..8, ", show(count_avi2), ");\n", "count_avi3 = array1d(1..8, ", show(count_avi3), ");\n", "count_avi4 = array1d(1..8, ", show(count_avi4), ");\n", "count_vi1 = ", show(count_vi1), ";\n", "count_vi2 = ", show(count_vi2), ";\n", "count_vi3 = ", show(count_vi3), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/subcircuit/0000755000175000017500000000000013757304533021352 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/subcircuit/test_subcircuit.mzn0000644000175000017500000001124013757304533025311 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: [1, 2, 3, 4] - !Solution x: [2, 1, 4, 4] - !Solution x: [2, 3, 4, 1] - !Solution x: [2, 1, 4, 1] - !Solution x: [3, 2, 4, 1] - !Solution x: [3, 1, 4, 2] - !Solution x: [3, 1, 4, 1] - !Solution x: [1, 2, 4, 3] - !Solution x: [1, 3, 4, 2] - !Solution x: [1, 3, 2, 4] - !Solution x: [1, 3, 2, 2] - !Solution x: [1, 4, 3, 2] - !Solution x: [1, 4, 2, 2] - !Solution x: [1, 4, 1, 2] - !Solution x: [1, 4, 2, 3] - !Solution x: [1, 3, 2, 1] - !Solution x: [2, 1, 3, 4] - !Solution x: [2, 1, 3, 3] - !Solution x: [2, 3, 1, 4] - !Solution x: [2, 1, 1, 4] - !Solution x: [3, 1, 2, 4] - !Solution x: [4, 1, 2, 3] - !Solution x: [3, 4, 1, 4] - !Solution x: [3, 2, 1, 4] - !Solution x: [3, 1, 1, 4] - !Solution x: [2, 4, 1, 3] - !Solution x: [4, 2, 1, 3] - !Solution x: [4, 1, 1, 3] - !Solution x: [2, 1, 1, 3] - !Solution x: [3, 4, 2, 1] - !Solution x: [4, 3, 3, 1] - !Solution x: [2, 4, 3, 1] - !Solution x: [4, 3, 1, 1] - !Solution x: [4, 3, 1, 2] - !Solution x: [3, 4, 1, 1] - !Solution x: [2, 3, 1, 1] - !Solution x: [2, 4, 1, 1] - !Solution x: [4, 2, 3, 1] - !Solution x: [4, 1, 3, 1] - !Solution x: [4, 2, 2, 1] - !Solution x: [4, 1, 2, 1] - !Solution x: [4, 1, 3, 2] - !Solution x: [2, 1, 3, 1] - !Solution x: [3, 1, 2, 1] - !Solution x: [4, 1, 1, 2] - !Solution x: [4, 2, 1, 1] - !Solution x: [4, 1, 1, 1] - !Solution x: [3, 2, 1, 2] - !Solution x: [3, 2, 1, 1] - !Solution x: [3, 1, 1, 2] - !Solution x: [3, 1, 1, 1] - !Solution x: [2, 1, 1, 1] --- !Test solvers: [cbc] expected: - !Result solution: !Solution x: [1, 2, 3, 4] - !Result solution: !Solution x: [2, 1, 4, 4] - !Result solution: !Solution x: [2, 3, 4, 1] - !Result solution: !Solution x: [2, 1, 4, 1] - !Result solution: !Solution x: [3, 2, 4, 1] - !Result solution: !Solution x: [3, 1, 4, 2] - !Result solution: !Solution x: [3, 1, 4, 1] - !Result solution: !Solution x: [1, 2, 4, 3] - !Result solution: !Solution x: [1, 3, 4, 2] - !Result solution: !Solution x: [1, 3, 2, 4] - !Result solution: !Solution x: [1, 3, 2, 2] - !Result solution: !Solution x: [1, 4, 3, 2] - !Result solution: !Solution x: [1, 4, 2, 2] - !Result solution: !Solution x: [1, 4, 1, 2] - !Result solution: !Solution x: [1, 4, 2, 3] - !Result solution: !Solution x: [1, 3, 2, 1] - !Result solution: !Solution x: [2, 1, 3, 4] - !Result solution: !Solution x: [2, 1, 3, 3] - !Result solution: !Solution x: [2, 3, 1, 4] - !Result solution: !Solution x: [2, 1, 1, 4] - !Result solution: !Solution x: [3, 1, 2, 4] - !Result solution: !Solution x: [4, 1, 2, 3] - !Result solution: !Solution x: [3, 4, 1, 4] - !Result solution: !Solution x: [3, 2, 1, 4] - !Result solution: !Solution x: [3, 1, 1, 4] - !Result solution: !Solution x: [2, 4, 1, 3] - !Result solution: !Solution x: [4, 2, 1, 3] - !Result solution: !Solution x: [4, 1, 1, 3] - !Result solution: !Solution x: [2, 1, 1, 3] - !Result solution: !Solution x: [3, 4, 2, 1] - !Result solution: !Solution x: [4, 3, 3, 1] - !Result solution: !Solution x: [2, 4, 3, 1] - !Result solution: !Solution x: [4, 3, 1, 1] - !Result solution: !Solution x: [4, 3, 1, 2] - !Result solution: !Solution x: [3, 4, 1, 1] - !Result solution: !Solution x: [2, 3, 1, 1] - !Result solution: !Solution x: [2, 4, 1, 1] - !Result solution: !Solution x: [4, 2, 3, 1] - !Result solution: !Solution x: [4, 1, 3, 1] - !Result solution: !Solution x: [4, 2, 2, 1] - !Result solution: !Solution x: [4, 1, 2, 1] - !Result solution: !Solution x: [4, 1, 3, 2] - !Result solution: !Solution x: [2, 1, 3, 1] - !Result solution: !Solution x: [3, 1, 2, 1] - !Result solution: !Solution x: [4, 1, 1, 2] - !Result solution: !Solution x: [4, 2, 1, 1] - !Result solution: !Solution x: [4, 1, 1, 1] - !Result solution: !Solution x: [3, 2, 1, 2] - !Result solution: !Solution x: [3, 2, 1, 1] - !Result solution: !Solution x: [3, 1, 1, 2] - !Result solution: !Solution x: [3, 1, 1, 1] - !Result solution: !Solution x: [2, 1, 1, 1] ***/ include "subcircuit.mzn"; array[1..4] of var 1..4: x :: add_to_output; constraint subcircuit(x); solve satisfy; libminizinc-2.5.3/tests/spec/unit/globals/value_precede_chain/0000755000175000017500000000000013757304533023143 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/value_precede_chain/globals_value_precede_chain_set.mzn0000644000175000017500000001153413757304533032220 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: - !Range 1..4 - !Range 1..4 - !Solution x: - !!set {1, 3, 4} - !Range 1..4 - !Solution x: - !!set {1, 4} - !Range 1..4 - !Solution x: - !!set {1} - !Range 1..4 - !Solution x: - !Range 2..4 - !Range 1..4 - !Solution x: - !Range 3..4 - !Range 1..4 - !Solution x: - !!set {4} - !Range 1..4 - !Solution x: - !!set {} - !Range 1..4 - !Solution x: - !!set {1, 4} - !Range 1..3 - !Solution x: - !!set {4} - !Range 1..3 - !Solution x: - !!set {1, 3, 4} - !!set {1, 2, 4} - !Solution x: - !Range 3..4 - !!set {1, 2, 4} - !Solution x: - !!set {1, 3, 4} - !Range 1..2 - !Solution x: - !Range 3..4 - !Range 1..2 - !Solution x: - !Range 1..4 - !!set {1, 3, 4} - !Solution x: - !!set {1, 3, 4} - !!set {1, 3, 4} - !Solution x: - !!set {1, 4} - !!set {1, 3, 4} - !Solution x: - !!set {1} - !!set {1, 3, 4} - !Solution x: - !Range 2..4 - !!set {1, 3, 4} - !Solution x: - !Range 3..4 - !!set {1, 3, 4} - !Solution x: - !!set {4} - !!set {1, 3, 4} - !Solution x: - !!set {} - !!set {1, 3, 4} - !Solution x: - !!set {1, 4} - !!set {1, 3} - !Solution x: - !!set {4} - !!set {1, 3} - !Solution x: - !Range 1..4 - !!set {1, 4} - !Solution x: - !!set {1, 3, 4} - !!set {1, 4} - !Solution x: - !!set {1, 4} - !!set {1, 4} - !Solution x: - !!set {1} - !!set {1, 4} - !Solution x: - !Range 2..4 - !!set {1, 4} - !Solution x: - !Range 3..4 - !!set {1, 4} - !Solution x: - !!set {4} - !!set {1, 4} - !Solution x: - !!set {} - !!set {1, 4} - !Solution x: - !Range 1..4 - !!set {1} - !Solution x: - !!set {1, 3, 4} - !!set {1} - !Solution x: - !!set {1, 4} - !!set {1} - !Solution x: - !!set {1} - !!set {1} - !Solution x: - !Range 2..4 - !!set {1} - !Solution x: - !Range 3..4 - !!set {1} - !Solution x: - !!set {4} - !!set {1} - !Solution x: - !!set {} - !!set {1} - !Solution x: - !Range 1..4 - !Range 2..4 - !Solution x: - !!set {1, 3, 4} - !Range 2..4 - !Solution x: - !!set {1, 4} - !Range 2..4 - !Solution x: - !!set {1} - !Range 2..4 - !Solution x: - !Range 2..4 - !Range 2..4 - !Solution x: - !Range 3..4 - !Range 2..4 - !Solution x: - !!set {4} - !Range 2..4 - !Solution x: - !!set {} - !Range 2..4 - !Solution x: - !!set {1, 4} - !Range 2..3 - !Solution x: - !!set {4} - !Range 2..3 - !Solution x: - !!set {1, 3, 4} - !!set {2, 4} - !Solution x: - !Range 3..4 - !!set {2, 4} - !Solution x: - !!set {1, 3, 4} - !!set {2} - !Solution x: - !Range 3..4 - !!set {2} - !Solution x: - !Range 1..4 - !Range 3..4 - !Solution x: - !!set {1, 3, 4} - !Range 3..4 - !Solution x: - !!set {1, 4} - !Range 3..4 - !Solution x: - !!set {1} - !Range 3..4 - !Solution x: - !Range 2..4 - !Range 3..4 - !Solution x: - !Range 3..4 - !Range 3..4 - !Solution x: - !!set {4} - !Range 3..4 - !Solution x: - !!set {} - !Range 3..4 - !Solution x: - !!set {1, 4} - !!set {3} - !Solution x: - !!set {4} - !!set {3} - !Solution x: - !Range 1..4 - !!set {4} - !Solution x: - !!set {1, 3, 4} - !!set {4} - !Solution x: - !!set {1, 4} - !!set {4} - !Solution x: - !!set {1} - !!set {4} - !Solution x: - !Range 2..4 - !!set {4} - !Solution x: - !Range 3..4 - !!set {4} - !Solution x: - !!set {4} - !!set {4} - !Solution x: - !!set {} - !!set {4} - !Solution x: - !Range 1..4 - !!set {} - !Solution x: - !!set {1, 3, 4} - !!set {} - !Solution x: - !!set {1, 4} - !!set {} - !Solution x: - !!set {1} - !!set {} - !Solution x: - !Range 2..4 - !!set {} - !Solution x: - !Range 3..4 - !!set {} - !Solution x: - !!set {4} - !!set {} - !Solution x: - !!set {} - !!set {} options: all_solutions: true ***/ include "value_precede_chain.mzn"; % A test for value_precede_chain for set variables. array[1..2] of var set of 1..4: x; constraint value_precede_chain([3, 2, 1], [{3}, {2}, {1}]); constraint value_precede_chain([4, 3, 2], x); solve satisfy; output ["x = array1d(1..2, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/value_precede_chain/globals_value_precede_chain_int.mzn0000644000175000017500000000156413757304533032221 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution x: [1, 1, 1] - !Solution x: [4, 1, 1] - !Solution x: [4, 1, 3] - !Solution x: [1, 1, 4] - !Solution x: [4, 1, 4] - !Solution x: [4, 3, 1] - !Solution x: [4, 3, 2] - !Solution x: [4, 3, 3] - !Solution x: [4, 3, 4] - !Solution x: [1, 4, 1] - !Solution x: [4, 4, 1] - !Solution x: [1, 4, 3] - !Solution x: [4, 4, 3] - !Solution x: [1, 4, 4] - !Solution x: [4, 4, 4] options: all_solutions: true ***/ % A test for value_precede_chain for integer variables. include "value_precede_chain.mzn"; array[1..3] of var 1..4: x ::add_to_output; constraint value_precede_chain([3, 2, 1], [3, 2, 1]); constraint value_precede_chain([4, 3, 2], x); solve satisfy; output ["x = array1d(1..3, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/among/0000755000175000017500000000000013757304533020277 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/among/globals_among.mzn0000644000175000017500000000202413757304533023627 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution among_avi1: [4, 5, 5, 6, 6, 6, 7, 7, 7, 7] among_avi2: [4, 5, 5, 6, 6, 6, 7, 7, 8, 8] among_vi: 7 ***/ include "among.mzn"; %-----------------------------------------------------------------------------% % among %-----------------------------------------------------------------------------% var -100..100: among_vi ::add_to_output; array[1..10] of var -100..100: among_avi1 ::add_to_output = [4, 5, 5, 6, 6, 6, 7, 7, 7, 7]; array[1..10] of var -100..100: among_avi2 ::add_to_output = [4, 5, 5, 6, 6, 6, _, _, 8, 8]; % Testing it three ways, with different args unfixed each time. constraint among(among_vi, among_avi1, {6,7}); % 1st arg unfixed -> 7 constraint among(5, among_avi2, {6,7}); % 2nd arg unfixed -> [...] constraint forall(i in 7..10) ( among_avi2[i] != 6 ); solve satisfy; output [ "among_avi1 = array1d(1..10, ", show(among_avi1), ");\n", "among_avi2 = array1d(1..10, ", show(among_avi2), ");\n", "among_vi = ", show(among_vi), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/circuit/0000755000175000017500000000000013757304533020640 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/circuit/test_circuit.mzn0000644000175000017500000000452213757304533024072 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution c1: [3, 4, 2, 1] c2: [4, 5, 3, 2] - !Solution c1: [2, 3, 4, 1] c2: [4, 5, 3, 2] - !Solution c1: [4, 3, 1, 2] c2: [4, 5, 3, 2] - !Solution c1: [3, 1, 4, 2] c2: [4, 5, 3, 2] - !Solution c1: [2, 4, 1, 3] c2: [4, 5, 3, 2] - !Solution c1: [4, 1, 2, 3] c2: [4, 5, 3, 2] - !Solution c1: [3, 4, 2, 1] c2: [3, 4, 5, 2] - !Solution c1: [2, 3, 4, 1] c2: [3, 4, 5, 2] - !Solution c1: [4, 3, 1, 2] c2: [3, 4, 5, 2] - !Solution c1: [3, 1, 4, 2] c2: [3, 4, 5, 2] - !Solution c1: [2, 4, 1, 3] c2: [3, 4, 5, 2] - !Solution c1: [4, 1, 2, 3] c2: [3, 4, 5, 2] - !Solution c1: [3, 4, 2, 1] c2: [5, 4, 2, 3] - !Solution c1: [2, 3, 4, 1] c2: [5, 4, 2, 3] - !Solution c1: [4, 3, 1, 2] c2: [5, 4, 2, 3] - !Solution c1: [3, 1, 4, 2] c2: [5, 4, 2, 3] - !Solution c1: [2, 4, 1, 3] c2: [5, 4, 2, 3] - !Solution c1: [4, 1, 2, 3] c2: [5, 4, 2, 3] - !Solution c1: [3, 4, 2, 1] c2: [4, 2, 5, 3] - !Solution c1: [2, 3, 4, 1] c2: [4, 2, 5, 3] - !Solution c1: [4, 3, 1, 2] c2: [4, 2, 5, 3] - !Solution c1: [3, 1, 4, 2] c2: [4, 2, 5, 3] - !Solution c1: [2, 4, 1, 3] c2: [4, 2, 5, 3] - !Solution c1: [4, 1, 2, 3] c2: [4, 2, 5, 3] - !Solution c1: [3, 4, 2, 1] c2: [3, 5, 2, 4] - !Solution c1: [2, 3, 4, 1] c2: [3, 5, 2, 4] - !Solution c1: [4, 3, 1, 2] c2: [3, 5, 2, 4] - !Solution c1: [3, 1, 4, 2] c2: [3, 5, 2, 4] - !Solution c1: [2, 4, 1, 3] c2: [3, 5, 2, 4] - !Solution c1: [4, 1, 2, 3] c2: [3, 5, 2, 4] - !Solution c1: [3, 4, 2, 1] c2: [5, 2, 3, 4] - !Solution c1: [2, 3, 4, 1] c2: [5, 2, 3, 4] - !Solution c1: [4, 3, 1, 2] c2: [5, 2, 3, 4] - !Solution c1: [3, 1, 4, 2] c2: [5, 2, 3, 4] - !Solution c1: [2, 4, 1, 3] c2: [5, 2, 3, 4] - !Solution c1: [4, 1, 2, 3] c2: [5, 2, 3, 4] options: all_solutions: true ***/ include "circuit.mzn"; array[1..4] of var 1..4: c1; array[2..5] of var -100..100: c2; constraint circuit(c1); constraint circuit(c2); solve satisfy; output [ "c1 = array1d(1..4, ", show(c1), ");\n", "c2 = array1d(2..5, ", show(c2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/sliding_sum/0000755000175000017500000000000013757304533021513 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/sliding_sum/globals_sliding_sum.mzn0000644000175000017500000000112313757304533026256 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution seq_avi: [-99, 0, 99, -99, 0, 99, -99] ***/ include "sliding_sum.mzn"; %-----------------------------------------------------------------------------% % sliding_sum %-----------------------------------------------------------------------------% array[1..7] of var -100..100: seq_avi ::add_to_output = [_, 0, 99, _, _, _, _]; constraint sliding_sum(0, 0, 3, seq_avi); % Example from the GCC. % constraint sliding_sum(3, 7, 4, [1, 4, 2, 0, 0, 3, 4]); solve satisfy; output ["seq_avi = array1d(1..7, ", show(seq_avi), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/bin_packing/0000755000175000017500000000000013757304533021442 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/bin_packing/globals_bin_packing.mzn0000644000175000017500000014541613757304533026152 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution bins: [4, 4, 3, 3, 2, 1] - !Solution bins: [5, 4, 3, 3, 2, 1] - !Solution bins: [4, 5, 3, 3, 2, 1] - !Solution bins: [5, 5, 3, 3, 2, 1] - !Solution bins: [4, 3, 4, 3, 2, 1] - !Solution bins: [5, 3, 4, 3, 2, 1] - !Solution bins: [3, 4, 4, 3, 2, 1] - !Solution bins: [4, 4, 4, 3, 2, 1] - !Solution bins: [5, 4, 4, 3, 2, 1] - !Solution bins: [3, 5, 4, 3, 2, 1] - !Solution bins: [4, 5, 4, 3, 2, 1] - !Solution bins: [5, 5, 4, 3, 2, 1] - !Solution bins: [4, 3, 5, 3, 2, 1] - !Solution bins: [5, 3, 5, 3, 2, 1] - !Solution bins: [3, 4, 5, 3, 2, 1] - !Solution bins: [4, 4, 5, 3, 2, 1] - !Solution bins: [5, 4, 5, 3, 2, 1] - !Solution bins: [3, 5, 5, 3, 2, 1] - !Solution bins: [4, 5, 5, 3, 2, 1] - !Solution bins: [5, 5, 5, 3, 2, 1] - !Solution bins: [3, 3, 3, 4, 2, 1] - !Solution bins: [4, 3, 3, 4, 2, 1] - !Solution bins: [5, 3, 3, 4, 2, 1] - !Solution bins: [3, 4, 3, 4, 2, 1] - !Solution bins: [5, 4, 3, 4, 2, 1] - !Solution bins: [3, 5, 3, 4, 2, 1] - !Solution bins: [4, 5, 3, 4, 2, 1] - !Solution bins: [5, 5, 3, 4, 2, 1] - !Solution bins: [3, 3, 4, 4, 2, 1] - !Solution bins: [5, 3, 4, 4, 2, 1] - !Solution bins: [3, 5, 4, 4, 2, 1] - !Solution bins: [5, 5, 4, 4, 2, 1] - !Solution bins: [3, 3, 5, 4, 2, 1] - !Solution bins: [4, 3, 5, 4, 2, 1] - !Solution bins: [5, 3, 5, 4, 2, 1] - !Solution bins: [3, 4, 5, 4, 2, 1] - !Solution bins: [5, 4, 5, 4, 2, 1] - !Solution bins: [3, 5, 5, 4, 2, 1] - !Solution bins: [4, 5, 5, 4, 2, 1] - !Solution bins: [5, 5, 5, 4, 2, 1] - !Solution bins: [3, 3, 3, 5, 2, 1] - !Solution bins: [4, 3, 3, 5, 2, 1] - !Solution bins: [5, 3, 3, 5, 2, 1] - !Solution bins: [3, 4, 3, 5, 2, 1] - !Solution bins: [4, 4, 3, 5, 2, 1] - !Solution bins: [5, 4, 3, 5, 2, 1] - !Solution bins: [3, 5, 3, 5, 2, 1] - !Solution bins: [4, 5, 3, 5, 2, 1] - !Solution bins: [3, 3, 4, 5, 2, 1] - !Solution bins: [4, 3, 4, 5, 2, 1] - !Solution bins: [5, 3, 4, 5, 2, 1] - !Solution bins: [3, 4, 4, 5, 2, 1] - !Solution bins: [4, 4, 4, 5, 2, 1] - !Solution bins: [5, 4, 4, 5, 2, 1] - !Solution bins: [3, 5, 4, 5, 2, 1] - !Solution bins: [4, 5, 4, 5, 2, 1] - !Solution bins: [3, 3, 5, 5, 2, 1] - !Solution bins: [4, 3, 5, 5, 2, 1] - !Solution bins: [3, 4, 5, 5, 2, 1] - !Solution bins: [4, 4, 5, 5, 2, 1] - !Solution bins: [4, 4, 2, 2, 3, 1] - !Solution bins: [5, 4, 2, 2, 3, 1] - !Solution bins: [4, 5, 2, 2, 3, 1] - !Solution bins: [5, 5, 2, 2, 3, 1] - !Solution bins: [4, 2, 4, 2, 3, 1] - !Solution bins: [5, 2, 4, 2, 3, 1] - !Solution bins: [2, 4, 4, 2, 3, 1] - !Solution bins: [4, 4, 4, 2, 3, 1] - !Solution bins: [5, 4, 4, 2, 3, 1] - !Solution bins: [2, 5, 4, 2, 3, 1] - !Solution bins: [4, 5, 4, 2, 3, 1] - !Solution bins: [5, 5, 4, 2, 3, 1] - !Solution bins: [4, 2, 5, 2, 3, 1] - !Solution bins: [5, 2, 5, 2, 3, 1] - !Solution bins: [2, 4, 5, 2, 3, 1] - !Solution bins: [4, 4, 5, 2, 3, 1] - !Solution bins: [5, 4, 5, 2, 3, 1] - !Solution bins: [2, 5, 5, 2, 3, 1] - !Solution bins: [4, 5, 5, 2, 3, 1] - !Solution bins: [5, 5, 5, 2, 3, 1] - !Solution bins: [2, 2, 2, 4, 3, 1] - !Solution bins: [4, 2, 2, 4, 3, 1] - !Solution bins: [5, 2, 2, 4, 3, 1] - !Solution bins: [2, 4, 2, 4, 3, 1] - !Solution bins: [5, 4, 2, 4, 3, 1] - !Solution bins: [2, 5, 2, 4, 3, 1] - !Solution bins: [4, 5, 2, 4, 3, 1] - !Solution bins: [5, 5, 2, 4, 3, 1] - !Solution bins: [2, 2, 4, 4, 3, 1] - !Solution bins: [5, 2, 4, 4, 3, 1] - !Solution bins: [2, 5, 4, 4, 3, 1] - !Solution bins: [5, 5, 4, 4, 3, 1] - !Solution bins: [2, 2, 5, 4, 3, 1] - !Solution bins: [4, 2, 5, 4, 3, 1] - !Solution bins: [5, 2, 5, 4, 3, 1] - !Solution bins: [2, 4, 5, 4, 3, 1] - !Solution bins: [5, 4, 5, 4, 3, 1] - !Solution bins: [2, 5, 5, 4, 3, 1] - !Solution bins: [4, 5, 5, 4, 3, 1] - !Solution bins: [5, 5, 5, 4, 3, 1] - !Solution bins: [2, 2, 2, 5, 3, 1] - !Solution bins: [4, 2, 2, 5, 3, 1] - !Solution bins: [5, 2, 2, 5, 3, 1] - !Solution bins: [2, 4, 2, 5, 3, 1] - !Solution bins: [4, 4, 2, 5, 3, 1] - !Solution bins: [5, 4, 2, 5, 3, 1] - !Solution bins: [2, 5, 2, 5, 3, 1] - !Solution bins: [4, 5, 2, 5, 3, 1] - !Solution bins: [2, 2, 4, 5, 3, 1] - !Solution bins: [4, 2, 4, 5, 3, 1] - !Solution bins: [5, 2, 4, 5, 3, 1] - !Solution bins: [2, 4, 4, 5, 3, 1] - !Solution bins: [4, 4, 4, 5, 3, 1] - !Solution bins: [5, 4, 4, 5, 3, 1] - !Solution bins: [2, 5, 4, 5, 3, 1] - !Solution bins: [4, 5, 4, 5, 3, 1] - !Solution bins: [2, 2, 5, 5, 3, 1] - !Solution bins: [4, 2, 5, 5, 3, 1] - !Solution bins: [2, 4, 5, 5, 3, 1] - !Solution bins: [4, 4, 5, 5, 3, 1] - !Solution bins: [3, 3, 2, 2, 4, 1] - !Solution bins: [5, 3, 2, 2, 4, 1] - !Solution bins: [3, 5, 2, 2, 4, 1] - !Solution bins: [5, 5, 2, 2, 4, 1] - !Solution bins: [3, 2, 3, 2, 4, 1] - !Solution bins: [5, 2, 3, 2, 4, 1] - !Solution bins: [2, 3, 3, 2, 4, 1] - !Solution bins: [3, 3, 3, 2, 4, 1] - !Solution bins: [5, 3, 3, 2, 4, 1] - !Solution bins: [2, 5, 3, 2, 4, 1] - !Solution bins: [3, 5, 3, 2, 4, 1] - !Solution bins: [5, 5, 3, 2, 4, 1] - !Solution bins: [3, 2, 5, 2, 4, 1] - !Solution bins: [5, 2, 5, 2, 4, 1] - !Solution bins: [2, 3, 5, 2, 4, 1] - !Solution bins: [3, 3, 5, 2, 4, 1] - !Solution bins: [5, 3, 5, 2, 4, 1] - !Solution bins: [2, 5, 5, 2, 4, 1] - !Solution bins: [3, 5, 5, 2, 4, 1] - !Solution bins: [5, 5, 5, 2, 4, 1] - !Solution bins: [2, 2, 2, 3, 4, 1] - !Solution bins: [3, 2, 2, 3, 4, 1] - !Solution bins: [5, 2, 2, 3, 4, 1] - !Solution bins: [2, 3, 2, 3, 4, 1] - !Solution bins: [5, 3, 2, 3, 4, 1] - !Solution bins: [2, 5, 2, 3, 4, 1] - !Solution bins: [3, 5, 2, 3, 4, 1] - !Solution bins: [5, 5, 2, 3, 4, 1] - !Solution bins: [2, 2, 3, 3, 4, 1] - !Solution bins: [5, 2, 3, 3, 4, 1] - !Solution bins: [2, 5, 3, 3, 4, 1] - !Solution bins: [5, 5, 3, 3, 4, 1] - !Solution bins: [2, 2, 5, 3, 4, 1] - !Solution bins: [3, 2, 5, 3, 4, 1] - !Solution bins: [5, 2, 5, 3, 4, 1] - !Solution bins: [2, 3, 5, 3, 4, 1] - !Solution bins: [5, 3, 5, 3, 4, 1] - !Solution bins: [2, 5, 5, 3, 4, 1] - !Solution bins: [3, 5, 5, 3, 4, 1] - !Solution bins: [5, 5, 5, 3, 4, 1] - !Solution bins: [2, 2, 2, 5, 4, 1] - !Solution bins: [3, 2, 2, 5, 4, 1] - !Solution bins: [5, 2, 2, 5, 4, 1] - !Solution bins: [2, 3, 2, 5, 4, 1] - !Solution bins: [3, 3, 2, 5, 4, 1] - !Solution bins: [5, 3, 2, 5, 4, 1] - !Solution bins: [2, 5, 2, 5, 4, 1] - !Solution bins: [3, 5, 2, 5, 4, 1] - !Solution bins: [2, 2, 3, 5, 4, 1] - !Solution bins: [3, 2, 3, 5, 4, 1] - !Solution bins: [5, 2, 3, 5, 4, 1] - !Solution bins: [2, 3, 3, 5, 4, 1] - !Solution bins: [3, 3, 3, 5, 4, 1] - !Solution bins: [5, 3, 3, 5, 4, 1] - !Solution bins: [2, 5, 3, 5, 4, 1] - !Solution bins: [3, 5, 3, 5, 4, 1] - !Solution bins: [2, 2, 5, 5, 4, 1] - !Solution bins: [3, 2, 5, 5, 4, 1] - !Solution bins: [2, 3, 5, 5, 4, 1] - !Solution bins: [3, 3, 5, 5, 4, 1] - !Solution bins: [3, 3, 2, 2, 5, 1] - !Solution bins: [4, 3, 2, 2, 5, 1] - !Solution bins: [3, 4, 2, 2, 5, 1] - !Solution bins: [4, 4, 2, 2, 5, 1] - !Solution bins: [3, 2, 3, 2, 5, 1] - !Solution bins: [4, 2, 3, 2, 5, 1] - !Solution bins: [2, 3, 3, 2, 5, 1] - !Solution bins: [3, 3, 3, 2, 5, 1] - !Solution bins: [4, 3, 3, 2, 5, 1] - !Solution bins: [2, 4, 3, 2, 5, 1] - !Solution bins: [3, 4, 3, 2, 5, 1] - !Solution bins: [4, 4, 3, 2, 5, 1] - !Solution bins: [3, 2, 4, 2, 5, 1] - !Solution bins: [4, 2, 4, 2, 5, 1] - !Solution bins: [2, 3, 4, 2, 5, 1] - !Solution bins: [3, 3, 4, 2, 5, 1] - !Solution bins: [4, 3, 4, 2, 5, 1] - !Solution bins: [2, 4, 4, 2, 5, 1] - !Solution bins: [3, 4, 4, 2, 5, 1] - !Solution bins: [4, 4, 4, 2, 5, 1] - !Solution bins: [2, 2, 2, 3, 5, 1] - !Solution bins: [3, 2, 2, 3, 5, 1] - !Solution bins: [4, 2, 2, 3, 5, 1] - !Solution bins: [2, 3, 2, 3, 5, 1] - !Solution bins: [4, 3, 2, 3, 5, 1] - !Solution bins: [2, 4, 2, 3, 5, 1] - !Solution bins: [3, 4, 2, 3, 5, 1] - !Solution bins: [4, 4, 2, 3, 5, 1] - !Solution bins: [2, 2, 3, 3, 5, 1] - !Solution bins: [4, 2, 3, 3, 5, 1] - !Solution bins: [2, 4, 3, 3, 5, 1] - !Solution bins: [4, 4, 3, 3, 5, 1] - !Solution bins: [2, 2, 4, 3, 5, 1] - !Solution bins: [3, 2, 4, 3, 5, 1] - !Solution bins: [4, 2, 4, 3, 5, 1] - !Solution bins: [2, 3, 4, 3, 5, 1] - !Solution bins: [4, 3, 4, 3, 5, 1] - !Solution bins: [2, 4, 4, 3, 5, 1] - !Solution bins: [3, 4, 4, 3, 5, 1] - !Solution bins: [4, 4, 4, 3, 5, 1] - !Solution bins: [2, 2, 2, 4, 5, 1] - !Solution bins: [3, 2, 2, 4, 5, 1] - !Solution bins: [4, 2, 2, 4, 5, 1] - !Solution bins: [2, 3, 2, 4, 5, 1] - !Solution bins: [3, 3, 2, 4, 5, 1] - !Solution bins: [4, 3, 2, 4, 5, 1] - !Solution bins: [2, 4, 2, 4, 5, 1] - !Solution bins: [3, 4, 2, 4, 5, 1] - !Solution bins: [2, 2, 3, 4, 5, 1] - !Solution bins: [3, 2, 3, 4, 5, 1] - !Solution bins: [4, 2, 3, 4, 5, 1] - !Solution bins: [2, 3, 3, 4, 5, 1] - !Solution bins: [3, 3, 3, 4, 5, 1] - !Solution bins: [4, 3, 3, 4, 5, 1] - !Solution bins: [2, 4, 3, 4, 5, 1] - !Solution bins: [3, 4, 3, 4, 5, 1] - !Solution bins: [2, 2, 4, 4, 5, 1] - !Solution bins: [3, 2, 4, 4, 5, 1] - !Solution bins: [2, 3, 4, 4, 5, 1] - !Solution bins: [3, 3, 4, 4, 5, 1] - !Solution bins: [4, 4, 3, 3, 1, 2] - !Solution bins: [5, 4, 3, 3, 1, 2] - !Solution bins: [4, 5, 3, 3, 1, 2] - !Solution bins: [5, 5, 3, 3, 1, 2] - !Solution bins: [4, 3, 4, 3, 1, 2] - !Solution bins: [5, 3, 4, 3, 1, 2] - !Solution bins: [3, 4, 4, 3, 1, 2] - !Solution bins: [4, 4, 4, 3, 1, 2] - !Solution bins: [5, 4, 4, 3, 1, 2] - !Solution bins: [3, 5, 4, 3, 1, 2] - !Solution bins: [4, 5, 4, 3, 1, 2] - !Solution bins: [5, 5, 4, 3, 1, 2] - !Solution bins: [4, 3, 5, 3, 1, 2] - !Solution bins: [5, 3, 5, 3, 1, 2] - !Solution bins: [3, 4, 5, 3, 1, 2] - !Solution bins: [4, 4, 5, 3, 1, 2] - !Solution bins: [5, 4, 5, 3, 1, 2] - !Solution bins: [3, 5, 5, 3, 1, 2] - !Solution bins: [4, 5, 5, 3, 1, 2] - !Solution bins: [5, 5, 5, 3, 1, 2] - !Solution bins: [3, 3, 3, 4, 1, 2] - !Solution bins: [4, 3, 3, 4, 1, 2] - !Solution bins: [5, 3, 3, 4, 1, 2] - !Solution bins: [3, 4, 3, 4, 1, 2] - !Solution bins: [5, 4, 3, 4, 1, 2] - !Solution bins: [3, 5, 3, 4, 1, 2] - !Solution bins: [4, 5, 3, 4, 1, 2] - !Solution bins: [5, 5, 3, 4, 1, 2] - !Solution bins: [3, 3, 4, 4, 1, 2] - !Solution bins: [5, 3, 4, 4, 1, 2] - !Solution bins: [3, 5, 4, 4, 1, 2] - !Solution bins: [5, 5, 4, 4, 1, 2] - !Solution bins: [3, 3, 5, 4, 1, 2] - !Solution bins: [4, 3, 5, 4, 1, 2] - !Solution bins: [5, 3, 5, 4, 1, 2] - !Solution bins: [3, 4, 5, 4, 1, 2] - !Solution bins: [5, 4, 5, 4, 1, 2] - !Solution bins: [3, 5, 5, 4, 1, 2] - !Solution bins: [4, 5, 5, 4, 1, 2] - !Solution bins: [5, 5, 5, 4, 1, 2] - !Solution bins: [3, 3, 3, 5, 1, 2] - !Solution bins: [4, 3, 3, 5, 1, 2] - !Solution bins: [5, 3, 3, 5, 1, 2] - !Solution bins: [3, 4, 3, 5, 1, 2] - !Solution bins: [4, 4, 3, 5, 1, 2] - !Solution bins: [5, 4, 3, 5, 1, 2] - !Solution bins: [3, 5, 3, 5, 1, 2] - !Solution bins: [4, 5, 3, 5, 1, 2] - !Solution bins: [3, 3, 4, 5, 1, 2] - !Solution bins: [4, 3, 4, 5, 1, 2] - !Solution bins: [5, 3, 4, 5, 1, 2] - !Solution bins: [3, 4, 4, 5, 1, 2] - !Solution bins: [4, 4, 4, 5, 1, 2] - !Solution bins: [5, 4, 4, 5, 1, 2] - !Solution bins: [3, 5, 4, 5, 1, 2] - !Solution bins: [4, 5, 4, 5, 1, 2] - !Solution bins: [3, 3, 5, 5, 1, 2] - !Solution bins: [4, 3, 5, 5, 1, 2] - !Solution bins: [3, 4, 5, 5, 1, 2] - !Solution bins: [4, 4, 5, 5, 1, 2] - !Solution bins: [4, 4, 1, 1, 3, 2] - !Solution bins: [5, 4, 1, 1, 3, 2] - !Solution bins: [4, 5, 1, 1, 3, 2] - !Solution bins: [5, 5, 1, 1, 3, 2] - !Solution bins: [4, 1, 4, 1, 3, 2] - !Solution bins: [5, 1, 4, 1, 3, 2] - !Solution bins: [1, 4, 4, 1, 3, 2] - !Solution bins: [4, 4, 4, 1, 3, 2] - !Solution bins: [5, 4, 4, 1, 3, 2] - !Solution bins: [1, 5, 4, 1, 3, 2] - !Solution bins: [4, 5, 4, 1, 3, 2] - !Solution bins: [5, 5, 4, 1, 3, 2] - !Solution bins: [4, 1, 5, 1, 3, 2] - !Solution bins: [5, 1, 5, 1, 3, 2] - !Solution bins: [1, 4, 5, 1, 3, 2] - !Solution bins: [4, 4, 5, 1, 3, 2] - !Solution bins: [5, 4, 5, 1, 3, 2] - !Solution bins: [1, 5, 5, 1, 3, 2] - !Solution bins: [4, 5, 5, 1, 3, 2] - !Solution bins: [5, 5, 5, 1, 3, 2] - !Solution bins: [1, 1, 1, 4, 3, 2] - !Solution bins: [4, 1, 1, 4, 3, 2] - !Solution bins: [5, 1, 1, 4, 3, 2] - !Solution bins: [1, 4, 1, 4, 3, 2] - !Solution bins: [5, 4, 1, 4, 3, 2] - !Solution bins: [1, 5, 1, 4, 3, 2] - !Solution bins: [4, 5, 1, 4, 3, 2] - !Solution bins: [5, 5, 1, 4, 3, 2] - !Solution bins: [1, 1, 4, 4, 3, 2] - !Solution bins: [5, 1, 4, 4, 3, 2] - !Solution bins: [1, 5, 4, 4, 3, 2] - !Solution bins: [5, 5, 4, 4, 3, 2] - !Solution bins: [1, 1, 5, 4, 3, 2] - !Solution bins: [4, 1, 5, 4, 3, 2] - !Solution bins: [5, 1, 5, 4, 3, 2] - !Solution bins: [1, 4, 5, 4, 3, 2] - !Solution bins: [5, 4, 5, 4, 3, 2] - !Solution bins: [1, 5, 5, 4, 3, 2] - !Solution bins: [4, 5, 5, 4, 3, 2] - !Solution bins: [5, 5, 5, 4, 3, 2] - !Solution bins: [1, 1, 1, 5, 3, 2] - !Solution bins: [4, 1, 1, 5, 3, 2] - !Solution bins: [5, 1, 1, 5, 3, 2] - !Solution bins: [1, 4, 1, 5, 3, 2] - !Solution bins: [4, 4, 1, 5, 3, 2] - !Solution bins: [5, 4, 1, 5, 3, 2] - !Solution bins: [1, 5, 1, 5, 3, 2] - !Solution bins: [4, 5, 1, 5, 3, 2] - !Solution bins: [1, 1, 4, 5, 3, 2] - !Solution bins: [4, 1, 4, 5, 3, 2] - !Solution bins: [5, 1, 4, 5, 3, 2] - !Solution bins: [1, 4, 4, 5, 3, 2] - !Solution bins: [4, 4, 4, 5, 3, 2] - !Solution bins: [5, 4, 4, 5, 3, 2] - !Solution bins: [1, 5, 4, 5, 3, 2] - !Solution bins: [4, 5, 4, 5, 3, 2] - !Solution bins: [1, 1, 5, 5, 3, 2] - !Solution bins: [4, 1, 5, 5, 3, 2] - !Solution bins: [1, 4, 5, 5, 3, 2] - !Solution bins: [4, 4, 5, 5, 3, 2] - !Solution bins: [3, 3, 1, 1, 4, 2] - !Solution bins: [5, 3, 1, 1, 4, 2] - !Solution bins: [3, 5, 1, 1, 4, 2] - !Solution bins: [5, 5, 1, 1, 4, 2] - !Solution bins: [3, 1, 3, 1, 4, 2] - !Solution bins: [5, 1, 3, 1, 4, 2] - !Solution bins: [1, 3, 3, 1, 4, 2] - !Solution bins: [3, 3, 3, 1, 4, 2] - !Solution bins: [5, 3, 3, 1, 4, 2] - !Solution bins: [1, 5, 3, 1, 4, 2] - !Solution bins: [3, 5, 3, 1, 4, 2] - !Solution bins: [5, 5, 3, 1, 4, 2] - !Solution bins: [3, 1, 5, 1, 4, 2] - !Solution bins: [5, 1, 5, 1, 4, 2] - !Solution bins: [1, 3, 5, 1, 4, 2] - !Solution bins: [3, 3, 5, 1, 4, 2] - !Solution bins: [5, 3, 5, 1, 4, 2] - !Solution bins: [1, 5, 5, 1, 4, 2] - !Solution bins: [3, 5, 5, 1, 4, 2] - !Solution bins: [5, 5, 5, 1, 4, 2] - !Solution bins: [1, 1, 1, 3, 4, 2] - !Solution bins: [3, 1, 1, 3, 4, 2] - !Solution bins: [5, 1, 1, 3, 4, 2] - !Solution bins: [1, 3, 1, 3, 4, 2] - !Solution bins: [5, 3, 1, 3, 4, 2] - !Solution bins: [1, 5, 1, 3, 4, 2] - !Solution bins: [3, 5, 1, 3, 4, 2] - !Solution bins: [5, 5, 1, 3, 4, 2] - !Solution bins: [1, 1, 3, 3, 4, 2] - !Solution bins: [5, 1, 3, 3, 4, 2] - !Solution bins: [1, 5, 3, 3, 4, 2] - !Solution bins: [5, 5, 3, 3, 4, 2] - !Solution bins: [1, 1, 5, 3, 4, 2] - !Solution bins: [3, 1, 5, 3, 4, 2] - !Solution bins: [5, 1, 5, 3, 4, 2] - !Solution bins: [1, 3, 5, 3, 4, 2] - !Solution bins: [5, 3, 5, 3, 4, 2] - !Solution bins: [1, 5, 5, 3, 4, 2] - !Solution bins: [3, 5, 5, 3, 4, 2] - !Solution bins: [5, 5, 5, 3, 4, 2] - !Solution bins: [1, 1, 1, 5, 4, 2] - !Solution bins: [3, 1, 1, 5, 4, 2] - !Solution bins: [5, 1, 1, 5, 4, 2] - !Solution bins: [1, 3, 1, 5, 4, 2] - !Solution bins: [3, 3, 1, 5, 4, 2] - !Solution bins: [5, 3, 1, 5, 4, 2] - !Solution bins: [1, 5, 1, 5, 4, 2] - !Solution bins: [3, 5, 1, 5, 4, 2] - !Solution bins: [1, 1, 3, 5, 4, 2] - !Solution bins: [3, 1, 3, 5, 4, 2] - !Solution bins: [5, 1, 3, 5, 4, 2] - !Solution bins: [1, 3, 3, 5, 4, 2] - !Solution bins: [3, 3, 3, 5, 4, 2] - !Solution bins: [5, 3, 3, 5, 4, 2] - !Solution bins: [1, 5, 3, 5, 4, 2] - !Solution bins: [3, 5, 3, 5, 4, 2] - !Solution bins: [1, 1, 5, 5, 4, 2] - !Solution bins: [3, 1, 5, 5, 4, 2] - !Solution bins: [1, 3, 5, 5, 4, 2] - !Solution bins: [3, 3, 5, 5, 4, 2] - !Solution bins: [3, 3, 1, 1, 5, 2] - !Solution bins: [4, 3, 1, 1, 5, 2] - !Solution bins: [3, 4, 1, 1, 5, 2] - !Solution bins: [4, 4, 1, 1, 5, 2] - !Solution bins: [3, 1, 3, 1, 5, 2] - !Solution bins: [4, 1, 3, 1, 5, 2] - !Solution bins: [1, 3, 3, 1, 5, 2] - !Solution bins: [3, 3, 3, 1, 5, 2] - !Solution bins: [4, 3, 3, 1, 5, 2] - !Solution bins: [1, 4, 3, 1, 5, 2] - !Solution bins: [3, 4, 3, 1, 5, 2] - !Solution bins: [4, 4, 3, 1, 5, 2] - !Solution bins: [3, 1, 4, 1, 5, 2] - !Solution bins: [4, 1, 4, 1, 5, 2] - !Solution bins: [1, 3, 4, 1, 5, 2] - !Solution bins: [3, 3, 4, 1, 5, 2] - !Solution bins: [4, 3, 4, 1, 5, 2] - !Solution bins: [1, 4, 4, 1, 5, 2] - !Solution bins: [3, 4, 4, 1, 5, 2] - !Solution bins: [4, 4, 4, 1, 5, 2] - !Solution bins: [1, 1, 1, 3, 5, 2] - !Solution bins: [3, 1, 1, 3, 5, 2] - !Solution bins: [4, 1, 1, 3, 5, 2] - !Solution bins: [1, 3, 1, 3, 5, 2] - !Solution bins: [4, 3, 1, 3, 5, 2] - !Solution bins: [1, 4, 1, 3, 5, 2] - !Solution bins: [3, 4, 1, 3, 5, 2] - !Solution bins: [4, 4, 1, 3, 5, 2] - !Solution bins: [1, 1, 3, 3, 5, 2] - !Solution bins: [4, 1, 3, 3, 5, 2] - !Solution bins: [1, 4, 3, 3, 5, 2] - !Solution bins: [4, 4, 3, 3, 5, 2] - !Solution bins: [1, 1, 4, 3, 5, 2] - !Solution bins: [3, 1, 4, 3, 5, 2] - !Solution bins: [4, 1, 4, 3, 5, 2] - !Solution bins: [1, 3, 4, 3, 5, 2] - !Solution bins: [4, 3, 4, 3, 5, 2] - !Solution bins: [1, 4, 4, 3, 5, 2] - !Solution bins: [3, 4, 4, 3, 5, 2] - !Solution bins: [4, 4, 4, 3, 5, 2] - !Solution bins: [1, 1, 1, 4, 5, 2] - !Solution bins: [3, 1, 1, 4, 5, 2] - !Solution bins: [4, 1, 1, 4, 5, 2] - !Solution bins: [1, 3, 1, 4, 5, 2] - !Solution bins: [3, 3, 1, 4, 5, 2] - !Solution bins: [4, 3, 1, 4, 5, 2] - !Solution bins: [1, 4, 1, 4, 5, 2] - !Solution bins: [3, 4, 1, 4, 5, 2] - !Solution bins: [1, 1, 3, 4, 5, 2] - !Solution bins: [3, 1, 3, 4, 5, 2] - !Solution bins: [4, 1, 3, 4, 5, 2] - !Solution bins: [1, 3, 3, 4, 5, 2] - !Solution bins: [3, 3, 3, 4, 5, 2] - !Solution bins: [4, 3, 3, 4, 5, 2] - !Solution bins: [1, 4, 3, 4, 5, 2] - !Solution bins: [3, 4, 3, 4, 5, 2] - !Solution bins: [1, 1, 4, 4, 5, 2] - !Solution bins: [3, 1, 4, 4, 5, 2] - !Solution bins: [1, 3, 4, 4, 5, 2] - !Solution bins: [3, 3, 4, 4, 5, 2] - !Solution bins: [4, 4, 2, 2, 1, 3] - !Solution bins: [5, 4, 2, 2, 1, 3] - !Solution bins: [4, 5, 2, 2, 1, 3] - !Solution bins: [5, 5, 2, 2, 1, 3] - !Solution bins: [4, 2, 4, 2, 1, 3] - !Solution bins: [5, 2, 4, 2, 1, 3] - !Solution bins: [2, 4, 4, 2, 1, 3] - !Solution bins: [4, 4, 4, 2, 1, 3] - !Solution bins: [5, 4, 4, 2, 1, 3] - !Solution bins: [2, 5, 4, 2, 1, 3] - !Solution bins: [4, 5, 4, 2, 1, 3] - !Solution bins: [5, 5, 4, 2, 1, 3] - !Solution bins: [4, 2, 5, 2, 1, 3] - !Solution bins: [5, 2, 5, 2, 1, 3] - !Solution bins: [2, 4, 5, 2, 1, 3] - !Solution bins: [4, 4, 5, 2, 1, 3] - !Solution bins: [5, 4, 5, 2, 1, 3] - !Solution bins: [2, 5, 5, 2, 1, 3] - !Solution bins: [4, 5, 5, 2, 1, 3] - !Solution bins: [5, 5, 5, 2, 1, 3] - !Solution bins: [2, 2, 2, 4, 1, 3] - !Solution bins: [4, 2, 2, 4, 1, 3] - !Solution bins: [5, 2, 2, 4, 1, 3] - !Solution bins: [2, 4, 2, 4, 1, 3] - !Solution bins: [5, 4, 2, 4, 1, 3] - !Solution bins: [2, 5, 2, 4, 1, 3] - !Solution bins: [4, 5, 2, 4, 1, 3] - !Solution bins: [5, 5, 2, 4, 1, 3] - !Solution bins: [2, 2, 4, 4, 1, 3] - !Solution bins: [5, 2, 4, 4, 1, 3] - !Solution bins: [2, 5, 4, 4, 1, 3] - !Solution bins: [5, 5, 4, 4, 1, 3] - !Solution bins: [2, 2, 5, 4, 1, 3] - !Solution bins: [4, 2, 5, 4, 1, 3] - !Solution bins: [5, 2, 5, 4, 1, 3] - !Solution bins: [2, 4, 5, 4, 1, 3] - !Solution bins: [5, 4, 5, 4, 1, 3] - !Solution bins: [2, 5, 5, 4, 1, 3] - !Solution bins: [4, 5, 5, 4, 1, 3] - !Solution bins: [5, 5, 5, 4, 1, 3] - !Solution bins: [2, 2, 2, 5, 1, 3] - !Solution bins: [4, 2, 2, 5, 1, 3] - !Solution bins: [5, 2, 2, 5, 1, 3] - !Solution bins: [2, 4, 2, 5, 1, 3] - !Solution bins: [4, 4, 2, 5, 1, 3] - !Solution bins: [5, 4, 2, 5, 1, 3] - !Solution bins: [2, 5, 2, 5, 1, 3] - !Solution bins: [4, 5, 2, 5, 1, 3] - !Solution bins: [2, 2, 4, 5, 1, 3] - !Solution bins: [4, 2, 4, 5, 1, 3] - !Solution bins: [5, 2, 4, 5, 1, 3] - !Solution bins: [2, 4, 4, 5, 1, 3] - !Solution bins: [4, 4, 4, 5, 1, 3] - !Solution bins: [5, 4, 4, 5, 1, 3] - !Solution bins: [2, 5, 4, 5, 1, 3] - !Solution bins: [4, 5, 4, 5, 1, 3] - !Solution bins: [2, 2, 5, 5, 1, 3] - !Solution bins: [4, 2, 5, 5, 1, 3] - !Solution bins: [2, 4, 5, 5, 1, 3] - !Solution bins: [4, 4, 5, 5, 1, 3] - !Solution bins: [4, 4, 1, 1, 2, 3] - !Solution bins: [5, 4, 1, 1, 2, 3] - !Solution bins: [4, 5, 1, 1, 2, 3] - !Solution bins: [5, 5, 1, 1, 2, 3] - !Solution bins: [4, 1, 4, 1, 2, 3] - !Solution bins: [5, 1, 4, 1, 2, 3] - !Solution bins: [1, 4, 4, 1, 2, 3] - !Solution bins: [4, 4, 4, 1, 2, 3] - !Solution bins: [5, 4, 4, 1, 2, 3] - !Solution bins: [1, 5, 4, 1, 2, 3] - !Solution bins: [4, 5, 4, 1, 2, 3] - !Solution bins: [5, 5, 4, 1, 2, 3] - !Solution bins: [4, 1, 5, 1, 2, 3] - !Solution bins: [5, 1, 5, 1, 2, 3] - !Solution bins: [1, 4, 5, 1, 2, 3] - !Solution bins: [4, 4, 5, 1, 2, 3] - !Solution bins: [5, 4, 5, 1, 2, 3] - !Solution bins: [1, 5, 5, 1, 2, 3] - !Solution bins: [4, 5, 5, 1, 2, 3] - !Solution bins: [5, 5, 5, 1, 2, 3] - !Solution bins: [1, 1, 1, 4, 2, 3] - !Solution bins: [4, 1, 1, 4, 2, 3] - !Solution bins: [5, 1, 1, 4, 2, 3] - !Solution bins: [1, 4, 1, 4, 2, 3] - !Solution bins: [5, 4, 1, 4, 2, 3] - !Solution bins: [1, 5, 1, 4, 2, 3] - !Solution bins: [4, 5, 1, 4, 2, 3] - !Solution bins: [5, 5, 1, 4, 2, 3] - !Solution bins: [1, 1, 4, 4, 2, 3] - !Solution bins: [5, 1, 4, 4, 2, 3] - !Solution bins: [1, 5, 4, 4, 2, 3] - !Solution bins: [5, 5, 4, 4, 2, 3] - !Solution bins: [1, 1, 5, 4, 2, 3] - !Solution bins: [4, 1, 5, 4, 2, 3] - !Solution bins: [5, 1, 5, 4, 2, 3] - !Solution bins: [1, 4, 5, 4, 2, 3] - !Solution bins: [5, 4, 5, 4, 2, 3] - !Solution bins: [1, 5, 5, 4, 2, 3] - !Solution bins: [4, 5, 5, 4, 2, 3] - !Solution bins: [5, 5, 5, 4, 2, 3] - !Solution bins: [1, 1, 1, 5, 2, 3] - !Solution bins: [4, 1, 1, 5, 2, 3] - !Solution bins: [5, 1, 1, 5, 2, 3] - !Solution bins: [1, 4, 1, 5, 2, 3] - !Solution bins: [4, 4, 1, 5, 2, 3] - !Solution bins: [5, 4, 1, 5, 2, 3] - !Solution bins: [1, 5, 1, 5, 2, 3] - !Solution bins: [4, 5, 1, 5, 2, 3] - !Solution bins: [1, 1, 4, 5, 2, 3] - !Solution bins: [4, 1, 4, 5, 2, 3] - !Solution bins: [5, 1, 4, 5, 2, 3] - !Solution bins: [1, 4, 4, 5, 2, 3] - !Solution bins: [4, 4, 4, 5, 2, 3] - !Solution bins: [5, 4, 4, 5, 2, 3] - !Solution bins: [1, 5, 4, 5, 2, 3] - !Solution bins: [4, 5, 4, 5, 2, 3] - !Solution bins: [1, 1, 5, 5, 2, 3] - !Solution bins: [4, 1, 5, 5, 2, 3] - !Solution bins: [1, 4, 5, 5, 2, 3] - !Solution bins: [4, 4, 5, 5, 2, 3] - !Solution bins: [2, 2, 1, 1, 4, 3] - !Solution bins: [5, 2, 1, 1, 4, 3] - !Solution bins: [2, 5, 1, 1, 4, 3] - !Solution bins: [5, 5, 1, 1, 4, 3] - !Solution bins: [2, 1, 2, 1, 4, 3] - !Solution bins: [5, 1, 2, 1, 4, 3] - !Solution bins: [1, 2, 2, 1, 4, 3] - !Solution bins: [2, 2, 2, 1, 4, 3] - !Solution bins: [5, 2, 2, 1, 4, 3] - !Solution bins: [1, 5, 2, 1, 4, 3] - !Solution bins: [2, 5, 2, 1, 4, 3] - !Solution bins: [5, 5, 2, 1, 4, 3] - !Solution bins: [2, 1, 5, 1, 4, 3] - !Solution bins: [5, 1, 5, 1, 4, 3] - !Solution bins: [1, 2, 5, 1, 4, 3] - !Solution bins: [2, 2, 5, 1, 4, 3] - !Solution bins: [5, 2, 5, 1, 4, 3] - !Solution bins: [1, 5, 5, 1, 4, 3] - !Solution bins: [2, 5, 5, 1, 4, 3] - !Solution bins: [5, 5, 5, 1, 4, 3] - !Solution bins: [1, 1, 1, 2, 4, 3] - !Solution bins: [2, 1, 1, 2, 4, 3] - !Solution bins: [5, 1, 1, 2, 4, 3] - !Solution bins: [1, 2, 1, 2, 4, 3] - !Solution bins: [5, 2, 1, 2, 4, 3] - !Solution bins: [1, 5, 1, 2, 4, 3] - !Solution bins: [2, 5, 1, 2, 4, 3] - !Solution bins: [5, 5, 1, 2, 4, 3] - !Solution bins: [1, 1, 2, 2, 4, 3] - !Solution bins: [5, 1, 2, 2, 4, 3] - !Solution bins: [1, 5, 2, 2, 4, 3] - !Solution bins: [5, 5, 2, 2, 4, 3] - !Solution bins: [1, 1, 5, 2, 4, 3] - !Solution bins: [2, 1, 5, 2, 4, 3] - !Solution bins: [5, 1, 5, 2, 4, 3] - !Solution bins: [1, 2, 5, 2, 4, 3] - !Solution bins: [5, 2, 5, 2, 4, 3] - !Solution bins: [1, 5, 5, 2, 4, 3] - !Solution bins: [2, 5, 5, 2, 4, 3] - !Solution bins: [5, 5, 5, 2, 4, 3] - !Solution bins: [1, 1, 1, 5, 4, 3] - !Solution bins: [2, 1, 1, 5, 4, 3] - !Solution bins: [5, 1, 1, 5, 4, 3] - !Solution bins: [1, 2, 1, 5, 4, 3] - !Solution bins: [2, 2, 1, 5, 4, 3] - !Solution bins: [5, 2, 1, 5, 4, 3] - !Solution bins: [1, 5, 1, 5, 4, 3] - !Solution bins: [2, 5, 1, 5, 4, 3] - !Solution bins: [1, 1, 2, 5, 4, 3] - !Solution bins: [2, 1, 2, 5, 4, 3] - !Solution bins: [5, 1, 2, 5, 4, 3] - !Solution bins: [1, 2, 2, 5, 4, 3] - !Solution bins: [2, 2, 2, 5, 4, 3] - !Solution bins: [5, 2, 2, 5, 4, 3] - !Solution bins: [1, 5, 2, 5, 4, 3] - !Solution bins: [2, 5, 2, 5, 4, 3] - !Solution bins: [1, 1, 5, 5, 4, 3] - !Solution bins: [2, 1, 5, 5, 4, 3] - !Solution bins: [1, 2, 5, 5, 4, 3] - !Solution bins: [2, 2, 5, 5, 4, 3] - !Solution bins: [2, 2, 1, 1, 5, 3] - !Solution bins: [4, 2, 1, 1, 5, 3] - !Solution bins: [2, 4, 1, 1, 5, 3] - !Solution bins: [4, 4, 1, 1, 5, 3] - !Solution bins: [2, 1, 2, 1, 5, 3] - !Solution bins: [4, 1, 2, 1, 5, 3] - !Solution bins: [1, 2, 2, 1, 5, 3] - !Solution bins: [2, 2, 2, 1, 5, 3] - !Solution bins: [4, 2, 2, 1, 5, 3] - !Solution bins: [1, 4, 2, 1, 5, 3] - !Solution bins: [2, 4, 2, 1, 5, 3] - !Solution bins: [4, 4, 2, 1, 5, 3] - !Solution bins: [2, 1, 4, 1, 5, 3] - !Solution bins: [4, 1, 4, 1, 5, 3] - !Solution bins: [1, 2, 4, 1, 5, 3] - !Solution bins: [2, 2, 4, 1, 5, 3] - !Solution bins: [4, 2, 4, 1, 5, 3] - !Solution bins: [1, 4, 4, 1, 5, 3] - !Solution bins: [2, 4, 4, 1, 5, 3] - !Solution bins: [4, 4, 4, 1, 5, 3] - !Solution bins: [1, 1, 1, 2, 5, 3] - !Solution bins: [2, 1, 1, 2, 5, 3] - !Solution bins: [4, 1, 1, 2, 5, 3] - !Solution bins: [1, 2, 1, 2, 5, 3] - !Solution bins: [4, 2, 1, 2, 5, 3] - !Solution bins: [1, 4, 1, 2, 5, 3] - !Solution bins: [2, 4, 1, 2, 5, 3] - !Solution bins: [4, 4, 1, 2, 5, 3] - !Solution bins: [1, 1, 2, 2, 5, 3] - !Solution bins: [4, 1, 2, 2, 5, 3] - !Solution bins: [1, 4, 2, 2, 5, 3] - !Solution bins: [4, 4, 2, 2, 5, 3] - !Solution bins: [1, 1, 4, 2, 5, 3] - !Solution bins: [2, 1, 4, 2, 5, 3] - !Solution bins: [4, 1, 4, 2, 5, 3] - !Solution bins: [1, 2, 4, 2, 5, 3] - !Solution bins: [4, 2, 4, 2, 5, 3] - !Solution bins: [1, 4, 4, 2, 5, 3] - !Solution bins: [2, 4, 4, 2, 5, 3] - !Solution bins: [4, 4, 4, 2, 5, 3] - !Solution bins: [1, 1, 1, 4, 5, 3] - !Solution bins: [2, 1, 1, 4, 5, 3] - !Solution bins: [4, 1, 1, 4, 5, 3] - !Solution bins: [1, 2, 1, 4, 5, 3] - !Solution bins: [2, 2, 1, 4, 5, 3] - !Solution bins: [4, 2, 1, 4, 5, 3] - !Solution bins: [1, 4, 1, 4, 5, 3] - !Solution bins: [2, 4, 1, 4, 5, 3] - !Solution bins: [1, 1, 2, 4, 5, 3] - !Solution bins: [2, 1, 2, 4, 5, 3] - !Solution bins: [4, 1, 2, 4, 5, 3] - !Solution bins: [1, 2, 2, 4, 5, 3] - !Solution bins: [2, 2, 2, 4, 5, 3] - !Solution bins: [4, 2, 2, 4, 5, 3] - !Solution bins: [1, 4, 2, 4, 5, 3] - !Solution bins: [2, 4, 2, 4, 5, 3] - !Solution bins: [1, 1, 4, 4, 5, 3] - !Solution bins: [2, 1, 4, 4, 5, 3] - !Solution bins: [1, 2, 4, 4, 5, 3] - !Solution bins: [2, 2, 4, 4, 5, 3] - !Solution bins: [3, 3, 2, 2, 1, 4] - !Solution bins: [5, 3, 2, 2, 1, 4] - !Solution bins: [3, 5, 2, 2, 1, 4] - !Solution bins: [5, 5, 2, 2, 1, 4] - !Solution bins: [3, 2, 3, 2, 1, 4] - !Solution bins: [5, 2, 3, 2, 1, 4] - !Solution bins: [2, 3, 3, 2, 1, 4] - !Solution bins: [3, 3, 3, 2, 1, 4] - !Solution bins: [5, 3, 3, 2, 1, 4] - !Solution bins: [2, 5, 3, 2, 1, 4] - !Solution bins: [3, 5, 3, 2, 1, 4] - !Solution bins: [5, 5, 3, 2, 1, 4] - !Solution bins: [3, 2, 5, 2, 1, 4] - !Solution bins: [5, 2, 5, 2, 1, 4] - !Solution bins: [2, 3, 5, 2, 1, 4] - !Solution bins: [3, 3, 5, 2, 1, 4] - !Solution bins: [5, 3, 5, 2, 1, 4] - !Solution bins: [2, 5, 5, 2, 1, 4] - !Solution bins: [3, 5, 5, 2, 1, 4] - !Solution bins: [5, 5, 5, 2, 1, 4] - !Solution bins: [2, 2, 2, 3, 1, 4] - !Solution bins: [3, 2, 2, 3, 1, 4] - !Solution bins: [5, 2, 2, 3, 1, 4] - !Solution bins: [2, 3, 2, 3, 1, 4] - !Solution bins: [5, 3, 2, 3, 1, 4] - !Solution bins: [2, 5, 2, 3, 1, 4] - !Solution bins: [3, 5, 2, 3, 1, 4] - !Solution bins: [5, 5, 2, 3, 1, 4] - !Solution bins: [2, 2, 3, 3, 1, 4] - !Solution bins: [5, 2, 3, 3, 1, 4] - !Solution bins: [2, 5, 3, 3, 1, 4] - !Solution bins: [5, 5, 3, 3, 1, 4] - !Solution bins: [2, 2, 5, 3, 1, 4] - !Solution bins: [3, 2, 5, 3, 1, 4] - !Solution bins: [5, 2, 5, 3, 1, 4] - !Solution bins: [2, 3, 5, 3, 1, 4] - !Solution bins: [5, 3, 5, 3, 1, 4] - !Solution bins: [2, 5, 5, 3, 1, 4] - !Solution bins: [3, 5, 5, 3, 1, 4] - !Solution bins: [5, 5, 5, 3, 1, 4] - !Solution bins: [2, 2, 2, 5, 1, 4] - !Solution bins: [3, 2, 2, 5, 1, 4] - !Solution bins: [5, 2, 2, 5, 1, 4] - !Solution bins: [2, 3, 2, 5, 1, 4] - !Solution bins: [3, 3, 2, 5, 1, 4] - !Solution bins: [5, 3, 2, 5, 1, 4] - !Solution bins: [2, 5, 2, 5, 1, 4] - !Solution bins: [3, 5, 2, 5, 1, 4] - !Solution bins: [2, 2, 3, 5, 1, 4] - !Solution bins: [3, 2, 3, 5, 1, 4] - !Solution bins: [5, 2, 3, 5, 1, 4] - !Solution bins: [2, 3, 3, 5, 1, 4] - !Solution bins: [3, 3, 3, 5, 1, 4] - !Solution bins: [5, 3, 3, 5, 1, 4] - !Solution bins: [2, 5, 3, 5, 1, 4] - !Solution bins: [3, 5, 3, 5, 1, 4] - !Solution bins: [2, 2, 5, 5, 1, 4] - !Solution bins: [3, 2, 5, 5, 1, 4] - !Solution bins: [2, 3, 5, 5, 1, 4] - !Solution bins: [3, 3, 5, 5, 1, 4] - !Solution bins: [3, 3, 1, 1, 2, 4] - !Solution bins: [5, 3, 1, 1, 2, 4] - !Solution bins: [3, 5, 1, 1, 2, 4] - !Solution bins: [5, 5, 1, 1, 2, 4] - !Solution bins: [3, 1, 3, 1, 2, 4] - !Solution bins: [5, 1, 3, 1, 2, 4] - !Solution bins: [1, 3, 3, 1, 2, 4] - !Solution bins: [3, 3, 3, 1, 2, 4] - !Solution bins: [5, 3, 3, 1, 2, 4] - !Solution bins: [1, 5, 3, 1, 2, 4] - !Solution bins: [3, 5, 3, 1, 2, 4] - !Solution bins: [5, 5, 3, 1, 2, 4] - !Solution bins: [3, 1, 5, 1, 2, 4] - !Solution bins: [5, 1, 5, 1, 2, 4] - !Solution bins: [1, 3, 5, 1, 2, 4] - !Solution bins: [3, 3, 5, 1, 2, 4] - !Solution bins: [5, 3, 5, 1, 2, 4] - !Solution bins: [1, 5, 5, 1, 2, 4] - !Solution bins: [3, 5, 5, 1, 2, 4] - !Solution bins: [5, 5, 5, 1, 2, 4] - !Solution bins: [1, 1, 1, 3, 2, 4] - !Solution bins: [3, 1, 1, 3, 2, 4] - !Solution bins: [5, 1, 1, 3, 2, 4] - !Solution bins: [1, 3, 1, 3, 2, 4] - !Solution bins: [5, 3, 1, 3, 2, 4] - !Solution bins: [1, 5, 1, 3, 2, 4] - !Solution bins: [3, 5, 1, 3, 2, 4] - !Solution bins: [5, 5, 1, 3, 2, 4] - !Solution bins: [1, 1, 3, 3, 2, 4] - !Solution bins: [5, 1, 3, 3, 2, 4] - !Solution bins: [1, 5, 3, 3, 2, 4] - !Solution bins: [5, 5, 3, 3, 2, 4] - !Solution bins: [1, 1, 5, 3, 2, 4] - !Solution bins: [3, 1, 5, 3, 2, 4] - !Solution bins: [5, 1, 5, 3, 2, 4] - !Solution bins: [1, 3, 5, 3, 2, 4] - !Solution bins: [5, 3, 5, 3, 2, 4] - !Solution bins: [1, 5, 5, 3, 2, 4] - !Solution bins: [3, 5, 5, 3, 2, 4] - !Solution bins: [5, 5, 5, 3, 2, 4] - !Solution bins: [1, 1, 1, 5, 2, 4] - !Solution bins: [3, 1, 1, 5, 2, 4] - !Solution bins: [5, 1, 1, 5, 2, 4] - !Solution bins: [1, 3, 1, 5, 2, 4] - !Solution bins: [3, 3, 1, 5, 2, 4] - !Solution bins: [5, 3, 1, 5, 2, 4] - !Solution bins: [1, 5, 1, 5, 2, 4] - !Solution bins: [3, 5, 1, 5, 2, 4] - !Solution bins: [1, 1, 3, 5, 2, 4] - !Solution bins: [3, 1, 3, 5, 2, 4] - !Solution bins: [5, 1, 3, 5, 2, 4] - !Solution bins: [1, 3, 3, 5, 2, 4] - !Solution bins: [3, 3, 3, 5, 2, 4] - !Solution bins: [5, 3, 3, 5, 2, 4] - !Solution bins: [1, 5, 3, 5, 2, 4] - !Solution bins: [3, 5, 3, 5, 2, 4] - !Solution bins: [1, 1, 5, 5, 2, 4] - !Solution bins: [3, 1, 5, 5, 2, 4] - !Solution bins: [1, 3, 5, 5, 2, 4] - !Solution bins: [3, 3, 5, 5, 2, 4] - !Solution bins: [2, 2, 1, 1, 3, 4] - !Solution bins: [5, 2, 1, 1, 3, 4] - !Solution bins: [2, 5, 1, 1, 3, 4] - !Solution bins: [5, 5, 1, 1, 3, 4] - !Solution bins: [2, 1, 2, 1, 3, 4] - !Solution bins: [5, 1, 2, 1, 3, 4] - !Solution bins: [1, 2, 2, 1, 3, 4] - !Solution bins: [2, 2, 2, 1, 3, 4] - !Solution bins: [5, 2, 2, 1, 3, 4] - !Solution bins: [1, 5, 2, 1, 3, 4] - !Solution bins: [2, 5, 2, 1, 3, 4] - !Solution bins: [5, 5, 2, 1, 3, 4] - !Solution bins: [2, 1, 5, 1, 3, 4] - !Solution bins: [5, 1, 5, 1, 3, 4] - !Solution bins: [1, 2, 5, 1, 3, 4] - !Solution bins: [2, 2, 5, 1, 3, 4] - !Solution bins: [5, 2, 5, 1, 3, 4] - !Solution bins: [1, 5, 5, 1, 3, 4] - !Solution bins: [2, 5, 5, 1, 3, 4] - !Solution bins: [5, 5, 5, 1, 3, 4] - !Solution bins: [1, 1, 1, 2, 3, 4] - !Solution bins: [2, 1, 1, 2, 3, 4] - !Solution bins: [5, 1, 1, 2, 3, 4] - !Solution bins: [1, 2, 1, 2, 3, 4] - !Solution bins: [5, 2, 1, 2, 3, 4] - !Solution bins: [1, 5, 1, 2, 3, 4] - !Solution bins: [2, 5, 1, 2, 3, 4] - !Solution bins: [5, 5, 1, 2, 3, 4] - !Solution bins: [1, 1, 2, 2, 3, 4] - !Solution bins: [5, 1, 2, 2, 3, 4] - !Solution bins: [1, 5, 2, 2, 3, 4] - !Solution bins: [5, 5, 2, 2, 3, 4] - !Solution bins: [1, 1, 5, 2, 3, 4] - !Solution bins: [2, 1, 5, 2, 3, 4] - !Solution bins: [5, 1, 5, 2, 3, 4] - !Solution bins: [1, 2, 5, 2, 3, 4] - !Solution bins: [5, 2, 5, 2, 3, 4] - !Solution bins: [1, 5, 5, 2, 3, 4] - !Solution bins: [2, 5, 5, 2, 3, 4] - !Solution bins: [5, 5, 5, 2, 3, 4] - !Solution bins: [1, 1, 1, 5, 3, 4] - !Solution bins: [2, 1, 1, 5, 3, 4] - !Solution bins: [5, 1, 1, 5, 3, 4] - !Solution bins: [1, 2, 1, 5, 3, 4] - !Solution bins: [2, 2, 1, 5, 3, 4] - !Solution bins: [5, 2, 1, 5, 3, 4] - !Solution bins: [1, 5, 1, 5, 3, 4] - !Solution bins: [2, 5, 1, 5, 3, 4] - !Solution bins: [1, 1, 2, 5, 3, 4] - !Solution bins: [2, 1, 2, 5, 3, 4] - !Solution bins: [5, 1, 2, 5, 3, 4] - !Solution bins: [1, 2, 2, 5, 3, 4] - !Solution bins: [2, 2, 2, 5, 3, 4] - !Solution bins: [5, 2, 2, 5, 3, 4] - !Solution bins: [1, 5, 2, 5, 3, 4] - !Solution bins: [2, 5, 2, 5, 3, 4] - !Solution bins: [1, 1, 5, 5, 3, 4] - !Solution bins: [2, 1, 5, 5, 3, 4] - !Solution bins: [1, 2, 5, 5, 3, 4] - !Solution bins: [2, 2, 5, 5, 3, 4] - !Solution bins: [2, 2, 1, 1, 5, 4] - !Solution bins: [3, 2, 1, 1, 5, 4] - !Solution bins: [2, 3, 1, 1, 5, 4] - !Solution bins: [3, 3, 1, 1, 5, 4] - !Solution bins: [2, 1, 2, 1, 5, 4] - !Solution bins: [3, 1, 2, 1, 5, 4] - !Solution bins: [1, 2, 2, 1, 5, 4] - !Solution bins: [2, 2, 2, 1, 5, 4] - !Solution bins: [3, 2, 2, 1, 5, 4] - !Solution bins: [1, 3, 2, 1, 5, 4] - !Solution bins: [2, 3, 2, 1, 5, 4] - !Solution bins: [3, 3, 2, 1, 5, 4] - !Solution bins: [2, 1, 3, 1, 5, 4] - !Solution bins: [3, 1, 3, 1, 5, 4] - !Solution bins: [1, 2, 3, 1, 5, 4] - !Solution bins: [2, 2, 3, 1, 5, 4] - !Solution bins: [3, 2, 3, 1, 5, 4] - !Solution bins: [1, 3, 3, 1, 5, 4] - !Solution bins: [2, 3, 3, 1, 5, 4] - !Solution bins: [3, 3, 3, 1, 5, 4] - !Solution bins: [1, 1, 1, 2, 5, 4] - !Solution bins: [2, 1, 1, 2, 5, 4] - !Solution bins: [3, 1, 1, 2, 5, 4] - !Solution bins: [1, 2, 1, 2, 5, 4] - !Solution bins: [3, 2, 1, 2, 5, 4] - !Solution bins: [1, 3, 1, 2, 5, 4] - !Solution bins: [2, 3, 1, 2, 5, 4] - !Solution bins: [3, 3, 1, 2, 5, 4] - !Solution bins: [1, 1, 2, 2, 5, 4] - !Solution bins: [3, 1, 2, 2, 5, 4] - !Solution bins: [1, 3, 2, 2, 5, 4] - !Solution bins: [3, 3, 2, 2, 5, 4] - !Solution bins: [1, 1, 3, 2, 5, 4] - !Solution bins: [2, 1, 3, 2, 5, 4] - !Solution bins: [3, 1, 3, 2, 5, 4] - !Solution bins: [1, 2, 3, 2, 5, 4] - !Solution bins: [3, 2, 3, 2, 5, 4] - !Solution bins: [1, 3, 3, 2, 5, 4] - !Solution bins: [2, 3, 3, 2, 5, 4] - !Solution bins: [3, 3, 3, 2, 5, 4] - !Solution bins: [1, 1, 1, 3, 5, 4] - !Solution bins: [2, 1, 1, 3, 5, 4] - !Solution bins: [3, 1, 1, 3, 5, 4] - !Solution bins: [1, 2, 1, 3, 5, 4] - !Solution bins: [2, 2, 1, 3, 5, 4] - !Solution bins: [3, 2, 1, 3, 5, 4] - !Solution bins: [1, 3, 1, 3, 5, 4] - !Solution bins: [2, 3, 1, 3, 5, 4] - !Solution bins: [1, 1, 2, 3, 5, 4] - !Solution bins: [2, 1, 2, 3, 5, 4] - !Solution bins: [3, 1, 2, 3, 5, 4] - !Solution bins: [1, 2, 2, 3, 5, 4] - !Solution bins: [2, 2, 2, 3, 5, 4] - !Solution bins: [3, 2, 2, 3, 5, 4] - !Solution bins: [1, 3, 2, 3, 5, 4] - !Solution bins: [2, 3, 2, 3, 5, 4] - !Solution bins: [1, 1, 3, 3, 5, 4] - !Solution bins: [2, 1, 3, 3, 5, 4] - !Solution bins: [1, 2, 3, 3, 5, 4] - !Solution bins: [2, 2, 3, 3, 5, 4] - !Solution bins: [3, 3, 2, 2, 1, 5] - !Solution bins: [4, 3, 2, 2, 1, 5] - !Solution bins: [3, 4, 2, 2, 1, 5] - !Solution bins: [4, 4, 2, 2, 1, 5] - !Solution bins: [3, 2, 3, 2, 1, 5] - !Solution bins: [4, 2, 3, 2, 1, 5] - !Solution bins: [2, 3, 3, 2, 1, 5] - !Solution bins: [3, 3, 3, 2, 1, 5] - !Solution bins: [4, 3, 3, 2, 1, 5] - !Solution bins: [2, 4, 3, 2, 1, 5] - !Solution bins: [3, 4, 3, 2, 1, 5] - !Solution bins: [4, 4, 3, 2, 1, 5] - !Solution bins: [3, 2, 4, 2, 1, 5] - !Solution bins: [4, 2, 4, 2, 1, 5] - !Solution bins: [2, 3, 4, 2, 1, 5] - !Solution bins: [3, 3, 4, 2, 1, 5] - !Solution bins: [4, 3, 4, 2, 1, 5] - !Solution bins: [2, 4, 4, 2, 1, 5] - !Solution bins: [3, 4, 4, 2, 1, 5] - !Solution bins: [4, 4, 4, 2, 1, 5] - !Solution bins: [2, 2, 2, 3, 1, 5] - !Solution bins: [3, 2, 2, 3, 1, 5] - !Solution bins: [4, 2, 2, 3, 1, 5] - !Solution bins: [2, 3, 2, 3, 1, 5] - !Solution bins: [4, 3, 2, 3, 1, 5] - !Solution bins: [2, 4, 2, 3, 1, 5] - !Solution bins: [3, 4, 2, 3, 1, 5] - !Solution bins: [4, 4, 2, 3, 1, 5] - !Solution bins: [2, 2, 3, 3, 1, 5] - !Solution bins: [4, 2, 3, 3, 1, 5] - !Solution bins: [2, 4, 3, 3, 1, 5] - !Solution bins: [4, 4, 3, 3, 1, 5] - !Solution bins: [2, 2, 4, 3, 1, 5] - !Solution bins: [3, 2, 4, 3, 1, 5] - !Solution bins: [4, 2, 4, 3, 1, 5] - !Solution bins: [2, 3, 4, 3, 1, 5] - !Solution bins: [4, 3, 4, 3, 1, 5] - !Solution bins: [2, 4, 4, 3, 1, 5] - !Solution bins: [3, 4, 4, 3, 1, 5] - !Solution bins: [4, 4, 4, 3, 1, 5] - !Solution bins: [2, 2, 2, 4, 1, 5] - !Solution bins: [3, 2, 2, 4, 1, 5] - !Solution bins: [4, 2, 2, 4, 1, 5] - !Solution bins: [2, 3, 2, 4, 1, 5] - !Solution bins: [3, 3, 2, 4, 1, 5] - !Solution bins: [4, 3, 2, 4, 1, 5] - !Solution bins: [2, 4, 2, 4, 1, 5] - !Solution bins: [3, 4, 2, 4, 1, 5] - !Solution bins: [2, 2, 3, 4, 1, 5] - !Solution bins: [3, 2, 3, 4, 1, 5] - !Solution bins: [4, 2, 3, 4, 1, 5] - !Solution bins: [2, 3, 3, 4, 1, 5] - !Solution bins: [3, 3, 3, 4, 1, 5] - !Solution bins: [4, 3, 3, 4, 1, 5] - !Solution bins: [2, 4, 3, 4, 1, 5] - !Solution bins: [3, 4, 3, 4, 1, 5] - !Solution bins: [2, 2, 4, 4, 1, 5] - !Solution bins: [3, 2, 4, 4, 1, 5] - !Solution bins: [2, 3, 4, 4, 1, 5] - !Solution bins: [3, 3, 4, 4, 1, 5] - !Solution bins: [3, 3, 1, 1, 2, 5] - !Solution bins: [4, 3, 1, 1, 2, 5] - !Solution bins: [3, 4, 1, 1, 2, 5] - !Solution bins: [4, 4, 1, 1, 2, 5] - !Solution bins: [3, 1, 3, 1, 2, 5] - !Solution bins: [4, 1, 3, 1, 2, 5] - !Solution bins: [1, 3, 3, 1, 2, 5] - !Solution bins: [3, 3, 3, 1, 2, 5] - !Solution bins: [4, 3, 3, 1, 2, 5] - !Solution bins: [1, 4, 3, 1, 2, 5] - !Solution bins: [3, 4, 3, 1, 2, 5] - !Solution bins: [4, 4, 3, 1, 2, 5] - !Solution bins: [3, 1, 4, 1, 2, 5] - !Solution bins: [4, 1, 4, 1, 2, 5] - !Solution bins: [1, 3, 4, 1, 2, 5] - !Solution bins: [3, 3, 4, 1, 2, 5] - !Solution bins: [4, 3, 4, 1, 2, 5] - !Solution bins: [1, 4, 4, 1, 2, 5] - !Solution bins: [3, 4, 4, 1, 2, 5] - !Solution bins: [4, 4, 4, 1, 2, 5] - !Solution bins: [1, 1, 1, 3, 2, 5] - !Solution bins: [3, 1, 1, 3, 2, 5] - !Solution bins: [4, 1, 1, 3, 2, 5] - !Solution bins: [1, 3, 1, 3, 2, 5] - !Solution bins: [4, 3, 1, 3, 2, 5] - !Solution bins: [1, 4, 1, 3, 2, 5] - !Solution bins: [3, 4, 1, 3, 2, 5] - !Solution bins: [4, 4, 1, 3, 2, 5] - !Solution bins: [1, 1, 3, 3, 2, 5] - !Solution bins: [4, 1, 3, 3, 2, 5] - !Solution bins: [1, 4, 3, 3, 2, 5] - !Solution bins: [4, 4, 3, 3, 2, 5] - !Solution bins: [1, 1, 4, 3, 2, 5] - !Solution bins: [3, 1, 4, 3, 2, 5] - !Solution bins: [4, 1, 4, 3, 2, 5] - !Solution bins: [1, 3, 4, 3, 2, 5] - !Solution bins: [4, 3, 4, 3, 2, 5] - !Solution bins: [1, 4, 4, 3, 2, 5] - !Solution bins: [3, 4, 4, 3, 2, 5] - !Solution bins: [4, 4, 4, 3, 2, 5] - !Solution bins: [1, 1, 1, 4, 2, 5] - !Solution bins: [3, 1, 1, 4, 2, 5] - !Solution bins: [4, 1, 1, 4, 2, 5] - !Solution bins: [1, 3, 1, 4, 2, 5] - !Solution bins: [3, 3, 1, 4, 2, 5] - !Solution bins: [4, 3, 1, 4, 2, 5] - !Solution bins: [1, 4, 1, 4, 2, 5] - !Solution bins: [3, 4, 1, 4, 2, 5] - !Solution bins: [1, 1, 3, 4, 2, 5] - !Solution bins: [3, 1, 3, 4, 2, 5] - !Solution bins: [4, 1, 3, 4, 2, 5] - !Solution bins: [1, 3, 3, 4, 2, 5] - !Solution bins: [3, 3, 3, 4, 2, 5] - !Solution bins: [4, 3, 3, 4, 2, 5] - !Solution bins: [1, 4, 3, 4, 2, 5] - !Solution bins: [3, 4, 3, 4, 2, 5] - !Solution bins: [1, 1, 4, 4, 2, 5] - !Solution bins: [3, 1, 4, 4, 2, 5] - !Solution bins: [1, 3, 4, 4, 2, 5] - !Solution bins: [3, 3, 4, 4, 2, 5] - !Solution bins: [2, 2, 1, 1, 3, 5] - !Solution bins: [4, 2, 1, 1, 3, 5] - !Solution bins: [2, 4, 1, 1, 3, 5] - !Solution bins: [4, 4, 1, 1, 3, 5] - !Solution bins: [2, 1, 2, 1, 3, 5] - !Solution bins: [4, 1, 2, 1, 3, 5] - !Solution bins: [1, 2, 2, 1, 3, 5] - !Solution bins: [2, 2, 2, 1, 3, 5] - !Solution bins: [4, 2, 2, 1, 3, 5] - !Solution bins: [1, 4, 2, 1, 3, 5] - !Solution bins: [2, 4, 2, 1, 3, 5] - !Solution bins: [4, 4, 2, 1, 3, 5] - !Solution bins: [2, 1, 4, 1, 3, 5] - !Solution bins: [4, 1, 4, 1, 3, 5] - !Solution bins: [1, 2, 4, 1, 3, 5] - !Solution bins: [2, 2, 4, 1, 3, 5] - !Solution bins: [4, 2, 4, 1, 3, 5] - !Solution bins: [1, 4, 4, 1, 3, 5] - !Solution bins: [2, 4, 4, 1, 3, 5] - !Solution bins: [4, 4, 4, 1, 3, 5] - !Solution bins: [1, 1, 1, 2, 3, 5] - !Solution bins: [2, 1, 1, 2, 3, 5] - !Solution bins: [4, 1, 1, 2, 3, 5] - !Solution bins: [1, 2, 1, 2, 3, 5] - !Solution bins: [4, 2, 1, 2, 3, 5] - !Solution bins: [1, 4, 1, 2, 3, 5] - !Solution bins: [2, 4, 1, 2, 3, 5] - !Solution bins: [4, 4, 1, 2, 3, 5] - !Solution bins: [1, 1, 2, 2, 3, 5] - !Solution bins: [4, 1, 2, 2, 3, 5] - !Solution bins: [1, 4, 2, 2, 3, 5] - !Solution bins: [4, 4, 2, 2, 3, 5] - !Solution bins: [1, 1, 4, 2, 3, 5] - !Solution bins: [2, 1, 4, 2, 3, 5] - !Solution bins: [4, 1, 4, 2, 3, 5] - !Solution bins: [1, 2, 4, 2, 3, 5] - !Solution bins: [4, 2, 4, 2, 3, 5] - !Solution bins: [1, 4, 4, 2, 3, 5] - !Solution bins: [2, 4, 4, 2, 3, 5] - !Solution bins: [4, 4, 4, 2, 3, 5] - !Solution bins: [1, 1, 1, 4, 3, 5] - !Solution bins: [2, 1, 1, 4, 3, 5] - !Solution bins: [4, 1, 1, 4, 3, 5] - !Solution bins: [1, 2, 1, 4, 3, 5] - !Solution bins: [2, 2, 1, 4, 3, 5] - !Solution bins: [4, 2, 1, 4, 3, 5] - !Solution bins: [1, 4, 1, 4, 3, 5] - !Solution bins: [2, 4, 1, 4, 3, 5] - !Solution bins: [1, 1, 2, 4, 3, 5] - !Solution bins: [2, 1, 2, 4, 3, 5] - !Solution bins: [4, 1, 2, 4, 3, 5] - !Solution bins: [1, 2, 2, 4, 3, 5] - !Solution bins: [2, 2, 2, 4, 3, 5] - !Solution bins: [4, 2, 2, 4, 3, 5] - !Solution bins: [1, 4, 2, 4, 3, 5] - !Solution bins: [2, 4, 2, 4, 3, 5] - !Solution bins: [1, 1, 4, 4, 3, 5] - !Solution bins: [2, 1, 4, 4, 3, 5] - !Solution bins: [1, 2, 4, 4, 3, 5] - !Solution bins: [2, 2, 4, 4, 3, 5] - !Solution bins: [2, 2, 1, 1, 4, 5] - !Solution bins: [3, 2, 1, 1, 4, 5] - !Solution bins: [2, 3, 1, 1, 4, 5] - !Solution bins: [3, 3, 1, 1, 4, 5] - !Solution bins: [2, 1, 2, 1, 4, 5] - !Solution bins: [3, 1, 2, 1, 4, 5] - !Solution bins: [1, 2, 2, 1, 4, 5] - !Solution bins: [2, 2, 2, 1, 4, 5] - !Solution bins: [3, 2, 2, 1, 4, 5] - !Solution bins: [1, 3, 2, 1, 4, 5] - !Solution bins: [2, 3, 2, 1, 4, 5] - !Solution bins: [3, 3, 2, 1, 4, 5] - !Solution bins: [2, 1, 3, 1, 4, 5] - !Solution bins: [3, 1, 3, 1, 4, 5] - !Solution bins: [1, 2, 3, 1, 4, 5] - !Solution bins: [2, 2, 3, 1, 4, 5] - !Solution bins: [3, 2, 3, 1, 4, 5] - !Solution bins: [1, 3, 3, 1, 4, 5] - !Solution bins: [2, 3, 3, 1, 4, 5] - !Solution bins: [3, 3, 3, 1, 4, 5] - !Solution bins: [1, 1, 1, 2, 4, 5] - !Solution bins: [2, 1, 1, 2, 4, 5] - !Solution bins: [3, 1, 1, 2, 4, 5] - !Solution bins: [1, 2, 1, 2, 4, 5] - !Solution bins: [3, 2, 1, 2, 4, 5] - !Solution bins: [1, 3, 1, 2, 4, 5] - !Solution bins: [2, 3, 1, 2, 4, 5] - !Solution bins: [3, 3, 1, 2, 4, 5] - !Solution bins: [1, 1, 2, 2, 4, 5] - !Solution bins: [3, 1, 2, 2, 4, 5] - !Solution bins: [1, 3, 2, 2, 4, 5] - !Solution bins: [3, 3, 2, 2, 4, 5] - !Solution bins: [1, 1, 3, 2, 4, 5] - !Solution bins: [2, 1, 3, 2, 4, 5] - !Solution bins: [3, 1, 3, 2, 4, 5] - !Solution bins: [1, 2, 3, 2, 4, 5] - !Solution bins: [3, 2, 3, 2, 4, 5] - !Solution bins: [1, 3, 3, 2, 4, 5] - !Solution bins: [2, 3, 3, 2, 4, 5] - !Solution bins: [3, 3, 3, 2, 4, 5] - !Solution bins: [1, 1, 1, 3, 4, 5] - !Solution bins: [2, 1, 1, 3, 4, 5] - !Solution bins: [3, 1, 1, 3, 4, 5] - !Solution bins: [1, 2, 1, 3, 4, 5] - !Solution bins: [2, 2, 1, 3, 4, 5] - !Solution bins: [3, 2, 1, 3, 4, 5] - !Solution bins: [1, 3, 1, 3, 4, 5] - !Solution bins: [2, 3, 1, 3, 4, 5] - !Solution bins: [1, 1, 2, 3, 4, 5] - !Solution bins: [2, 1, 2, 3, 4, 5] - !Solution bins: [3, 1, 2, 3, 4, 5] - !Solution bins: [1, 2, 2, 3, 4, 5] - !Solution bins: [2, 2, 2, 3, 4, 5] - !Solution bins: [3, 2, 2, 3, 4, 5] - !Solution bins: [1, 3, 2, 3, 4, 5] - !Solution bins: [2, 3, 2, 3, 4, 5] - !Solution bins: [1, 1, 3, 3, 4, 5] - !Solution bins: [2, 1, 3, 3, 4, 5] - !Solution bins: [1, 2, 3, 3, 4, 5] - !Solution bins: [2, 2, 3, 3, 4, 5] options: all_solutions: true ***/ include "bin_packing.mzn"; % The example from the GCC. % constraint bin_packing(5, [3, 1, 3], [4, 3, 1]); array[1..6] of var 1..5: bins; constraint bin_packing(3, bins, [1, 1, 1, 2, 3, 3]); solve satisfy; output ["bins = array1d(1..6, ", show(bins), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/inverse/0000755000175000017500000000000013757304533020651 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/inverse/globals_inverse.mzn0000644000175000017500000000130713757304533024556 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution inv_f1: [5, 7, 6, 8] inv_f2: [1, 3, 2, 4] - !Result solution: !Solution inv_f1: [5, 7, 8, 6] inv_f2: [1, 4, 2, 3] ***/ include "inverse.mzn"; %-----------------------------------------------------------------------------% % inverse %-----------------------------------------------------------------------------% array[1..4] of var -100..100: inv_f1 :: add_to_output = [5, 7, _, _]; array[5..8] of var -100..100: inv_f2 :: add_to_output = array1d(5..8, [1, _, 2, _]); constraint inverse(inv_f1, inv_f2); solve satisfy; output [ "inv_f1 = array1d(1..4, ", show(inv_f1), ");\n", "inv_f2 = array1d(5..8, ", show(inv_f2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/lex_greater/0000755000175000017500000000000013757304533021477 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/lex_greater/globals_lex_greater.mzn0000644000175000017500000000226213757304533026233 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 1, 9] - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 2, 9] - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 3, 9] - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 4, 9] - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 5, 9] - !Solution lex_avi1: [1, 3, 5, 7, 9] lex_avi2: [1, 3, 5, 6, 9] options: all_solutions: true ***/ include "lex_greater.mzn"; %-----------------------------------------------------------------------------% % lex_less %-----------------------------------------------------------------------------% array[1..5] of var -100..100: lex_avi1 ::add_to_output = [1,3,5,7,9]; array[4..8] of var 1..10: lex_avi2 ::add_to_output = array1d(4..8, [1,3,5,_,9]); constraint lex_greater(lex_avi1, lex_avi2); constraint lex_greater([5, 2, 8, 9], [5, 2, 6, 8]); %constraint lex_greater([5, 2, 3, 9], [5, 2, 3, 9]); solve satisfy; output [ "lex_avi1 = array1d(1..5, ", show(lex_avi1), ");\n", "lex_avi2 = array1d(4..8, ", show(lex_avi2), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/global_cardinality/0000755000175000017500000000000013757304533023021 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/global_cardinality/globals_global_cardinality.mzn0000644000175000017500000000112213757304533031071 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution gcc_c: [5, 1, 2, 1] gcc_x: [6, 7, 6, 8, 6, 9, 6, 8, 6] ***/ include "global_cardinality.mzn"; % The example from the GCC. % constraint global_cardinality([3, 3, 8, 6], [3, 5, 6], [2, 0, 1]); array[1..9] of var -100..100: gcc_x ::add_to_output = [6, 7, _, 8, _, 9, _, 8, 6]; array[1..4] of var -100..100: gcc_c ::add_to_output = [5, 1, 2, _]; constraint global_cardinality(gcc_x, [6, 7, 8, 9], gcc_c); solve satisfy; output [ "gcc_c = array1d(1..4, ", show(gcc_c), ");\n", "gcc_x = array1d(1..9, ", show(gcc_x), ");\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/nvalue/0000755000175000017500000000000013757304533020470 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/nvalue/globals_nvalue.mzn0000644000175000017500000005446113757304533024225 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: - 3 - 2 - 1 - 1 n: 3 - !Solution a: - 4 - 2 - 1 - 1 n: 3 - !Solution a: - 5 - 2 - 1 - 1 n: 3 - !Solution a: - 2 - 3 - 1 - 1 n: 3 - !Solution a: - 4 - 3 - 1 - 1 n: 3 - !Solution a: - 5 - 3 - 1 - 1 n: 3 - !Solution a: - 2 - 4 - 1 - 1 n: 3 - !Solution a: - 3 - 4 - 1 - 1 n: 3 - !Solution a: - 5 - 4 - 1 - 1 n: 3 - !Solution a: - 2 - 5 - 1 - 1 n: 3 - !Solution a: - 3 - 5 - 1 - 1 n: 3 - !Solution a: - 4 - 5 - 1 - 1 n: 3 - !Solution a: - 3 - 1 - 2 - 1 n: 3 - !Solution a: - 4 - 1 - 2 - 1 n: 3 - !Solution a: - 5 - 1 - 2 - 1 n: 3 - !Solution a: - 3 - 2 - 2 - 1 n: 3 - !Solution a: - 4 - 2 - 2 - 1 n: 3 - !Solution a: - 5 - 2 - 2 - 1 n: 3 - !Solution a: - 1 - 3 - 2 - 1 n: 3 - !Solution a: - 2 - 3 - 2 - 1 n: 3 - !Solution a: - 3 - 3 - 2 - 1 n: 3 - !Solution a: - 1 - 4 - 2 - 1 n: 3 - !Solution a: - 2 - 4 - 2 - 1 n: 3 - !Solution a: - 4 - 4 - 2 - 1 n: 3 - !Solution a: - 1 - 5 - 2 - 1 n: 3 - !Solution a: - 2 - 5 - 2 - 1 n: 3 - !Solution a: - 5 - 5 - 2 - 1 n: 3 - !Solution a: - 2 - 1 - 3 - 1 n: 3 - !Solution a: - 4 - 1 - 3 - 1 n: 3 - !Solution a: - 5 - 1 - 3 - 1 n: 3 - !Solution a: - 1 - 2 - 3 - 1 n: 3 - !Solution a: - 2 - 2 - 3 - 1 n: 3 - !Solution a: - 3 - 2 - 3 - 1 n: 3 - !Solution a: - 2 - 3 - 3 - 1 n: 3 - !Solution a: - 4 - 3 - 3 - 1 n: 3 - !Solution a: - 5 - 3 - 3 - 1 n: 3 - !Solution a: - 1 - 4 - 3 - 1 n: 3 - !Solution a: - 3 - 4 - 3 - 1 n: 3 - !Solution a: - 4 - 4 - 3 - 1 n: 3 - !Solution a: - 1 - 5 - 3 - 1 n: 3 - !Solution a: - 3 - 5 - 3 - 1 n: 3 - !Solution a: - 5 - 5 - 3 - 1 n: 3 - !Solution a: - 2 - 1 - 4 - 1 n: 3 - !Solution a: - 3 - 1 - 4 - 1 n: 3 - !Solution a: - 5 - 1 - 4 - 1 n: 3 - !Solution a: - 1 - 2 - 4 - 1 n: 3 - !Solution a: - 2 - 2 - 4 - 1 n: 3 - !Solution a: - 4 - 2 - 4 - 1 n: 3 - !Solution a: - 1 - 3 - 4 - 1 n: 3 - !Solution a: - 3 - 3 - 4 - 1 n: 3 - !Solution a: - 4 - 3 - 4 - 1 n: 3 - !Solution a: - 2 - 4 - 4 - 1 n: 3 - !Solution a: - 3 - 4 - 4 - 1 n: 3 - !Solution a: - 5 - 4 - 4 - 1 n: 3 - !Solution a: - 1 - 5 - 4 - 1 n: 3 - !Solution a: - 4 - 5 - 4 - 1 n: 3 - !Solution a: - 5 - 5 - 4 - 1 n: 3 - !Solution a: - 2 - 1 - 5 - 1 n: 3 - !Solution a: - 3 - 1 - 5 - 1 n: 3 - !Solution a: - 4 - 1 - 5 - 1 n: 3 - !Solution a: - 1 - 2 - 5 - 1 n: 3 - !Solution a: - 2 - 2 - 5 - 1 n: 3 - !Solution a: - 5 - 2 - 5 - 1 n: 3 - !Solution a: - 1 - 3 - 5 - 1 n: 3 - !Solution a: - 3 - 3 - 5 - 1 n: 3 - !Solution a: - 5 - 3 - 5 - 1 n: 3 - !Solution a: - 1 - 4 - 5 - 1 n: 3 - !Solution a: - 4 - 4 - 5 - 1 n: 3 - !Solution a: - 5 - 4 - 5 - 1 n: 3 - !Solution a: - 2 - 5 - 5 - 1 n: 3 - !Solution a: - 3 - 5 - 5 - 1 n: 3 - !Solution a: - 4 - 5 - 5 - 1 n: 3 - !Solution a: - 3 - 1 - 1 - 2 n: 3 - !Solution a: - 4 - 1 - 1 - 2 n: 3 - !Solution a: - 5 - 1 - 1 - 2 n: 3 - !Solution a: - 3 - 2 - 1 - 2 n: 3 - !Solution a: - 4 - 2 - 1 - 2 n: 3 - !Solution a: - 5 - 2 - 1 - 2 n: 3 - !Solution a: - 1 - 3 - 1 - 2 n: 3 - !Solution a: - 2 - 3 - 1 - 2 n: 3 - !Solution a: - 3 - 3 - 1 - 2 n: 3 - !Solution a: - 1 - 4 - 1 - 2 n: 3 - !Solution a: - 2 - 4 - 1 - 2 n: 3 - !Solution a: - 4 - 4 - 1 - 2 n: 3 - !Solution a: - 1 - 5 - 1 - 2 n: 3 - !Solution a: - 2 - 5 - 1 - 2 n: 3 - !Solution a: - 5 - 5 - 1 - 2 n: 3 - !Solution a: - 3 - 1 - 2 - 2 n: 3 - !Solution a: - 4 - 1 - 2 - 2 n: 3 - !Solution a: - 5 - 1 - 2 - 2 n: 3 - !Solution a: - 1 - 3 - 2 - 2 n: 3 - !Solution a: - 4 - 3 - 2 - 2 n: 3 - !Solution a: - 5 - 3 - 2 - 2 n: 3 - !Solution a: - 1 - 4 - 2 - 2 n: 3 - !Solution a: - 3 - 4 - 2 - 2 n: 3 - !Solution a: - 5 - 4 - 2 - 2 n: 3 - !Solution a: - 1 - 5 - 2 - 2 n: 3 - !Solution a: - 3 - 5 - 2 - 2 n: 3 - !Solution a: - 4 - 5 - 2 - 2 n: 3 - !Solution a: - 1 - 1 - 3 - 2 n: 3 - !Solution a: - 2 - 1 - 3 - 2 n: 3 - !Solution a: - 3 - 1 - 3 - 2 n: 3 - !Solution a: - 1 - 2 - 3 - 2 n: 3 - !Solution a: - 4 - 2 - 3 - 2 n: 3 - !Solution a: - 5 - 2 - 3 - 2 n: 3 - !Solution a: - 1 - 3 - 3 - 2 n: 3 - !Solution a: - 4 - 3 - 3 - 2 n: 3 - !Solution a: - 5 - 3 - 3 - 2 n: 3 - !Solution a: - 2 - 4 - 3 - 2 n: 3 - !Solution a: - 3 - 4 - 3 - 2 n: 3 - !Solution a: - 4 - 4 - 3 - 2 n: 3 - !Solution a: - 2 - 5 - 3 - 2 n: 3 - !Solution a: - 3 - 5 - 3 - 2 n: 3 - !Solution a: - 5 - 5 - 3 - 2 n: 3 - !Solution a: - 1 - 1 - 4 - 2 n: 3 - !Solution a: - 2 - 1 - 4 - 2 n: 3 - !Solution a: - 4 - 1 - 4 - 2 n: 3 - !Solution a: - 1 - 2 - 4 - 2 n: 3 - !Solution a: - 3 - 2 - 4 - 2 n: 3 - !Solution a: - 5 - 2 - 4 - 2 n: 3 - !Solution a: - 2 - 3 - 4 - 2 n: 3 - !Solution a: - 3 - 3 - 4 - 2 n: 3 - !Solution a: - 4 - 3 - 4 - 2 n: 3 - !Solution a: - 1 - 4 - 4 - 2 n: 3 - !Solution a: - 3 - 4 - 4 - 2 n: 3 - !Solution a: - 5 - 4 - 4 - 2 n: 3 - !Solution a: - 2 - 5 - 4 - 2 n: 3 - !Solution a: - 4 - 5 - 4 - 2 n: 3 - !Solution a: - 5 - 5 - 4 - 2 n: 3 - !Solution a: - 1 - 1 - 5 - 2 n: 3 - !Solution a: - 2 - 1 - 5 - 2 n: 3 - !Solution a: - 5 - 1 - 5 - 2 n: 3 - !Solution a: - 1 - 2 - 5 - 2 n: 3 - !Solution a: - 3 - 2 - 5 - 2 n: 3 - !Solution a: - 4 - 2 - 5 - 2 n: 3 - !Solution a: - 2 - 3 - 5 - 2 n: 3 - !Solution a: - 3 - 3 - 5 - 2 n: 3 - !Solution a: - 5 - 3 - 5 - 2 n: 3 - !Solution a: - 2 - 4 - 5 - 2 n: 3 - !Solution a: - 4 - 4 - 5 - 2 n: 3 - !Solution a: - 5 - 4 - 5 - 2 n: 3 - !Solution a: - 1 - 5 - 5 - 2 n: 3 - !Solution a: - 3 - 5 - 5 - 2 n: 3 - !Solution a: - 4 - 5 - 5 - 2 n: 3 - !Solution a: - 2 - 1 - 1 - 3 n: 3 - !Solution a: - 4 - 1 - 1 - 3 n: 3 - !Solution a: - 5 - 1 - 1 - 3 n: 3 - !Solution a: - 1 - 2 - 1 - 3 n: 3 - !Solution a: - 2 - 2 - 1 - 3 n: 3 - !Solution a: - 3 - 2 - 1 - 3 n: 3 - !Solution a: - 2 - 3 - 1 - 3 n: 3 - !Solution a: - 4 - 3 - 1 - 3 n: 3 - !Solution a: - 5 - 3 - 1 - 3 n: 3 - !Solution a: - 1 - 4 - 1 - 3 n: 3 - !Solution a: - 3 - 4 - 1 - 3 n: 3 - !Solution a: - 4 - 4 - 1 - 3 n: 3 - !Solution a: - 1 - 5 - 1 - 3 n: 3 - !Solution a: - 3 - 5 - 1 - 3 n: 3 - !Solution a: - 5 - 5 - 1 - 3 n: 3 - !Solution a: - 1 - 1 - 2 - 3 n: 3 - !Solution a: - 2 - 1 - 2 - 3 n: 3 - !Solution a: - 3 - 1 - 2 - 3 n: 3 - !Solution a: - 1 - 2 - 2 - 3 n: 3 - !Solution a: - 4 - 2 - 2 - 3 n: 3 - !Solution a: - 5 - 2 - 2 - 3 n: 3 - !Solution a: - 1 - 3 - 2 - 3 n: 3 - !Solution a: - 4 - 3 - 2 - 3 n: 3 - !Solution a: - 5 - 3 - 2 - 3 n: 3 - !Solution a: - 2 - 4 - 2 - 3 n: 3 - !Solution a: - 3 - 4 - 2 - 3 n: 3 - !Solution a: - 4 - 4 - 2 - 3 n: 3 - !Solution a: - 2 - 5 - 2 - 3 n: 3 - !Solution a: - 3 - 5 - 2 - 3 n: 3 - !Solution a: - 5 - 5 - 2 - 3 n: 3 - !Solution a: - 2 - 1 - 3 - 3 n: 3 - !Solution a: - 4 - 1 - 3 - 3 n: 3 - !Solution a: - 5 - 1 - 3 - 3 n: 3 - !Solution a: - 1 - 2 - 3 - 3 n: 3 - !Solution a: - 4 - 2 - 3 - 3 n: 3 - !Solution a: - 5 - 2 - 3 - 3 n: 3 - !Solution a: - 1 - 4 - 3 - 3 n: 3 - !Solution a: - 2 - 4 - 3 - 3 n: 3 - !Solution a: - 5 - 4 - 3 - 3 n: 3 - !Solution a: - 1 - 5 - 3 - 3 n: 3 - !Solution a: - 2 - 5 - 3 - 3 n: 3 - !Solution a: - 4 - 5 - 3 - 3 n: 3 - !Solution a: - 1 - 1 - 4 - 3 n: 3 - !Solution a: - 3 - 1 - 4 - 3 n: 3 - !Solution a: - 4 - 1 - 4 - 3 n: 3 - !Solution a: - 2 - 2 - 4 - 3 n: 3 - !Solution a: - 3 - 2 - 4 - 3 n: 3 - !Solution a: - 4 - 2 - 4 - 3 n: 3 - !Solution a: - 1 - 3 - 4 - 3 n: 3 - !Solution a: - 2 - 3 - 4 - 3 n: 3 - !Solution a: - 5 - 3 - 4 - 3 n: 3 - !Solution a: - 1 - 4 - 4 - 3 n: 3 - !Solution a: - 2 - 4 - 4 - 3 n: 3 - !Solution a: - 5 - 4 - 4 - 3 n: 3 - !Solution a: - 3 - 5 - 4 - 3 n: 3 - !Solution a: - 4 - 5 - 4 - 3 n: 3 - !Solution a: - 5 - 5 - 4 - 3 n: 3 - !Solution a: - 1 - 1 - 5 - 3 n: 3 - !Solution a: - 3 - 1 - 5 - 3 n: 3 - !Solution a: - 5 - 1 - 5 - 3 n: 3 - !Solution a: - 2 - 2 - 5 - 3 n: 3 - !Solution a: - 3 - 2 - 5 - 3 n: 3 - !Solution a: - 5 - 2 - 5 - 3 n: 3 - !Solution a: - 1 - 3 - 5 - 3 n: 3 - !Solution a: - 2 - 3 - 5 - 3 n: 3 - !Solution a: - 4 - 3 - 5 - 3 n: 3 - !Solution a: - 3 - 4 - 5 - 3 n: 3 - !Solution a: - 4 - 4 - 5 - 3 n: 3 - !Solution a: - 5 - 4 - 5 - 3 n: 3 - !Solution a: - 1 - 5 - 5 - 3 n: 3 - !Solution a: - 2 - 5 - 5 - 3 n: 3 - !Solution a: - 4 - 5 - 5 - 3 n: 3 - !Solution a: - 2 - 1 - 1 - 4 n: 3 - !Solution a: - 3 - 1 - 1 - 4 n: 3 - !Solution a: - 5 - 1 - 1 - 4 n: 3 - !Solution a: - 1 - 2 - 1 - 4 n: 3 - !Solution a: - 2 - 2 - 1 - 4 n: 3 - !Solution a: - 4 - 2 - 1 - 4 n: 3 - !Solution a: - 1 - 3 - 1 - 4 n: 3 - !Solution a: - 3 - 3 - 1 - 4 n: 3 - !Solution a: - 4 - 3 - 1 - 4 n: 3 - !Solution a: - 2 - 4 - 1 - 4 n: 3 - !Solution a: - 3 - 4 - 1 - 4 n: 3 - !Solution a: - 5 - 4 - 1 - 4 n: 3 - !Solution a: - 1 - 5 - 1 - 4 n: 3 - !Solution a: - 4 - 5 - 1 - 4 n: 3 - !Solution a: - 5 - 5 - 1 - 4 n: 3 - !Solution a: - 1 - 1 - 2 - 4 n: 3 - !Solution a: - 2 - 1 - 2 - 4 n: 3 - !Solution a: - 4 - 1 - 2 - 4 n: 3 - !Solution a: - 1 - 2 - 2 - 4 n: 3 - !Solution a: - 3 - 2 - 2 - 4 n: 3 - !Solution a: - 5 - 2 - 2 - 4 n: 3 - !Solution a: - 2 - 3 - 2 - 4 n: 3 - !Solution a: - 3 - 3 - 2 - 4 n: 3 - !Solution a: - 4 - 3 - 2 - 4 n: 3 - !Solution a: - 1 - 4 - 2 - 4 n: 3 - !Solution a: - 3 - 4 - 2 - 4 n: 3 - !Solution a: - 5 - 4 - 2 - 4 n: 3 - !Solution a: - 2 - 5 - 2 - 4 n: 3 - !Solution a: - 4 - 5 - 2 - 4 n: 3 - !Solution a: - 5 - 5 - 2 - 4 n: 3 - !Solution a: - 1 - 1 - 3 - 4 n: 3 - !Solution a: - 3 - 1 - 3 - 4 n: 3 - !Solution a: - 4 - 1 - 3 - 4 n: 3 - !Solution a: - 2 - 2 - 3 - 4 n: 3 - !Solution a: - 3 - 2 - 3 - 4 n: 3 - !Solution a: - 4 - 2 - 3 - 4 n: 3 - !Solution a: - 1 - 3 - 3 - 4 n: 3 - !Solution a: - 2 - 3 - 3 - 4 n: 3 - !Solution a: - 5 - 3 - 3 - 4 n: 3 - !Solution a: - 1 - 4 - 3 - 4 n: 3 - !Solution a: - 2 - 4 - 3 - 4 n: 3 - !Solution a: - 5 - 4 - 3 - 4 n: 3 - !Solution a: - 3 - 5 - 3 - 4 n: 3 - !Solution a: - 4 - 5 - 3 - 4 n: 3 - !Solution a: - 5 - 5 - 3 - 4 n: 3 - !Solution a: - 2 - 1 - 4 - 4 n: 3 - !Solution a: - 3 - 1 - 4 - 4 n: 3 - !Solution a: - 5 - 1 - 4 - 4 n: 3 - !Solution a: - 1 - 2 - 4 - 4 n: 3 - !Solution a: - 3 - 2 - 4 - 4 n: 3 - !Solution a: - 5 - 2 - 4 - 4 n: 3 - !Solution a: - 1 - 3 - 4 - 4 n: 3 - !Solution a: - 2 - 3 - 4 - 4 n: 3 - !Solution a: - 5 - 3 - 4 - 4 n: 3 - !Solution a: - 1 - 5 - 4 - 4 n: 3 - !Solution a: - 2 - 5 - 4 - 4 n: 3 - !Solution a: - 3 - 5 - 4 - 4 n: 3 - !Solution a: - 1 - 1 - 5 - 4 n: 3 - !Solution a: - 4 - 1 - 5 - 4 n: 3 - !Solution a: - 5 - 1 - 5 - 4 n: 3 - !Solution a: - 2 - 2 - 5 - 4 n: 3 - !Solution a: - 4 - 2 - 5 - 4 n: 3 - !Solution a: - 5 - 2 - 5 - 4 n: 3 - !Solution a: - 3 - 3 - 5 - 4 n: 3 - !Solution a: - 4 - 3 - 5 - 4 n: 3 - !Solution a: - 5 - 3 - 5 - 4 n: 3 - !Solution a: - 1 - 4 - 5 - 4 n: 3 - !Solution a: - 2 - 4 - 5 - 4 n: 3 - !Solution a: - 3 - 4 - 5 - 4 n: 3 - !Solution a: - 1 - 5 - 5 - 4 n: 3 - !Solution a: - 2 - 5 - 5 - 4 n: 3 - !Solution a: - 3 - 5 - 5 - 4 n: 3 - !Solution a: - 2 - 1 - 1 - 5 n: 3 - !Solution a: - 3 - 1 - 1 - 5 n: 3 - !Solution a: - 4 - 1 - 1 - 5 n: 3 - !Solution a: - 1 - 2 - 1 - 5 n: 3 - !Solution a: - 2 - 2 - 1 - 5 n: 3 - !Solution a: - 5 - 2 - 1 - 5 n: 3 - !Solution a: - 1 - 3 - 1 - 5 n: 3 - !Solution a: - 3 - 3 - 1 - 5 n: 3 - !Solution a: - 5 - 3 - 1 - 5 n: 3 - !Solution a: - 1 - 4 - 1 - 5 n: 3 - !Solution a: - 4 - 4 - 1 - 5 n: 3 - !Solution a: - 5 - 4 - 1 - 5 n: 3 - !Solution a: - 2 - 5 - 1 - 5 n: 3 - !Solution a: - 3 - 5 - 1 - 5 n: 3 - !Solution a: - 4 - 5 - 1 - 5 n: 3 - !Solution a: - 1 - 1 - 2 - 5 n: 3 - !Solution a: - 2 - 1 - 2 - 5 n: 3 - !Solution a: - 5 - 1 - 2 - 5 n: 3 - !Solution a: - 1 - 2 - 2 - 5 n: 3 - !Solution a: - 3 - 2 - 2 - 5 n: 3 - !Solution a: - 4 - 2 - 2 - 5 n: 3 - !Solution a: - 2 - 3 - 2 - 5 n: 3 - !Solution a: - 3 - 3 - 2 - 5 n: 3 - !Solution a: - 5 - 3 - 2 - 5 n: 3 - !Solution a: - 2 - 4 - 2 - 5 n: 3 - !Solution a: - 4 - 4 - 2 - 5 n: 3 - !Solution a: - 5 - 4 - 2 - 5 n: 3 - !Solution a: - 1 - 5 - 2 - 5 n: 3 - !Solution a: - 3 - 5 - 2 - 5 n: 3 - !Solution a: - 4 - 5 - 2 - 5 n: 3 - !Solution a: - 1 - 1 - 3 - 5 n: 3 - !Solution a: - 3 - 1 - 3 - 5 n: 3 - !Solution a: - 5 - 1 - 3 - 5 n: 3 - !Solution a: - 2 - 2 - 3 - 5 n: 3 - !Solution a: - 3 - 2 - 3 - 5 n: 3 - !Solution a: - 5 - 2 - 3 - 5 n: 3 - !Solution a: - 1 - 3 - 3 - 5 n: 3 - !Solution a: - 2 - 3 - 3 - 5 n: 3 - !Solution a: - 4 - 3 - 3 - 5 n: 3 - !Solution a: - 3 - 4 - 3 - 5 n: 3 - !Solution a: - 4 - 4 - 3 - 5 n: 3 - !Solution a: - 5 - 4 - 3 - 5 n: 3 - !Solution a: - 1 - 5 - 3 - 5 n: 3 - !Solution a: - 2 - 5 - 3 - 5 n: 3 - !Solution a: - 4 - 5 - 3 - 5 n: 3 - !Solution a: - 1 - 1 - 4 - 5 n: 3 - !Solution a: - 4 - 1 - 4 - 5 n: 3 - !Solution a: - 5 - 1 - 4 - 5 n: 3 - !Solution a: - 2 - 2 - 4 - 5 n: 3 - !Solution a: - 4 - 2 - 4 - 5 n: 3 - !Solution a: - 5 - 2 - 4 - 5 n: 3 - !Solution a: - 3 - 3 - 4 - 5 n: 3 - !Solution a: - 4 - 3 - 4 - 5 n: 3 - !Solution a: - 5 - 3 - 4 - 5 n: 3 - !Solution a: - 1 - 4 - 4 - 5 n: 3 - !Solution a: - 2 - 4 - 4 - 5 n: 3 - !Solution a: - 3 - 4 - 4 - 5 n: 3 - !Solution a: - 1 - 5 - 4 - 5 n: 3 - !Solution a: - 2 - 5 - 4 - 5 n: 3 - !Solution a: - 3 - 5 - 4 - 5 n: 3 - !Solution a: - 2 - 1 - 5 - 5 n: 3 - !Solution a: - 3 - 1 - 5 - 5 n: 3 - !Solution a: - 4 - 1 - 5 - 5 n: 3 - !Solution a: - 1 - 2 - 5 - 5 n: 3 - !Solution a: - 3 - 2 - 5 - 5 n: 3 - !Solution a: - 4 - 2 - 5 - 5 n: 3 - !Solution a: - 1 - 3 - 5 - 5 n: 3 - !Solution a: - 2 - 3 - 5 - 5 n: 3 - !Solution a: - 4 - 3 - 5 - 5 n: 3 - !Solution a: - 1 - 4 - 5 - 5 n: 3 - !Solution a: - 2 - 4 - 5 - 5 n: 3 - !Solution a: - 3 - 4 - 5 - 5 n: 3 options: all_solutions: true --- !Test solvers: [cbc] check_against: [gecode] expected: !Result solution: !Solution {} ***/ include "nvalue.mzn"; array[1..4] of var 1..5: a ::add_to_output; var 1..10: n ::add_to_output; constraint nvalue(n, [1, 1, 2, 2, 3, 3]); constraint nvalue(4, [3, 1, 7, 16]); constraint nvalue(3, a); solve satisfy; output [ "a = array1d(1..4, ", show(a), ");\n", "n = ", show(n), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/globals/bin_packing_capa/0000755000175000017500000000000013757304533022426 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/bin_packing_capa/globals_bin_packing_capa.mzn0000644000175000017500000000075213757304533030113 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution bins: [4, 2, 3, 1] - !Solution bins: [4, 2, 1, 3] options: all_solutions: true ***/ include "bin_packing_capa.mzn"; % The example from the GCC. % constraint bin_packing_capa([4, 3, 5, 3, 3], [3, 1, 3], [4, 3, 1]); array[1..4] of var 1..4: bins; constraint bin_packing_capa([1, 2, 1, 3], bins, [3, 2, 1, 1]); solve satisfy; output ["bins = array1d(1..4, ", show(bins), ");\n"]; libminizinc-2.5.3/tests/spec/unit/globals/strict_lex2/0000755000175000017500000000000013757304533021440 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/globals/strict_lex2/globals_strict_lex2.mzn0000644000175000017500000000077413757304533026143 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution y: - [1, 2] - [2, 1] - !Solution y: - [1, 1] - [1, 2] - !Solution y: - [1, 2] - [2, 2] options: all_solutions: true ***/ include "strict_lex2.mzn"; array[1..2, 1..2] of var 1..2: y ::add_to_output; constraint strict_lex2([|2, 2, 3| 2, 3, 1|]); constraint strict_lex2(y); solve satisfy; output ["y = array2d(1..2, 1..2, ", show(y), ");\n"]; libminizinc-2.5.3/tests/spec/unit/general/0000755000175000017500000000000013757304533017170 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/general/test_var_set_element.mzn0000644000175000017500000000056513757304533024137 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: [!!set {}, !!set {}, !!set {}] s: !!set {} x: 3 - !Result solution: !Solution a: [!Range 1..5, !Range 1..5, !Range 1..5] s: !Range 1..5 x: 2 ***/ array [1..3] of var set of 1..5: a :: add_to_output; var 2..10: x :: add_to_output; var set of 1..10: s :: add_to_output = a[x]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_let_complex.mzn0000644000175000017500000000143013757304533023266 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: [1, 3, 5, 7, 9] y: [1, 3, 5, 8, 9] ***/ array[1..5] of var int: x :: add_to_output = [1,3,5,7,9]; array[4..8] of var int: y :: add_to_output = array1d(4..8, [1,3,5,8,9]); constraint let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = max(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[size+1] = (ux - lx < uy - ly) /\ forall (i in 0..size) ( b[i] = ((x[lx+i] < y[ly+i]) \/ ((x[lx+i] == y[ly+i]) /\ b[i+1])) ) /\ b[0]; solve satisfy; output [ "x = ", show(x), ";\n", "y = ", show(y), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/general/test_join1.mzn0000644000175000017500000000026313757304533021776 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: a, b, c, d ***/ string: s = join(", ", ["a", "b", "c", "d"]); solve satisfy; output [s]; libminizinc-2.5.3/tests/spec/unit/general/test_concat3.mzn0000644000175000017500000000036613757304533022314 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ array[1..4] of string: a = ["A", "B", "C", "D"]; string: s = concat([a[4], a[2], a[3], a[1]]); constraint s = "DBCA"; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/unicode_file_name_μ.mzn0000644000175000017500000000020213757304533024306 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result ***/ %% Test to ensure a unicode filename can be used in MiniZinc solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/md_xorall.mzn0000644000175000017500000003144113757304533021702 0ustar kaolkaol/*** !Test options: all_solutions: true solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution b: false bs: [[[false, false], [false, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, true], [true, false]]] ***/ bool: b :: add_to_output = xorall([|true, false | true \/ false, false|]); array[1..2,1..2,1..2] of var bool: bs :: add_to_output; constraint xorall(bs); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_var_set_assignment.mzn0000644000175000017500000000031713757304533024651 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution a: - !!set {1} - !Range 2..3 - !Range 4..5 ***/ array [1..3] of var set of 1..5: a :: add_to_output = [{1}, {2, 3}, {4, 5}]; solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/test_string_array_var.mzn0000644000175000017500000000027513757304533024335 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: All is well ***/ array [1..2] of string: s = ["All", " is"]; solve satisfy; output s ++ [" well"]; libminizinc-2.5.3/tests/spec/unit/general/test_let_simple.mzn0000644000175000017500000000023713757304533023114 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: 42 ***/ int: x :: add_to_output = let { int: a = 42 } in a; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit4.mzn0000644000175000017500000000034013757304533022413 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ constraint let { array[int] of int: x = [1, 2, 3, 4] } in ( length(x) = 4 ); solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/test_let_var_array.mzn0000644000175000017500000000040213757304533023603 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution x: 1 - !Result status: SATISFIED solution: !Solution x: 10 ***/ var int: x :: add_to_output = let { array [1..3] of var 1..10: a = [1, _, 3] } in a[2]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/array_string_gen.mzn0000644000175000017500000000036713757304533023261 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: foosbarsbazs ***/ array[1..3] of string: something = ["foo", "bar", "baz"]; array[1..3] of string: x = [s ++ "s" | s in something]; solve satisfy; output x; libminizinc-2.5.3/tests/spec/unit/general/test_reified_element_constraint.mzn0000644000175000017500000000072313757304533026343 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: [1, 1, 1] b: false i: 4 x: 1 - !Result solution: !Solution a: [2, 1, 1] b: false i: 4 x: 1 - !Result solution: !Solution a: [2, 3, 3] b: false i: 4 x: 1 - !Result solution: !Solution a: [10, 10, 10] b: false i: 6 x: 100 ***/ array [1..3] of var 1..10: a; var bool: b; var 4..6: i; var 1..100: x; constraint a[i] = x <-> b; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/json_ignore.mzn0000644000175000017500000000031513757304533022231 0ustar kaolkaol/*** !Test solvers: [gecode] extra_files: - json_ignore.mzc.mzn - json_ignore.json expected: - !Result solution: !Solution _checker: "data_2 = 2;\n" data_1: 1 ***/ int: data_1 :: add_to_output; libminizinc-2.5.3/tests/spec/unit/general/test_string_with_quote.mzn0000644000175000017500000000030013757304533024524 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Escaped single 'quotes' are fine. ***/ solve satisfy; output ["Escaped single \'quotes' are fine."]; libminizinc-2.5.3/tests/spec/unit/general/json_ignore.mzc.mzn0000644000175000017500000000003613757304533023021 0ustar kaolkaolint: data_2 :: add_to_output; libminizinc-2.5.3/tests/spec/unit/general/test_queens.mzn0000644000175000017500000000205013757304533022252 0ustar kaolkaol/*** !Test solvers: - gecode - chuffed expected: - !Result status: SATISFIED solution: !Solution q: [9, 13, 2, 8, 11, 20, 10, 6, 19, 15, 18, 12, 7, 16, 4, 17, 14, 5, 3, 1] - !Result status: SATISFIED solution: !Solution q: [9, 7, 10, 14, 11, 15, 4, 12, 5, 13, 1, 3, 6, 8, 2, 17, 19, 16, 18, 20] ***/ % Copied from the queens.mzn benchmark. % % In some very rare cases some literals in MiniSAT are labeled during % backjumping but never actually propagated % (if invoke is never entered again), % which leads to the output of flatzinc showing unfixed int variables. % % int: n = 20; % The number of queens. array [1..n] of var 1..n: q; predicate noattack(int: i, int: j, var int: qi, var int: qj) = qi != qj /\ qi + i != qj + j /\ qi - i != qj - j; constraint forall (i in 1..n, j in i+1..n) ( noattack(i, j, q[i], q[j]) ); solve satisfy; output ["% ", show(n), "-queens:\n"] ++ ["% "] ++ [show(q[i]) ++ " " | i in 1..n] ++ ["\n%\n"] ++ ["q = ", show(q), ";\n"]; libminizinc-2.5.3/tests/spec/unit/general/test_array1d_bad_1.mzn0000644000175000017500000000016113757304533023344 0ustar kaolkaol/*** !Test expected: !Error type: EvaluationError ***/ array [1..3] of int: a = [1, 2, 3, 4]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_negated_and_or.mzn0000644000175000017500000000060013757304533023702 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: true y: false z: false - !Solution x: false y: true z: false - !Solution x: false y: false z: false ***/ var bool: x; var bool: y; var bool: z; constraint not (x /\ y \/ z); solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/assert_bad_1.mzn0000644000175000017500000000046513757304533022252 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincAssertionError ***/ array [1..10] of int: a = [i | i in 1..10]; % Predicate style assertion. % constraint assert(forall (i in 1..9) (a[i] > a[i + 1]), "a not decreasing"); var 1..10: x; constraint a[x] = max(a); solve satisfy; output ["x = ", show(x), ";"]; libminizinc-2.5.3/tests/spec/unit/general/test_negated_and.mzn0000644000175000017500000000111413757304533023203 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: false y: false z: false - !Solution x: false y: false z: true - !Solution x: false y: true z: false - !Solution x: false y: true z: true - !Solution x: true y: false z: false - !Solution x: true y: false z: true - !Solution x: true y: true z: false ***/ var bool: x; var bool: y; var bool: z; constraint not(x /\ y /\ z); solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/test_reified_let_bad.mzn0000644000175000017500000000022613757304533024036 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincError ***/ var 1..10: x; var bool: b; constraint b <-> ( let { var 1..10: y } in x = y ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_bad_lb_ub_dom-bad.mzn0000644000175000017500000000021313757304533024225 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ var int: x :: add_to_output; var lb(x)..ub(x): y :: add_to_output; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/wolfgoatetc.mzn0000644000175000017500000000510113757304533022231 0ustar kaolkaol/*** !Test expected: - !Result status: OPTIMAL_SOLUTION solution: !Solution A: [2, 2, 0, 0, 3, 3, 2, 2, 1, 1, 0, 0, 2, 2, 0] solved: 15 - !Result status: OPTIMAL_SOLUTION solution: !Solution A: [2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 2, 2, 0] solved: 15 ***/ % wolfgoatetc.mzn % ft=zinc ts=4 sw=4 et % % % XXX why is lazyfd so slow with this? % % The wolf, goat, and cabbage problem. % % A farmer has to transport his wolf, goat, and cabbage from his farm, across % the river in his rowboat, to the market on the far bank. He can carry only % one item at a time in his boat. He cannot leave the wolf alone with the % goat or the goat alone with the cabbage. set of int: loc = 1..3; loc: farm = 1; loc: boat = 2; loc: market = 3; set of int: obj = 0..3; obj: F = 0; obj: W = 1; obj: G = 2; obj: C = 3; int: max_steps = 15; set of int: step = 1..max_steps; array [step, obj] of var loc: L; % Initial conditions. % constraint L[1, W] = farm; constraint L[1, G] = farm; constraint L[1, C] = farm; constraint L[1, F] = farm; % The goal: move the wolf, goat, and cabbage to the market. % var step: solved :: add_to_output; constraint L[solved, W] = market /\ L[solved, G] = market /\ L[solved, C] = market; % We can't leave the wolf alone with the goat % or the goat alone with the cabbage. % constraint forall (s in step) ( L[s, F] = L[s, G] \/ ( L[s, G] != L[s, C] /\ L[s, G] != L[s, W] ) ); % The actions. At every step the farmer moves from one bank to the other; % he may take something with him. % constraint forall (s in step diff {max_steps - 1, max_steps} where s mod 2 = 1) ( exists (x in {W, G, C, F}, a, b in {farm, market} where a != b) ( move(s, x, a, b) ) ); % Each move goes via the boat. Any object not moving stays where it is. % predicate move(step: s, obj: x, loc: from, loc: to) = L[s, F] = from /\ L[s, x] = from /\ L[s + 1, F] = boat /\ L[s + 1, x] = boat /\ L[s + 2, F] = to /\ L[s + 2, x] = to /\ forall (y in {W, G, C} diff {x}) ( L[s + 1, y] = L[s, y] /\ L[s + 2, y] = L[s, y] ); % The plan is the move (other than the farmer) at each step. % array [step] of var obj: A :: add_to_output = [ bool2int(s < solved) * ( W * bool2int(L[s, W] != L[s + 1, W]) + G * bool2int(L[s, G] != L[s + 1, G]) + C * bool2int(L[s, C] != L[s + 1, C]) ) | s in step diff {max_steps} ] ++ [0]; solve :: int_search( [L[s, x] | s in step, x in obj], input_order, indomain_min, complete ) minimize solved; libminizinc-2.5.3/tests/spec/unit/general/md_sum_int.mzn0000644000175000017500000000310513757304533022053 0ustar kaolkaol/*** --- !Test options: all_solutions: true solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 55 b: 10 - !Solution a: 55 b: 11 - !Solution a: 55 b: 12 - !Solution a: 55 b: 13 - !Solution a: 55 b: 14 - !Solution a: 55 b: 15 - !Solution a: 55 b: 16 - !Solution a: 55 b: 17 - !Solution a: 55 b: 18 - !Solution a: 55 b: 19 - !Solution a: 55 b: 20 - !Solution a: 55 b: 21 - !Solution a: 55 b: 22 - !Solution a: 55 b: 23 - !Solution a: 55 b: 24 - !Solution a: 55 b: 25 - !Solution a: 55 b: 26 - !Solution a: 55 b: 27 - !Solution a: 55 b: 28 - !Solution a: 55 b: 29 - !Solution a: 55 b: 30 - !Solution a: 55 b: 31 - !Solution a: 55 b: 32 - !Solution a: 55 b: 33 - !Solution a: 55 b: 34 - !Solution a: 55 b: 35 - !Solution a: 55 b: 36 - !Solution a: 55 b: 37 - !Solution a: 55 b: 38 - !Solution a: 55 b: 39 - !Solution a: 55 b: 40 - !Solution a: 55 b: 4 - !Solution a: 55 b: 5 - !Solution a: 55 b: 6 - !Solution a: 55 b: 7 - !Solution a: 55 b: 8 - !Solution a: 55 b: 9 ***/ int: a :: add_to_output = sum([|1, 2, 3, 4, 5 | 6, 7, 8, 9, 10|]); array[1..2,1..2] of var 1..10: vs; var -100..100: b :: add_to_output = sum(vs); solve satisfy; output [ "% a = ", show(a), ";\n", "b = ", show(b), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/general/mzn_mod.mzn0000644000175000017500000000027113757304533021361 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ constraint 7 mod 4 = 3; constraint -7 mod 4 = -3; constraint 7 mod -4 = 3; constraint -7 mod -4 = -3; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/xorall_bv.mzn0000644000175000017500000000061413757304533021707 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ constraint xorall([]) = false; constraint xorall([false]) = false; constraint xorall([true]) = true; constraint xorall([false, true]) = true; constraint xorall([true, false]) = true; constraint xorall([true, true]) = false; constraint xorall([false, false]) = false; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/test_array2.mzn0000644000175000017500000000027213757304533022156 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution i: 4 ***/ array [1..3] of int: x = [1, 4, 9]; var 1..4: i; constraint x[i] < 11 -> i > 3; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit5.mzn0000644000175000017500000000024113757304533022414 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [[1, 1], [1, 1]] ***/ array[1..2, int] of var 1..1: x :: add_to_output = [|1, _|_, _|]; solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/test_is_fixed.mzn0000644000175000017500000000451713757304533022556 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ % Test the is_fixed/1 built-in. % Removed temporarily until bug is corrected % constraint is_fixed(_) = false; constraint is_fixed(true) = true; constraint is_fixed(42) = true; constraint is_fixed(3.141) = true; constraint is_fixed("Hello World\n") == true; constraint is_fixed({}) = true; constraint is_fixed({1, 2, 3}) = true; constraint is_fixed({true}) = true; constraint is_fixed({4.0}) = true; constraint is_fixed([]) = true; constraint is_fixed([true, false, true]) = true; constraint is_fixed([1, 2, 3]) = true; constraint is_fixed([1.0, 2.0, 3.0]) = true; constraint is_fixed([{1, 2, 3}, {4, 5, 6}]) = true; constraint is_fixed(["abc", "def", "ghi"]) = true; bool: pb = true; int: pi = 3; float: pf = 4.0; set of int: psi = {1, 2, 3}; constraint is_fixed(pb) = true; constraint is_fixed(pi) = true; constraint is_fixed(pf) = true; constraint is_fixed(psi) = true; array[1..3] of bool: apb = [true, false, true]; array[1..3] of int: api = [1, 2, 3]; array[1..3] of float: apf = [1.0, 2.0, 3.0]; array[1..3] of set of int: apsi = [{}, {1}, {2, 3}]; array[1..3] of string: astr = ["foo", "bar", "baz"]; constraint is_fixed(apb) = true; constraint is_fixed(api) = true; constraint is_fixed(apf) = true; constraint is_fixed(apsi) = true; constraint is_fixed(astr) = true; constraint is_fixed(apb[1]) = true; constraint is_fixed(apb[pi]) = true; var bool: vb; var int: vi; var set of 0..100: vsi; constraint is_fixed(vb) = false; constraint is_fixed(vi) = false; constraint is_fixed(vsi) = false; array[1..3] of var bool: avb; array[1..3] of var int: avi; array[1..3] of var set of 0..100: avsi; constraint is_fixed(avb) = false; constraint is_fixed(avi) = false; constraint is_fixed(avsi) = false; var bool: vb2 = true; var int: vi2 = 42; var set of 0..100: vsi2 = {1, 2, 3}; constraint is_fixed(vb2) = true; constraint is_fixed(vi2) = true; constraint is_fixed(vsi2) = true; predicate test_int(var int: x) = ( if is_fixed(x) then true else false endif ); constraint test_int(341) = true; constraint test_int(vi) = false; constraint test_int(vi2) = true; predicate test_array_int(array[int] of var int: x) = ( if is_fixed(x) then true else false endif ); constraint test_array_int([1, 2, 3]) = true; constraint test_array_int([1, _, 3]) = false; constraint test_array_int(avi) = false; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_var_prod.mzn0000644000175000017500000000112113757304533022564 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result status: SATISFIED solution: !Solution p: 1 xs: [1, 1, 1, 1] - !Result status: SATISFIED solution: !Solution p: 140 xs: [2, 7, 10, 1] - !Result status: SATISFIED solution: !Solution p: 700 xs: [10, 10, 7, 1] - !Result status: SATISFIED solution: !Solution p: 1000 xs: [1, 10, 10, 10] - !Result status: SATISFIED solution: !Solution p: 1000 xs: [10, 10, 1, 10] ***/ array [1..4] of var 1..10: xs :: add_to_output; var 0..1000: p :: add_to_output = product(xs); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_let_par_array.mzn0000644000175000017500000000030213757304533023574 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ int: x = let { array [1..3] of int: a = [1, 2, 3] } in a[1]; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/test_lb_ub_dom_int.mzn0000644000175000017500000000104213757304533023546 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution test_1: 3 test_2: 3 test_3: 1 test_4: 10 ***/ var 1..10: x; var -100..100: test_1 :: add_to_output = lb(3); var -100..100: test_2 :: add_to_output = ub(3); var -100..100: test_3 :: add_to_output = lb(x); var -100..100: test_4 :: add_to_output = ub(x); constraint dom(x) = 1..10; solve satisfy; output [ "test_1 = ", show(test_1), ";\n", "test_2 = ", show(test_2), ";\n", "test_3 = ", show(test_3), ";\n", "test_4 = ", show(test_4), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/general/mortgage.mzn0000644000175000017500000000363213757304533021527 0ustar kaolkaol/*** !Test solvers: - gecode - cbc # Can't check as floats are imprecise expected: !Result status: SATISFIED solution: !Solution P: !Approx 373.0277986476333 mortgage: [!Approx 260.3305785123967, !Approx 136.3636363636363, !Approx 0.0] ***/ % Constraint Programming: Mortgage % % % This Minizinc program is written by Hakan Kjellerstrand, hakank@bonetmail.com, % and is commented in the (swedish) blog post % Constraint Programming: Minizinc, Gecode/flatzinc och ECLiPSe/minizinc % http://www.hakank.org/webblogg/archives/001209.html % % See also my MiniZinc page: http://www.hakank.org/minizinc % % Marriot & Stuckey: Programming with Constraints, page 175f % (famous early example) % % Since Minizinc don't allow recursion, it is implemented as an array. % % This example shows the flexibility of Minizinc: % the same code can calculate P, R _or_ I with just a simple change of the declarations. % % % Calculates P, given I and R: % P: 373.02779864763335 % % Calculates R, given P and I: % R: 149.944102252456 (which is close to 150) % % Calculates I, given R and P: % I: 0.099995922287248337__0.10000424331679297 (close to 0.1) % Note: As of 2008-06-23 this don't work in version >= 0.8. % It may work with later version, though. int: T = 3; % time period % comment one of the initiations to calculate it: var 0.0..10000.0: I = 10.0/100.0; var 0.0..10000.0: R = 150.0; var 0.0..10000.0: P; % = 373.02779864763318; array[1..T] of var float: mortgage; solve satisfy; % solve minimize P; constraint % start value: mortgage[1] = P + (P * I) - R /\ forall(i in 2..T) ( % calculate the next value using a local variable let { var float: NP = mortgage[i-1] + (mortgage[i-1] * I) - R } in mortgage[i] = NP /\ NP >= 0.0 ) ; output [ "P: ", show(P), "\n", "I: ", show(I), "\n", "R: ", show(R), "\n", "mortgage: ", show(mortgage),"\n" % is not especially interesting ]; libminizinc-2.5.3/tests/spec/unit/general/md_forall.mzn0000644000175000017500000000101113757304533021646 0ustar kaolkaol/*** !Test solvers: [gecode] options: all_solutions: true expected: - !Result solution: - !Solution b: true bs: [[[true, true], [true, true]], [[true, true], [true, true]]] --- !Test solvers: [cbc, chuffed] expected: !Result solution: !Solution b: true bs: [[[true, true], [true, true]], [[true, true], [true, true]]] ***/ bool: b :: add_to_output = forall([|true, true | true \/ false, not false|]); array[1..2,1..2,1..2] of var bool: bs :: add_to_output; constraint forall(bs); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_reified_let_good.mzn0000644000175000017500000000035613757304533024244 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution b: false x: 1 - !Result solution: !Solution b: false x: 10 ***/ var 1..10: x; var bool: b; constraint b <-> ( let { var 1..10: y = x + 1 } in x = y ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_negated_let_good.mzn0000644000175000017500000000037613757304533024246 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution x: 1 - !Result status: SATISFIED solution: !Solution x: 10 ***/ var 1..10: x :: add_to_output; constraint not( let { var 1..10: y = x + 1 } in x = y ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_par_set_id_array_index_sets.mzn0000644000175000017500000000040113757304533026504 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ predicate p(array [int] of var int: xs) = let { set of int: ix = index_set(xs), array [ix] of var bool: ys } in ys[1]; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/test_bool_var_array_access.mzn0000644000175000017500000000037713757304533025306 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution i: 2 y: true - !Result status: SATISFIED solution: !Solution i: 2 y: false ***/ var 1..3: i; var bool: y; constraint y = [not(y), y, not(y)][i]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit1.mzn0000644000175000017500000000022113757304533022406 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [1, 1, 1] ***/ array[int] of var 1..1: x :: add_to_output = [1, _, _]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_array1d_bad_4.mzn0000644000175000017500000000025313757304533023351 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincTypeError ***/ array [1..3] of var int: a = [1, 2, 3]; array [11..13] of var int: b = a; solve satisfy; output [show([a,b])];libminizinc-2.5.3/tests/spec/unit/general/test_concat2.mzn0000644000175000017500000000032613757304533022307 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: "105.31..3A String" ***/ string: s = concat([show(10), show(5.3), show({1, 2, 3}), "A String"]); solve satisfy; output [s]; libminizinc-2.5.3/tests/spec/unit/general/test_var_array.mzn0000644000175000017500000000025513757304533022745 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution b: [true, false, false] ***/ array [1..3] of var bool: b; constraint b[1] = true; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/iffall_bv.mzn0000644000175000017500000000061313757304533021642 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: Ok ***/ constraint iffall([]) = true; constraint iffall([false]) = true; constraint iffall([true]) = false; constraint iffall([false, true]) = false; constraint iffall([true, false]) = false; constraint iffall([true, true]) = true; constraint iffall([false, false]) = true; solve satisfy; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit6.mzn0000644000175000017500000000037513757304533022425 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [[1, 1], [1, 1]] ix: !Range 3..4 ***/ array[int, int] of var 1..1: x :: add_to_output = array2d(1..2, 3..4, [1, _, _, _]); set of int: ix :: add_to_output = index_set_2of2(x); solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/test_let_with_annotation.mzn0000644000175000017500000000037213757304533025030 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution x: 1 - !Result status: SATISFIED solution: !Solution x: 10 ***/ var 1..10: x :: add_to_output; constraint x = let { var int: a::domain } in a; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_concat1.mzn0000644000175000017500000000027113757304533022305 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: '"abcdefghi"' ***/ string: s = concat(["abc", "def", "ghi"]); solve satisfy; output [show(s)]; libminizinc-2.5.3/tests/spec/unit/general/test_same.mzn0000644000175000017500000000235013757304533021702 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution if5_5 : 1 if5f_5 : 0 if5_4 : 0 if5f_5f : 1 if2_set2_4 : 0 ifTwoVars : 0 ifTwoOptVars : 0 ifEqualInitVars : 1 ifEqualChainInitVars : 1 ifOneVar : 1 ifOneOptVar : 1 solvers: - gecode - cbc ***/ %-----------------------------------------------------------------------------% var int: if5_5; if5_5 == is_same(5, 5); var int: if5f_5; if5f_5 == is_same(5.0, 5); var int: if5_4; if5_4 == is_same(5, 4); var int: if5f_5f; if5f_5f == is_same(5.0, 5.0); var int: if2_set2_4; if2_set2_4 == is_same(2, {2, 4}); var int: ifTwoVars; var int: var1; var 0..15: var2; ifTwoVars == is_same(var1, var2); var int: ifTwoOptVars; var opt int: varO1; var opt 0..15: varO2; ifTwoOptVars == is_same(varO1, varO2); var int: ifEqualInitVars; var int: varInit1 = 3; var 0..15: varInit2 = 3; ifEqualInitVars == is_same(varInit1, varInit2); var int: ifEqualChainInitVars; var opt int: varInterm = varO1; var opt int: varChInit1 = varInterm; var opt 0..15: varChInit2 = varO1; ifEqualChainInitVars == is_same(varChInit1, varChInit2); var int: ifOneVar; var int: v; ifOneVar == is_same(v, v); var int: ifOneOptVar; var opt -1.0..-0.5: varOF; ifOneOptVar == is_same(varOF, varOF); libminizinc-2.5.3/tests/spec/unit/general/assert_good.mzn0000644000175000017500000000071313757304533022230 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: 10 ***/ array [1..10] of int: a = [i | i in 1..10]; % Predicate style assertion. % constraint assert(forall (i in 1..9) (a[i] < a[i + 1]), "a not increasing"); % Function style assertion. % test even(int: x) = (x mod 2 = 0); array [1..10] of int: b = [assert(even(2 * a[i]), "that's odd...", 2 * a[i]) | i in 1..10]; var 1..10: x; constraint b[x] = max(b); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_times_int_float_eq__defaultopt.mzn0000644000175000017500000000075213757304533027214 0ustar kaolkaol/*** !Test solvers: [gurobi,scip] expected: !Result status: OPTIMAL_SOLUTION solution: !Solution objective: -5 x: 5 y: 6 z: 30 xf: !Approx 5.0 yf: !Approx 6.0 ***/ %% TESTING NON-CONVEX MIQCP %% This one is to make sure that quadratics are on by default for the given solvers var {1, 3, 5}: x; var 1..6: y; var 0..30: z; var 0.5..7.2: yf; var 2.5..6.2: xf; constraint x * y == z; constraint x * yf == z; constraint xf * yf == z; solve minimize 5 * x - z; libminizinc-2.5.3/tests/spec/unit/general/md_exists.mzn0000644000175000017500000000413613757304533021721 0ustar kaolkaol/*** --- !Test options: all_solutions: true solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution b: true bs: [[[true, true], [false, false]], [[false, false], [false, false]]] - !Solution b: true bs: [[[true, true], [false, false]], [[false, true], [false, false]]] - !Solution b: true bs: [[[true, true], [false, false]], [[true, false], [false, false]]] - !Solution b: true bs: [[[true, true], [false, false]], [[true, true], [false, false]]] - !Solution b: true bs: [[[true, true], [false, true]], [[false, false], [false, false]]] - !Solution b: true bs: [[[true, true], [false, true]], [[false, true], [false, false]]] - !Solution b: true bs: [[[true, true], [false, true]], [[true, false], [false, false]]] - !Solution b: true bs: [[[true, true], [false, true]], [[true, true], [false, false]]] - !Solution b: true bs: [[[true, true], [true, false]], [[false, false], [false, false]]] - !Solution b: true bs: [[[true, true], [true, false]], [[false, true], [false, false]]] - !Solution b: true bs: [[[true, true], [true, false]], [[true, false], [false, false]]] - !Solution b: true bs: [[[true, true], [true, false]], [[true, true], [false, false]]] - !Solution b: true bs: [[[true, true], [true, true]], [[false, false], [false, false]]] - !Solution b: true bs: [[[true, true], [true, true]], [[false, true], [false, false]]] - !Solution b: true bs: [[[true, true], [true, true]], [[true, false], [false, false]]] - !Solution b: true bs: [[[true, true], [true, true]], [[true, true], [false, false]]] --- !Test solvers: [cbc] expected: !Result solution: !Solution b: true bs: [[[true, true], [false, false]], [[false, false], [false, false]]] ***/ bool: b :: add_to_output = exists([|false, true | true /\false, not true|]); array[1..2,1..2,1..2] of var bool: bs :: add_to_output; constraint exists(bs); constraint bs[1, 1, 1] = true; constraint bs[1, 1, 2] = true; constraint bs[2, 2, 1] = false; constraint bs[2, 2, 2] = false; libminizinc-2.5.3/tests/spec/unit/general/md_iffall.mzn0000644000175000017500000003170013757304533021634 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution b: false bs: [[[false, false], [false, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, false], [false, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, false], [false, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, false], [true, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, false], [true, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, true], [false, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, true], [false, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[false, true], [true, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[false, true], [true, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, false], [false, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, false], [false, true]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, false], [true, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, false], [true, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, true], [false, false]], [[true, true], [true, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, true], [false, true]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, false], [false, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, false], [true, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, true], [false, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[false, true], [true, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, false], [false, false]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, false], [true, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, true], [false, true]]] - !Solution b: false bs: [[[true, true], [true, false]], [[true, true], [true, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, false], [false, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, false], [true, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, true], [false, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[false, true], [true, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, false], [false, true]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, false], [true, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, true], [false, false]]] - !Solution b: false bs: [[[true, true], [true, true]], [[true, true], [true, true]]] --- !Test solvers: [cbc] expected: !Result solution: !Solution b: false bs: [[[false, false], [false, false]], [[false, false], [false, false]]] ***/ bool: b :: add_to_output = iffall([|true, false | true /\ false, false|]); array[1..2,1..2,1..2] of var bool: bs :: add_to_output; constraint iffall(bs); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_var_array_access.mzn0000644000175000017500000000033513757304533024265 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution i: 1 x: 1 y: !!set {1} ***/ var 1..3: i; var int: x; var set of 1..3: y; constraint x = [1, 2, 3][i]; constraint y = [{1}, {2}, {3}][i]; solve minimize(i); libminizinc-2.5.3/tests/spec/unit/general/test_set_inequality_par.mzn0000644000175000017500000000072713757304533024664 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ % Test par evaluation of set inequality array [int] of set of int: x = [{}, {1}, 1..2, 1..3, 1..4, {1,2,4}, {1,3}, {1,3,4}, {1,4}, {2}, 2..3, 2..4, {2,4}, {3}, 3..4, {4}]; int: n = length(x); % Test every pair to ensure correct relationship constraint forall (i, j in 1..n) ( (i > j -> (x[i] > x[j]) /\ x[i] >= x[j]) /\ (i < j -> (x[i] < x[j]) /\ x[i] <= x[j]) /\ (i = j -> (x[i] <= x[j] /\ x[i] >= x[j])) ); libminizinc-2.5.3/tests/spec/unit/general/test_array_as_generator.mzn0000644000175000017500000000021713757304533024624 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ array [1..4] of int : xs = [1,2,3,4]; constraint 0 <= sum(x in xs)(x-1); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_string_cmp.mzn0000644000175000017500000000044513757304533023125 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution xs: [1, 2, 3, 1, 2, 3] ***/ array [1..6] of var 1..3: xs; array [1..6] of string: ss = ["a", "b", "c", "a", "b", "c"]; constraint forall (i, j in 1..6 where i < j /\ ss[i] < ss[j]) (xs[i] < xs[j]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test-search1.mzn0000644000175000017500000000066413757304533022227 0ustar kaolkaol/*** !Test expected: !Result status: OPTIMAL_SOLUTION solution: !Solution x: 3 y: 8 ***/ %% Check that the first-fail search complies with spec %% var 1..8: x; var 1..10: y; constraint x > 1 -> y > 7; constraint x = 1 -> y < 3; constraint x + y <= 11; solve :: int_search([y,x],first_fail,indomain_min,complete) maximize x + y; output ["x = ",show(x),";\ny = ",show(y),";\n%% should be x = 3, y = 8\n"]; libminizinc-2.5.3/tests/spec/unit/general/test_array1and2d.mzn0000644000175000017500000000044313757304533023066 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution a: [1, 2, 3, 4] ***/ array [ 1.. 4] of var 1..10: a :: add_to_output = [1, 2, 3, 4]; array [11..14] of var 1..10: b = array1d(11..14, a); array [1..2, 3..4] of var 1..10: c = array2d(1..2, 3..4, b); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_min_var_array.mzn0000644000175000017500000000046013757304533023606 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: [1, 1, 1] x: 1 - !Result solution: !Solution a: [2, 2, 2] x: 2 - !Result solution: !Solution a: [3, 3, 3] x: 3 ***/ array [1..3] of var 1..3: a :: add_to_output; var int: x :: add_to_output = min(a); solve maximize x; libminizinc-2.5.3/tests/spec/unit/general/builtins_debug.mzn0000644000175000017500000001206713757304533022723 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result status: SATISFIED solution: !Solution assert_par_int: 1 assert_var_int: 2 assert_par_opt_int: 3 assert_var_opt_int: 4 assert_array_of_par_int: [1] assert_array_of_var_int: [2] assert_array_of_par_opt_int: [3] assert_array_of_var_opt_int: [4] trace_par_int: 1 trace_var_int: 2 trace_par_opt_int: 3 trace_var_opt_int: 4 trace_array_of_par_int: [1] trace_array_of_var_int: [2] trace_array_of_par_opt_int: [3] trace_array_of_var_opt_int: [4] logstream: "trace_logstream_par_int\ntrace_logstream_var_int\ntrace_logstream_par_opt_int\ntrace_logstream_var_opt_int\ntrace_logstream_array_of_par_int\ntrace_logstream_array_of_var_int\ntrace_logstream_array_of_par_opt_int\ntrace_logstream_array_of_var_opt_int\n" ***/ % Previously this would fail type-checking due to missing definitions of trace and assert int: par_int = 1; var 2..2: var_int; opt int: par_opt_int = 3; var opt 4..4: var_opt_int; array[int] of int: array_of_par_int = [1]; array[1..1] of var 2..2: array_of_var_int; array[int] of opt int: array_of_par_opt_int = [3]; array[1..1] of var opt 4..4: array_of_var_opt_int; constraint not absent(var_opt_int) /\ not absent(array_of_var_opt_int[1]); int: assert_par_int :: add_to_output = assert(true, "assert_par_int\n", par_int); var 2..2: assert_var_int :: add_to_output = assert(true, "assert_var_int\n", var_int); opt int: assert_par_opt_int :: add_to_output = assert(true, "assert_par_opt_int\n", par_opt_int); var opt 4..4: assert_var_opt_int :: add_to_output = assert(true, "assert_var_opt_int\n", var_opt_int); array[int] of int: assert_array_of_par_int :: add_to_output = assert(true, "assert_array_of_par_int\n", array_of_par_int); array[1..1] of var 2..2: assert_array_of_var_int :: add_to_output = assert(true, "assert_array_of_var_int\n", array_of_var_int); array[int] of opt int: assert_array_of_par_opt_int :: add_to_output = assert(true, "assert_array_of_par_opt_int\n", array_of_par_opt_int); array[1..1] of var opt 4..4: assert_array_of_var_opt_int :: add_to_output = assert(true, "assert_array_of_var_opt_int\n", array_of_var_opt_int); int: trace_par_int :: add_to_output = trace("trace_par_int\n", par_int); var 2..2: trace_var_int :: add_to_output = trace("trace_var_int\n", var_int); opt int: trace_par_opt_int :: add_to_output = trace("trace_par_opt_int\n", par_opt_int); var opt 4..4: trace_var_opt_int :: add_to_output = trace("trace_var_opt_int\n", var_opt_int); array[int] of int: trace_array_of_par_int :: add_to_output = trace("trace_array_of_par_int\n", array_of_par_int); array[1..1] of var 2..2: trace_array_of_var_int :: add_to_output = trace("trace_array_of_var_int\n", array_of_var_int); array[int] of opt int: trace_array_of_par_opt_int :: add_to_output = trace("trace_array_of_par_opt_int\n", array_of_par_opt_int); array[1..1] of var opt 4..4: trace_array_of_var_opt_int :: add_to_output = trace("trace_array_of_var_opt_int\n", array_of_var_opt_int); int: trace_stdout_par_int :: add_to_output = trace_stdout("% trace_stdout_par_int\n", par_int); var 2..2: trace_stdout_var_int :: add_to_output = trace_stdout("% trace_stdout_var_int\n", var_int); opt int: trace_stdout_par_opt_int :: add_to_output = trace_stdout("% trace_stdout_par_opt_int\n", par_opt_int); var opt 4..4: trace_stdout_var_opt_int :: add_to_output = trace_stdout("% trace_stdout_var_opt_int\n", var_opt_int); array[int] of int: trace_stdout_array_of_par_int :: add_to_output = trace_stdout("% trace_stdout_array_of_par_int\n", array_of_par_int); array[1..1] of var 2..2: trace_stdout_array_of_var_int :: add_to_output = trace_stdout("% trace_stdout_array_of_var_int\n", array_of_var_int); array[int] of opt int: trace_stdout_array_of_par_opt_int :: add_to_output = trace_stdout("% trace_stdout_array_of_par_opt_int\n", array_of_par_opt_int); array[1..1] of var opt 4..4: trace_stdout_array_of_var_opt_int :: add_to_output = trace_stdout("% trace_stdout_array_of_var_opt_int\n", array_of_var_opt_int); int: trace_logstream_par_int :: add_to_output = trace_logstream("trace_logstream_par_int\n", par_int); var 2..2: trace_logstream_var_int :: add_to_output = trace_logstream("trace_logstream_var_int\n", var_int); opt int: trace_logstream_par_opt_int :: add_to_output = trace_logstream("trace_logstream_par_opt_int\n", par_opt_int); var opt 4..4: trace_logstream_var_opt_int :: add_to_output = trace_logstream("trace_logstream_var_opt_int\n", var_opt_int); array[int] of int: trace_logstream_array_of_par_int :: add_to_output = trace_logstream("trace_logstream_array_of_par_int\n", array_of_par_int); array[1..1] of var 2..2: trace_logstream_array_of_var_int :: add_to_output = trace_logstream("trace_logstream_array_of_var_int\n", array_of_var_int); array[int] of opt int: trace_logstream_array_of_par_opt_int :: add_to_output = trace_logstream("trace_logstream_array_of_par_opt_int\n", array_of_par_opt_int); array[1..1] of var opt 4..4: trace_logstream_array_of_var_opt_int :: add_to_output = trace_logstream("trace_logstream_array_of_var_opt_int\n", array_of_var_opt_int); string: logstream :: add_to_output = logstream_to_string();libminizinc-2.5.3/tests/spec/unit/general/test_times_int_float_eq.mzn0000644000175000017500000000070413757304533024623 0ustar kaolkaol/*** !Test solvers: [gurobi,scip] options: -D: QuadrFloat=true;QuadrIntCard=0 expected: !Result status: OPTIMAL_SOLUTION solution: !Solution objective: -5 x: 5 y: 6 z: 30 xf: !Approx 5.0 yf: !Approx 6.0 ***/ %% TESTING NON-CONVEX MIQCP var {1, 3, 5}: x; var 1..6: y; var 0..30: z; var 0.5..7.2: yf; var 2.5..6.2: xf; constraint x * y == z; constraint x * yf == z; constraint xf * yf == z; solve minimize 5 * x - z; libminizinc-2.5.3/tests/spec/unit/general/test_negated_or.mzn0000644000175000017500000000042713757304533023067 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: false y: false z: false ***/ var bool: x; var bool: y; var bool: z; constraint not(x \/ y \/ z); solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/test_lb_ub_float.mzn0000644000175000017500000000054613757304533023232 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution test_1: 3.0 test_2: 3.0 test_3: 1.0 test_4: 10.0 ***/ var 1.0..10.0: x; var float: test_1 :: add_to_output = lb(3.0); var float: test_2 :: add_to_output = ub(3.0); var float: test_3 :: add_to_output = lb(x); var float: test_4 :: add_to_output = ub(x); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit2.mzn0000644000175000017500000000047413757304533022421 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution ia: !Range 1..3 ib: !Range 2..5 ***/ array[int] of int: a = [1, 2, 3]; set of int: ia :: add_to_output = index_set(a); array[int] of int: b = array1d(2..5, [1, 2, 3, 4]); set of int: ib :: add_to_output = index_set(b); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit8.mzn0000644000175000017500000000207113757304533022422 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] y: - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] z: - - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] - - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] - - - [1, 1] - [1, 1] - - [1, 1] - [1, 1] ***/ array[int, int, int] of var 1..1: x :: add_to_output = array3d(1..2, 1..2, 1..2, [1, _, _, _, _, _, _, _]); array[int, int, int, int] of var 1..1: y :: add_to_output = array4d(1..2, 1..2, 1..2, 1..2, [1, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _]); array[int, int, int, int, int] of var 1..1: z :: add_to_output = array5d(1..2,1..2, 1..2, 1..2, 1..2, [1, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_negated_let_bad.mzn0000644000175000017500000000020613757304533024034 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincError ***/ var 1..10: x; constraint not( let { var 1..10: y } in x = y ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_array1d_bad_2.mzn0000644000175000017500000000016113757304533023345 0ustar kaolkaol/*** !Test expected: !Error type: EvaluationError ***/ array [0..3] of int: a = [1, 2, 3, 4]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_lb_ub_array_int.mzn0000644000175000017500000000046413757304533024114 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution test_1: 1 test_2: 3 ***/ array[1..3] of var 1..3: a; var -100..100: test_1 :: add_to_output = lb(a[1]); var -100..100: test_2 :: add_to_output = ub(a[1]); constraint lb_array(a) = 1; constraint ub_array(a) = 3; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_array1d_bad_3.mzn0000644000175000017500000000020013757304533023340 0ustar kaolkaol/*** !Test expected: !Error type: EvaluationError ***/ array [1..3] of int: a = array1d(1..3, [1, 2, 3, 4]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/md_product_int.mzn0000644000175000017500000000066313757304533022735 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution a: 16 b: 1 - !Solution a: 16 b: 2 - !Solution a: 16 b: 4 - !Solution a: 16 b: 8 - !Solution a: 16 b: 16 ***/ int: a :: add_to_output = product([|2, 2 | 2, 2|]); array[1..2, 1..2] of var 1..2: vs; var int: b :: add_to_output = product(vs); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_set_lt_2.mzn0000644000175000017500000000134413757304533022472 0ustar kaolkaol/*** --- !Test solvers: [chuffed] # Too slow on CBC options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: - !Solution sets: - !!set {} - !!set {1} - !Range 1..2 - !Range 1..3 - !!set {1, 3} - !!set {2} - !Range 2..3 - !!set {3} --- !Test solvers: [cbc] expected: !Result status: SATISFIED solution: !Solution sets: - !!set {} - !!set {1} - !Range 1..2 - !Range 1..3 - !!set {1, 3} - !!set {2} - !Range 2..3 - !!set {3} ***/ % Lexicographic order of subsets of 1..3 int: n = 3; int: m = pow(2, n); array[1..m] of var set of 1..n: sets; constraint forall (i in 1..m-1) (sets[i] < sets[i+1]); output [show(sets)]; solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/assert_bad_2.mzn0000644000175000017500000000050613757304533022247 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincAssertionError ***/ array [1..10] of int: a = [i | i in 1..10]; % Function style assertion. % test odd(int: x) = (x mod 2 = 1); array [1..10] of int: b = [assert(odd(2 * a[i]), "that's odd...", 2 * a[i]) | i in 1..10]; var 1..10: x; constraint b[x] = max(b); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/bin_pack_multiobj.mzn0000644000175000017500000000102713757304533023371 0ustar kaolkaol/*** !Test solvers: [gurobi] expected: !Result solution: !Solution load: [3, 8, 10] ***/ include "bin_packing_load_fn.mzn"; include "experimental.mzn"; array [1..6] of var 1..3: bin; array [1..3] of var 0..10: load; array [1..6] of int: weight = [i | i in 1..6]; constraint load = bin_packing_load(bin, weight); constraint load[1] >= 3 /\ load[3] <= 10; solve :: goal_hierarchy([int_min_goal(load[1]), int_min_goal(load[2]), int_min_goal(load[3])]) satisfy; output ["bin = ", show(bin), "\n", "load = ", show(load)]; libminizinc-2.5.3/tests/spec/unit/general/test_string_var.mzn0000644000175000017500000000024113757304533023130 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: All is well ***/ string: s = "All is well"; solve satisfy; output [s]; libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit3.mzn0000644000175000017500000000053013757304533022413 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution ax: !Range 1..2 bx: !Range 1..2 ***/ array[int, int] of int: a = [|1, 2|3, 4|]; set of int: ax :: add_to_output = index_set_1of2(a); set of int: bx :: add_to_output = index_set_2of2(a); solve satisfy; output [ "ax = ", show(ax), "\n", "bx = ", show(bx) ]; libminizinc-2.5.3/tests/spec/unit/general/builtins_arg_max.mzn0000644000175000017500000000161313757304533023246 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result status: SATISFIED solution: !Solution bool_output: 3 int_output: 1 float_output: 2 indexed_output: 4 enumed_output: "TWO" ***/ % Base cases array[int] of int: bool_array = [false, false, true, true]; var int: bool_output ::add_to_output = arg_max(bool_array); array[int] of int: int_array = [-4,-5,-4]; var int: int_output ::add_to_output = arg_max(int_array); array[int] of float: float_array = [1.4, 4.3, 2.3, 4.2]; var int: float_output ::add_to_output = arg_max(float_array); % Test using arrays not starting at 1 array[3..5] of int: indexed_array = array1d(3..5, [4,5,3]); var int: indexed_output ::add_to_output = arg_max(indexed_array); % Test using an enum as index enum TENUM = {ONE, TWO, THREE}; array[TENUM] of bool: enumed_array = [false, true, false]; var TENUM: enumed_output ::add_to_output = arg_max(enumed_array); libminizinc-2.5.3/tests/spec/unit/general/test_bad_array_size-bad.mzn0000644000175000017500000000015213757304533024455 0ustar kaolkaol/*** !Test expected: !Error ***/ array [1..3] of int: a :: add_to_output = [1, 2, 3, 4]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_set_lt_1.mzn0000644000175000017500000000170613757304533022473 0ustar kaolkaol/*** !Test solvers: [chuffed] # Too slow on cbc options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: - !Solution sets: - !Range 1..3 - !!set {1, 2, 4} - !!set {1, 2, 5} - !!set {1, 2, 6} - !!set {1, 3, 4} - !!set {1, 3, 5} - !!set {1, 3, 6} - !!set {1, 4, 5} - !!set {1, 4, 6} - !!set {1, 5, 6} - !Range 2..4 - !!set {2, 3, 5} - !!set {2, 3, 6} - !!set {2, 4, 5} - !!set {2, 4, 6} - !!set {2, 5, 6} - !Range 3..5 - !!set {3, 4, 6} - !!set {3, 5, 6} - !Range 4..6 ***/ % Lexicographic order of 3-subsets of 1..6 set of int: elems = 1..6; int: n = 3; int: m = (product (i in card(elems)-n+1..card(elems)) (i)) div (product (i in 1..n) (i)); % choose n from elems array [1..m] of var set of elems: sets; constraint forall (i in 1..m) (card(sets[i]) = n); constraint forall (i in 1..m-1) (sets[i] < sets[i+1]); solve satisfy; output [show(sets)];libminizinc-2.5.3/tests/spec/unit/general/json_ignore.json0000644000175000017500000000004413757304533022375 0ustar kaolkaol{ "data_1": 1, "data_2": 2 }libminizinc-2.5.3/tests/spec/unit/general/test_array1.mzn0000644000175000017500000000027413757304533022157 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution i: 4 ***/ array [1..3] of int: x = [1, 4, 9]; var 1..4: i; constraint i <= 3 -> x[i] > 10; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_par_set_element.mzn0000644000175000017500000000070613757304533024126 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution a: - !!set {1} - !Range 1..2 - !Range 1..3 s: !!set {1} x: 1 - !Result status: SATISFIED solution: !Solution a: [!!set {1}, !Range 1..2, !Range 1..3] s: !Range 1..2 x: 2 ***/ array [1..3] of set of int: a :: add_to_output = [{1}, {1, 2}, {1, 2, 3}]; var 1..2: x :: add_to_output; var set of 1..10: s :: add_to_output = a[x]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_join3.mzn0000644000175000017500000000040013757304533021771 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: 10, 5.3, A String, foobar ***/ array[1..4] of string: v; string: s = join(", ", v); v = [show(10), show(5.3), "A String", "foo" ++ "bar"]; solve satisfy; output [s]; libminizinc-2.5.3/tests/spec/unit/general/test_set_lt_3.mzn0000644000175000017500000000034313757304533022471 0ustar kaolkaol/*** --- !Test solvers: [chuffed, cbc] expected: !Result solution: !Solution y: !!set {1, 4} ***/ % Comparison of sets with holes set of int: x = {1, 2}; var set of {1, 4}: y; constraint card(y) = 2; constraint x < y; libminizinc-2.5.3/tests/spec/unit/general/anon_var_flatten.mzn0000644000175000017500000000044313757304533023237 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution x: - !!set {0} - !Range 0..9 - !Result status: SATISFIED solution: !Solution x: - !!set {0} - !!set {} ***/ array [1..2] of var set of 0..9: x :: add_to_output = [{0}, _]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_to_enum.mzn0000644000175000017500000000230713757304533022425 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result solution: !Solution par_int: b var_int: c array_of_int: [a, b, c] array_of_var_int: [a, b, c] array_of_set_of_int: [!!set {a}, !!set {a, b}, !!set {a, b, c}] array_of_var_set_of_int: [!!set {a}, !!set {a, b}, !!set {a, b, c}] set_of_int: !!set {a, b, c} var_set_of_int: !!set {a, b, c} ***/ enum X = {a, b, c}; var 1..3: i; array [1..3] of var 1..3: j; var set of 1..3: k; array [1..3] of var set of 1..3: l; constraint j[1] < j[2] /\ j[2] < j[3]; constraint card(k) = 3; constraint forall (x in 1..3) (card(l[x]) = x); constraint 1 in l[1] /\ not (3 in l[2]); X: par_int :: add_to_output = to_enum(X, 2); var X: var_int :: add_to_output = to_enum(X, i); array [1..3] of X: array_of_int :: add_to_output = to_enum(X, [1, 2, 3]); array [1..3] of var X: array_of_var_int :: add_to_output = to_enum(X, j); set of X: set_of_int :: add_to_output = to_enum(X, {1, 2, 3}); var set of X: var_set_of_int :: add_to_output = to_enum(X, k); array [1..3] of set of X: array_of_set_of_int :: add_to_output = to_enum(X, [{1}, {1, 2}, {1, 2, 3}]); array [1..3] of var set of X: array_of_var_set_of_int :: add_to_output = to_enum(X, l); solve maximize i;libminizinc-2.5.3/tests/spec/unit/general/mzn-implicit7.mzn0000644000175000017500000000022113757304533022414 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: [] ***/ array[int] of int: x :: add_to_output = []; solve satisfy;libminizinc-2.5.3/tests/spec/unit/general/md_sum_float.mzn0000644000175000017500000000054513757304533022373 0ustar kaolkaol/*** --- !Test solvers: [gecode] options: all_solutions: true expected: !Result solution: - !Solution a: 55.0 --- !Test # Workaround for chuffed all-solution issue solvers: [chuffed] expected: !Result solution: !Solution a: 55.0 ***/ float : a :: add_to_output = sum([|1.0, 2.0, 3.0, 4.0, 5.0 | 6.0, 7.0, 8.0, 9.0, 10.0|]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_negated_let_good_2.mzn0000644000175000017500000000054013757304533024460 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: [0] - !Solution x: [2] ***/ array[1..1] of var 0..2: x; constraint not (let { var int: y = x[x[1]] } in y > 0); solve :: int_search(x, input_order, indomain_min, complete) satisfy; libminizinc-2.5.3/tests/spec/unit/general/test_join2.mzn0000644000175000017500000000033713757304533022001 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: 10, 5.3, A String, foobar ***/ string: s = join(", ", [show(10), show(5.3), "A String", "foo" ++ "bar"]); solve satisfy; output [s]; libminizinc-2.5.3/tests/spec/unit/general/mzn_div.mzn0000644000175000017500000000026713757304533021371 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ constraint 7 div 4 = 1; constraint -7 div 4 = -1; constraint 7 div -4 = -1; constraint -7 div -4 = 1; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/0000755000175000017500000000000013757304533017733 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/regression/change_partition.mzn0000644000175000017500000000664113757304533024006 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution nchange: 2 partitions: - !!set {1, 3} - !!set {4} - !!set {2, 6} variables: [6, 6, 2, 1, 3, 3, 1, 6, 2, 2, 2] ***/ % Regression test for the bug descibed in var_self_assign_bug.mzn. % (This is the model from the original bug report.) % Global constraint in MiniZinc. % % From Global Constraint Catalogue % http://www.emn.fr/x-info/sdemasse/gccat/Cchange_parition.html % """ % NCHANGE is the number of times that the following constraint holds: % X and Y do not belong to the same partition of the collection PARTITIONS. % X and Y correspond to consecutive variables of the collection VARIABLES. % % Example % ( % 2,​< % var-6, % var-6, % var-2, % var-1, % var-3, % var-3, % var-1, % var-6, % var-2, % var-2, % var-2 % >, % < % p-<1, 3>, % p-<4>,​ % p-<2,6> % > % ) % % In the example we have the following two changes: % * One change between values 2 and 1 (since 2 and 1 respectively belong % to the third and the first partition), % * One change between values 1 and 6 (since 1 and 6 respectively belong % to the first and the third partition). % % Consequently the change_partition constraint holds since its first % argument NCHANGE is assigned to 2. % """ % % Model created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc include "globals.mzn"; int: n = 11; int: m = 3; set of int: S = {1,2,3,4,6}; array[1..n] of var S: variables; array[1..3] of var set of S: partitions; var int: nchange; output [ "nchange = ", show(nchange), ";\n", "partitions = ", show(partitions), ";\n", "variables = ", show(variables), ";\n" ]; % a variant of the partition_set from globals.mzn where universe is % a var set of int (instead of par set of int) predicate partition_set2(array[int] of var set of int: S, var set of int: universe) = all_disjoint(S) /\ universe == array_union(i in index_set(S)) ( S[i] ) ; % % change_partition(NCHANGE, VARIABLES, PARTITIONS) % predicate change_partition(var int: nchange, array[int] of var int: variables, array[int] of var set of int: partitions) = let { int: lbv = min(index_set(variables)), int: ubv = max(index_set(variables)), int: lbp = min(index_set(partitions)), int: ubp = max(index_set(partitions)) } in % number of patition changes nchange = n - sum(v in lbv+1..ubv, p in lbp..ubp) ( bool2int( variables[v-1] in partitions[p] /\ variables[v] in partitions[p] ) ) - 1 /\ partition_set2(partitions, array_union(i in lbp..ubp) (partitions[i])) /\ % for generating partitions: exclude empty partitions forall(i in lbp..ubp) ( card(partitions[i]) > 0 ) ; predicate cp1d(array[int] of int: x, array[int] of var int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; predicate cp1d(array[int] of set of int: x, array[int] of var set of int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; solve satisfy; constraint cp1d([6,6,2,1,3,3,1,6,2,2,2], variables) /\ cp1d([ {1,3}, {4}, {2,6}], partitions) /\ change_partition(nchange, variables, partitions) /\ nchange = 2 ; libminizinc-2.5.3/tests/spec/unit/regression/test_bug218.mzn0000644000175000017500000000044313757304533022531 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 1, 1] a: 1 y: [1, 1, 1] b: 1 - !Result solution: !Solution x: [3, 3, 3] a: 9 y: [3, 3, 3] b: 9 ***/ include "test_bug218_inc.mzn"; var 1..ub(sum(x)): a; array[1..3] of var 1..3: y; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/no_macro.mzn0000644000175000017500000000041313757304533022254 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 4 r: true ***/ predicate no_mixed(var int: x); predicate start(var int: x) = no_mixed(x); predicate start_reif(var int: x, var bool: b) = x + b = 5; var 1..4: x; var bool: r; constraint start(x) <-> r; libminizinc-2.5.3/tests/spec/unit/regression/big_array_lit.mzn0000644000175000017500000276632213757304533023312 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution {} ***/ % This is a regression test for a series of problems that caused % stack overflows in mzn2fzn r13357 and before. int: f = product([i | i in 1..n]); int: n = 7; array[1..f, 1..n,1..n] of 0..1: overlays; solve satisfy; overlays = array3d(1..f,1..n,1..n, [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, ]); libminizinc-2.5.3/tests/spec/unit/regression/bug69_2.mzn0000644000175000017500000000041513757304533021636 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution y: 2 - !Result solution: !Solution y: 10 ***/ % A regression test for G12 bug #69. % var int: y; predicate p(var 1..10: x) = (x mod 2 = 0); constraint p(y); solve satisfy; output ["y = ", show(y), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug269.mzn0000644000175000017500000000154613757304533021505 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution queens: [4, 6, 1, 5, 2, 8, 3, 7] - !Result solution: !Solution queens: [4, 6, 8, 3, 1, 7, 5, 2] - !Result solution: !Solution queens: [8, 4, 1, 3, 6, 2, 7, 5] - !Result solution: !Solution queens: [2, 5, 7, 4, 1, 8, 6, 3] ***/ % Regression test for bug #269: the assignment to the annotation % variable "var_selection" (marked with ** below) was being emitted % in the .ozn file leading to an abort in solns2out. include "globals.mzn"; int: n; array[1..n] of var 1..n: queens; ann: var_selection; solve :: int_search( queens, var_selection, indomain_median, complete) satisfy; constraint all_different(queens); constraint all_different([queens[i]+i | i in 1..n]); constraint all_different([queens[i]-i | i in 1..n]); output ["Ok\n"]; n = 8; var_selection = first_fail; % (**) libminizinc-2.5.3/tests/spec/unit/regression/bug212.mzn0000644000175000017500000000050313757304533021461 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution {} ***/ % A regression test for bug #212. In r13904, the FlatZinc optimizer was % aborting on the string literal annotation argument below. annotation f(string:x); var int : x; var int : y; constraint (x != y) :: f("abc"); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/is_fixed.mzn0000644000175000017500000000017413757304533022255 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution y: true ***/ var 1..1: x; bool: y :: add_to_output = is_fixed(x);libminizinc-2.5.3/tests/spec/unit/regression/opt_removed_items.mzn0000644000175000017500000000125513757304533024210 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [1, 1, 1] - !Result solution: !Solution x: [1, 1, 4] - !Result solution: !Solution x: [1, 4, 1] - !Result solution: !Solution x: [1, 4, 4] - !Result solution: !Solution x: [4, 1, 1] - !Result solution: !Solution x: [4, 1, 4] - !Result solution: !Solution x: [4, 4, 1] - !Result solution: !Solution x: [4, 4, 4] ***/ % At for value_precede_ch variables. include "value_precede_chain.mzn"; array[1..3] of var 1..4: x; constraint value_precede_chain([3, 2, 1], [3, 2, 1]); constraint value_precede_chain([5, 3, 2], x); solve satisfy; output ["x = array1d(1..3, ", show(x), ");\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug259.mzn0000644000175000017500000002026413757304533021502 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: !Trim | sz[1][1][1][5] = 1 sz[1][2][1][1] = 1 pz[1][1][1][2][13] = 1 pz[1][2][1][1][13] = 1 obj: 62 - !Result solution: !Solution _output_item: !Trim | sz[1][1][1][5] = 1 sz[1][2][1][1] = 1 pz[1][1][1][1][13] = 1 pz[1][2][1][2][13] = 1 obj: 62 - !Result solution: !Solution _output_item: !Trim | sz[1][1][1][1] = 1 sz[1][2][1][5] = 1 pz[1][1][1][1][13] = 1 pz[1][2][1][2][13] = 1 obj: 62 ***/ % Regression test for bug #259: mzn2fzn (and consequently solns2out) didn't support % array5d casts. %----------------------------------------------------------------------------% % Copyright (c) 2011 HighTechKids. All rights reserved % HighTechKids is on the web at: http://www.hightechkids.org % This code is released under GPL; see LICENSE.txt for details. include "globals.mzn"; % run with 'minizinc -G linear -b mip' - doesn't work because of 5d arrays % mzn2fzn --no-output-ozn --globals-dir linear schedule.mzn .dzn && flatzinc -b mip -o schedule.result schedule.fzn % parameters int: TInc; int: TMax_hours; % subjective setup int: NSubjective; % performance setup int: NRounds; int: NTables; % judging groups int: NGroups; int: alpha_perf_minutes; int: ct_minutes; int: pct_minutes; %%%% Don't edit below here %%%% int: M = 10000; % computed parameters array [1..NSubjective] of int : subj_minutes; array [1..NGroups] of int : group_counts; array [1..NSubjective] of int : alpha_subj = [ x div TInc | x in subj_minutes ]; int: NTeams = sum(group_counts); constraint assert(NTeams mod 2 == 0, "Number of teams must be even"); int: TMax = TMax_hours * 60 div TInc; int: alpha_perf = alpha_perf_minutes div TInc; int: ct = ct_minutes div TInc; int: pct = pct_minutes div TInc; int: MaxTeamsInGroup = max(group_counts); % variables array [1..NGroups, 1..MaxTeamsInGroup, 1..NSubjective, 1..TMax ] of var 0..1 : sz; array [1..NGroups, 1..MaxTeamsInGroup, 1..NSubjective, 1..TMax ] of var 0..1 : sy; array [1..NGroups, 1..MaxTeamsInGroup, 1..NTables, 1..2, 1..TMax ] of var 0..1 : pz; array [1..NGroups, 1..MaxTeamsInGroup, 1..NTables, 1..2, 1..TMax ] of var 0..1 : py; var int: obj; % stationBusySubjective constraint forall(g in 1..NGroups) ( forall (i in 1..group_counts[g]) ( forall (n in 1..NSubjective) ( forall (t in 1..TMax) ( sum (u in 1..alpha_subj[n]) ( if(t-u+1 >= 1) then sz[g,i,n,t-u+1] else 0 endif ) <= sy[g,i,n,t] )))); % stationBusyPerformance constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(b in 1..NTables) ( forall(s in 1..2) ( forall(t in alpha_perf..TMax) ( sum(u in 1..alpha_perf) ( if(t-u+1 >= 1) then pz[g,i,b,s,t-u+1] else 0 endif ) <= py[g,i,b,s,t] ))))); % stationStartSubjective constraint forall(g in 1..NGroups) ( forall (i in 1..group_counts[g]) ( forall (n in 1..NSubjective) ( forall (t in 2..TMax) ( sy[g,i,n,t] - sy[g,i,n,t-1] <= sz[g,i,n,t] )))); % stationStartPerformance constraint forall(g in 1..NGroups) ( forall (i in 1..group_counts[g]) ( forall(b in 1..NTables) ( forall(s in 1..2) ( forall(t in 2..TMax) ( py[g,i,b,s,t] - py[g,i,b,s,t-1] <= pz[g,i,b,s,t] ))))); % noOverlapSubjective constraint forall(g in 1..NGroups) ( forall (t in 1..TMax) ( forall (n in 1..NSubjective) ( sum(i in 1..group_counts[g]) (sy[g,i,n,t]) <= 1 ))); % noOverlapPerformance constraint forall (t in 1..TMax) ( forall (b in 1..NTables) ( forall (s in 1..2) ( sum(g in 1..NGroups) (sum(i in 1..group_counts[g]) (py[g,i,b,s,t])) <= 1 ))); % teamSubjective constraint forall(g in 1..NGroups) ( forall (i in 1..group_counts[g]) ( forall (n in 1..NSubjective) ( sum (t in 1..TMax) (sz[g,i,n,t]) = 1 ))); % teamPerformance constraint forall(g in 1..NGroups) ( forall (i in 1..group_counts[g]) ( sum (b in 1..NTables) ( sum (t in 1..TMax) (pz[g,i,b,1,t] + pz[g,i,b,2,t]) ) = 1 )); % subjectiveEOS constraint sum(g in 1..NGroups) ( sum (i in 1..group_counts[g]) ( sum (n in 1..NSubjective) ( sum (t in TMax-alpha_subj[n]+1..TMax) ( sz[g,i,n,t] )))) = 0; % performanceEOS constraint sum(g in 1..NGroups) ( sum (i in 1..group_counts[g]) ( sum (b in 1..NTables) ( sum (t in TMax-alpha_perf+1..TMax) ( pz[g,i,b,1,t] + pz[g,i,b,2,t] )))) = 0; int: subj_ulimit = ct-1; int: subj_tlimit = TMax-subj_ulimit; % subjSubjChangetime constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(n in 1..NSubjective) ( forall(t in 1..subj_tlimit) ( forall(d in 1..NSubjective) ( forall(u in 0..subj_ulimit) ( if(d != n) then sy[g,i,n,t] + sy[g,i,d,t+u] <= 1 else true endif )))))); % subjPerfChangetime constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(n in 1..NSubjective) ( forall(t in 1..subj_tlimit) ( forall(u in 0..subj_ulimit) ( forall(b in 1..NTables) ( forall(s in 1..2) ( sy[g,i,n,t] + py[g,i,b,s,t+u] <= 1 ))))))); int: perf_ulimit = ct-1; int: perf_tlimit = TMax-perf_ulimit; % perfPerfChangetime constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(b in 1..NTables) ( forall(s in 1..2) ( forall(t in 1..perf_tlimit) ( forall(u in 0..perf_ulimit) ( forall(d in 1..NTables) ( forall(e in 1..2) ( if(b != d /\ s != e) then py[g,i,b,s,t] + py[g,i,d,e,t+u] <= 1 else true endif )))))))); % perfSubjChangetime constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(b in 1..NTables) ( forall(s in 1..2) ( forall(t in 1..perf_tlimit) ( forall(u in 0..perf_ulimit) ( forall(n in 1..NSubjective) ( py[g,i,b,s,t] + sy[g,i, n, t+u] <= 1 ))))))); int: perf_pct_ulimit = pct-1; int: perf_pct_tlimit = TMax-perf_pct_ulimit; % performanceChangetime constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( forall(t in 1..perf_pct_tlimit) ( forall(u in 1..perf_pct_ulimit) ( sum(b in 1..NTables) ( py[g,i,b,1,t] + py[g,i,b,2,t] + py[g,i,b,1,t+u] + py[g,i,b,2,t+u] ) <= 1 )))); % perfUseBothSides constraint forall(b in 1..NTables) ( forall(t in 1..TMax) ( sum(g in 1..NGroups) (sum(i in 1..group_counts[g]) (py[g,i,b,1,t])) = sum(g in 1..NGroups) (sum(i in 1..group_counts[g]) (py[g,i,b,2,t])) )); % teamJudging constraint forall(g in 1..NGroups) ( forall(i in 1..group_counts[g]) ( sum(t in 1..TMax) ( sum(n in 1..NSubjective) ( sz[g,i,n,t] + sum(b in 1..NTables) ( pz[g,i,b,1,t] + pz[g,i,b,2,t] ))) = NSubjective + NRounds )); % performanceStart int: perfStartWait = 60 div TInc; constraint sum(g in 1..NGroups) ( sum(i in 1..group_counts[g]) ( sum(b in 1..NTables) ( sum(t in 1..perfStartWait) ( pz[g,i,b,1,t] + pz[g,i,b,2,t] )))) = 0; % objective constraint sum(t in 1..TMax) ( sum(g in 1..NGroups) ( sum(i in 1..group_counts[g]) ( sum(n in 1..NSubjective) ( sy[g,i,n,t] * t ) + sum(b in 1..NTables) ( (py[g,i,b,1,t] + py[g,i,b,2,t]) * t ) ))) = obj; solve minimize obj; output [ if fix(sz[g,i,n,t]) == 1 then "sz[" ++ show(g) ++ "][" ++ show(i) ++ "][" ++ show(n) ++ "][" ++ show(t) ++ "] = " ++ show(sz[g, i, n, t]) ++ "\n" else "" endif | g in 1..NGroups, i in 1..group_counts[g], n in 1..NSubjective, t in 1..TMax ] ++ [ if fix(pz[g,i,b,s,t]) == 1 then "pz[" ++ show(g) ++ "][" ++ show(i) ++ "][" ++ show(b) ++ "][" ++ show(s) ++ "][" ++ show(t) ++ "] = " ++ show(pz[g, i, b, s, t]) ++ "\n" else "" endif | g in 1..NGroups, i in 1..group_counts[g], b in 1..NTables, s in 1..2, t in 1..TMax ] ++ ["\n"]; % Instance data TInc = 5; TMax_hours = 8; % subjective setup NSubjective = 1; subj_minutes = [20]; % performance setup NRounds = 1; NTables = 1; % judging groups NGroups = 1; group_counts = [2]; alpha_perf_minutes = 5; ct_minutes = 15; pct_minutes = 45; libminizinc-2.5.3/tests/spec/unit/regression/enigma_1568.mzn0000644000175000017500000000577613757304533022423 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution D: 6 E: 5 L: 3 O: 9 ODD: 966 P: 1 PUZZLE: 102235 U: 0 Z: 2 num1: 161 num2: 635 num3: 805 num4: 483 x: [9, 6, 1, 0, 2, 3, 5] ***/ % Regression test for a bug in mzn2fzn 1.2. The optimisation pass was leaving % dangling references to variables it had "eliminated". The symptom was the % following error from the FlatZinc interpreter: % % enigma_1568.fzn:28: % symbol error: `INT____3' undeclared % enigma_1568.fzn:30: % symbol error: `INT____3' undeclared % % (This model is from the original bug report.) % Enigma problem 1568 (Odd puzzle) in MiniZinc. % % From New Scientist % http://www.newscientist.com/article/mg20427311.100-enigma-number-1568.html % """ % 21 October 2009 by Albert Haddad % % Odd puzzle % % In this multiplication sum the digits have been replaced by letters and % dots. Different letters stand for different digits, the same letter % stands for the same digit, each dot can be any digit, and leading % digits cannot be zero. % % [ % . . . | num1 % * . . . | num2 % ------- % . . . | num3 % . . . | num4 % O D D | ODD % --------- % P U Z Z L E | PUZZLE % % ] % % What is the six-figure odd PUZZLE? % """ % % This MiniZinc model was created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc % include "globals.mzn"; int: n = 7; % number of unknown set of int: Digits = 0..9; var Digits: O; var Digits: D; var Digits: P; var Digits: U; var Digits: Z; var Digits: L; var Digits: E; array[1..n] of var Digits: x; var 100..999: num1; var 100..999: num2; var 100..999: num3; var 100..999: num4; var 100..999: ODD ; var 100000..999999: PUZZLE; predicate cp1d(array[int] of var int: x, array[int] of var int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; % solve satisfy; solve :: int_search( x ++ [num1,num2,num3,num4,ODD,PUZZLE], first_fail, indomain_min, complete) satisfy; constraint cp1d(x, [O,D,P,U,Z,L,E]) /\ all_different(x) /\ ODD = 100*O + 10*D + D /\ PUZZLE = 100000*P + 10000*U + 1000*Z + 100*Z + 10*L + E /\ num1 * num2 = num3 + num4*10 + ODD*100 /\ PUZZLE = num1 * num2 /\ PUZZLE mod 2 = 1 /\ % PUZZLE is odd % And then code the "long multiplication" num1 * (num2 mod 10) = num3 /\ num1 * ((num2 div 10) mod 10) = num4 /\ num1 * (num2 div 100) = ODD ; output [ "O = ", show(O), ";\n", "D = ", show(D), ";\n", "P = ", show(P), ";\n", "U = ", show(U), ";\n", "Z = ", show(Z), ";\n", "L = ", show(L), ";\n", "E = ", show(E), ";\n", "x = ", show(x), ";\n", "num1 = ", show(num1), ";\n", "num2 = ", show(num2), ";\n", "num3 = ", show(num3), ";\n", "num4 = ", show(num4), ";\n", "ODD = ", show(ODD), ";\n", "PUZZLE = ", show(PUZZLE), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug290_orig.mzn0000644000175000017500000000107013757304533022507 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution b: true ***/ % Regression test for bug #290: this model caused self-assignments to % be created for introduced variables. % Dummy variable, for output only. var bool: b :: add_to_output = true; set of int: R = 1..2; array[R,R] of int: a = array2d(R, R, set2array(1..card(R)*card(R))); array[R,R] of var 0..1: x; array[R] of var int: z = [ sum([a[s,t] * x[s,t] | t in R]) | s in R ]; constraint forall([ z[s] = sum([a[s,t] * x[s,t] | t in R]) | s in R ]); solve satisfy; output ["b = ", show(b), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/flatten_comp_in.mzn0000644000175000017500000000041213757304533023617 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result solution: !Solution x: [true] ***/ % Previously we would only eval_array_lit on the in part array[int] of var bool: x :: add_to_output = [y | y in let { array [1..1] of var bool: z; } in z]; constraint x[1]; libminizinc-2.5.3/tests/spec/unit/regression/test_output_string_var.mzn0000644000175000017500000000030413757304533025313 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: a ***/ % Used to fail on Windows when using MiniZinc directly string: s = "a"; solve satisfy; output [s];libminizinc-2.5.3/tests/spec/unit/regression/bug_r7995.mzn0000644000175000017500000000304413757304533022116 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution network__104: - - true - true - true - true - false - - false - false - true - false - true objective: 6 - !Result solution: !Solution network__104: - - false - false - true - false - true - - true - true - true - true - false objective: 6 ***/ % Regression test extracted from examples/zinc/sonet.zinc. % (as processed by zinc2mzn). % The change in r7995 broke this, it was fixed in r8005, r8014-5. array[1 .. 5] of 1 .. 5: Demand_1__107 = [ 1, 3, 3, 2, 4 ]; array[1 .. 5] of 1 .. 5: Demand_2__108 = [ 3, 5, 2, 4, 1 ]; array[1 .. 2, 1 .. 5] of var bool: network__104; constraint forall( [ sum([ bool2int(network__104[ring__0, node]) | node in 1 .. 5 ]) <= 4 | ring__0 in 1 .. 2 ]) /\ forall( [ let { var 1 .. 2: ring } in network__104[ring, Demand_1__107[e__110]] /\ network__104[ring, Demand_2__108[e__110]] | e__110 in 1 .. 5 ]); solve minimize sum( [ bool2int(network__104[i__118, i__119]) | i__118 in 1 .. 2, i__119 in 1 .. 5 ]); output [ "Network of size ", show( sum( [ bool2int(network__104[i__114, i__115]) | i__114 in 1 .. 2, i__115 in 1 .. 5 ])), ":\n", "{ " ] ++ [ ( if fix(network__104[i__116, i__117]) then ("(" ++ (((show(i__116) ++ ", ") ++ show(i__117)) ++ ")")) ++ " " else "" endif) | i__116 in 1 .. 2, i__117 in 1 .. 5 ] ++ [ "}" ] ++ [ "\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug82.mzn0000644000175000017500000000367113757304533021417 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution pos: - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - !Result solution: !Solution pos: - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [1, 1, 1] - [2, 1, 1] - [3, 1, 1] - [4, 1, 1] - [5, 1, 1] - [4, 1, 1] - [3, 1, 1] - [2, 1, 1] - [1, 1, 1] - !Result solution: !Solution pos: - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] - [6, 6, 6] ***/ % This caused mzn2fzn (r9627 and before) to abort. % NOTE: we cannot run this on LazyFD because it the redefinition of % array_var_bool_element below will conflict with the LazyFD backend's % redefinitions file. We run this only with the std fd variant since % we know that does not use any redefinitions. array[1..6,1..6] of bool: linked; array[1..13,1..3] of var 1..6: pos; constraint forall(t in 1..3, x in 2..13)(linked[pos[x,t],pos[x-1,t]]); solve satisfy; linked = [| true, true, false, false, false, false | true, true, true, false, false, false | false, true, true, true, false, true | false, false, true, true, true, false | false, false, false, true, true, false | false, false, true, false, false, true |]; % From g12/zinc/lib/minizinc/g12_lazyfd/redefinitions.mzn: % predicate array_var_bool_element(var int : idx, array[int] of var bool : arr, var bool : v) = let { int : N = length(arr), array[1..N] of var bool : tmp = [idx = I | I in 1..N] } in exists(I in 1..N)(tmp[I]) /\ forall(I in 1..N) (tmp[I] -> v = arr[I]); output ["pos = ", show(pos), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/where-forall-bug.mzn0000644000175000017500000000057513757304533023632 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution b: true ***/ % Regression test for a problem in mzn2fzn where failure of the % where clause was incorrectly being treated as equivalent to % model unsatisfiability. var bool: b :: add_to_output = true; constraint forall(c in 1..5 where forall([c mod 2 = 0])) ( c >= 0 ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/output_only_fn.mzn0000644000175000017500000000037113757304533023546 0ustar kaolkaol/*** !Test type: output-model solvers: [gecode] expected: !OutputModel output_only_fn.ozn ***/ % Previously the declaration for foo would not get copied to the output model function int: foo() = 10; int: x :: output_only = foo(); output [show(x)];libminizinc-2.5.3/tests/spec/unit/regression/bug335.mzn0000644000175000017500000000454013757304533021474 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution sokPosns: [14, 13, 8, 7, 8, 9, 4, 5, 10, 1, 1, 1] stime: 9 ***/ % Regression test for bug #335. % Previous versions of CPX found this model to be unsatisfiable. % A slightly later version found a solution but it was not optimal % (stime = 11, rather than the optimal stime = 9.) int: w; % width of board int: n; % board positions 1, ..., w, w+1, ...., 2w, ..., constraint assert(n mod w == 0, "board must be rectangular"); set of int: POS = 1..n; int: stps; % max steps in solution set of int: STEPS = 1..stps; int: nw; % number of walls set of int: WALLS = 1..nw; array[WALLS] of POS: walls; % wall positions int: nc; % number of crates + goals set of int: CRATES = 1..nc; set of POS: goals; % goal positions; array[CRATES] of POS: crates; % initial crate positions POS: pInit; % initial sokoban position set of int: MOVES = {-w,-1,1,w}; % possible moves include "alldifferent.mzn"; array[STEPS] of var POS: sokPosn; % sokoban position array[STEPS] of var MOVES: move; % sokoban position array[STEPS,CRATES] of var POS: cratePosns; var STEPS: stime :: add_to_output; % time of solution %% initial positions constraint sokPosn[1] = pInit; constraint forall(c in CRATES)(cratePosns[1,c] = crates[c]); %% no overlap of crates, walls and sokoban constraint forall(s in STEPS)( alldifferent(walls ++ [sokPosn[s]] ++ [cratePosns[s,c] | c in CRATES]) ); %% at the end all crates are in a position constraint forall(c in CRATES)( cratePosns[stime,c] in goals ); % legal move at each step constraint forall(s in 1..stps-1)( sokPosn[s+1] - sokPosn[s] = move[s] ); % crate pushing constraint forall(s in 1..stps-1, c in CRATES)( cratePosns[s+1,c] = cratePosns[s,c] + bool2int(sokPosn[s+1] == cratePosns[s,c]) * move[s] ); solve minimize stime; % output for test case comparison array[STEPS] of var POS: sokPosns :: add_to_output; constraint forall (s in 1..stime) (sokPosns[s] = sokPosn[s]); constraint forall (s in (stime+1)..stps) (sokPosns[s] = 1); % Just fill the rest with 1 for consistency w = 5; n = 15; stps = 12; nw = 0; walls = []; nc = 2; crates = [7,9]; goals = {6,15}; pInit = 14; libminizinc-2.5.3/tests/spec/unit/regression/non-set-array-ti-location.mzn0000644000175000017500000000031213757304533025374 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincTypeError regex: .*non-set-array-ti-location\.mzn.* ***/ % GitHub issue #408 - used to not give useful location info array[2] of bool: x = [false, true]; libminizinc-2.5.3/tests/spec/unit/regression/cardinality_atmost_partition.mzn0000644000175000017500000001000113757304533026434 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution nvar: 2 partitions: - !!set {1, 3} - !!set {4} - !!set {2, 6} variables: [2, 3, 7, 1, 6, 0] ***/ % Another regression test for the problem described in var_self_assign_bug.mzn. % (This model is from http://www.hakank.org/minizinc/cardinality_atmost_partition.mzn.) % From Global Constraint Catalogue % http://www.emn.fr/x-info/sdemasse/gccat/Ccardinality_atmost_partition.html % """ % ATMOST is the maximum number of time that values of a same partition of % PARTITIONS are taken by the variables of the collection VARIABLES. % % Example % ( % 2, <2, 3, 7, 1, 6, 0>, % < % p-<1, 3>, % p-<4>, % p-<2, 6> % > % ) % In this example, two variables of the collection % VARIABLES = <2, 3, 7, 1, 6, 0> % are assigned to values of the first partition, no variable is assigned to % a value of the second partition, and finally two variables are assigned to % values of the last partition. As a consequence, the % cardinality_atmost_partition constraint holds since its first argument % ATMOST is assigned to the maximum number of occurrences 2. % % """ % % Model created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc include "globals.mzn"; int: n = 6; int: m = 3; array[1..n] of var 0..10: variables; array[1..m] of var set of 1..7: partitions; var 0..9: nvar; output [ "nvar = ", show(nvar), ";\n", "partitions = ", show(partitions), ";\n", "variables = ", show(variables), ";\n" ]; solve satisfy; % a variant of the partition_set from globals.mzn where universe is % a var set of int (instead of par set of int) predicate partition_set2(array[int] of var set of int: S, var set of int: universe) = all_disjoint(S) /\ universe == array_union(i in index_set(S)) ( S[i] ) ; % % cardinality_atmost_exclude_value % % as cardinality_atmost but we exclude the "rest partition" index (m+1) % (as a set for generality) % (cf. cardinality_atmost.mzn) % predicate cardinality_atmost_exclude_value(var int: nvar, array[int] of var int: variables, array[int] of var int: values, var set of int: exclude) = forall(i in index_set(values)) ( sum(j in index_set(variables)) (bool2int(not(values[i] in exclude) /\ values[i] = variables[j])) <= nvar ) ; % % cardinality_atmost_partition % % ("Unassigned" values are put in the m+1'th partition, the "rest partition, % and we don't care how many that are assigned to the rest partition.) % predicate cardinality_atmost_partition(var int: nvar, array[int] of var int: variables, array[int] of var set of int: partitions) = let { int: lbv = min(index_set(variables)), int: ubv = max(index_set(variables)), int: lbp = min(index_set(partitions)), int: ubp = max(index_set(partitions)), array[lbv..ubv] of var lbp..ubp+1: selected_partition } in % the partitions must be partitioned partition_set2(partitions, array_union(i in lbp..ubp) (partitions[i])) /\ % assign a partition index to each value forall(i in lbv..ubv) ( forall(j in lbp..ubp) ( selected_partition[i] = j <-> variables[i] in partitions[j] ) ) /\ % assure that we have atmost nvar occurrences of each partition index % (except the "rest partition") cardinality_atmost_exclude_value(nvar, selected_partition, selected_partition, {m+1}) ; predicate cp1d(array[int] of int: x, array[int] of var int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; predicate cp1d(array[int] of set of int: x, array[int] of var set of int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; constraint cp1d([2, 3, 7, 1, 6, 0], variables) /\ cp1d([ {1,3}, {4}, {2,6}], partitions) /\ nvar = 2 /\ cardinality_atmost_partition(nvar, variables, partitions) ; libminizinc-2.5.3/tests/spec/unit/regression/test_bug_129.mzn0000644000175000017500000000031213757304533022664 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ array[int] of int: x = [3,4]; array[int] of int : y = [x | x in 1..2 where z[x]]; array[int] of bool : z = [x[i] == 1| i in 1..2]; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/bug256b.mzn0000644000175000017500000000040513757304533021634 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: - !!set {} - !!set {} - !!set {} ***/ % A regression test for bug #256. array[1..3] of var set of 1..3: x; x = array1d(1..3, [{}, {}, {}]); solve satisfy; output ["x = ", show(x), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/hundred_doors_unoptimized.mzn0000644000175000017500000010107213757304533025750 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution s: !!set {1, 4, 9, 16, 25, 36, 49, 64, 81, 100} x: - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] - [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] - [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0] - [1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] ***/ % Regression test for a bug in mzn2fzn 1.2. The optimisation pass was leaving % dangling references to variables it had "eliminated". The symptom was the % following error from the FlatZinc interpreter: % % hundred_doors_unoptimized.fzn:10524: % symbol error: `BOOL____12' undeclared % hundred_doors_unoptimized.fzn:10536: % symbol error: `BOOL____36' undeclared % hundred_doors_unoptimized.fzn:10537: % symbol error: `BOOL____34' undeclared % hundred_doors_unoptimized.fzn:10548: % [and a lot of similar errors] % % (This model is from the original bug report.) % 100 doors problem in MiniZinc. % % Problem from % http://rosettacode.org/wiki/100_doors % """ % Problem: You have 100 doors in a row that are all initially closed. % You make 100 passes by the doors. The first time through, you visit every % door and toggle the door (if the door is closed, you open it; if it is open, % you close it). The second time you only visit every 2nd door % (door #2, #4, #6, ...). The third time, every 3rd door % (door #3, #6, #9, ...), etc, until you only visit the 100th door. % % Question: What state are the doors in after the last pass? Which are open, % which are closed? % % Alternate: As noted in this page's discussion page, the only doors that % remain open are whose numbers are perfect squares of integers. Opening % only those doors is an optimization that may also be expressed. % """ % % This is the unoptimized version. % Also see: hundred_doors_optimized.mzn % hundred_doors_optimized_array.mzn % % This MiniZinc model was created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc % int: n = 100; set of int: r = 1..n; % use a 100 x 100 matrix... array[r, r] of var 0..1: x; % 0: closed, 1: open var set of r: s; % the result as set solve :: int_search([x[i,j] | i,j in r], first_fail, indomain, complete) satisfy; constraint % unoptimized version forall(j in r) ( x[1,j] = 1 ) /\ forall(pass in 2..n) ( forall(j in r) ( if j mod pass = 0 then ( x[pass-1,j] = 1 <-> x[pass,j] = 0 ) /\ ( x[pass-1,j] = 0 <-> x[pass,j] = 1 ) else x[pass,j] = x[pass-1, j] endif ) ) /\ forall(j in r) ( x[n, j] == 1 <-> j in s ) ; output [ show(( if fix(x[n, j]) == 1 then j else 0 endif )) | j in r ] ++ [ "\n" ++ show(s), "\n" ] ; libminizinc-2.5.3/tests/spec/unit/regression/flatten_comp_in2.mzn0000644000175000017500000000067613757304533023715 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution bs: [false, true, false, true] - !Result solution: !Solution bs: [true, false, true, false] ***/ function array[int] of var bool: func() = let { array[1..2] of var bool: x; } in x; array[1..2] of var bool: as; array[1..4] of var bool: bs ::add_to_output = [ a \/ x | a in as, x in func() ]; constraint bs[1] != bs[2]; constraint bs[2] != bs[3]; constraint bs[3] != bs[4]; libminizinc-2.5.3/tests/spec/unit/regression/xor_mixed_context.mzn0000644000175000017500000000040613757304533024223 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: [1, 0, 1] ***/ array[1..3] of var 0..1: x; % 0 = Knight, 1 = Knave constraint (x[1] = 1) xor (sum(x) = 1); constraint (x[2] = 1) xor (sum(x) = 2); constraint (x[3] = 1) xor (sum(x) = 3); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/test_bug359.mzn0000644000175000017500000000070313757304533022536 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution p1: 1 p2: 1 p3: 0 p4: 0 - !Solution p1: 1 p2: 1 p3: 0 p4: 1 - !Solution p1: 1 p2: 1 p3: 1 p4: 1 ***/ var 0..1: p1; var 0..1: p2; var 0..1: p3; var 0..1: p4; constraint (not ((p1==1 /\ p2==0) \/ (p3==1 /\ p4==0))); constraint p1 = 1; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/round.mzn0000644000175000017500000000041413757304533021607 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution y: 4 ***/ % Check that the MiniZinc round builtin operation. % (mzn2fzn 1.1.3 didn't implement it.) % par float: x = 3.6; var int: y :: add_to_output = round(x); solve satisfy; output ["y = ", show(y), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/array_set_element_nosets.mzn0000644000175000017500000000103613757304533025556 0ustar kaolkaol/*** !Test solvers: [chuffed, cbc] expected: - !Result solution: !Solution x: 1 y: [!!set {1}, !!set {2}, !!set {3}] z: !!set {1} - !Result solution: !Solution x: 3 y: [!!set {1}, !!set {2}, !!set {3}] z: !!set {3} ***/ % Tests for a bug in nosets.mzn for non-contiguous domains of x in array_set_element(x, y, z) include "nosets.mzn"; var {1, 3}: x :: add_to_output; array [1..3] of set of 1..3: y :: add_to_output = [{1}, {2}, {3}]; var set of 1..3: z :: add_to_output; constraint array_set_element(x, y, z);libminizinc-2.5.3/tests/spec/unit/regression/bug202.mzn0000644000175000017500000000135113757304533021462 0ustar kaolkaol/*** !Test expected: - !Error - !Result # TODO: Remove when bug is fixed status: SATISFIED ***/ % Regression test for bug #220. The assignment of the let-variable 'capacity' % below should result in an error message being produced during flattening % because there are different array indexes on the LHS and RHS. % mzn2fzn 1.3.1 and before do not detect this and instead produced an array % with an incorrect index set. int: K = 3; int: R = 3; constraint forall ( k in 1..K, j in 1..R) (let { array[0..K] of int: capacity = [100000] ++ [k | k in 1..K] } in trace( show(capacity) ++ " " ++ show(min(index_set(capacity))) ++"\n", true) ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/test_bug70.mzn0000644000175000017500000000037013757304533022444 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution killed: 1 eFailureModes: 1 ***/ var int: killed; constraint killed = bool2int(eFailureModes = 1); var int: eFailureModes; constraint eFailureModes = 1; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/set_inequality_par.mzn0000644000175000017500000000012313757304533024356 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ constraint {1, 2} < {1, 3}; libminizinc-2.5.3/tests/spec/unit/regression/bug347.mzn0000644000175000017500000000267113757304533021502 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution execution_unit_1000_3: 0 execution_unit_1000_4: 0 uav1: 0 uav2: 3 uav3: 2 uav4: 1 - !Result solution: !Solution execution_unit_1000_3: 1 execution_unit_1000_4: 1 uav1: 1 uav2: 0 uav3: 3 uav4: 2 - !Result solution: !Solution execution_unit_1000_3: 0 execution_unit_1000_4: 0 uav1: 0 uav2: 2 uav3: 3 uav4: 1 - !Result solution: !Solution execution_unit_1000_3: 3 execution_unit_1000_4: 3 uav1: 3 uav2: 1 uav3: 2 uav4: 0 - !Result solution: !Solution execution_unit_1000_3: 6 execution_unit_1000_4: 6 uav1: 6 uav2: 3 uav3: 4 uav4: 5 ***/ % Regression test for bug #347: mzn2fzn's FlatZinc optimiser was incorrectly % optimising away some of the equality constraints involving uav1 below. include "alldifferent.mzn"; var 0..6: uav1; var 0..6: uav2; var 0..6: uav3; var 0..6: uav4; var 0..6: execution_unit_1000_3; var 0..6: execution_unit_1000_4; constraint alldifferent([uav1, uav2, uav3, uav4]); constraint execution_unit_1000_3 = uav1; constraint execution_unit_1000_4 = uav1; solve satisfy; output [ "uav1 = ", show(uav1), ";\n", "uav2 = ", show(uav2), ";\n", "uav3 = ", show(uav3), ";\n", "uav4 = ", show(uav4), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug67.mzn0000644000175000017500000000110513757304533021410 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution x: -2147483646 y: -2147483646 z: -2147483646 - !Result solution: !Solution x: -500000000 y: -500000000 z: -500000000 ***/ % Regression test for bug #67. The version of mzn2fzn from 2009 % would abort because the wrong type-inst was inferred for the % anonymous variable below. This was (eventually) fixed in r13873. var int: x; var int: y; var int: z; constraint [x, y][_] = z; solve :: int_search([x, y, z], input_order, indomain_min, complete) satisfy; output [];libminizinc-2.5.3/tests/spec/unit/regression/nosets_369.mzn0000644000175000017500000000027213757304533022376 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ % Regression test for wrong index set in nosets.mzn (part of GitHub issue #369) include "nosets.mzn"; constraint set_lt({}, {0});libminizinc-2.5.3/tests/spec/unit/regression/parse_assignments.mzn0000644000175000017500000000043513757304533024210 0ustar kaolkaol/*** !Test solvers: [gecode] extra_files: [parse_assignments.mzc.mzn] expected: - !Result solution: !Solution _checker: > Ok ***/ % Used to cause an internal error due to copying lhs onto rhs when parsing solutions (making x = true cv in the checker) var bool: x; libminizinc-2.5.3/tests/spec/unit/regression/pred_param_r7550.mzn0000644000175000017500000001045213757304533023437 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution end: 53 objective: 53 s: [0, 0, 0, 4, 7, 7, 6, 8, 12, 8, 6, 4, 14, 19, 12, 12, 13, 18, 8, 11, 14, 18, 19, 4, 16, 10, 20, 9, 14, 6, 24, 26, 21, 16, 9, 21, 24, 28, 31, 22, 24, 11, 25, 16, 30, 26, 38, 25, 25, 30, 33, 36, 39, 34, 33, 47, 25, 44, 50, 38] ***/ % The following is a regression test for a flattening bug with predicate % parameter expansion. See the log message for r7550. % It is derived from g12/zinc/benchmarks/minizinc/rcpsp/rcpsp.mzn with 02.dzn %-----------------------------------------------------------------------------% include "globals.mzn"; %-----------------------------------------------------------------------------% % Model parameters. % % Resource parameters % int: n_res; % The number of resources array [ 1..n_res ] of int: rc; % The resource capacities % Task parameters % int: n_tasks; % The number of tasks array [ 1..n_tasks ] of int: d; % The task durations int: sum_d = sum( i in 1..n_tasks ) (d[i]); % The total duration array [ 1..n_res, 1..n_tasks ] of int: rr; % The resource requirements array [ 1..n_tasks ] of set of int: suc; % The task successors n_res = 4; rc = [ 18, 22, 20, 14 ]; n_tasks = 60; d = [ 4, 7, 9, 2, 6, 5, 2, 7, 4, 3, 4, 10, 4, 5, 8, 2, 7, 10, 8, 8, 8, 1, 5, 5, 7, 2, 1, 8, 10, 1, 1, 4, 10, 9, 3, 3, 7, 10, 6, 6, 9, 9, 1, 10, 2, 10, 6, 8, 9, 2, 6, 2, 8, 3, 4, 3, 9, 3, 3, 7 ]; rr = [| 1, 0, 0, 5, 0, 4, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 1, 3, 8, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 9, 0, 1, 6, 0 | 0, 0, 3, 0, 1, 0, 0, 3, 2, 0, 0, 3, 10, 0, 0, 8, 0, 0, 0, 0, 0, 3, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 9, 0, 0, 9, 4, 0, 0, 0, 0, 6, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9 | 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 2, 4, 0, 0, 9, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 7, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0 |]; suc = [ { 4, 12, 24 }, { 5, 6, 19 }, { 35 }, { 7, 11, 30 }, { 14, 17, 52 }, { 9, 15, 16 }, { 8, 10 }, { 34 }, { 44 }, { 20, 31, 42 }, { 26 }, { 13, 21, 29 }, { 18, 22 }, { 32, 49 }, { 40, 46, 55 }, { 46 }, { 27, 41 }, { 38 }, { 25, 60 }, { 23 }, { 31 }, { 48 }, { 38, 39, 54 }, { 28 }, { 37 }, { 58 }, { 33, 36, 51 }, { 49 }, { 43, 57 }, { 33, 47 }, { 45, 48 }, { 50 }, { 54 }, { 57 }, { 50 }, { 38, 57 }, { 39 }, { 47 }, { 47 }, { 53 }, { 51 }, { 56 }, { 51, 58 }, { 46 }, { 55 }, { 52 }, { 58 }, { 55 }, { 54 }, { 56 }, { 53 }, { 60 }, { 56 }, { 59 }, { 60 }, { 59 }, { 59 }, { }, { }, { } ]; %-----------------------------------------------------------------------------% % Model variables. % % s: start times % end: total end time (makespan) % array [ 1..n_tasks ] of var 0..sum_d: s; var 0..sum_d: end; %-----------------------------------------------------------------------------% % Constraints. % % successor constraints constraint forall ( i in 1..n_tasks, j in suc[i] ) ( s[i] + d[i] <= s[j] ); % cumulative resource constraints constraint forall ( i in 1..n_res ) ( cumulative( s, d, [ rr[i,j] | j in 1..n_tasks ], rc[i] ) ); % makespan constraints constraint forall ( i in 1..n_tasks ) ( s[i] + d[i] <= end ); %-----------------------------------------------------------------------------% % Objective. % solve :: int_search( s, smallest, indomain_min, complete ) minimize end; output [ "s = ", show( s ), ";\n", "end = ", show( end ), ";\n" ]; %-----------------------------------------------------------------------------% %%% EOF %%% libminizinc-2.5.3/tests/spec/unit/regression/arg-reif-int.mzn0000644000175000017500000000052513757304533022747 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 1 - !Solution a: 2 - !Solution a: 3 options: all_solutions: true ***/ var 1..3: a; predicate test_pred(1..10: x, var int: y) = y = 3; constraint test_pred(11, a) == false; solve satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug131.mzn0000644000175000017500000000160713757304533021467 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution b: false x: 1 y: 1 - !Solution b: false x: 2 y: 2 - !Solution b: false x: 3 y: 3 - !Solution b: true x: 2 y: 1 - !Solution b: true x: 3 y: 1 - !Solution b: true x: 1 y: 2 - !Solution b: true x: 3 y: 2 - !Solution b: true x: 1 y: 3 - !Solution b: true x: 2 y: 3 options: all_solutions: true ***/ % Regression test for bug #131. var 1..3: x; var 1..3: y; var bool: b; predicate foo(array[int] of var int: x); predicate foo_reif(array[int] of var int: x, var bool: r) = r <-> forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); constraint foo([x,y]) <-> b; solve satisfy; output [ "b = ", show(b), ";\n", "x = ", show(x), ";\n", "y = ", show(y), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/linear_bool_elem_bug.mzn0000644000175000017500000000153613757304533024612 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution firstin: 1 lastin: 1 - !Result solution: !Solution firstin: 1 lastin: 2 - !Result solution: !Solution firstin: 2 lastin: 2 - !Result solution: !Solution firstin: 1 lastin: 3 - !Result solution: !Solution firstin: 2 lastin: 3 - !Result solution: !Solution firstin: 3 lastin: 3 ***/ % Regression test for a problem with the "linear" MiniZinc redefinitions. % The signature of array_var_bool_element/3 in the redefintions was % incorrect leading to an internal error in mzn2fzn. int: n=3; array[1..n] of var 1..n: succ; array[1..n] of var bool: ins = [ succ[i] != i | i in 1..n]; var 1..n+1: firstin; constraint firstin == min([ n+1 + bool2int(ins[i])*(i-n-1) | i in 1..n]); var 1..n: lastin; constraint ins[lastin]; solve satisfy; output ["Ok\n"]; libminizinc-2.5.3/tests/spec/unit/regression/test_bug57.mzn0000644000175000017500000000044613757304533022455 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ set of int: X = {1,2}; function array[int] of int: foo(set of X: x) = if card(x)==0 then [] else let { int: y = min(x); array[int] of X: res = [1]++foo(x diff {y}) } in res endif; array[int] of X: x = foo(X); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/bug68b.mzn0000644000175000017500000000073013757304533021556 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution b: [1, 1, 1] - !Result solution: !Solution b: [1, 3, 3] ***/ % Regression test for the second problem in bug 68. % The type checker was assigning the type var bottom to the elements of % array1d(1..2, [_, _]) below and that was causing mzn2fzn to abort. int: N = 3; array[1..N] of var 1 .. N: b; constraint forall([ b[i] = [1, _, _][i] | i in index_set(b) ]); solve satisfy; output ["b = ", show(b), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/ti_error_location.mzn0000644000175000017500000000015513757304533024177 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Error regex: ^(?!unknown file:0.0).*$ ***/ string: x = 1; libminizinc-2.5.3/tests/spec/unit/regression/bug337_mod.mzn0000644000175000017500000000056013757304533022333 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [false, true] y: 0 - !Result solution: !Solution x: [false, false] y: 0 ***/ % Test for bug #337 but with mod rather than div. array[1..2] of var bool: x; var 0..0: y; constraint not(x[1 mod y]); solve satisfy; output [ "x = array1d(1..2, ", show(x), ";\n", "y = ", show(y), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/par_opt_equal.mzn0000644000175000017500000000036213757304533023315 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution a: true b: false c: true ***/ opt bool: x = <>; opt bool: y = <>; bool: a :: add_to_output = (x == y); bool: b :: add_to_output = (x != y); bool: c :: add_to_output = (x == <>);libminizinc-2.5.3/tests/spec/unit/regression/bug45.mzn0000644000175000017500000000034013757304533021404 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution i: 1 ***/ var 1..1: i; predicate losseq(array[int] of var int: a) = sum([1 | e in a where e >= 1]) = 1; constraint losseq([0,0,0,1]); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/bug222.mzn0000644000175000017500000000135113757304533021464 0ustar kaolkaol/*** !Test solvers: [cbc] expected: !Result solution: !Solution K: 11 ***/ % Regession test for Minizinc bug #222. This model caused % a series of problems with the FlatZinc MIP (Cbc) backend. % Cbc version 2.7.5 was the first version with which this worked. array [1..40] of var int: pl ; var 9..15: K; %= 11; array [1..40] of var 0..1: B1 ; array [1..40] of var 0..1: B2 ; int: BigM = 10000 ; constraint forall (F in 1..40)(F + 42*(1-B1[F]) >= K-6); constraint forall (F in 1..40)(F + 45*(1-B2[F]) >= K-3); constraint forall (F in 1..33) ( BigM*B1[F] + sum (M in F..F+7) (pl[M]) >= 1 ); constraint forall (F in 1..36) ( sum (M in F..F+4) (pl[M]) <= -1 + BigM*B2[F] ) ; solve maximize K ; output ["K = ", show(K), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/array_var_set_element_nosets.mzn0000644000175000017500000000073513757304533026433 0ustar kaolkaol/*** !Test solvers: [chuffed, cbc] expected: !Result solution: !Solution x: 1 y: [!Range 1..3, !!set {}, !!set {1}] z: !Range 1..3 ***/ % Tests for a bug in nosets.mzn for non-contiguous domains of x in array_var_set_element(x, y, z) include "nosets.mzn"; var {1, 3}: x :: add_to_output; array [1..3] of var set of 1..3: y :: add_to_output = [_, {}, {1}]; var set of 1..3: z :: add_to_output; constraint card(z) = 3; constraint array_var_set_element(x, y, z);libminizinc-2.5.3/tests/spec/unit/regression/flat_cv_call.mzn0000644000175000017500000000052013757304533023067 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 4 a: [0,0,2,2] rem: 2 ***/ function int: forceN(array[int] of var int: x, int: n) = let { constraint forall(i in 1..n) ( x[i] = 0 ); } in length(x) - n; array[1..4] of var 0..2: a; var int: rem; constraint rem = forceN(a, 2); solve maximize sum(a); libminizinc-2.5.3/tests/spec/unit/regression/bug69_3.mzn0000644000175000017500000000045013757304533021636 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution y: !Range 1..3 - !Result solution: !Solution y: !!set {2} ***/ % A regression test for G12 bug #69. % var set of 1..10: y; predicate p(var set of 1..3: x) = (2 in x); constraint p(y); solve satisfy; output ["y = ", show(y), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/arg-reif-array-int.mzn0000644000175000017500000000055613757304533024067 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 1 - !Solution a: 2 - !Solution a: 3 options: all_solutions: true ***/ var 1..3: a; predicate test_pred(array[int] of 1..10: x, var int: y) = y = 3; constraint test_pred([1, 2, 4, 11], a) == false; solve satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/absent_id_crash.mzn0000644000175000017500000000045113757304533023571 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution z: [null, null] ***/ % Crashes due to assuming ids have a decl, when <> does not. array [1..2] of var 0..1: x = [0, 0]; array [1..1] of var 1..1: y; array [1..2] of var opt 1..1: z :: add_to_output = [y[x[i]] | i in 1..2 where x[i] != 0]; libminizinc-2.5.3/tests/spec/unit/regression/float_mod_crash.mzn0000644000175000017500000000026213757304533023605 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincTypeError ***/ % Regression test for wrong definition of float mod in stdlib causing crash float: x :: add_to_output = 2.0 mod 1.0; libminizinc-2.5.3/tests/spec/unit/regression/test_multioutput.mzn0000644000175000017500000000024613757304533024135 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution _output_item: | one two ***/ output ["one\n"]; output ["two"]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/arg-reif-int-set.mzn0000644000175000017500000000056213757304533023541 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 1 - !Solution a: 2 - !Solution a: 3 options: all_solutions: true ***/% RUNS OM minizinc_fd var 1..3: a; predicate test_pred(set of 2..4: x, var int: y) = y = 3; constraint test_pred({11}, a) == false; solve satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug290_simple.mzn0000644000175000017500000000105613757304533023044 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution b: true ***/ % Simplified regression test for bug #290: this model caused a self-assignment % to be created for one of the introduced variables. % Dummy variable, for output only. var bool: b :: add_to_output = true; array[1..2,1..2] of int: a = array2d(1..2, 1..2, [1, 2, 3, 4]); array[1..2,1..2] of var 0..1: x; array[1..2] of var int: z = [ sum([a[s,t] * x[s,t] | t in 1..2]) | s in 1..2 ]; constraint z[1] = sum([a[1,t] * x[1,t] | t in 1..2]); solve satisfy; output ["b = ", show(b), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug287.mzn0000644000175000017500000000052413757304533021500 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution q: [1, 2] ***/ % Regression test for bug #287: the first solution violated the alldifferent % constraint. include "alldifferent.mzn"; int: n = 2; array [1..n] of var 1..n: q; constraint alldifferent(q) :: domain; constraint q[1] != q[2] + 1; solve satisfy; output [show(q)]; libminizinc-2.5.3/tests/spec/unit/regression/nested_clause.mzn0000644000175000017500000000030313757304533023273 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 2 y: [false, false] ***/ var 2..2: x; array[1..2] of var bool: y; constraint (1 <= x) -> (not y[1] \/ not y[2]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/error_in_comprehension.mzn0000644000175000017500000000027013757304533025230 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincError ***/ array [int] of set of int: neighbours = [ { true | C in {[0][8]} } | R0 in 1..10, C0 in 1..15 ]; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/parser_location.mzn0000644000175000017500000000022313757304533023642 0ustar kaolkaol/*** --- !Test solvers: [gecode] expected: !Error regex: .*parser_location\.mzn:8.* ***/ set of 1..1: x = 1; % Trigger an error at this var decl libminizinc-2.5.3/tests/spec/unit/regression/bug71_2.mzn0000644000175000017500000000023313757304533021625 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 1 ***/ var int: x; constraint (x = min (i in 3..2) ([1, 2, 3][i]) \/ x = 1); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/empty-array1d.mzn0000644000175000017500000000037213757304533023162 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [] ***/ % mzn2fzn and soln2out aborted when evaluating this model in % r14647 and before. array[1..0] of var bool: x; x = array1d(1..0, []); solve satisfy; output ["x = ", show(x), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug318_orig.mzn0000644000175000017500000000123013757304533022506 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution objective: -2147483646 var1: 1 var2: -2147483646 var3: -2147483646 - !Result solution: !Solution objective: -500000000 var1: 1 var2: -500000000 var3: -500000000 ***/ % Regression test for bug #318: this model as causing mzn2fzn to abort because % the second argument of the element constraint below wasn't flat by the % optimisation pass (or the output pass if optimisation was disabled). include "globals.mzn"; var int: var1; var int: var2; var int: var3; constraint element(var1,[var2, (var2+1) ],var3); solve minimize var3; output ["Ok\n"]; libminizinc-2.5.3/tests/spec/unit/regression/seq_search_bug.mzn0000644000175000017500000000323513757304533023436 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution evedays: - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] flatroster: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] morndays: - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] restdays: - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] - [1, 1, 1, 1, 1] roster: - [1, 1, 1, 1, 1, 1, 1] - [1, 1, 1, 1, 1, 1, 1] - [1, 1, 1, 1, 1, 1, 1] - [1, 1, 1, 1, 1, 1, 1] - [1, 1, 1, 1, 1, 1, 1] ***/ % Prior to r8850 mzn2fzn would abort when attempting to flatten the % seq_search annotation here. include "globals.mzn" ; int: weeks = 5; int: flatsize = 7 * weeks ; array [1..weeks,1..7] of var 1..5: roster; array [1..flatsize] of var 1..5: flatroster ; array [1..7,1..weeks] of var 1..weeks: restdays ; array [1..7,1..weeks] of var 1..flatsize: morndays ; array [1..7,1..weeks] of var 1..flatsize: evedays ; solve :: seq_search([ int_search([restdays[d,w]|d in 1..7,w in 1..weeks], input_order, indomain_min, complete), int_search([morndays[d,w]|d in 1..7,w in 1..weeks], input_order, indomain_min, complete), int_search([evedays[d,w]|d in 1..7,w in 1..weeks], input_order, indomain_min, complete), int_search(flatroster, first_fail, indomain_min, complete)]) satisfy; output ["roster = ", show(roster), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/test_bug218_inc.mzn0000644000175000017500000000014713757304533023363 0ustar kaolkaol/*** # Used as an inclusion to test_bug218.mzn ***/ var 1..ub(sum(y)): b; array[1..3] of var 1..3: x; libminizinc-2.5.3/tests/spec/unit/regression/test_not_in.mzn0000644000175000017500000000032713757304533023010 0ustar kaolkaol/*** !Test expected: - !Result status: SATISFIED solution: !Solution bla: 2 - !Result status: SATISFIED solution: !Solution bla: 4 ***/ var {2,4}: bla; constraint not (bla in {1,3}); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/bug312.mzn0000644000175000017500000000107013757304533021462 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 1 var1: 1 var2: 2 var3: 1 var4: 1 ***/ % Regression test for bug #312. % The element constraint below was being incorrectly flattened to the FlatZinc % array_int_element constraint, rather than array_var_int_element - the former % is a type error. include "globals.mzn"; var int: var1; var int: var2; var int: var3; var int: var4; constraint (var1 = 1); constraint (var2 = 2); constraint element(var4,[var1, var2],var3); solve minimize var3; output ["var1:", show(var1),"\n"]; libminizinc-2.5.3/tests/spec/unit/regression/follow_id_absent_crash.mzn0000644000175000017500000000042613757304533025155 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution y: null ***/ % Following the id chain y -> x -> <> should stop at the declaration before <> % Previously it would return <> and cause crashes during flattening var opt bool: y :: add_to_output = x; var opt bool: x = <>; libminizinc-2.5.3/tests/spec/unit/regression/test_bool2int.mzn0000644000175000017500000000042513757304533023251 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution b: true x: 1 ***/ % Regression test for a crash in the optimiser that didn't expect % bool2int as a predicate var bool: b; var 0..1: x; constraint bool2int(b,x); constraint x = 1; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/bug_08.mzn0000644000175000017500000000025613757304533021550 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: -2 x: 2 ***/ % Regression test for github bug #8 var 1..2: x; var int : nx = -x; solve minimize nx; libminizinc-2.5.3/tests/spec/unit/regression/string-test-arg.mzn0000644000175000017500000000054613757304533023520 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: 4 ***/ % mzn2fzn r14673 and before aborted on this model due to the test predicate % having a string argument. bool: b = true; string: s = "bar"; test foo(string: i) = i = "foo" /\ b; var int: x :: add_to_output = if foo(s) then 3 else 4 endif; solve satisfy; output ["x = ", show(x), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug258.dzn0000644000175000017500000000040013757304533021456 0ustar kaolkaolTInc = 5; TMax_hours = 8; % subjective setup NSubjective = 3; subj_minutes = [20, 20, 20]; % performance setup NRounds = 3; NTables = 2; % judging groups NGroups = 2; group_counts = [16, 16]; alpha_perf_minutes = 5; ct_minutes = 15; pct_minutes = 45; libminizinc-2.5.3/tests/spec/unit/regression/test_bug67.mzn0000644000175000017500000000022413757304533022450 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincError ***/ predicate foo(var int: x); var int: x; var bool: b; constraint b <-> foo(x); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/test_bug71.mzn0000644000175000017500000000016513757304533022447 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ constraint 0xff = 255; constraint 0o377 = 255; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/test_bug55.mzn0000644000175000017500000000035113757304533022446 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: 1 ***/ set of int: X = -1..1; set of int: Y = 0..3; var Y: y; function var X: f( var Y: y ) = y+1; var int: x :: add_to_output = f(y); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/opt_noncontiguous_domain.mzn0000644000175000017500000000046213757304533025606 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: 1 - !Solution x: 3 - !Solution x: null ***/ % Regression test for issue where the incorrect solution x = 2 would be produced var opt {1, 3}: x; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/test_bug53.mzn0000644000175000017500000000034013757304533022442 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ annotation simpleann; annotation composeann(ann: s) = seq_search([s,s]); function ann: annfunc(ann: s) = composeann(s); solve :: annfunc(composeann(simpleann)) satisfy; libminizinc-2.5.3/tests/spec/unit/regression/flat_set_lit.mzn0000644000175000017500000000051113757304533023127 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result solution: - !Solution x: !set {2} ***/ % Regression test for GitHub bug #392 % Previously {a} would not be correctly evaluated during flattening var set of 1..3: foo(var 1..3: a) = {a}; var set of 1..3: x :: add_to_output = foo(2); libminizinc-2.5.3/tests/spec/unit/regression/bug85.mzn0000644000175000017500000000115213757304533021412 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution mark: - 0 - 1 - 3 objective: 3 ***/ % A regression test for G12 bug #85. % include "all_different.mzn"; int: m = 3; int: n = m*m; array [1..m] of var 0..n: mark :: add_to_output = [0, 1, 3]; array[1..(m*(m-1)) div 2] of var 0..n: differences = [ mark[j] - mark[i] | i in 1..m, j in i+1..m]; constraint mark[1] = 0; constraint forall ( i in 1..m-2 ) ( mark[i] < mark[i+1] ); constraint all_different(differences); constraint mark[2] - mark[1] < mark[m] - mark[m-1]; solve minimize mark[m]; output ["% golomb ", show(mark), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug337.mzn0000644000175000017500000000076213757304533021500 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: [false, false] y: 0 ***/ % Regression test for bug #337: mzn2fzn was incorrectly setting the initial % domains of variables introduced in the reification of the division operation % to be empty. This was causing the model to incorrectly reported as % unsatisfiable. array[1..2] of var bool: x; var 0..0: y; constraint not(x[1 div y]); solve satisfy; output [ "x = array1d(1..2, ", show(x), ";\n", "y = ", show(y), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/coerce_set_to_array_1.mzn0000644000175000017500000000037713757304533024723 0ustar kaolkaol/*** !Test expected: !Result solution: !Solution x: 1.0 ***/ % Used to give an error due to wrong coercion result when array2set is combined with int2float function float: foo(array [int] of float: x) = x[1]; float: x :: add_to_output = foo({1}); libminizinc-2.5.3/tests/spec/unit/regression/var_opt_unconstrained.mzn0000644000175000017500000000034013757304533025064 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: !SolutionSet - !Solution x: null - !Solution x: 1 ***/ var opt 1..1: x; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/card_flatten_lb.mzn0000644000175000017500000000054113757304533023564 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 0 x: !!set {} y: 0 ***/ % Prior to r9313, mzn2fzn would "improve" the bounds on y incorrectly. % In particular the lower bound would be set to 1 rather than 0. % var set of 1..15: x; var -100..100: y; constraint y = card(x); solve minimize y; output ["y = ", show(y), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/arg-reif-float.mzn0000644000175000017500000000053313757304533023261 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 1 - !Solution a: 2 - !Solution a: 3 options: all_solutions: true ***/ var 1..3: a; predicate test_pred(1.0..10.0: x, var int: y) = y = 3; constraint test_pred(11.0, a) == false; solve satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug284.mzn0000644000175000017500001205157413757304533021513 0ustar kaolkaol/*** !Test solvers: [gecode] expected: - !Result solution: !Solution ignore_me: true - !Result solution: !Solution A: 1 B: 1 ***/ % Regression test for bug #284: this model caused a stack overflow in the % in parser and another in the flattening engine. include "table.mzn"; % ignore_me is here just so we have something to print. var bool : ignore_me :: add_to_output = true; var int : A; var int : B; output ["ignore_me = ", show(ignore_me), "\n"]; solve satisfy; constraint table([A,B], [| 1,1, | 1,2, | 1,3, | 1,4, | 1,5, | 1,6, | 1,7, | 1,8, | 1,9, | 1,10, | 1,11, | 1,12, | 1,13, | 1,14, | 1,15, | 1,16, | 1,17, | 1,18, | 1,19, | 1,20, | 1,21, | 1,22, | 1,23, | 1,24, | 1,25, | 1,26, | 1,27, | 1,28, | 1,29, | 1,30, | 1,31, | 1,32, | 1,33, | 1,34, | 1,35, | 1,36, | 1,37, | 1,38, | 1,39, | 1,40, | 1,41, | 1,42, | 1,43, | 1,44, | 1,45, | 1,46, | 1,47, | 1,48, | 1,49, | 1,50, | 1,51, | 1,52, | 1,53, | 1,54, | 1,55, | 1,56, | 1,57, | 1,58, | 1,59, | 1,60, | 1,61, | 1,62, | 1,63, | 1,64, | 1,65, | 1,66, | 1,67, | 1,68, | 1,69, | 1,70, | 1,71, | 1,72, | 1,73, | 1,74, | 1,75, | 1,76, | 1,77, | 1,78, | 1,79, | 1,80, | 1,81, | 1,82, | 1,83, | 1,84, | 1,85, | 2,35, | 3,35, | 4,35, | 5,35, | 6,35, | 7,36, | 8,36, | 9,44, | 10,37, | 11,41, | 12,41, | 13,41, | 14,41, | 15,41, | 16,33, | 17,33, | 18,33, | 19,33, | 20,33, | 21,33, | 22,33, | 23,33, | 24,33, | 25,33, | 26,33, | 27,33, | 28,33, | 29,32, | 30,32, | 31,32, | 32,43, | 33,31, | 34,31, | 35,34, | 36,38, | 37,34, | 38,38, | 39,38, | 40,34, | 40,38, | 41,32, | 42,38, | 43,32, | 44,38, | 45,32, | 46,38, | 47,34, | 47,38, | 48,46, | 48,47, | 48,48, | 49,46, | 49,47, | 49,48, | 50,46, | 50,47, | 50,48, | 51,49, | 52,43, | 53,34, | 54,43, | 55,38, | 56,32, | 57,33, | 58,33, | 59,33, | 59,42, | 60,41, | 61,41, | 62,33, | 62,42, | 63,33, | 64,1, | 64,2, | 64,3, | 64,4, | 64,5, | 64,6, | 64,7, | 64,8, | 64,9, | 64,10, | 64,11, | 64,12, | 64,13, | 64,14, | 64,15, | 64,16, | 64,17, | 64,18, | 64,19, | 64,20, | 64,21, | 64,22, | 64,23, | 64,24, | 64,25, | 64,26, | 64,27, | 64,28, | 64,29, | 64,30, | 64,31, | 64,32, | 64,33, | 64,34, | 64,35, | 64,36, | 64,37, | 64,38, | 64,39, | 64,40, | 64,41, | 64,42, | 64,43, | 64,44, | 64,45, | 64,46, | 64,47, | 64,48, | 64,49, | 64,50, | 64,51, | 64,52, | 64,53, | 64,54, | 64,55, | 64,56, | 64,57, | 64,58, | 64,59, | 64,60, | 64,61, | 64,62, | 64,63, | 64,64, | 64,65, | 64,66, | 64,67, | 64,68, | 64,69, | 64,70, | 64,71, | 64,72, | 64,73, | 64,74, | 64,75, | 64,76, | 64,77, | 64,78, | 64,79, | 64,80, | 64,81, | 64,82, | 64,83, | 64,84, | 64,85, | 65,1, | 65,2, | 65,3, | 65,4, | 65,5, | 65,6, | 65,7, | 65,8, | 65,9, | 65,10, | 65,11, | 65,12, | 65,13, | 65,14, | 65,15, | 65,16, | 65,17, | 65,18, | 65,19, | 65,20, | 65,21, | 65,22, | 65,23, | 65,24, | 65,25, | 65,26, | 65,27, | 65,28, | 65,29, | 65,30, | 65,31, | 65,32, | 65,33, | 65,34, | 65,35, | 65,36, | 65,37, | 65,38, | 65,39, | 65,40, | 65,41, | 65,42, | 65,43, | 65,44, | 65,45, | 65,46, | 65,47, | 65,48, | 65,49, | 65,50, | 65,51, | 65,52, | 65,53, | 65,54, | 65,55, | 65,56, | 65,57, | 65,58, | 65,59, | 65,60, | 65,61, | 65,62, | 65,63, | 65,64, | 65,65, | 65,66, | 65,67, | 65,68, | 65,69, | 65,70, | 65,71, | 65,72, | 65,73, | 65,74, | 65,75, | 65,76, | 65,77, | 65,78, | 65,79, | 65,80, | 65,81, | 65,82, | 65,83, | 65,84, | 65,85, | 66,1, | 66,2, | 66,3, | 66,4, | 66,5, | 66,6, | 66,7, | 66,8, | 66,9, | 66,10, | 66,11, | 66,12, | 66,13, | 66,14, | 66,15, | 66,16, | 66,17, | 66,18, | 66,19, | 66,20, | 66,21, | 66,22, | 66,23, | 66,24, | 66,25, | 66,26, | 66,27, | 66,28, | 66,29, | 66,30, | 66,31, | 66,32, | 66,33, | 66,34, | 66,35, | 66,36, | 66,37, | 66,38, | 66,39, | 66,40, | 66,41, | 66,42, | 66,43, | 66,44, | 66,45, | 66,46, | 66,47, | 66,48, | 66,49, | 66,50, | 66,51, | 66,52, | 66,53, | 66,54, | 66,55, | 66,56, | 66,57, | 66,58, | 66,59, | 66,60, | 66,61, | 66,62, | 66,63, | 66,64, | 66,65, | 66,66, | 66,67, | 66,68, | 66,69, | 66,70, | 66,71, | 66,72, | 66,73, | 66,74, | 66,75, | 66,76, | 66,77, | 66,78, | 66,79, | 66,80, | 66,81, | 66,82, | 66,83, | 66,84, | 66,85, | 67,1, | 67,2, | 67,3, | 67,4, | 67,5, | 67,6, | 67,7, | 67,8, | 67,9, | 67,10, | 67,11, | 67,12, | 67,13, | 67,14, | 67,15, | 67,16, | 67,17, | 67,18, | 67,19, | 67,20, | 67,21, | 67,22, | 67,23, | 67,24, | 67,25, | 67,26, | 67,27, | 67,28, | 67,29, | 67,30, | 67,31, | 67,32, | 67,33, | 67,34, | 67,35, | 67,36, | 67,37, | 67,38, | 67,39, | 67,40, | 67,41, | 67,42, | 67,43, | 67,44, | 67,45, | 67,46, | 67,47, | 67,48, | 67,49, | 67,50, | 67,51, | 67,52, | 67,53, | 67,54, | 67,55, | 67,56, | 67,57, | 67,58, | 67,59, | 67,60, | 67,61, | 67,62, | 67,63, | 67,64, | 67,65, | 67,66, | 67,67, | 67,68, | 67,69, | 67,70, | 67,71, | 67,72, | 67,73, | 67,74, | 67,75, | 67,76, | 67,77, | 67,78, | 67,79, | 67,80, | 67,81, | 67,82, | 67,83, | 67,84, | 67,85, | 68,1, | 68,2, | 68,3, | 68,4, | 68,5, | 68,6, | 68,7, | 68,8, | 68,9, | 68,10, | 68,11, | 68,12, | 68,13, | 68,14, | 68,15, | 68,16, | 68,17, | 68,18, | 68,19, | 68,20, | 68,21, | 68,22, | 68,23, | 68,24, | 68,25, | 68,26, | 68,27, | 68,28, | 68,29, | 68,30, | 68,31, | 68,32, | 68,33, | 68,34, | 68,35, | 68,36, | 68,37, | 68,38, | 68,39, | 68,40, | 68,41, | 68,42, | 68,43, | 68,44, | 68,45, | 68,46, | 68,47, | 68,48, | 68,49, | 68,50, | 68,51, | 68,52, | 68,53, | 68,54, | 68,55, | 68,56, | 68,57, | 68,58, | 68,59, | 68,60, | 68,61, | 68,62, | 68,63, | 68,64, | 68,65, | 68,66, | 68,67, | 68,68, | 68,69, | 68,70, | 68,71, | 68,72, | 68,73, | 68,74, | 68,75, | 68,76, | 68,77, | 68,78, | 68,79, | 68,80, | 68,81, | 68,82, | 68,83, | 68,84, | 68,85, | 69,1, | 69,2, | 69,3, | 69,4, | 69,5, | 69,6, | 69,7, | 69,8, | 69,9, | 69,10, | 69,11, | 69,12, | 69,13, | 69,14, | 69,15, | 69,16, | 69,17, | 69,18, | 69,19, | 69,20, | 69,21, | 69,22, | 69,23, | 69,24, | 69,25, | 69,26, | 69,27, | 69,28, | 69,29, | 69,30, | 69,31, | 69,32, | 69,33, | 69,34, | 69,35, | 69,36, | 69,37, | 69,38, | 69,39, | 69,40, | 69,41, | 69,42, | 69,43, | 69,44, | 69,45, | 69,46, | 69,47, | 69,48, | 69,49, | 69,50, | 69,51, | 69,52, | 69,53, | 69,54, | 69,55, | 69,56, | 69,57, | 69,58, | 69,59, | 69,60, | 69,61, | 69,62, | 69,63, | 69,64, | 69,65, | 69,66, | 69,67, | 69,68, | 69,69, | 69,70, | 69,71, | 69,72, | 69,73, | 69,74, | 69,75, | 69,76, | 69,77, | 69,78, | 69,79, | 69,80, | 69,81, | 69,82, | 69,83, | 69,84, | 69,85, | 70,1, | 70,2, | 70,3, | 70,4, | 70,5, | 70,6, | 70,7, | 70,8, | 70,9, | 70,10, | 70,11, | 70,12, | 70,13, | 70,14, | 70,15, | 70,16, | 70,17, | 70,18, | 70,19, | 70,20, | 70,21, | 70,22, | 70,23, | 70,24, | 70,25, | 70,26, | 70,27, | 70,28, | 70,29, | 70,30, | 70,31, | 70,32, | 70,33, | 70,34, | 70,35, | 70,36, | 70,37, | 70,38, | 70,39, | 70,40, | 70,41, | 70,42, | 70,43, | 70,44, | 70,45, | 70,46, | 70,47, | 70,48, | 70,49, | 70,50, | 70,51, | 70,52, | 70,53, | 70,54, | 70,55, | 70,56, | 70,57, | 70,58, | 70,59, | 70,60, | 70,61, | 70,62, | 70,63, | 70,64, | 70,65, | 70,66, | 70,67, | 70,68, | 70,69, | 70,70, | 70,71, | 70,72, | 70,73, | 70,74, | 70,75, | 70,76, | 70,77, | 70,78, | 70,79, | 70,80, | 70,81, | 70,82, | 70,83, | 70,84, | 70,85, | 71,1, | 71,2, | 71,3, | 71,4, | 71,5, | 71,6, | 71,7, | 71,8, | 71,9, | 71,10, | 71,11, | 71,12, | 71,13, | 71,14, | 71,15, | 71,16, | 71,17, | 71,18, | 71,19, | 71,20, | 71,21, | 71,22, | 71,23, | 71,24, | 71,25, | 71,26, | 71,27, | 71,28, | 71,29, | 71,30, | 71,31, | 71,32, | 71,33, | 71,34, | 71,35, | 71,36, | 71,37, | 71,38, | 71,39, | 71,40, | 71,41, | 71,42, | 71,43, | 71,44, | 71,45, | 71,46, | 71,47, | 71,48, | 71,49, | 71,50, | 71,51, | 71,52, | 71,53, | 71,54, | 71,55, | 71,56, | 71,57, | 71,58, | 71,59, | 71,60, | 71,61, | 71,62, | 71,63, | 71,64, | 71,65, | 71,66, | 71,67, | 71,68, | 71,69, | 71,70, | 71,71, | 71,72, | 71,73, | 71,74, | 71,75, | 71,76, | 71,77, | 71,78, | 71,79, | 71,80, | 71,81, | 71,82, | 71,83, | 71,84, | 71,85, | 72,1, | 72,2, | 72,3, | 72,4, | 72,5, | 72,6, | 72,7, | 72,8, | 72,9, | 72,10, | 72,11, | 72,12, | 72,13, | 72,14, | 72,15, | 72,16, | 72,17, | 72,18, | 72,19, | 72,20, | 72,21, | 72,22, | 72,23, | 72,24, | 72,25, | 72,26, | 72,27, | 72,28, | 72,29, | 72,30, | 72,31, | 72,32, | 72,33, | 72,34, | 72,35, | 72,36, | 72,37, | 72,38, | 72,39, | 72,40, | 72,41, | 72,42, | 72,43, | 72,44, | 72,45, | 72,46, | 72,47, | 72,48, | 72,49, | 72,50, | 72,51, | 72,52, | 72,53, | 72,54, | 72,55, | 72,56, | 72,57, | 72,58, | 72,59, | 72,60, | 72,61, | 72,62, | 72,63, | 72,64, | 72,65, | 72,66, | 72,67, | 72,68, | 72,69, | 72,70, | 72,71, | 72,72, | 72,73, | 72,74, | 72,75, | 72,76, | 72,77, | 72,78, | 72,79, | 72,80, | 72,81, | 72,82, | 72,83, | 72,84, | 72,85, | 73,1, | 73,2, | 73,3, | 73,4, | 73,5, | 73,6, | 73,7, | 73,8, | 73,9, | 73,10, | 73,11, | 73,12, | 73,13, | 73,14, | 73,15, | 73,16, | 73,17, | 73,18, | 73,19, | 73,20, | 73,21, | 73,22, | 73,23, | 73,24, | 73,25, | 73,26, | 73,27, | 73,28, | 73,29, | 73,30, | 73,31, | 73,32, | 73,33, | 73,34, | 73,35, | 73,36, | 73,37, | 73,38, | 73,39, | 73,40, | 73,41, | 73,42, | 73,43, | 73,44, | 73,45, | 73,46, | 73,47, | 73,48, | 73,49, | 73,50, | 73,51, | 73,52, | 73,53, | 73,54, | 73,55, | 73,56, | 73,57, | 73,58, | 73,59, | 73,60, | 73,61, | 73,62, | 73,63, | 73,64, | 73,65, | 73,66, | 73,67, | 73,68, | 73,69, | 73,70, | 73,71, | 73,72, | 73,73, | 73,74, | 73,75, | 73,76, | 73,77, | 73,78, | 73,79, | 73,80, | 73,81, | 73,82, | 73,83, | 73,84, | 73,85, | 74,1, | 74,2, | 74,3, | 74,4, | 74,5, | 74,6, | 74,7, | 74,8, | 74,9, | 74,10, | 74,11, | 74,12, | 74,13, | 74,14, | 74,15, | 74,16, | 74,17, | 74,18, | 74,19, | 74,20, | 74,21, | 74,22, | 74,23, | 74,24, | 74,25, | 74,26, | 74,27, | 74,28, | 74,29, | 74,30, | 74,31, | 74,32, | 74,33, | 74,34, | 74,35, | 74,36, | 74,37, | 74,38, | 74,39, | 74,40, | 74,41, | 74,42, | 74,43, | 74,44, | 74,45, | 74,46, | 74,47, | 74,48, | 74,49, | 74,50, | 74,51, | 74,52, | 74,53, | 74,54, | 74,55, | 74,56, | 74,57, | 74,58, | 74,59, | 74,60, | 74,61, | 74,62, | 74,63, | 74,64, | 74,65, | 74,66, | 74,67, | 74,68, | 74,69, | 74,70, | 74,71, | 74,72, | 74,73, | 74,74, | 74,75, | 74,76, | 74,77, | 74,78, | 74,79, | 74,80, | 74,81, | 74,82, | 74,83, | 74,84, | 74,85, | 75,1, | 75,2, | 75,3, | 75,4, | 75,5, | 75,6, | 75,7, | 75,8, | 75,9, | 75,10, | 75,11, | 75,12, | 75,13, | 75,14, | 75,15, | 75,16, | 75,17, | 75,18, | 75,19, | 75,20, | 75,21, | 75,22, | 75,23, | 75,24, | 75,25, | 75,26, | 75,27, | 75,28, | 75,29, | 75,30, | 75,31, | 75,32, | 75,33, | 75,34, | 75,35, | 75,36, | 75,37, | 75,38, | 75,39, | 75,40, | 75,41, | 75,42, | 75,43, | 75,44, | 75,45, | 75,46, | 75,47, | 75,48, | 75,49, | 75,50, | 75,51, | 75,52, | 75,53, | 75,54, | 75,55, | 75,56, | 75,57, | 75,58, | 75,59, | 75,60, | 75,61, | 75,62, | 75,63, | 75,64, | 75,65, | 75,66, | 75,67, | 75,68, | 75,69, | 75,70, | 75,71, | 75,72, | 75,73, | 75,74, | 75,75, | 75,76, | 75,77, | 75,78, | 75,79, | 75,80, | 75,81, | 75,82, | 75,83, | 75,84, | 75,85, | 76,1, | 76,2, | 76,3, | 76,4, | 76,5, | 76,6, | 76,7, | 76,8, | 76,9, | 76,10, | 76,11, | 76,12, | 76,13, | 76,14, | 76,15, | 76,16, | 76,17, | 76,18, | 76,19, | 76,20, | 76,21, | 76,22, | 76,23, | 76,24, | 76,25, | 76,26, | 76,27, | 76,28, | 76,29, | 76,30, | 76,31, | 76,32, | 76,33, | 76,34, | 76,35, | 76,36, | 76,37, | 76,38, | 76,39, | 76,40, | 76,41, | 76,42, | 76,43, | 76,44, | 76,45, | 76,46, | 76,47, | 76,48, | 76,49, | 76,50, | 76,51, | 76,52, | 76,53, | 76,54, | 76,55, | 76,56, | 76,57, | 76,58, | 76,59, | 76,60, | 76,61, | 76,62, | 76,63, | 76,64, | 76,65, | 76,66, | 76,67, | 76,68, | 76,69, | 76,70, | 76,71, | 76,72, | 76,73, | 76,74, | 76,75, | 76,76, | 76,77, | 76,78, | 76,79, | 76,80, | 76,81, | 76,82, | 76,83, | 76,84, | 76,85, | 77,1, | 77,2, | 77,3, | 77,4, | 77,5, | 77,6, | 77,7, | 77,8, | 77,9, | 77,10, | 77,11, | 77,12, | 77,13, | 77,14, | 77,15, | 77,16, | 77,17, | 77,18, | 77,19, | 77,20, | 77,21, | 77,22, | 77,23, | 77,24, | 77,25, | 77,26, | 77,27, | 77,28, | 77,29, | 77,30, | 77,31, | 77,32, | 77,33, | 77,34, | 77,35, | 77,36, | 77,37, | 77,38, | 77,39, | 77,40, | 77,41, | 77,42, | 77,43, | 77,44, | 77,45, | 77,46, | 77,47, | 77,48, | 77,49, | 77,50, | 77,51, | 77,52, | 77,53, | 77,54, | 77,55, | 77,56, | 77,57, | 77,58, | 77,59, | 77,60, | 77,61, | 77,62, | 77,63, | 77,64, | 77,65, | 77,66, | 77,67, | 77,68, | 77,69, | 77,70, | 77,71, | 77,72, | 77,73, | 77,74, | 77,75, | 77,76, | 77,77, | 77,78, | 77,79, | 77,80, | 77,81, | 77,82, | 77,83, | 77,84, | 77,85, | 78,1, | 78,2, | 78,3, | 78,4, | 78,5, | 78,6, | 78,7, | 78,8, | 78,9, | 78,10, | 78,11, | 78,12, | 78,13, | 78,14, | 78,15, | 78,16, | 78,17, | 78,18, | 78,19, | 78,20, | 78,21, | 78,22, | 78,23, | 78,24, | 78,25, | 78,26, | 78,27, | 78,28, | 78,29, | 78,30, | 78,31, | 78,32, | 78,33, | 78,34, | 78,35, | 78,36, | 78,37, | 78,38, | 78,39, | 78,40, | 78,41, | 78,42, | 78,43, | 78,44, | 78,45, | 78,46, | 78,47, | 78,48, | 78,49, | 78,50, | 78,51, | 78,52, | 78,53, | 78,54, | 78,55, | 78,56, | 78,57, | 78,58, | 78,59, | 78,60, | 78,61, | 78,62, | 78,63, | 78,64, | 78,65, | 78,66, | 78,67, | 78,68, | 78,69, | 78,70, | 78,71, | 78,72, | 78,73, | 78,74, | 78,75, | 78,76, | 78,77, | 78,78, | 78,79, | 78,80, | 78,81, | 78,82, | 78,83, | 78,84, | 78,85, | 79,1, | 79,2, | 79,3, | 79,4, | 79,5, | 79,6, | 79,7, | 79,8, | 79,9, | 79,10, | 79,11, | 79,12, | 79,13, | 79,14, | 79,15, | 79,16, | 79,17, | 79,18, | 79,19, | 79,20, | 79,21, | 79,22, | 79,23, | 79,24, | 79,25, | 79,26, | 79,27, | 79,28, | 79,29, | 79,30, | 79,31, | 79,32, | 79,33, | 79,34, | 79,35, | 79,36, | 79,37, | 79,38, | 79,39, | 79,40, | 79,41, | 79,42, | 79,43, | 79,44, | 79,45, | 79,46, | 79,47, | 79,48, | 79,49, | 79,50, | 79,51, | 79,52, | 79,53, | 79,54, | 79,55, | 79,56, | 79,57, | 79,58, | 79,59, | 79,60, | 79,61, | 79,62, | 79,63, | 79,64, | 79,65, | 79,66, | 79,67, | 79,68, | 79,69, | 79,70, | 79,71, | 79,72, | 79,73, | 79,74, | 79,75, | 79,76, | 79,77, | 79,78, | 79,79, | 79,80, | 79,81, | 79,82, | 79,83, | 79,84, | 79,85, | 80,1, | 80,2, | 80,3, | 80,4, | 80,5, | 80,6, | 80,7, | 80,8, | 80,9, | 80,10, | 80,11, | 80,12, | 80,13, | 80,14, | 80,15, | 80,16, | 80,17, | 80,18, | 80,19, | 80,20, | 80,21, | 80,22, | 80,23, | 80,24, | 80,25, | 80,26, | 80,27, | 80,28, | 80,29, | 80,30, | 80,31, | 80,32, | 80,33, | 80,34, | 80,35, | 80,36, | 80,37, | 80,38, | 80,39, | 80,40, | 80,41, | 80,42, | 80,43, | 80,44, | 80,45, | 80,46, | 80,47, | 80,48, | 80,49, | 80,50, | 80,51, | 80,52, | 80,53, | 80,54, | 80,55, | 80,56, | 80,57, | 80,58, | 80,59, | 80,60, | 80,61, | 80,62, | 80,63, | 80,64, | 80,65, | 80,66, | 80,67, | 80,68, | 80,69, | 80,70, | 80,71, | 80,72, | 80,73, | 80,74, | 80,75, | 80,76, | 80,77, | 80,78, | 80,79, | 80,80, | 80,81, | 80,82, | 80,83, | 80,84, | 80,85, | 81,1, | 81,2, | 81,3, | 81,4, | 81,5, | 81,6, | 81,7, | 81,8, | 81,9, | 81,10, | 81,11, | 81,12, | 81,13, | 81,14, | 81,15, | 81,16, | 81,17, | 81,18, | 81,19, | 81,20, | 81,21, | 81,22, | 81,23, | 81,24, | 81,25, | 81,26, | 81,27, | 81,28, | 81,29, | 81,30, | 81,31, | 81,32, | 81,33, | 81,34, | 81,35, | 81,36, | 81,37, | 81,38, | 81,39, | 81,40, | 81,41, | 81,42, | 81,43, | 81,44, | 81,45, | 81,46, | 81,47, | 81,48, | 81,49, | 81,50, | 81,51, | 81,52, | 81,53, | 81,54, | 81,55, | 81,56, | 81,57, | 81,58, | 81,59, | 81,60, | 81,61, | 81,62, | 81,63, | 81,64, | 81,65, | 81,66, | 81,67, | 81,68, | 81,69, | 81,70, | 81,71, | 81,72, | 81,73, | 81,74, | 81,75, | 81,76, | 81,77, | 81,78, | 81,79, | 81,80, | 81,81, | 81,82, | 81,83, | 81,84, | 81,85, | 82,1, | 82,2, | 82,3, | 82,4, | 82,5, | 82,6, | 82,7, | 82,8, | 82,9, | 82,10, | 82,11, | 82,12, | 82,13, | 82,14, | 82,15, | 82,16, | 82,17, | 82,18, | 82,19, | 82,20, | 82,21, | 82,22, | 82,23, | 82,24, | 82,25, | 82,26, | 82,27, | 82,28, | 82,29, | 82,30, | 82,31, | 82,32, | 82,33, | 82,34, | 82,35, | 82,36, | 82,37, | 82,38, | 82,39, | 82,40, | 82,41, | 82,42, | 82,43, | 82,44, | 82,45, | 82,46, | 82,47, | 82,48, | 82,49, | 82,50, | 82,51, | 82,52, | 82,53, | 82,54, | 82,55, | 82,56, | 82,57, | 82,58, | 82,59, | 82,60, | 82,61, | 82,62, | 82,63, | 82,64, | 82,65, | 82,66, | 82,67, | 82,68, | 82,69, | 82,70, | 82,71, | 82,72, | 82,73, | 82,74, | 82,75, | 82,76, | 82,77, | 82,78, | 82,79, | 82,80, | 82,81, | 82,82, | 82,83, | 82,84, | 82,85, | 83,1, | 83,2, | 83,3, | 83,4, | 83,5, | 83,6, | 83,7, | 83,8, | 83,9, | 83,10, | 83,11, | 83,12, | 83,13, | 83,14, | 83,15, | 83,16, | 83,17, | 83,18, | 83,19, | 83,20, | 83,21, | 83,22, | 83,23, | 83,24, | 83,25, | 83,26, | 83,27, | 83,28, | 83,29, | 83,30, | 83,31, | 83,32, | 83,33, | 83,34, | 83,35, | 83,36, | 83,37, | 83,38, | 83,39, | 83,40, | 83,41, | 83,42, | 83,43, | 83,44, | 83,45, | 83,46, | 83,47, | 83,48, | 83,49, | 83,50, | 83,51, | 83,52, | 83,53, | 83,54, | 83,55, | 83,56, | 83,57, | 83,58, | 83,59, | 83,60, | 83,61, | 83,62, | 83,63, | 83,64, | 83,65, | 83,66, | 83,67, | 83,68, | 83,69, | 83,70, | 83,71, | 83,72, | 83,73, | 83,74, | 83,75, | 83,76, | 83,77, | 83,78, | 83,79, | 83,80, | 83,81, | 83,82, | 83,83, | 83,84, | 83,85, | 84,1, | 84,2, | 84,3, | 84,4, | 84,5, | 84,6, | 84,7, | 84,8, | 84,9, | 84,10, | 84,11, | 84,12, | 84,13, | 84,14, | 84,15, | 84,16, | 84,17, | 84,18, | 84,19, | 84,20, | 84,21, | 84,22, | 84,23, | 84,24, | 84,25, | 84,26, | 84,27, | 84,28, | 84,29, | 84,30, | 84,31, | 84,32, | 84,33, | 84,34, | 84,35, | 84,36, | 84,37, | 84,38, | 84,39, | 84,40, | 84,41, | 84,42, | 84,43, | 84,44, | 84,45, | 84,46, | 84,47, | 84,48, | 84,49, | 84,50, | 84,51, | 84,52, | 84,53, | 84,54, | 84,55, | 84,56, | 84,57, | 84,58, | 84,59, | 84,60, | 84,61, | 84,62, | 84,63, | 84,64, | 84,65, | 84,66, | 84,67, | 84,68, | 84,69, | 84,70, | 84,71, | 84,72, | 84,73, | 84,74, | 84,75, | 84,76, | 84,77, | 84,78, | 84,79, | 84,80, | 84,81, | 84,82, | 84,83, | 84,84, | 84,85, | 85,1, | 85,2, | 85,3, | 85,4, | 85,5, | 85,6, | 85,7, | 85,8, | 85,9, | 85,10, | 85,11, | 85,12, | 85,13, | 85,14, | 85,15, | 85,16, | 85,17, | 85,18, | 85,19, | 85,20, | 85,21, | 85,22, | 85,23, | 85,24, | 85,25, | 85,26, | 85,27, | 85,28, | 85,29, | 85,30, | 85,31, | 85,32, | 85,33, | 85,34, | 85,35, | 85,36, | 85,37, | 85,38, | 85,39, | 85,40, | 85,41, | 85,42, | 85,43, | 85,44, | 85,45, | 85,46, | 85,47, | 85,48, | 85,49, | 85,50, | 85,51, | 85,52, | 85,53, | 85,54, | 85,55, | 85,56, | 85,57, | 85,58, | 85,59, | 85,60, | 85,61, | 85,62, | 85,63, | 85,64, | 85,65, | 85,66, | 85,67, | 85,68, | 85,69, | 85,70, | 85,71, | 85,72, | 85,73, | 85,74, | 85,75, | 85,76, | 85,77, | 85,78, | 85,79, | 85,80, | 85,81, | 85,82, | 85,83, | 85,84, | 85,85, | 86,1, | 86,2, | 86,3, | 86,4, | 86,5, | 86,6, | 86,7, | 86,8, | 86,9, | 86,10, | 86,11, | 86,12, | 86,13, | 86,14, | 86,15, | 86,16, | 86,17, | 86,18, | 86,19, | 86,20, | 86,21, | 86,22, | 86,23, | 86,24, | 86,25, | 86,26, | 86,27, | 86,28, | 86,29, | 86,30, | 86,31, | 86,32, | 86,33, | 86,34, | 86,35, | 86,36, | 86,37, | 86,38, | 86,39, | 86,40, | 86,41, | 86,42, | 86,43, | 86,44, | 86,45, | 86,46, | 86,47, | 86,48, | 86,49, | 86,50, | 86,51, | 86,52, | 86,53, | 86,54, | 86,55, | 86,56, | 86,57, | 86,58, | 86,59, | 86,60, | 86,61, | 86,62, | 86,63, | 86,64, | 86,65, | 86,66, | 86,67, | 86,68, | 86,69, | 86,70, | 86,71, | 86,72, | 86,73, | 86,74, | 86,75, | 86,76, | 86,77, | 86,78, | 86,79, | 86,80, | 86,81, | 86,82, | 86,83, | 86,84, | 86,85, | 87,1, | 87,2, | 87,3, | 87,4, | 87,5, | 87,6, | 87,7, | 87,8, | 87,9, | 87,10, | 87,11, | 87,12, | 87,13, | 87,14, | 87,15, | 87,16, | 87,17, | 87,18, | 87,19, | 87,20, | 87,21, | 87,22, | 87,23, | 87,24, | 87,25, | 87,26, | 87,27, | 87,28, | 87,29, | 87,30, | 87,31, | 87,32, | 87,33, | 87,34, | 87,35, | 87,36, | 87,37, | 87,38, | 87,39, | 87,40, | 87,41, | 87,42, | 87,43, | 87,44, | 87,45, | 87,46, | 87,47, | 87,48, | 87,49, | 87,50, | 87,51, | 87,52, | 87,53, | 87,54, | 87,55, | 87,56, | 87,57, | 87,58, | 87,59, | 87,60, | 87,61, | 87,62, | 87,63, | 87,64, | 87,65, | 87,66, | 87,67, | 87,68, | 87,69, | 87,70, | 87,71, | 87,72, | 87,73, | 87,74, | 87,75, | 87,76, | 87,77, | 87,78, | 87,79, | 87,80, | 87,81, | 87,82, | 87,83, | 87,84, | 87,85, | 88,1, | 88,2, | 88,3, | 88,4, | 88,5, | 88,6, | 88,7, | 88,8, | 88,9, | 88,10, | 88,11, | 88,12, | 88,13, | 88,14, | 88,15, | 88,16, | 88,17, | 88,18, | 88,19, | 88,20, | 88,21, | 88,22, | 88,23, | 88,24, | 88,25, | 88,26, | 88,27, | 88,28, | 88,29, | 88,30, | 88,31, | 88,32, | 88,33, | 88,34, | 88,35, | 88,36, | 88,37, | 88,38, | 88,39, | 88,40, | 88,41, | 88,42, | 88,43, | 88,44, | 88,45, | 88,46, | 88,47, | 88,48, | 88,49, | 88,50, | 88,51, | 88,52, | 88,53, | 88,54, | 88,55, | 88,56, | 88,57, | 88,58, | 88,59, | 88,60, | 88,61, | 88,62, | 88,63, | 88,64, | 88,65, | 88,66, | 88,67, | 88,68, | 88,69, | 88,70, | 88,71, | 88,72, | 88,73, | 88,74, | 88,75, | 88,76, | 88,77, | 88,78, | 88,79, | 88,80, | 88,81, | 88,82, | 88,83, | 88,84, | 88,85, | 89,1, | 89,2, | 89,3, | 89,4, | 89,5, | 89,6, | 89,7, | 89,8, | 89,9, | 89,10, | 89,11, | 89,12, | 89,13, | 89,14, | 89,15, | 89,16, | 89,17, | 89,18, | 89,19, | 89,20, | 89,21, | 89,22, | 89,23, | 89,24, | 89,25, | 89,26, | 89,27, | 89,28, | 89,29, | 89,30, | 89,31, | 89,32, | 89,33, | 89,34, | 89,35, | 89,36, | 89,37, | 89,38, | 89,39, | 89,40, | 89,41, | 89,42, | 89,43, | 89,44, | 89,45, | 89,46, | 89,47, | 89,48, | 89,49, | 89,50, | 89,51, | 89,52, | 89,53, | 89,54, | 89,55, | 89,56, | 89,57, | 89,58, | 89,59, | 89,60, | 89,61, | 89,62, | 89,63, | 89,64, | 89,65, | 89,66, | 89,67, | 89,68, | 89,69, | 89,70, | 89,71, | 89,72, | 89,73, | 89,74, | 89,75, | 89,76, | 89,77, | 89,78, | 89,79, | 89,80, | 89,81, | 89,82, | 89,83, | 89,84, | 89,85, | 90,1, | 90,2, | 90,3, | 90,4, | 90,5, | 90,6, | 90,7, | 90,8, | 90,9, | 90,10, | 90,11, | 90,12, | 90,13, | 90,14, | 90,15, | 90,16, | 90,17, | 90,18, | 90,19, | 90,20, | 90,21, | 90,22, | 90,23, | 90,24, | 90,25, | 90,26, | 90,27, | 90,28, | 90,29, | 90,30, | 90,31, | 90,32, | 90,33, | 90,34, | 90,35, | 90,36, | 90,37, | 90,38, | 90,39, | 90,40, | 90,41, | 90,42, | 90,43, | 90,44, | 90,45, | 90,46, | 90,47, | 90,48, | 90,49, | 90,50, | 90,51, | 90,52, | 90,53, | 90,54, | 90,55, | 90,56, | 90,57, | 90,58, | 90,59, | 90,60, | 90,61, | 90,62, | 90,63, | 90,64, | 90,65, | 90,66, | 90,67, | 90,68, | 90,69, | 90,70, | 90,71, | 90,72, | 90,73, | 90,74, | 90,75, | 90,76, | 90,77, | 90,78, | 90,79, | 90,80, | 90,81, | 90,82, | 90,83, | 90,84, | 90,85, | 91,1, | 91,2, | 91,3, | 91,4, | 91,5, | 91,6, | 91,7, | 91,8, | 91,9, | 91,10, | 91,11, | 91,12, | 91,13, | 91,14, | 91,15, | 91,16, | 91,17, | 91,18, | 91,19, | 91,20, | 91,21, | 91,22, | 91,23, | 91,24, | 91,25, | 91,26, | 91,27, | 91,28, | 91,29, | 91,30, | 91,31, | 91,32, | 91,33, | 91,34, | 91,35, | 91,36, | 91,37, | 91,38, | 91,39, | 91,40, | 91,41, | 91,42, | 91,43, | 91,44, | 91,45, | 91,46, | 91,47, | 91,48, | 91,49, | 91,50, | 91,51, | 91,52, | 91,53, | 91,54, | 91,55, | 91,56, | 91,57, | 91,58, | 91,59, | 91,60, | 91,61, | 91,62, | 91,63, | 91,64, | 91,65, | 91,66, | 91,67, | 91,68, | 91,69, | 91,70, | 91,71, | 91,72, | 91,73, | 91,74, | 91,75, | 91,76, | 91,77, | 91,78, | 91,79, | 91,80, | 91,81, | 91,82, | 91,83, | 91,84, | 91,85, | 92,1, | 92,2, | 92,3, | 92,4, | 92,5, | 92,6, | 92,7, | 92,8, | 92,9, | 92,10, | 92,11, | 92,12, | 92,13, | 92,14, | 92,15, | 92,16, | 92,17, | 92,18, | 92,19, | 92,20, | 92,21, | 92,22, | 92,23, | 92,24, | 92,25, | 92,26, | 92,27, | 92,28, | 92,29, | 92,30, | 92,31, | 92,32, | 92,33, | 92,34, | 92,35, | 92,36, | 92,37, | 92,38, | 92,39, | 92,40, | 92,41, | 92,42, | 92,43, | 92,44, | 92,45, | 92,46, | 92,47, | 92,48, | 92,49, | 92,50, | 92,51, | 92,52, | 92,53, | 92,54, | 92,55, | 92,56, | 92,57, | 92,58, | 92,59, | 92,60, | 92,61, | 92,62, | 92,63, | 92,64, | 92,65, | 92,66, | 92,67, | 92,68, | 92,69, | 92,70, | 92,71, | 92,72, | 92,73, | 92,74, | 92,75, | 92,76, | 92,77, | 92,78, | 92,79, | 92,80, | 92,81, | 92,82, | 92,83, | 92,84, | 92,85, | 93,1, | 93,2, | 93,3, | 93,4, | 93,5, | 93,6, | 93,7, | 93,8, | 93,9, | 93,10, | 93,11, | 93,12, | 93,13, | 93,14, | 93,15, | 93,16, | 93,17, | 93,18, | 93,19, | 93,20, | 93,21, | 93,22, | 93,23, | 93,24, | 93,25, | 93,26, | 93,27, | 93,28, | 93,29, | 93,30, | 93,31, | 93,32, | 93,33, | 93,34, | 93,35, | 93,36, | 93,37, | 93,38, | 93,39, | 93,40, | 93,41, | 93,42, | 93,43, | 93,44, | 93,45, | 93,46, | 93,47, | 93,48, | 93,49, | 93,50, | 93,51, | 93,52, | 93,53, | 93,54, | 93,55, | 93,56, | 93,57, | 93,58, | 93,59, | 93,60, | 93,61, | 93,62, | 93,63, | 93,64, | 93,65, | 93,66, | 93,67, | 93,68, | 93,69, | 93,70, | 93,71, | 93,72, | 93,73, | 93,74, | 93,75, | 93,76, | 93,77, | 93,78, | 93,79, | 93,80, | 93,81, | 93,82, | 93,83, | 93,84, | 93,85, | 94,1, | 94,2, | 94,3, | 94,4, | 94,5, | 94,6, | 94,7, | 94,8, | 94,9, | 94,10, | 94,11, | 94,12, | 94,13, | 94,14, | 94,15, | 94,16, | 94,17, | 94,18, | 94,19, | 94,20, | 94,21, | 94,22, | 94,23, | 94,24, | 94,25, | 94,26, | 94,27, | 94,28, | 94,29, | 94,30, | 94,31, | 94,32, | 94,33, | 94,34, | 94,35, | 94,36, | 94,37, | 94,38, | 94,39, | 94,40, | 94,41, | 94,42, | 94,43, | 94,44, | 94,45, | 94,46, | 94,47, | 94,48, | 94,49, | 94,50, | 94,51, | 94,52, | 94,53, | 94,54, | 94,55, | 94,56, | 94,57, | 94,58, | 94,59, | 94,60, | 94,61, | 94,62, | 94,63, | 94,64, | 94,65, | 94,66, | 94,67, | 94,68, | 94,69, | 94,70, | 94,71, | 94,72, | 94,73, | 94,74, | 94,75, | 94,76, | 94,77, | 94,78, | 94,79, | 94,80, | 94,81, | 94,82, | 94,83, | 94,84, | 94,85, | 95,1, | 95,2, | 95,3, | 95,4, | 95,5, | 95,6, | 95,7, | 95,8, | 95,9, | 95,10, | 95,11, | 95,12, | 95,13, | 95,14, | 95,15, | 95,16, | 95,17, | 95,18, | 95,19, | 95,20, | 95,21, | 95,22, | 95,23, | 95,24, | 95,25, | 95,26, | 95,27, | 95,28, | 95,29, | 95,30, | 95,31, | 95,32, | 95,33, | 95,34, | 95,35, | 95,36, | 95,37, | 95,38, | 95,39, | 95,40, | 95,41, | 95,42, | 95,43, | 95,44, | 95,45, | 95,46, | 95,47, | 95,48, | 95,49, | 95,50, | 95,51, | 95,52, | 95,53, | 95,54, | 95,55, | 95,56, | 95,57, | 95,58, | 95,59, | 95,60, | 95,61, | 95,62, | 95,63, | 95,64, | 95,65, | 95,66, | 95,67, | 95,68, | 95,69, | 95,70, | 95,71, | 95,72, | 95,73, | 95,74, | 95,75, | 95,76, | 95,77, | 95,78, | 95,79, | 95,80, | 95,81, | 95,82, | 95,83, | 95,84, | 95,85, | 96,1, | 96,2, | 96,3, | 96,4, | 96,5, | 96,6, | 96,7, | 96,8, | 96,9, | 96,10, | 96,11, | 96,12, | 96,13, | 96,14, | 96,15, | 96,16, | 96,17, | 96,18, | 96,19, | 96,20, | 96,21, | 96,22, | 96,23, | 96,24, | 96,25, | 96,26, | 96,27, | 96,28, | 96,29, | 96,30, | 96,31, | 96,32, | 96,33, | 96,34, | 96,35, | 96,36, | 96,37, | 96,38, | 96,39, | 96,40, | 96,41, | 96,42, | 96,43, | 96,44, | 96,45, | 96,46, | 96,47, | 96,48, | 96,49, | 96,50, | 96,51, | 96,52, | 96,53, | 96,54, | 96,55, | 96,56, | 96,57, | 96,58, | 96,59, | 96,60, | 96,61, | 96,62, | 96,63, | 96,64, | 96,65, | 96,66, | 96,67, | 96,68, | 96,69, | 96,70, | 96,71, | 96,72, | 96,73, | 96,74, | 96,75, | 96,76, | 96,77, | 96,78, | 96,79, | 96,80, | 96,81, | 96,82, | 96,83, | 96,84, | 96,85, | 97,1, | 97,2, | 97,3, | 97,4, | 97,5, | 97,6, | 97,7, | 97,8, | 97,9, | 97,10, | 97,11, | 97,12, | 97,13, | 97,14, | 97,15, | 97,16, | 97,17, | 97,18, | 97,19, | 97,20, | 97,21, | 97,22, | 97,23, | 97,24, | 97,25, | 97,26, | 97,27, | 97,28, | 97,29, | 97,30, | 97,31, | 97,32, | 97,33, | 97,34, | 97,35, | 97,36, | 97,37, | 97,38, | 97,39, | 97,40, | 97,41, | 97,42, | 97,43, | 97,44, | 97,45, | 97,46, | 97,47, | 97,48, | 97,49, | 97,50, | 97,51, | 97,52, | 97,53, | 97,54, | 97,55, | 97,56, | 97,57, | 97,58, | 97,59, | 97,60, | 97,61, | 97,62, | 97,63, | 97,64, | 97,65, | 97,66, | 97,67, | 97,68, | 97,69, | 97,70, | 97,71, | 97,72, | 97,73, | 97,74, | 97,75, | 97,76, | 97,77, | 97,78, | 97,79, | 97,80, | 97,81, | 97,82, | 97,83, | 97,84, | 97,85, | 98,1, | 98,2, | 98,3, | 98,4, | 98,5, | 98,6, | 98,7, | 98,8, | 98,9, | 98,10, | 98,11, | 98,12, | 98,13, | 98,14, | 98,15, | 98,16, | 98,17, | 98,18, | 98,19, | 98,20, | 98,21, | 98,22, | 98,23, | 98,24, | 98,25, | 98,26, | 98,27, | 98,28, | 98,29, | 98,30, | 98,31, | 98,32, | 98,33, | 98,34, | 98,35, | 98,36, | 98,37, | 98,38, | 98,39, | 98,40, | 98,41, | 98,42, | 98,43, | 98,44, | 98,45, | 98,46, | 98,47, | 98,48, | 98,49, | 98,50, | 98,51, | 98,52, | 98,53, | 98,54, | 98,55, | 98,56, | 98,57, | 98,58, | 98,59, | 98,60, | 98,61, | 98,62, | 98,63, | 98,64, | 98,65, | 98,66, | 98,67, | 98,68, | 98,69, | 98,70, | 98,71, | 98,72, | 98,73, | 98,74, | 98,75, | 98,76, | 98,77, | 98,78, | 98,79, | 98,80, | 98,81, | 98,82, | 98,83, | 98,84, | 98,85, | 99,1, | 99,2, | 99,3, | 99,4, | 99,5, | 99,6, | 99,7, | 99,8, | 99,9, | 99,10, | 99,11, | 99,12, | 99,13, | 99,14, | 99,15, | 99,16, | 99,17, | 99,18, | 99,19, | 99,20, | 99,21, | 99,22, | 99,23, | 99,24, | 99,25, | 99,26, | 99,27, | 99,28, | 99,29, | 99,30, | 99,31, | 99,32, | 99,33, | 99,34, | 99,35, | 99,36, | 99,37, | 99,38, | 99,39, | 99,40, | 99,41, | 99,42, | 99,43, | 99,44, | 99,45, | 99,46, | 99,47, | 99,48, | 99,49, | 99,50, | 99,51, | 99,52, | 99,53, | 99,54, | 99,55, | 99,56, | 99,57, | 99,58, | 99,59, | 99,60, | 99,61, | 99,62, | 99,63, | 99,64, | 99,65, | 99,66, | 99,67, | 99,68, | 99,69, | 99,70, | 99,71, | 99,72, | 99,73, | 99,74, | 99,75, | 99,76, | 99,77, | 99,78, | 99,79, | 99,80, | 99,81, | 99,82, | 99,83, | 99,84, | 99,85, | 100,1, | 100,2, | 100,3, | 100,4, | 100,5, | 100,6, | 100,7, | 100,8, | 100,9, | 100,10, | 100,11, | 100,12, | 100,13, | 100,14, | 100,15, | 100,16, | 100,17, | 100,18, | 100,19, | 100,20, | 100,21, | 100,22, | 100,23, | 100,24, | 100,25, | 100,26, | 100,27, | 100,28, | 100,29, | 100,30, | 100,31, | 100,32, | 100,33, | 100,34, | 100,35, | 100,36, | 100,37, | 100,38, | 100,39, | 100,40, | 100,41, | 100,42, | 100,43, | 100,44, | 100,45, | 100,46, | 100,47, | 100,48, | 100,49, | 100,50, | 100,51, | 100,52, | 100,53, | 100,54, | 100,55, | 100,56, | 100,57, | 100,58, | 100,59, | 100,60, | 100,61, | 100,62, | 100,63, | 100,64, | 100,65, | 100,66, | 100,67, | 100,68, | 100,69, | 100,70, | 100,71, | 100,72, | 100,73, | 100,74, | 100,75, | 100,76, | 100,77, | 100,78, | 100,79, | 100,80, | 100,81, | 100,82, | 100,83, | 100,84, | 100,85, | 101,1, | 101,2, | 101,3, | 101,4, | 101,5, | 101,6, | 101,7, | 101,8, | 101,9, | 101,10, | 101,11, | 101,12, | 101,13, | 101,14, | 101,15, | 101,16, | 101,17, | 101,18, | 101,19, | 101,20, | 101,21, | 101,22, | 101,23, | 101,24, | 101,25, | 101,26, | 101,27, | 101,28, | 101,29, | 101,30, | 101,31, | 101,32, | 101,33, | 101,34, | 101,35, | 101,36, | 101,37, | 101,38, | 101,39, | 101,40, | 101,41, | 101,42, | 101,43, | 101,44, | 101,45, | 101,46, | 101,47, | 101,48, | 101,49, | 101,50, | 101,51, | 101,52, | 101,53, | 101,54, | 101,55, | 101,56, | 101,57, | 101,58, | 101,59, | 101,60, | 101,61, | 101,62, | 101,63, | 101,64, | 101,65, | 101,66, | 101,67, | 101,68, | 101,69, | 101,70, | 101,71, | 101,72, | 101,73, | 101,74, | 101,75, | 101,76, | 101,77, | 101,78, | 101,79, | 101,80, | 101,81, | 101,82, | 101,83, | 101,84, | 101,85, | 102,1, | 102,2, | 102,3, | 102,4, | 102,5, | 102,6, | 102,7, | 102,8, | 102,9, | 102,10, | 102,11, | 102,12, | 102,13, | 102,14, | 102,15, | 102,16, | 102,17, | 102,18, | 102,19, | 102,20, | 102,21, | 102,22, | 102,23, | 102,24, | 102,25, | 102,26, | 102,27, | 102,28, | 102,29, | 102,30, | 102,31, | 102,32, | 102,33, | 102,34, | 102,35, | 102,36, | 102,37, | 102,38, | 102,39, | 102,40, | 102,41, | 102,42, | 102,43, | 102,44, | 102,45, | 102,46, | 102,47, | 102,48, | 102,49, | 102,50, | 102,51, | 102,52, | 102,53, | 102,54, | 102,55, | 102,56, | 102,57, | 102,58, | 102,59, | 102,60, | 102,61, | 102,62, | 102,63, | 102,64, | 102,65, | 102,66, | 102,67, | 102,68, | 102,69, | 102,70, | 102,71, | 102,72, | 102,73, | 102,74, | 102,75, | 102,76, | 102,77, | 102,78, | 102,79, | 102,80, | 102,81, | 102,82, | 102,83, | 102,84, | 102,85, | 103,1, | 103,2, | 103,3, | 103,4, | 103,5, | 103,6, | 103,7, | 103,8, | 103,9, | 103,10, | 103,11, | 103,12, | 103,13, | 103,14, | 103,15, | 103,16, | 103,17, | 103,18, | 103,19, | 103,20, | 103,21, | 103,22, | 103,23, | 103,24, | 103,25, | 103,26, | 103,27, | 103,28, | 103,29, | 103,30, | 103,31, | 103,32, | 103,33, | 103,34, | 103,35, | 103,36, | 103,37, | 103,38, | 103,39, | 103,40, | 103,41, | 103,42, | 103,43, | 103,44, | 103,45, | 103,46, | 103,47, | 103,48, | 103,49, | 103,50, | 103,51, | 103,52, | 103,53, | 103,54, | 103,55, | 103,56, | 103,57, | 103,58, | 103,59, | 103,60, | 103,61, | 103,62, | 103,63, | 103,64, | 103,65, | 103,66, | 103,67, | 103,68, | 103,69, | 103,70, | 103,71, | 103,72, | 103,73, | 103,74, | 103,75, | 103,76, | 103,77, | 103,78, | 103,79, | 103,80, | 103,81, | 103,82, | 103,83, | 103,84, | 103,85, | 104,1, | 104,2, | 104,3, | 104,4, | 104,5, | 104,6, | 104,7, | 104,8, | 104,9, | 104,10, | 104,11, | 104,12, | 104,13, | 104,14, | 104,15, | 104,16, | 104,17, | 104,18, | 104,19, | 104,20, | 104,21, | 104,22, | 104,23, | 104,24, | 104,25, | 104,26, | 104,27, | 104,28, | 104,29, | 104,30, | 104,31, | 104,32, | 104,33, | 104,34, | 104,35, | 104,36, | 104,37, | 104,38, | 104,39, | 104,40, | 104,41, | 104,42, | 104,43, | 104,44, | 104,45, | 104,46, | 104,47, | 104,48, | 104,49, | 104,50, | 104,51, | 104,52, | 104,53, | 104,54, | 104,55, | 104,56, | 104,57, | 104,58, | 104,59, | 104,60, | 104,61, | 104,62, | 104,63, | 104,64, | 104,65, | 104,66, | 104,67, | 104,68, | 104,69, | 104,70, | 104,71, | 104,72, | 104,73, | 104,74, | 104,75, | 104,76, | 104,77, | 104,78, | 104,79, | 104,80, | 104,81, | 104,82, | 104,83, | 104,84, | 104,85, | 105,1, | 105,2, | 105,3, | 105,4, | 105,5, | 105,6, | 105,7, | 105,8, | 105,9, | 105,10, | 105,11, | 105,12, | 105,13, | 105,14, | 105,15, | 105,16, | 105,17, | 105,18, | 105,19, | 105,20, | 105,21, | 105,22, | 105,23, | 105,24, | 105,25, | 105,26, | 105,27, | 105,28, | 105,29, | 105,30, | 105,31, | 105,32, | 105,33, | 105,34, | 105,35, | 105,36, | 105,37, | 105,38, | 105,39, | 105,40, | 105,41, | 105,42, | 105,43, | 105,44, | 105,45, | 105,46, | 105,47, | 105,48, | 105,49, | 105,50, | 105,51, | 105,52, | 105,53, | 105,54, | 105,55, | 105,56, | 105,57, | 105,58, | 105,59, | 105,60, | 105,61, | 105,62, | 105,63, | 105,64, | 105,65, | 105,66, | 105,67, | 105,68, | 105,69, | 105,70, | 105,71, | 105,72, | 105,73, | 105,74, | 105,75, | 105,76, | 105,77, | 105,78, | 105,79, | 105,80, | 105,81, | 105,82, | 105,83, | 105,84, | 105,85, | 106,1, | 106,2, | 106,3, | 106,4, | 106,5, | 106,6, | 106,7, | 106,8, | 106,9, | 106,10, | 106,11, | 106,12, | 106,13, | 106,14, | 106,15, | 106,16, | 106,17, | 106,18, | 106,19, | 106,20, | 106,21, | 106,22, | 106,23, | 106,24, | 106,25, | 106,26, | 106,27, | 106,28, | 106,29, | 106,30, | 106,31, | 106,32, | 106,33, | 106,34, | 106,35, | 106,36, | 106,37, | 106,38, | 106,39, | 106,40, | 106,41, | 106,42, | 106,43, | 106,44, | 106,45, | 106,46, | 106,47, | 106,48, | 106,49, | 106,50, | 106,51, | 106,52, | 106,53, | 106,54, | 106,55, | 106,56, | 106,57, | 106,58, | 106,59, | 106,60, | 106,61, | 106,62, | 106,63, | 106,64, | 106,65, | 106,66, | 106,67, | 106,68, | 106,69, | 106,70, | 106,71, | 106,72, | 106,73, | 106,74, | 106,75, | 106,76, | 106,77, | 106,78, | 106,79, | 106,80, | 106,81, | 106,82, | 106,83, | 106,84, | 106,85, | 107,1, | 107,2, | 107,3, | 107,4, | 107,5, | 107,6, | 107,7, | 107,8, | 107,9, | 107,10, | 107,11, | 107,12, | 107,13, | 107,14, | 107,15, | 107,16, | 107,17, | 107,18, | 107,19, | 107,20, | 107,21, | 107,22, | 107,23, | 107,24, | 107,25, | 107,26, | 107,27, | 107,28, | 107,29, | 107,30, | 107,31, | 107,32, | 107,33, | 107,34, | 107,35, | 107,36, | 107,37, | 107,38, | 107,39, | 107,40, | 107,41, | 107,42, | 107,43, | 107,44, | 107,45, | 107,46, | 107,47, | 107,48, | 107,49, | 107,50, | 107,51, | 107,52, | 107,53, | 107,54, | 107,55, | 107,56, | 107,57, | 107,58, | 107,59, | 107,60, | 107,61, | 107,62, | 107,63, | 107,64, | 107,65, | 107,66, | 107,67, | 107,68, | 107,69, | 107,70, | 107,71, | 107,72, | 107,73, | 107,74, | 107,75, | 107,76, | 107,77, | 107,78, | 107,79, | 107,80, | 107,81, | 107,82, | 107,83, | 107,84, | 107,85, | 108,1, | 108,2, | 108,3, | 108,4, | 108,5, | 108,6, | 108,7, | 108,8, | 108,9, | 108,10, | 108,11, | 108,12, | 108,13, | 108,14, | 108,15, | 108,16, | 108,17, | 108,18, | 108,19, | 108,20, | 108,21, | 108,22, | 108,23, | 108,24, | 108,25, | 108,26, | 108,27, | 108,28, | 108,29, | 108,30, | 108,31, | 108,32, | 108,33, | 108,34, | 108,35, | 108,36, | 108,37, | 108,38, | 108,39, | 108,40, | 108,41, | 108,42, | 108,43, | 108,44, | 108,45, | 108,46, | 108,47, | 108,48, | 108,49, | 108,50, | 108,51, | 108,52, | 108,53, | 108,54, | 108,55, | 108,56, | 108,57, | 108,58, | 108,59, | 108,60, | 108,61, | 108,62, | 108,63, | 108,64, | 108,65, | 108,66, | 108,67, | 108,68, | 108,69, | 108,70, | 108,71, | 108,72, | 108,73, | 108,74, | 108,75, | 108,76, | 108,77, | 108,78, | 108,79, | 108,80, | 108,81, | 108,82, | 108,83, | 108,84, | 108,85, | 109,1, | 109,2, | 109,3, | 109,4, | 109,5, | 109,6, | 109,7, | 109,8, | 109,9, | 109,10, | 109,11, | 109,12, | 109,13, | 109,14, | 109,15, | 109,16, | 109,17, | 109,18, | 109,19, | 109,20, | 109,21, | 109,22, | 109,23, | 109,24, | 109,25, | 109,26, | 109,27, | 109,28, | 109,29, | 109,30, | 109,31, | 109,32, | 109,33, | 109,34, | 109,35, | 109,36, | 109,37, | 109,38, | 109,39, | 109,40, | 109,41, | 109,42, | 109,43, | 109,44, | 109,45, | 109,46, | 109,47, | 109,48, | 109,49, | 109,50, | 109,51, | 109,52, | 109,53, | 109,54, | 109,55, | 109,56, | 109,57, | 109,58, | 109,59, | 109,60, | 109,61, | 109,62, | 109,63, | 109,64, | 109,65, | 109,66, | 109,67, | 109,68, | 109,69, | 109,70, | 109,71, | 109,72, | 109,73, | 109,74, | 109,75, | 109,76, | 109,77, | 109,78, | 109,79, | 109,80, | 109,81, | 109,82, | 109,83, | 109,84, | 109,85, | 110,1, | 110,2, | 110,3, | 110,4, | 110,5, | 110,6, | 110,7, | 110,8, | 110,9, | 110,10, | 110,11, | 110,12, | 110,13, | 110,14, | 110,15, | 110,16, | 110,17, | 110,18, | 110,19, | 110,20, | 110,21, | 110,22, | 110,23, | 110,24, | 110,25, | 110,26, | 110,27, | 110,28, | 110,29, | 110,30, | 110,31, | 110,32, | 110,33, | 110,34, | 110,35, | 110,36, | 110,37, | 110,38, | 110,39, | 110,40, | 110,41, | 110,42, | 110,43, | 110,44, | 110,45, | 110,46, | 110,47, | 110,48, | 110,49, | 110,50, | 110,51, | 110,52, | 110,53, | 110,54, | 110,55, | 110,56, | 110,57, | 110,58, | 110,59, | 110,60, | 110,61, | 110,62, | 110,63, | 110,64, | 110,65, | 110,66, | 110,67, | 110,68, | 110,69, | 110,70, | 110,71, | 110,72, | 110,73, | 110,74, | 110,75, | 110,76, | 110,77, | 110,78, | 110,79, | 110,80, | 110,81, | 110,82, | 110,83, | 110,84, | 110,85, | 111,1, | 111,2, | 111,3, | 111,4, | 111,5, | 111,6, | 111,7, | 111,8, | 111,9, | 111,10, | 111,11, | 111,12, | 111,13, | 111,14, | 111,15, | 111,16, | 111,17, | 111,18, | 111,19, | 111,20, | 111,21, | 111,22, | 111,23, | 111,24, | 111,25, | 111,26, | 111,27, | 111,28, | 111,29, | 111,30, | 111,31, | 111,32, | 111,33, | 111,34, | 111,35, | 111,36, | 111,37, | 111,38, | 111,39, | 111,40, | 111,41, | 111,42, | 111,43, | 111,44, | 111,45, | 111,46, | 111,47, | 111,48, | 111,49, | 111,50, | 111,51, | 111,52, | 111,53, | 111,54, | 111,55, | 111,56, | 111,57, | 111,58, | 111,59, | 111,60, | 111,61, | 111,62, | 111,63, | 111,64, | 111,65, | 111,66, | 111,67, | 111,68, | 111,69, | 111,70, | 111,71, | 111,72, | 111,73, | 111,74, | 111,75, | 111,76, | 111,77, | 111,78, | 111,79, | 111,80, | 111,81, | 111,82, | 111,83, | 111,84, | 111,85, | 112,1, | 112,2, | 112,3, | 112,4, | 112,5, | 112,6, | 112,7, | 112,8, | 112,9, | 112,10, | 112,11, | 112,12, | 112,13, | 112,14, | 112,15, | 112,16, | 112,17, | 112,18, | 112,19, | 112,20, | 112,21, | 112,22, | 112,23, | 112,24, | 112,25, | 112,26, | 112,27, | 112,28, | 112,29, | 112,30, | 112,31, | 112,32, | 112,33, | 112,34, | 112,35, | 112,36, | 112,37, | 112,38, | 112,39, | 112,40, | 112,41, | 112,42, | 112,43, | 112,44, | 112,45, | 112,46, | 112,47, | 112,48, | 112,49, | 112,50, | 112,51, | 112,52, | 112,53, | 112,54, | 112,55, | 112,56, | 112,57, | 112,58, | 112,59, | 112,60, | 112,61, | 112,62, | 112,63, | 112,64, | 112,65, | 112,66, | 112,67, | 112,68, | 112,69, | 112,70, | 112,71, | 112,72, | 112,73, | 112,74, | 112,75, | 112,76, | 112,77, | 112,78, | 112,79, | 112,80, | 112,81, | 112,82, | 112,83, | 112,84, | 112,85, | 113,1, | 113,2, | 113,3, | 113,4, | 113,5, | 113,6, | 113,7, | 113,8, | 113,9, | 113,10, | 113,11, | 113,12, | 113,13, | 113,14, | 113,15, | 113,16, | 113,17, | 113,18, | 113,19, | 113,20, | 113,21, | 113,22, | 113,23, | 113,24, | 113,25, | 113,26, | 113,27, | 113,28, | 113,29, | 113,30, | 113,31, | 113,32, | 113,33, | 113,34, | 113,35, | 113,36, | 113,37, | 113,38, | 113,39, | 113,40, | 113,41, | 113,42, | 113,43, | 113,44, | 113,45, | 113,46, | 113,47, | 113,48, | 113,49, | 113,50, | 113,51, | 113,52, | 113,53, | 113,54, | 113,55, | 113,56, | 113,57, | 113,58, | 113,59, | 113,60, | 113,61, | 113,62, | 113,63, | 113,64, | 113,65, | 113,66, | 113,67, | 113,68, | 113,69, | 113,70, | 113,71, | 113,72, | 113,73, | 113,74, | 113,75, | 113,76, | 113,77, | 113,78, | 113,79, | 113,80, | 113,81, | 113,82, | 113,83, | 113,84, | 113,85, | 114,1, | 114,2, | 114,3, | 114,4, | 114,5, | 114,6, | 114,7, | 114,8, | 114,9, | 114,10, | 114,11, | 114,12, | 114,13, | 114,14, | 114,15, | 114,16, | 114,17, | 114,18, | 114,19, | 114,20, | 114,21, | 114,22, | 114,23, | 114,24, | 114,25, | 114,26, | 114,27, | 114,28, | 114,29, | 114,30, | 114,31, | 114,32, | 114,33, | 114,34, | 114,35, | 114,36, | 114,37, | 114,38, | 114,39, | 114,40, | 114,41, | 114,42, | 114,43, | 114,44, | 114,45, | 114,46, | 114,47, | 114,48, | 114,49, | 114,50, | 114,51, | 114,52, | 114,53, | 114,54, | 114,55, | 114,56, | 114,57, | 114,58, | 114,59, | 114,60, | 114,61, | 114,62, | 114,63, | 114,64, | 114,65, | 114,66, | 114,67, | 114,68, | 114,69, | 114,70, | 114,71, | 114,72, | 114,73, | 114,74, | 114,75, | 114,76, | 114,77, | 114,78, | 114,79, | 114,80, | 114,81, | 114,82, | 114,83, | 114,84, | 114,85, | 115,1, | 115,2, | 115,3, | 115,4, | 115,5, | 115,6, | 115,7, | 115,8, | 115,9, | 115,10, | 115,11, | 115,12, | 115,13, | 115,14, | 115,15, | 115,16, | 115,17, | 115,18, | 115,19, | 115,20, | 115,21, | 115,22, | 115,23, | 115,24, | 115,25, | 115,26, | 115,27, | 115,28, | 115,29, | 115,30, | 115,31, | 115,32, | 115,33, | 115,34, | 115,35, | 115,36, | 115,37, | 115,38, | 115,39, | 115,40, | 115,41, | 115,42, | 115,43, | 115,44, | 115,45, | 115,46, | 115,47, | 115,48, | 115,49, | 115,50, | 115,51, | 115,52, | 115,53, | 115,54, | 115,55, | 115,56, | 115,57, | 115,58, | 115,59, | 115,60, | 115,61, | 115,62, | 115,63, | 115,64, | 115,65, | 115,66, | 115,67, | 115,68, | 115,69, | 115,70, | 115,71, | 115,72, | 115,73, | 115,74, | 115,75, | 115,76, | 115,77, | 115,78, | 115,79, | 115,80, | 115,81, | 115,82, | 115,83, | 115,84, | 115,85, | 116,1, | 116,2, | 116,3, | 116,4, | 116,5, | 116,6, | 116,7, | 116,8, | 116,9, | 116,10, | 116,11, | 116,12, | 116,13, | 116,14, | 116,15, | 116,16, | 116,17, | 116,18, | 116,19, | 116,20, | 116,21, | 116,22, | 116,23, | 116,24, | 116,25, | 116,26, | 116,27, | 116,28, | 116,29, | 116,30, | 116,31, | 116,32, | 116,33, | 116,34, | 116,35, | 116,36, | 116,37, | 116,38, | 116,39, | 116,40, | 116,41, | 116,42, | 116,43, | 116,44, | 116,45, | 116,46, | 116,47, | 116,48, | 116,49, | 116,50, | 116,51, | 116,52, | 116,53, | 116,54, | 116,55, | 116,56, | 116,57, | 116,58, | 116,59, | 116,60, | 116,61, | 116,62, | 116,63, | 116,64, | 116,65, | 116,66, | 116,67, | 116,68, | 116,69, | 116,70, | 116,71, | 116,72, | 116,73, | 116,74, | 116,75, | 116,76, | 116,77, | 116,78, | 116,79, | 116,80, | 116,81, | 116,82, | 116,83, | 116,84, | 116,85, | 117,1, | 117,2, | 117,3, | 117,4, | 117,5, | 117,6, | 117,7, | 117,8, | 117,9, | 117,10, | 117,11, | 117,12, | 117,13, | 117,14, | 117,15, | 117,16, | 117,17, | 117,18, | 117,19, | 117,20, | 117,21, | 117,22, | 117,23, | 117,24, | 117,25, | 117,26, | 117,27, | 117,28, | 117,29, | 117,30, | 117,31, | 117,32, | 117,33, | 117,34, | 117,35, | 117,36, | 117,37, | 117,38, | 117,39, | 117,40, | 117,41, | 117,42, | 117,43, | 117,44, | 117,45, | 117,46, | 117,47, | 117,48, | 117,49, | 117,50, | 117,51, | 117,52, | 117,53, | 117,54, | 117,55, | 117,56, | 117,57, | 117,58, | 117,59, | 117,60, | 117,61, | 117,62, | 117,63, | 117,64, | 117,65, | 117,66, | 117,67, | 117,68, | 117,69, | 117,70, | 117,71, | 117,72, | 117,73, | 117,74, | 117,75, | 117,76, | 117,77, | 117,78, | 117,79, | 117,80, | 117,81, | 117,82, | 117,83, | 117,84, | 117,85, | 118,1, | 118,2, | 118,3, | 118,4, | 118,5, | 118,6, | 118,7, | 118,8, | 118,9, | 118,10, | 118,11, | 118,12, | 118,13, | 118,14, | 118,15, | 118,16, | 118,17, | 118,18, | 118,19, | 118,20, | 118,21, | 118,22, | 118,23, | 118,24, | 118,25, | 118,26, | 118,27, | 118,28, | 118,29, | 118,30, | 118,31, | 118,32, | 118,33, | 118,34, | 118,35, | 118,36, | 118,37, | 118,38, | 118,39, | 118,40, | 118,41, | 118,42, | 118,43, | 118,44, | 118,45, | 118,46, | 118,47, | 118,48, | 118,49, | 118,50, | 118,51, | 118,52, | 118,53, | 118,54, | 118,55, | 118,56, | 118,57, | 118,58, | 118,59, | 118,60, | 118,61, | 118,62, | 118,63, | 118,64, | 118,65, | 118,66, | 118,67, | 118,68, | 118,69, | 118,70, | 118,71, | 118,72, | 118,73, | 118,74, | 118,75, | 118,76, | 118,77, | 118,78, | 118,79, | 118,80, | 118,81, | 118,82, | 118,83, | 118,84, | 118,85, | 119,1, | 119,2, | 119,3, | 119,4, | 119,5, | 119,6, | 119,7, | 119,8, | 119,9, | 119,10, | 119,11, | 119,12, | 119,13, | 119,14, | 119,15, | 119,16, | 119,17, | 119,18, | 119,19, | 119,20, | 119,21, | 119,22, | 119,23, | 119,24, | 119,25, | 119,26, | 119,27, | 119,28, | 119,29, | 119,30, | 119,31, | 119,32, | 119,33, | 119,34, | 119,35, | 119,36, | 119,37, | 119,38, | 119,39, | 119,40, | 119,41, | 119,42, | 119,43, | 119,44, | 119,45, | 119,46, | 119,47, | 119,48, | 119,49, | 119,50, | 119,51, | 119,52, | 119,53, | 119,54, | 119,55, | 119,56, | 119,57, | 119,58, | 119,59, | 119,60, | 119,61, | 119,62, | 119,63, | 119,64, | 119,65, | 119,66, | 119,67, | 119,68, | 119,69, | 119,70, | 119,71, | 119,72, | 119,73, | 119,74, | 119,75, | 119,76, | 119,77, | 119,78, | 119,79, | 119,80, | 119,81, | 119,82, | 119,83, | 119,84, | 119,85, | 120,1, | 120,2, | 120,3, | 120,4, | 120,5, | 120,6, | 120,7, | 120,8, | 120,9, | 120,10, | 120,11, | 120,12, | 120,13, | 120,14, | 120,15, | 120,16, | 120,17, | 120,18, | 120,19, | 120,20, | 120,21, | 120,22, | 120,23, | 120,24, | 120,25, | 120,26, | 120,27, | 120,28, | 120,29, | 120,30, | 120,31, | 120,32, | 120,33, | 120,34, | 120,35, | 120,36, | 120,37, | 120,38, | 120,39, | 120,40, | 120,41, | 120,42, | 120,43, | 120,44, | 120,45, | 120,46, | 120,47, | 120,48, | 120,49, | 120,50, | 120,51, | 120,52, | 120,53, | 120,54, | 120,55, | 120,56, | 120,57, | 120,58, | 120,59, | 120,60, | 120,61, | 120,62, | 120,63, | 120,64, | 120,65, | 120,66, | 120,67, | 120,68, | 120,69, | 120,70, | 120,71, | 120,72, | 120,73, | 120,74, | 120,75, | 120,76, | 120,77, | 120,78, | 120,79, | 120,80, | 120,81, | 120,82, | 120,83, | 120,84, | 120,85, | 121,1, | 121,2, | 121,3, | 121,4, | 121,5, | 121,6, | 121,7, | 121,8, | 121,9, | 121,10, | 121,11, | 121,12, | 121,13, | 121,14, | 121,15, | 121,16, | 121,17, | 121,18, | 121,19, | 121,20, | 121,21, | 121,22, | 121,23, | 121,24, | 121,25, | 121,26, | 121,27, | 121,28, | 121,29, | 121,30, | 121,31, | 121,32, | 121,33, | 121,34, | 121,35, | 121,36, | 121,37, | 121,38, | 121,39, | 121,40, | 121,41, | 121,42, | 121,43, | 121,44, | 121,45, | 121,46, | 121,47, | 121,48, | 121,49, | 121,50, | 121,51, | 121,52, | 121,53, | 121,54, | 121,55, | 121,56, | 121,57, | 121,58, | 121,59, | 121,60, | 121,61, | 121,62, | 121,63, | 121,64, | 121,65, | 121,66, | 121,67, | 121,68, | 121,69, | 121,70, | 121,71, | 121,72, | 121,73, | 121,74, | 121,75, | 121,76, | 121,77, | 121,78, | 121,79, | 121,80, | 121,81, | 121,82, | 121,83, | 121,84, | 121,85, | 122,1, | 122,2, | 122,3, | 122,4, | 122,5, | 122,6, | 122,7, | 122,8, | 122,9, | 122,10, | 122,11, | 122,12, | 122,13, | 122,14, | 122,15, | 122,16, | 122,17, | 122,18, | 122,19, | 122,20, | 122,21, | 122,22, | 122,23, | 122,24, | 122,25, | 122,26, | 122,27, | 122,28, | 122,29, | 122,30, | 122,31, | 122,32, | 122,33, | 122,34, | 122,35, | 122,36, | 122,37, | 122,38, | 122,39, | 122,40, | 122,41, | 122,42, | 122,43, | 122,44, | 122,45, | 122,46, | 122,47, | 122,48, | 122,49, | 122,50, | 122,51, | 122,52, | 122,53, | 122,54, | 122,55, | 122,56, | 122,57, | 122,58, | 122,59, | 122,60, | 122,61, | 122,62, | 122,63, | 122,64, | 122,65, | 122,66, | 122,67, | 122,68, | 122,69, | 122,70, | 122,71, | 122,72, | 122,73, | 122,74, | 122,75, | 122,76, | 122,77, | 122,78, | 122,79, | 122,80, | 122,81, | 122,82, | 122,83, | 122,84, | 122,85, | 123,1, | 123,2, | 123,3, | 123,4, | 123,5, | 123,6, | 123,7, | 123,8, | 123,9, | 123,10, | 123,11, | 123,12, | 123,13, | 123,14, | 123,15, | 123,16, | 123,17, | 123,18, | 123,19, | 123,20, | 123,21, | 123,22, | 123,23, | 123,24, | 123,25, | 123,26, | 123,27, | 123,28, | 123,29, | 123,30, | 123,31, | 123,32, | 123,33, | 123,34, | 123,35, | 123,36, | 123,37, | 123,38, | 123,39, | 123,40, | 123,41, | 123,42, | 123,43, | 123,44, | 123,45, | 123,46, | 123,47, | 123,48, | 123,49, | 123,50, | 123,51, | 123,52, | 123,53, | 123,54, | 123,55, | 123,56, | 123,57, | 123,58, | 123,59, | 123,60, | 123,61, | 123,62, | 123,63, | 123,64, | 123,65, | 123,66, | 123,67, | 123,68, | 123,69, | 123,70, | 123,71, | 123,72, | 123,73, | 123,74, | 123,75, | 123,76, | 123,77, | 123,78, | 123,79, | 123,80, | 123,81, | 123,82, | 123,83, | 123,84, | 123,85, | 124,1, | 124,2, | 124,3, | 124,4, | 124,5, | 124,6, | 124,7, | 124,8, | 124,9, | 124,10, | 124,11, | 124,12, | 124,13, | 124,14, | 124,15, | 124,16, | 124,17, | 124,18, | 124,19, | 124,20, | 124,21, | 124,22, | 124,23, | 124,24, | 124,25, | 124,26, | 124,27, | 124,28, | 124,29, | 124,30, | 124,31, | 124,32, | 124,33, | 124,34, | 124,35, | 124,36, | 124,37, | 124,38, | 124,39, | 124,40, | 124,41, | 124,42, | 124,43, | 124,44, | 124,45, | 124,46, | 124,47, | 124,48, | 124,49, | 124,50, | 124,51, | 124,52, | 124,53, | 124,54, | 124,55, | 124,56, | 124,57, | 124,58, | 124,59, | 124,60, | 124,61, | 124,62, | 124,63, | 124,64, | 124,65, | 124,66, | 124,67, | 124,68, | 124,69, | 124,70, | 124,71, | 124,72, | 124,73, | 124,74, | 124,75, | 124,76, | 124,77, | 124,78, | 124,79, | 124,80, | 124,81, | 124,82, | 124,83, | 124,84, | 124,85, | 125,1, | 125,2, | 125,3, | 125,4, | 125,5, | 125,6, | 125,7, | 125,8, | 125,9, | 125,10, | 125,11, | 125,12, | 125,13, | 125,14, | 125,15, | 125,16, | 125,17, | 125,18, | 125,19, | 125,20, | 125,21, | 125,22, | 125,23, | 125,24, | 125,25, | 125,26, | 125,27, | 125,28, | 125,29, | 125,30, | 125,31, | 125,32, | 125,33, | 125,34, | 125,35, | 125,36, | 125,37, | 125,38, | 125,39, | 125,40, | 125,41, | 125,42, | 125,43, | 125,44, | 125,45, | 125,46, | 125,47, | 125,48, | 125,49, | 125,50, | 125,51, | 125,52, | 125,53, | 125,54, | 125,55, | 125,56, | 125,57, | 125,58, | 125,59, | 125,60, | 125,61, | 125,62, | 125,63, | 125,64, | 125,65, | 125,66, | 125,67, | 125,68, | 125,69, | 125,70, | 125,71, | 125,72, | 125,73, | 125,74, | 125,75, | 125,76, | 125,77, | 125,78, | 125,79, | 125,80, | 125,81, | 125,82, | 125,83, | 125,84, | 125,85, | 126,1, | 126,2, | 126,3, | 126,4, | 126,5, | 126,6, | 126,7, | 126,8, | 126,9, | 126,10, | 126,11, | 126,12, | 126,13, | 126,14, | 126,15, | 126,16, | 126,17, | 126,18, | 126,19, | 126,20, | 126,21, | 126,22, | 126,23, | 126,24, | 126,25, | 126,26, | 126,27, | 126,28, | 126,29, | 126,30, | 126,31, | 126,32, | 126,33, | 126,34, | 126,35, | 126,36, | 126,37, | 126,38, | 126,39, | 126,40, | 126,41, | 126,42, | 126,43, | 126,44, | 126,45, | 126,46, | 126,47, | 126,48, | 126,49, | 126,50, | 126,51, | 126,52, | 126,53, | 126,54, | 126,55, | 126,56, | 126,57, | 126,58, | 126,59, | 126,60, | 126,61, | 126,62, | 126,63, | 126,64, | 126,65, | 126,66, | 126,67, | 126,68, | 126,69, | 126,70, | 126,71, | 126,72, | 126,73, | 126,74, | 126,75, | 126,76, | 126,77, | 126,78, | 126,79, | 126,80, | 126,81, | 126,82, | 126,83, | 126,84, | 126,85, | 127,1, | 127,2, | 127,3, | 127,4, | 127,5, | 127,6, | 127,7, | 127,8, | 127,9, | 127,10, | 127,11, | 127,12, | 127,13, | 127,14, | 127,15, | 127,16, | 127,17, | 127,18, | 127,19, | 127,20, | 127,21, | 127,22, | 127,23, | 127,24, | 127,25, | 127,26, | 127,27, | 127,28, | 127,29, | 127,30, | 127,31, | 127,32, | 127,33, | 127,34, | 127,35, | 127,36, | 127,37, | 127,38, | 127,39, | 127,40, | 127,41, | 127,42, | 127,43, | 127,44, | 127,45, | 127,46, | 127,47, | 127,48, | 127,49, | 127,50, | 127,51, | 127,52, | 127,53, | 127,54, | 127,55, | 127,56, | 127,57, | 127,58, | 127,59, | 127,60, | 127,61, | 127,62, | 127,63, | 127,64, | 127,65, | 127,66, | 127,67, | 127,68, | 127,69, | 127,70, | 127,71, | 127,72, | 127,73, | 127,74, | 127,75, | 127,76, | 127,77, | 127,78, | 127,79, | 127,80, | 127,81, | 127,82, | 127,83, | 127,84, | 127,85, | 128,1, | 128,2, | 128,3, | 128,4, | 128,5, | 128,6, | 128,7, | 128,8, | 128,9, | 128,10, | 128,11, | 128,12, | 128,13, | 128,14, | 128,15, | 128,16, | 128,17, | 128,18, | 128,19, | 128,20, | 128,21, | 128,22, | 128,23, | 128,24, | 128,25, | 128,26, | 128,27, | 128,28, | 128,29, | 128,30, | 128,31, | 128,32, | 128,33, | 128,34, | 128,35, | 128,36, | 128,37, | 128,38, | 128,39, | 128,40, | 128,41, | 128,42, | 128,43, | 128,44, | 128,45, | 128,46, | 128,47, | 128,48, | 128,49, | 128,50, | 128,51, | 128,52, | 128,53, | 128,54, | 128,55, | 128,56, | 128,57, | 128,58, | 128,59, | 128,60, | 128,61, | 128,62, | 128,63, | 128,64, | 128,65, | 128,66, | 128,67, | 128,68, | 128,69, | 128,70, | 128,71, | 128,72, | 128,73, | 128,74, | 128,75, | 128,76, | 128,77, | 128,78, | 128,79, | 128,80, | 128,81, | 128,82, | 128,83, | 128,84, | 128,85, | 129,1, | 129,2, | 129,3, | 129,4, | 129,5, | 129,6, | 129,7, | 129,8, | 129,9, | 129,10, | 129,11, | 129,12, | 129,13, | 129,14, | 129,15, | 129,16, | 129,17, | 129,18, | 129,19, | 129,20, | 129,21, | 129,22, | 129,23, | 129,24, | 129,25, | 129,26, | 129,27, | 129,28, | 129,29, | 129,30, | 129,31, | 129,32, | 129,33, | 129,34, | 129,35, | 129,36, | 129,37, | 129,38, | 129,39, | 129,40, | 129,41, | 129,42, | 129,43, | 129,44, | 129,45, | 129,46, | 129,47, | 129,48, | 129,49, | 129,50, | 129,51, | 129,52, | 129,53, | 129,54, | 129,55, | 129,56, | 129,57, | 129,58, | 129,59, | 129,60, | 129,61, | 129,62, | 129,63, | 129,64, | 129,65, | 129,66, | 129,67, | 129,68, | 129,69, | 129,70, | 129,71, | 129,72, | 129,73, | 129,74, | 129,75, | 129,76, | 129,77, | 129,78, | 129,79, | 129,80, | 129,81, | 129,82, | 129,83, | 129,84, | 129,85, | 130,1, | 130,2, | 130,3, | 130,4, | 130,5, | 130,6, | 130,7, | 130,8, | 130,9, | 130,10, | 130,11, | 130,12, | 130,13, | 130,14, | 130,15, | 130,16, | 130,17, | 130,18, | 130,19, | 130,20, | 130,21, | 130,22, | 130,23, | 130,24, | 130,25, | 130,26, | 130,27, | 130,28, | 130,29, | 130,30, | 130,31, | 130,32, | 130,33, | 130,34, | 130,35, | 130,36, | 130,37, | 130,38, | 130,39, | 130,40, | 130,41, | 130,42, | 130,43, | 130,44, | 130,45, | 130,46, | 130,47, | 130,48, | 130,49, | 130,50, | 130,51, | 130,52, | 130,53, | 130,54, | 130,55, | 130,56, | 130,57, | 130,58, | 130,59, | 130,60, | 130,61, | 130,62, | 130,63, | 130,64, | 130,65, | 130,66, | 130,67, | 130,68, | 130,69, | 130,70, | 130,71, | 130,72, | 130,73, | 130,74, | 130,75, | 130,76, | 130,77, | 130,78, | 130,79, | 130,80, | 130,81, | 130,82, | 130,83, | 130,84, | 130,85, | 131,1, | 131,2, | 131,3, | 131,4, | 131,5, | 131,6, | 131,7, | 131,8, | 131,9, | 131,10, | 131,11, | 131,12, | 131,13, | 131,14, | 131,15, | 131,16, | 131,17, | 131,18, | 131,19, | 131,20, | 131,21, | 131,22, | 131,23, | 131,24, | 131,25, | 131,26, | 131,27, | 131,28, | 131,29, | 131,30, | 131,31, | 131,32, | 131,33, | 131,34, | 131,35, | 131,36, | 131,37, | 131,38, | 131,39, | 131,40, | 131,41, | 131,42, | 131,43, | 131,44, | 131,45, | 131,46, | 131,47, | 131,48, | 131,49, | 131,50, | 131,51, | 131,52, | 131,53, | 131,54, | 131,55, | 131,56, | 131,57, | 131,58, | 131,59, | 131,60, | 131,61, | 131,62, | 131,63, | 131,64, | 131,65, | 131,66, | 131,67, | 131,68, | 131,69, | 131,70, | 131,71, | 131,72, | 131,73, | 131,74, | 131,75, | 131,76, | 131,77, | 131,78, | 131,79, | 131,80, | 131,81, | 131,82, | 131,83, | 131,84, | 131,85, | 132,1, | 132,2, | 132,3, | 132,4, | 132,5, | 132,6, | 132,7, | 132,8, | 132,9, | 132,10, | 132,11, | 132,12, | 132,13, | 132,14, | 132,15, | 132,16, | 132,17, | 132,18, | 132,19, | 132,20, | 132,21, | 132,22, | 132,23, | 132,24, | 132,25, | 132,26, | 132,27, | 132,28, | 132,29, | 132,30, | 132,31, | 132,32, | 132,33, | 132,34, | 132,35, | 132,36, | 132,37, | 132,38, | 132,39, | 132,40, | 132,41, | 132,42, | 132,43, | 132,44, | 132,45, | 132,46, | 132,47, | 132,48, | 132,49, | 132,50, | 132,51, | 132,52, | 132,53, | 132,54, | 132,55, | 132,56, | 132,57, | 132,58, | 132,59, | 132,60, | 132,61, | 132,62, | 132,63, | 132,64, | 132,65, | 132,66, | 132,67, | 132,68, | 132,69, | 132,70, | 132,71, | 132,72, | 132,73, | 132,74, | 132,75, | 132,76, | 132,77, | 132,78, | 132,79, | 132,80, | 132,81, | 132,82, | 132,83, | 132,84, | 132,85, | 133,1, | 133,2, | 133,3, | 133,4, | 133,5, | 133,6, | 133,7, | 133,8, | 133,9, | 133,10, | 133,11, | 133,12, | 133,13, | 133,14, | 133,15, | 133,16, | 133,17, | 133,18, | 133,19, | 133,20, | 133,21, | 133,22, | 133,23, | 133,24, | 133,25, | 133,26, | 133,27, | 133,28, | 133,29, | 133,30, | 133,31, | 133,32, | 133,33, | 133,34, | 133,35, | 133,36, | 133,37, | 133,38, | 133,39, | 133,40, | 133,41, | 133,42, | 133,43, | 133,44, | 133,45, | 133,46, | 133,47, | 133,48, | 133,49, | 133,50, | 133,51, | 133,52, | 133,53, | 133,54, | 133,55, | 133,56, | 133,57, | 133,58, | 133,59, | 133,60, | 133,61, | 133,62, | 133,63, | 133,64, | 133,65, | 133,66, | 133,67, | 133,68, | 133,69, | 133,70, | 133,71, | 133,72, | 133,73, | 133,74, | 133,75, | 133,76, | 133,77, | 133,78, | 133,79, | 133,80, | 133,81, | 133,82, | 133,83, | 133,84, | 133,85, | 134,1, | 134,2, | 134,3, | 134,4, | 134,5, | 134,6, | 134,7, | 134,8, | 134,9, | 134,10, | 134,11, | 134,12, | 134,13, | 134,14, | 134,15, | 134,16, | 134,17, | 134,18, | 134,19, | 134,20, | 134,21, | 134,22, | 134,23, | 134,24, | 134,25, | 134,26, | 134,27, | 134,28, | 134,29, | 134,30, | 134,31, | 134,32, | 134,33, | 134,34, | 134,35, | 134,36, | 134,37, | 134,38, | 134,39, | 134,40, | 134,41, | 134,42, | 134,43, | 134,44, | 134,45, | 134,46, | 134,47, | 134,48, | 134,49, | 134,50, | 134,51, | 134,52, | 134,53, | 134,54, | 134,55, | 134,56, | 134,57, | 134,58, | 134,59, | 134,60, | 134,61, | 134,62, | 134,63, | 134,64, | 134,65, | 134,66, | 134,67, | 134,68, | 134,69, | 134,70, | 134,71, | 134,72, | 134,73, | 134,74, | 134,75, | 134,76, | 134,77, | 134,78, | 134,79, | 134,80, | 134,81, | 134,82, | 134,83, | 134,84, | 134,85, | 135,1, | 135,2, | 135,3, | 135,4, | 135,5, | 135,6, | 135,7, | 135,8, | 135,9, | 135,10, | 135,11, | 135,12, | 135,13, | 135,14, | 135,15, | 135,16, | 135,17, | 135,18, | 135,19, | 135,20, | 135,21, | 135,22, | 135,23, | 135,24, | 135,25, | 135,26, | 135,27, | 135,28, | 135,29, | 135,30, | 135,31, | 135,32, | 135,33, | 135,34, | 135,35, | 135,36, | 135,37, | 135,38, | 135,39, | 135,40, | 135,41, | 135,42, | 135,43, | 135,44, | 135,45, | 135,46, | 135,47, | 135,48, | 135,49, | 135,50, | 135,51, | 135,52, | 135,53, | 135,54, | 135,55, | 135,56, | 135,57, | 135,58, | 135,59, | 135,60, | 135,61, | 135,62, | 135,63, | 135,64, | 135,65, | 135,66, | 135,67, | 135,68, | 135,69, | 135,70, | 135,71, | 135,72, | 135,73, | 135,74, | 135,75, | 135,76, | 135,77, | 135,78, | 135,79, | 135,80, | 135,81, | 135,82, | 135,83, | 135,84, | 135,85, | 136,1, | 136,2, | 136,3, | 136,4, | 136,5, | 136,6, | 136,7, | 136,8, | 136,9, | 136,10, | 136,11, | 136,12, | 136,13, | 136,14, | 136,15, | 136,16, | 136,17, | 136,18, | 136,19, | 136,20, | 136,21, | 136,22, | 136,23, | 136,24, | 136,25, | 136,26, | 136,27, | 136,28, | 136,29, | 136,30, | 136,31, | 136,32, | 136,33, | 136,34, | 136,35, | 136,36, | 136,37, | 136,38, | 136,39, | 136,40, | 136,41, | 136,42, | 136,43, | 136,44, | 136,45, | 136,46, | 136,47, | 136,48, | 136,49, | 136,50, | 136,51, | 136,52, | 136,53, | 136,54, | 136,55, | 136,56, | 136,57, | 136,58, | 136,59, | 136,60, | 136,61, | 136,62, | 136,63, | 136,64, | 136,65, | 136,66, | 136,67, | 136,68, | 136,69, | 136,70, | 136,71, | 136,72, | 136,73, | 136,74, | 136,75, | 136,76, | 136,77, | 136,78, | 136,79, | 136,80, | 136,81, | 136,82, | 136,83, | 136,84, | 136,85, | 137,1, | 137,2, | 137,3, | 137,4, | 137,5, | 137,6, | 137,7, | 137,8, | 137,9, | 137,10, | 137,11, | 137,12, | 137,13, | 137,14, | 137,15, | 137,16, | 137,17, | 137,18, | 137,19, | 137,20, | 137,21, | 137,22, | 137,23, | 137,24, | 137,25, | 137,26, | 137,27, | 137,28, | 137,29, | 137,30, | 137,31, | 137,32, | 137,33, | 137,34, | 137,35, | 137,36, | 137,37, | 137,38, | 137,39, | 137,40, | 137,41, | 137,42, | 137,43, | 137,44, | 137,45, | 137,46, | 137,47, | 137,48, | 137,49, | 137,50, | 137,51, | 137,52, | 137,53, | 137,54, | 137,55, | 137,56, | 137,57, | 137,58, | 137,59, | 137,60, | 137,61, | 137,62, | 137,63, | 137,64, | 137,65, | 137,66, | 137,67, | 137,68, | 137,69, | 137,70, | 137,71, | 137,72, | 137,73, | 137,74, | 137,75, | 137,76, | 137,77, | 137,78, | 137,79, | 137,80, | 137,81, | 137,82, | 137,83, | 137,84, | 137,85, | 138,1, | 138,2, | 138,3, | 138,4, | 138,5, | 138,6, | 138,7, | 138,8, | 138,9, | 138,10, | 138,11, | 138,12, | 138,13, | 138,14, | 138,15, | 138,16, | 138,17, | 138,18, | 138,19, | 138,20, | 138,21, | 138,22, | 138,23, | 138,24, | 138,25, | 138,26, | 138,27, | 138,28, | 138,29, | 138,30, | 138,31, | 138,32, | 138,33, | 138,34, | 138,35, | 138,36, | 138,37, | 138,38, | 138,39, | 138,40, | 138,41, | 138,42, | 138,43, | 138,44, | 138,45, | 138,46, | 138,47, | 138,48, | 138,49, | 138,50, | 138,51, | 138,52, | 138,53, | 138,54, | 138,55, | 138,56, | 138,57, | 138,58, | 138,59, | 138,60, | 138,61, | 138,62, | 138,63, | 138,64, | 138,65, | 138,66, | 138,67, | 138,68, | 138,69, | 138,70, | 138,71, | 138,72, | 138,73, | 138,74, | 138,75, | 138,76, | 138,77, | 138,78, | 138,79, | 138,80, | 138,81, | 138,82, | 138,83, | 138,84, | 138,85, | 139,1, | 139,2, | 139,3, | 139,4, | 139,5, | 139,6, | 139,7, | 139,8, | 139,9, | 139,10, | 139,11, | 139,12, | 139,13, | 139,14, | 139,15, | 139,16, | 139,17, | 139,18, | 139,19, | 139,20, | 139,21, | 139,22, | 139,23, | 139,24, | 139,25, | 139,26, | 139,27, | 139,28, | 139,29, | 139,30, | 139,31, | 139,32, | 139,33, | 139,34, | 139,35, | 139,36, | 139,37, | 139,38, | 139,39, | 139,40, | 139,41, | 139,42, | 139,43, | 139,44, | 139,45, | 139,46, | 139,47, | 139,48, | 139,49, | 139,50, | 139,51, | 139,52, | 139,53, | 139,54, | 139,55, | 139,56, | 139,57, | 139,58, | 139,59, | 139,60, | 139,61, | 139,62, | 139,63, | 139,64, | 139,65, | 139,66, | 139,67, | 139,68, | 139,69, | 139,70, | 139,71, | 139,72, | 139,73, | 139,74, | 139,75, | 139,76, | 139,77, | 139,78, | 139,79, | 139,80, | 139,81, | 139,82, | 139,83, | 139,84, | 139,85, | 140,1, | 140,2, | 140,3, | 140,4, | 140,5, | 140,6, | 140,7, | 140,8, | 140,9, | 140,10, | 140,11, | 140,12, | 140,13, | 140,14, | 140,15, | 140,16, | 140,17, | 140,18, | 140,19, | 140,20, | 140,21, | 140,22, | 140,23, | 140,24, | 140,25, | 140,26, | 140,27, | 140,28, | 140,29, | 140,30, | 140,31, | 140,32, | 140,33, | 140,34, | 140,35, | 140,36, | 140,37, | 140,38, | 140,39, | 140,40, | 140,41, | 140,42, | 140,43, | 140,44, | 140,45, | 140,46, | 140,47, | 140,48, | 140,49, | 140,50, | 140,51, | 140,52, | 140,53, | 140,54, | 140,55, | 140,56, | 140,57, | 140,58, | 140,59, | 140,60, | 140,61, | 140,62, | 140,63, | 140,64, | 140,65, | 140,66, | 140,67, | 140,68, | 140,69, | 140,70, | 140,71, | 140,72, | 140,73, | 140,74, | 140,75, | 140,76, | 140,77, | 140,78, | 140,79, | 140,80, | 140,81, | 140,82, | 140,83, | 140,84, | 140,85, | 141,1, | 141,2, | 141,3, | 141,4, | 141,5, | 141,6, | 141,7, | 141,8, | 141,9, | 141,10, | 141,11, | 141,12, | 141,13, | 141,14, | 141,15, | 141,16, | 141,17, | 141,18, | 141,19, | 141,20, | 141,21, | 141,22, | 141,23, | 141,24, | 141,25, | 141,26, | 141,27, | 141,28, | 141,29, | 141,30, | 141,31, | 141,32, | 141,33, | 141,34, | 141,35, | 141,36, | 141,37, | 141,38, | 141,39, | 141,40, | 141,41, | 141,42, | 141,43, | 141,44, | 141,45, | 141,46, | 141,47, | 141,48, | 141,49, | 141,50, | 141,51, | 141,52, | 141,53, | 141,54, | 141,55, | 141,56, | 141,57, | 141,58, | 141,59, | 141,60, | 141,61, | 141,62, | 141,63, | 141,64, | 141,65, | 141,66, | 141,67, | 141,68, | 141,69, | 141,70, | 141,71, | 141,72, | 141,73, | 141,74, | 141,75, | 141,76, | 141,77, | 141,78, | 141,79, | 141,80, | 141,81, | 141,82, | 141,83, | 141,84, | 141,85, | 142,1, | 142,2, | 142,3, | 142,4, | 142,5, | 142,6, | 142,7, | 142,8, | 142,9, | 142,10, | 142,11, | 142,12, | 142,13, | 142,14, | 142,15, | 142,16, | 142,17, | 142,18, | 142,19, | 142,20, | 142,21, | 142,22, | 142,23, | 142,24, | 142,25, | 142,26, | 142,27, | 142,28, | 142,29, | 142,30, | 142,31, | 142,32, | 142,33, | 142,34, | 142,35, | 142,36, | 142,37, | 142,38, | 142,39, | 142,40, | 142,41, | 142,42, | 142,43, | 142,44, | 142,45, | 142,46, | 142,47, | 142,48, | 142,49, | 142,50, | 142,51, | 142,52, | 142,53, | 142,54, | 142,55, | 142,56, | 142,57, | 142,58, | 142,59, | 142,60, | 142,61, | 142,62, | 142,63, | 142,64, | 142,65, | 142,66, | 142,67, | 142,68, | 142,69, | 142,70, | 142,71, | 142,72, | 142,73, | 142,74, | 142,75, | 142,76, | 142,77, | 142,78, | 142,79, | 142,80, | 142,81, | 142,82, | 142,83, | 142,84, | 142,85, | 143,1, | 143,2, | 143,3, | 143,4, | 143,5, | 143,6, | 143,7, | 143,8, | 143,9, | 143,10, | 143,11, | 143,12, | 143,13, | 143,14, | 143,15, | 143,16, | 143,17, | 143,18, | 143,19, | 143,20, | 143,21, | 143,22, | 143,23, | 143,24, | 143,25, | 143,26, | 143,27, | 143,28, | 143,29, | 143,30, | 143,31, | 143,32, | 143,33, | 143,34, | 143,35, | 143,36, | 143,37, | 143,38, | 143,39, | 143,40, | 143,41, | 143,42, | 143,43, | 143,44, | 143,45, | 143,46, | 143,47, | 143,48, | 143,49, | 143,50, | 143,51, | 143,52, | 143,53, | 143,54, | 143,55, | 143,56, | 143,57, | 143,58, | 143,59, | 143,60, | 143,61, | 143,62, | 143,63, | 143,64, | 143,65, | 143,66, | 143,67, | 143,68, | 143,69, | 143,70, | 143,71, | 143,72, | 143,73, | 143,74, | 143,75, | 143,76, | 143,77, | 143,78, | 143,79, | 143,80, | 143,81, | 143,82, | 143,83, | 143,84, | 143,85, | 144,1, | 144,2, | 144,3, | 144,4, | 144,5, | 144,6, | 144,7, | 144,8, | 144,9, | 144,10, | 144,11, | 144,12, | 144,13, | 144,14, | 144,15, | 144,16, | 144,17, | 144,18, | 144,19, | 144,20, | 144,21, | 144,22, | 144,23, | 144,24, | 144,25, | 144,26, | 144,27, | 144,28, | 144,29, | 144,30, | 144,31, | 144,32, | 144,33, | 144,34, | 144,35, | 144,36, | 144,37, | 144,38, | 144,39, | 144,40, | 144,41, | 144,42, | 144,43, | 144,44, | 144,45, | 144,46, | 144,47, | 144,48, | 144,49, | 144,50, | 144,51, | 144,52, | 144,53, | 144,54, | 144,55, | 144,56, | 144,57, | 144,58, | 144,59, | 144,60, | 144,61, | 144,62, | 144,63, | 144,64, | 144,65, | 144,66, | 144,67, | 144,68, | 144,69, | 144,70, | 144,71, | 144,72, | 144,73, | 144,74, | 144,75, | 144,76, | 144,77, | 144,78, | 144,79, | 144,80, | 144,81, | 144,82, | 144,83, | 144,84, | 144,85, | 145,1, | 145,2, | 145,3, | 145,4, | 145,5, | 145,6, | 145,7, | 145,8, | 145,9, | 145,10, | 145,11, | 145,12, | 145,13, | 145,14, | 145,15, | 145,16, | 145,17, | 145,18, | 145,19, | 145,20, | 145,21, | 145,22, | 145,23, | 145,24, | 145,25, | 145,26, | 145,27, | 145,28, | 145,29, | 145,30, | 145,31, | 145,32, | 145,33, | 145,34, | 145,35, | 145,36, | 145,37, | 145,38, | 145,39, | 145,40, | 145,41, | 145,42, | 145,43, | 145,44, | 145,45, | 145,46, | 145,47, | 145,48, | 145,49, | 145,50, | 145,51, | 145,52, | 145,53, | 145,54, | 145,55, | 145,56, | 145,57, | 145,58, | 145,59, | 145,60, | 145,61, | 145,62, | 145,63, | 145,64, | 145,65, | 145,66, | 145,67, | 145,68, | 145,69, | 145,70, | 145,71, | 145,72, | 145,73, | 145,74, | 145,75, | 145,76, | 145,77, | 145,78, | 145,79, | 145,80, | 145,81, | 145,82, | 145,83, | 145,84, | 145,85, | 146,1, | 146,2, | 146,3, | 146,4, | 146,5, | 146,6, | 146,7, | 146,8, | 146,9, | 146,10, | 146,11, | 146,12, | 146,13, | 146,14, | 146,15, | 146,16, | 146,17, | 146,18, | 146,19, | 146,20, | 146,21, | 146,22, | 146,23, | 146,24, | 146,25, | 146,26, | 146,27, | 146,28, | 146,29, | 146,30, | 146,31, | 146,32, | 146,33, | 146,34, | 146,35, | 146,36, | 146,37, | 146,38, | 146,39, | 146,40, | 146,41, | 146,42, | 146,43, | 146,44, | 146,45, | 146,46, | 146,47, | 146,48, | 146,49, | 146,50, | 146,51, | 146,52, | 146,53, | 146,54, | 146,55, | 146,56, | 146,57, | 146,58, | 146,59, | 146,60, | 146,61, | 146,62, | 146,63, | 146,64, | 146,65, | 146,66, | 146,67, | 146,68, | 146,69, | 146,70, | 146,71, | 146,72, | 146,73, | 146,74, | 146,75, | 146,76, | 146,77, | 146,78, | 146,79, | 146,80, | 146,81, | 146,82, | 146,83, | 146,84, | 146,85, | 147,1, | 147,2, | 147,3, | 147,4, | 147,5, | 147,6, | 147,7, | 147,8, | 147,9, | 147,10, | 147,11, | 147,12, | 147,13, | 147,14, | 147,15, | 147,16, | 147,17, | 147,18, | 147,19, | 147,20, | 147,21, | 147,22, | 147,23, | 147,24, | 147,25, | 147,26, | 147,27, | 147,28, | 147,29, | 147,30, | 147,31, | 147,32, | 147,33, | 147,34, | 147,35, | 147,36, | 147,37, | 147,38, | 147,39, | 147,40, | 147,41, | 147,42, | 147,43, | 147,44, | 147,45, | 147,46, | 147,47, | 147,48, | 147,49, | 147,50, | 147,51, | 147,52, | 147,53, | 147,54, | 147,55, | 147,56, | 147,57, | 147,58, | 147,59, | 147,60, | 147,61, | 147,62, | 147,63, | 147,64, | 147,65, | 147,66, | 147,67, | 147,68, | 147,69, | 147,70, | 147,71, | 147,72, | 147,73, | 147,74, | 147,75, | 147,76, | 147,77, | 147,78, | 147,79, | 147,80, | 147,81, | 147,82, | 147,83, | 147,84, | 147,85, | 148,1, | 148,2, | 148,3, | 148,4, | 148,5, | 148,6, | 148,7, | 148,8, | 148,9, | 148,10, | 148,11, | 148,12, | 148,13, | 148,14, | 148,15, | 148,16, | 148,17, | 148,18, | 148,19, | 148,20, | 148,21, | 148,22, | 148,23, | 148,24, | 148,25, | 148,26, | 148,27, | 148,28, | 148,29, | 148,30, | 148,31, | 148,32, | 148,33, | 148,34, | 148,35, | 148,36, | 148,37, | 148,38, | 148,39, | 148,40, | 148,41, | 148,42, | 148,43, | 148,44, | 148,45, | 148,46, | 148,47, | 148,48, | 148,49, | 148,50, | 148,51, | 148,52, | 148,53, | 148,54, | 148,55, | 148,56, | 148,57, | 148,58, | 148,59, | 148,60, | 148,61, | 148,62, | 148,63, | 148,64, | 148,65, | 148,66, | 148,67, | 148,68, | 148,69, | 148,70, | 148,71, | 148,72, | 148,73, | 148,74, | 148,75, | 148,76, | 148,77, | 148,78, | 148,79, | 148,80, | 148,81, | 148,82, | 148,83, | 148,84, | 148,85, | 149,1, | 149,2, | 149,3, | 149,4, | 149,5, | 149,6, | 149,7, | 149,8, | 149,9, | 149,10, | 149,11, | 149,12, | 149,13, | 149,14, | 149,15, | 149,16, | 149,17, | 149,18, | 149,19, | 149,20, | 149,21, | 149,22, | 149,23, | 149,24, | 149,25, | 149,26, | 149,27, | 149,28, | 149,29, | 149,30, | 149,31, | 149,32, | 149,33, | 149,34, | 149,35, | 149,36, | 149,37, | 149,38, | 149,39, | 149,40, | 149,41, | 149,42, | 149,43, | 149,44, | 149,45, | 149,46, | 149,47, | 149,48, | 149,49, | 149,50, | 149,51, | 149,52, | 149,53, | 149,54, | 149,55, | 149,56, | 149,57, | 149,58, | 149,59, | 149,60, | 149,61, | 149,62, | 149,63, | 149,64, | 149,65, | 149,66, | 149,67, | 149,68, | 149,69, | 149,70, | 149,71, | 149,72, | 149,73, | 149,74, | 149,75, | 149,76, | 149,77, | 149,78, | 149,79, | 149,80, | 149,81, | 149,82, | 149,83, | 149,84, | 149,85, | 150,1, | 150,2, | 150,3, | 150,4, | 150,5, | 150,6, | 150,7, | 150,8, | 150,9, | 150,10, | 150,11, | 150,12, | 150,13, | 150,14, | 150,15, | 150,16, | 150,17, | 150,18, | 150,19, | 150,20, | 150,21, | 150,22, | 150,23, | 150,24, | 150,25, | 150,26, | 150,27, | 150,28, | 150,29, | 150,30, | 150,31, | 150,32, | 150,33, | 150,34, | 150,35, | 150,36, | 150,37, | 150,38, | 150,39, | 150,40, | 150,41, | 150,42, | 150,43, | 150,44, | 150,45, | 150,46, | 150,47, | 150,48, | 150,49, | 150,50, | 150,51, | 150,52, | 150,53, | 150,54, | 150,55, | 150,56, | 150,57, | 150,58, | 150,59, | 150,60, | 150,61, | 150,62, | 150,63, | 150,64, | 150,65, | 150,66, | 150,67, | 150,68, | 150,69, | 150,70, | 150,71, | 150,72, | 150,73, | 150,74, | 150,75, | 150,76, | 150,77, | 150,78, | 150,79, | 150,80, | 150,81, | 150,82, | 150,83, | 150,84, | 150,85, | 151,1, | 151,2, | 151,3, | 151,4, | 151,5, | 151,6, | 151,7, | 151,8, | 151,9, | 151,10, | 151,11, | 151,12, | 151,13, | 151,14, | 151,15, | 151,16, | 151,17, | 151,18, | 151,19, | 151,20, | 151,21, | 151,22, | 151,23, | 151,24, | 151,25, | 151,26, | 151,27, | 151,28, | 151,29, | 151,30, | 151,31, | 151,32, | 151,33, | 151,34, | 151,35, | 151,36, | 151,37, | 151,38, | 151,39, | 151,40, | 151,41, | 151,42, | 151,43, | 151,44, | 151,45, | 151,46, | 151,47, | 151,48, | 151,49, | 151,50, | 151,51, | 151,52, | 151,53, | 151,54, | 151,55, | 151,56, | 151,57, | 151,58, | 151,59, | 151,60, | 151,61, | 151,62, | 151,63, | 151,64, | 151,65, | 151,66, | 151,67, | 151,68, | 151,69, | 151,70, | 151,71, | 151,72, | 151,73, | 151,74, | 151,75, | 151,76, | 151,77, | 151,78, | 151,79, | 151,80, | 151,81, | 151,82, | 151,83, | 151,84, | 151,85, | 152,1, | 152,2, | 152,3, | 152,4, | 152,5, | 152,6, | 152,7, | 152,8, | 152,9, | 152,10, | 152,11, | 152,12, | 152,13, | 152,14, | 152,15, | 152,16, | 152,17, | 152,18, | 152,19, | 152,20, | 152,21, | 152,22, | 152,23, | 152,24, | 152,25, | 152,26, | 152,27, | 152,28, | 152,29, | 152,30, | 152,31, | 152,32, | 152,33, | 152,34, | 152,35, | 152,36, | 152,37, | 152,38, | 152,39, | 152,40, | 152,41, | 152,42, | 152,43, | 152,44, | 152,45, | 152,46, | 152,47, | 152,48, | 152,49, | 152,50, | 152,51, | 152,52, | 152,53, | 152,54, | 152,55, | 152,56, | 152,57, | 152,58, | 152,59, | 152,60, | 152,61, | 152,62, | 152,63, | 152,64, | 152,65, | 152,66, | 152,67, | 152,68, | 152,69, | 152,70, | 152,71, | 152,72, | 152,73, | 152,74, | 152,75, | 152,76, | 152,77, | 152,78, | 152,79, | 152,80, | 152,81, | 152,82, | 152,83, | 152,84, | 152,85, | 153,1, | 153,2, | 153,3, | 153,4, | 153,5, | 153,6, | 153,7, | 153,8, | 153,9, | 153,10, | 153,11, | 153,12, | 153,13, | 153,14, | 153,15, | 153,16, | 153,17, | 153,18, | 153,19, | 153,20, | 153,21, | 153,22, | 153,23, | 153,24, | 153,25, | 153,26, | 153,27, | 153,28, | 153,29, | 153,30, | 153,31, | 153,32, | 153,33, | 153,34, | 153,35, | 153,36, | 153,37, | 153,38, | 153,39, | 153,40, | 153,41, | 153,42, | 153,43, | 153,44, | 153,45, | 153,46, | 153,47, | 153,48, | 153,49, | 153,50, | 153,51, | 153,52, | 153,53, | 153,54, | 153,55, | 153,56, | 153,57, | 153,58, | 153,59, | 153,60, | 153,61, | 153,62, | 153,63, | 153,64, | 153,65, | 153,66, | 153,67, | 153,68, | 153,69, | 153,70, | 153,71, | 153,72, | 153,73, | 153,74, | 153,75, | 153,76, | 153,77, | 153,78, | 153,79, | 153,80, | 153,81, | 153,82, | 153,83, | 153,84, | 153,85, | 154,1, | 154,2, | 154,3, | 154,4, | 154,5, | 154,6, | 154,7, | 154,8, | 154,9, | 154,10, | 154,11, | 154,12, | 154,13, | 154,14, | 154,15, | 154,16, | 154,17, | 154,18, | 154,19, | 154,20, | 154,21, | 154,22, | 154,23, | 154,24, | 154,25, | 154,26, | 154,27, | 154,28, | 154,29, | 154,30, | 154,31, | 154,32, | 154,33, | 154,34, | 154,35, | 154,36, | 154,37, | 154,38, | 154,39, | 154,40, | 154,41, | 154,42, | 154,43, | 154,44, | 154,45, | 154,46, | 154,47, | 154,48, | 154,49, | 154,50, | 154,51, | 154,52, | 154,53, | 154,54, | 154,55, | 154,56, | 154,57, | 154,58, | 154,59, | 154,60, | 154,61, | 154,62, | 154,63, | 154,64, | 154,65, | 154,66, | 154,67, | 154,68, | 154,69, | 154,70, | 154,71, | 154,72, | 154,73, | 154,74, | 154,75, | 154,76, | 154,77, | 154,78, | 154,79, | 154,80, | 154,81, | 154,82, | 154,83, | 154,84, | 154,85, | 155,1, | 155,2, | 155,3, | 155,4, | 155,5, | 155,6, | 155,7, | 155,8, | 155,9, | 155,10, | 155,11, | 155,12, | 155,13, | 155,14, | 155,15, | 155,16, | 155,17, | 155,18, | 155,19, | 155,20, | 155,21, | 155,22, | 155,23, | 155,24, | 155,25, | 155,26, | 155,27, | 155,28, | 155,29, | 155,30, | 155,31, | 155,32, | 155,33, | 155,34, | 155,35, | 155,36, | 155,37, | 155,38, | 155,39, | 155,40, | 155,41, | 155,42, | 155,43, | 155,44, | 155,45, | 155,46, | 155,47, | 155,48, | 155,49, | 155,50, | 155,51, | 155,52, | 155,53, | 155,54, | 155,55, | 155,56, | 155,57, | 155,58, | 155,59, | 155,60, | 155,61, | 155,62, | 155,63, | 155,64, | 155,65, | 155,66, | 155,67, | 155,68, | 155,69, | 155,70, | 155,71, | 155,72, | 155,73, | 155,74, | 155,75, | 155,76, | 155,77, | 155,78, | 155,79, | 155,80, | 155,81, | 155,82, | 155,83, | 155,84, | 155,85, | 156,1, | 156,2, | 156,3, | 156,4, | 156,5, | 156,6, | 156,7, | 156,8, | 156,9, | 156,10, | 156,11, | 156,12, | 156,13, | 156,14, | 156,15, | 156,16, | 156,17, | 156,18, | 156,19, | 156,20, | 156,21, | 156,22, | 156,23, | 156,24, | 156,25, | 156,26, | 156,27, | 156,28, | 156,29, | 156,30, | 156,31, | 156,32, | 156,33, | 156,34, | 156,35, | 156,36, | 156,37, | 156,38, | 156,39, | 156,40, | 156,41, | 156,42, | 156,43, | 156,44, | 156,45, | 156,46, | 156,47, | 156,48, | 156,49, | 156,50, | 156,51, | 156,52, | 156,53, | 156,54, | 156,55, | 156,56, | 156,57, | 156,58, | 156,59, | 156,60, | 156,61, | 156,62, | 156,63, | 156,64, | 156,65, | 156,66, | 156,67, | 156,68, | 156,69, | 156,70, | 156,71, | 156,72, | 156,73, | 156,74, | 156,75, | 156,76, | 156,77, | 156,78, | 156,79, | 156,80, | 156,81, | 156,82, | 156,83, | 156,84, | 156,85, | 157,1, | 157,2, | 157,3, | 157,4, | 157,5, | 157,6, | 157,7, | 157,8, | 157,9, | 157,10, | 157,11, | 157,12, | 157,13, | 157,14, | 157,15, | 157,16, | 157,17, | 157,18, | 157,19, | 157,20, | 157,21, | 157,22, | 157,23, | 157,24, | 157,25, | 157,26, | 157,27, | 157,28, | 157,29, | 157,30, | 157,31, | 157,32, | 157,33, | 157,34, | 157,35, | 157,36, | 157,37, | 157,38, | 157,39, | 157,40, | 157,41, | 157,42, | 157,43, | 157,44, | 157,45, | 157,46, | 157,47, | 157,48, | 157,49, | 157,50, | 157,51, | 157,52, | 157,53, | 157,54, | 157,55, | 157,56, | 157,57, | 157,58, | 157,59, | 157,60, | 157,61, | 157,62, | 157,63, | 157,64, | 157,65, | 157,66, | 157,67, | 157,68, | 157,69, | 157,70, | 157,71, | 157,72, | 157,73, | 157,74, | 157,75, | 157,76, | 157,77, | 157,78, | 157,79, | 157,80, | 157,81, | 157,82, | 157,83, | 157,84, | 157,85, | 158,1, | 158,2, | 158,3, | 158,4, | 158,5, | 158,6, | 158,7, | 158,8, | 158,9, | 158,10, | 158,11, | 158,12, | 158,13, | 158,14, | 158,15, | 158,16, | 158,17, | 158,18, | 158,19, | 158,20, | 158,21, | 158,22, | 158,23, | 158,24, | 158,25, | 158,26, | 158,27, | 158,28, | 158,29, | 158,30, | 158,31, | 158,32, | 158,33, | 158,34, | 158,35, | 158,36, | 158,37, | 158,38, | 158,39, | 158,40, | 158,41, | 158,42, | 158,43, | 158,44, | 158,45, | 158,46, | 158,47, | 158,48, | 158,49, | 158,50, | 158,51, | 158,52, | 158,53, | 158,54, | 158,55, | 158,56, | 158,57, | 158,58, | 158,59, | 158,60, | 158,61, | 158,62, | 158,63, | 158,64, | 158,65, | 158,66, | 158,67, | 158,68, | 158,69, | 158,70, | 158,71, | 158,72, | 158,73, | 158,74, | 158,75, | 158,76, | 158,77, | 158,78, | 158,79, | 158,80, | 158,81, | 158,82, | 158,83, | 158,84, | 158,85, | 159,1, | 159,2, | 159,3, | 159,4, | 159,5, | 159,6, | 159,7, | 159,8, | 159,9, | 159,10, | 159,11, | 159,12, | 159,13, | 159,14, | 159,15, | 159,16, | 159,17, | 159,18, | 159,19, | 159,20, | 159,21, | 159,22, | 159,23, | 159,24, | 159,25, | 159,26, | 159,27, | 159,28, | 159,29, | 159,30, | 159,31, | 159,32, | 159,33, | 159,34, | 159,35, | 159,36, | 159,37, | 159,38, | 159,39, | 159,40, | 159,41, | 159,42, | 159,43, | 159,44, | 159,45, | 159,46, | 159,47, | 159,48, | 159,49, | 159,50, | 159,51, | 159,52, | 159,53, | 159,54, | 159,55, | 159,56, | 159,57, | 159,58, | 159,59, | 159,60, | 159,61, | 159,62, | 159,63, | 159,64, | 159,65, | 159,66, | 159,67, | 159,68, | 159,69, | 159,70, | 159,71, | 159,72, | 159,73, | 159,74, | 159,75, | 159,76, | 159,77, | 159,78, | 159,79, | 159,80, | 159,81, | 159,82, | 159,83, | 159,84, | 159,85, | 160,1, | 160,2, | 160,3, | 160,4, | 160,5, | 160,6, | 160,7, | 160,8, | 160,9, | 160,10, | 160,11, | 160,12, | 160,13, | 160,14, | 160,15, | 160,16, | 160,17, | 160,18, | 160,19, | 160,20, | 160,21, | 160,22, | 160,23, | 160,24, | 160,25, | 160,26, | 160,27, | 160,28, | 160,29, | 160,30, | 160,31, | 160,32, | 160,33, | 160,34, | 160,35, | 160,36, | 160,37, | 160,38, | 160,39, | 160,40, | 160,41, | 160,42, | 160,43, | 160,44, | 160,45, | 160,46, | 160,47, | 160,48, | 160,49, | 160,50, | 160,51, | 160,52, | 160,53, | 160,54, | 160,55, | 160,56, | 160,57, | 160,58, | 160,59, | 160,60, | 160,61, | 160,62, | 160,63, | 160,64, | 160,65, | 160,66, | 160,67, | 160,68, | 160,69, | 160,70, | 160,71, | 160,72, | 160,73, | 160,74, | 160,75, | 160,76, | 160,77, | 160,78, | 160,79, | 160,80, | 160,81, | 160,82, | 160,83, | 160,84, | 160,85, | 161,1, | 161,2, | 161,3, | 161,4, | 161,5, | 161,6, | 161,7, | 161,8, | 161,9, | 161,10, | 161,11, | 161,12, | 161,13, | 161,14, | 161,15, | 161,16, | 161,17, | 161,18, | 161,19, | 161,20, | 161,21, | 161,22, | 161,23, | 161,24, | 161,25, | 161,26, | 161,27, | 161,28, | 161,29, | 161,30, | 161,31, | 161,32, | 161,33, | 161,34, | 161,35, | 161,36, | 161,37, | 161,38, | 161,39, | 161,40, | 161,41, | 161,42, | 161,43, | 161,44, | 161,45, | 161,46, | 161,47, | 161,48, | 161,49, | 161,50, | 161,51, | 161,52, | 161,53, | 161,54, | 161,55, | 161,56, | 161,57, | 161,58, | 161,59, | 161,60, | 161,61, | 161,62, | 161,63, | 161,64, | 161,65, | 161,66, | 161,67, | 161,68, | 161,69, | 161,70, | 161,71, | 161,72, | 161,73, | 161,74, | 161,75, | 161,76, | 161,77, | 161,78, | 161,79, | 161,80, | 161,81, | 161,82, | 161,83, | 161,84, | 161,85, | 162,1, | 162,2, | 162,3, | 162,4, | 162,5, | 162,6, | 162,7, | 162,8, | 162,9, | 162,10, | 162,11, | 162,12, | 162,13, | 162,14, | 162,15, | 162,16, | 162,17, | 162,18, | 162,19, | 162,20, | 162,21, | 162,22, | 162,23, | 162,24, | 162,25, | 162,26, | 162,27, | 162,28, | 162,29, | 162,30, | 162,31, | 162,32, | 162,33, | 162,34, | 162,35, | 162,36, | 162,37, | 162,38, | 162,39, | 162,40, | 162,41, | 162,42, | 162,43, | 162,44, | 162,45, | 162,46, | 162,47, | 162,48, | 162,49, | 162,50, | 162,51, | 162,52, | 162,53, | 162,54, | 162,55, | 162,56, | 162,57, | 162,58, | 162,59, | 162,60, | 162,61, | 162,62, | 162,63, | 162,64, | 162,65, | 162,66, | 162,67, | 162,68, | 162,69, | 162,70, | 162,71, | 162,72, | 162,73, | 162,74, | 162,75, | 162,76, | 162,77, | 162,78, | 162,79, | 162,80, | 162,81, | 162,82, | 162,83, | 162,84, | 162,85, | 163,1, | 163,2, | 163,3, | 163,4, | 163,5, | 163,6, | 163,7, | 163,8, | 163,9, | 163,10, | 163,11, | 163,12, | 163,13, | 163,14, | 163,15, | 163,16, | 163,17, | 163,18, | 163,19, | 163,20, | 163,21, | 163,22, | 163,23, | 163,24, | 163,25, | 163,26, | 163,27, | 163,28, | 163,29, | 163,30, | 163,31, | 163,32, | 163,33, | 163,34, | 163,35, | 163,36, | 163,37, | 163,38, | 163,39, | 163,40, | 163,41, | 163,42, | 163,43, | 163,44, | 163,45, | 163,46, | 163,47, | 163,48, | 163,49, | 163,50, | 163,51, | 163,52, | 163,53, | 163,54, | 163,55, | 163,56, | 163,57, | 163,58, | 163,59, | 163,60, | 163,61, | 163,62, | 163,63, | 163,64, | 163,65, | 163,66, | 163,67, | 163,68, | 163,69, | 163,70, | 163,71, | 163,72, | 163,73, | 163,74, | 163,75, | 163,76, | 163,77, | 163,78, | 163,79, | 163,80, | 163,81, | 163,82, | 163,83, | 163,84, | 163,85, | 164,1, | 164,2, | 164,3, | 164,4, | 164,5, | 164,6, | 164,7, | 164,8, | 164,9, | 164,10, | 164,11, | 164,12, | 164,13, | 164,14, | 164,15, | 164,16, | 164,17, | 164,18, | 164,19, | 164,20, | 164,21, | 164,22, | 164,23, | 164,24, | 164,25, | 164,26, | 164,27, | 164,28, | 164,29, | 164,30, | 164,31, | 164,32, | 164,33, | 164,34, | 164,35, | 164,36, | 164,37, | 164,38, | 164,39, | 164,40, | 164,41, | 164,42, | 164,43, | 164,44, | 164,45, | 164,46, | 164,47, | 164,48, | 164,49, | 164,50, | 164,51, | 164,52, | 164,53, | 164,54, | 164,55, | 164,56, | 164,57, | 164,58, | 164,59, | 164,60, | 164,61, | 164,62, | 164,63, | 164,64, | 164,65, | 164,66, | 164,67, | 164,68, | 164,69, | 164,70, | 164,71, | 164,72, | 164,73, | 164,74, | 164,75, | 164,76, | 164,77, | 164,78, | 164,79, | 164,80, | 164,81, | 164,82, | 164,83, | 164,84, | 164,85, | 165,1, | 165,2, | 165,3, | 165,4, | 165,5, | 165,6, | 165,7, | 165,8, | 165,9, | 165,10, | 165,11, | 165,12, | 165,13, | 165,14, | 165,15, | 165,16, | 165,17, | 165,18, | 165,19, | 165,20, | 165,21, | 165,22, | 165,23, | 165,24, | 165,25, | 165,26, | 165,27, | 165,28, | 165,29, | 165,30, | 165,31, | 165,32, | 165,33, | 165,34, | 165,35, | 165,36, | 165,37, | 165,38, | 165,39, | 165,40, | 165,41, | 165,42, | 165,43, | 165,44, | 165,45, | 165,46, | 165,47, | 165,48, | 165,49, | 165,50, | 165,51, | 165,52, | 165,53, | 165,54, | 165,55, | 165,56, | 165,57, | 165,58, | 165,59, | 165,60, | 165,61, | 165,62, | 165,63, | 165,64, | 165,65, | 165,66, | 165,67, | 165,68, | 165,69, | 165,70, | 165,71, | 165,72, | 165,73, | 165,74, | 165,75, | 165,76, | 165,77, | 165,78, | 165,79, | 165,80, | 165,81, | 165,82, | 165,83, | 165,84, | 165,85, | 166,1, | 166,2, | 166,3, | 166,4, | 166,5, | 166,6, | 166,7, | 166,8, | 166,9, | 166,10, | 166,11, | 166,12, | 166,13, | 166,14, | 166,15, | 166,16, | 166,17, | 166,18, | 166,19, | 166,20, | 166,21, | 166,22, | 166,23, | 166,24, | 166,25, | 166,26, | 166,27, | 166,28, | 166,29, | 166,30, | 166,31, | 166,32, | 166,33, | 166,34, | 166,35, | 166,36, | 166,37, | 166,38, | 166,39, | 166,40, | 166,41, | 166,42, | 166,43, | 166,44, | 166,45, | 166,46, | 166,47, | 166,48, | 166,49, | 166,50, | 166,51, | 166,52, | 166,53, | 166,54, | 166,55, | 166,56, | 166,57, | 166,58, | 166,59, | 166,60, | 166,61, | 166,62, | 166,63, | 166,64, | 166,65, | 166,66, | 166,67, | 166,68, | 166,69, | 166,70, | 166,71, | 166,72, | 166,73, | 166,74, | 166,75, | 166,76, | 166,77, | 166,78, | 166,79, | 166,80, | 166,81, | 166,82, | 166,83, | 166,84, | 166,85, | 167,1, | 167,2, | 167,3, | 167,4, | 167,5, | 167,6, | 167,7, | 167,8, | 167,9, | 167,10, | 167,11, | 167,12, | 167,13, | 167,14, | 167,15, | 167,16, | 167,17, | 167,18, | 167,19, | 167,20, | 167,21, | 167,22, | 167,23, | 167,24, | 167,25, | 167,26, | 167,27, | 167,28, | 167,29, | 167,30, | 167,31, | 167,32, | 167,33, | 167,34, | 167,35, | 167,36, | 167,37, | 167,38, | 167,39, | 167,40, | 167,41, | 167,42, | 167,43, | 167,44, | 167,45, | 167,46, | 167,47, | 167,48, | 167,49, | 167,50, | 167,51, | 167,52, | 167,53, | 167,54, | 167,55, | 167,56, | 167,57, | 167,58, | 167,59, | 167,60, | 167,61, | 167,62, | 167,63, | 167,64, | 167,65, | 167,66, | 167,67, | 167,68, | 167,69, | 167,70, | 167,71, | 167,72, | 167,73, | 167,74, | 167,75, | 167,76, | 167,77, | 167,78, | 167,79, | 167,80, | 167,81, | 167,82, | 167,83, | 167,84, | 167,85, | 168,1, | 168,2, | 168,3, | 168,4, | 168,5, | 168,6, | 168,7, | 168,8, | 168,9, | 168,10, | 168,11, | 168,12, | 168,13, | 168,14, | 168,15, | 168,16, | 168,17, | 168,18, | 168,19, | 168,20, | 168,21, | 168,22, | 168,23, | 168,24, | 168,25, | 168,26, | 168,27, | 168,28, | 168,29, | 168,30, | 168,31, | 168,32, | 168,33, | 168,34, | 168,35, | 168,36, | 168,37, | 168,38, | 168,39, | 168,40, | 168,41, | 168,42, | 168,43, | 168,44, | 168,45, | 168,46, | 168,47, | 168,48, | 168,49, | 168,50, | 168,51, | 168,52, | 168,53, | 168,54, | 168,55, | 168,56, | 168,57, | 168,58, | 168,59, | 168,60, | 168,61, | 168,62, | 168,63, | 168,64, | 168,65, | 168,66, | 168,67, | 168,68, | 168,69, | 168,70, | 168,71, | 168,72, | 168,73, | 168,74, | 168,75, | 168,76, | 168,77, | 168,78, | 168,79, | 168,80, | 168,81, | 168,82, | 168,83, | 168,84, | 168,85, | 169,1, | 169,2, | 169,3, | 169,4, | 169,5, | 169,6, | 169,7, | 169,8, | 169,9, | 169,10, | 169,11, | 169,12, | 169,13, | 169,14, | 169,15, | 169,16, | 169,17, | 169,18, | 169,19, | 169,20, | 169,21, | 169,22, | 169,23, | 169,24, | 169,25, | 169,26, | 169,27, | 169,28, | 169,29, | 169,30, | 169,31, | 169,32, | 169,33, | 169,34, | 169,35, | 169,36, | 169,37, | 169,38, | 169,39, | 169,40, | 169,41, | 169,42, | 169,43, | 169,44, | 169,45, | 169,46, | 169,47, | 169,48, | 169,49, | 169,50, | 169,51, | 169,52, | 169,53, | 169,54, | 169,55, | 169,56, | 169,57, | 169,58, | 169,59, | 169,60, | 169,61, | 169,62, | 169,63, | 169,64, | 169,65, | 169,66, | 169,67, | 169,68, | 169,69, | 169,70, | 169,71, | 169,72, | 169,73, | 169,74, | 169,75, | 169,76, | 169,77, | 169,78, | 169,79, | 169,80, | 169,81, | 169,82, | 169,83, | 169,84, | 169,85, | 170,1, | 170,2, | 170,3, | 170,4, | 170,5, | 170,6, | 170,7, | 170,8, | 170,9, | 170,10, | 170,11, | 170,12, | 170,13, | 170,14, | 170,15, | 170,16, | 170,17, | 170,18, | 170,19, | 170,20, | 170,21, | 170,22, | 170,23, | 170,24, | 170,25, | 170,26, | 170,27, | 170,28, | 170,29, | 170,30, | 170,31, | 170,32, | 170,33, | 170,34, | 170,35, | 170,36, | 170,37, | 170,38, | 170,39, | 170,40, | 170,41, | 170,42, | 170,43, | 170,44, | 170,45, | 170,46, | 170,47, | 170,48, | 170,49, | 170,50, | 170,51, | 170,52, | 170,53, | 170,54, | 170,55, | 170,56, | 170,57, | 170,58, | 170,59, | 170,60, | 170,61, | 170,62, | 170,63, | 170,64, | 170,65, | 170,66, | 170,67, | 170,68, | 170,69, | 170,70, | 170,71, | 170,72, | 170,73, | 170,74, | 170,75, | 170,76, | 170,77, | 170,78, | 170,79, | 170,80, | 170,81, | 170,82, | 170,83, | 170,84, | 170,85, | 171,1, | 171,2, | 171,3, | 171,4, | 171,5, | 171,6, | 171,7, | 171,8, | 171,9, | 171,10, | 171,11, | 171,12, | 171,13, | 171,14, | 171,15, | 171,16, | 171,17, | 171,18, | 171,19, | 171,20, | 171,21, | 171,22, | 171,23, | 171,24, | 171,25, | 171,26, | 171,27, | 171,28, | 171,29, | 171,30, | 171,31, | 171,32, | 171,33, | 171,34, | 171,35, | 171,36, | 171,37, | 171,38, | 171,39, | 171,40, | 171,41, | 171,42, | 171,43, | 171,44, | 171,45, | 171,46, | 171,47, | 171,48, | 171,49, | 171,50, | 171,51, | 171,52, | 171,53, | 171,54, | 171,55, | 171,56, | 171,57, | 171,58, | 171,59, | 171,60, | 171,61, | 171,62, | 171,63, | 171,64, | 171,65, | 171,66, | 171,67, | 171,68, | 171,69, | 171,70, | 171,71, | 171,72, | 171,73, | 171,74, | 171,75, | 171,76, | 171,77, | 171,78, | 171,79, | 171,80, | 171,81, | 171,82, | 171,83, | 171,84, | 171,85, | 172,1, | 172,2, | 172,3, | 172,4, | 172,5, | 172,6, | 172,7, | 172,8, | 172,9, | 172,10, | 172,11, | 172,12, | 172,13, | 172,14, | 172,15, | 172,16, | 172,17, | 172,18, | 172,19, | 172,20, | 172,21, | 172,22, | 172,23, | 172,24, | 172,25, | 172,26, | 172,27, | 172,28, | 172,29, | 172,30, | 172,31, | 172,32, | 172,33, | 172,34, | 172,35, | 172,36, | 172,37, | 172,38, | 172,39, | 172,40, | 172,41, | 172,42, | 172,43, | 172,44, | 172,45, | 172,46, | 172,47, | 172,48, | 172,49, | 172,50, | 172,51, | 172,52, | 172,53, | 172,54, | 172,55, | 172,56, | 172,57, | 172,58, | 172,59, | 172,60, | 172,61, | 172,62, | 172,63, | 172,64, | 172,65, | 172,66, | 172,67, | 172,68, | 172,69, | 172,70, | 172,71, | 172,72, | 172,73, | 172,74, | 172,75, | 172,76, | 172,77, | 172,78, | 172,79, | 172,80, | 172,81, | 172,82, | 172,83, | 172,84, | 172,85, | 173,1, | 173,2, | 173,3, | 173,4, | 173,5, | 173,6, | 173,7, | 173,8, | 173,9, | 173,10, | 173,11, | 173,12, | 173,13, | 173,14, | 173,15, | 173,16, | 173,17, | 173,18, | 173,19, | 173,20, | 173,21, | 173,22, | 173,23, | 173,24, | 173,25, | 173,26, | 173,27, | 173,28, | 173,29, | 173,30, | 173,31, | 173,32, | 173,33, | 173,34, | 173,35, | 173,36, | 173,37, | 173,38, | 173,39, | 173,40, | 173,41, | 173,42, | 173,43, | 173,44, | 173,45, | 173,46, | 173,47, | 173,48, | 173,49, | 173,50, | 173,51, | 173,52, | 173,53, | 173,54, | 173,55, | 173,56, | 173,57, | 173,58, | 173,59, | 173,60, | 173,61, | 173,62, | 173,63, | 173,64, | 173,65, | 173,66, | 173,67, | 173,68, | 173,69, | 173,70, | 173,71, | 173,72, | 173,73, | 173,74, | 173,75, | 173,76, | 173,77, | 173,78, | 173,79, | 173,80, | 173,81, | 173,82, | 173,83, | 173,84, | 173,85, | 174,1, | 174,2, | 174,3, | 174,4, | 174,5, | 174,6, | 174,7, | 174,8, | 174,9, | 174,10, | 174,11, | 174,12, | 174,13, | 174,14, | 174,15, | 174,16, | 174,17, | 174,18, | 174,19, | 174,20, | 174,21, | 174,22, | 174,23, | 174,24, | 174,25, | 174,26, | 174,27, | 174,28, | 174,29, | 174,30, | 174,31, | 174,32, | 174,33, | 174,34, | 174,35, | 174,36, | 174,37, | 174,38, | 174,39, | 174,40, | 174,41, | 174,42, | 174,43, | 174,44, | 174,45, | 174,46, | 174,47, | 174,48, | 174,49, | 174,50, | 174,51, | 174,52, | 174,53, | 174,54, | 174,55, | 174,56, | 174,57, | 174,58, | 174,59, | 174,60, | 174,61, | 174,62, | 174,63, | 174,64, | 174,65, | 174,66, | 174,67, | 174,68, | 174,69, | 174,70, | 174,71, | 174,72, | 174,73, | 174,74, | 174,75, | 174,76, | 174,77, | 174,78, | 174,79, | 174,80, | 174,81, | 174,82, | 174,83, | 174,84, | 174,85, | 175,1, | 175,2, | 175,3, | 175,4, | 175,5, | 175,6, | 175,7, | 175,8, | 175,9, | 175,10, | 175,11, | 175,12, | 175,13, | 175,14, | 175,15, | 175,16, | 175,17, | 175,18, | 175,19, | 175,20, | 175,21, | 175,22, | 175,23, | 175,24, | 175,25, | 175,26, | 175,27, | 175,28, | 175,29, | 175,30, | 175,31, | 175,32, | 175,33, | 175,34, | 175,35, | 175,36, | 175,37, | 175,38, | 175,39, | 175,40, | 175,41, | 175,42, | 175,43, | 175,44, | 175,45, | 175,46, | 175,47, | 175,48, | 175,49, | 175,50, | 175,51, | 175,52, | 175,53, | 175,54, | 175,55, | 175,56, | 175,57, | 175,58, | 175,59, | 175,60, | 175,61, | 175,62, | 175,63, | 175,64, | 175,65, | 175,66, | 175,67, | 175,68, | 175,69, | 175,70, | 175,71, | 175,72, | 175,73, | 175,74, | 175,75, | 175,76, | 175,77, | 175,78, | 175,79, | 175,80, | 175,81, | 175,82, | 175,83, | 175,84, | 175,85, | 176,1, | 176,2, | 176,3, | 176,4, | 176,5, | 176,6, | 176,7, | 176,8, | 176,9, | 176,10, | 176,11, | 176,12, | 176,13, | 176,14, | 176,15, | 176,16, | 176,17, | 176,18, | 176,19, | 176,20, | 176,21, | 176,22, | 176,23, | 176,24, | 176,25, | 176,26, | 176,27, | 176,28, | 176,29, | 176,30, | 176,31, | 176,32, | 176,33, | 176,34, | 176,35, | 176,36, | 176,37, | 176,38, | 176,39, | 176,40, | 176,41, | 176,42, | 176,43, | 176,44, | 176,45, | 176,46, | 176,47, | 176,48, | 176,49, | 176,50, | 176,51, | 176,52, | 176,53, | 176,54, | 176,55, | 176,56, | 176,57, | 176,58, | 176,59, | 176,60, | 176,61, | 176,62, | 176,63, | 176,64, | 176,65, | 176,66, | 176,67, | 176,68, | 176,69, | 176,70, | 176,71, | 176,72, | 176,73, | 176,74, | 176,75, | 176,76, | 176,77, | 176,78, | 176,79, | 176,80, | 176,81, | 176,82, | 176,83, | 176,84, | 176,85, | 177,1, | 177,2, | 177,3, | 177,4, | 177,5, | 177,6, | 177,7, | 177,8, | 177,9, | 177,10, | 177,11, | 177,12, | 177,13, | 177,14, | 177,15, | 177,16, | 177,17, | 177,18, | 177,19, | 177,20, | 177,21, | 177,22, | 177,23, | 177,24, | 177,25, | 177,26, | 177,27, | 177,28, | 177,29, | 177,30, | 177,31, | 177,32, | 177,33, | 177,34, | 177,35, | 177,36, | 177,37, | 177,38, | 177,39, | 177,40, | 177,41, | 177,42, | 177,43, | 177,44, | 177,45, | 177,46, | 177,47, | 177,48, | 177,49, | 177,50, | 177,51, | 177,52, | 177,53, | 177,54, | 177,55, | 177,56, | 177,57, | 177,58, | 177,59, | 177,60, | 177,61, | 177,62, | 177,63, | 177,64, | 177,65, | 177,66, | 177,67, | 177,68, | 177,69, | 177,70, | 177,71, | 177,72, | 177,73, | 177,74, | 177,75, | 177,76, | 177,77, | 177,78, | 177,79, | 177,80, | 177,81, | 177,82, | 177,83, | 177,84, | 177,85, | 178,1, | 178,2, | 178,3, | 178,4, | 178,5, | 178,6, | 178,7, | 178,8, | 178,9, | 178,10, | 178,11, | 178,12, | 178,13, | 178,14, | 178,15, | 178,16, | 178,17, | 178,18, | 178,19, | 178,20, | 178,21, | 178,22, | 178,23, | 178,24, | 178,25, | 178,26, | 178,27, | 178,28, | 178,29, | 178,30, | 178,31, | 178,32, | 178,33, | 178,34, | 178,35, | 178,36, | 178,37, | 178,38, | 178,39, | 178,40, | 178,41, | 178,42, | 178,43, | 178,44, | 178,45, | 178,46, | 178,47, | 178,48, | 178,49, | 178,50, | 178,51, | 178,52, | 178,53, | 178,54, | 178,55, | 178,56, | 178,57, | 178,58, | 178,59, | 178,60, | 178,61, | 178,62, | 178,63, | 178,64, | 178,65, | 178,66, | 178,67, | 178,68, | 178,69, | 178,70, | 178,71, | 178,72, | 178,73, | 178,74, | 178,75, | 178,76, | 178,77, | 178,78, | 178,79, | 178,80, | 178,81, | 178,82, | 178,83, | 178,84, | 178,85, | 179,1, | 179,2, | 179,3, | 179,4, | 179,5, | 179,6, | 179,7, | 179,8, | 179,9, | 179,10, | 179,11, | 179,12, | 179,13, | 179,14, | 179,15, | 179,16, | 179,17, | 179,18, | 179,19, | 179,20, | 179,21, | 179,22, | 179,23, | 179,24, | 179,25, | 179,26, | 179,27, | 179,28, | 179,29, | 179,30, | 179,31, | 179,32, | 179,33, | 179,34, | 179,35, | 179,36, | 179,37, | 179,38, | 179,39, | 179,40, | 179,41, | 179,42, | 179,43, | 179,44, | 179,45, | 179,46, | 179,47, | 179,48, | 179,49, | 179,50, | 179,51, | 179,52, | 179,53, | 179,54, | 179,55, | 179,56, | 179,57, | 179,58, | 179,59, | 179,60, | 179,61, | 179,62, | 179,63, | 179,64, | 179,65, | 179,66, | 179,67, | 179,68, | 179,69, | 179,70, | 179,71, | 179,72, | 179,73, | 179,74, | 179,75, | 179,76, | 179,77, | 179,78, | 179,79, | 179,80, | 179,81, | 179,82, | 179,83, | 179,84, | 179,85, | 180,1, | 180,2, | 180,3, | 180,4, | 180,5, | 180,6, | 180,7, | 180,8, | 180,9, | 180,10, | 180,11, | 180,12, | 180,13, | 180,14, | 180,15, | 180,16, | 180,17, | 180,18, | 180,19, | 180,20, | 180,21, | 180,22, | 180,23, | 180,24, | 180,25, | 180,26, | 180,27, | 180,28, | 180,29, | 180,30, | 180,31, | 180,32, | 180,33, | 180,34, | 180,35, | 180,36, | 180,37, | 180,38, | 180,39, | 180,40, | 180,41, | 180,42, | 180,43, | 180,44, | 180,45, | 180,46, | 180,47, | 180,48, | 180,49, | 180,50, | 180,51, | 180,52, | 180,53, | 180,54, | 180,55, | 180,56, | 180,57, | 180,58, | 180,59, | 180,60, | 180,61, | 180,62, | 180,63, | 180,64, | 180,65, | 180,66, | 180,67, | 180,68, | 180,69, | 180,70, | 180,71, | 180,72, | 180,73, | 180,74, | 180,75, | 180,76, | 180,77, | 180,78, | 180,79, | 180,80, | 180,81, | 180,82, | 180,83, | 180,84, | 180,85, | 181,1, | 181,2, | 181,3, | 181,4, | 181,5, | 181,6, | 181,7, | 181,8, | 181,9, | 181,10, | 181,11, | 181,12, | 181,13, | 181,14, | 181,15, | 181,16, | 181,17, | 181,18, | 181,19, | 181,20, | 181,21, | 181,22, | 181,23, | 181,24, | 181,25, | 181,26, | 181,27, | 181,28, | 181,29, | 181,30, | 181,31, | 181,32, | 181,33, | 181,34, | 181,35, | 181,36, | 181,37, | 181,38, | 181,39, | 181,40, | 181,41, | 181,42, | 181,43, | 181,44, | 181,45, | 181,46, | 181,47, | 181,48, | 181,49, | 181,50, | 181,51, | 181,52, | 181,53, | 181,54, | 181,55, | 181,56, | 181,57, | 181,58, | 181,59, | 181,60, | 181,61, | 181,62, | 181,63, | 181,64, | 181,65, | 181,66, | 181,67, | 181,68, | 181,69, | 181,70, | 181,71, | 181,72, | 181,73, | 181,74, | 181,75, | 181,76, | 181,77, | 181,78, | 181,79, | 181,80, | 181,81, | 181,82, | 181,83, | 181,84, | 181,85, | 182,1, | 182,2, | 182,3, | 182,4, | 182,5, | 182,6, | 182,7, | 182,8, | 182,9, | 182,10, | 182,11, | 182,12, | 182,13, | 182,14, | 182,15, | 182,16, | 182,17, | 182,18, | 182,19, | 182,20, | 182,21, | 182,22, | 182,23, | 182,24, | 182,25, | 182,26, | 182,27, | 182,28, | 182,29, | 182,30, | 182,31, | 182,32, | 182,33, | 182,34, | 182,35, | 182,36, | 182,37, | 182,38, | 182,39, | 182,40, | 182,41, | 182,42, | 182,43, | 182,44, | 182,45, | 182,46, | 182,47, | 182,48, | 182,49, | 182,50, | 182,51, | 182,52, | 182,53, | 182,54, | 182,55, | 182,56, | 182,57, | 182,58, | 182,59, | 182,60, | 182,61, | 182,62, | 182,63, | 182,64, | 182,65, | 182,66, | 182,67, | 182,68, | 182,69, | 182,70, | 182,71, | 182,72, | 182,73, | 182,74, | 182,75, | 182,76, | 182,77, | 182,78, | 182,79, | 182,80, | 182,81, | 182,82, | 182,83, | 182,84, | 182,85, | 183,1, | 183,2, | 183,3, | 183,4, | 183,5, | 183,6, | 183,7, | 183,8, | 183,9, | 183,10, | 183,11, | 183,12, | 183,13, | 183,14, | 183,15, | 183,16, | 183,17, | 183,18, | 183,19, | 183,20, | 183,21, | 183,22, | 183,23, | 183,24, | 183,25, | 183,26, | 183,27, | 183,28, | 183,29, | 183,30, | 183,31, | 183,32, | 183,33, | 183,34, | 183,35, | 183,36, | 183,37, | 183,38, | 183,39, | 183,40, | 183,41, | 183,42, | 183,43, | 183,44, | 183,45, | 183,46, | 183,47, | 183,48, | 183,49, | 183,50, | 183,51, | 183,52, | 183,53, | 183,54, | 183,55, | 183,56, | 183,57, | 183,58, | 183,59, | 183,60, | 183,61, | 183,62, | 183,63, | 183,64, | 183,65, | 183,66, | 183,67, | 183,68, | 183,69, | 183,70, | 183,71, | 183,72, | 183,73, | 183,74, | 183,75, | 183,76, | 183,77, | 183,78, | 183,79, | 183,80, | 183,81, | 183,82, | 183,83, | 183,84, | 183,85, | 184,1, | 184,2, | 184,3, | 184,4, | 184,5, | 184,6, | 184,7, | 184,8, | 184,9, | 184,10, | 184,11, | 184,12, | 184,13, | 184,14, | 184,15, | 184,16, | 184,17, | 184,18, | 184,19, | 184,20, | 184,21, | 184,22, | 184,23, | 184,24, | 184,25, | 184,26, | 184,27, | 184,28, | 184,29, | 184,30, | 184,31, | 184,32, | 184,33, | 184,34, | 184,35, | 184,36, | 184,37, | 184,38, | 184,39, | 184,40, | 184,41, | 184,42, | 184,43, | 184,44, | 184,45, | 184,46, | 184,47, | 184,48, | 184,49, | 184,50, | 184,51, | 184,52, | 184,53, | 184,54, | 184,55, | 184,56, | 184,57, | 184,58, | 184,59, | 184,60, | 184,61, | 184,62, | 184,63, | 184,64, | 184,65, | 184,66, | 184,67, | 184,68, | 184,69, | 184,70, | 184,71, | 184,72, | 184,73, | 184,74, | 184,75, | 184,76, | 184,77, | 184,78, | 184,79, | 184,80, | 184,81, | 184,82, | 184,83, | 184,84, | 184,85, | 185,1, | 185,2, | 185,3, | 185,4, | 185,5, | 185,6, | 185,7, | 185,8, | 185,9, | 185,10, | 185,11, | 185,12, | 185,13, | 185,14, | 185,15, | 185,16, | 185,17, | 185,18, | 185,19, | 185,20, | 185,21, | 185,22, | 185,23, | 185,24, | 185,25, | 185,26, | 185,27, | 185,28, | 185,29, | 185,30, | 185,31, | 185,32, | 185,33, | 185,34, | 185,35, | 185,36, | 185,37, | 185,38, | 185,39, | 185,40, | 185,41, | 185,42, | 185,43, | 185,44, | 185,45, | 185,46, | 185,47, | 185,48, | 185,49, | 185,50, | 185,51, | 185,52, | 185,53, | 185,54, | 185,55, | 185,56, | 185,57, | 185,58, | 185,59, | 185,60, | 185,61, | 185,62, | 185,63, | 185,64, | 185,65, | 185,66, | 185,67, | 185,68, | 185,69, | 185,70, | 185,71, | 185,72, | 185,73, | 185,74, | 185,75, | 185,76, | 185,77, | 185,78, | 185,79, | 185,80, | 185,81, | 185,82, | 185,83, | 185,84, | 185,85, | 186,1, | 186,2, | 186,3, | 186,4, | 186,5, | 186,6, | 186,7, | 186,8, | 186,9, | 186,10, | 186,11, | 186,12, | 186,13, | 186,14, | 186,15, | 186,16, | 186,17, | 186,18, | 186,19, | 186,20, | 186,21, | 186,22, | 186,23, | 186,24, | 186,25, | 186,26, | 186,27, | 186,28, | 186,29, | 186,30, | 186,31, | 186,32, | 186,33, | 186,34, | 186,35, | 186,36, | 186,37, | 186,38, | 186,39, | 186,40, | 186,41, | 186,42, | 186,43, | 186,44, | 186,45, | 186,46, | 186,47, | 186,48, | 186,49, | 186,50, | 186,51, | 186,52, | 186,53, | 186,54, | 186,55, | 186,56, | 186,57, | 186,58, | 186,59, | 186,60, | 186,61, | 186,62, | 186,63, | 186,64, | 186,65, | 186,66, | 186,67, | 186,68, | 186,69, | 186,70, | 186,71, | 186,72, | 186,73, | 186,74, | 186,75, | 186,76, | 186,77, | 186,78, | 186,79, | 186,80, | 186,81, | 186,82, | 186,83, | 186,84, | 186,85, | 187,1, | 187,2, | 187,3, | 187,4, | 187,5, | 187,6, | 187,7, | 187,8, | 187,9, | 187,10, | 187,11, | 187,12, | 187,13, | 187,14, | 187,15, | 187,16, | 187,17, | 187,18, | 187,19, | 187,20, | 187,21, | 187,22, | 187,23, | 187,24, | 187,25, | 187,26, | 187,27, | 187,28, | 187,29, | 187,30, | 187,31, | 187,32, | 187,33, | 187,34, | 187,35, | 187,36, | 187,37, | 187,38, | 187,39, | 187,40, | 187,41, | 187,42, | 187,43, | 187,44, | 187,45, | 187,46, | 187,47, | 187,48, | 187,49, | 187,50, | 187,51, | 187,52, | 187,53, | 187,54, | 187,55, | 187,56, | 187,57, | 187,58, | 187,59, | 187,60, | 187,61, | 187,62, | 187,63, | 187,64, | 187,65, | 187,66, | 187,67, | 187,68, | 187,69, | 187,70, | 187,71, | 187,72, | 187,73, | 187,74, | 187,75, | 187,76, | 187,77, | 187,78, | 187,79, | 187,80, | 187,81, | 187,82, | 187,83, | 187,84, | 187,85, | 188,1, | 188,2, | 188,3, | 188,4, | 188,5, | 188,6, | 188,7, | 188,8, | 188,9, | 188,10, | 188,11, | 188,12, | 188,13, | 188,14, | 188,15, | 188,16, | 188,17, | 188,18, | 188,19, | 188,20, | 188,21, | 188,22, | 188,23, | 188,24, | 188,25, | 188,26, | 188,27, | 188,28, | 188,29, | 188,30, | 188,31, | 188,32, | 188,33, | 188,34, | 188,35, | 188,36, | 188,37, | 188,38, | 188,39, | 188,40, | 188,41, | 188,42, | 188,43, | 188,44, | 188,45, | 188,46, | 188,47, | 188,48, | 188,49, | 188,50, | 188,51, | 188,52, | 188,53, | 188,54, | 188,55, | 188,56, | 188,57, | 188,58, | 188,59, | 188,60, | 188,61, | 188,62, | 188,63, | 188,64, | 188,65, | 188,66, | 188,67, | 188,68, | 188,69, | 188,70, | 188,71, | 188,72, | 188,73, | 188,74, | 188,75, | 188,76, | 188,77, | 188,78, | 188,79, | 188,80, | 188,81, | 188,82, | 188,83, | 188,84, | 188,85, | 189,1, | 189,2, | 189,3, | 189,4, | 189,5, | 189,6, | 189,7, | 189,8, | 189,9, | 189,10, | 189,11, | 189,12, | 189,13, | 189,14, | 189,15, | 189,16, | 189,17, | 189,18, | 189,19, | 189,20, | 189,21, | 189,22, | 189,23, | 189,24, | 189,25, | 189,26, | 189,27, | 189,28, | 189,29, | 189,30, | 189,31, | 189,32, | 189,33, | 189,34, | 189,35, | 189,36, | 189,37, | 189,38, | 189,39, | 189,40, | 189,41, | 189,42, | 189,43, | 189,44, | 189,45, | 189,46, | 189,47, | 189,48, | 189,49, | 189,50, | 189,51, | 189,52, | 189,53, | 189,54, | 189,55, | 189,56, | 189,57, | 189,58, | 189,59, | 189,60, | 189,61, | 189,62, | 189,63, | 189,64, | 189,65, | 189,66, | 189,67, | 189,68, | 189,69, | 189,70, | 189,71, | 189,72, | 189,73, | 189,74, | 189,75, | 189,76, | 189,77, | 189,78, | 189,79, | 189,80, | 189,81, | 189,82, | 189,83, | 189,84, | 189,85, | 190,1, | 190,2, | 190,3, | 190,4, | 190,5, | 190,6, | 190,7, | 190,8, | 190,9, | 190,10, | 190,11, | 190,12, | 190,13, | 190,14, | 190,15, | 190,16, | 190,17, | 190,18, | 190,19, | 190,20, | 190,21, | 190,22, | 190,23, | 190,24, | 190,25, | 190,26, | 190,27, | 190,28, | 190,29, | 190,30, | 190,31, | 190,32, | 190,33, | 190,34, | 190,35, | 190,36, | 190,37, | 190,38, | 190,39, | 190,40, | 190,41, | 190,42, | 190,43, | 190,44, | 190,45, | 190,46, | 190,47, | 190,48, | 190,49, | 190,50, | 190,51, | 190,52, | 190,53, | 190,54, | 190,55, | 190,56, | 190,57, | 190,58, | 190,59, | 190,60, | 190,61, | 190,62, | 190,63, | 190,64, | 190,65, | 190,66, | 190,67, | 190,68, | 190,69, | 190,70, | 190,71, | 190,72, | 190,73, | 190,74, | 190,75, | 190,76, | 190,77, | 190,78, | 190,79, | 190,80, | 190,81, | 190,82, | 190,83, | 190,84, | 190,85, | 191,1, | 191,2, | 191,3, | 191,4, | 191,5, | 191,6, | 191,7, | 191,8, | 191,9, | 191,10, | 191,11, | 191,12, | 191,13, | 191,14, | 191,15, | 191,16, | 191,17, | 191,18, | 191,19, | 191,20, | 191,21, | 191,22, | 191,23, | 191,24, | 191,25, | 191,26, | 191,27, | 191,28, | 191,29, | 191,30, | 191,31, | 191,32, | 191,33, | 191,34, | 191,35, | 191,36, | 191,37, | 191,38, | 191,39, | 191,40, | 191,41, | 191,42, | 191,43, | 191,44, | 191,45, | 191,46, | 191,47, | 191,48, | 191,49, | 191,50, | 191,51, | 191,52, | 191,53, | 191,54, | 191,55, | 191,56, | 191,57, | 191,58, | 191,59, | 191,60, | 191,61, | 191,62, | 191,63, | 191,64, | 191,65, | 191,66, | 191,67, | 191,68, | 191,69, | 191,70, | 191,71, | 191,72, | 191,73, | 191,74, | 191,75, | 191,76, | 191,77, | 191,78, | 191,79, | 191,80, | 191,81, | 191,82, | 191,83, | 191,84, | 191,85, | 192,1, | 192,2, | 192,3, | 192,4, | 192,5, | 192,6, | 192,7, | 192,8, | 192,9, | 192,10, | 192,11, | 192,12, | 192,13, | 192,14, | 192,15, | 192,16, | 192,17, | 192,18, | 192,19, | 192,20, | 192,21, | 192,22, | 192,23, | 192,24, | 192,25, | 192,26, | 192,27, | 192,28, | 192,29, | 192,30, | 192,31, | 192,32, | 192,33, | 192,34, | 192,35, | 192,36, | 192,37, | 192,38, | 192,39, | 192,40, | 192,41, | 192,42, | 192,43, | 192,44, | 192,45, | 192,46, | 192,47, | 192,48, | 192,49, | 192,50, | 192,51, | 192,52, | 192,53, | 192,54, | 192,55, | 192,56, | 192,57, | 192,58, | 192,59, | 192,60, | 192,61, | 192,62, | 192,63, | 192,64, | 192,65, | 192,66, | 192,67, | 192,68, | 192,69, | 192,70, | 192,71, | 192,72, | 192,73, | 192,74, | 192,75, | 192,76, | 192,77, | 192,78, | 192,79, | 192,80, | 192,81, | 192,82, | 192,83, | 192,84, | 192,85, | 193,1, | 193,2, | 193,3, | 193,4, | 193,5, | 193,6, | 193,7, | 193,8, | 193,9, | 193,10, | 193,11, | 193,12, | 193,13, | 193,14, | 193,15, | 193,16, | 193,17, | 193,18, | 193,19, | 193,20, | 193,21, | 193,22, | 193,23, | 193,24, | 193,25, | 193,26, | 193,27, | 193,28, | 193,29, | 193,30, | 193,31, | 193,32, | 193,33, | 193,34, | 193,35, | 193,36, | 193,37, | 193,38, | 193,39, | 193,40, | 193,41, | 193,42, | 193,43, | 193,44, | 193,45, | 193,46, | 193,47, | 193,48, | 193,49, | 193,50, | 193,51, | 193,52, | 193,53, | 193,54, | 193,55, | 193,56, | 193,57, | 193,58, | 193,59, | 193,60, | 193,61, | 193,62, | 193,63, | 193,64, | 193,65, | 193,66, | 193,67, | 193,68, | 193,69, | 193,70, | 193,71, | 193,72, | 193,73, | 193,74, | 193,75, | 193,76, | 193,77, | 193,78, | 193,79, | 193,80, | 193,81, | 193,82, | 193,83, | 193,84, | 193,85, | 194,1, | 194,2, | 194,3, | 194,4, | 194,5, | 194,6, | 194,7, | 194,8, | 194,9, | 194,10, | 194,11, | 194,12, | 194,13, | 194,14, | 194,15, | 194,16, | 194,17, | 194,18, | 194,19, | 194,20, | 194,21, | 194,22, | 194,23, | 194,24, | 194,25, | 194,26, | 194,27, | 194,28, | 194,29, | 194,30, | 194,31, | 194,32, | 194,33, | 194,34, | 194,35, | 194,36, | 194,37, | 194,38, | 194,39, | 194,40, | 194,41, | 194,42, | 194,43, | 194,44, | 194,45, | 194,46, | 194,47, | 194,48, | 194,49, | 194,50, | 194,51, | 194,52, | 194,53, | 194,54, | 194,55, | 194,56, | 194,57, | 194,58, | 194,59, | 194,60, | 194,61, | 194,62, | 194,63, | 194,64, | 194,65, | 194,66, | 194,67, | 194,68, | 194,69, | 194,70, | 194,71, | 194,72, | 194,73, | 194,74, | 194,75, | 194,76, | 194,77, | 194,78, | 194,79, | 194,80, | 194,81, | 194,82, | 194,83, | 194,84, | 194,85, | 195,1, | 195,2, | 195,3, | 195,4, | 195,5, | 195,6, | 195,7, | 195,8, | 195,9, | 195,10, | 195,11, | 195,12, | 195,13, | 195,14, | 195,15, | 195,16, | 195,17, | 195,18, | 195,19, | 195,20, | 195,21, | 195,22, | 195,23, | 195,24, | 195,25, | 195,26, | 195,27, | 195,28, | 195,29, | 195,30, | 195,31, | 195,32, | 195,33, | 195,34, | 195,35, | 195,36, | 195,37, | 195,38, | 195,39, | 195,40, | 195,41, | 195,42, | 195,43, | 195,44, | 195,45, | 195,46, | 195,47, | 195,48, | 195,49, | 195,50, | 195,51, | 195,52, | 195,53, | 195,54, | 195,55, | 195,56, | 195,57, | 195,58, | 195,59, | 195,60, | 195,61, | 195,62, | 195,63, | 195,64, | 195,65, | 195,66, | 195,67, | 195,68, | 195,69, | 195,70, | 195,71, | 195,72, | 195,73, | 195,74, | 195,75, | 195,76, | 195,77, | 195,78, | 195,79, | 195,80, | 195,81, | 195,82, | 195,83, | 195,84, | 195,85, | 196,1, | 196,2, | 196,3, | 196,4, | 196,5, | 196,6, | 196,7, | 196,8, | 196,9, | 196,10, | 196,11, | 196,12, | 196,13, | 196,14, | 196,15, | 196,16, | 196,17, | 196,18, | 196,19, | 196,20, | 196,21, | 196,22, | 196,23, | 196,24, | 196,25, | 196,26, | 196,27, | 196,28, | 196,29, | 196,30, | 196,31, | 196,32, | 196,33, | 196,34, | 196,35, | 196,36, | 196,37, | 196,38, | 196,39, | 196,40, | 196,41, | 196,42, | 196,43, | 196,44, | 196,45, | 196,46, | 196,47, | 196,48, | 196,49, | 196,50, | 196,51, | 196,52, | 196,53, | 196,54, | 196,55, | 196,56, | 196,57, | 196,58, | 196,59, | 196,60, | 196,61, | 196,62, | 196,63, | 196,64, | 196,65, | 196,66, | 196,67, | 196,68, | 196,69, | 196,70, | 196,71, | 196,72, | 196,73, | 196,74, | 196,75, | 196,76, | 196,77, | 196,78, | 196,79, | 196,80, | 196,81, | 196,82, | 196,83, | 196,84, | 196,85, | 197,1, | 197,2, | 197,3, | 197,4, | 197,5, | 197,6, | 197,7, | 197,8, | 197,9, | 197,10, | 197,11, | 197,12, | 197,13, | 197,14, | 197,15, | 197,16, | 197,17, | 197,18, | 197,19, | 197,20, | 197,21, | 197,22, | 197,23, | 197,24, | 197,25, | 197,26, | 197,27, | 197,28, | 197,29, | 197,30, | 197,31, | 197,32, | 197,33, | 197,34, | 197,35, | 197,36, | 197,37, | 197,38, | 197,39, | 197,40, | 197,41, | 197,42, | 197,43, | 197,44, | 197,45, | 197,46, | 197,47, | 197,48, | 197,49, | 197,50, | 197,51, | 197,52, | 197,53, | 197,54, | 197,55, | 197,56, | 197,57, | 197,58, | 197,59, | 197,60, | 197,61, | 197,62, | 197,63, | 197,64, | 197,65, | 197,66, | 197,67, | 197,68, | 197,69, | 197,70, | 197,71, | 197,72, | 197,73, | 197,74, | 197,75, | 197,76, | 197,77, | 197,78, | 197,79, | 197,80, | 197,81, | 197,82, | 197,83, | 197,84, | 197,85, | 198,1, | 198,2, | 198,3, | 198,4, | 198,5, | 198,6, | 198,7, | 198,8, | 198,9, | 198,10, | 198,11, | 198,12, | 198,13, | 198,14, | 198,15, | 198,16, | 198,17, | 198,18, | 198,19, | 198,20, | 198,21, | 198,22, | 198,23, | 198,24, | 198,25, | 198,26, | 198,27, | 198,28, | 198,29, | 198,30, | 198,31, | 198,32, | 198,33, | 198,34, | 198,35, | 198,36, | 198,37, | 198,38, | 198,39, | 198,40, | 198,41, | 198,42, | 198,43, | 198,44, | 198,45, | 198,46, | 198,47, | 198,48, | 198,49, | 198,50, | 198,51, | 198,52, | 198,53, | 198,54, | 198,55, | 198,56, | 198,57, | 198,58, | 198,59, | 198,60, | 198,61, | 198,62, | 198,63, | 198,64, | 198,65, | 198,66, | 198,67, | 198,68, | 198,69, | 198,70, | 198,71, | 198,72, | 198,73, | 198,74, | 198,75, | 198,76, | 198,77, | 198,78, | 198,79, | 198,80, | 198,81, | 198,82, | 198,83, | 198,84, | 198,85, | 199,1, | 199,2, | 199,3, | 199,4, | 199,5, | 199,6, | 199,7, | 199,8, | 199,9, | 199,10, | 199,11, | 199,12, | 199,13, | 199,14, | 199,15, | 199,16, | 199,17, | 199,18, | 199,19, | 199,20, | 199,21, | 199,22, | 199,23, | 199,24, | 199,25, | 199,26, | 199,27, | 199,28, | 199,29, | 199,30, | 199,31, | 199,32, | 199,33, | 199,34, | 199,35, | 199,36, | 199,37, | 199,38, | 199,39, | 199,40, | 199,41, | 199,42, | 199,43, | 199,44, | 199,45, | 199,46, | 199,47, | 199,48, | 199,49, | 199,50, | 199,51, | 199,52, | 199,53, | 199,54, | 199,55, | 199,56, | 199,57, | 199,58, | 199,59, | 199,60, | 199,61, | 199,62, | 199,63, | 199,64, | 199,65, | 199,66, | 199,67, | 199,68, | 199,69, | 199,70, | 199,71, | 199,72, | 199,73, | 199,74, | 199,75, | 199,76, | 199,77, | 199,78, | 199,79, | 199,80, | 199,81, | 199,82, | 199,83, | 199,84, | 199,85, | 200,1, | 200,2, | 200,3, | 200,4, | 200,5, | 200,6, | 200,7, | 200,8, | 200,9, | 200,10, | 200,11, | 200,12, | 200,13, | 200,14, | 200,15, | 200,16, | 200,17, | 200,18, | 200,19, | 200,20, | 200,21, | 200,22, | 200,23, | 200,24, | 200,25, | 200,26, | 200,27, | 200,28, | 200,29, | 200,30, | 200,31, | 200,32, | 200,33, | 200,34, | 200,35, | 200,36, | 200,37, | 200,38, | 200,39, | 200,40, | 200,41, | 200,42, | 200,43, | 200,44, | 200,45, | 200,46, | 200,47, | 200,48, | 200,49, | 200,50, | 200,51, | 200,52, | 200,53, | 200,54, | 200,55, | 200,56, | 200,57, | 200,58, | 200,59, | 200,60, | 200,61, | 200,62, | 200,63, | 200,64, | 200,65, | 200,66, | 200,67, | 200,68, | 200,69, | 200,70, | 200,71, | 200,72, | 200,73, | 200,74, | 200,75, | 200,76, | 200,77, | 200,78, | 200,79, | 200,80, | 200,81, | 200,82, | 200,83, | 200,84, | 200,85, | 201,1, | 201,2, | 201,3, | 201,4, | 201,5, | 201,6, | 201,7, | 201,8, | 201,9, | 201,10, | 201,11, | 201,12, | 201,13, | 201,14, | 201,15, | 201,16, | 201,17, | 201,18, | 201,19, | 201,20, | 201,21, | 201,22, | 201,23, | 201,24, | 201,25, | 201,26, | 201,27, | 201,28, | 201,29, | 201,30, | 201,31, | 201,32, | 201,33, | 201,34, | 201,35, | 201,36, | 201,37, | 201,38, | 201,39, | 201,40, | 201,41, | 201,42, | 201,43, | 201,44, | 201,45, | 201,46, | 201,47, | 201,48, | 201,49, | 201,50, | 201,51, | 201,52, | 201,53, | 201,54, | 201,55, | 201,56, | 201,57, | 201,58, | 201,59, | 201,60, | 201,61, | 201,62, | 201,63, | 201,64, | 201,65, | 201,66, | 201,67, | 201,68, | 201,69, | 201,70, | 201,71, | 201,72, | 201,73, | 201,74, | 201,75, | 201,76, | 201,77, | 201,78, | 201,79, | 201,80, | 201,81, | 201,82, | 201,83, | 201,84, | 201,85, | 202,1, | 202,2, | 202,3, | 202,4, | 202,5, | 202,6, | 202,7, | 202,8, | 202,9, | 202,10, | 202,11, | 202,12, | 202,13, | 202,14, | 202,15, | 202,16, | 202,17, | 202,18, | 202,19, | 202,20, | 202,21, | 202,22, | 202,23, | 202,24, | 202,25, | 202,26, | 202,27, | 202,28, | 202,29, | 202,30, | 202,31, | 202,32, | 202,33, | 202,34, | 202,35, | 202,36, | 202,37, | 202,38, | 202,39, | 202,40, | 202,41, | 202,42, | 202,43, | 202,44, | 202,45, | 202,46, | 202,47, | 202,48, | 202,49, | 202,50, | 202,51, | 202,52, | 202,53, | 202,54, | 202,55, | 202,56, | 202,57, | 202,58, | 202,59, | 202,60, | 202,61, | 202,62, | 202,63, | 202,64, | 202,65, | 202,66, | 202,67, | 202,68, | 202,69, | 202,70, | 202,71, | 202,72, | 202,73, | 202,74, | 202,75, | 202,76, | 202,77, | 202,78, | 202,79, | 202,80, | 202,81, | 202,82, | 202,83, | 202,84, | 202,85, | 203,1, | 203,2, | 203,3, | 203,4, | 203,5, | 203,6, | 203,7, | 203,8, | 203,9, | 203,10, | 203,11, | 203,12, | 203,13, | 203,14, | 203,15, | 203,16, | 203,17, | 203,18, | 203,19, | 203,20, | 203,21, | 203,22, | 203,23, | 203,24, | 203,25, | 203,26, | 203,27, | 203,28, | 203,29, | 203,30, | 203,31, | 203,32, | 203,33, | 203,34, | 203,35, | 203,36, | 203,37, | 203,38, | 203,39, | 203,40, | 203,41, | 203,42, | 203,43, | 203,44, | 203,45, | 203,46, | 203,47, | 203,48, | 203,49, | 203,50, | 203,51, | 203,52, | 203,53, | 203,54, | 203,55, | 203,56, | 203,57, | 203,58, | 203,59, | 203,60, | 203,61, | 203,62, | 203,63, | 203,64, | 203,65, | 203,66, | 203,67, | 203,68, | 203,69, | 203,70, | 203,71, | 203,72, | 203,73, | 203,74, | 203,75, | 203,76, | 203,77, | 203,78, | 203,79, | 203,80, | 203,81, | 203,82, | 203,83, | 203,84, | 203,85, | 204,1, | 204,2, | 204,3, | 204,4, | 204,5, | 204,6, | 204,7, | 204,8, | 204,9, | 204,10, | 204,11, | 204,12, | 204,13, | 204,14, | 204,15, | 204,16, | 204,17, | 204,18, | 204,19, | 204,20, | 204,21, | 204,22, | 204,23, | 204,24, | 204,25, | 204,26, | 204,27, | 204,28, | 204,29, | 204,30, | 204,31, | 204,32, | 204,33, | 204,34, | 204,35, | 204,36, | 204,37, | 204,38, | 204,39, | 204,40, | 204,41, | 204,42, | 204,43, | 204,44, | 204,45, | 204,46, | 204,47, | 204,48, | 204,49, | 204,50, | 204,51, | 204,52, | 204,53, | 204,54, | 204,55, | 204,56, | 204,57, | 204,58, | 204,59, | 204,60, | 204,61, | 204,62, | 204,63, | 204,64, | 204,65, | 204,66, | 204,67, | 204,68, | 204,69, | 204,70, | 204,71, | 204,72, | 204,73, | 204,74, | 204,75, | 204,76, | 204,77, | 204,78, | 204,79, | 204,80, | 204,81, | 204,82, | 204,83, | 204,84, | 204,85, | 205,1, | 205,2, | 205,3, | 205,4, | 205,5, | 205,6, | 205,7, | 205,8, | 205,9, | 205,10, | 205,11, | 205,12, | 205,13, | 205,14, | 205,15, | 205,16, | 205,17, | 205,18, | 205,19, | 205,20, | 205,21, | 205,22, | 205,23, | 205,24, | 205,25, | 205,26, | 205,27, | 205,28, | 205,29, | 205,30, | 205,31, | 205,32, | 205,33, | 205,34, | 205,35, | 205,36, | 205,37, | 205,38, | 205,39, | 205,40, | 205,41, | 205,42, | 205,43, | 205,44, | 205,45, | 205,46, | 205,47, | 205,48, | 205,49, | 205,50, | 205,51, | 205,52, | 205,53, | 205,54, | 205,55, | 205,56, | 205,57, | 205,58, | 205,59, | 205,60, | 205,61, | 205,62, | 205,63, | 205,64, | 205,65, | 205,66, | 205,67, | 205,68, | 205,69, | 205,70, | 205,71, | 205,72, | 205,73, | 205,74, | 205,75, | 205,76, | 205,77, | 205,78, | 205,79, | 205,80, | 205,81, | 205,82, | 205,83, | 205,84, | 205,85, | 206,1, | 206,2, | 206,3, | 206,4, | 206,5, | 206,6, | 206,7, | 206,8, | 206,9, | 206,10, | 206,11, | 206,12, | 206,13, | 206,14, | 206,15, | 206,16, | 206,17, | 206,18, | 206,19, | 206,20, | 206,21, | 206,22, | 206,23, | 206,24, | 206,25, | 206,26, | 206,27, | 206,28, | 206,29, | 206,30, | 206,31, | 206,32, | 206,33, | 206,34, | 206,35, | 206,36, | 206,37, | 206,38, | 206,39, | 206,40, | 206,41, | 206,42, | 206,43, | 206,44, | 206,45, | 206,46, | 206,47, | 206,48, | 206,49, | 206,50, | 206,51, | 206,52, | 206,53, | 206,54, | 206,55, | 206,56, | 206,57, | 206,58, | 206,59, | 206,60, | 206,61, | 206,62, | 206,63, | 206,64, | 206,65, | 206,66, | 206,67, | 206,68, | 206,69, | 206,70, | 206,71, | 206,72, | 206,73, | 206,74, | 206,75, | 206,76, | 206,77, | 206,78, | 206,79, | 206,80, | 206,81, | 206,82, | 206,83, | 206,84, | 206,85, | 207,1, | 207,2, | 207,3, | 207,4, | 207,5, | 207,6, | 207,7, | 207,8, | 207,9, | 207,10, | 207,11, | 207,12, | 207,13, | 207,14, | 207,15, | 207,16, | 207,17, | 207,18, | 207,19, | 207,20, | 207,21, | 207,22, | 207,23, | 207,24, | 207,25, | 207,26, | 207,27, | 207,28, | 207,29, | 207,30, | 207,31, | 207,32, | 207,33, | 207,34, | 207,35, | 207,36, | 207,37, | 207,38, | 207,39, | 207,40, | 207,41, | 207,42, | 207,43, | 207,44, | 207,45, | 207,46, | 207,47, | 207,48, | 207,49, | 207,50, | 207,51, | 207,52, | 207,53, | 207,54, | 207,55, | 207,56, | 207,57, | 207,58, | 207,59, | 207,60, | 207,61, | 207,62, | 207,63, | 207,64, | 207,65, | 207,66, | 207,67, | 207,68, | 207,69, | 207,70, | 207,71, | 207,72, | 207,73, | 207,74, | 207,75, | 207,76, | 207,77, | 207,78, | 207,79, | 207,80, | 207,81, | 207,82, | 207,83, | 207,84, | 207,85, | 208,1, | 208,2, | 208,3, | 208,4, | 208,5, | 208,6, | 208,7, | 208,8, | 208,9, | 208,10, | 208,11, | 208,12, | 208,13, | 208,14, | 208,15, | 208,16, | 208,17, | 208,18, | 208,19, | 208,20, | 208,21, | 208,22, | 208,23, | 208,24, | 208,25, | 208,26, | 208,27, | 208,28, | 208,29, | 208,30, | 208,31, | 208,32, | 208,33, | 208,34, | 208,35, | 208,36, | 208,37, | 208,38, | 208,39, | 208,40, | 208,41, | 208,42, | 208,43, | 208,44, | 208,45, | 208,46, | 208,47, | 208,48, | 208,49, | 208,50, | 208,51, | 208,52, | 208,53, | 208,54, | 208,55, | 208,56, | 208,57, | 208,58, | 208,59, | 208,60, | 208,61, | 208,62, | 208,63, | 208,64, | 208,65, | 208,66, | 208,67, | 208,68, | 208,69, | 208,70, | 208,71, | 208,72, | 208,73, | 208,74, | 208,75, | 208,76, | 208,77, | 208,78, | 208,79, | 208,80, | 208,81, | 208,82, | 208,83, | 208,84, | 208,85, | 209,1, | 209,2, | 209,3, | 209,4, | 209,5, | 209,6, | 209,7, | 209,8, | 209,9, | 209,10, | 209,11, | 209,12, | 209,13, | 209,14, | 209,15, | 209,16, | 209,17, | 209,18, | 209,19, | 209,20, | 209,21, | 209,22, | 209,23, | 209,24, | 209,25, | 209,26, | 209,27, | 209,28, | 209,29, | 209,30, | 209,31, | 209,32, | 209,33, | 209,34, | 209,35, | 209,36, | 209,37, | 209,38, | 209,39, | 209,40, | 209,41, | 209,42, | 209,43, | 209,44, | 209,45, | 209,46, | 209,47, | 209,48, | 209,49, | 209,50, | 209,51, | 209,52, | 209,53, | 209,54, | 209,55, | 209,56, | 209,57, | 209,58, | 209,59, | 209,60, | 209,61, | 209,62, | 209,63, | 209,64, | 209,65, | 209,66, | 209,67, | 209,68, | 209,69, | 209,70, | 209,71, | 209,72, | 209,73, | 209,74, | 209,75, | 209,76, | 209,77, | 209,78, | 209,79, | 209,80, | 209,81, | 209,82, | 209,83, | 209,84, | 209,85, | 210,1, | 210,2, | 210,3, | 210,4, | 210,5, | 210,6, | 210,7, | 210,8, | 210,9, | 210,10, | 210,11, | 210,12, | 210,13, | 210,14, | 210,15, | 210,16, | 210,17, | 210,18, | 210,19, | 210,20, | 210,21, | 210,22, | 210,23, | 210,24, | 210,25, | 210,26, | 210,27, | 210,28, | 210,29, | 210,30, | 210,31, | 210,32, | 210,33, | 210,34, | 210,35, | 210,36, | 210,37, | 210,38, | 210,39, | 210,40, | 210,41, | 210,42, | 210,43, | 210,44, | 210,45, | 210,46, | 210,47, | 210,48, | 210,49, | 210,50, | 210,51, | 210,52, | 210,53, | 210,54, | 210,55, | 210,56, | 210,57, | 210,58, | 210,59, | 210,60, | 210,61, | 210,62, | 210,63, | 210,64, | 210,65, | 210,66, | 210,67, | 210,68, | 210,69, | 210,70, | 210,71, | 210,72, | 210,73, | 210,74, | 210,75, | 210,76, | 210,77, | 210,78, | 210,79, | 210,80, | 210,81, | 210,82, | 210,83, | 210,84, | 210,85, | 211,1, | 211,2, | 211,3, | 211,4, | 211,5, | 211,6, | 211,7, | 211,8, | 211,9, | 211,10, | 211,11, | 211,12, | 211,13, | 211,14, | 211,15, | 211,16, | 211,17, | 211,18, | 211,19, | 211,20, | 211,21, | 211,22, | 211,23, | 211,24, | 211,25, | 211,26, | 211,27, | 211,28, | 211,29, | 211,30, | 211,31, | 211,32, | 211,33, | 211,34, | 211,35, | 211,36, | 211,37, | 211,38, | 211,39, | 211,40, | 211,41, | 211,42, | 211,43, | 211,44, | 211,45, | 211,46, | 211,47, | 211,48, | 211,49, | 211,50, | 211,51, | 211,52, | 211,53, | 211,54, | 211,55, | 211,56, | 211,57, | 211,58, | 211,59, | 211,60, | 211,61, | 211,62, | 211,63, | 211,64, | 211,65, | 211,66, | 211,67, | 211,68, | 211,69, | 211,70, | 211,71, | 211,72, | 211,73, | 211,74, | 211,75, | 211,76, | 211,77, | 211,78, | 211,79, | 211,80, | 211,81, | 211,82, | 211,83, | 211,84, | 211,85, | 212,1, | 212,2, | 212,3, | 212,4, | 212,5, | 212,6, | 212,7, | 212,8, | 212,9, | 212,10, | 212,11, | 212,12, | 212,13, | 212,14, | 212,15, | 212,16, | 212,17, | 212,18, | 212,19, | 212,20, | 212,21, | 212,22, | 212,23, | 212,24, | 212,25, | 212,26, | 212,27, | 212,28, | 212,29, | 212,30, | 212,31, | 212,32, | 212,33, | 212,34, | 212,35, | 212,36, | 212,37, | 212,38, | 212,39, | 212,40, | 212,41, | 212,42, | 212,43, | 212,44, | 212,45, | 212,46, | 212,47, | 212,48, | 212,49, | 212,50, | 212,51, | 212,52, | 212,53, | 212,54, | 212,55, | 212,56, | 212,57, | 212,58, | 212,59, | 212,60, | 212,61, | 212,62, | 212,63, | 212,64, | 212,65, | 212,66, | 212,67, | 212,68, | 212,69, | 212,70, | 212,71, | 212,72, | 212,73, | 212,74, | 212,75, | 212,76, | 212,77, | 212,78, | 212,79, | 212,80, | 212,81, | 212,82, | 212,83, | 212,84, | 212,85, | 213,1, | 213,2, | 213,3, | 213,4, | 213,5, | 213,6, | 213,7, | 213,8, | 213,9, | 213,10, | 213,11, | 213,12, | 213,13, | 213,14, | 213,15, | 213,16, | 213,17, | 213,18, | 213,19, | 213,20, | 213,21, | 213,22, | 213,23, | 213,24, | 213,25, | 213,26, | 213,27, | 213,28, | 213,29, | 213,30, | 213,31, | 213,32, | 213,33, | 213,34, | 213,35, | 213,36, | 213,37, | 213,38, | 213,39, | 213,40, | 213,41, | 213,42, | 213,43, | 213,44, | 213,45, | 213,46, | 213,47, | 213,48, | 213,49, | 213,50, | 213,51, | 213,52, | 213,53, | 213,54, | 213,55, | 213,56, | 213,57, | 213,58, | 213,59, | 213,60, | 213,61, | 213,62, | 213,63, | 213,64, | 213,65, | 213,66, | 213,67, | 213,68, | 213,69, | 213,70, | 213,71, | 213,72, | 213,73, | 213,74, | 213,75, | 213,76, | 213,77, | 213,78, | 213,79, | 213,80, | 213,81, | 213,82, | 213,83, | 213,84, | 213,85, | 214,1, | 214,2, | 214,3, | 214,4, | 214,5, | 214,6, | 214,7, | 214,8, | 214,9, | 214,10, | 214,11, | 214,12, | 214,13, | 214,14, | 214,15, | 214,16, | 214,17, | 214,18, | 214,19, | 214,20, | 214,21, | 214,22, | 214,23, | 214,24, | 214,25, | 214,26, | 214,27, | 214,28, | 214,29, | 214,30, | 214,31, | 214,32, | 214,33, | 214,34, | 214,35, | 214,36, | 214,37, | 214,38, | 214,39, | 214,40, | 214,41, | 214,42, | 214,43, | 214,44, | 214,45, | 214,46, | 214,47, | 214,48, | 214,49, | 214,50, | 214,51, | 214,52, | 214,53, | 214,54, | 214,55, | 214,56, | 214,57, | 214,58, | 214,59, | 214,60, | 214,61, | 214,62, | 214,63, | 214,64, | 214,65, | 214,66, | 214,67, | 214,68, | 214,69, | 214,70, | 214,71, | 214,72, | 214,73, | 214,74, | 214,75, | 214,76, | 214,77, | 214,78, | 214,79, | 214,80, | 214,81, | 214,82, | 214,83, | 214,84, | 214,85, | 215,1, | 215,2, | 215,3, | 215,4, | 215,5, | 215,6, | 215,7, | 215,8, | 215,9, | 215,10, | 215,11, | 215,12, | 215,13, | 215,14, | 215,15, | 215,16, | 215,17, | 215,18, | 215,19, | 215,20, | 215,21, | 215,22, | 215,23, | 215,24, | 215,25, | 215,26, | 215,27, | 215,28, | 215,29, | 215,30, | 215,31, | 215,32, | 215,33, | 215,34, | 215,35, | 215,36, | 215,37, | 215,38, | 215,39, | 215,40, | 215,41, | 215,42, | 215,43, | 215,44, | 215,45, | 215,46, | 215,47, | 215,48, | 215,49, | 215,50, | 215,51, | 215,52, | 215,53, | 215,54, | 215,55, | 215,56, | 215,57, | 215,58, | 215,59, | 215,60, | 215,61, | 215,62, | 215,63, | 215,64, | 215,65, | 215,66, | 215,67, | 215,68, | 215,69, | 215,70, | 215,71, | 215,72, | 215,73, | 215,74, | 215,75, | 215,76, | 215,77, | 215,78, | 215,79, | 215,80, | 215,81, | 215,82, | 215,83, | 215,84, | 215,85, | 216,1, | 216,2, | 216,3, | 216,4, | 216,5, | 216,6, | 216,7, | 216,8, | 216,9, | 216,10, | 216,11, | 216,12, | 216,13, | 216,14, | 216,15, | 216,16, | 216,17, | 216,18, | 216,19, | 216,20, | 216,21, | 216,22, | 216,23, | 216,24, | 216,25, | 216,26, | 216,27, | 216,28, | 216,29, | 216,30, | 216,31, | 216,32, | 216,33, | 216,34, | 216,35, | 216,36, | 216,37, | 216,38, | 216,39, | 216,40, | 216,41, | 216,42, | 216,43, | 216,44, | 216,45, | 216,46, | 216,47, | 216,48, | 216,49, | 216,50, | 216,51, | 216,52, | 216,53, | 216,54, | 216,55, | 216,56, | 216,57, | 216,58, | 216,59, | 216,60, | 216,61, | 216,62, | 216,63, | 216,64, | 216,65, | 216,66, | 216,67, | 216,68, | 216,69, | 216,70, | 216,71, | 216,72, | 216,73, | 216,74, | 216,75, | 216,76, | 216,77, | 216,78, | 216,79, | 216,80, | 216,81, | 216,82, | 216,83, | 216,84, | 216,85, | 217,1, | 217,2, | 217,3, | 217,4, | 217,5, | 217,6, | 217,7, | 217,8, | 217,9, | 217,10, | 217,11, | 217,12, | 217,13, | 217,14, | 217,15, | 217,16, | 217,17, | 217,18, | 217,19, | 217,20, | 217,21, | 217,22, | 217,23, | 217,24, | 217,25, | 217,26, | 217,27, | 217,28, | 217,29, | 217,30, | 217,31, | 217,32, | 217,33, | 217,34, | 217,35, | 217,36, | 217,37, | 217,38, | 217,39, | 217,40, | 217,41, | 217,42, | 217,43, | 217,44, | 217,45, | 217,46, | 217,47, | 217,48, | 217,49, | 217,50, | 217,51, | 217,52, | 217,53, | 217,54, | 217,55, | 217,56, | 217,57, | 217,58, | 217,59, | 217,60, | 217,61, | 217,62, | 217,63, | 217,64, | 217,65, | 217,66, | 217,67, | 217,68, | 217,69, | 217,70, | 217,71, | 217,72, | 217,73, | 217,74, | 217,75, | 217,76, | 217,77, | 217,78, | 217,79, | 217,80, | 217,81, | 217,82, | 217,83, | 217,84, | 217,85, | 218,1, | 218,2, | 218,3, | 218,4, | 218,5, | 218,6, | 218,7, | 218,8, | 218,9, | 218,10, | 218,11, | 218,12, | 218,13, | 218,14, | 218,15, | 218,16, | 218,17, | 218,18, | 218,19, | 218,20, | 218,21, | 218,22, | 218,23, | 218,24, | 218,25, | 218,26, | 218,27, | 218,28, | 218,29, | 218,30, | 218,31, | 218,32, | 218,33, | 218,34, | 218,35, | 218,36, | 218,37, | 218,38, | 218,39, | 218,40, | 218,41, | 218,42, | 218,43, | 218,44, | 218,45, | 218,46, | 218,47, | 218,48, | 218,49, | 218,50, | 218,51, | 218,52, | 218,53, | 218,54, | 218,55, | 218,56, | 218,57, | 218,58, | 218,59, | 218,60, | 218,61, | 218,62, | 218,63, | 218,64, | 218,65, | 218,66, | 218,67, | 218,68, | 218,69, | 218,70, | 218,71, | 218,72, | 218,73, | 218,74, | 218,75, | 218,76, | 218,77, | 218,78, | 218,79, | 218,80, | 218,81, | 218,82, | 218,83, | 218,84, | 218,85, | 219,1, | 219,2, | 219,3, | 219,4, | 219,5, | 219,6, | 219,7, | 219,8, | 219,9, | 219,10, | 219,11, | 219,12, | 219,13, | 219,14, | 219,15, | 219,16, | 219,17, | 219,18, | 219,19, | 219,20, | 219,21, | 219,22, | 219,23, | 219,24, | 219,25, | 219,26, | 219,27, | 219,28, | 219,29, | 219,30, | 219,31, | 219,32, | 219,33, | 219,34, | 219,35, | 219,36, | 219,37, | 219,38, | 219,39, | 219,40, | 219,41, | 219,42, | 219,43, | 219,44, | 219,45, | 219,46, | 219,47, | 219,48, | 219,49, | 219,50, | 219,51, | 219,52, | 219,53, | 219,54, | 219,55, | 219,56, | 219,57, | 219,58, | 219,59, | 219,60, | 219,61, | 219,62, | 219,63, | 219,64, | 219,65, | 219,66, | 219,67, | 219,68, | 219,69, | 219,70, | 219,71, | 219,72, | 219,73, | 219,74, | 219,75, | 219,76, | 219,77, | 219,78, | 219,79, | 219,80, | 219,81, | 219,82, | 219,83, | 219,84, | 219,85, | 220,1, | 220,2, | 220,3, | 220,4, | 220,5, | 220,6, | 220,7, | 220,8, | 220,9, | 220,10, | 220,11, | 220,12, | 220,13, | 220,14, | 220,15, | 220,16, | 220,17, | 220,18, | 220,19, | 220,20, | 220,21, | 220,22, | 220,23, | 220,24, | 220,25, | 220,26, | 220,27, | 220,28, | 220,29, | 220,30, | 220,31, | 220,32, | 220,33, | 220,34, | 220,35, | 220,36, | 220,37, | 220,38, | 220,39, | 220,40, | 220,41, | 220,42, | 220,43, | 220,44, | 220,45, | 220,46, | 220,47, | 220,48, | 220,49, | 220,50, | 220,51, | 220,52, | 220,53, | 220,54, | 220,55, | 220,56, | 220,57, | 220,58, | 220,59, | 220,60, | 220,61, | 220,62, | 220,63, | 220,64, | 220,65, | 220,66, | 220,67, | 220,68, | 220,69, | 220,70, | 220,71, | 220,72, | 220,73, | 220,74, | 220,75, | 220,76, | 220,77, | 220,78, | 220,79, | 220,80, | 220,81, | 220,82, | 220,83, | 220,84, | 220,85, | 221,1, | 221,2, | 221,3, | 221,4, | 221,5, | 221,6, | 221,7, | 221,8, | 221,9, | 221,10, | 221,11, | 221,12, | 221,13, | 221,14, | 221,15, | 221,16, | 221,17, | 221,18, | 221,19, | 221,20, | 221,21, | 221,22, | 221,23, | 221,24, | 221,25, | 221,26, | 221,27, | 221,28, | 221,29, | 221,30, | 221,31, | 221,32, | 221,33, | 221,34, | 221,35, | 221,36, | 221,37, | 221,38, | 221,39, | 221,40, | 221,41, | 221,42, | 221,43, | 221,44, | 221,45, | 221,46, | 221,47, | 221,48, | 221,49, | 221,50, | 221,51, | 221,52, | 221,53, | 221,54, | 221,55, | 221,56, | 221,57, | 221,58, | 221,59, | 221,60, | 221,61, | 221,62, | 221,63, | 221,64, | 221,65, | 221,66, | 221,67, | 221,68, | 221,69, | 221,70, | 221,71, | 221,72, | 221,73, | 221,74, | 221,75, | 221,76, | 221,77, | 221,78, | 221,79, | 221,80, | 221,81, | 221,82, | 221,83, | 221,84, | 221,85, | 222,1, | 222,2, | 222,3, | 222,4, | 222,5, | 222,6, | 222,7, | 222,8, | 222,9, | 222,10, | 222,11, | 222,12, | 222,13, | 222,14, | 222,15, | 222,16, | 222,17, | 222,18, | 222,19, | 222,20, | 222,21, | 222,22, | 222,23, | 222,24, | 222,25, | 222,26, | 222,27, | 222,28, | 222,29, | 222,30, | 222,31, | 222,32, | 222,33, | 222,34, | 222,35, | 222,36, | 222,37, | 222,38, | 222,39, | 222,40, | 222,41, | 222,42, | 222,43, | 222,44, | 222,45, | 222,46, | 222,47, | 222,48, | 222,49, | 222,50, | 222,51, | 222,52, | 222,53, | 222,54, | 222,55, | 222,56, | 222,57, | 222,58, | 222,59, | 222,60, | 222,61, | 222,62, | 222,63, | 222,64, | 222,65, | 222,66, | 222,67, | 222,68, | 222,69, | 222,70, | 222,71, | 222,72, | 222,73, | 222,74, | 222,75, | 222,76, | 222,77, | 222,78, | 222,79, | 222,80, | 222,81, | 222,82, | 222,83, | 222,84, | 222,85, | 223,1, | 223,2, | 223,3, | 223,4, | 223,5, | 223,6, | 223,7, | 223,8, | 223,9, | 223,10, | 223,11, | 223,12, | 223,13, | 223,14, | 223,15, | 223,16, | 223,17, | 223,18, | 223,19, | 223,20, | 223,21, | 223,22, | 223,23, | 223,24, | 223,25, | 223,26, | 223,27, | 223,28, | 223,29, | 223,30, | 223,31, | 223,32, | 223,33, | 223,34, | 223,35, | 223,36, | 223,37, | 223,38, | 223,39, | 223,40, | 223,41, | 223,42, | 223,43, | 223,44, | 223,45, | 223,46, | 223,47, | 223,48, | 223,49, | 223,50, | 223,51, | 223,52, | 223,53, | 223,54, | 223,55, | 223,56, | 223,57, | 223,58, | 223,59, | 223,60, | 223,61, | 223,62, | 223,63, | 223,64, | 223,65, | 223,66, | 223,67, | 223,68, | 223,69, | 223,70, | 223,71, | 223,72, | 223,73, | 223,74, | 223,75, | 223,76, | 223,77, | 223,78, | 223,79, | 223,80, | 223,81, | 223,82, | 223,83, | 223,84, | 223,85, | 224,1, | 224,2, | 224,3, | 224,4, | 224,5, | 224,6, | 224,7, | 224,8, | 224,9, | 224,10, | 224,11, | 224,12, | 224,13, | 224,14, | 224,15, | 224,16, | 224,17, | 224,18, | 224,19, | 224,20, | 224,21, | 224,22, | 224,23, | 224,24, | 224,25, | 224,26, | 224,27, | 224,28, | 224,29, | 224,30, | 224,31, | 224,32, | 224,33, | 224,34, | 224,35, | 224,36, | 224,37, | 224,38, | 224,39, | 224,40, | 224,41, | 224,42, | 224,43, | 224,44, | 224,45, | 224,46, | 224,47, | 224,48, | 224,49, | 224,50, | 224,51, | 224,52, | 224,53, | 224,54, | 224,55, | 224,56, | 224,57, | 224,58, | 224,59, | 224,60, | 224,61, | 224,62, | 224,63, | 224,64, | 224,65, | 224,66, | 224,67, | 224,68, | 224,69, | 224,70, | 224,71, | 224,72, | 224,73, | 224,74, | 224,75, | 224,76, | 224,77, | 224,78, | 224,79, | 224,80, | 224,81, | 224,82, | 224,83, | 224,84, | 224,85, | 225,1, | 225,2, | 225,3, | 225,4, | 225,5, | 225,6, | 225,7, | 225,8, | 225,9, | 225,10, | 225,11, | 225,12, | 225,13, | 225,14, | 225,15, | 225,16, | 225,17, | 225,18, | 225,19, | 225,20, | 225,21, | 225,22, | 225,23, | 225,24, | 225,25, | 225,26, | 225,27, | 225,28, | 225,29, | 225,30, | 225,31, | 225,32, | 225,33, | 225,34, | 225,35, | 225,36, | 225,37, | 225,38, | 225,39, | 225,40, | 225,41, | 225,42, | 225,43, | 225,44, | 225,45, | 225,46, | 225,47, | 225,48, | 225,49, | 225,50, | 225,51, | 225,52, | 225,53, | 225,54, | 225,55, | 225,56, | 225,57, | 225,58, | 225,59, | 225,60, | 225,61, | 225,62, | 225,63, | 225,64, | 225,65, | 225,66, | 225,67, | 225,68, | 225,69, | 225,70, | 225,71, | 225,72, | 225,73, | 225,74, | 225,75, | 225,76, | 225,77, | 225,78, | 225,79, | 225,80, | 225,81, | 225,82, | 225,83, | 225,84, | 225,85, | 226,1, | 226,2, | 226,3, | 226,4, | 226,5, | 226,6, | 226,7, | 226,8, | 226,9, | 226,10, | 226,11, | 226,12, | 226,13, | 226,14, | 226,15, | 226,16, | 226,17, | 226,18, | 226,19, | 226,20, | 226,21, | 226,22, | 226,23, | 226,24, | 226,25, | 226,26, | 226,27, | 226,28, | 226,29, | 226,30, | 226,31, | 226,32, | 226,33, | 226,34, | 226,35, | 226,36, | 226,37, | 226,38, | 226,39, | 226,40, | 226,41, | 226,42, | 226,43, | 226,44, | 226,45, | 226,46, | 226,47, | 226,48, | 226,49, | 226,50, | 226,51, | 226,52, | 226,53, | 226,54, | 226,55, | 226,56, | 226,57, | 226,58, | 226,59, | 226,60, | 226,61, | 226,62, | 226,63, | 226,64, | 226,65, | 226,66, | 226,67, | 226,68, | 226,69, | 226,70, | 226,71, | 226,72, | 226,73, | 226,74, | 226,75, | 226,76, | 226,77, | 226,78, | 226,79, | 226,80, | 226,81, | 226,82, | 226,83, | 226,84, | 226,85, | 227,1, | 227,2, | 227,3, | 227,4, | 227,5, | 227,6, | 227,7, | 227,8, | 227,9, | 227,10, | 227,11, | 227,12, | 227,13, | 227,14, | 227,15, | 227,16, | 227,17, | 227,18, | 227,19, | 227,20, | 227,21, | 227,22, | 227,23, | 227,24, | 227,25, | 227,26, | 227,27, | 227,28, | 227,29, | 227,30, | 227,31, | 227,32, | 227,33, | 227,34, | 227,35, | 227,36, | 227,37, | 227,38, | 227,39, | 227,40, | 227,41, | 227,42, | 227,43, | 227,44, | 227,45, | 227,46, | 227,47, | 227,48, | 227,49, | 227,50, | 227,51, | 227,52, | 227,53, | 227,54, | 227,55, | 227,56, | 227,57, | 227,58, | 227,59, | 227,60, | 227,61, | 227,62, | 227,63, | 227,64, | 227,65, | 227,66, | 227,67, | 227,68, | 227,69, | 227,70, | 227,71, | 227,72, | 227,73, | 227,74, | 227,75, | 227,76, | 227,77, | 227,78, | 227,79, | 227,80, | 227,81, | 227,82, | 227,83, | 227,84, | 227,85, | 228,1, | 228,2, | 228,3, | 228,4, | 228,5, | 228,6, | 228,7, | 228,8, | 228,9, | 228,10, | 228,11, | 228,12, | 228,13, | 228,14, | 228,15, | 228,16, | 228,17, | 228,18, | 228,19, | 228,20, | 228,21, | 228,22, | 228,23, | 228,24, | 228,25, | 228,26, | 228,27, | 228,28, | 228,29, | 228,30, | 228,31, | 228,32, | 228,33, | 228,34, | 228,35, | 228,36, | 228,37, | 228,38, | 228,39, | 228,40, | 228,41, | 228,42, | 228,43, | 228,44, | 228,45, | 228,46, | 228,47, | 228,48, | 228,49, | 228,50, | 228,51, | 228,52, | 228,53, | 228,54, | 228,55, | 228,56, | 228,57, | 228,58, | 228,59, | 228,60, | 228,61, | 228,62, | 228,63, | 228,64, | 228,65, | 228,66, | 228,67, | 228,68, | 228,69, | 228,70, | 228,71, | 228,72, | 228,73, | 228,74, | 228,75, | 228,76, | 228,77, | 228,78, | 228,79, | 228,80, | 228,81, | 228,82, | 228,83, | 228,84, | 228,85, | 229,1, | 229,2, | 229,3, | 229,4, | 229,5, | 229,6, | 229,7, | 229,8, | 229,9, | 229,10, | 229,11, | 229,12, | 229,13, | 229,14, | 229,15, | 229,16, | 229,17, | 229,18, | 229,19, | 229,20, | 229,21, | 229,22, | 229,23, | 229,24, | 229,25, | 229,26, | 229,27, | 229,28, | 229,29, | 229,30, | 229,31, | 229,32, | 229,33, | 229,34, | 229,35, | 229,36, | 229,37, | 229,38, | 229,39, | 229,40, | 229,41, | 229,42, | 229,43, | 229,44, | 229,45, | 229,46, | 229,47, | 229,48, | 229,49, | 229,50, | 229,51, | 229,52, | 229,53, | 229,54, | 229,55, | 229,56, | 229,57, | 229,58, | 229,59, | 229,60, | 229,61, | 229,62, | 229,63, | 229,64, | 229,65, | 229,66, | 229,67, | 229,68, | 229,69, | 229,70, | 229,71, | 229,72, | 229,73, | 229,74, | 229,75, | 229,76, | 229,77, | 229,78, | 229,79, | 229,80, | 229,81, | 229,82, | 229,83, | 229,84, | 229,85, | 230,1, | 230,2, | 230,3, | 230,4, | 230,5, | 230,6, | 230,7, | 230,8, | 230,9, | 230,10, | 230,11, | 230,12, | 230,13, | 230,14, | 230,15, | 230,16, | 230,17, | 230,18, | 230,19, | 230,20, | 230,21, | 230,22, | 230,23, | 230,24, | 230,25, | 230,26, | 230,27, | 230,28, | 230,29, | 230,30, | 230,31, | 230,32, | 230,33, | 230,34, | 230,35, | 230,36, | 230,37, | 230,38, | 230,39, | 230,40, | 230,41, | 230,42, | 230,43, | 230,44, | 230,45, | 230,46, | 230,47, | 230,48, | 230,49, | 230,50, | 230,51, | 230,52, | 230,53, | 230,54, | 230,55, | 230,56, | 230,57, | 230,58, | 230,59, | 230,60, | 230,61, | 230,62, | 230,63, | 230,64, | 230,65, | 230,66, | 230,67, | 230,68, | 230,69, | 230,70, | 230,71, | 230,72, | 230,73, | 230,74, | 230,75, | 230,76, | 230,77, | 230,78, | 230,79, | 230,80, | 230,81, | 230,82, | 230,83, | 230,84, | 230,85, | 231,1, | 231,2, | 231,3, | 231,4, | 231,5, | 231,6, | 231,7, | 231,8, | 231,9, | 231,10, | 231,11, | 231,12, | 231,13, | 231,14, | 231,15, | 231,16, | 231,17, | 231,18, | 231,19, | 231,20, | 231,21, | 231,22, | 231,23, | 231,24, | 231,25, | 231,26, | 231,27, | 231,28, | 231,29, | 231,30, | 231,31, | 231,32, | 231,33, | 231,34, | 231,35, | 231,36, | 231,37, | 231,38, | 231,39, | 231,40, | 231,41, | 231,42, | 231,43, | 231,44, | 231,45, | 231,46, | 231,47, | 231,48, | 231,49, | 231,50, | 231,51, | 231,52, | 231,53, | 231,54, | 231,55, | 231,56, | 231,57, | 231,58, | 231,59, | 231,60, | 231,61, | 231,62, | 231,63, | 231,64, | 231,65, | 231,66, | 231,67, | 231,68, | 231,69, | 231,70, | 231,71, | 231,72, | 231,73, | 231,74, | 231,75, | 231,76, | 231,77, | 231,78, | 231,79, | 231,80, | 231,81, | 231,82, | 231,83, | 231,84, | 231,85, | 232,1, | 232,2, | 232,3, | 232,4, | 232,5, | 232,6, | 232,7, | 232,8, | 232,9, | 232,10, | 232,11, | 232,12, | 232,13, | 232,14, | 232,15, | 232,16, | 232,17, | 232,18, | 232,19, | 232,20, | 232,21, | 232,22, | 232,23, | 232,24, | 232,25, | 232,26, | 232,27, | 232,28, | 232,29, | 232,30, | 232,31, | 232,32, | 232,33, | 232,34, | 232,35, | 232,36, | 232,37, | 232,38, | 232,39, | 232,40, | 232,41, | 232,42, | 232,43, | 232,44, | 232,45, | 232,46, | 232,47, | 232,48, | 232,49, | 232,50, | 232,51, | 232,52, | 232,53, | 232,54, | 232,55, | 232,56, | 232,57, | 232,58, | 232,59, | 232,60, | 232,61, | 232,62, | 232,63, | 232,64, | 232,65, | 232,66, | 232,67, | 232,68, | 232,69, | 232,70, | 232,71, | 232,72, | 232,73, | 232,74, | 232,75, | 232,76, | 232,77, | 232,78, | 232,79, | 232,80, | 232,81, | 232,82, | 232,83, | 232,84, | 232,85, | 233,1, | 233,2, | 233,3, | 233,4, | 233,5, | 233,6, | 233,7, | 233,8, | 233,9, | 233,10, | 233,11, | 233,12, | 233,13, | 233,14, | 233,15, | 233,16, | 233,17, | 233,18, | 233,19, | 233,20, | 233,21, | 233,22, | 233,23, | 233,24, | 233,25, | 233,26, | 233,27, | 233,28, | 233,29, | 233,30, | 233,31, | 233,32, | 233,33, | 233,34, | 233,35, | 233,36, | 233,37, | 233,38, | 233,39, | 233,40, | 233,41, | 233,42, | 233,43, | 233,44, | 233,45, | 233,46, | 233,47, | 233,48, | 233,49, | 233,50, | 233,51, | 233,52, | 233,53, | 233,54, | 233,55, | 233,56, | 233,57, | 233,58, | 233,59, | 233,60, | 233,61, | 233,62, | 233,63, | 233,64, | 233,65, | 233,66, | 233,67, | 233,68, | 233,69, | 233,70, | 233,71, | 233,72, | 233,73, | 233,74, | 233,75, | 233,76, | 233,77, | 233,78, | 233,79, | 233,80, | 233,81, | 233,82, | 233,83, | 233,84, | 233,85, | 234,1, | 234,2, | 234,3, | 234,4, | 234,5, | 234,6, | 234,7, | 234,8, | 234,9, | 234,10, | 234,11, | 234,12, | 234,13, | 234,14, | 234,15, | 234,16, | 234,17, | 234,18, | 234,19, | 234,20, | 234,21, | 234,22, | 234,23, | 234,24, | 234,25, | 234,26, | 234,27, | 234,28, | 234,29, | 234,30, | 234,31, | 234,32, | 234,33, | 234,34, | 234,35, | 234,36, | 234,37, | 234,38, | 234,39, | 234,40, | 234,41, | 234,42, | 234,43, | 234,44, | 234,45, | 234,46, | 234,47, | 234,48, | 234,49, | 234,50, | 234,51, | 234,52, | 234,53, | 234,54, | 234,55, | 234,56, | 234,57, | 234,58, | 234,59, | 234,60, | 234,61, | 234,62, | 234,63, | 234,64, | 234,65, | 234,66, | 234,67, | 234,68, | 234,69, | 234,70, | 234,71, | 234,72, | 234,73, | 234,74, | 234,75, | 234,76, | 234,77, | 234,78, | 234,79, | 234,80, | 234,81, | 234,82, | 234,83, | 234,84, | 234,85, | 235,1, | 235,2, | 235,3, | 235,4, | 235,5, | 235,6, | 235,7, | 235,8, | 235,9, | 235,10, | 235,11, | 235,12, | 235,13, | 235,14, | 235,15, | 235,16, | 235,17, | 235,18, | 235,19, | 235,20, | 235,21, | 235,22, | 235,23, | 235,24, | 235,25, | 235,26, | 235,27, | 235,28, | 235,29, | 235,30, | 235,31, | 235,32, | 235,33, | 235,34, | 235,35, | 235,36, | 235,37, | 235,38, | 235,39, | 235,40, | 235,41, | 235,42, | 235,43, | 235,44, | 235,45, | 235,46, | 235,47, | 235,48, | 235,49, | 235,50, | 235,51, | 235,52, | 235,53, | 235,54, | 235,55, | 235,56, | 235,57, | 235,58, | 235,59, | 235,60, | 235,61, | 235,62, | 235,63, | 235,64, | 235,65, | 235,66, | 235,67, | 235,68, | 235,69, | 235,70, | 235,71, | 235,72, | 235,73, | 235,74, | 235,75, | 235,76, | 235,77, | 235,78, | 235,79, | 235,80, | 235,81, | 235,82, | 235,83, | 235,84, | 235,85, | 236,1, | 236,2, | 236,3, | 236,4, | 236,5, | 236,6, | 236,7, | 236,8, | 236,9, | 236,10, | 236,11, | 236,12, | 236,13, | 236,14, | 236,15, | 236,16, | 236,17, | 236,18, | 236,19, | 236,20, | 236,21, | 236,22, | 236,23, | 236,24, | 236,25, | 236,26, | 236,27, | 236,28, | 236,29, | 236,30, | 236,31, | 236,32, | 236,33, | 236,34, | 236,35, | 236,36, | 236,37, | 236,38, | 236,39, | 236,40, | 236,41, | 236,42, | 236,43, | 236,44, | 236,45, | 236,46, | 236,47, | 236,48, | 236,49, | 236,50, | 236,51, | 236,52, | 236,53, | 236,54, | 236,55, | 236,56, | 236,57, | 236,58, | 236,59, | 236,60, | 236,61, | 236,62, | 236,63, | 236,64, | 236,65, | 236,66, | 236,67, | 236,68, | 236,69, | 236,70, | 236,71, | 236,72, | 236,73, | 236,74, | 236,75, | 236,76, | 236,77, | 236,78, | 236,79, | 236,80, | 236,81, | 236,82, | 236,83, | 236,84, | 236,85, | 237,1, | 237,2, | 237,3, | 237,4, | 237,5, | 237,6, | 237,7, | 237,8, | 237,9, | 237,10, | 237,11, | 237,12, | 237,13, | 237,14, | 237,15, | 237,16, | 237,17, | 237,18, | 237,19, | 237,20, | 237,21, | 237,22, | 237,23, | 237,24, | 237,25, | 237,26, | 237,27, | 237,28, | 237,29, | 237,30, | 237,31, | 237,32, | 237,33, | 237,34, | 237,35, | 237,36, | 237,37, | 237,38, | 237,39, | 237,40, | 237,41, | 237,42, | 237,43, | 237,44, | 237,45, | 237,46, | 237,47, | 237,48, | 237,49, | 237,50, | 237,51, | 237,52, | 237,53, | 237,54, | 237,55, | 237,56, | 237,57, | 237,58, | 237,59, | 237,60, | 237,61, | 237,62, | 237,63, | 237,64, | 237,65, | 237,66, | 237,67, | 237,68, | 237,69, | 237,70, | 237,71, | 237,72, | 237,73, | 237,74, | 237,75, | 237,76, | 237,77, | 237,78, | 237,79, | 237,80, | 237,81, | 237,82, | 237,83, | 237,84, | 237,85, | 238,1, | 238,2, | 238,3, | 238,4, | 238,5, | 238,6, | 238,7, | 238,8, | 238,9, | 238,10, | 238,11, | 238,12, | 238,13, | 238,14, | 238,15, | 238,16, | 238,17, | 238,18, | 238,19, | 238,20, | 238,21, | 238,22, | 238,23, | 238,24, | 238,25, | 238,26, | 238,27, | 238,28, | 238,29, | 238,30, | 238,31, | 238,32, | 238,33, | 238,34, | 238,35, | 238,36, | 238,37, | 238,38, | 238,39, | 238,40, | 238,41, | 238,42, | 238,43, | 238,44, | 238,45, | 238,46, | 238,47, | 238,48, | 238,49, | 238,50, | 238,51, | 238,52, | 238,53, | 238,54, | 238,55, | 238,56, | 238,57, | 238,58, | 238,59, | 238,60, | 238,61, | 238,62, | 238,63, | 238,64, | 238,65, | 238,66, | 238,67, | 238,68, | 238,69, | 238,70, | 238,71, | 238,72, | 238,73, | 238,74, | 238,75, | 238,76, | 238,77, | 238,78, | 238,79, | 238,80, | 238,81, | 238,82, | 238,83, | 238,84, | 238,85, | 239,1, | 239,2, | 239,3, | 239,4, | 239,5, | 239,6, | 239,7, | 239,8, | 239,9, | 239,10, | 239,11, | 239,12, | 239,13, | 239,14, | 239,15, | 239,16, | 239,17, | 239,18, | 239,19, | 239,20, | 239,21, | 239,22, | 239,23, | 239,24, | 239,25, | 239,26, | 239,27, | 239,28, | 239,29, | 239,30, | 239,31, | 239,32, | 239,33, | 239,34, | 239,35, | 239,36, | 239,37, | 239,38, | 239,39, | 239,40, | 239,41, | 239,42, | 239,43, | 239,44, | 239,45, | 239,46, | 239,47, | 239,48, | 239,49, | 239,50, | 239,51, | 239,52, | 239,53, | 239,54, | 239,55, | 239,56, | 239,57, | 239,58, | 239,59, | 239,60, | 239,61, | 239,62, | 239,63, | 239,64, | 239,65, | 239,66, | 239,67, | 239,68, | 239,69, | 239,70, | 239,71, | 239,72, | 239,73, | 239,74, | 239,75, | 239,76, | 239,77, | 239,78, | 239,79, | 239,80, | 239,81, | 239,82, | 239,83, | 239,84, | 239,85, | 240,1, | 240,2, | 240,3, | 240,4, | 240,5, | 240,6, | 240,7, | 240,8, | 240,9, | 240,10, | 240,11, | 240,12, | 240,13, | 240,14, | 240,15, | 240,16, | 240,17, | 240,18, | 240,19, | 240,20, | 240,21, | 240,22, | 240,23, | 240,24, | 240,25, | 240,26, | 240,27, | 240,28, | 240,29, | 240,30, | 240,31, | 240,32, | 240,33, | 240,34, | 240,35, | 240,36, | 240,37, | 240,38, | 240,39, | 240,40, | 240,41, | 240,42, | 240,43, | 240,44, | 240,45, | 240,46, | 240,47, | 240,48, | 240,49, | 240,50, | 240,51, | 240,52, | 240,53, | 240,54, | 240,55, | 240,56, | 240,57, | 240,58, | 240,59, | 240,60, | 240,61, | 240,62, | 240,63, | 240,64, | 240,65, | 240,66, | 240,67, | 240,68, | 240,69, | 240,70, | 240,71, | 240,72, | 240,73, | 240,74, | 240,75, | 240,76, | 240,77, | 240,78, | 240,79, | 240,80, | 240,81, | 240,82, | 240,83, | 240,84, | 240,85, | 241,1, | 241,2, | 241,3, | 241,4, | 241,5, | 241,6, | 241,7, | 241,8, | 241,9, | 241,10, | 241,11, | 241,12, | 241,13, | 241,14, | 241,15, | 241,16, | 241,17, | 241,18, | 241,19, | 241,20, | 241,21, | 241,22, | 241,23, | 241,24, | 241,25, | 241,26, | 241,27, | 241,28, | 241,29, | 241,30, | 241,31, | 241,32, | 241,33, | 241,34, | 241,35, | 241,36, | 241,37, | 241,38, | 241,39, | 241,40, | 241,41, | 241,42, | 241,43, | 241,44, | 241,45, | 241,46, | 241,47, | 241,48, | 241,49, | 241,50, | 241,51, | 241,52, | 241,53, | 241,54, | 241,55, | 241,56, | 241,57, | 241,58, | 241,59, | 241,60, | 241,61, | 241,62, | 241,63, | 241,64, | 241,65, | 241,66, | 241,67, | 241,68, | 241,69, | 241,70, | 241,71, | 241,72, | 241,73, | 241,74, | 241,75, | 241,76, | 241,77, | 241,78, | 241,79, | 241,80, | 241,81, | 241,82, | 241,83, | 241,84, | 241,85, | 242,1, | 242,2, | 242,3, | 242,4, | 242,5, | 242,6, | 242,7, | 242,8, | 242,9, | 242,10, | 242,11, | 242,12, | 242,13, | 242,14, | 242,15, | 242,16, | 242,17, | 242,18, | 242,19, | 242,20, | 242,21, | 242,22, | 242,23, | 242,24, | 242,25, | 242,26, | 242,27, | 242,28, | 242,29, | 242,30, | 242,31, | 242,32, | 242,33, | 242,34, | 242,35, | 242,36, | 242,37, | 242,38, | 242,39, | 242,40, | 242,41, | 242,42, | 242,43, | 242,44, | 242,45, | 242,46, | 242,47, | 242,48, | 242,49, | 242,50, | 242,51, | 242,52, | 242,53, | 242,54, | 242,55, | 242,56, | 242,57, | 242,58, | 242,59, | 242,60, | 242,61, | 242,62, | 242,63, | 242,64, | 242,65, | 242,66, | 242,67, | 242,68, | 242,69, | 242,70, | 242,71, | 242,72, | 242,73, | 242,74, | 242,75, | 242,76, | 242,77, | 242,78, | 242,79, | 242,80, | 242,81, | 242,82, | 242,83, | 242,84, | 242,85, | 243,1, | 243,2, | 243,3, | 243,4, | 243,5, | 243,6, | 243,7, | 243,8, | 243,9, | 243,10, | 243,11, | 243,12, | 243,13, | 243,14, | 243,15, | 243,16, | 243,17, | 243,18, | 243,19, | 243,20, | 243,21, | 243,22, | 243,23, | 243,24, | 243,25, | 243,26, | 243,27, | 243,28, | 243,29, | 243,30, | 243,31, | 243,32, | 243,33, | 243,34, | 243,35, | 243,36, | 243,37, | 243,38, | 243,39, | 243,40, | 243,41, | 243,42, | 243,43, | 243,44, | 243,45, | 243,46, | 243,47, | 243,48, | 243,49, | 243,50, | 243,51, | 243,52, | 243,53, | 243,54, | 243,55, | 243,56, | 243,57, | 243,58, | 243,59, | 243,60, | 243,61, | 243,62, | 243,63, | 243,64, | 243,65, | 243,66, | 243,67, | 243,68, | 243,69, | 243,70, | 243,71, | 243,72, | 243,73, | 243,74, | 243,75, | 243,76, | 243,77, | 243,78, | 243,79, | 243,80, | 243,81, | 243,82, | 243,83, | 243,84, | 243,85, | 244,1, | 244,2, | 244,3, | 244,4, | 244,5, | 244,6, | 244,7, | 244,8, | 244,9, | 244,10, | 244,11, | 244,12, | 244,13, | 244,14, | 244,15, | 244,16, | 244,17, | 244,18, | 244,19, | 244,20, | 244,21, | 244,22, | 244,23, | 244,24, | 244,25, | 244,26, | 244,27, | 244,28, | 244,29, | 244,30, | 244,31, | 244,32, | 244,33, | 244,34, | 244,35, | 244,36, | 244,37, | 244,38, | 244,39, | 244,40, | 244,41, | 244,42, | 244,43, | 244,44, | 244,45, | 244,46, | 244,47, | 244,48, | 244,49, | 244,50, | 244,51, | 244,52, | 244,53, | 244,54, | 244,55, | 244,56, | 244,57, | 244,58, | 244,59, | 244,60, | 244,61, | 244,62, | 244,63, | 244,64, | 244,65, | 244,66, | 244,67, | 244,68, | 244,69, | 244,70, | 244,71, | 244,72, | 244,73, | 244,74, | 244,75, | 244,76, | 244,77, | 244,78, | 244,79, | 244,80, | 244,81, | 244,82, | 244,83, | 244,84, | 244,85, | 245,1, | 245,2, | 245,3, | 245,4, | 245,5, | 245,6, | 245,7, | 245,8, | 245,9, | 245,10, | 245,11, | 245,12, | 245,13, | 245,14, | 245,15, | 245,16, | 245,17, | 245,18, | 245,19, | 245,20, | 245,21, | 245,22, | 245,23, | 245,24, | 245,25, | 245,26, | 245,27, | 245,28, | 245,29, | 245,30, | 245,31, | 245,32, | 245,33, | 245,34, | 245,35, | 245,36, | 245,37, | 245,38, | 245,39, | 245,40, | 245,41, | 245,42, | 245,43, | 245,44, | 245,45, | 245,46, | 245,47, | 245,48, | 245,49, | 245,50, | 245,51, | 245,52, | 245,53, | 245,54, | 245,55, | 245,56, | 245,57, | 245,58, | 245,59, | 245,60, | 245,61, | 245,62, | 245,63, | 245,64, | 245,65, | 245,66, | 245,67, | 245,68, | 245,69, | 245,70, | 245,71, | 245,72, | 245,73, | 245,74, | 245,75, | 245,76, | 245,77, | 245,78, | 245,79, | 245,80, | 245,81, | 245,82, | 245,83, | 245,84, | 245,85, | 246,1, | 246,2, | 246,3, | 246,4, | 246,5, | 246,6, | 246,7, | 246,8, | 246,9, | 246,10, | 246,11, | 246,12, | 246,13, | 246,14, | 246,15, | 246,16, | 246,17, | 246,18, | 246,19, | 246,20, | 246,21, | 246,22, | 246,23, | 246,24, | 246,25, | 246,26, | 246,27, | 246,28, | 246,29, | 246,30, | 246,31, | 246,32, | 246,33, | 246,34, | 246,35, | 246,36, | 246,37, | 246,38, | 246,39, | 246,40, | 246,41, | 246,42, | 246,43, | 246,44, | 246,45, | 246,46, | 246,47, | 246,48, | 246,49, | 246,50, | 246,51, | 246,52, | 246,53, | 246,54, | 246,55, | 246,56, | 246,57, | 246,58, | 246,59, | 246,60, | 246,61, | 246,62, | 246,63, | 246,64, | 246,65, | 246,66, | 246,67, | 246,68, | 246,69, | 246,70, | 246,71, | 246,72, | 246,73, | 246,74, | 246,75, | 246,76, | 246,77, | 246,78, | 246,79, | 246,80, | 246,81, | 246,82, | 246,83, | 246,84, | 246,85, | 247,1, | 247,2, | 247,3, | 247,4, | 247,5, | 247,6, | 247,7, | 247,8, | 247,9, | 247,10, | 247,11, | 247,12, | 247,13, | 247,14, | 247,15, | 247,16, | 247,17, | 247,18, | 247,19, | 247,20, | 247,21, | 247,22, | 247,23, | 247,24, | 247,25, | 247,26, | 247,27, | 247,28, | 247,29, | 247,30, | 247,31, | 247,32, | 247,33, | 247,34, | 247,35, | 247,36, | 247,37, | 247,38, | 247,39, | 247,40, | 247,41, | 247,42, | 247,43, | 247,44, | 247,45, | 247,46, | 247,47, | 247,48, | 247,49, | 247,50, | 247,51, | 247,52, | 247,53, | 247,54, | 247,55, | 247,56, | 247,57, | 247,58, | 247,59, | 247,60, | 247,61, | 247,62, | 247,63, | 247,64, | 247,65, | 247,66, | 247,67, | 247,68, | 247,69, | 247,70, | 247,71, | 247,72, | 247,73, | 247,74, | 247,75, | 247,76, | 247,77, | 247,78, | 247,79, | 247,80, | 247,81, | 247,82, | 247,83, | 247,84, | 247,85, | 248,1, | 248,2, | 248,3, | 248,4, | 248,5, | 248,6, | 248,7, | 248,8, | 248,9, | 248,10, | 248,11, | 248,12, | 248,13, | 248,14, | 248,15, | 248,16, | 248,17, | 248,18, | 248,19, | 248,20, | 248,21, | 248,22, | 248,23, | 248,24, | 248,25, | 248,26, | 248,27, | 248,28, | 248,29, | 248,30, | 248,31, | 248,32, | 248,33, | 248,34, | 248,35, | 248,36, | 248,37, | 248,38, | 248,39, | 248,40, | 248,41, | 248,42, | 248,43, | 248,44, | 248,45, | 248,46, | 248,47, | 248,48, | 248,49, | 248,50, | 248,51, | 248,52, | 248,53, | 248,54, | 248,55, | 248,56, | 248,57, | 248,58, | 248,59, | 248,60, | 248,61, | 248,62, | 248,63, | 248,64, | 248,65, | 248,66, | 248,67, | 248,68, | 248,69, | 248,70, | 248,71, | 248,72, | 248,73, | 248,74, | 248,75, | 248,76, | 248,77, | 248,78, | 248,79, | 248,80, | 248,81, | 248,82, | 248,83, | 248,84, | 248,85, | 249,1, | 249,2, | 249,3, | 249,4, | 249,5, | 249,6, | 249,7, | 249,8, | 249,9, | 249,10, | 249,11, | 249,12, | 249,13, | 249,14, | 249,15, | 249,16, | 249,17, | 249,18, | 249,19, | 249,20, | 249,21, | 249,22, | 249,23, | 249,24, | 249,25, | 249,26, | 249,27, | 249,28, | 249,29, | 249,30, | 249,31, | 249,32, | 249,33, | 249,34, | 249,35, | 249,36, | 249,37, | 249,38, | 249,39, | 249,40, | 249,41, | 249,42, | 249,43, | 249,44, | 249,45, | 249,46, | 249,47, | 249,48, | 249,49, | 249,50, | 249,51, | 249,52, | 249,53, | 249,54, | 249,55, | 249,56, | 249,57, | 249,58, | 249,59, | 249,60, | 249,61, | 249,62, | 249,63, | 249,64, | 249,65, | 249,66, | 249,67, | 249,68, | 249,69, | 249,70, | 249,71, | 249,72, | 249,73, | 249,74, | 249,75, | 249,76, | 249,77, | 249,78, | 249,79, | 249,80, | 249,81, | 249,82, | 249,83, | 249,84, | 249,85, | 250,1, | 250,2, | 250,3, | 250,4, | 250,5, | 250,6, | 250,7, | 250,8, | 250,9, | 250,10, | 250,11, | 250,12, | 250,13, | 250,14, | 250,15, | 250,16, | 250,17, | 250,18, | 250,19, | 250,20, | 250,21, | 250,22, | 250,23, | 250,24, | 250,25, | 250,26, | 250,27, | 250,28, | 250,29, | 250,30, | 250,31, | 250,32, | 250,33, | 250,34, | 250,35, | 250,36, | 250,37, | 250,38, | 250,39, | 250,40, | 250,41, | 250,42, | 250,43, | 250,44, | 250,45, | 250,46, | 250,47, | 250,48, | 250,49, | 250,50, | 250,51, | 250,52, | 250,53, | 250,54, | 250,55, | 250,56, | 250,57, | 250,58, | 250,59, | 250,60, | 250,61, | 250,62, | 250,63, | 250,64, | 250,65, | 250,66, | 250,67, | 250,68, | 250,69, | 250,70, | 250,71, | 250,72, | 250,73, | 250,74, | 250,75, | 250,76, | 250,77, | 250,78, | 250,79, | 250,80, | 250,81, | 250,82, | 250,83, | 250,84, | 250,85, | 251,1, | 251,2, | 251,3, | 251,4, | 251,5, | 251,6, | 251,7, | 251,8, | 251,9, | 251,10, | 251,11, | 251,12, | 251,13, | 251,14, | 251,15, | 251,16, | 251,17, | 251,18, | 251,19, | 251,20, | 251,21, | 251,22, | 251,23, | 251,24, | 251,25, | 251,26, | 251,27, | 251,28, | 251,29, | 251,30, | 251,31, | 251,32, | 251,33, | 251,34, | 251,35, | 251,36, | 251,37, | 251,38, | 251,39, | 251,40, | 251,41, | 251,42, | 251,43, | 251,44, | 251,45, | 251,46, | 251,47, | 251,48, | 251,49, | 251,50, | 251,51, | 251,52, | 251,53, | 251,54, | 251,55, | 251,56, | 251,57, | 251,58, | 251,59, | 251,60, | 251,61, | 251,62, | 251,63, | 251,64, | 251,65, | 251,66, | 251,67, | 251,68, | 251,69, | 251,70, | 251,71, | 251,72, | 251,73, | 251,74, | 251,75, | 251,76, | 251,77, | 251,78, | 251,79, | 251,80, | 251,81, | 251,82, | 251,83, | 251,84, | 251,85, | 252,1, | 252,2, | 252,3, | 252,4, | 252,5, | 252,6, | 252,7, | 252,8, | 252,9, | 252,10, | 252,11, | 252,12, | 252,13, | 252,14, | 252,15, | 252,16, | 252,17, | 252,18, | 252,19, | 252,20, | 252,21, | 252,22, | 252,23, | 252,24, | 252,25, | 252,26, | 252,27, | 252,28, | 252,29, | 252,30, | 252,31, | 252,32, | 252,33, | 252,34, | 252,35, | 252,36, | 252,37, | 252,38, | 252,39, | 252,40, | 252,41, | 252,42, | 252,43, | 252,44, | 252,45, | 252,46, | 252,47, | 252,48, | 252,49, | 252,50, | 252,51, | 252,52, | 252,53, | 252,54, | 252,55, | 252,56, | 252,57, | 252,58, | 252,59, | 252,60, | 252,61, | 252,62, | 252,63, | 252,64, | 252,65, | 252,66, | 252,67, | 252,68, | 252,69, | 252,70, | 252,71, | 252,72, | 252,73, | 252,74, | 252,75, | 252,76, | 252,77, | 252,78, | 252,79, | 252,80, | 252,81, | 252,82, | 252,83, | 252,84, | 252,85, | 253,1, | 253,2, | 253,3, | 253,4, | 253,5, | 253,6, | 253,7, | 253,8, | 253,9, | 253,10, | 253,11, | 253,12, | 253,13, | 253,14, | 253,15, | 253,16, | 253,17, | 253,18, | 253,19, | 253,20, | 253,21, | 253,22, | 253,23, | 253,24, | 253,25, | 253,26, | 253,27, | 253,28, | 253,29, | 253,30, | 253,31, | 253,32, | 253,33, | 253,34, | 253,35, | 253,36, | 253,37, | 253,38, | 253,39, | 253,40, | 253,41, | 253,42, | 253,43, | 253,44, | 253,45, | 253,46, | 253,47, | 253,48, | 253,49, | 253,50, | 253,51, | 253,52, | 253,53, | 253,54, | 253,55, | 253,56, | 253,57, | 253,58, | 253,59, | 253,60, | 253,61, | 253,62, | 253,63, | 253,64, | 253,65, | 253,66, | 253,67, | 253,68, | 253,69, | 253,70, | 253,71, | 253,72, | 253,73, | 253,74, | 253,75, | 253,76, | 253,77, | 253,78, | 253,79, | 253,80, | 253,81, | 253,82, | 253,83, | 253,84, | 253,85, | 254,1, | 254,2, | 254,3, | 254,4, | 254,5, | 254,6, | 254,7, | 254,8, | 254,9, | 254,10, | 254,11, | 254,12, | 254,13, | 254,14, | 254,15, | 254,16, | 254,17, | 254,18, | 254,19, | 254,20, | 254,21, | 254,22, | 254,23, | 254,24, | 254,25, | 254,26, | 254,27, | 254,28, | 254,29, | 254,30, | 254,31, | 254,32, | 254,33, | 254,34, | 254,35, | 254,36, | 254,37, | 254,38, | 254,39, | 254,40, | 254,41, | 254,42, | 254,43, | 254,44, | 254,45, | 254,46, | 254,47, | 254,48, | 254,49, | 254,50, | 254,51, | 254,52, | 254,53, | 254,54, | 254,55, | 254,56, | 254,57, | 254,58, | 254,59, | 254,60, | 254,61, | 254,62, | 254,63, | 254,64, | 254,65, | 254,66, | 254,67, | 254,68, | 254,69, | 254,70, | 254,71, | 254,72, | 254,73, | 254,74, | 254,75, | 254,76, | 254,77, | 254,78, | 254,79, | 254,80, | 254,81, | 254,82, | 254,83, | 254,84, | 254,85, | 255,1, | 255,2, | 255,3, | 255,4, | 255,5, | 255,6, | 255,7, | 255,8, | 255,9, | 255,10, | 255,11, | 255,12, | 255,13, | 255,14, | 255,15, | 255,16, | 255,17, | 255,18, | 255,19, | 255,20, | 255,21, | 255,22, | 255,23, | 255,24, | 255,25, | 255,26, | 255,27, | 255,28, | 255,29, | 255,30, | 255,31, | 255,32, | 255,33, | 255,34, | 255,35, | 255,36, | 255,37, | 255,38, | 255,39, | 255,40, | 255,41, | 255,42, | 255,43, | 255,44, | 255,45, | 255,46, | 255,47, | 255,48, | 255,49, | 255,50, | 255,51, | 255,52, | 255,53, | 255,54, | 255,55, | 255,56, | 255,57, | 255,58, | 255,59, | 255,60, | 255,61, | 255,62, | 255,63, | 255,64, | 255,65, | 255,66, | 255,67, | 255,68, | 255,69, | 255,70, | 255,71, | 255,72, | 255,73, | 255,74, | 255,75, | 255,76, | 255,77, | 255,78, | 255,79, | 255,80, | 255,81, | 255,82, | 255,83, | 255,84, | 255,85, | 256,1, | 256,2, | 256,3, | 256,4, | 256,5, | 256,6, | 256,7, | 256,8, | 256,9, | 256,10, | 256,11, | 256,12, | 256,13, | 256,14, | 256,15, | 256,16, | 256,17, | 256,18, | 256,19, | 256,20, | 256,21, | 256,22, | 256,23, | 256,24, | 256,25, | 256,26, | 256,27, | 256,28, | 256,29, | 256,30, | 256,31, | 256,32, | 256,33, | 256,34, | 256,35, | 256,36, | 256,37, | 256,38, | 256,39, | 256,40, | 256,41, | 256,42, | 256,43, | 256,44, | 256,45, | 256,46, | 256,47, | 256,48, | 256,49, | 256,50, | 256,51, | 256,52, | 256,53, | 256,54, | 256,55, | 256,56, | 256,57, | 256,58, | 256,59, | 256,60, | 256,61, | 256,62, | 256,63, | 256,64, | 256,65, | 256,66, | 256,67, | 256,68, | 256,69, | 256,70, | 256,71, | 256,72, | 256,73, | 256,74, | 256,75, | 256,76, | 256,77, | 256,78, | 256,79, | 256,80, | 256,81, | 256,82, | 256,83, | 256,84, | 256,85, | 257,1, | 257,2, | 257,3, | 257,4, | 257,5, | 257,6, | 257,7, | 257,8, | 257,9, | 257,10, | 257,11, | 257,12, | 257,13, | 257,14, | 257,15, | 257,16, | 257,17, | 257,18, | 257,19, | 257,20, | 257,21, | 257,22, | 257,23, | 257,24, | 257,25, | 257,26, | 257,27, | 257,28, | 257,29, | 257,30, | 257,31, | 257,32, | 257,33, | 257,34, | 257,35, | 257,36, | 257,37, | 257,38, | 257,39, | 257,40, | 257,41, | 257,42, | 257,43, | 257,44, | 257,45, | 257,46, | 257,47, | 257,48, | 257,49, | 257,50, | 257,51, | 257,52, | 257,53, | 257,54, | 257,55, | 257,56, | 257,57, | 257,58, | 257,59, | 257,60, | 257,61, | 257,62, | 257,63, | 257,64, | 257,65, | 257,66, | 257,67, | 257,68, | 257,69, | 257,70, | 257,71, | 257,72, | 257,73, | 257,74, | 257,75, | 257,76, | 257,77, | 257,78, | 257,79, | 257,80, | 257,81, | 257,82, | 257,83, | 257,84, | 257,85, | 258,1, | 258,2, | 258,3, | 258,4, | 258,5, | 258,6, | 258,7, | 258,8, | 258,9, | 258,10, | 258,11, | 258,12, | 258,13, | 258,14, | 258,15, | 258,16, | 258,17, | 258,18, | 258,19, | 258,20, | 258,21, | 258,22, | 258,23, | 258,24, | 258,25, | 258,26, | 258,27, | 258,28, | 258,29, | 258,30, | 258,31, | 258,32, | 258,33, | 258,34, | 258,35, | 258,36, | 258,37, | 258,38, | 258,39, | 258,40, | 258,41, | 258,42, | 258,43, | 258,44, | 258,45, | 258,46, | 258,47, | 258,48, | 258,49, | 258,50, | 258,51, | 258,52, | 258,53, | 258,54, | 258,55, | 258,56, | 258,57, | 258,58, | 258,59, | 258,60, | 258,61, | 258,62, | 258,63, | 258,64, | 258,65, | 258,66, | 258,67, | 258,68, | 258,69, | 258,70, | 258,71, | 258,72, | 258,73, | 258,74, | 258,75, | 258,76, | 258,77, | 258,78, | 258,79, | 258,80, | 258,81, | 258,82, | 258,83, | 258,84, | 258,85, | 259,1, | 259,2, | 259,3, | 259,4, | 259,5, | 259,6, | 259,7, | 259,8, | 259,9, | 259,10, | 259,11, | 259,12, | 259,13, | 259,14, | 259,15, | 259,16, | 259,17, | 259,18, | 259,19, | 259,20, | 259,21, | 259,22, | 259,23, | 259,24, | 259,25, | 259,26, | 259,27, | 259,28, | 259,29, | 259,30, | 259,31, | 259,32, | 259,33, | 259,34, | 259,35, | 259,36, | 259,37, | 259,38, | 259,39, | 259,40, | 259,41, | 259,42, | 259,43, | 259,44, | 259,45, | 259,46, | 259,47, | 259,48, | 259,49, | 259,50, | 259,51, | 259,52, | 259,53, | 259,54, | 259,55, | 259,56, | 259,57, | 259,58, | 259,59, | 259,60, | 259,61, | 259,62, | 259,63, | 259,64, | 259,65, | 259,66, | 259,67, | 259,68, | 259,69, | 259,70, | 259,71, | 259,72, | 259,73, | 259,74, | 259,75, | 259,76, | 259,77, | 259,78, | 259,79, | 259,80, | 259,81, | 259,82, | 259,83, | 259,84, | 259,85, | 260,1, | 260,2, | 260,3, | 260,4, | 260,5, | 260,6, | 260,7, | 260,8, | 260,9, | 260,10, | 260,11, | 260,12, | 260,13, | 260,14, | 260,15, | 260,16, | 260,17, | 260,18, | 260,19, | 260,20, | 260,21, | 260,22, | 260,23, | 260,24, | 260,25, | 260,26, | 260,27, | 260,28, | 260,29, | 260,30, | 260,31, | 260,32, | 260,33, | 260,34, | 260,35, | 260,36, | 260,37, | 260,38, | 260,39, | 260,40, | 260,41, | 260,42, | 260,43, | 260,44, | 260,45, | 260,46, | 260,47, | 260,48, | 260,49, | 260,50, | 260,51, | 260,52, | 260,53, | 260,54, | 260,55, | 260,56, | 260,57, | 260,58, | 260,59, | 260,60, | 260,61, | 260,62, | 260,63, | 260,64, | 260,65, | 260,66, | 260,67, | 260,68, | 260,69, | 260,70, | 260,71, | 260,72, | 260,73, | 260,74, | 260,75, | 260,76, | 260,77, | 260,78, | 260,79, | 260,80, | 260,81, | 260,82, | 260,83, | 260,84, | 260,85, | 261,1, | 261,2, | 261,3, | 261,4, | 261,5, | 261,6, | 261,7, | 261,8, | 261,9, | 261,10, | 261,11, | 261,12, | 261,13, | 261,14, | 261,15, | 261,16, | 261,17, | 261,18, | 261,19, | 261,20, | 261,21, | 261,22, | 261,23, | 261,24, | 261,25, | 261,26, | 261,27, | 261,28, | 261,29, | 261,30, | 261,31, | 261,32, | 261,33, | 261,34, | 261,35, | 261,36, | 261,37, | 261,38, | 261,39, | 261,40, | 261,41, | 261,42, | 261,43, | 261,44, | 261,45, | 261,46, | 261,47, | 261,48, | 261,49, | 261,50, | 261,51, | 261,52, | 261,53, | 261,54, | 261,55, | 261,56, | 261,57, | 261,58, | 261,59, | 261,60, | 261,61, | 261,62, | 261,63, | 261,64, | 261,65, | 261,66, | 261,67, | 261,68, | 261,69, | 261,70, | 261,71, | 261,72, | 261,73, | 261,74, | 261,75, | 261,76, | 261,77, | 261,78, | 261,79, | 261,80, | 261,81, | 261,82, | 261,83, | 261,84, | 261,85, | 262,1, | 262,2, | 262,3, | 262,4, | 262,5, | 262,6, | 262,7, | 262,8, | 262,9, | 262,10, | 262,11, | 262,12, | 262,13, | 262,14, | 262,15, | 262,16, | 262,17, | 262,18, | 262,19, | 262,20, | 262,21, | 262,22, | 262,23, | 262,24, | 262,25, | 262,26, | 262,27, | 262,28, | 262,29, | 262,30, | 262,31, | 262,32, | 262,33, | 262,34, | 262,35, | 262,36, | 262,37, | 262,38, | 262,39, | 262,40, | 262,41, | 262,42, | 262,43, | 262,44, | 262,45, | 262,46, | 262,47, | 262,48, | 262,49, | 262,50, | 262,51, | 262,52, | 262,53, | 262,54, | 262,55, | 262,56, | 262,57, | 262,58, | 262,59, | 262,60, | 262,61, | 262,62, | 262,63, | 262,64, | 262,65, | 262,66, | 262,67, | 262,68, | 262,69, | 262,70, | 262,71, | 262,72, | 262,73, | 262,74, | 262,75, | 262,76, | 262,77, | 262,78, | 262,79, | 262,80, | 262,81, | 262,82, | 262,83, | 262,84, | 262,85, | 263,1, | 263,2, | 263,3, | 263,4, | 263,5, | 263,6, | 263,7, | 263,8, | 263,9, | 263,10, | 263,11, | 263,12, | 263,13, | 263,14, | 263,15, | 263,16, | 263,17, | 263,18, | 263,19, | 263,20, | 263,21, | 263,22, | 263,23, | 263,24, | 263,25, | 263,26, | 263,27, | 263,28, | 263,29, | 263,30, | 263,31, | 263,32, | 263,33, | 263,34, | 263,35, | 263,36, | 263,37, | 263,38, | 263,39, | 263,40, | 263,41, | 263,42, | 263,43, | 263,44, | 263,45, | 263,46, | 263,47, | 263,48, | 263,49, | 263,50, | 263,51, | 263,52, | 263,53, | 263,54, | 263,55, | 263,56, | 263,57, | 263,58, | 263,59, | 263,60, | 263,61, | 263,62, | 263,63, | 263,64, | 263,65, | 263,66, | 263,67, | 263,68, | 263,69, | 263,70, | 263,71, | 263,72, | 263,73, | 263,74, | 263,75, | 263,76, | 263,77, | 263,78, | 263,79, | 263,80, | 263,81, | 263,82, | 263,83, | 263,84, | 263,85, | 264,1, | 264,2, | 264,3, | 264,4, | 264,5, | 264,6, | 264,7, | 264,8, | 264,9, | 264,10, | 264,11, | 264,12, | 264,13, | 264,14, | 264,15, | 264,16, | 264,17, | 264,18, | 264,19, | 264,20, | 264,21, | 264,22, | 264,23, | 264,24, | 264,25, | 264,26, | 264,27, | 264,28, | 264,29, | 264,30, | 264,31, | 264,32, | 264,33, | 264,34, | 264,35, | 264,36, | 264,37, | 264,38, | 264,39, | 264,40, | 264,41, | 264,42, | 264,43, | 264,44, | 264,45, | 264,46, | 264,47, | 264,48, | 264,49, | 264,50, | 264,51, | 264,52, | 264,53, | 264,54, | 264,55, | 264,56, | 264,57, | 264,58, | 264,59, | 264,60, | 264,61, | 264,62, | 264,63, | 264,64, | 264,65, | 264,66, | 264,67, | 264,68, | 264,69, | 264,70, | 264,71, | 264,72, | 264,73, | 264,74, | 264,75, | 264,76, | 264,77, | 264,78, | 264,79, | 264,80, | 264,81, | 264,82, | 264,83, | 264,84, | 264,85, | 265,1, | 265,2, | 265,3, | 265,4, | 265,5, | 265,6, | 265,7, | 265,8, | 265,9, | 265,10, | 265,11, | 265,12, | 265,13, | 265,14, | 265,15, | 265,16, | 265,17, | 265,18, | 265,19, | 265,20, | 265,21, | 265,22, | 265,23, | 265,24, | 265,25, | 265,26, | 265,27, | 265,28, | 265,29, | 265,30, | 265,31, | 265,32, | 265,33, | 265,34, | 265,35, | 265,36, | 265,37, | 265,38, | 265,39, | 265,40, | 265,41, | 265,42, | 265,43, | 265,44, | 265,45, | 265,46, | 265,47, | 265,48, | 265,49, | 265,50, | 265,51, | 265,52, | 265,53, | 265,54, | 265,55, | 265,56, | 265,57, | 265,58, | 265,59, | 265,60, | 265,61, | 265,62, | 265,63, | 265,64, | 265,65, | 265,66, | 265,67, | 265,68, | 265,69, | 265,70, | 265,71, | 265,72, | 265,73, | 265,74, | 265,75, | 265,76, | 265,77, | 265,78, | 265,79, | 265,80, | 265,81, | 265,82, | 265,83, | 265,84, | 265,85, | 266,1, | 266,2, | 266,3, | 266,4, | 266,5, | 266,6, | 266,7, | 266,8, | 266,9, | 266,10, | 266,11, | 266,12, | 266,13, | 266,14, | 266,15, | 266,16, | 266,17, | 266,18, | 266,19, | 266,20, | 266,21, | 266,22, | 266,23, | 266,24, | 266,25, | 266,26, | 266,27, | 266,28, | 266,29, | 266,30, | 266,31, | 266,32, | 266,33, | 266,34, | 266,35, | 266,36, | 266,37, | 266,38, | 266,39, | 266,40, | 266,41, | 266,42, | 266,43, | 266,44, | 266,45, | 266,46, | 266,47, | 266,48, | 266,49, | 266,50, | 266,51, | 266,52, | 266,53, | 266,54, | 266,55, | 266,56, | 266,57, | 266,58, | 266,59, | 266,60, | 266,61, | 266,62, | 266,63, | 266,64, | 266,65, | 266,66, | 266,67, | 266,68, | 266,69, | 266,70, | 266,71, | 266,72, | 266,73, | 266,74, | 266,75, | 266,76, | 266,77, | 266,78, | 266,79, | 266,80, | 266,81, | 266,82, | 266,83, | 266,84, | 266,85, | 267,1, | 267,2, | 267,3, | 267,4, | 267,5, | 267,6, | 267,7, | 267,8, | 267,9, | 267,10, | 267,11, | 267,12, | 267,13, | 267,14, | 267,15, | 267,16, | 267,17, | 267,18, | 267,19, | 267,20, | 267,21, | 267,22, | 267,23, | 267,24, | 267,25, | 267,26, | 267,27, | 267,28, | 267,29, | 267,30, | 267,31, | 267,32, | 267,33, | 267,34, | 267,35, | 267,36, | 267,37, | 267,38, | 267,39, | 267,40, | 267,41, | 267,42, | 267,43, | 267,44, | 267,45, | 267,46, | 267,47, | 267,48, | 267,49, | 267,50, | 267,51, | 267,52, | 267,53, | 267,54, | 267,55, | 267,56, | 267,57, | 267,58, | 267,59, | 267,60, | 267,61, | 267,62, | 267,63, | 267,64, | 267,65, | 267,66, | 267,67, | 267,68, | 267,69, | 267,70, | 267,71, | 267,72, | 267,73, | 267,74, | 267,75, | 267,76, | 267,77, | 267,78, | 267,79, | 267,80, | 267,81, | 267,82, | 267,83, | 267,84, | 267,85, | 268,1, | 268,2, | 268,3, | 268,4, | 268,5, | 268,6, | 268,7, | 268,8, | 268,9, | 268,10, | 268,11, | 268,12, | 268,13, | 268,14, | 268,15, | 268,16, | 268,17, | 268,18, | 268,19, | 268,20, | 268,21, | 268,22, | 268,23, | 268,24, | 268,25, | 268,26, | 268,27, | 268,28, | 268,29, | 268,30, | 268,31, | 268,32, | 268,33, | 268,34, | 268,35, | 268,36, | 268,37, | 268,38, | 268,39, | 268,40, | 268,41, | 268,42, | 268,43, | 268,44, | 268,45, | 268,46, | 268,47, | 268,48, | 268,49, | 268,50, | 268,51, | 268,52, | 268,53, | 268,54, | 268,55, | 268,56, | 268,57, | 268,58, | 268,59, | 268,60, | 268,61, | 268,62, | 268,63, | 268,64, | 268,65, | 268,66, | 268,67, | 268,68, | 268,69, | 268,70, | 268,71, | 268,72, | 268,73, | 268,74, | 268,75, | 268,76, | 268,77, | 268,78, | 268,79, | 268,80, | 268,81, | 268,82, | 268,83, | 268,84, | 268,85, | 269,1, | 269,2, | 269,3, | 269,4, | 269,5, | 269,6, | 269,7, | 269,8, | 269,9, | 269,10, | 269,11, | 269,12, | 269,13, | 269,14, | 269,15, | 269,16, | 269,17, | 269,18, | 269,19, | 269,20, | 269,21, | 269,22, | 269,23, | 269,24, | 269,25, | 269,26, | 269,27, | 269,28, | 269,29, | 269,30, | 269,31, | 269,32, | 269,33, | 269,34, | 269,35, | 269,36, | 269,37, | 269,38, | 269,39, | 269,40, | 269,41, | 269,42, | 269,43, | 269,44, | 269,45, | 269,46, | 269,47, | 269,48, | 269,49, | 269,50, | 269,51, | 269,52, | 269,53, | 269,54, | 269,55, | 269,56, | 269,57, | 269,58, | 269,59, | 269,60, | 269,61, | 269,62, | 269,63, | 269,64, | 269,65, | 269,66, | 269,67, | 269,68, | 269,69, | 269,70, | 269,71, | 269,72, | 269,73, | 269,74, | 269,75, | 269,76, | 269,77, | 269,78, | 269,79, | 269,80, | 269,81, | 269,82, | 269,83, | 269,84, | 269,85, | 270,1, | 270,2, | 270,3, | 270,4, | 270,5, | 270,6, | 270,7, | 270,8, | 270,9, | 270,10, | 270,11, | 270,12, | 270,13, | 270,14, | 270,15, | 270,16, | 270,17, | 270,18, | 270,19, | 270,20, | 270,21, | 270,22, | 270,23, | 270,24, | 270,25, | 270,26, | 270,27, | 270,28, | 270,29, | 270,30, | 270,31, | 270,32, | 270,33, | 270,34, | 270,35, | 270,36, | 270,37, | 270,38, | 270,39, | 270,40, | 270,41, | 270,42, | 270,43, | 270,44, | 270,45, | 270,46, | 270,47, | 270,48, | 270,49, | 270,50, | 270,51, | 270,52, | 270,53, | 270,54, | 270,55, | 270,56, | 270,57, | 270,58, | 270,59, | 270,60, | 270,61, | 270,62, | 270,63, | 270,64, | 270,65, | 270,66, | 270,67, | 270,68, | 270,69, | 270,70, | 270,71, | 270,72, | 270,73, | 270,74, | 270,75, | 270,76, | 270,77, | 270,78, | 270,79, | 270,80, | 270,81, | 270,82, | 270,83, | 270,84, | 270,85, | 271,1, | 271,2, | 271,3, | 271,4, | 271,5, | 271,6, | 271,7, | 271,8, | 271,9, | 271,10, | 271,11, | 271,12, | 271,13, | 271,14, | 271,15, | 271,16, | 271,17, | 271,18, | 271,19, | 271,20, | 271,21, | 271,22, | 271,23, | 271,24, | 271,25, | 271,26, | 271,27, | 271,28, | 271,29, | 271,30, | 271,31, | 271,32, | 271,33, | 271,34, | 271,35, | 271,36, | 271,37, | 271,38, | 271,39, | 271,40, | 271,41, | 271,42, | 271,43, | 271,44, | 271,45, | 271,46, | 271,47, | 271,48, | 271,49, | 271,50, | 271,51, | 271,52, | 271,53, | 271,54, | 271,55, | 271,56, | 271,57, | 271,58, | 271,59, | 271,60, | 271,61, | 271,62, | 271,63, | 271,64, | 271,65, | 271,66, | 271,67, | 271,68, | 271,69, | 271,70, | 271,71, | 271,72, | 271,73, | 271,74, | 271,75, | 271,76, | 271,77, | 271,78, | 271,79, | 271,80, | 271,81, | 271,82, | 271,83, | 271,84, | 271,85, | 272,1, | 272,2, | 272,3, | 272,4, | 272,5, | 272,6, | 272,7, | 272,8, | 272,9, | 272,10, | 272,11, | 272,12, | 272,13, | 272,14, | 272,15, | 272,16, | 272,17, | 272,18, | 272,19, | 272,20, | 272,21, | 272,22, | 272,23, | 272,24, | 272,25, | 272,26, | 272,27, | 272,28, | 272,29, | 272,30, | 272,31, | 272,32, | 272,33, | 272,34, | 272,35, | 272,36, | 272,37, | 272,38, | 272,39, | 272,40, | 272,41, | 272,42, | 272,43, | 272,44, | 272,45, | 272,46, | 272,47, | 272,48, | 272,49, | 272,50, | 272,51, | 272,52, | 272,53, | 272,54, | 272,55, | 272,56, | 272,57, | 272,58, | 272,59, | 272,60, | 272,61, | 272,62, | 272,63, | 272,64, | 272,65, | 272,66, | 272,67, | 272,68, | 272,69, | 272,70, | 272,71, | 272,72, | 272,73, | 272,74, | 272,75, | 272,76, | 272,77, | 272,78, | 272,79, | 272,80, | 272,81, | 272,82, | 272,83, | 272,84, | 272,85, | 273,1, | 273,2, | 273,3, | 273,4, | 273,5, | 273,6, | 273,7, | 273,8, | 273,9, | 273,10, | 273,11, | 273,12, | 273,13, | 273,14, | 273,15, | 273,16, | 273,17, | 273,18, | 273,19, | 273,20, | 273,21, | 273,22, | 273,23, | 273,24, | 273,25, | 273,26, | 273,27, | 273,28, | 273,29, | 273,30, | 273,31, | 273,32, | 273,33, | 273,34, | 273,35, | 273,36, | 273,37, | 273,38, | 273,39, | 273,40, | 273,41, | 273,42, | 273,43, | 273,44, | 273,45, | 273,46, | 273,47, | 273,48, | 273,49, | 273,50, | 273,51, | 273,52, | 273,53, | 273,54, | 273,55, | 273,56, | 273,57, | 273,58, | 273,59, | 273,60, | 273,61, | 273,62, | 273,63, | 273,64, | 273,65, | 273,66, | 273,67, | 273,68, | 273,69, | 273,70, | 273,71, | 273,72, | 273,73, | 273,74, | 273,75, | 273,76, | 273,77, | 273,78, | 273,79, | 273,80, | 273,81, | 273,82, | 273,83, | 273,84, | 273,85, | 274,1, | 274,2, | 274,3, | 274,4, | 274,5, | 274,6, | 274,7, | 274,8, | 274,9, | 274,10, | 274,11, | 274,12, | 274,13, | 274,14, | 274,15, | 274,16, | 274,17, | 274,18, | 274,19, | 274,20, | 274,21, | 274,22, | 274,23, | 274,24, | 274,25, | 274,26, | 274,27, | 274,28, | 274,29, | 274,30, | 274,31, | 274,32, | 274,33, | 274,34, | 274,35, | 274,36, | 274,37, | 274,38, | 274,39, | 274,40, | 274,41, | 274,42, | 274,43, | 274,44, | 274,45, | 274,46, | 274,47, | 274,48, | 274,49, | 274,50, | 274,51, | 274,52, | 274,53, | 274,54, | 274,55, | 274,56, | 274,57, | 274,58, | 274,59, | 274,60, | 274,61, | 274,62, | 274,63, | 274,64, | 274,65, | 274,66, | 274,67, | 274,68, | 274,69, | 274,70, | 274,71, | 274,72, | 274,73, | 274,74, | 274,75, | 274,76, | 274,77, | 274,78, | 274,79, | 274,80, | 274,81, | 274,82, | 274,83, | 274,84, | 274,85, | 275,1, | 275,2, | 275,3, | 275,4, | 275,5, | 275,6, | 275,7, | 275,8, | 275,9, | 275,10, | 275,11, | 275,12, | 275,13, | 275,14, | 275,15, | 275,16, | 275,17, | 275,18, | 275,19, | 275,20, | 275,21, | 275,22, | 275,23, | 275,24, | 275,25, | 275,26, | 275,27, | 275,28, | 275,29, | 275,30, | 275,31, | 275,32, | 275,33, | 275,34, | 275,35, | 275,36, | 275,37, | 275,38, | 275,39, | 275,40, | 275,41, | 275,42, | 275,43, | 275,44, | 275,45, | 275,46, | 275,47, | 275,48, | 275,49, | 275,50, | 275,51, | 275,52, | 275,53, | 275,54, | 275,55, | 275,56, | 275,57, | 275,58, | 275,59, | 275,60, | 275,61, | 275,62, | 275,63, | 275,64, | 275,65, | 275,66, | 275,67, | 275,68, | 275,69, | 275,70, | 275,71, | 275,72, | 275,73, | 275,74, | 275,75, | 275,76, | 275,77, | 275,78, | 275,79, | 275,80, | 275,81, | 275,82, | 275,83, | 275,84, | 275,85, | 276,1, | 276,2, | 276,3, | 276,4, | 276,5, | 276,6, | 276,7, | 276,8, | 276,9, | 276,10, | 276,11, | 276,12, | 276,13, | 276,14, | 276,15, | 276,16, | 276,17, | 276,18, | 276,19, | 276,20, | 276,21, | 276,22, | 276,23, | 276,24, | 276,25, | 276,26, | 276,27, | 276,28, | 276,29, | 276,30, | 276,31, | 276,32, | 276,33, | 276,34, | 276,35, | 276,36, | 276,37, | 276,38, | 276,39, | 276,40, | 276,41, | 276,42, | 276,43, | 276,44, | 276,45, | 276,46, | 276,47, | 276,48, | 276,49, | 276,50, | 276,51, | 276,52, | 276,53, | 276,54, | 276,55, | 276,56, | 276,57, | 276,58, | 276,59, | 276,60, | 276,61, | 276,62, | 276,63, | 276,64, | 276,65, | 276,66, | 276,67, | 276,68, | 276,69, | 276,70, | 276,71, | 276,72, | 276,73, | 276,74, | 276,75, | 276,76, | 276,77, | 276,78, | 276,79, | 276,80, | 276,81, | 276,82, | 276,83, | 276,84, | 276,85, | 277,1, | 277,2, | 277,3, | 277,4, | 277,5, | 277,6, | 277,7, | 277,8, | 277,9, | 277,10, | 277,11, | 277,12, | 277,13, | 277,14, | 277,15, | 277,16, | 277,17, | 277,18, | 277,19, | 277,20, | 277,21, | 277,22, | 277,23, | 277,24, | 277,25, | 277,26, | 277,27, | 277,28, | 277,29, | 277,30, | 277,31, | 277,32, | 277,33, | 277,34, | 277,35, | 277,36, | 277,37, | 277,38, | 277,39, | 277,40, | 277,41, | 277,42, | 277,43, | 277,44, | 277,45, | 277,46, | 277,47, | 277,48, | 277,49, | 277,50, | 277,51, | 277,52, | 277,53, | 277,54, | 277,55, | 277,56, | 277,57, | 277,58, | 277,59, | 277,60, | 277,61, | 277,62, | 277,63, | 277,64, | 277,65, | 277,66, | 277,67, | 277,68, | 277,69, | 277,70, | 277,71, | 277,72, | 277,73, | 277,74, | 277,75, | 277,76, | 277,77, | 277,78, | 277,79, | 277,80, | 277,81, | 277,82, | 277,83, | 277,84, | 277,85, | 278,1, | 278,2, | 278,3, | 278,4, | 278,5, | 278,6, | 278,7, | 278,8, | 278,9, | 278,10, | 278,11, | 278,12, | 278,13, | 278,14, | 278,15, | 278,16, | 278,17, | 278,18, | 278,19, | 278,20, | 278,21, | 278,22, | 278,23, | 278,24, | 278,25, | 278,26, | 278,27, | 278,28, | 278,29, | 278,30, | 278,31, | 278,32, | 278,33, | 278,34, | 278,35, | 278,36, | 278,37, | 278,38, | 278,39, | 278,40, | 278,41, | 278,42, | 278,43, | 278,44, | 278,45, | 278,46, | 278,47, | 278,48, | 278,49, | 278,50, | 278,51, | 278,52, | 278,53, | 278,54, | 278,55, | 278,56, | 278,57, | 278,58, | 278,59, | 278,60, | 278,61, | 278,62, | 278,63, | 278,64, | 278,65, | 278,66, | 278,67, | 278,68, | 278,69, | 278,70, | 278,71, | 278,72, | 278,73, | 278,74, | 278,75, | 278,76, | 278,77, | 278,78, | 278,79, | 278,80, | 278,81, | 278,82, | 278,83, | 278,84, | 278,85, | 279,1, | 279,2, | 279,3, | 279,4, | 279,5, | 279,6, | 279,7, | 279,8, | 279,9, | 279,10, | 279,11, | 279,12, | 279,13, | 279,14, | 279,15, | 279,16, | 279,17, | 279,18, | 279,19, | 279,20, | 279,21, | 279,22, | 279,23, | 279,24, | 279,25, | 279,26, | 279,27, | 279,28, | 279,29, | 279,30, | 279,31, | 279,32, | 279,33, | 279,34, | 279,35, | 279,36, | 279,37, | 279,38, | 279,39, | 279,40, | 279,41, | 279,42, | 279,43, | 279,44, | 279,45, | 279,46, | 279,47, | 279,48, | 279,49, | 279,50, | 279,51, | 279,52, | 279,53, | 279,54, | 279,55, | 279,56, | 279,57, | 279,58, | 279,59, | 279,60, | 279,61, | 279,62, | 279,63, | 279,64, | 279,65, | 279,66, | 279,67, | 279,68, | 279,69, | 279,70, | 279,71, | 279,72, | 279,73, | 279,74, | 279,75, | 279,76, | 279,77, | 279,78, | 279,79, | 279,80, | 279,81, | 279,82, | 279,83, | 279,84, | 279,85, | 280,1, | 280,2, | 280,3, | 280,4, | 280,5, | 280,6, | 280,7, | 280,8, | 280,9, | 280,10, | 280,11, | 280,12, | 280,13, | 280,14, | 280,15, | 280,16, | 280,17, | 280,18, | 280,19, | 280,20, | 280,21, | 280,22, | 280,23, | 280,24, | 280,25, | 280,26, | 280,27, | 280,28, | 280,29, | 280,30, | 280,31, | 280,32, | 280,33, | 280,34, | 280,35, | 280,36, | 280,37, | 280,38, | 280,39, | 280,40, | 280,41, | 280,42, | 280,43, | 280,44, | 280,45, | 280,46, | 280,47, | 280,48, | 280,49, | 280,50, | 280,51, | 280,52, | 280,53, | 280,54, | 280,55, | 280,56, | 280,57, | 280,58, | 280,59, | 280,60, | 280,61, | 280,62, | 280,63, | 280,64, | 280,65, | 280,66, | 280,67, | 280,68, | 280,69, | 280,70, | 280,71, | 280,72, | 280,73, | 280,74, | 280,75, | 280,76, | 280,77, | 280,78, | 280,79, | 280,80, | 280,81, | 280,82, | 280,83, | 280,84, | 280,85, | 281,1, | 281,2, | 281,3, | 281,4, | 281,5, | 281,6, | 281,7, | 281,8, | 281,9, | 281,10, | 281,11, | 281,12, | 281,13, | 281,14, | 281,15, | 281,16, | 281,17, | 281,18, | 281,19, | 281,20, | 281,21, | 281,22, | 281,23, | 281,24, | 281,25, | 281,26, | 281,27, | 281,28, | 281,29, | 281,30, | 281,31, | 281,32, | 281,33, | 281,34, | 281,35, | 281,36, | 281,37, | 281,38, | 281,39, | 281,40, | 281,41, | 281,42, | 281,43, | 281,44, | 281,45, | 281,46, | 281,47, | 281,48, | 281,49, | 281,50, | 281,51, | 281,52, | 281,53, | 281,54, | 281,55, | 281,56, | 281,57, | 281,58, | 281,59, | 281,60, | 281,61, | 281,62, | 281,63, | 281,64, | 281,65, | 281,66, | 281,67, | 281,68, | 281,69, | 281,70, | 281,71, | 281,72, | 281,73, | 281,74, | 281,75, | 281,76, | 281,77, | 281,78, | 281,79, | 281,80, | 281,81, | 281,82, | 281,83, | 281,84, | 281,85, | 282,1, | 282,2, | 282,3, | 282,4, | 282,5, | 282,6, | 282,7, | 282,8, | 282,9, | 282,10, | 282,11, | 282,12, | 282,13, | 282,14, | 282,15, | 282,16, | 282,17, | 282,18, | 282,19, | 282,20, | 282,21, | 282,22, | 282,23, | 282,24, | 282,25, | 282,26, | 282,27, | 282,28, | 282,29, | 282,30, | 282,31, | 282,32, | 282,33, | 282,34, | 282,35, | 282,36, | 282,37, | 282,38, | 282,39, | 282,40, | 282,41, | 282,42, | 282,43, | 282,44, | 282,45, | 282,46, | 282,47, | 282,48, | 282,49, | 282,50, | 282,51, | 282,52, | 282,53, | 282,54, | 282,55, | 282,56, | 282,57, | 282,58, | 282,59, | 282,60, | 282,61, | 282,62, | 282,63, | 282,64, | 282,65, | 282,66, | 282,67, | 282,68, | 282,69, | 282,70, | 282,71, | 282,72, | 282,73, | 282,74, | 282,75, | 282,76, | 282,77, | 282,78, | 282,79, | 282,80, | 282,81, | 282,82, | 282,83, | 282,84, | 282,85, | 283,1, | 283,2, | 283,3, | 283,4, | 283,5, | 283,6, | 283,7, | 283,8, | 283,9, | 283,10, | 283,11, | 283,12, | 283,13, | 283,14, | 283,15, | 283,16, | 283,17, | 283,18, | 283,19, | 283,20, | 283,21, | 283,22, | 283,23, | 283,24, | 283,25, | 283,26, | 283,27, | 283,28, | 283,29, | 283,30, | 283,31, | 283,32, | 283,33, | 283,34, | 283,35, | 283,36, | 283,37, | 283,38, | 283,39, | 283,40, | 283,41, | 283,42, | 283,43, | 283,44, | 283,45, | 283,46, | 283,47, | 283,48, | 283,49, | 283,50, | 283,51, | 283,52, | 283,53, | 283,54, | 283,55, | 283,56, | 283,57, | 283,58, | 283,59, | 283,60, | 283,61, | 283,62, | 283,63, | 283,64, | 283,65, | 283,66, | 283,67, | 283,68, | 283,69, | 283,70, | 283,71, | 283,72, | 283,73, | 283,74, | 283,75, | 283,76, | 283,77, | 283,78, | 283,79, | 283,80, | 283,81, | 283,82, | 283,83, | 283,84, | 283,85, | 284,1, | 284,2, | 284,3, | 284,4, | 284,5, | 284,6, | 284,7, | 284,8, | 284,9, | 284,10, | 284,11, | 284,12, | 284,13, | 284,14, | 284,15, | 284,16, | 284,17, | 284,18, | 284,19, | 284,20, | 284,21, | 284,22, | 284,23, | 284,24, | 284,25, | 284,26, | 284,27, | 284,28, | 284,29, | 284,30, | 284,31, | 284,32, | 284,33, | 284,34, | 284,35, | 284,36, | 284,37, | 284,38, | 284,39, | 284,40, | 284,41, | 284,42, | 284,43, | 284,44, | 284,45, | 284,46, | 284,47, | 284,48, | 284,49, | 284,50, | 284,51, | 284,52, | 284,53, | 284,54, | 284,55, | 284,56, | 284,57, | 284,58, | 284,59, | 284,60, | 284,61, | 284,62, | 284,63, | 284,64, | 284,65, | 284,66, | 284,67, | 284,68, | 284,69, | 284,70, | 284,71, | 284,72, | 284,73, | 284,74, | 284,75, | 284,76, | 284,77, | 284,78, | 284,79, | 284,80, | 284,81, | 284,82, | 284,83, | 284,84, | 284,85, | 285,1, | 285,2, | 285,3, | 285,4, | 285,5, | 285,6, | 285,7, | 285,8, | 285,9, | 285,10, | 285,11, | 285,12, | 285,13, | 285,14, | 285,15, | 285,16, | 285,17, | 285,18, | 285,19, | 285,20, | 285,21, | 285,22, | 285,23, | 285,24, | 285,25, | 285,26, | 285,27, | 285,28, | 285,29, | 285,30, | 285,31, | 285,32, | 285,33, | 285,34, | 285,35, | 285,36, | 285,37, | 285,38, | 285,39, | 285,40, | 285,41, | 285,42, | 285,43, | 285,44, | 285,45, | 285,46, | 285,47, | 285,48, | 285,49, | 285,50, | 285,51, | 285,52, | 285,53, | 285,54, | 285,55, | 285,56, | 285,57, | 285,58, | 285,59, | 285,60, | 285,61, | 285,62, | 285,63, | 285,64, | 285,65, | 285,66, | 285,67, | 285,68, | 285,69, | 285,70, | 285,71, | 285,72, | 285,73, | 285,74, | 285,75, | 285,76, | 285,77, | 285,78, | 285,79, | 285,80, | 285,81, | 285,82, | 285,83, | 285,84, | 285,85, | 286,1, | 286,2, | 286,3, | 286,4, | 286,5, | 286,6, | 286,7, | 286,8, | 286,9, | 286,10, | 286,11, | 286,12, | 286,13, | 286,14, | 286,15, | 286,16, | 286,17, | 286,18, | 286,19, | 286,20, | 286,21, | 286,22, | 286,23, | 286,24, | 286,25, | 286,26, | 286,27, | 286,28, | 286,29, | 286,30, | 286,31, | 286,32, | 286,33, | 286,34, | 286,35, | 286,36, | 286,37, | 286,38, | 286,39, | 286,40, | 286,41, | 286,42, | 286,43, | 286,44, | 286,45, | 286,46, | 286,47, | 286,48, | 286,49, | 286,50, | 286,51, | 286,52, | 286,53, | 286,54, | 286,55, | 286,56, | 286,57, | 286,58, | 286,59, | 286,60, | 286,61, | 286,62, | 286,63, | 286,64, | 286,65, | 286,66, | 286,67, | 286,68, | 286,69, | 286,70, | 286,71, | 286,72, | 286,73, | 286,74, | 286,75, | 286,76, | 286,77, | 286,78, | 286,79, | 286,80, | 286,81, | 286,82, | 286,83, | 286,84, | 286,85, | 287,1, | 287,2, | 287,3, | 287,4, | 287,5, | 287,6, | 287,7, | 287,8, | 287,9, | 287,10, | 287,11, | 287,12, | 287,13, | 287,14, | 287,15, | 287,16, | 287,17, | 287,18, | 287,19, | 287,20, | 287,21, | 287,22, | 287,23, | 287,24, | 287,25, | 287,26, | 287,27, | 287,28, | 287,29, | 287,30, | 287,31, | 287,32, | 287,33, | 287,34, | 287,35, | 287,36, | 287,37, | 287,38, | 287,39, | 287,40, | 287,41, | 287,42, | 287,43, | 287,44, | 287,45, | 287,46, | 287,47, | 287,48, | 287,49, | 287,50, | 287,51, | 287,52, | 287,53, | 287,54, | 287,55, | 287,56, | 287,57, | 287,58, | 287,59, | 287,60, | 287,61, | 287,62, | 287,63, | 287,64, | 287,65, | 287,66, | 287,67, | 287,68, | 287,69, | 287,70, | 287,71, | 287,72, | 287,73, | 287,74, | 287,75, | 287,76, | 287,77, | 287,78, | 287,79, | 287,80, | 287,81, | 287,82, | 287,83, | 287,84, | 287,85, | 288,1, | 288,2, | 288,3, | 288,4, | 288,5, | 288,6, | 288,7, | 288,8, | 288,9, | 288,10, | 288,11, | 288,12, | 288,13, | 288,14, | 288,15, | 288,16, | 288,17, | 288,18, | 288,19, | 288,20, | 288,21, | 288,22, | 288,23, | 288,24, | 288,25, | 288,26, | 288,27, | 288,28, | 288,29, | 288,30, | 288,31, | 288,32, | 288,33, | 288,34, | 288,35, | 288,36, | 288,37, | 288,38, | 288,39, | 288,40, | 288,41, | 288,42, | 288,43, | 288,44, | 288,45, | 288,46, | 288,47, | 288,48, | 288,49, | 288,50, | 288,51, | 288,52, | 288,53, | 288,54, | 288,55, | 288,56, | 288,57, | 288,58, | 288,59, | 288,60, | 288,61, | 288,62, | 288,63, | 288,64, | 288,65, | 288,66, | 288,67, | 288,68, | 288,69, | 288,70, | 288,71, | 288,72, | 288,73, | 288,74, | 288,75, | 288,76, | 288,77, | 288,78, | 288,79, | 288,80, | 288,81, | 288,82, | 288,83, | 288,84, | 288,85, | 289,1, | 289,2, | 289,3, | 289,4, | 289,5, | 289,6, | 289,7, | 289,8, | 289,9, | 289,10, | 289,11, | 289,12, | 289,13, | 289,14, | 289,15, | 289,16, | 289,17, | 289,18, | 289,19, | 289,20, | 289,21, | 289,22, | 289,23, | 289,24, | 289,25, | 289,26, | 289,27, | 289,28, | 289,29, | 289,30, | 289,31, | 289,32, | 289,33, | 289,34, | 289,35, | 289,36, | 289,37, | 289,38, | 289,39, | 289,40, | 289,41, | 289,42, | 289,43, | 289,44, | 289,45, | 289,46, | 289,47, | 289,48, | 289,49, | 289,50, | 289,51, | 289,52, | 289,53, | 289,54, | 289,55, | 289,56, | 289,57, | 289,58, | 289,59, | 289,60, | 289,61, | 289,62, | 289,63, | 289,64, | 289,65, | 289,66, | 289,67, | 289,68, | 289,69, | 289,70, | 289,71, | 289,72, | 289,73, | 289,74, | 289,75, | 289,76, | 289,77, | 289,78, | 289,79, | 289,80, | 289,81, | 289,82, | 289,83, | 289,84, | 289,85, | 290,1, | 290,2, | 290,3, | 290,4, | 290,5, | 290,6, | 290,7, | 290,8, | 290,9, | 290,10, | 290,11, | 290,12, | 290,13, | 290,14, | 290,15, | 290,16, | 290,17, | 290,18, | 290,19, | 290,20, | 290,21, | 290,22, | 290,23, | 290,24, | 290,25, | 290,26, | 290,27, | 290,28, | 290,29, | 290,30, | 290,31, | 290,32, | 290,33, | 290,34, | 290,35, | 290,36, | 290,37, | 290,38, | 290,39, | 290,40, | 290,41, | 290,42, | 290,43, | 290,44, | 290,45, | 290,46, | 290,47, | 290,48, | 290,49, | 290,50, | 290,51, | 290,52, | 290,53, | 290,54, | 290,55, | 290,56, | 290,57, | 290,58, | 290,59, | 290,60, | 290,61, | 290,62, | 290,63, | 290,64, | 290,65, | 290,66, | 290,67, | 290,68, | 290,69, | 290,70, | 290,71, | 290,72, | 290,73, | 290,74, | 290,75, | 290,76, | 290,77, | 290,78, | 290,79, | 290,80, | 290,81, | 290,82, | 290,83, | 290,84, | 290,85, | 291,1, | 291,2, | 291,3, | 291,4, | 291,5, | 291,6, | 291,7, | 291,8, | 291,9, | 291,10, | 291,11, | 291,12, | 291,13, | 291,14, | 291,15, | 291,16, | 291,17, | 291,18, | 291,19, | 291,20, | 291,21, | 291,22, | 291,23, | 291,24, | 291,25, | 291,26, | 291,27, | 291,28, | 291,29, | 291,30, | 291,31, | 291,32, | 291,33, | 291,34, | 291,35, | 291,36, | 291,37, | 291,38, | 291,39, | 291,40, | 291,41, | 291,42, | 291,43, | 291,44, | 291,45, | 291,46, | 291,47, | 291,48, | 291,49, | 291,50, | 291,51, | 291,52, | 291,53, | 291,54, | 291,55, | 291,56, | 291,57, | 291,58, | 291,59, | 291,60, | 291,61, | 291,62, | 291,63, | 291,64, | 291,65, | 291,66, | 291,67, | 291,68, | 291,69, | 291,70, | 291,71, | 291,72, | 291,73, | 291,74, | 291,75, | 291,76, | 291,77, | 291,78, | 291,79, | 291,80, | 291,81, | 291,82, | 291,83, | 291,84, | 291,85, | 292,1, | 292,2, | 292,3, | 292,4, | 292,5, | 292,6, | 292,7, | 292,8, | 292,9, | 292,10, | 292,11, | 292,12, | 292,13, | 292,14, | 292,15, | 292,16, | 292,17, | 292,18, | 292,19, | 292,20, | 292,21, | 292,22, | 292,23, | 292,24, | 292,25, | 292,26, | 292,27, | 292,28, | 292,29, | 292,30, | 292,31, | 292,32, | 292,33, | 292,34, | 292,35, | 292,36, | 292,37, | 292,38, | 292,39, | 292,40, | 292,41, | 292,42, | 292,43, | 292,44, | 292,45, | 292,46, | 292,47, | 292,48, | 292,49, | 292,50, | 292,51, | 292,52, | 292,53, | 292,54, | 292,55, | 292,56, | 292,57, | 292,58, | 292,59, | 292,60, | 292,61, | 292,62, | 292,63, | 292,64, | 292,65, | 292,66, | 292,67, | 292,68, | 292,69, | 292,70, | 292,71, | 292,72, | 292,73, | 292,74, | 292,75, | 292,76, | 292,77, | 292,78, | 292,79, | 292,80, | 292,81, | 292,82, | 292,83, | 292,84, | 292,85, | 293,1, | 293,2, | 293,3, | 293,4, | 293,5, | 293,6, | 293,7, | 293,8, | 293,9, | 293,10, | 293,11, | 293,12, | 293,13, | 293,14, | 293,15, | 293,16, | 293,17, | 293,18, | 293,19, | 293,20, | 293,21, | 293,22, | 293,23, | 293,24, | 293,25, | 293,26, | 293,27, | 293,28, | 293,29, | 293,30, | 293,31, | 293,32, | 293,33, | 293,34, | 293,35, | 293,36, | 293,37, | 293,38, | 293,39, | 293,40, | 293,41, | 293,42, | 293,43, | 293,44, | 293,45, | 293,46, | 293,47, | 293,48, | 293,49, | 293,50, | 293,51, | 293,52, | 293,53, | 293,54, | 293,55, | 293,56, | 293,57, | 293,58, | 293,59, | 293,60, | 293,61, | 293,62, | 293,63, | 293,64, | 293,65, | 293,66, | 293,67, | 293,68, | 293,69, | 293,70, | 293,71, | 293,72, | 293,73, | 293,74, | 293,75, | 293,76, | 293,77, | 293,78, | 293,79, | 293,80, | 293,81, | 293,82, | 293,83, | 293,84, | 293,85, | 294,1, | 294,2, | 294,3, | 294,4, | 294,5, | 294,6, | 294,7, | 294,8, | 294,9, | 294,10, | 294,11, | 294,12, | 294,13, | 294,14, | 294,15, | 294,16, | 294,17, | 294,18, | 294,19, | 294,20, | 294,21, | 294,22, | 294,23, | 294,24, | 294,25, | 294,26, | 294,27, | 294,28, | 294,29, | 294,30, | 294,31, | 294,32, | 294,33, | 294,34, | 294,35, | 294,36, | 294,37, | 294,38, | 294,39, | 294,40, | 294,41, | 294,42, | 294,43, | 294,44, | 294,45, | 294,46, | 294,47, | 294,48, | 294,49, | 294,50, | 294,51, | 294,52, | 294,53, | 294,54, | 294,55, | 294,56, | 294,57, | 294,58, | 294,59, | 294,60, | 294,61, | 294,62, | 294,63, | 294,64, | 294,65, | 294,66, | 294,67, | 294,68, | 294,69, | 294,70, | 294,71, | 294,72, | 294,73, | 294,74, | 294,75, | 294,76, | 294,77, | 294,78, | 294,79, | 294,80, | 294,81, | 294,82, | 294,83, | 294,84, | 294,85, | 295,1, | 295,2, | 295,3, | 295,4, | 295,5, | 295,6, | 295,7, | 295,8, | 295,9, | 295,10, | 295,11, | 295,12, | 295,13, | 295,14, | 295,15, | 295,16, | 295,17, | 295,18, | 295,19, | 295,20, | 295,21, | 295,22, | 295,23, | 295,24, | 295,25, | 295,26, | 295,27, | 295,28, | 295,29, | 295,30, | 295,31, | 295,32, | 295,33, | 295,34, | 295,35, | 295,36, | 295,37, | 295,38, | 295,39, | 295,40, | 295,41, | 295,42, | 295,43, | 295,44, | 295,45, | 295,46, | 295,47, | 295,48, | 295,49, | 295,50, | 295,51, | 295,52, | 295,53, | 295,54, | 295,55, | 295,56, | 295,57, | 295,58, | 295,59, | 295,60, | 295,61, | 295,62, | 295,63, | 295,64, | 295,65, | 295,66, | 295,67, | 295,68, | 295,69, | 295,70, | 295,71, | 295,72, | 295,73, | 295,74, | 295,75, | 295,76, | 295,77, | 295,78, | 295,79, | 295,80, | 295,81, | 295,82, | 295,83, | 295,84, | 295,85, | 296,1, | 296,2, | 296,3, | 296,4, | 296,5, | 296,6, | 296,7, | 296,8, | 296,9, | 296,10, | 296,11, | 296,12, | 296,13, | 296,14, | 296,15, | 296,16, | 296,17, | 296,18, | 296,19, | 296,20, | 296,21, | 296,22, | 296,23, | 296,24, | 296,25, | 296,26, | 296,27, | 296,28, | 296,29, | 296,30, | 296,31, | 296,32, | 296,33, | 296,34, | 296,35, | 296,36, | 296,37, | 296,38, | 296,39, | 296,40, | 296,41, | 296,42, | 296,43, | 296,44, | 296,45, | 296,46, | 296,47, | 296,48, | 296,49, | 296,50, | 296,51, | 296,52, | 296,53, | 296,54, | 296,55, | 296,56, | 296,57, | 296,58, | 296,59, | 296,60, | 296,61, | 296,62, | 296,63, | 296,64, | 296,65, | 296,66, | 296,67, | 296,68, | 296,69, | 296,70, | 296,71, | 296,72, | 296,73, | 296,74, | 296,75, | 296,76, | 296,77, | 296,78, | 296,79, | 296,80, | 296,81, | 296,82, | 296,83, | 296,84, | 296,85, | 297,1, | 297,2, | 297,3, | 297,4, | 297,5, | 297,6, | 297,7, | 297,8, | 297,9, | 297,10, | 297,11, | 297,12, | 297,13, | 297,14, | 297,15, | 297,16, | 297,17, | 297,18, | 297,19, | 297,20, | 297,21, | 297,22, | 297,23, | 297,24, | 297,25, | 297,26, | 297,27, | 297,28, | 297,29, | 297,30, | 297,31, | 297,32, | 297,33, | 297,34, | 297,35, | 297,36, | 297,37, | 297,38, | 297,39, | 297,40, | 297,41, | 297,42, | 297,43, | 297,44, | 297,45, | 297,46, | 297,47, | 297,48, | 297,49, | 297,50, | 297,51, | 297,52, | 297,53, | 297,54, | 297,55, | 297,56, | 297,57, | 297,58, | 297,59, | 297,60, | 297,61, | 297,62, | 297,63, | 297,64, | 297,65, | 297,66, | 297,67, | 297,68, | 297,69, | 297,70, | 297,71, | 297,72, | 297,73, | 297,74, | 297,75, | 297,76, | 297,77, | 297,78, | 297,79, | 297,80, | 297,81, | 297,82, | 297,83, | 297,84, | 297,85, | 298,1, | 298,2, | 298,3, | 298,4, | 298,5, | 298,6, | 298,7, | 298,8, | 298,9, | 298,10, | 298,11, | 298,12, | 298,13, | 298,14, | 298,15, | 298,16, | 298,17, | 298,18, | 298,19, | 298,20, | 298,21, | 298,22, | 298,23, | 298,24, | 298,25, | 298,26, | 298,27, | 298,28, | 298,29, | 298,30, | 298,31, | 298,32, | 298,33, | 298,34, | 298,35, | 298,36, | 298,37, | 298,38, | 298,39, | 298,40, | 298,41, | 298,42, | 298,43, | 298,44, | 298,45, | 298,46, | 298,47, | 298,48, | 298,49, | 298,50, | 298,51, | 298,52, | 298,53, | 298,54, | 298,55, | 298,56, | 298,57, | 298,58, | 298,59, | 298,60, | 298,61, | 298,62, | 298,63, | 298,64, | 298,65, | 298,66, | 298,67, | 298,68, | 298,69, | 298,70, | 298,71, | 298,72, | 298,73, | 298,74, | 298,75, | 298,76, | 298,77, | 298,78, | 298,79, | 298,80, | 298,81, | 298,82, | 298,83, | 298,84, | 298,85, | 299,1, | 299,2, | 299,3, | 299,4, | 299,5, | 299,6, | 299,7, | 299,8, | 299,9, | 299,10, | 299,11, | 299,12, | 299,13, | 299,14, | 299,15, | 299,16, | 299,17, | 299,18, | 299,19, | 299,20, | 299,21, | 299,22, | 299,23, | 299,24, | 299,25, | 299,26, | 299,27, | 299,28, | 299,29, | 299,30, | 299,31, | 299,32, | 299,33, | 299,34, | 299,35, | 299,36, | 299,37, | 299,38, | 299,39, | 299,40, | 299,41, | 299,42, | 299,43, | 299,44, | 299,45, | 299,46, | 299,47, | 299,48, | 299,49, | 299,50, | 299,51, | 299,52, | 299,53, | 299,54, | 299,55, | 299,56, | 299,57, | 299,58, | 299,59, | 299,60, | 299,61, | 299,62, | 299,63, | 299,64, | 299,65, | 299,66, | 299,67, | 299,68, | 299,69, | 299,70, | 299,71, | 299,72, | 299,73, | 299,74, | 299,75, | 299,76, | 299,77, | 299,78, | 299,79, | 299,80, | 299,81, | 299,82, | 299,83, | 299,84, | 299,85, | 300,1, | 300,2, | 300,3, | 300,4, | 300,5, | 300,6, | 300,7, | 300,8, | 300,9, | 300,10, | 300,11, | 300,12, | 300,13, | 300,14, | 300,15, | 300,16, | 300,17, | 300,18, | 300,19, | 300,20, | 300,21, | 300,22, | 300,23, | 300,24, | 300,25, | 300,26, | 300,27, | 300,28, | 300,29, | 300,30, | 300,31, | 300,32, | 300,33, | 300,34, | 300,35, | 300,36, | 300,37, | 300,38, | 300,39, | 300,40, | 300,41, | 300,42, | 300,43, | 300,44, | 300,45, | 300,46, | 300,47, | 300,48, | 300,49, | 300,50, | 300,51, | 300,52, | 300,53, | 300,54, | 300,55, | 300,56, | 300,57, | 300,58, | 300,59, | 300,60, | 300,61, | 300,62, | 300,63, | 300,64, | 300,65, | 300,66, | 300,67, | 300,68, | 300,69, | 300,70, | 300,71, | 300,72, | 300,73, | 300,74, | 300,75, | 300,76, | 300,77, | 300,78, | 300,79, | 300,80, | 300,81, | 300,82, | 300,83, | 300,84, | 300,85, | 301,1, | 301,2, | 301,3, | 301,4, | 301,5, | 301,6, | 301,7, | 301,8, | 301,9, | 301,10, | 301,11, | 301,12, | 301,13, | 301,14, | 301,15, | 301,16, | 301,17, | 301,18, | 301,19, | 301,20, | 301,21, | 301,22, | 301,23, | 301,24, | 301,25, | 301,26, | 301,27, | 301,28, | 301,29, | 301,30, | 301,31, | 301,32, | 301,33, | 301,34, | 301,35, | 301,36, | 301,37, | 301,38, | 301,39, | 301,40, | 301,41, | 301,42, | 301,43, | 301,44, | 301,45, | 301,46, | 301,47, | 301,48, | 301,49, | 301,50, | 301,51, | 301,52, | 301,53, | 301,54, | 301,55, | 301,56, | 301,57, | 301,58, | 301,59, | 301,60, | 301,61, | 301,62, | 301,63, | 301,64, | 301,65, | 301,66, | 301,67, | 301,68, | 301,69, | 301,70, | 301,71, | 301,72, | 301,73, | 301,74, | 301,75, | 301,76, | 301,77, | 301,78, | 301,79, | 301,80, | 301,81, | 301,82, | 301,83, | 301,84, | 301,85, | 302,1, | 302,2, | 302,3, | 302,4, | 302,5, | 302,6, | 302,7, | 302,8, | 302,9, | 302,10, | 302,11, | 302,12, | 302,13, | 302,14, | 302,15, | 302,16, | 302,17, | 302,18, | 302,19, | 302,20, | 302,21, | 302,22, | 302,23, | 302,24, | 302,25, | 302,26, | 302,27, | 302,28, | 302,29, | 302,30, | 302,31, | 302,32, | 302,33, | 302,34, | 302,35, | 302,36, | 302,37, | 302,38, | 302,39, | 302,40, | 302,41, | 302,42, | 302,43, | 302,44, | 302,45, | 302,46, | 302,47, | 302,48, | 302,49, | 302,50, | 302,51, | 302,52, | 302,53, | 302,54, | 302,55, | 302,56, | 302,57, | 302,58, | 302,59, | 302,60, | 302,61, | 302,62, | 302,63, | 302,64, | 302,65, | 302,66, | 302,67, | 302,68, | 302,69, | 302,70, | 302,71, | 302,72, | 302,73, | 302,74, | 302,75, | 302,76, | 302,77, | 302,78, | 302,79, | 302,80, | 302,81, | 302,82, | 302,83, | 302,84, | 302,85, | 303,1, | 303,2, | 303,3, | 303,4, | 303,5, | 303,6, | 303,7, | 303,8, | 303,9, | 303,10, | 303,11, | 303,12, | 303,13, | 303,14, | 303,15, | 303,16, | 303,17, | 303,18, | 303,19, | 303,20, | 303,21, | 303,22, | 303,23, | 303,24, | 303,25, | 303,26, | 303,27, | 303,28, | 303,29, | 303,30, | 303,31, | 303,32, | 303,33, | 303,34, | 303,35, | 303,36, | 303,37, | 303,38, | 303,39, | 303,40, | 303,41, | 303,42, | 303,43, | 303,44, | 303,45, | 303,46, | 303,47, | 303,48, | 303,49, | 303,50, | 303,51, | 303,52, | 303,53, | 303,54, | 303,55, | 303,56, | 303,57, | 303,58, | 303,59, | 303,60, | 303,61, | 303,62, | 303,63, | 303,64, | 303,65, | 303,66, | 303,67, | 303,68, | 303,69, | 303,70, | 303,71, | 303,72, | 303,73, | 303,74, | 303,75, | 303,76, | 303,77, | 303,78, | 303,79, | 303,80, | 303,81, | 303,82, | 303,83, | 303,84, | 303,85, | 304,1, | 304,2, | 304,3, | 304,4, | 304,5, | 304,6, | 304,7, | 304,8, | 304,9, | 304,10, | 304,11, | 304,12, | 304,13, | 304,14, | 304,15, | 304,16, | 304,17, | 304,18, | 304,19, | 304,20, | 304,21, | 304,22, | 304,23, | 304,24, | 304,25, | 304,26, | 304,27, | 304,28, | 304,29, | 304,30, | 304,31, | 304,32, | 304,33, | 304,34, | 304,35, | 304,36, | 304,37, | 304,38, | 304,39, | 304,40, | 304,41, | 304,42, | 304,43, | 304,44, | 304,45, | 304,46, | 304,47, | 304,48, | 304,49, | 304,50, | 304,51, | 304,52, | 304,53, | 304,54, | 304,55, | 304,56, | 304,57, | 304,58, | 304,59, | 304,60, | 304,61, | 304,62, | 304,63, | 304,64, | 304,65, | 304,66, | 304,67, | 304,68, | 304,69, | 304,70, | 304,71, | 304,72, | 304,73, | 304,74, | 304,75, | 304,76, | 304,77, | 304,78, | 304,79, | 304,80, | 304,81, | 304,82, | 304,83, | 304,84, | 304,85, | 305,1, | 305,2, | 305,3, | 305,4, | 305,5, | 305,6, | 305,7, | 305,8, | 305,9, | 305,10, | 305,11, | 305,12, | 305,13, | 305,14, | 305,15, | 305,16, | 305,17, | 305,18, | 305,19, | 305,20, | 305,21, | 305,22, | 305,23, | 305,24, | 305,25, | 305,26, | 305,27, | 305,28, | 305,29, | 305,30, | 305,31, | 305,32, | 305,33, | 305,34, | 305,35, | 305,36, | 305,37, | 305,38, | 305,39, | 305,40, | 305,41, | 305,42, | 305,43, | 305,44, | 305,45, | 305,46, | 305,47, | 305,48, | 305,49, | 305,50, | 305,51, | 305,52, | 305,53, | 305,54, | 305,55, | 305,56, | 305,57, | 305,58, | 305,59, | 305,60, | 305,61, | 305,62, | 305,63, | 305,64, | 305,65, | 305,66, | 305,67, | 305,68, | 305,69, | 305,70, | 305,71, | 305,72, | 305,73, | 305,74, | 305,75, | 305,76, | 305,77, | 305,78, | 305,79, | 305,80, | 305,81, | 305,82, | 305,83, | 305,84, | 305,85, | 306,1, | 306,2, | 306,3, | 306,4, | 306,5, | 306,6, | 306,7, | 306,8, | 306,9, | 306,10, | 306,11, | 306,12, | 306,13, | 306,14, | 306,15, | 306,16, | 306,17, | 306,18, | 306,19, | 306,20, | 306,21, | 306,22, | 306,23, | 306,24, | 306,25, | 306,26, | 306,27, | 306,28, | 306,29, | 306,30, | 306,31, | 306,32, | 306,33, | 306,34, | 306,35, | 306,36, | 306,37, | 306,38, | 306,39, | 306,40, | 306,41, | 306,42, | 306,43, | 306,44, | 306,45, | 306,46, | 306,47, | 306,48, | 306,49, | 306,50, | 306,51, | 306,52, | 306,53, | 306,54, | 306,55, | 306,56, | 306,57, | 306,58, | 306,59, | 306,60, | 306,61, | 306,62, | 306,63, | 306,64, | 306,65, | 306,66, | 306,67, | 306,68, | 306,69, | 306,70, | 306,71, | 306,72, | 306,73, | 306,74, | 306,75, | 306,76, | 306,77, | 306,78, | 306,79, | 306,80, | 306,81, | 306,82, | 306,83, | 306,84, | 306,85, | 307,1, | 307,2, | 307,3, | 307,4, | 307,5, | 307,6, | 307,7, | 307,8, | 307,9, | 307,10, | 307,11, | 307,12, | 307,13, | 307,14, | 307,15, | 307,16, | 307,17, | 307,18, | 307,19, | 307,20, | 307,21, | 307,22, | 307,23, | 307,24, | 307,25, | 307,26, | 307,27, | 307,28, | 307,29, | 307,30, | 307,31, | 307,32, | 307,33, | 307,34, | 307,35, | 307,36, | 307,37, | 307,38, | 307,39, | 307,40, | 307,41, | 307,42, | 307,43, | 307,44, | 307,45, | 307,46, | 307,47, | 307,48, | 307,49, | 307,50, | 307,51, | 307,52, | 307,53, | 307,54, | 307,55, | 307,56, | 307,57, | 307,58, | 307,59, | 307,60, | 307,61, | 307,62, | 307,63, | 307,64, | 307,65, | 307,66, | 307,67, | 307,68, | 307,69, | 307,70, | 307,71, | 307,72, | 307,73, | 307,74, | 307,75, | 307,76, | 307,77, | 307,78, | 307,79, | 307,80, | 307,81, | 307,82, | 307,83, | 307,84, | 307,85, | 308,1, | 308,2, | 308,3, | 308,4, | 308,5, | 308,6, | 308,7, | 308,8, | 308,9, | 308,10, | 308,11, | 308,12, | 308,13, | 308,14, | 308,15, | 308,16, | 308,17, | 308,18, | 308,19, | 308,20, | 308,21, | 308,22, | 308,23, | 308,24, | 308,25, | 308,26, | 308,27, | 308,28, | 308,29, | 308,30, | 308,31, | 308,32, | 308,33, | 308,34, | 308,35, | 308,36, | 308,37, | 308,38, | 308,39, | 308,40, | 308,41, | 308,42, | 308,43, | 308,44, | 308,45, | 308,46, | 308,47, | 308,48, | 308,49, | 308,50, | 308,51, | 308,52, | 308,53, | 308,54, | 308,55, | 308,56, | 308,57, | 308,58, | 308,59, | 308,60, | 308,61, | 308,62, | 308,63, | 308,64, | 308,65, | 308,66, | 308,67, | 308,68, | 308,69, | 308,70, | 308,71, | 308,72, | 308,73, | 308,74, | 308,75, | 308,76, | 308,77, | 308,78, | 308,79, | 308,80, | 308,81, | 308,82, | 308,83, | 308,84, | 308,85, | 309,1, | 309,2, | 309,3, | 309,4, | 309,5, | 309,6, | 309,7, | 309,8, | 309,9, | 309,10, | 309,11, | 309,12, | 309,13, | 309,14, | 309,15, | 309,16, | 309,17, | 309,18, | 309,19, | 309,20, | 309,21, | 309,22, | 309,23, | 309,24, | 309,25, | 309,26, | 309,27, | 309,28, | 309,29, | 309,30, | 309,31, | 309,32, | 309,33, | 309,34, | 309,35, | 309,36, | 309,37, | 309,38, | 309,39, | 309,40, | 309,41, | 309,42, | 309,43, | 309,44, | 309,45, | 309,46, | 309,47, | 309,48, | 309,49, | 309,50, | 309,51, | 309,52, | 309,53, | 309,54, | 309,55, | 309,56, | 309,57, | 309,58, | 309,59, | 309,60, | 309,61, | 309,62, | 309,63, | 309,64, | 309,65, | 309,66, | 309,67, | 309,68, | 309,69, | 309,70, | 309,71, | 309,72, | 309,73, | 309,74, | 309,75, | 309,76, | 309,77, | 309,78, | 309,79, | 309,80, | 309,81, | 309,82, | 309,83, | 309,84, | 309,85, | 310,1, | 310,2, | 310,3, | 310,4, | 310,5, | 310,6, | 310,7, | 310,8, | 310,9, | 310,10, | 310,11, | 310,12, | 310,13, | 310,14, | 310,15, | 310,16, | 310,17, | 310,18, | 310,19, | 310,20, | 310,21, | 310,22, | 310,23, | 310,24, | 310,25, | 310,26, | 310,27, | 310,28, | 310,29, | 310,30, | 310,31, | 310,32, | 310,33, | 310,34, | 310,35, | 310,36, | 310,37, | 310,38, | 310,39, | 310,40, | 310,41, | 310,42, | 310,43, | 310,44, | 310,45, | 310,46, | 310,47, | 310,48, | 310,49, | 310,50, | 310,51, | 310,52, | 310,53, | 310,54, | 310,55, | 310,56, | 310,57, | 310,58, | 310,59, | 310,60, | 310,61, | 310,62, | 310,63, | 310,64, | 310,65, | 310,66, | 310,67, | 310,68, | 310,69, | 310,70, | 310,71, | 310,72, | 310,73, | 310,74, | 310,75, | 310,76, | 310,77, | 310,78, | 310,79, | 310,80, | 310,81, | 310,82, | 310,83, | 310,84, | 310,85, | 311,1, | 311,2, | 311,3, | 311,4, | 311,5, | 311,6, | 311,7, | 311,8, | 311,9, | 311,10, | 311,11, | 311,12, | 311,13, | 311,14, | 311,15, | 311,16, | 311,17, | 311,18, | 311,19, | 311,20, | 311,21, | 311,22, | 311,23, | 311,24, | 311,25, | 311,26, | 311,27, | 311,28, | 311,29, | 311,30, | 311,31, | 311,32, | 311,33, | 311,34, | 311,35, | 311,36, | 311,37, | 311,38, | 311,39, | 311,40, | 311,41, | 311,42, | 311,43, | 311,44, | 311,45, | 311,46, | 311,47, | 311,48, | 311,49, | 311,50, | 311,51, | 311,52, | 311,53, | 311,54, | 311,55, | 311,56, | 311,57, | 311,58, | 311,59, | 311,60, | 311,61, | 311,62, | 311,63, | 311,64, | 311,65, | 311,66, | 311,67, | 311,68, | 311,69, | 311,70, | 311,71, | 311,72, | 311,73, | 311,74, | 311,75, | 311,76, | 311,77, | 311,78, | 311,79, | 311,80, | 311,81, | 311,82, | 311,83, | 311,84, | 311,85, | 312,1, | 312,2, | 312,3, | 312,4, | 312,5, | 312,6, | 312,7, | 312,8, | 312,9, | 312,10, | 312,11, | 312,12, | 312,13, | 312,14, | 312,15, | 312,16, | 312,17, | 312,18, | 312,19, | 312,20, | 312,21, | 312,22, | 312,23, | 312,24, | 312,25, | 312,26, | 312,27, | 312,28, | 312,29, | 312,30, | 312,31, | 312,32, | 312,33, | 312,34, | 312,35, | 312,36, | 312,37, | 312,38, | 312,39, | 312,40, | 312,41, | 312,42, | 312,43, | 312,44, | 312,45, | 312,46, | 312,47, | 312,48, | 312,49, | 312,50, | 312,51, | 312,52, | 312,53, | 312,54, | 312,55, | 312,56, | 312,57, | 312,58, | 312,59, | 312,60, | 312,61, | 312,62, | 312,63, | 312,64, | 312,65, | 312,66, | 312,67, | 312,68, | 312,69, | 312,70, | 312,71, | 312,72, | 312,73, | 312,74, | 312,75, | 312,76, | 312,77, | 312,78, | 312,79, | 312,80, | 312,81, | 312,82, | 312,83, | 312,84, | 312,85, | 313,1, | 313,2, | 313,3, | 313,4, | 313,5, | 313,6, | 313,7, | 313,8, | 313,9, | 313,10, | 313,11, | 313,12, | 313,13, | 313,14, | 313,15, | 313,16, | 313,17, | 313,18, | 313,19, | 313,20, | 313,21, | 313,22, | 313,23, | 313,24, | 313,25, | 313,26, | 313,27, | 313,28, | 313,29, | 313,30, | 313,31, | 313,32, | 313,33, | 313,34, | 313,35, | 313,36, | 313,37, | 313,38, | 313,39, | 313,40, | 313,41, | 313,42, | 313,43, | 313,44, | 313,45, | 313,46, | 313,47, | 313,48, | 313,49, | 313,50, | 313,51, | 313,52, | 313,53, | 313,54, | 313,55, | 313,56, | 313,57, | 313,58, | 313,59, | 313,60, | 313,61, | 313,62, | 313,63, | 313,64, | 313,65, | 313,66, | 313,67, | 313,68, | 313,69, | 313,70, | 313,71, | 313,72, | 313,73, | 313,74, | 313,75, | 313,76, | 313,77, | 313,78, | 313,79, | 313,80, | 313,81, | 313,82, | 313,83, | 313,84, | 313,85, | 314,1, | 314,2, | 314,3, | 314,4, | 314,5, | 314,6, | 314,7, | 314,8, | 314,9, | 314,10, | 314,11, | 314,12, | 314,13, | 314,14, | 314,15, | 314,16, | 314,17, | 314,18, | 314,19, | 314,20, | 314,21, | 314,22, | 314,23, | 314,24, | 314,25, | 314,26, | 314,27, | 314,28, | 314,29, | 314,30, | 314,31, | 314,32, | 314,33, | 314,34, | 314,35, | 314,36, | 314,37, | 314,38, | 314,39, | 314,40, | 314,41, | 314,42, | 314,43, | 314,44, | 314,45, | 314,46, | 314,47, | 314,48, | 314,49, | 314,50, | 314,51, | 314,52, | 314,53, | 314,54, | 314,55, | 314,56, | 314,57, | 314,58, | 314,59, | 314,60, | 314,61, | 314,62, | 314,63, | 314,64, | 314,65, | 314,66, | 314,67, | 314,68, | 314,69, | 314,70, | 314,71, | 314,72, | 314,73, | 314,74, | 314,75, | 314,76, | 314,77, | 314,78, | 314,79, | 314,80, | 314,81, | 314,82, | 314,83, | 314,84, | 314,85, | 315,1, | 315,2, | 315,3, | 315,4, | 315,5, | 315,6, | 315,7, | 315,8, | 315,9, | 315,10, | 315,11, | 315,12, | 315,13, | 315,14, | 315,15, | 315,16, | 315,17, | 315,18, | 315,19, | 315,20, | 315,21, | 315,22, | 315,23, | 315,24, | 315,25, | 315,26, | 315,27, | 315,28, | 315,29, | 315,30, | 315,31, | 315,32, | 315,33, | 315,34, | 315,35, | 315,36, | 315,37, | 315,38, | 315,39, | 315,40, | 315,41, | 315,42, | 315,43, | 315,44, | 315,45, | 315,46, | 315,47, | 315,48, | 315,49, | 315,50, | 315,51, | 315,52, | 315,53, | 315,54, | 315,55, | 315,56, | 315,57, | 315,58, | 315,59, | 315,60, | 315,61, | 315,62, | 315,63, | 315,64, | 315,65, | 315,66, | 315,67, | 315,68, | 315,69, | 315,70, | 315,71, | 315,72, | 315,73, | 315,74, | 315,75, | 315,76, | 315,77, | 315,78, | 315,79, | 315,80, | 315,81, | 315,82, | 315,83, | 315,84, | 315,85, | 316,1, | 316,2, | 316,3, | 316,4, | 316,5, | 316,6, | 316,7, | 316,8, | 316,9, | 316,10, | 316,11, | 316,12, | 316,13, | 316,14, | 316,15, | 316,16, | 316,17, | 316,18, | 316,19, | 316,20, | 316,21, | 316,22, | 316,23, | 316,24, | 316,25, | 316,26, | 316,27, | 316,28, | 316,29, | 316,30, | 316,31, | 316,32, | 316,33, | 316,34, | 316,35, | 316,36, | 316,37, | 316,38, | 316,39, | 316,40, | 316,41, | 316,42, | 316,43, | 316,44, | 316,45, | 316,46, | 316,47, | 316,48, | 316,49, | 316,50, | 316,51, | 316,52, | 316,53, | 316,54, | 316,55, | 316,56, | 316,57, | 316,58, | 316,59, | 316,60, | 316,61, | 316,62, | 316,63, | 316,64, | 316,65, | 316,66, | 316,67, | 316,68, | 316,69, | 316,70, | 316,71, | 316,72, | 316,73, | 316,74, | 316,75, | 316,76, | 316,77, | 316,78, | 316,79, | 316,80, | 316,81, | 316,82, | 316,83, | 316,84, | 316,85, | 317,1, | 317,2, | 317,3, | 317,4, | 317,5, | 317,6, | 317,7, | 317,8, | 317,9, | 317,10, | 317,11, | 317,12, | 317,13, | 317,14, | 317,15, | 317,16, | 317,17, | 317,18, | 317,19, | 317,20, | 317,21, | 317,22, | 317,23, | 317,24, | 317,25, | 317,26, | 317,27, | 317,28, | 317,29, | 317,30, | 317,31, | 317,32, | 317,33, | 317,34, | 317,35, | 317,36, | 317,37, | 317,38, | 317,39, | 317,40, | 317,41, | 317,42, | 317,43, | 317,44, | 317,45, | 317,46, | 317,47, | 317,48, | 317,49, | 317,50, | 317,51, | 317,52, | 317,53, | 317,54, | 317,55, | 317,56, | 317,57, | 317,58, | 317,59, | 317,60, | 317,61, | 317,62, | 317,63, | 317,64, | 317,65, | 317,66, | 317,67, | 317,68, | 317,69, | 317,70, | 317,71, | 317,72, | 317,73, | 317,74, | 317,75, | 317,76, | 317,77, | 317,78, | 317,79, | 317,80, | 317,81, | 317,82, | 317,83, | 317,84, | 317,85, | 318,1, | 318,2, | 318,3, | 318,4, | 318,5, | 318,6, | 318,7, | 318,8, | 318,9, | 318,10, | 318,11, | 318,12, | 318,13, | 318,14, | 318,15, | 318,16, | 318,17, | 318,18, | 318,19, | 318,20, | 318,21, | 318,22, | 318,23, | 318,24, | 318,25, | 318,26, | 318,27, | 318,28, | 318,29, | 318,30, | 318,31, | 318,32, | 318,33, | 318,34, | 318,35, | 318,36, | 318,37, | 318,38, | 318,39, | 318,40, | 318,41, | 318,42, | 318,43, | 318,44, | 318,45, | 318,46, | 318,47, | 318,48, | 318,49, | 318,50, | 318,51, | 318,52, | 318,53, | 318,54, | 318,55, | 318,56, | 318,57, | 318,58, | 318,59, | 318,60, | 318,61, | 318,62, | 318,63, | 318,64, | 318,65, | 318,66, | 318,67, | 318,68, | 318,69, | 318,70, | 318,71, | 318,72, | 318,73, | 318,74, | 318,75, | 318,76, | 318,77, | 318,78, | 318,79, | 318,80, | 318,81, | 318,82, | 318,83, | 318,84, | 318,85, | 319,1, | 319,2, | 319,3, | 319,4, | 319,5, | 319,6, | 319,7, | 319,8, | 319,9, | 319,10, | 319,11, | 319,12, | 319,13, | 319,14, | 319,15, | 319,16, | 319,17, | 319,18, | 319,19, | 319,20, | 319,21, | 319,22, | 319,23, | 319,24, | 319,25, | 319,26, | 319,27, | 319,28, | 319,29, | 319,30, | 319,31, | 319,32, | 319,33, | 319,34, | 319,35, | 319,36, | 319,37, | 319,38, | 319,39, | 319,40, | 319,41, | 319,42, | 319,43, | 319,44, | 319,45, | 319,46, | 319,47, | 319,48, | 319,49, | 319,50, | 319,51, | 319,52, | 319,53, | 319,54, | 319,55, | 319,56, | 319,57, | 319,58, | 319,59, | 319,60, | 319,61, | 319,62, | 319,63, | 319,64, | 319,65, | 319,66, | 319,67, | 319,68, | 319,69, | 319,70, | 319,71, | 319,72, | 319,73, | 319,74, | 319,75, | 319,76, | 319,77, | 319,78, | 319,79, | 319,80, | 319,81, | 319,82, | 319,83, | 319,84, | 319,85, | 320,1, | 320,2, | 320,3, | 320,4, | 320,5, | 320,6, | 320,7, | 320,8, | 320,9, | 320,10, | 320,11, | 320,12, | 320,13, | 320,14, | 320,15, | 320,16, | 320,17, | 320,18, | 320,19, | 320,20, | 320,21, | 320,22, | 320,23, | 320,24, | 320,25, | 320,26, | 320,27, | 320,28, | 320,29, | 320,30, | 320,31, | 320,32, | 320,33, | 320,34, | 320,35, | 320,36, | 320,37, | 320,38, | 320,39, | 320,40, | 320,41, | 320,42, | 320,43, | 320,44, | 320,45, | 320,46, | 320,47, | 320,48, | 320,49, | 320,50, | 320,51, | 320,52, | 320,53, | 320,54, | 320,55, | 320,56, | 320,57, | 320,58, | 320,59, | 320,60, | 320,61, | 320,62, | 320,63, | 320,64, | 320,65, | 320,66, | 320,67, | 320,68, | 320,69, | 320,70, | 320,71, | 320,72, | 320,73, | 320,74, | 320,75, | 320,76, | 320,77, | 320,78, | 320,79, | 320,80, | 320,81, | 320,82, | 320,83, | 320,84, | 320,85, | 321,1, | 321,2, | 321,3, | 321,4, | 321,5, | 321,6, | 321,7, | 321,8, | 321,9, | 321,10, | 321,11, | 321,12, | 321,13, | 321,14, | 321,15, | 321,16, | 321,17, | 321,18, | 321,19, | 321,20, | 321,21, | 321,22, | 321,23, | 321,24, | 321,25, | 321,26, | 321,27, | 321,28, | 321,29, | 321,30, | 321,31, | 321,32, | 321,33, | 321,34, | 321,35, | 321,36, | 321,37, | 321,38, | 321,39, | 321,40, | 321,41, | 321,42, | 321,43, | 321,44, | 321,45, | 321,46, | 321,47, | 321,48, | 321,49, | 321,50, | 321,51, | 321,52, | 321,53, | 321,54, | 321,55, | 321,56, | 321,57, | 321,58, | 321,59, | 321,60, | 321,61, | 321,62, | 321,63, | 321,64, | 321,65, | 321,66, | 321,67, | 321,68, | 321,69, | 321,70, | 321,71, | 321,72, | 321,73, | 321,74, | 321,75, | 321,76, | 321,77, | 321,78, | 321,79, | 321,80, | 321,81, | 321,82, | 321,83, | 321,84, | 321,85, | 322,1, | 322,2, | 322,3, | 322,4, | 322,5, | 322,6, | 322,7, | 322,8, | 322,9, | 322,10, | 322,11, | 322,12, | 322,13, | 322,14, | 322,15, | 322,16, | 322,17, | 322,18, | 322,19, | 322,20, | 322,21, | 322,22, | 322,23, | 322,24, | 322,25, | 322,26, | 322,27, | 322,28, | 322,29, | 322,30, | 322,31, | 322,32, | 322,33, | 322,34, | 322,35, | 322,36, | 322,37, | 322,38, | 322,39, | 322,40, | 322,41, | 322,42, | 322,43, | 322,44, | 322,45, | 322,46, | 322,47, | 322,48, | 322,49, | 322,50, | 322,51, | 322,52, | 322,53, | 322,54, | 322,55, | 322,56, | 322,57, | 322,58, | 322,59, | 322,60, | 322,61, | 322,62, | 322,63, | 322,64, | 322,65, | 322,66, | 322,67, | 322,68, | 322,69, | 322,70, | 322,71, | 322,72, | 322,73, | 322,74, | 322,75, | 322,76, | 322,77, | 322,78, | 322,79, | 322,80, | 322,81, | 322,82, | 322,83, | 322,84, | 322,85, | 323,1, | 323,2, | 323,3, | 323,4, | 323,5, | 323,6, | 323,7, | 323,8, | 323,9, | 323,10, | 323,11, | 323,12, | 323,13, | 323,14, | 323,15, | 323,16, | 323,17, | 323,18, | 323,19, | 323,20, | 323,21, | 323,22, | 323,23, | 323,24, | 323,25, | 323,26, | 323,27, | 323,28, | 323,29, | 323,30, | 323,31, | 323,32, | 323,33, | 323,34, | 323,35, | 323,36, | 323,37, | 323,38, | 323,39, | 323,40, | 323,41, | 323,42, | 323,43, | 323,44, | 323,45, | 323,46, | 323,47, | 323,48, | 323,49, | 323,50, | 323,51, | 323,52, | 323,53, | 323,54, | 323,55, | 323,56, | 323,57, | 323,58, | 323,59, | 323,60, | 323,61, | 323,62, | 323,63, | 323,64, | 323,65, | 323,66, | 323,67, | 323,68, | 323,69, | 323,70, | 323,71, | 323,72, | 323,73, | 323,74, | 323,75, | 323,76, | 323,77, | 323,78, | 323,79, | 323,80, | 323,81, | 323,82, | 323,83, | 323,84, | 323,85, | 324,1, | 324,2, | 324,3, | 324,4, | 324,5, | 324,6, | 324,7, | 324,8, | 324,9, | 324,10, | 324,11, | 324,12, | 324,13, | 324,14, | 324,15, | 324,16, | 324,17, | 324,18, | 324,19, | 324,20, | 324,21, | 324,22, | 324,23, | 324,24, | 324,25, | 324,26, | 324,27, | 324,28, | 324,29, | 324,30, | 324,31, | 324,32, | 324,33, | 324,34, | 324,35, | 324,36, | 324,37, | 324,38, | 324,39, | 324,40, | 324,41, | 324,42, | 324,43, | 324,44, | 324,45, | 324,46, | 324,47, | 324,48, | 324,49, | 324,50, | 324,51, | 324,52, | 324,53, | 324,54, | 324,55, | 324,56, | 324,57, | 324,58, | 324,59, | 324,60, | 324,61, | 324,62, | 324,63, | 324,64, | 324,65, | 324,66, | 324,67, | 324,68, | 324,69, | 324,70, | 324,71, | 324,72, | 324,73, | 324,74, | 324,75, | 324,76, | 324,77, | 324,78, | 324,79, | 324,80, | 324,81, | 324,82, | 324,83, | 324,84, | 324,85, | 325,1, | 325,2, | 325,3, | 325,4, | 325,5, | 325,6, | 325,7, | 325,8, | 325,9, | 325,10, | 325,11, | 325,12, | 325,13, | 325,14, | 325,15, | 325,16, | 325,17, | 325,18, | 325,19, | 325,20, | 325,21, | 325,22, | 325,23, | 325,24, | 325,25, | 325,26, | 325,27, | 325,28, | 325,29, | 325,30, | 325,31, | 325,32, | 325,33, | 325,34, | 325,35, | 325,36, | 325,37, | 325,38, | 325,39, | 325,40, | 325,41, | 325,42, | 325,43, | 325,44, | 325,45, | 325,46, | 325,47, | 325,48, | 325,49, | 325,50, | 325,51, | 325,52, | 325,53, | 325,54, | 325,55, | 325,56, | 325,57, | 325,58, | 325,59, | 325,60, | 325,61, | 325,62, | 325,63, | 325,64, | 325,65, | 325,66, | 325,67, | 325,68, | 325,69, | 325,70, | 325,71, | 325,72, | 325,73, | 325,74, | 325,75, | 325,76, | 325,77, | 325,78, | 325,79, | 325,80, | 325,81, | 325,82, | 325,83, | 325,84, | 325,85, | 326,1, | 326,2, | 326,3, | 326,4, | 326,5, | 326,6, | 326,7, | 326,8, | 326,9, | 326,10, | 326,11, | 326,12, | 326,13, | 326,14, | 326,15, | 326,16, | 326,17, | 326,18, | 326,19, | 326,20, | 326,21, | 326,22, | 326,23, | 326,24, | 326,25, | 326,26, | 326,27, | 326,28, | 326,29, | 326,30, | 326,31, | 326,32, | 326,33, | 326,34, | 326,35, | 326,36, | 326,37, | 326,38, | 326,39, | 326,40, | 326,41, | 326,42, | 326,43, | 326,44, | 326,45, | 326,46, | 326,47, | 326,48, | 326,49, | 326,50, | 326,51, | 326,52, | 326,53, | 326,54, | 326,55, | 326,56, | 326,57, | 326,58, | 326,59, | 326,60, | 326,61, | 326,62, | 326,63, | 326,64, | 326,65, | 326,66, | 326,67, | 326,68, | 326,69, | 326,70, | 326,71, | 326,72, | 326,73, | 326,74, | 326,75, | 326,76, | 326,77, | 326,78, | 326,79, | 326,80, | 326,81, | 326,82, | 326,83, | 326,84, | 326,85, | 327,1, | 327,2, | 327,3, | 327,4, | 327,5, | 327,6, | 327,7, | 327,8, | 327,9, | 327,10, | 327,11, | 327,12, | 327,13, | 327,14, | 327,15, | 327,16, | 327,17, | 327,18, | 327,19, | 327,20, | 327,21, | 327,22, | 327,23, | 327,24, | 327,25, | 327,26, | 327,27, | 327,28, | 327,29, | 327,30, | 327,31, | 327,32, | 327,33, | 327,34, | 327,35, | 327,36, | 327,37, | 327,38, | 327,39, | 327,40, | 327,41, | 327,42, | 327,43, | 327,44, | 327,45, | 327,46, | 327,47, | 327,48, | 327,49, | 327,50, | 327,51, | 327,52, | 327,53, | 327,54, | 327,55, | 327,56, | 327,57, | 327,58, | 327,59, | 327,60, | 327,61, | 327,62, | 327,63, | 327,64, | 327,65, | 327,66, | 327,67, | 327,68, | 327,69, | 327,70, | 327,71, | 327,72, | 327,73, | 327,74, | 327,75, | 327,76, | 327,77, | 327,78, | 327,79, | 327,80, | 327,81, | 327,82, | 327,83, | 327,84, | 327,85, | 328,1, | 328,2, | 328,3, | 328,4, | 328,5, | 328,6, | 328,7, | 328,8, | 328,9, | 328,10, | 328,11, | 328,12, | 328,13, | 328,14, | 328,15, | 328,16, | 328,17, | 328,18, | 328,19, | 328,20, | 328,21, | 328,22, | 328,23, | 328,24, | 328,25, | 328,26, | 328,27, | 328,28, | 328,29, | 328,30, | 328,31, | 328,32, | 328,33, | 328,34, | 328,35, | 328,36, | 328,37, | 328,38, | 328,39, | 328,40, | 328,41, | 328,42, | 328,43, | 328,44, | 328,45, | 328,46, | 328,47, | 328,48, | 328,49, | 328,50, | 328,51, | 328,52, | 328,53, | 328,54, | 328,55, | 328,56, | 328,57, | 328,58, | 328,59, | 328,60, | 328,61, | 328,62, | 328,63, | 328,64, | 328,65, | 328,66, | 328,67, | 328,68, | 328,69, | 328,70, | 328,71, | 328,72, | 328,73, | 328,74, | 328,75, | 328,76, | 328,77, | 328,78, | 328,79, | 328,80, | 328,81, | 328,82, | 328,83, | 328,84, | 328,85, | 329,1, | 329,2, | 329,3, | 329,4, | 329,5, | 329,6, | 329,7, | 329,8, | 329,9, | 329,10, | 329,11, | 329,12, | 329,13, | 329,14, | 329,15, | 329,16, | 329,17, | 329,18, | 329,19, | 329,20, | 329,21, | 329,22, | 329,23, | 329,24, | 329,25, | 329,26, | 329,27, | 329,28, | 329,29, | 329,30, | 329,31, | 329,32, | 329,33, | 329,34, | 329,35, | 329,36, | 329,37, | 329,38, | 329,39, | 329,40, | 329,41, | 329,42, | 329,43, | 329,44, | 329,45, | 329,46, | 329,47, | 329,48, | 329,49, | 329,50, | 329,51, | 329,52, | 329,53, | 329,54, | 329,55, | 329,56, | 329,57, | 329,58, | 329,59, | 329,60, | 329,61, | 329,62, | 329,63, | 329,64, | 329,65, | 329,66, | 329,67, | 329,68, | 329,69, | 329,70, | 329,71, | 329,72, | 329,73, | 329,74, | 329,75, | 329,76, | 329,77, | 329,78, | 329,79, | 329,80, | 329,81, | 329,82, | 329,83, | 329,84, | 329,85, | 330,1, | 330,2, | 330,3, | 330,4, | 330,5, | 330,6, | 330,7, | 330,8, | 330,9, | 330,10, | 330,11, | 330,12, | 330,13, | 330,14, | 330,15, | 330,16, | 330,17, | 330,18, | 330,19, | 330,20, | 330,21, | 330,22, | 330,23, | 330,24, | 330,25, | 330,26, | 330,27, | 330,28, | 330,29, | 330,30, | 330,31, | 330,32, | 330,33, | 330,34, | 330,35, | 330,36, | 330,37, | 330,38, | 330,39, | 330,40, | 330,41, | 330,42, | 330,43, | 330,44, | 330,45, | 330,46, | 330,47, | 330,48, | 330,49, | 330,50, | 330,51, | 330,52, | 330,53, | 330,54, | 330,55, | 330,56, | 330,57, | 330,58, | 330,59, | 330,60, | 330,61, | 330,62, | 330,63, | 330,64, | 330,65, | 330,66, | 330,67, | 330,68, | 330,69, | 330,70, | 330,71, | 330,72, | 330,73, | 330,74, | 330,75, | 330,76, | 330,77, | 330,78, | 330,79, | 330,80, | 330,81, | 330,82, | 330,83, | 330,84, | 330,85, | 331,1, | 331,2, | 331,3, | 331,4, | 331,5, | 331,6, | 331,7, | 331,8, | 331,9, | 331,10, | 331,11, | 331,12, | 331,13, | 331,14, | 331,15, | 331,16, | 331,17, | 331,18, | 331,19, | 331,20, | 331,21, | 331,22, | 331,23, | 331,24, | 331,25, | 331,26, | 331,27, | 331,28, | 331,29, | 331,30, | 331,31, | 331,32, | 331,33, | 331,34, | 331,35, | 331,36, | 331,37, | 331,38, | 331,39, | 331,40, | 331,41, | 331,42, | 331,43, | 331,44, | 331,45, | 331,46, | 331,47, | 331,48, | 331,49, | 331,50, | 331,51, | 331,52, | 331,53, | 331,54, | 331,55, | 331,56, | 331,57, | 331,58, | 331,59, | 331,60, | 331,61, | 331,62, | 331,63, | 331,64, | 331,65, | 331,66, | 331,67, | 331,68, | 331,69, | 331,70, | 331,71, | 331,72, | 331,73, | 331,74, | 331,75, | 331,76, | 331,77, | 331,78, | 331,79, | 331,80, | 331,81, | 331,82, | 331,83, | 331,84, | 331,85, | 332,1, | 332,2, | 332,3, | 332,4, | 332,5, | 332,6, | 332,7, | 332,8, | 332,9, | 332,10, | 332,11, | 332,12, | 332,13, | 332,14, | 332,15, | 332,16, | 332,17, | 332,18, | 332,19, | 332,20, | 332,21, | 332,22, | 332,23, | 332,24, | 332,25, | 332,26, | 332,27, | 332,28, | 332,29, | 332,30, | 332,31, | 332,32, | 332,33, | 332,34, | 332,35, | 332,36, | 332,37, | 332,38, | 332,39, | 332,40, | 332,41, | 332,42, | 332,43, | 332,44, | 332,45, | 332,46, | 332,47, | 332,48, | 332,49, | 332,50, | 332,51, | 332,52, | 332,53, | 332,54, | 332,55, | 332,56, | 332,57, | 332,58, | 332,59, | 332,60, | 332,61, | 332,62, | 332,63, | 332,64, | 332,65, | 332,66, | 332,67, | 332,68, | 332,69, | 332,70, | 332,71, | 332,72, | 332,73, | 332,74, | 332,75, | 332,76, | 332,77, | 332,78, | 332,79, | 332,80, | 332,81, | 332,82, | 332,83, | 332,84, | 332,85, | 333,1, | 333,2, | 333,3, | 333,4, | 333,5, | 333,6, | 333,7, | 333,8, | 333,9, | 333,10, | 333,11, | 333,12, | 333,13, | 333,14, | 333,15, | 333,16, | 333,17, | 333,18, | 333,19, | 333,20, | 333,21, | 333,22, | 333,23, | 333,24, | 333,25, | 333,26, | 333,27, | 333,28, | 333,29, | 333,30, | 333,31, | 333,32, | 333,33, | 333,34, | 333,35, | 333,36, | 333,37, | 333,38, | 333,39, | 333,40, | 333,41, | 333,42, | 333,43, | 333,44, | 333,45, | 333,46, | 333,47, | 333,48, | 333,49, | 333,50, | 333,51, | 333,52, | 333,53, | 333,54, | 333,55, | 333,56, | 333,57, | 333,58, | 333,59, | 333,60, | 333,61, | 333,62, | 333,63, | 333,64, | 333,65, | 333,66, | 333,67, | 333,68, | 333,69, | 333,70, | 333,71, | 333,72, | 333,73, | 333,74, | 333,75, | 333,76, | 333,77, | 333,78, | 333,79, | 333,80, | 333,81, | 333,82, | 333,83, | 333,84, | 333,85, | 334,1, | 334,2, | 334,3, | 334,4, | 334,5, | 334,6, | 334,7, | 334,8, | 334,9, | 334,10, | 334,11, | 334,12, | 334,13, | 334,14, | 334,15, | 334,16, | 334,17, | 334,18, | 334,19, | 334,20, | 334,21, | 334,22, | 334,23, | 334,24, | 334,25, | 334,26, | 334,27, | 334,28, | 334,29, | 334,30, | 334,31, | 334,32, | 334,33, | 334,34, | 334,35, | 334,36, | 334,37, | 334,38, | 334,39, | 334,40, | 334,41, | 334,42, | 334,43, | 334,44, | 334,45, | 334,46, | 334,47, | 334,48, | 334,49, | 334,50, | 334,51, | 334,52, | 334,53, | 334,54, | 334,55, | 334,56, | 334,57, | 334,58, | 334,59, | 334,60, | 334,61, | 334,62, | 334,63, | 334,64, | 334,65, | 334,66, | 334,67, | 334,68, | 334,69, | 334,70, | 334,71, | 334,72, | 334,73, | 334,74, | 334,75, | 334,76, | 334,77, | 334,78, | 334,79, | 334,80, | 334,81, | 334,82, | 334,83, | 334,84, | 334,85, | 335,1, | 335,2, | 335,3, | 335,4, | 335,5, | 335,6, | 335,7, | 335,8, | 335,9, | 335,10, | 335,11, | 335,12, | 335,13, | 335,14, | 335,15, | 335,16, | 335,17, | 335,18, | 335,19, | 335,20, | 335,21, | 335,22, | 335,23, | 335,24, | 335,25, | 335,26, | 335,27, | 335,28, | 335,29, | 335,30, | 335,31, | 335,32, | 335,33, | 335,34, | 335,35, | 335,36, | 335,37, | 335,38, | 335,39, | 335,40, | 335,41, | 335,42, | 335,43, | 335,44, | 335,45, | 335,46, | 335,47, | 335,48, | 335,49, | 335,50, | 335,51, | 335,52, | 335,53, | 335,54, | 335,55, | 335,56, | 335,57, | 335,58, | 335,59, | 335,60, | 335,61, | 335,62, | 335,63, | 335,64, | 335,65, | 335,66, | 335,67, | 335,68, | 335,69, | 335,70, | 335,71, | 335,72, | 335,73, | 335,74, | 335,75, | 335,76, | 335,77, | 335,78, | 335,79, | 335,80, | 335,81, | 335,82, | 335,83, | 335,84, | 335,85, | 336,1, | 336,2, | 336,3, | 336,4, | 336,5, | 336,6, | 336,7, | 336,8, | 336,9, | 336,10, | 336,11, | 336,12, | 336,13, | 336,14, | 336,15, | 336,16, | 336,17, | 336,18, | 336,19, | 336,20, | 336,21, | 336,22, | 336,23, | 336,24, | 336,25, | 336,26, | 336,27, | 336,28, | 336,29, | 336,30, | 336,31, | 336,32, | 336,33, | 336,34, | 336,35, | 336,36, | 336,37, | 336,38, | 336,39, | 336,40, | 336,41, | 336,42, | 336,43, | 336,44, | 336,45, | 336,46, | 336,47, | 336,48, | 336,49, | 336,50, | 336,51, | 336,52, | 336,53, | 336,54, | 336,55, | 336,56, | 336,57, | 336,58, | 336,59, | 336,60, | 336,61, | 336,62, | 336,63, | 336,64, | 336,65, | 336,66, | 336,67, | 336,68, | 336,69, | 336,70, | 336,71, | 336,72, | 336,73, | 336,74, | 336,75, | 336,76, | 336,77, | 336,78, | 336,79, | 336,80, | 336,81, | 336,82, | 336,83, | 336,84, | 336,85, | 337,1, | 337,2, | 337,3, | 337,4, | 337,5, | 337,6, | 337,7, | 337,8, | 337,9, | 337,10, | 337,11, | 337,12, | 337,13, | 337,14, | 337,15, | 337,16, | 337,17, | 337,18, | 337,19, | 337,20, | 337,21, | 337,22, | 337,23, | 337,24, | 337,25, | 337,26, | 337,27, | 337,28, | 337,29, | 337,30, | 337,31, | 337,32, | 337,33, | 337,34, | 337,35, | 337,36, | 337,37, | 337,38, | 337,39, | 337,40, | 337,41, | 337,42, | 337,43, | 337,44, | 337,45, | 337,46, | 337,47, | 337,48, | 337,49, | 337,50, | 337,51, | 337,52, | 337,53, | 337,54, | 337,55, | 337,56, | 337,57, | 337,58, | 337,59, | 337,60, | 337,61, | 337,62, | 337,63, | 337,64, | 337,65, | 337,66, | 337,67, | 337,68, | 337,69, | 337,70, | 337,71, | 337,72, | 337,73, | 337,74, | 337,75, | 337,76, | 337,77, | 337,78, | 337,79, | 337,80, | 337,81, | 337,82, | 337,83, | 337,84, | 337,85, | 338,1, | 338,2, | 338,3, | 338,4, | 338,5, | 338,6, | 338,7, | 338,8, | 338,9, | 338,10, | 338,11, | 338,12, | 338,13, | 338,14, | 338,15, | 338,16, | 338,17, | 338,18, | 338,19, | 338,20, | 338,21, | 338,22, | 338,23, | 338,24, | 338,25, | 338,26, | 338,27, | 338,28, | 338,29, | 338,30, | 338,31, | 338,32, | 338,33, | 338,34, | 338,35, | 338,36, | 338,37, | 338,38, | 338,39, | 338,40, | 338,41, | 338,42, | 338,43, | 338,44, | 338,45, | 338,46, | 338,47, | 338,48, | 338,49, | 338,50, | 338,51, | 338,52, | 338,53, | 338,54, | 338,55, | 338,56, | 338,57, | 338,58, | 338,59, | 338,60, | 338,61, | 338,62, | 338,63, | 338,64, | 338,65, | 338,66, | 338,67, | 338,68, | 338,69, | 338,70, | 338,71, | 338,72, | 338,73, | 338,74, | 338,75, | 338,76, | 338,77, | 338,78, | 338,79, | 338,80, | 338,81, | 338,82, | 338,83, | 338,84, | 338,85, | 339,1, | 339,2, | 339,3, | 339,4, | 339,5, | 339,6, | 339,7, | 339,8, | 339,9, | 339,10, | 339,11, | 339,12, | 339,13, | 339,14, | 339,15, | 339,16, | 339,17, | 339,18, | 339,19, | 339,20, | 339,21, | 339,22, | 339,23, | 339,24, | 339,25, | 339,26, | 339,27, | 339,28, | 339,29, | 339,30, | 339,31, | 339,32, | 339,33, | 339,34, | 339,35, | 339,36, | 339,37, | 339,38, | 339,39, | 339,40, | 339,41, | 339,42, | 339,43, | 339,44, | 339,45, | 339,46, | 339,47, | 339,48, | 339,49, | 339,50, | 339,51, | 339,52, | 339,53, | 339,54, | 339,55, | 339,56, | 339,57, | 339,58, | 339,59, | 339,60, | 339,61, | 339,62, | 339,63, | 339,64, | 339,65, | 339,66, | 339,67, | 339,68, | 339,69, | 339,70, | 339,71, | 339,72, | 339,73, | 339,74, | 339,75, | 339,76, | 339,77, | 339,78, | 339,79, | 339,80, | 339,81, | 339,82, | 339,83, | 339,84, | 339,85, | 340,1, | 340,2, | 340,3, | 340,4, | 340,5, | 340,6, | 340,7, | 340,8, | 340,9, | 340,10, | 340,11, | 340,12, | 340,13, | 340,14, | 340,15, | 340,16, | 340,17, | 340,18, | 340,19, | 340,20, | 340,21, | 340,22, | 340,23, | 340,24, | 340,25, | 340,26, | 340,27, | 340,28, | 340,29, | 340,30, | 340,31, | 340,32, | 340,33, | 340,34, | 340,35, | 340,36, | 340,37, | 340,38, | 340,39, | 340,40, | 340,41, | 340,42, | 340,43, | 340,44, | 340,45, | 340,46, | 340,47, | 340,48, | 340,49, | 340,50, | 340,51, | 340,52, | 340,53, | 340,54, | 340,55, | 340,56, | 340,57, | 340,58, | 340,59, | 340,60, | 340,61, | 340,62, | 340,63, | 340,64, | 340,65, | 340,66, | 340,67, | 340,68, | 340,69, | 340,70, | 340,71, | 340,72, | 340,73, | 340,74, | 340,75, | 340,76, | 340,77, | 340,78, | 340,79, | 340,80, | 340,81, | 340,82, | 340,83, | 340,84, | 340,85, | 341,1, | 341,2, | 341,3, | 341,4, | 341,5, | 341,6, | 341,7, | 341,8, | 341,9, | 341,10, | 341,11, | 341,12, | 341,13, | 341,14, | 341,15, | 341,16, | 341,17, | 341,18, | 341,19, | 341,20, | 341,21, | 341,22, | 341,23, | 341,24, | 341,25, | 341,26, | 341,27, | 341,28, | 341,29, | 341,30, | 341,31, | 341,32, | 341,33, | 341,34, | 341,35, | 341,36, | 341,37, | 341,38, | 341,39, | 341,40, | 341,41, | 341,42, | 341,43, | 341,44, | 341,45, | 341,46, | 341,47, | 341,48, | 341,49, | 341,50, | 341,51, | 341,52, | 341,53, | 341,54, | 341,55, | 341,56, | 341,57, | 341,58, | 341,59, | 341,60, | 341,61, | 341,62, | 341,63, | 341,64, | 341,65, | 341,66, | 341,67, | 341,68, | 341,69, | 341,70, | 341,71, | 341,72, | 341,73, | 341,74, | 341,75, | 341,76, | 341,77, | 341,78, | 341,79, | 341,80, | 341,81, | 341,82, | 341,83, | 341,84, | 341,85, | 342,1, | 342,2, | 342,3, | 342,4, | 342,5, | 342,6, | 342,7, | 342,8, | 342,9, | 342,10, | 342,11, | 342,12, | 342,13, | 342,14, | 342,15, | 342,16, | 342,17, | 342,18, | 342,19, | 342,20, | 342,21, | 342,22, | 342,23, | 342,24, | 342,25, | 342,26, | 342,27, | 342,28, | 342,29, | 342,30, | 342,31, | 342,32, | 342,33, | 342,34, | 342,35, | 342,36, | 342,37, | 342,38, | 342,39, | 342,40, | 342,41, | 342,42, | 342,43, | 342,44, | 342,45, | 342,46, | 342,47, | 342,48, | 342,49, | 342,50, | 342,51, | 342,52, | 342,53, | 342,54, | 342,55, | 342,56, | 342,57, | 342,58, | 342,59, | 342,60, | 342,61, | 342,62, | 342,63, | 342,64, | 342,65, | 342,66, | 342,67, | 342,68, | 342,69, | 342,70, | 342,71, | 342,72, | 342,73, | 342,74, | 342,75, | 342,76, | 342,77, | 342,78, | 342,79, | 342,80, | 342,81, | 342,82, | 342,83, | 342,84, | 342,85, | 343,1, | 343,2, | 343,3, | 343,4, | 343,5, | 343,6, | 343,7, | 343,8, | 343,9, | 343,10, | 343,11, | 343,12, | 343,13, | 343,14, | 343,15, | 343,16, | 343,17, | 343,18, | 343,19, | 343,20, | 343,21, | 343,22, | 343,23, | 343,24, | 343,25, | 343,26, | 343,27, | 343,28, | 343,29, | 343,30, | 343,31, | 343,32, | 343,33, | 343,34, | 343,35, | 343,36, | 343,37, | 343,38, | 343,39, | 343,40, | 343,41, | 343,42, | 343,43, | 343,44, | 343,45, | 343,46, | 343,47, | 343,48, | 343,49, | 343,50, | 343,51, | 343,52, | 343,53, | 343,54, | 343,55, | 343,56, | 343,57, | 343,58, | 343,59, | 343,60, | 343,61, | 343,62, | 343,63, | 343,64, | 343,65, | 343,66, | 343,67, | 343,68, | 343,69, | 343,70, | 343,71, | 343,72, | 343,73, | 343,74, | 343,75, | 343,76, | 343,77, | 343,78, | 343,79, | 343,80, | 343,81, | 343,82, | 343,83, | 343,84, | 343,85, | 344,1, | 344,2, | 344,3, | 344,4, | 344,5, | 344,6, | 344,7, | 344,8, | 344,9, | 344,10, | 344,11, | 344,12, | 344,13, | 344,14, | 344,15, | 344,16, | 344,17, | 344,18, | 344,19, | 344,20, | 344,21, | 344,22, | 344,23, | 344,24, | 344,25, | 344,26, | 344,27, | 344,28, | 344,29, | 344,30, | 344,31, | 344,32, | 344,33, | 344,34, | 344,35, | 344,36, | 344,37, | 344,38, | 344,39, | 344,40, | 344,41, | 344,42, | 344,43, | 344,44, | 344,45, | 344,46, | 344,47, | 344,48, | 344,49, | 344,50, | 344,51, | 344,52, | 344,53, | 344,54, | 344,55, | 344,56, | 344,57, | 344,58, | 344,59, | 344,60, | 344,61, | 344,62, | 344,63, | 344,64, | 344,65, | 344,66, | 344,67, | 344,68, | 344,69, | 344,70, | 344,71, | 344,72, | 344,73, | 344,74, | 344,75, | 344,76, | 344,77, | 344,78, | 344,79, | 344,80, | 344,81, | 344,82, | 344,83, | 344,84, | 344,85, | 345,1, | 345,2, | 345,3, | 345,4, | 345,5, | 345,6, | 345,7, | 345,8, | 345,9, | 345,10, | 345,11, | 345,12, | 345,13, | 345,14, | 345,15, | 345,16, | 345,17, | 345,18, | 345,19, | 345,20, | 345,21, | 345,22, | 345,23, | 345,24, | 345,25, | 345,26, | 345,27, | 345,28, | 345,29, | 345,30, | 345,31, | 345,32, | 345,33, | 345,34, | 345,35, | 345,36, | 345,37, | 345,38, | 345,39, | 345,40, | 345,41, | 345,42, | 345,43, | 345,44, | 345,45, | 345,46, | 345,47, | 345,48, | 345,49, | 345,50, | 345,51, | 345,52, | 345,53, | 345,54, | 345,55, | 345,56, | 345,57, | 345,58, | 345,59, | 345,60, | 345,61, | 345,62, | 345,63, | 345,64, | 345,65, | 345,66, | 345,67, | 345,68, | 345,69, | 345,70, | 345,71, | 345,72, | 345,73, | 345,74, | 345,75, | 345,76, | 345,77, | 345,78, | 345,79, | 345,80, | 345,81, | 345,82, | 345,83, | 345,84, | 345,85, | 346,1, | 346,2, | 346,3, | 346,4, | 346,5, | 346,6, | 346,7, | 346,8, | 346,9, | 346,10, | 346,11, | 346,12, | 346,13, | 346,14, | 346,15, | 346,16, | 346,17, | 346,18, | 346,19, | 346,20, | 346,21, | 346,22, | 346,23, | 346,24, | 346,25, | 346,26, | 346,27, | 346,28, | 346,29, | 346,30, | 346,31, | 346,32, | 346,33, | 346,34, | 346,35, | 346,36, | 346,37, | 346,38, | 346,39, | 346,40, | 346,41, | 346,42, | 346,43, | 346,44, | 346,45, | 346,46, | 346,47, | 346,48, | 346,49, | 346,50, | 346,51, | 346,52, | 346,53, | 346,54, | 346,55, | 346,56, | 346,57, | 346,58, | 346,59, | 346,60, | 346,61, | 346,62, | 346,63, | 346,64, | 346,65, | 346,66, | 346,67, | 346,68, | 346,69, | 346,70, | 346,71, | 346,72, | 346,73, | 346,74, | 346,75, | 346,76, | 346,77, | 346,78, | 346,79, | 346,80, | 346,81, | 346,82, | 346,83, | 346,84, | 346,85, | 347,1, | 347,2, | 347,3, | 347,4, | 347,5, | 347,6, | 347,7, | 347,8, | 347,9, | 347,10, | 347,11, | 347,12, | 347,13, | 347,14, | 347,15, | 347,16, | 347,17, | 347,18, | 347,19, | 347,20, | 347,21, | 347,22, | 347,23, | 347,24, | 347,25, | 347,26, | 347,27, | 347,28, | 347,29, | 347,30, | 347,31, | 347,32, | 347,33, | 347,34, | 347,35, | 347,36, | 347,37, | 347,38, | 347,39, | 347,40, | 347,41, | 347,42, | 347,43, | 347,44, | 347,45, | 347,46, | 347,47, | 347,48, | 347,49, | 347,50, | 347,51, | 347,52, | 347,53, | 347,54, | 347,55, | 347,56, | 347,57, | 347,58, | 347,59, | 347,60, | 347,61, | 347,62, | 347,63, | 347,64, | 347,65, | 347,66, | 347,67, | 347,68, | 347,69, | 347,70, | 347,71, | 347,72, | 347,73, | 347,74, | 347,75, | 347,76, | 347,77, | 347,78, | 347,79, | 347,80, | 347,81, | 347,82, | 347,83, | 347,84, | 347,85, | 348,1, | 348,2, | 348,3, | 348,4, | 348,5, | 348,6, | 348,7, | 348,8, | 348,9, | 348,10, | 348,11, | 348,12, | 348,13, | 348,14, | 348,15, | 348,16, | 348,17, | 348,18, | 348,19, | 348,20, | 348,21, | 348,22, | 348,23, | 348,24, | 348,25, | 348,26, | 348,27, | 348,28, | 348,29, | 348,30, | 348,31, | 348,32, | 348,33, | 348,34, | 348,35, | 348,36, | 348,37, | 348,38, | 348,39, | 348,40, | 348,41, | 348,42, | 348,43, | 348,44, | 348,45, | 348,46, | 348,47, | 348,48, | 348,49, | 348,50, | 348,51, | 348,52, | 348,53, | 348,54, | 348,55, | 348,56, | 348,57, | 348,58, | 348,59, | 348,60, | 348,61, | 348,62, | 348,63, | 348,64, | 348,65, | 348,66, | 348,67, | 348,68, | 348,69, | 348,70, | 348,71, | 348,72, | 348,73, | 348,74, | 348,75, | 348,76, | 348,77, | 348,78, | 348,79, | 348,80, | 348,81, | 348,82, | 348,83, | 348,84, | 348,85, | 349,1, | 349,2, | 349,3, | 349,4, | 349,5, | 349,6, | 349,7, | 349,8, | 349,9, | 349,10, | 349,11, | 349,12, | 349,13, | 349,14, | 349,15, | 349,16, | 349,17, | 349,18, | 349,19, | 349,20, | 349,21, | 349,22, | 349,23, | 349,24, | 349,25, | 349,26, | 349,27, | 349,28, | 349,29, | 349,30, | 349,31, | 349,32, | 349,33, | 349,34, | 349,35, | 349,36, | 349,37, | 349,38, | 349,39, | 349,40, | 349,41, | 349,42, | 349,43, | 349,44, | 349,45, | 349,46, | 349,47, | 349,48, | 349,49, | 349,50, | 349,51, | 349,52, | 349,53, | 349,54, | 349,55, | 349,56, | 349,57, | 349,58, | 349,59, | 349,60, | 349,61, | 349,62, | 349,63, | 349,64, | 349,65, | 349,66, | 349,67, | 349,68, | 349,69, | 349,70, | 349,71, | 349,72, | 349,73, | 349,74, | 349,75, | 349,76, | 349,77, | 349,78, | 349,79, | 349,80, | 349,81, | 349,82, | 349,83, | 349,84, | 349,85, | 350,1, | 350,2, | 350,3, | 350,4, | 350,5, | 350,6, | 350,7, | 350,8, | 350,9, | 350,10, | 350,11, | 350,12, | 350,13, | 350,14, | 350,15, | 350,16, | 350,17, | 350,18, | 350,19, | 350,20, | 350,21, | 350,22, | 350,23, | 350,24, | 350,25, | 350,26, | 350,27, | 350,28, | 350,29, | 350,30, | 350,31, | 350,32, | 350,33, | 350,34, | 350,35, | 350,36, | 350,37, | 350,38, | 350,39, | 350,40, | 350,41, | 350,42, | 350,43, | 350,44, | 350,45, | 350,46, | 350,47, | 350,48, | 350,49, | 350,50, | 350,51, | 350,52, | 350,53, | 350,54, | 350,55, | 350,56, | 350,57, | 350,58, | 350,59, | 350,60, | 350,61, | 350,62, | 350,63, | 350,64, | 350,65, | 350,66, | 350,67, | 350,68, | 350,69, | 350,70, | 350,71, | 350,72, | 350,73, | 350,74, | 350,75, | 350,76, | 350,77, | 350,78, | 350,79, | 350,80, | 350,81, | 350,82, | 350,83, | 350,84, | 350,85, | 351,1, | 351,2, | 351,3, | 351,4, | 351,5, | 351,6, | 351,7, | 351,8, | 351,9, | 351,10, | 351,11, | 351,12, | 351,13, | 351,14, | 351,15, | 351,16, | 351,17, | 351,18, | 351,19, | 351,20, | 351,21, | 351,22, | 351,23, | 351,24, | 351,25, | 351,26, | 351,27, | 351,28, | 351,29, | 351,30, | 351,31, | 351,32, | 351,33, | 351,34, | 351,35, | 351,36, | 351,37, | 351,38, | 351,39, | 351,40, | 351,41, | 351,42, | 351,43, | 351,44, | 351,45, | 351,46, | 351,47, | 351,48, | 351,49, | 351,50, | 351,51, | 351,52, | 351,53, | 351,54, | 351,55, | 351,56, | 351,57, | 351,58, | 351,59, | 351,60, | 351,61, | 351,62, | 351,63, | 351,64, | 351,65, | 351,66, | 351,67, | 351,68, | 351,69, | 351,70, | 351,71, | 351,72, | 351,73, | 351,74, | 351,75, | 351,76, | 351,77, | 351,78, | 351,79, | 351,80, | 351,81, | 351,82, | 351,83, | 351,84, | 351,85, | 352,1, | 352,2, | 352,3, | 352,4, | 352,5, | 352,6, | 352,7, | 352,8, | 352,9, | 352,10, | 352,11, | 352,12, | 352,13, | 352,14, | 352,15, | 352,16, | 352,17, | 352,18, | 352,19, | 352,20, | 352,21, | 352,22, | 352,23, | 352,24, | 352,25, | 352,26, | 352,27, | 352,28, | 352,29, | 352,30, | 352,31, | 352,32, | 352,33, | 352,34, | 352,35, | 352,36, | 352,37, | 352,38, | 352,39, | 352,40, | 352,41, | 352,42, | 352,43, | 352,44, | 352,45, | 352,46, | 352,47, | 352,48, | 352,49, | 352,50, | 352,51, | 352,52, | 352,53, | 352,54, | 352,55, | 352,56, | 352,57, | 352,58, | 352,59, | 352,60, | 352,61, | 352,62, | 352,63, | 352,64, | 352,65, | 352,66, | 352,67, | 352,68, | 352,69, | 352,70, | 352,71, | 352,72, | 352,73, | 352,74, | 352,75, | 352,76, | 352,77, | 352,78, | 352,79, | 352,80, | 352,81, | 352,82, | 352,83, | 352,84, | 352,85, | 353,1, | 353,2, | 353,3, | 353,4, | 353,5, | 353,6, | 353,7, | 353,8, | 353,9, | 353,10, | 353,11, | 353,12, | 353,13, | 353,14, | 353,15, | 353,16, | 353,17, | 353,18, | 353,19, | 353,20, | 353,21, | 353,22, | 353,23, | 353,24, | 353,25, | 353,26, | 353,27, | 353,28, | 353,29, | 353,30, | 353,31, | 353,32, | 353,33, | 353,34, | 353,35, | 353,36, | 353,37, | 353,38, | 353,39, | 353,40, | 353,41, | 353,42, | 353,43, | 353,44, | 353,45, | 353,46, | 353,47, | 353,48, | 353,49, | 353,50, | 353,51, | 353,52, | 353,53, | 353,54, | 353,55, | 353,56, | 353,57, | 353,58, | 353,59, | 353,60, | 353,61, | 353,62, | 353,63, | 353,64, | 353,65, | 353,66, | 353,67, | 353,68, | 353,69, | 353,70, | 353,71, | 353,72, | 353,73, | 353,74, | 353,75, | 353,76, | 353,77, | 353,78, | 353,79, | 353,80, | 353,81, | 353,82, | 353,83, | 353,84, | 353,85, | 354,1, | 354,2, | 354,3, | 354,4, | 354,5, | 354,6, | 354,7, | 354,8, | 354,9, | 354,10, | 354,11, | 354,12, | 354,13, | 354,14, | 354,15, | 354,16, | 354,17, | 354,18, | 354,19, | 354,20, | 354,21, | 354,22, | 354,23, | 354,24, | 354,25, | 354,26, | 354,27, | 354,28, | 354,29, | 354,30, | 354,31, | 354,32, | 354,33, | 354,34, | 354,35, | 354,36, | 354,37, | 354,38, | 354,39, | 354,40, | 354,41, | 354,42, | 354,43, | 354,44, | 354,45, | 354,46, | 354,47, | 354,48, | 354,49, | 354,50, | 354,51, | 354,52, | 354,53, | 354,54, | 354,55, | 354,56, | 354,57, | 354,58, | 354,59, | 354,60, | 354,61, | 354,62, | 354,63, | 354,64, | 354,65, | 354,66, | 354,67, | 354,68, | 354,69, | 354,70, | 354,71, | 354,72, | 354,73, | 354,74, | 354,75, | 354,76, | 354,77, | 354,78, | 354,79, | 354,80, | 354,81, | 354,82, | 354,83, | 354,84, | 354,85, | 355,1, | 355,2, | 355,3, | 355,4, | 355,5, | 355,6, | 355,7, | 355,8, | 355,9, | 355,10, | 355,11, | 355,12, | 355,13, | 355,14, | 355,15, | 355,16, | 355,17, | 355,18, | 355,19, | 355,20, | 355,21, | 355,22, | 355,23, | 355,24, | 355,25, | 355,26, | 355,27, | 355,28, | 355,29, | 355,30, | 355,31, | 355,32, | 355,33, | 355,34, | 355,35, | 355,36, | 355,37, | 355,38, | 355,39, | 355,40, | 355,41, | 355,42, | 355,43, | 355,44, | 355,45, | 355,46, | 355,47, | 355,48, | 355,49, | 355,50, | 355,51, | 355,52, | 355,53, | 355,54, | 355,55, | 355,56, | 355,57, | 355,58, | 355,59, | 355,60, | 355,61, | 355,62, | 355,63, | 355,64, | 355,65, | 355,66, | 355,67, | 355,68, | 355,69, | 355,70, | 355,71, | 355,72, | 355,73, | 355,74, | 355,75, | 355,76, | 355,77, | 355,78, | 355,79, | 355,80, | 355,81, | 355,82, | 355,83, | 355,84, | 355,85, | 356,1, | 356,2, | 356,3, | 356,4, | 356,5, | 356,6, | 356,7, | 356,8, | 356,9, | 356,10, | 356,11, | 356,12, | 356,13, | 356,14, | 356,15, | 356,16, | 356,17, | 356,18, | 356,19, | 356,20, | 356,21, | 356,22, | 356,23, | 356,24, | 356,25, | 356,26, | 356,27, | 356,28, | 356,29, | 356,30, | 356,31, | 356,32, | 356,33, | 356,34, | 356,35, | 356,36, | 356,37, | 356,38, | 356,39, | 356,40, | 356,41, | 356,42, | 356,43, | 356,44, | 356,45, | 356,46, | 356,47, | 356,48, | 356,49, | 356,50, | 356,51, | 356,52, | 356,53, | 356,54, | 356,55, | 356,56, | 356,57, | 356,58, | 356,59, | 356,60, | 356,61, | 356,62, | 356,63, | 356,64, | 356,65, | 356,66, | 356,67, | 356,68, | 356,69, | 356,70, | 356,71, | 356,72, | 356,73, | 356,74, | 356,75, | 356,76, | 356,77, | 356,78, | 356,79, | 356,80, | 356,81, | 356,82, | 356,83, | 356,84, | 356,85, | 357,1, | 357,2, | 357,3, | 357,4, | 357,5, | 357,6, | 357,7, | 357,8, | 357,9, | 357,10, | 357,11, | 357,12, | 357,13, | 357,14, | 357,15, | 357,16, | 357,17, | 357,18, | 357,19, | 357,20, | 357,21, | 357,22, | 357,23, | 357,24, | 357,25, | 357,26, | 357,27, | 357,28, | 357,29, | 357,30, | 357,31, | 357,32, | 357,33, | 357,34, | 357,35, | 357,36, | 357,37, | 357,38, | 357,39, | 357,40, | 357,41, | 357,42, | 357,43, | 357,44, | 357,45, | 357,46, | 357,47, | 357,48, | 357,49, | 357,50, | 357,51, | 357,52, | 357,53, | 357,54, | 357,55, | 357,56, | 357,57, | 357,58, | 357,59, | 357,60, | 357,61, | 357,62, | 357,63, | 357,64, | 357,65, | 357,66, | 357,67, | 357,68, | 357,69, | 357,70, | 357,71, | 357,72, | 357,73, | 357,74, | 357,75, | 357,76, | 357,77, | 357,78, | 357,79, | 357,80, | 357,81, | 357,82, | 357,83, | 357,84, | 357,85, | 358,1, | 358,2, | 358,3, | 358,4, | 358,5, | 358,6, | 358,7, | 358,8, | 358,9, | 358,10, | 358,11, | 358,12, | 358,13, | 358,14, | 358,15, | 358,16, | 358,17, | 358,18, | 358,19, | 358,20, | 358,21, | 358,22, | 358,23, | 358,24, | 358,25, | 358,26, | 358,27, | 358,28, | 358,29, | 358,30, | 358,31, | 358,32, | 358,33, | 358,34, | 358,35, | 358,36, | 358,37, | 358,38, | 358,39, | 358,40, | 358,41, | 358,42, | 358,43, | 358,44, | 358,45, | 358,46, | 358,47, | 358,48, | 358,49, | 358,50, | 358,51, | 358,52, | 358,53, | 358,54, | 358,55, | 358,56, | 358,57, | 358,58, | 358,59, | 358,60, | 358,61, | 358,62, | 358,63, | 358,64, | 358,65, | 358,66, | 358,67, | 358,68, | 358,69, | 358,70, | 358,71, | 358,72, | 358,73, | 358,74, | 358,75, | 358,76, | 358,77, | 358,78, | 358,79, | 358,80, | 358,81, | 358,82, | 358,83, | 358,84, | 358,85, | 359,1, | 359,2, | 359,3, | 359,4, | 359,5, | 359,6, | 359,7, | 359,8, | 359,9, | 359,10, | 359,11, | 359,12, | 359,13, | 359,14, | 359,15, | 359,16, | 359,17, | 359,18, | 359,19, | 359,20, | 359,21, | 359,22, | 359,23, | 359,24, | 359,25, | 359,26, | 359,27, | 359,28, | 359,29, | 359,30, | 359,31, | 359,32, | 359,33, | 359,34, | 359,35, | 359,36, | 359,37, | 359,38, | 359,39, | 359,40, | 359,41, | 359,42, | 359,43, | 359,44, | 359,45, | 359,46, | 359,47, | 359,48, | 359,49, | 359,50, | 359,51, | 359,52, | 359,53, | 359,54, | 359,55, | 359,56, | 359,57, | 359,58, | 359,59, | 359,60, | 359,61, | 359,62, | 359,63, | 359,64, | 359,65, | 359,66, | 359,67, | 359,68, | 359,69, | 359,70, | 359,71, | 359,72, | 359,73, | 359,74, | 359,75, | 359,76, | 359,77, | 359,78, | 359,79, | 359,80, | 359,81, | 359,82, | 359,83, | 359,84, | 359,85, | 360,1, | 360,2, | 360,3, | 360,4, | 360,5, | 360,6, | 360,7, | 360,8, | 360,9, | 360,10, | 360,11, | 360,12, | 360,13, | 360,14, | 360,15, | 360,16, | 360,17, | 360,18, | 360,19, | 360,20, | 360,21, | 360,22, | 360,23, | 360,24, | 360,25, | 360,26, | 360,27, | 360,28, | 360,29, | 360,30, | 360,31, | 360,32, | 360,33, | 360,34, | 360,35, | 360,36, | 360,37, | 360,38, | 360,39, | 360,40, | 360,41, | 360,42, | 360,43, | 360,44, | 360,45, | 360,46, | 360,47, | 360,48, | 360,49, | 360,50, | 360,51, | 360,52, | 360,53, | 360,54, | 360,55, | 360,56, | 360,57, | 360,58, | 360,59, | 360,60, | 360,61, | 360,62, | 360,63, | 360,64, | 360,65, | 360,66, | 360,67, | 360,68, | 360,69, | 360,70, | 360,71, | 360,72, | 360,73, | 360,74, | 360,75, | 360,76, | 360,77, | 360,78, | 360,79, | 360,80, | 360,81, | 360,82, | 360,83, | 360,84, | 360,85, | 361,1, | 361,2, | 361,3, | 361,4, | 361,5, | 361,6, | 361,7, | 361,8, | 361,9, | 361,10, | 361,11, | 361,12, | 361,13, | 361,14, | 361,15, | 361,16, | 361,17, | 361,18, | 361,19, | 361,20, | 361,21, | 361,22, | 361,23, | 361,24, | 361,25, | 361,26, | 361,27, | 361,28, | 361,29, | 361,30, | 361,31, | 361,32, | 361,33, | 361,34, | 361,35, | 361,36, | 361,37, | 361,38, | 361,39, | 361,40, | 361,41, | 361,42, | 361,43, | 361,44, | 361,45, | 361,46, | 361,47, | 361,48, | 361,49, | 361,50, | 361,51, | 361,52, | 361,53, | 361,54, | 361,55, | 361,56, | 361,57, | 361,58, | 361,59, | 361,60, | 361,61, | 361,62, | 361,63, | 361,64, | 361,65, | 361,66, | 361,67, | 361,68, | 361,69, | 361,70, | 361,71, | 361,72, | 361,73, | 361,74, | 361,75, | 361,76, | 361,77, | 361,78, | 361,79, | 361,80, | 361,81, | 361,82, | 361,83, | 361,84, | 361,85, | 362,1, | 362,2, | 362,3, | 362,4, | 362,5, | 362,6, | 362,7, | 362,8, | 362,9, | 362,10, | 362,11, | 362,12, | 362,13, | 362,14, | 362,15, | 362,16, | 362,17, | 362,18, | 362,19, | 362,20, | 362,21, | 362,22, | 362,23, | 362,24, | 362,25, | 362,26, | 362,27, | 362,28, | 362,29, | 362,30, | 362,31, | 362,32, | 362,33, | 362,34, | 362,35, | 362,36, | 362,37, | 362,38, | 362,39, | 362,40, | 362,41, | 362,42, | 362,43, | 362,44, | 362,45, | 362,46, | 362,47, | 362,48, | 362,49, | 362,50, | 362,51, | 362,52, | 362,53, | 362,54, | 362,55, | 362,56, | 362,57, | 362,58, | 362,59, | 362,60, | 362,61, | 362,62, | 362,63, | 362,64, | 362,65, | 362,66, | 362,67, | 362,68, | 362,69, | 362,70, | 362,71, | 362,72, | 362,73, | 362,74, | 362,75, | 362,76, | 362,77, | 362,78, | 362,79, | 362,80, | 362,81, | 362,82, | 362,83, | 362,84, | 362,85, | 363,1, | 363,2, | 363,3, | 363,4, | 363,5, | 363,6, | 363,7, | 363,8, | 363,9, | 363,10, | 363,11, | 363,12, | 363,13, | 363,14, | 363,15, | 363,16, | 363,17, | 363,18, | 363,19, | 363,20, | 363,21, | 363,22, | 363,23, | 363,24, | 363,25, | 363,26, | 363,27, | 363,28, | 363,29, | 363,30, | 363,31, | 363,32, | 363,33, | 363,34, | 363,35, | 363,36, | 363,37, | 363,38, | 363,39, | 363,40, | 363,41, | 363,42, | 363,43, | 363,44, | 363,45, | 363,46, | 363,47, | 363,48, | 363,49, | 363,50, | 363,51, | 363,52, | 363,53, | 363,54, | 363,55, | 363,56, | 363,57, | 363,58, | 363,59, | 363,60, | 363,61, | 363,62, | 363,63, | 363,64, | 363,65, | 363,66, | 363,67, | 363,68, | 363,69, | 363,70, | 363,71, | 363,72, | 363,73, | 363,74, | 363,75, | 363,76, | 363,77, | 363,78, | 363,79, | 363,80, | 363,81, | 363,82, | 363,83, | 363,84, | 363,85, | 364,1, | 364,2, | 364,3, | 364,4, | 364,5, | 364,6, | 364,7, | 364,8, | 364,9, | 364,10, | 364,11, | 364,12, | 364,13, | 364,14, | 364,15, | 364,16, | 364,17, | 364,18, | 364,19, | 364,20, | 364,21, | 364,22, | 364,23, | 364,24, | 364,25, | 364,26, | 364,27, | 364,28, | 364,29, | 364,30, | 364,31, | 364,32, | 364,33, | 364,34, | 364,35, | 364,36, | 364,37, | 364,38, | 364,39, | 364,40, | 364,41, | 364,42, | 364,43, | 364,44, | 364,45, | 364,46, | 364,47, | 364,48, | 364,49, | 364,50, | 364,51, | 364,52, | 364,53, | 364,54, | 364,55, | 364,56, | 364,57, | 364,58, | 364,59, | 364,60, | 364,61, | 364,62, | 364,63, | 364,64, | 364,65, | 364,66, | 364,67, | 364,68, | 364,69, | 364,70, | 364,71, | 364,72, | 364,73, | 364,74, | 364,75, | 364,76, | 364,77, | 364,78, | 364,79, | 364,80, | 364,81, | 364,82, | 364,83, | 364,84, | 364,85, | 365,1, | 365,2, | 365,3, | 365,4, | 365,5, | 365,6, | 365,7, | 365,8, | 365,9, | 365,10, | 365,11, | 365,12, | 365,13, | 365,14, | 365,15, | 365,16, | 365,17, | 365,18, | 365,19, | 365,20, | 365,21, | 365,22, | 365,23, | 365,24, | 365,25, | 365,26, | 365,27, | 365,28, | 365,29, | 365,30, | 365,31, | 365,32, | 365,33, | 365,34, | 365,35, | 365,36, | 365,37, | 365,38, | 365,39, | 365,40, | 365,41, | 365,42, | 365,43, | 365,44, | 365,45, | 365,46, | 365,47, | 365,48, | 365,49, | 365,50, | 365,51, | 365,52, | 365,53, | 365,54, | 365,55, | 365,56, | 365,57, | 365,58, | 365,59, | 365,60, | 365,61, | 365,62, | 365,63, | 365,64, | 365,65, | 365,66, | 365,67, | 365,68, | 365,69, | 365,70, | 365,71, | 365,72, | 365,73, | 365,74, | 365,75, | 365,76, | 365,77, | 365,78, | 365,79, | 365,80, | 365,81, | 365,82, | 365,83, | 365,84, | 365,85, | 366,1, | 366,2, | 366,3, | 366,4, | 366,5, | 366,6, | 366,7, | 366,8, | 366,9, | 366,10, | 366,11, | 366,12, | 366,13, | 366,14, | 366,15, | 366,16, | 366,17, | 366,18, | 366,19, | 366,20, | 366,21, | 366,22, | 366,23, | 366,24, | 366,25, | 366,26, | 366,27, | 366,28, | 366,29, | 366,30, | 366,31, | 366,32, | 366,33, | 366,34, | 366,35, | 366,36, | 366,37, | 366,38, | 366,39, | 366,40, | 366,41, | 366,42, | 366,43, | 366,44, | 366,45, | 366,46, | 366,47, | 366,48, | 366,49, | 366,50, | 366,51, | 366,52, | 366,53, | 366,54, | 366,55, | 366,56, | 366,57, | 366,58, | 366,59, | 366,60, | 366,61, | 366,62, | 366,63, | 366,64, | 366,65, | 366,66, | 366,67, | 366,68, | 366,69, | 366,70, | 366,71, | 366,72, | 366,73, | 366,74, | 366,75, | 366,76, | 366,77, | 366,78, | 366,79, | 366,80, | 366,81, | 366,82, | 366,83, | 366,84, | 366,85, | 367,1, | 367,2, | 367,3, | 367,4, | 367,5, | 367,6, | 367,7, | 367,8, | 367,9, | 367,10, | 367,11, | 367,12, | 367,13, | 367,14, | 367,15, | 367,16, | 367,17, | 367,18, | 367,19, | 367,20, | 367,21, | 367,22, | 367,23, | 367,24, | 367,25, | 367,26, | 367,27, | 367,28, | 367,29, | 367,30, | 367,31, | 367,32, | 367,33, | 367,34, | 367,35, | 367,36, | 367,37, | 367,38, | 367,39, | 367,40, | 367,41, | 367,42, | 367,43, | 367,44, | 367,45, | 367,46, | 367,47, | 367,48, | 367,49, | 367,50, | 367,51, | 367,52, | 367,53, | 367,54, | 367,55, | 367,56, | 367,57, | 367,58, | 367,59, | 367,60, | 367,61, | 367,62, | 367,63, | 367,64, | 367,65, | 367,66, | 367,67, | 367,68, | 367,69, | 367,70, | 367,71, | 367,72, | 367,73, | 367,74, | 367,75, | 367,76, | 367,77, | 367,78, | 367,79, | 367,80, | 367,81, | 367,82, | 367,83, | 367,84, | 367,85, | 368,1, | 368,2, | 368,3, | 368,4, | 368,5, | 368,6, | 368,7, | 368,8, | 368,9, | 368,10, | 368,11, | 368,12, | 368,13, | 368,14, | 368,15, | 368,16, | 368,17, | 368,18, | 368,19, | 368,20, | 368,21, | 368,22, | 368,23, | 368,24, | 368,25, | 368,26, | 368,27, | 368,28, | 368,29, | 368,30, | 368,31, | 368,32, | 368,33, | 368,34, | 368,35, | 368,36, | 368,37, | 368,38, | 368,39, | 368,40, | 368,41, | 368,42, | 368,43, | 368,44, | 368,45, | 368,46, | 368,47, | 368,48, | 368,49, | 368,50, | 368,51, | 368,52, | 368,53, | 368,54, | 368,55, | 368,56, | 368,57, | 368,58, | 368,59, | 368,60, | 368,61, | 368,62, | 368,63, | 368,64, | 368,65, | 368,66, | 368,67, | 368,68, | 368,69, | 368,70, | 368,71, | 368,72, | 368,73, | 368,74, | 368,75, | 368,76, | 368,77, | 368,78, | 368,79, | 368,80, | 368,81, | 368,82, | 368,83, | 368,84, | 368,85, | 369,1, | 369,2, | 369,3, | 369,4, | 369,5, | 369,6, | 369,7, | 369,8, | 369,9, | 369,10, | 369,11, | 369,12, | 369,13, | 369,14, | 369,15, | 369,16, | 369,17, | 369,18, | 369,19, | 369,20, | 369,21, | 369,22, | 369,23, | 369,24, | 369,25, | 369,26, | 369,27, | 369,28, | 369,29, | 369,30, | 369,31, | 369,32, | 369,33, | 369,34, | 369,35, | 369,36, | 369,37, | 369,38, | 369,39, | 369,40, | 369,41, | 369,42, | 369,43, | 369,44, | 369,45, | 369,46, | 369,47, | 369,48, | 369,49, | 369,50, | 369,51, | 369,52, | 369,53, | 369,54, | 369,55, | 369,56, | 369,57, | 369,58, | 369,59, | 369,60, | 369,61, | 369,62, | 369,63, | 369,64, | 369,65, | 369,66, | 369,67, | 369,68, | 369,69, | 369,70, | 369,71, | 369,72, | 369,73, | 369,74, | 369,75, | 369,76, | 369,77, | 369,78, | 369,79, | 369,80, | 369,81, | 369,82, | 369,83, | 369,84, | 369,85, | 370,1, | 370,2, | 370,3, | 370,4, | 370,5, | 370,6, | 370,7, | 370,8, | 370,9, | 370,10, | 370,11, | 370,12, | 370,13, | 370,14, | 370,15, | 370,16, | 370,17, | 370,18, | 370,19, | 370,20, | 370,21, | 370,22, | 370,23, | 370,24, | 370,25, | 370,26, | 370,27, | 370,28, | 370,29, | 370,30, | 370,31, | 370,32, | 370,33, | 370,34, | 370,35, | 370,36, | 370,37, | 370,38, | 370,39, | 370,40, | 370,41, | 370,42, | 370,43, | 370,44, | 370,45, | 370,46, | 370,47, | 370,48, | 370,49, | 370,50, | 370,51, | 370,52, | 370,53, | 370,54, | 370,55, | 370,56, | 370,57, | 370,58, | 370,59, | 370,60, | 370,61, | 370,62, | 370,63, | 370,64, | 370,65, | 370,66, | 370,67, | 370,68, | 370,69, | 370,70, | 370,71, | 370,72, | 370,73, | 370,74, | 370,75, | 370,76, | 370,77, | 370,78, | 370,79, | 370,80, | 370,81, | 370,82, | 370,83, | 370,84, | 370,85, | 371,1, | 371,2, | 371,3, | 371,4, | 371,5, | 371,6, | 371,7, | 371,8, | 371,9, | 371,10, | 371,11, | 371,12, | 371,13, | 371,14, | 371,15, | 371,16, | 371,17, | 371,18, | 371,19, | 371,20, | 371,21, | 371,22, | 371,23, | 371,24, | 371,25, | 371,26, | 371,27, | 371,28, | 371,29, | 371,30, | 371,31, | 371,32, | 371,33, | 371,34, | 371,35, | 371,36, | 371,37, | 371,38, | 371,39, | 371,40, | 371,41, | 371,42, | 371,43, | 371,44, | 371,45, | 371,46, | 371,47, | 371,48, | 371,49, | 371,50, | 371,51, | 371,52, | 371,53, | 371,54, | 371,55, | 371,56, | 371,57, | 371,58, | 371,59, | 371,60, | 371,61, | 371,62, | 371,63, | 371,64, | 371,65, | 371,66, | 371,67, | 371,68, | 371,69, | 371,70, | 371,71, | 371,72, | 371,73, | 371,74, | 371,75, | 371,76, | 371,77, | 371,78, | 371,79, | 371,80, | 371,81, | 371,82, | 371,83, | 371,84, | 371,85, | 372,1, | 372,2, | 372,3, | 372,4, | 372,5, | 372,6, | 372,7, | 372,8, | 372,9, | 372,10, | 372,11, | 372,12, | 372,13, | 372,14, | 372,15, | 372,16, | 372,17, | 372,18, | 372,19, | 372,20, | 372,21, | 372,22, | 372,23, | 372,24, | 372,25, | 372,26, | 372,27, | 372,28, | 372,29, | 372,30, | 372,31, | 372,32, | 372,33, | 372,34, | 372,35, | 372,36, | 372,37, | 372,38, | 372,39, | 372,40, | 372,41, | 372,42, | 372,43, | 372,44, | 372,45, | 372,46, | 372,47, | 372,48, | 372,49, | 372,50, | 372,51, | 372,52, | 372,53, | 372,54, | 372,55, | 372,56, | 372,57, | 372,58, | 372,59, | 372,60, | 372,61, | 372,62, | 372,63, | 372,64, | 372,65, | 372,66, | 372,67, | 372,68, | 372,69, | 372,70, | 372,71, | 372,72, | 372,73, | 372,74, | 372,75, | 372,76, | 372,77, | 372,78, | 372,79, | 372,80, | 372,81, | 372,82, | 372,83, | 372,84, | 372,85, | 373,1, | 373,2, | 373,3, | 373,4, | 373,5, | 373,6, | 373,7, | 373,8, | 373,9, | 373,10, | 373,11, | 373,12, | 373,13, | 373,14, | 373,15, | 373,16, | 373,17, | 373,18, | 373,19, | 373,20, | 373,21, | 373,22, | 373,23, | 373,24, | 373,25, | 373,26, | 373,27, | 373,28, | 373,29, | 373,30, | 373,31, | 373,32, | 373,33, | 373,34, | 373,35, | 373,36, | 373,37, | 373,38, | 373,39, | 373,40, | 373,41, | 373,42, | 373,43, | 373,44, | 373,45, | 373,46, | 373,47, | 373,48, | 373,49, | 373,50, | 373,51, | 373,52, | 373,53, | 373,54, | 373,55, | 373,56, | 373,57, | 373,58, | 373,59, | 373,60, | 373,61, | 373,62, | 373,63, | 373,64, | 373,65, | 373,66, | 373,67, | 373,68, | 373,69, | 373,70, | 373,71, | 373,72, | 373,73, | 373,74, | 373,75, | 373,76, | 373,77, | 373,78, | 373,79, | 373,80, | 373,81, | 373,82, | 373,83, | 373,84, | 373,85, | 374,1, | 374,2, | 374,3, | 374,4, | 374,5, | 374,6, | 374,7, | 374,8, | 374,9, | 374,10, | 374,11, | 374,12, | 374,13, | 374,14, | 374,15, | 374,16, | 374,17, | 374,18, | 374,19, | 374,20, | 374,21, | 374,22, | 374,23, | 374,24, | 374,25, | 374,26, | 374,27, | 374,28, | 374,29, | 374,30, | 374,31, | 374,32, | 374,33, | 374,34, | 374,35, | 374,36, | 374,37, | 374,38, | 374,39, | 374,40, | 374,41, | 374,42, | 374,43, | 374,44, | 374,45, | 374,46, | 374,47, | 374,48, | 374,49, | 374,50, | 374,51, | 374,52, | 374,53, | 374,54, | 374,55, | 374,56, | 374,57, | 374,58, | 374,59, | 374,60, | 374,61, | 374,62, | 374,63, | 374,64, | 374,65, | 374,66, | 374,67, | 374,68, | 374,69, | 374,70, | 374,71, | 374,72, | 374,73, | 374,74, | 374,75, | 374,76, | 374,77, | 374,78, | 374,79, | 374,80, | 374,81, | 374,82, | 374,83, | 374,84, | 374,85, | 375,1, | 375,2, | 375,3, | 375,4, | 375,5, | 375,6, | 375,7, | 375,8, | 375,9, | 375,10, | 375,11, | 375,12, | 375,13, | 375,14, | 375,15, | 375,16, | 375,17, | 375,18, | 375,19, | 375,20, | 375,21, | 375,22, | 375,23, | 375,24, | 375,25, | 375,26, | 375,27, | 375,28, | 375,29, | 375,30, | 375,31, | 375,32, | 375,33, | 375,34, | 375,35, | 375,36, | 375,37, | 375,38, | 375,39, | 375,40, | 375,41, | 375,42, | 375,43, | 375,44, | 375,45, | 375,46, | 375,47, | 375,48, | 375,49, | 375,50, | 375,51, | 375,52, | 375,53, | 375,54, | 375,55, | 375,56, | 375,57, | 375,58, | 375,59, | 375,60, | 375,61, | 375,62, | 375,63, | 375,64, | 375,65, | 375,66, | 375,67, | 375,68, | 375,69, | 375,70, | 375,71, | 375,72, | 375,73, | 375,74, | 375,75, | 375,76, | 375,77, | 375,78, | 375,79, | 375,80, | 375,81, | 375,82, | 375,83, | 375,84, | 375,85, | 376,1, | 376,2, | 376,3, | 376,4, | 376,5, | 376,6, | 376,7, | 376,8, | 376,9, | 376,10, | 376,11, | 376,12, | 376,13, | 376,14, | 376,15, | 376,16, | 376,17, | 376,18, | 376,19, | 376,20, | 376,21, | 376,22, | 376,23, | 376,24, | 376,25, | 376,26, | 376,27, | 376,28, | 376,29, | 376,30, | 376,31, | 376,32, | 376,33, | 376,34, | 376,35, | 376,36, | 376,37, | 376,38, | 376,39, | 376,40, | 376,41, | 376,42, | 376,43, | 376,44, | 376,45, | 376,46, | 376,47, | 376,48, | 376,49, | 376,50, | 376,51, | 376,52, | 376,53, | 376,54, | 376,55, | 376,56, | 376,57, | 376,58, | 376,59, | 376,60, | 376,61, | 376,62, | 376,63, | 376,64, | 376,65, | 376,66, | 376,67, | 376,68, | 376,69, | 376,70, | 376,71, | 376,72, | 376,73, | 376,74, | 376,75, | 376,76, | 376,77, | 376,78, | 376,79, | 376,80, | 376,81, | 376,82, | 376,83, | 376,84, | 376,85, | 377,1, | 377,2, | 377,3, | 377,4, | 377,5, | 377,6, | 377,7, | 377,8, | 377,9, | 377,10, | 377,11, | 377,12, | 377,13, | 377,14, | 377,15, | 377,16, | 377,17, | 377,18, | 377,19, | 377,20, | 377,21, | 377,22, | 377,23, | 377,24, | 377,25, | 377,26, | 377,27, | 377,28, | 377,29, | 377,30, | 377,31, | 377,32, | 377,33, | 377,34, | 377,35, | 377,36, | 377,37, | 377,38, | 377,39, | 377,40, | 377,41, | 377,42, | 377,43, | 377,44, | 377,45, | 377,46, | 377,47, | 377,48, | 377,49, | 377,50, | 377,51, | 377,52, | 377,53, | 377,54, | 377,55, | 377,56, | 377,57, | 377,58, | 377,59, | 377,60, | 377,61, | 377,62, | 377,63, | 377,64, | 377,65, | 377,66, | 377,67, | 377,68, | 377,69, | 377,70, | 377,71, | 377,72, | 377,73, | 377,74, | 377,75, | 377,76, | 377,77, | 377,78, | 377,79, | 377,80, | 377,81, | 377,82, | 377,83, | 377,84, | 377,85, | 378,1, | 378,2, | 378,3, | 378,4, | 378,5, | 378,6, | 378,7, | 378,8, | 378,9, | 378,10, | 378,11, | 378,12, | 378,13, | 378,14, | 378,15, | 378,16, | 378,17, | 378,18, | 378,19, | 378,20, | 378,21, | 378,22, | 378,23, | 378,24, | 378,25, | 378,26, | 378,27, | 378,28, | 378,29, | 378,30, | 378,31, | 378,32, | 378,33, | 378,34, | 378,35, | 378,36, | 378,37, | 378,38, | 378,39, | 378,40, | 378,41, | 378,42, | 378,43, | 378,44, | 378,45, | 378,46, | 378,47, | 378,48, | 378,49, | 378,50, | 378,51, | 378,52, | 378,53, | 378,54, | 378,55, | 378,56, | 378,57, | 378,58, | 378,59, | 378,60, | 378,61, | 378,62, | 378,63, | 378,64, | 378,65, | 378,66, | 378,67, | 378,68, | 378,69, | 378,70, | 378,71, | 378,72, | 378,73, | 378,74, | 378,75, | 378,76, | 378,77, | 378,78, | 378,79, | 378,80, | 378,81, | 378,82, | 378,83, | 378,84, | 378,85, | 379,1, | 379,2, | 379,3, | 379,4, | 379,5, | 379,6, | 379,7, | 379,8, | 379,9, | 379,10, | 379,11, | 379,12, | 379,13, | 379,14, | 379,15, | 379,16, | 379,17, | 379,18, | 379,19, | 379,20, | 379,21, | 379,22, | 379,23, | 379,24, | 379,25, | 379,26, | 379,27, | 379,28, | 379,29, | 379,30, | 379,31, | 379,32, | 379,33, | 379,34, | 379,35, | 379,36, | 379,37, | 379,38, | 379,39, | 379,40, | 379,41, | 379,42, | 379,43, | 379,44, | 379,45, | 379,46, | 379,47, | 379,48, | 379,49, | 379,50, | 379,51, | 379,52, | 379,53, | 379,54, | 379,55, | 379,56, | 379,57, | 379,58, | 379,59, | 379,60, | 379,61, | 379,62, | 379,63, | 379,64, | 379,65, | 379,66, | 379,67, | 379,68, | 379,69, | 379,70, | 379,71, | 379,72, | 379,73, | 379,74, | 379,75, | 379,76, | 379,77, | 379,78, | 379,79, | 379,80, | 379,81, | 379,82, | 379,83, | 379,84, | 379,85, | 380,1, | 380,2, | 380,3, | 380,4, | 380,5, | 380,6, | 380,7, | 380,8, | 380,9, | 380,10, | 380,11, | 380,12, | 380,13, | 380,14, | 380,15, | 380,16, | 380,17, | 380,18, | 380,19, | 380,20, | 380,21, | 380,22, | 380,23, | 380,24, | 380,25, | 380,26, | 380,27, | 380,28, | 380,29, | 380,30, | 380,31, | 380,32, | 380,33, | 380,34, | 380,35, | 380,36, | 380,37, | 380,38, | 380,39, | 380,40, | 380,41, | 380,42, | 380,43, | 380,44, | 380,45, | 380,46, | 380,47, | 380,48, | 380,49, | 380,50, | 380,51, | 380,52, | 380,53, | 380,54, | 380,55, | 380,56, | 380,57, | 380,58, | 380,59, | 380,60, | 380,61, | 380,62, | 380,63, | 380,64, | 380,65, | 380,66, | 380,67, | 380,68, | 380,69, | 380,70, | 380,71, | 380,72, | 380,73, | 380,74, | 380,75, | 380,76, | 380,77, | 380,78, | 380,79, | 380,80, | 380,81, | 380,82, | 380,83, | 380,84, | 380,85, | 381,1, | 381,2, | 381,3, | 381,4, | 381,5, | 381,6, | 381,7, | 381,8, | 381,9, | 381,10, | 381,11, | 381,12, | 381,13, | 381,14, | 381,15, | 381,16, | 381,17, | 381,18, | 381,19, | 381,20, | 381,21, | 381,22, | 381,23, | 381,24, | 381,25, | 381,26, | 381,27, | 381,28, | 381,29, | 381,30, | 381,31, | 381,32, | 381,33, | 381,34, | 381,35, | 381,36, | 381,37, | 381,38, | 381,39, | 381,40, | 381,41, | 381,42, | 381,43, | 381,44, | 381,45, | 381,46, | 381,47, | 381,48, | 381,49, | 381,50, | 381,51, | 381,52, | 381,53, | 381,54, | 381,55, | 381,56, | 381,57, | 381,58, | 381,59, | 381,60, | 381,61, | 381,62, | 381,63, | 381,64, | 381,65, | 381,66, | 381,67, | 381,68, | 381,69, | 381,70, | 381,71, | 381,72, | 381,73, | 381,74, | 381,75, | 381,76, | 381,77, | 381,78, | 381,79, | 381,80, | 381,81, | 381,82, | 381,83, | 381,84, | 381,85, | 382,1, | 382,2, | 382,3, | 382,4, | 382,5, | 382,6, | 382,7, | 382,8, | 382,9, | 382,10, | 382,11, | 382,12, | 382,13, | 382,14, | 382,15, | 382,16, | 382,17, | 382,18, | 382,19, | 382,20, | 382,21, | 382,22, | 382,23, | 382,24, | 382,25, | 382,26, | 382,27, | 382,28, | 382,29, | 382,30, | 382,31, | 382,32, | 382,33, | 382,34, | 382,35, | 382,36, | 382,37, | 382,38, | 382,39, | 382,40, | 382,41, | 382,42, | 382,43, | 382,44, | 382,45, | 382,46, | 382,47, | 382,48, | 382,49, | 382,50, | 382,51, | 382,52, | 382,53, | 382,54, | 382,55, | 382,56, | 382,57, | 382,58, | 382,59, | 382,60, | 382,61, | 382,62, | 382,63, | 382,64, | 382,65, | 382,66, | 382,67, | 382,68, | 382,69, | 382,70, | 382,71, | 382,72, | 382,73, | 382,74, | 382,75, | 382,76, | 382,77, | 382,78, | 382,79, | 382,80, | 382,81, | 382,82, | 382,83, | 382,84, | 382,85, | 383,1, | 383,2, | 383,3, | 383,4, | 383,5, | 383,6, | 383,7, | 383,8, | 383,9, | 383,10, | 383,11, | 383,12, | 383,13, | 383,14, | 383,15, | 383,16, | 383,17, | 383,18, | 383,19, | 383,20, | 383,21, | 383,22, | 383,23, | 383,24, | 383,25, | 383,26, | 383,27, | 383,28, | 383,29, | 383,30, | 383,31, | 383,32, | 383,33, | 383,34, | 383,35, | 383,36, | 383,37, | 383,38, | 383,39, | 383,40, | 383,41, | 383,42, | 383,43, | 383,44, | 383,45, | 383,46, | 383,47, | 383,48, | 383,49, | 383,50, | 383,51, | 383,52, | 383,53, | 383,54, | 383,55, | 383,56, | 383,57, | 383,58, | 383,59, | 383,60, | 383,61, | 383,62, | 383,63, | 383,64, | 383,65, | 383,66, | 383,67, | 383,68, | 383,69, | 383,70, | 383,71, | 383,72, | 383,73, | 383,74, | 383,75, | 383,76, | 383,77, | 383,78, | 383,79, | 383,80, | 383,81, | 383,82, | 383,83, | 383,84, | 383,85, | 384,1, | 384,2, | 384,3, | 384,4, | 384,5, | 384,6, | 384,7, | 384,8, | 384,9, | 384,10, | 384,11, | 384,12, | 384,13, | 384,14, | 384,15, | 384,16, | 384,17, | 384,18, | 384,19, | 384,20, | 384,21, | 384,22, | 384,23, | 384,24, | 384,25, | 384,26, | 384,27, | 384,28, | 384,29, | 384,30, | 384,31, | 384,32, | 384,33, | 384,34, | 384,35, | 384,36, | 384,37, | 384,38, | 384,39, | 384,40, | 384,41, | 384,42, | 384,43, | 384,44, | 384,45, | 384,46, | 384,47, | 384,48, | 384,49, | 384,50, | 384,51, | 384,52, | 384,53, | 384,54, | 384,55, | 384,56, | 384,57, | 384,58, | 384,59, | 384,60, | 384,61, | 384,62, | 384,63, | 384,64, | 384,65, | 384,66, | 384,67, | 384,68, | 384,69, | 384,70, | 384,71, | 384,72, | 384,73, | 384,74, | 384,75, | 384,76, | 384,77, | 384,78, | 384,79, | 384,80, | 384,81, | 384,82, | 384,83, | 384,84, | 384,85, | 385,1, | 385,2, | 385,3, | 385,4, | 385,5, | 385,6, | 385,7, | 385,8, | 385,9, | 385,10, | 385,11, | 385,12, | 385,13, | 385,14, | 385,15, | 385,16, | 385,17, | 385,18, | 385,19, | 385,20, | 385,21, | 385,22, | 385,23, | 385,24, | 385,25, | 385,26, | 385,27, | 385,28, | 385,29, | 385,30, | 385,31, | 385,32, | 385,33, | 385,34, | 385,35, | 385,36, | 385,37, | 385,38, | 385,39, | 385,40, | 385,41, | 385,42, | 385,43, | 385,44, | 385,45, | 385,46, | 385,47, | 385,48, | 385,49, | 385,50, | 385,51, | 385,52, | 385,53, | 385,54, | 385,55, | 385,56, | 385,57, | 385,58, | 385,59, | 385,60, | 385,61, | 385,62, | 385,63, | 385,64, | 385,65, | 385,66, | 385,67, | 385,68, | 385,69, | 385,70, | 385,71, | 385,72, | 385,73, | 385,74, | 385,75, | 385,76, | 385,77, | 385,78, | 385,79, | 385,80, | 385,81, | 385,82, | 385,83, | 385,84, | 385,85, | 386,1, | 386,2, | 386,3, | 386,4, | 386,5, | 386,6, | 386,7, | 386,8, | 386,9, | 386,10, | 386,11, | 386,12, | 386,13, | 386,14, | 386,15, | 386,16, | 386,17, | 386,18, | 386,19, | 386,20, | 386,21, | 386,22, | 386,23, | 386,24, | 386,25, | 386,26, | 386,27, | 386,28, | 386,29, | 386,30, | 386,31, | 386,32, | 386,33, | 386,34, | 386,35, | 386,36, | 386,37, | 386,38, | 386,39, | 386,40, | 386,41, | 386,42, | 386,43, | 386,44, | 386,45, | 386,46, | 386,47, | 386,48, | 386,49, | 386,50, | 386,51, | 386,52, | 386,53, | 386,54, | 386,55, | 386,56, | 386,57, | 386,58, | 386,59, | 386,60, | 386,61, | 386,62, | 386,63, | 386,64, | 386,65, | 386,66, | 386,67, | 386,68, | 386,69, | 386,70, | 386,71, | 386,72, | 386,73, | 386,74, | 386,75, | 386,76, | 386,77, | 386,78, | 386,79, | 386,80, | 386,81, | 386,82, | 386,83, | 386,84, | 386,85, | 387,1, | 387,2, | 387,3, | 387,4, | 387,5, | 387,6, | 387,7, | 387,8, | 387,9, | 387,10, | 387,11, | 387,12, | 387,13, | 387,14, | 387,15, | 387,16, | 387,17, | 387,18, | 387,19, | 387,20, | 387,21, | 387,22, | 387,23, | 387,24, | 387,25, | 387,26, | 387,27, | 387,28, | 387,29, | 387,30, | 387,31, | 387,32, | 387,33, | 387,34, | 387,35, | 387,36, | 387,37, | 387,38, | 387,39, | 387,40, | 387,41, | 387,42, | 387,43, | 387,44, | 387,45, | 387,46, | 387,47, | 387,48, | 387,49, | 387,50, | 387,51, | 387,52, | 387,53, | 387,54, | 387,55, | 387,56, | 387,57, | 387,58, | 387,59, | 387,60, | 387,61, | 387,62, | 387,63, | 387,64, | 387,65, | 387,66, | 387,67, | 387,68, | 387,69, | 387,70, | 387,71, | 387,72, | 387,73, | 387,74, | 387,75, | 387,76, | 387,77, | 387,78, | 387,79, | 387,80, | 387,81, | 387,82, | 387,83, | 387,84, | 387,85, | 388,1, | 388,2, | 388,3, | 388,4, | 388,5, | 388,6, | 388,7, | 388,8, | 388,9, | 388,10, | 388,11, | 388,12, | 388,13, | 388,14, | 388,15, | 388,16, | 388,17, | 388,18, | 388,19, | 388,20, | 388,21, | 388,22, | 388,23, | 388,24, | 388,25, | 388,26, | 388,27, | 388,28, | 388,29, | 388,30, | 388,31, | 388,32, | 388,33, | 388,34, | 388,35, | 388,36, | 388,37, | 388,38, | 388,39, | 388,40, | 388,41, | 388,42, | 388,43, | 388,44, | 388,45, | 388,46, | 388,47, | 388,48, | 388,49, | 388,50, | 388,51, | 388,52, | 388,53, | 388,54, | 388,55, | 388,56, | 388,57, | 388,58, | 388,59, | 388,60, | 388,61, | 388,62, | 388,63, | 388,64, | 388,65, | 388,66, | 388,67, | 388,68, | 388,69, | 388,70, | 388,71, | 388,72, | 388,73, | 388,74, | 388,75, | 388,76, | 388,77, | 388,78, | 388,79, | 388,80, | 388,81, | 388,82, | 388,83, | 388,84, | 388,85, | 389,1, | 389,2, | 389,3, | 389,4, | 389,5, | 389,6, | 389,7, | 389,8, | 389,9, | 389,10, | 389,11, | 389,12, | 389,13, | 389,14, | 389,15, | 389,16, | 389,17, | 389,18, | 389,19, | 389,20, | 389,21, | 389,22, | 389,23, | 389,24, | 389,25, | 389,26, | 389,27, | 389,28, | 389,29, | 389,30, | 389,31, | 389,32, | 389,33, | 389,34, | 389,35, | 389,36, | 389,37, | 389,38, | 389,39, | 389,40, | 389,41, | 389,42, | 389,43, | 389,44, | 389,45, | 389,46, | 389,47, | 389,48, | 389,49, | 389,50, | 389,51, | 389,52, | 389,53, | 389,54, | 389,55, | 389,56, | 389,57, | 389,58, | 389,59, | 389,60, | 389,61, | 389,62, | 389,63, | 389,64, | 389,65, | 389,66, | 389,67, | 389,68, | 389,69, | 389,70, | 389,71, | 389,72, | 389,73, | 389,74, | 389,75, | 389,76, | 389,77, | 389,78, | 389,79, | 389,80, | 389,81, | 389,82, | 389,83, | 389,84, | 389,85, | 390,1, | 390,2, | 390,3, | 390,4, | 390,5, | 390,6, | 390,7, | 390,8, | 390,9, | 390,10, | 390,11, | 390,12, | 390,13, | 390,14, | 390,15, | 390,16, | 390,17, | 390,18, | 390,19, | 390,20, | 390,21, | 390,22, | 390,23, | 390,24, | 390,25, | 390,26, | 390,27, | 390,28, | 390,29, | 390,30, | 390,31, | 390,32, | 390,33, | 390,34, | 390,35, | 390,36, | 390,37, | 390,38, | 390,39, | 390,40, | 390,41, | 390,42, | 390,43, | 390,44, | 390,45, | 390,46, | 390,47, | 390,48, | 390,49, | 390,50, | 390,51, | 390,52, | 390,53, | 390,54, | 390,55, | 390,56, | 390,57, | 390,58, | 390,59, | 390,60, | 390,61, | 390,62, | 390,63, | 390,64, | 390,65, | 390,66, | 390,67, | 390,68, | 390,69, | 390,70, | 390,71, | 390,72, | 390,73, | 390,74, | 390,75, | 390,76, | 390,77, | 390,78, | 390,79, | 390,80, | 390,81, | 390,82, | 390,83, | 390,84, | 390,85, | 391,1, | 391,2, | 391,3, | 391,4, | 391,5, | 391,6, | 391,7, | 391,8, | 391,9, | 391,10, | 391,11, | 391,12, | 391,13, | 391,14, | 391,15, | 391,16, | 391,17, | 391,18, | 391,19, | 391,20, | 391,21, | 391,22, | 391,23, | 391,24, | 391,25, | 391,26, | 391,27, | 391,28, | 391,29, | 391,30, | 391,31, | 391,32, | 391,33, | 391,34, | 391,35, | 391,36, | 391,37, | 391,38, | 391,39, | 391,40, | 391,41, | 391,42, | 391,43, | 391,44, | 391,45, | 391,46, | 391,47, | 391,48, | 391,49, | 391,50, | 391,51, | 391,52, | 391,53, | 391,54, | 391,55, | 391,56, | 391,57, | 391,58, | 391,59, | 391,60, | 391,61, | 391,62, | 391,63, | 391,64, | 391,65, | 391,66, | 391,67, | 391,68, | 391,69, | 391,70, | 391,71, | 391,72, | 391,73, | 391,74, | 391,75, | 391,76, | 391,77, | 391,78, | 391,79, | 391,80, | 391,81, | 391,82, | 391,83, | 391,84, | 391,85, | 392,1, | 392,2, | 392,3, | 392,4, | 392,5, | 392,6, | 392,7, | 392,8, | 392,9, | 392,10, | 392,11, | 392,12, | 392,13, | 392,14, | 392,15, | 392,16, | 392,17, | 392,18, | 392,19, | 392,20, | 392,21, | 392,22, | 392,23, | 392,24, | 392,25, | 392,26, | 392,27, | 392,28, | 392,29, | 392,30, | 392,31, | 392,32, | 392,33, | 392,34, | 392,35, | 392,36, | 392,37, | 392,38, | 392,39, | 392,40, | 392,41, | 392,42, | 392,43, | 392,44, | 392,45, | 392,46, | 392,47, | 392,48, | 392,49, | 392,50, | 392,51, | 392,52, | 392,53, | 392,54, | 392,55, | 392,56, | 392,57, | 392,58, | 392,59, | 392,60, | 392,61, | 392,62, | 392,63, | 392,64, | 392,65, | 392,66, | 392,67, | 392,68, | 392,69, | 392,70, | 392,71, | 392,72, | 392,73, | 392,74, | 392,75, | 392,76, | 392,77, | 392,78, | 392,79, | 392,80, | 392,81, | 392,82, | 392,83, | 392,84, | 392,85, | 393,1, | 393,2, | 393,3, | 393,4, | 393,5, | 393,6, | 393,7, | 393,8, | 393,9, | 393,10, | 393,11, | 393,12, | 393,13, | 393,14, | 393,15, | 393,16, | 393,17, | 393,18, | 393,19, | 393,20, | 393,21, | 393,22, | 393,23, | 393,24, | 393,25, | 393,26, | 393,27, | 393,28, | 393,29, | 393,30, | 393,31, | 393,32, | 393,33, | 393,34, | 393,35, | 393,36, | 393,37, | 393,38, | 393,39, | 393,40, | 393,41, | 393,42, | 393,43, | 393,44, | 393,45, | 393,46, | 393,47, | 393,48, | 393,49, | 393,50, | 393,51, | 393,52, | 393,53, | 393,54, | 393,55, | 393,56, | 393,57, | 393,58, | 393,59, | 393,60, | 393,61, | 393,62, | 393,63, | 393,64, | 393,65, | 393,66, | 393,67, | 393,68, | 393,69, | 393,70, | 393,71, | 393,72, | 393,73, | 393,74, | 393,75, | 393,76, | 393,77, | 393,78, | 393,79, | 393,80, | 393,81, | 393,82, | 393,83, | 393,84, | 393,85, | 394,1, | 394,2, | 394,3, | 394,4, | 394,5, | 394,6, | 394,7, | 394,8, | 394,9, | 394,10, | 394,11, | 394,12, | 394,13, | 394,14, | 394,15, | 394,16, | 394,17, | 394,18, | 394,19, | 394,20, | 394,21, | 394,22, | 394,23, | 394,24, | 394,25, | 394,26, | 394,27, | 394,28, | 394,29, | 394,30, | 394,31, | 394,32, | 394,33, | 394,34, | 394,35, | 394,36, | 394,37, | 394,38, | 394,39, | 394,40, | 394,41, | 394,42, | 394,43, | 394,44, | 394,45, | 394,46, | 394,47, | 394,48, | 394,49, | 394,50, | 394,51, | 394,52, | 394,53, | 394,54, | 394,55, | 394,56, | 394,57, | 394,58, | 394,59, | 394,60, | 394,61, | 394,62, | 394,63, | 394,64, | 394,65, | 394,66, | 394,67, | 394,68, | 394,69, | 394,70, | 394,71, | 394,72, | 394,73, | 394,74, | 394,75, | 394,76, | 394,77, | 394,78, | 394,79, | 394,80, | 394,81, | 394,82, | 394,83, | 394,84, | 394,85, | 395,1, | 395,2, | 395,3, | 395,4, | 395,5, | 395,6, | 395,7, | 395,8, | 395,9, | 395,10, | 395,11, | 395,12, | 395,13, | 395,14, | 395,15, | 395,16, | 395,17, | 395,18, | 395,19, | 395,20, | 395,21, | 395,22, | 395,23, | 395,24, | 395,25, | 395,26, | 395,27, | 395,28, | 395,29, | 395,30, | 395,31, | 395,32, | 395,33, | 395,34, | 395,35, | 395,36, | 395,37, | 395,38, | 395,39, | 395,40, | 395,41, | 395,42, | 395,43, | 395,44, | 395,45, | 395,46, | 395,47, | 395,48, | 395,49, | 395,50, | 395,51, | 395,52, | 395,53, | 395,54, | 395,55, | 395,56, | 395,57, | 395,58, | 395,59, | 395,60, | 395,61, | 395,62, | 395,63, | 395,64, | 395,65, | 395,66, | 395,67, | 395,68, | 395,69, | 395,70, | 395,71, | 395,72, | 395,73, | 395,74, | 395,75, | 395,76, | 395,77, | 395,78, | 395,79, | 395,80, | 395,81, | 395,82, | 395,83, | 395,84, | 395,85, | 396,1, | 396,2, | 396,3, | 396,4, | 396,5, | 396,6, | 396,7, | 396,8, | 396,9, | 396,10, | 396,11, | 396,12, | 396,13, | 396,14, | 396,15, | 396,16, | 396,17, | 396,18, | 396,19, | 396,20, | 396,21, | 396,22, | 396,23, | 396,24, | 396,25, | 396,26, | 396,27, | 396,28, | 396,29, | 396,30, | 396,31, | 396,32, | 396,33, | 396,34, | 396,35, | 396,36, | 396,37, | 396,38, | 396,39, | 396,40, | 396,41, | 396,42, | 396,43, | 396,44, | 396,45, | 396,46, | 396,47, | 396,48, | 396,49, | 396,50, | 396,51, | 396,52, | 396,53, | 396,54, | 396,55, | 396,56, | 396,57, | 396,58, | 396,59, | 396,60, | 396,61, | 396,62, | 396,63, | 396,64, | 396,65, | 396,66, | 396,67, | 396,68, | 396,69, | 396,70, | 396,71, | 396,72, | 396,73, | 396,74, | 396,75, | 396,76, | 396,77, | 396,78, | 396,79, | 396,80, | 396,81, | 396,82, | 396,83, | 396,84, | 396,85, | 397,1, | 397,2, | 397,3, | 397,4, | 397,5, | 397,6, | 397,7, | 397,8, | 397,9, | 397,10, | 397,11, | 397,12, | 397,13, | 397,14, | 397,15, | 397,16, | 397,17, | 397,18, | 397,19, | 397,20, | 397,21, | 397,22, | 397,23, | 397,24, | 397,25, | 397,26, | 397,27, | 397,28, | 397,29, | 397,30, | 397,31, | 397,32, | 397,33, | 397,34, | 397,35, | 397,36, | 397,37, | 397,38, | 397,39, | 397,40, | 397,41, | 397,42, | 397,43, | 397,44, | 397,45, | 397,46, | 397,47, | 397,48, | 397,49, | 397,50, | 397,51, | 397,52, | 397,53, | 397,54, | 397,55, | 397,56, | 397,57, | 397,58, | 397,59, | 397,60, | 397,61, | 397,62, | 397,63, | 397,64, | 397,65, | 397,66, | 397,67, | 397,68, | 397,69, | 397,70, | 397,71, | 397,72, | 397,73, | 397,74, | 397,75, | 397,76, | 397,77, | 397,78, | 397,79, | 397,80, | 397,81, | 397,82, | 397,83, | 397,84, | 397,85, | 398,1, | 398,2, | 398,3, | 398,4, | 398,5, | 398,6, | 398,7, | 398,8, | 398,9, | 398,10, | 398,11, | 398,12, | 398,13, | 398,14, | 398,15, | 398,16, | 398,17, | 398,18, | 398,19, | 398,20, | 398,21, | 398,22, | 398,23, | 398,24, | 398,25, | 398,26, | 398,27, | 398,28, | 398,29, | 398,30, | 398,31, | 398,32, | 398,33, | 398,34, | 398,35, | 398,36, | 398,37, | 398,38, | 398,39, | 398,40, | 398,41, | 398,42, | 398,43, | 398,44, | 398,45, | 398,46, | 398,47, | 398,48, | 398,49, | 398,50, | 398,51, | 398,52, | 398,53, | 398,54, | 398,55, | 398,56, | 398,57, | 398,58, | 398,59, | 398,60, | 398,61, | 398,62, | 398,63, | 398,64, | 398,65, | 398,66, | 398,67, | 398,68, | 398,69, | 398,70, | 398,71, | 398,72, | 398,73, | 398,74, | 398,75, | 398,76, | 398,77, | 398,78, | 398,79, | 398,80, | 398,81, | 398,82, | 398,83, | 398,84, | 398,85, | 399,1, | 399,2, | 399,3, | 399,4, | 399,5, | 399,6, | 399,7, | 399,8, | 399,9, | 399,10, | 399,11, | 399,12, | 399,13, | 399,14, | 399,15, | 399,16, | 399,17, | 399,18, | 399,19, | 399,20, | 399,21, | 399,22, | 399,23, | 399,24, | 399,25, | 399,26, | 399,27, | 399,28, | 399,29, | 399,30, | 399,31, | 399,32, | 399,33, | 399,34, | 399,35, | 399,36, | 399,37, | 399,38, | 399,39, | 399,40, | 399,41, | 399,42, | 399,43, | 399,44, | 399,45, | 399,46, | 399,47, | 399,48, | 399,49, | 399,50, | 399,51, | 399,52, | 399,53, | 399,54, | 399,55, | 399,56, | 399,57, | 399,58, | 399,59, | 399,60, | 399,61, | 399,62, | 399,63, | 399,64, | 399,65, | 399,66, | 399,67, | 399,68, | 399,69, | 399,70, | 399,71, | 399,72, | 399,73, | 399,74, | 399,75, | 399,76, | 399,77, | 399,78, | 399,79, | 399,80, | 399,81, | 399,82, | 399,83, | 399,84, | 399,85, | 400,1, | 400,2, | 400,3, | 400,4, | 400,5, | 400,6, | 400,7, | 400,8, | 400,9, | 400,10, | 400,11, | 400,12, | 400,13, | 400,14, | 400,15, | 400,16, | 400,17, | 400,18, | 400,19, | 400,20, | 400,21, | 400,22, | 400,23, | 400,24, | 400,25, | 400,26, | 400,27, | 400,28, | 400,29, | 400,30, | 400,31, | 400,32, | 400,33, | 400,34, | 400,35, | 400,36, | 400,37, | 400,38, | 400,39, | 400,40, | 400,41, | 400,42, | 400,43, | 400,44, | 400,45, | 400,46, | 400,47, | 400,48, | 400,49, | 400,50, | 400,51, | 400,52, | 400,53, | 400,54, | 400,55, | 400,56, | 400,57, | 400,58, | 400,59, | 400,60, | 400,61, | 400,62, | 400,63, | 400,64, | 400,65, | 400,66, | 400,67, | 400,68, | 400,69, | 400,70, | 400,71, | 400,72, | 400,73, | 400,74, | 400,75, | 400,76, | 400,77, | 400,78, | 400,79, | 400,80, | 400,81, | 400,82, | 400,83, | 400,84, | 400,85, | 401,1, | 401,2, | 401,3, | 401,4, | 401,5, | 401,6, | 401,7, | 401,8, | 401,9, | 401,10, | 401,11, | 401,12, | 401,13, | 401,14, | 401,15, | 401,16, | 401,17, | 401,18, | 401,19, | 401,20, | 401,21, | 401,22, | 401,23, | 401,24, | 401,25, | 401,26, | 401,27, | 401,28, | 401,29, | 401,30, | 401,31, | 401,32, | 401,33, | 401,34, | 401,35, | 401,36, | 401,37, | 401,38, | 401,39, | 401,40, | 401,41, | 401,42, | 401,43, | 401,44, | 401,45, | 401,46, | 401,47, | 401,48, | 401,49, | 401,50, | 401,51, | 401,52, | 401,53, | 401,54, | 401,55, | 401,56, | 401,57, | 401,58, | 401,59, | 401,60, | 401,61, | 401,62, | 401,63, | 401,64, | 401,65, | 401,66, | 401,67, | 401,68, | 401,69, | 401,70, | 401,71, | 401,72, | 401,73, | 401,74, | 401,75, | 401,76, | 401,77, | 401,78, | 401,79, | 401,80, | 401,81, | 401,82, | 401,83, | 401,84, | 401,85, | 402,1, | 402,2, | 402,3, | 402,4, | 402,5, | 402,6, | 402,7, | 402,8, | 402,9, | 402,10, | 402,11, | 402,12, | 402,13, | 402,14, | 402,15, | 402,16, | 402,17, | 402,18, | 402,19, | 402,20, | 402,21, | 402,22, | 402,23, | 402,24, | 402,25, | 402,26, | 402,27, | 402,28, | 402,29, | 402,30, | 402,31, | 402,32, | 402,33, | 402,34, | 402,35, | 402,36, | 402,37, | 402,38, | 402,39, | 402,40, | 402,41, | 402,42, | 402,43, | 402,44, | 402,45, | 402,46, | 402,47, | 402,48, | 402,49, | 402,50, | 402,51, | 402,52, | 402,53, | 402,54, | 402,55, | 402,56, | 402,57, | 402,58, | 402,59, | 402,60, | 402,61, | 402,62, | 402,63, | 402,64, | 402,65, | 402,66, | 402,67, | 402,68, | 402,69, | 402,70, | 402,71, | 402,72, | 402,73, | 402,74, | 402,75, | 402,76, | 402,77, | 402,78, | 402,79, | 402,80, | 402,81, | 402,82, | 402,83, | 402,84, | 402,85, | 403,1, | 403,2, | 403,3, | 403,4, | 403,5, | 403,6, | 403,7, | 403,8, | 403,9, | 403,10, | 403,11, | 403,12, | 403,13, | 403,14, | 403,15, | 403,16, | 403,17, | 403,18, | 403,19, | 403,20, | 403,21, | 403,22, | 403,23, | 403,24, | 403,25, | 403,26, | 403,27, | 403,28, | 403,29, | 403,30, | 403,31, | 403,32, | 403,33, | 403,34, | 403,35, | 403,36, | 403,37, | 403,38, | 403,39, | 403,40, | 403,41, | 403,42, | 403,43, | 403,44, | 403,45, | 403,46, | 403,47, | 403,48, | 403,49, | 403,50, | 403,51, | 403,52, | 403,53, | 403,54, | 403,55, | 403,56, | 403,57, | 403,58, | 403,59, | 403,60, | 403,61, | 403,62, | 403,63, | 403,64, | 403,65, | 403,66, | 403,67, | 403,68, | 403,69, | 403,70, | 403,71, | 403,72, | 403,73, | 403,74, | 403,75, | 403,76, | 403,77, | 403,78, | 403,79, | 403,80, | 403,81, | 403,82, | 403,83, | 403,84, | 403,85, | 404,1, | 404,2, | 404,3, | 404,4, | 404,5, | 404,6, | 404,7, | 404,8, | 404,9, | 404,10, | 404,11, | 404,12, | 404,13, | 404,14, | 404,15, | 404,16, | 404,17, | 404,18, | 404,19, | 404,20, | 404,21, | 404,22, | 404,23, | 404,24, | 404,25, | 404,26, | 404,27, | 404,28, | 404,29, | 404,30, | 404,31, | 404,32, | 404,33, | 404,34, | 404,35, | 404,36, | 404,37, | 404,38, | 404,39, | 404,40, | 404,41, | 404,42, | 404,43, | 404,44, | 404,45, | 404,46, | 404,47, | 404,48, | 404,49, | 404,50, | 404,51, | 404,52, | 404,53, | 404,54, | 404,55, | 404,56, | 404,57, | 404,58, | 404,59, | 404,60, | 404,61, | 404,62, | 404,63, | 404,64, | 404,65, | 404,66, | 404,67, | 404,68, | 404,69, | 404,70, | 404,71, | 404,72, | 404,73, | 404,74, | 404,75, | 404,76, | 404,77, | 404,78, | 404,79, | 404,80, | 404,81, | 404,82, | 404,83, | 404,84, | 404,85, | 405,1, | 405,2, | 405,3, | 405,4, | 405,5, | 405,6, | 405,7, | 405,8, | 405,9, | 405,10, | 405,11, | 405,12, | 405,13, | 405,14, | 405,15, | 405,16, | 405,17, | 405,18, | 405,19, | 405,20, | 405,21, | 405,22, | 405,23, | 405,24, | 405,25, | 405,26, | 405,27, | 405,28, | 405,29, | 405,30, | 405,31, | 405,32, | 405,33, | 405,34, | 405,35, | 405,36, | 405,37, | 405,38, | 405,39, | 405,40, | 405,41, | 405,42, | 405,43, | 405,44, | 405,45, | 405,46, | 405,47, | 405,48, | 405,49, | 405,50, | 405,51, | 405,52, | 405,53, | 405,54, | 405,55, | 405,56, | 405,57, | 405,58, | 405,59, | 405,60, | 405,61, | 405,62, | 405,63, | 405,64, | 405,65, | 405,66, | 405,67, | 405,68, | 405,69, | 405,70, | 405,71, | 405,72, | 405,73, | 405,74, | 405,75, | 405,76, | 405,77, | 405,78, | 405,79, | 405,80, | 405,81, | 405,82, | 405,83, | 405,84, | 405,85, | 406,1, | 406,2, | 406,3, | 406,4, | 406,5, | 406,6, | 406,7, | 406,8, | 406,9, | 406,10, | 406,11, | 406,12, | 406,13, | 406,14, | 406,15, | 406,16, | 406,17, | 406,18, | 406,19, | 406,20, | 406,21, | 406,22, | 406,23, | 406,24, | 406,25, | 406,26, | 406,27, | 406,28, | 406,29, | 406,30, | 406,31, | 406,32, | 406,33, | 406,34, | 406,35, | 406,36, | 406,37, | 406,38, | 406,39, | 406,40, | 406,41, | 406,42, | 406,43, | 406,44, | 406,45, | 406,46, | 406,47, | 406,48, | 406,49, | 406,50, | 406,51, | 406,52, | 406,53, | 406,54, | 406,55, | 406,56, | 406,57, | 406,58, | 406,59, | 406,60, | 406,61, | 406,62, | 406,63, | 406,64, | 406,65, | 406,66, | 406,67, | 406,68, | 406,69, | 406,70, | 406,71, | 406,72, | 406,73, | 406,74, | 406,75, | 406,76, | 406,77, | 406,78, | 406,79, | 406,80, | 406,81, | 406,82, | 406,83, | 406,84, | 406,85, | 407,1, | 407,2, | 407,3, | 407,4, | 407,5, | 407,6, | 407,7, | 407,8, | 407,9, | 407,10, | 407,11, | 407,12, | 407,13, | 407,14, | 407,15, | 407,16, | 407,17, | 407,18, | 407,19, | 407,20, | 407,21, | 407,22, | 407,23, | 407,24, | 407,25, | 407,26, | 407,27, | 407,28, | 407,29, | 407,30, | 407,31, | 407,32, | 407,33, | 407,34, | 407,35, | 407,36, | 407,37, | 407,38, | 407,39, | 407,40, | 407,41, | 407,42, | 407,43, | 407,44, | 407,45, | 407,46, | 407,47, | 407,48, | 407,49, | 407,50, | 407,51, | 407,52, | 407,53, | 407,54, | 407,55, | 407,56, | 407,57, | 407,58, | 407,59, | 407,60, | 407,61, | 407,62, | 407,63, | 407,64, | 407,65, | 407,66, | 407,67, | 407,68, | 407,69, | 407,70, | 407,71, | 407,72, | 407,73, | 407,74, | 407,75, | 407,76, | 407,77, | 407,78, | 407,79, | 407,80, | 407,81, | 407,82, | 407,83, | 407,84, | 407,85, | 408,1, | 408,2, | 408,3, | 408,4, | 408,5, | 408,6, | 408,7, | 408,8, | 408,9, | 408,10, | 408,11, | 408,12, | 408,13, | 408,14, | 408,15, | 408,16, | 408,17, | 408,18, | 408,19, | 408,20, | 408,21, | 408,22, | 408,23, | 408,24, | 408,25, | 408,26, | 408,27, | 408,28, | 408,29, | 408,30, | 408,31, | 408,32, | 408,33, | 408,34, | 408,35, | 408,36, | 408,37, | 408,38, | 408,39, | 408,40, | 408,41, | 408,42, | 408,43, | 408,44, | 408,45, | 408,46, | 408,47, | 408,48, | 408,49, | 408,50, | 408,51, | 408,52, | 408,53, | 408,54, | 408,55, | 408,56, | 408,57, | 408,58, | 408,59, | 408,60, | 408,61, | 408,62, | 408,63, | 408,64, | 408,65, | 408,66, | 408,67, | 408,68, | 408,69, | 408,70, | 408,71, | 408,72, | 408,73, | 408,74, | 408,75, | 408,76, | 408,77, | 408,78, | 408,79, | 408,80, | 408,81, | 408,82, | 408,83, | 408,84, | 408,85, | 409,1, | 409,2, | 409,3, | 409,4, | 409,5, | 409,6, | 409,7, | 409,8, | 409,9, | 409,10, | 409,11, | 409,12, | 409,13, | 409,14, | 409,15, | 409,16, | 409,17, | 409,18, | 409,19, | 409,20, | 409,21, | 409,22, | 409,23, | 409,24, | 409,25, | 409,26, | 409,27, | 409,28, | 409,29, | 409,30, | 409,31, | 409,32, | 409,33, | 409,34, | 409,35, | 409,36, | 409,37, | 409,38, | 409,39, | 409,40, | 409,41, | 409,42, | 409,43, | 409,44, | 409,45, | 409,46, | 409,47, | 409,48, | 409,49, | 409,50, | 409,51, | 409,52, | 409,53, | 409,54, | 409,55, | 409,56, | 409,57, | 409,58, | 409,59, | 409,60, | 409,61, | 409,62, | 409,63, | 409,64, | 409,65, | 409,66, | 409,67, | 409,68, | 409,69, | 409,70, | 409,71, | 409,72, | 409,73, | 409,74, | 409,75, | 409,76, | 409,77, | 409,78, | 409,79, | 409,80, | 409,81, | 409,82, | 409,83, | 409,84, | 409,85, | 410,1, | 410,2, | 410,3, | 410,4, | 410,5, | 410,6, | 410,7, | 410,8, | 410,9, | 410,10, | 410,11, | 410,12, | 410,13, | 410,14, | 410,15, | 410,16, | 410,17, | 410,18, | 410,19, | 410,20, | 410,21, | 410,22, | 410,23, | 410,24, | 410,25, | 410,26, | 410,27, | 410,28, | 410,29, | 410,30, | 410,31, | 410,32, | 410,33, | 410,34, | 410,35, | 410,36, | 410,37, | 410,38, | 410,39, | 410,40, | 410,41, | 410,42, | 410,43, | 410,44, | 410,45, | 410,46, | 410,47, | 410,48, | 410,49, | 410,50, | 410,51, | 410,52, | 410,53, | 410,54, | 410,55, | 410,56, | 410,57, | 410,58, | 410,59, | 410,60, | 410,61, | 410,62, | 410,63, | 410,64, | 410,65, | 410,66, | 410,67, | 410,68, | 410,69, | 410,70, | 410,71, | 410,72, | 410,73, | 410,74, | 410,75, | 410,76, | 410,77, | 410,78, | 410,79, | 410,80, | 410,81, | 410,82, | 410,83, | 410,84, | 410,85, | 411,1, | 411,2, | 411,3, | 411,4, | 411,5, | 411,6, | 411,7, | 411,8, | 411,9, | 411,10, | 411,11, | 411,12, | 411,13, | 411,14, | 411,15, | 411,16, | 411,17, | 411,18, | 411,19, | 411,20, | 411,21, | 411,22, | 411,23, | 411,24, | 411,25, | 411,26, | 411,27, | 411,28, | 411,29, | 411,30, | 411,31, | 411,32, | 411,33, | 411,34, | 411,35, | 411,36, | 411,37, | 411,38, | 411,39, | 411,40, | 411,41, | 411,42, | 411,43, | 411,44, | 411,45, | 411,46, | 411,47, | 411,48, | 411,49, | 411,50, | 411,51, | 411,52, | 411,53, | 411,54, | 411,55, | 411,56, | 411,57, | 411,58, | 411,59, | 411,60, | 411,61, | 411,62, | 411,63, | 411,64, | 411,65, | 411,66, | 411,67, | 411,68, | 411,69, | 411,70, | 411,71, | 411,72, | 411,73, | 411,74, | 411,75, | 411,76, | 411,77, | 411,78, | 411,79, | 411,80, | 411,81, | 411,82, | 411,83, | 411,84, | 411,85, | 412,1, | 412,2, | 412,3, | 412,4, | 412,5, | 412,6, | 412,7, | 412,8, | 412,9, | 412,10, | 412,11, | 412,12, | 412,13, | 412,14, | 412,15, | 412,16, | 412,17, | 412,18, | 412,19, | 412,20, | 412,21, | 412,22, | 412,23, | 412,24, | 412,25, | 412,26, | 412,27, | 412,28, | 412,29, | 412,30, | 412,31, | 412,32, | 412,33, | 412,34, | 412,35, | 412,36, | 412,37, | 412,38, | 412,39, | 412,40, | 412,41, | 412,42, | 412,43, | 412,44, | 412,45, | 412,46, | 412,47, | 412,48, | 412,49, | 412,50, | 412,51, | 412,52, | 412,53, | 412,54, | 412,55, | 412,56, | 412,57, | 412,58, | 412,59, | 412,60, | 412,61, | 412,62, | 412,63, | 412,64, | 412,65, | 412,66, | 412,67, | 412,68, | 412,69, | 412,70, | 412,71, | 412,72, | 412,73, | 412,74, | 412,75, | 412,76, | 412,77, | 412,78, | 412,79, | 412,80, | 412,81, | 412,82, | 412,83, | 412,84, | 412,85, | 413,1, | 413,2, | 413,3, | 413,4, | 413,5, | 413,6, | 413,7, | 413,8, | 413,9, | 413,10, | 413,11, | 413,12, | 413,13, | 413,14, | 413,15, | 413,16, | 413,17, | 413,18, | 413,19, | 413,20, | 413,21, | 413,22, | 413,23, | 413,24, | 413,25, | 413,26, | 413,27, | 413,28, | 413,29, | 413,30, | 413,31, | 413,32, | 413,33, | 413,34, | 413,35, | 413,36, | 413,37, | 413,38, | 413,39, | 413,40, | 413,41, | 413,42, | 413,43, | 413,44, | 413,45, | 413,46, | 413,47, | 413,48, | 413,49, | 413,50, | 413,51, | 413,52, | 413,53, | 413,54, | 413,55, | 413,56, | 413,57, | 413,58, | 413,59, | 413,60, | 413,61, | 413,62, | 413,63, | 413,64, | 413,65, | 413,66, | 413,67, | 413,68, | 413,69, | 413,70, | 413,71, | 413,72, | 413,73, | 413,74, | 413,75, | 413,76, | 413,77, | 413,78, | 413,79, | 413,80, | 413,81, | 413,82, | 413,83, | 413,84, | 413,85, | 414,1, | 414,2, | 414,3, | 414,4, | 414,5, | 414,6, | 414,7, | 414,8, | 414,9, | 414,10, | 414,11, | 414,12, | 414,13, | 414,14, | 414,15, | 414,16, | 414,17, | 414,18, | 414,19, | 414,20, | 414,21, | 414,22, | 414,23, | 414,24, | 414,25, | 414,26, | 414,27, | 414,28, | 414,29, | 414,30, | 414,31, | 414,32, | 414,33, | 414,34, | 414,35, | 414,36, | 414,37, | 414,38, | 414,39, | 414,40, | 414,41, | 414,42, | 414,43, | 414,44, | 414,45, | 414,46, | 414,47, | 414,48, | 414,49, | 414,50, | 414,51, | 414,52, | 414,53, | 414,54, | 414,55, | 414,56, | 414,57, | 414,58, | 414,59, | 414,60, | 414,61, | 414,62, | 414,63, | 414,64, | 414,65, | 414,66, | 414,67, | 414,68, | 414,69, | 414,70, | 414,71, | 414,72, | 414,73, | 414,74, | 414,75, | 414,76, | 414,77, | 414,78, | 414,79, | 414,80, | 414,81, | 414,82, | 414,83, | 414,84, | 414,85, | 415,1, | 415,2, | 415,3, | 415,4, | 415,5, | 415,6, | 415,7, | 415,8, | 415,9, | 415,10, | 415,11, | 415,12, | 415,13, | 415,14, | 415,15, | 415,16, | 415,17, | 415,18, | 415,19, | 415,20, | 415,21, | 415,22, | 415,23, | 415,24, | 415,25, | 415,26, | 415,27, | 415,28, | 415,29, | 415,30, | 415,31, | 415,32, | 415,33, | 415,34, | 415,35, | 415,36, | 415,37, | 415,38, | 415,39, | 415,40, | 415,41, | 415,42, | 415,43, | 415,44, | 415,45, | 415,46, | 415,47, | 415,48, | 415,49, | 415,50, | 415,51, | 415,52, | 415,53, | 415,54, | 415,55, | 415,56, | 415,57, | 415,58, | 415,59, | 415,60, | 415,61, | 415,62, | 415,63, | 415,64, | 415,65, | 415,66, | 415,67, | 415,68, | 415,69, | 415,70, | 415,71, | 415,72, | 415,73, | 415,74, | 415,75, | 415,76, | 415,77, | 415,78, | 415,79, | 415,80, | 415,81, | 415,82, | 415,83, | 415,84, | 415,85, | 416,1, | 416,2, | 416,3, | 416,4, | 416,5, | 416,6, | 416,7, | 416,8, | 416,9, | 416,10, | 416,11, | 416,12, | 416,13, | 416,14, | 416,15, | 416,16, | 416,17, | 416,18, | 416,19, | 416,20, | 416,21, | 416,22, | 416,23, | 416,24, | 416,25, | 416,26, | 416,27, | 416,28, | 416,29, | 416,30, | 416,31, | 416,32, | 416,33, | 416,34, | 416,35, | 416,36, | 416,37, | 416,38, | 416,39, | 416,40, | 416,41, | 416,42, | 416,43, | 416,44, | 416,45, | 416,46, | 416,47, | 416,48, | 416,49, | 416,50, | 416,51, | 416,52, | 416,53, | 416,54, | 416,55, | 416,56, | 416,57, | 416,58, | 416,59, | 416,60, | 416,61, | 416,62, | 416,63, | 416,64, | 416,65, | 416,66, | 416,67, | 416,68, | 416,69, | 416,70, | 416,71, | 416,72, | 416,73, | 416,74, | 416,75, | 416,76, | 416,77, | 416,78, | 416,79, | 416,80, | 416,81, | 416,82, | 416,83, | 416,84, | 416,85, | 417,1, | 417,2, | 417,3, | 417,4, | 417,5, | 417,6, | 417,7, | 417,8, | 417,9, | 417,10, | 417,11, | 417,12, | 417,13, | 417,14, | 417,15, | 417,16, | 417,17, | 417,18, | 417,19, | 417,20, | 417,21, | 417,22, | 417,23, | 417,24, | 417,25, | 417,26, | 417,27, | 417,28, | 417,29, | 417,30, | 417,31, | 417,32, | 417,33, | 417,34, | 417,35, | 417,36, | 417,37, | 417,38, | 417,39, | 417,40, | 417,41, | 417,42, | 417,43, | 417,44, | 417,45, | 417,46, | 417,47, | 417,48, | 417,49, | 417,50, | 417,51, | 417,52, | 417,53, | 417,54, | 417,55, | 417,56, | 417,57, | 417,58, | 417,59, | 417,60, | 417,61, | 417,62, | 417,63, | 417,64, | 417,65, | 417,66, | 417,67, | 417,68, | 417,69, | 417,70, | 417,71, | 417,72, | 417,73, | 417,74, | 417,75, | 417,76, | 417,77, | 417,78, | 417,79, | 417,80, | 417,81, | 417,82, | 417,83, | 417,84, | 417,85, | 418,1, | 418,2, | 418,3, | 418,4, | 418,5, | 418,6, | 418,7, | 418,8, | 418,9, | 418,10, | 418,11, | 418,12, | 418,13, | 418,14, | 418,15, | 418,16, | 418,17, | 418,18, | 418,19, | 418,20, | 418,21, | 418,22, | 418,23, | 418,24, | 418,25, | 418,26, | 418,27, | 418,28, | 418,29, | 418,30, | 418,31, | 418,32, | 418,33, | 418,34, | 418,35, | 418,36, | 418,37, | 418,38, | 418,39, | 418,40, | 418,41, | 418,42, | 418,43, | 418,44, | 418,45, | 418,46, | 418,47, | 418,48, | 418,49, | 418,50, | 418,51, | 418,52, | 418,53, | 418,54, | 418,55, | 418,56, | 418,57, | 418,58, | 418,59, | 418,60, | 418,61, | 418,62, | 418,63, | 418,64, | 418,65, | 418,66, | 418,67, | 418,68, | 418,69, | 418,70, | 418,71, | 418,72, | 418,73, | 418,74, | 418,75, | 418,76, | 418,77, | 418,78, | 418,79, | 418,80, | 418,81, | 418,82, | 418,83, | 418,84, | 418,85, | 419,1, | 419,2, | 419,3, | 419,4, | 419,5, | 419,6, | 419,7, | 419,8, | 419,9, | 419,10, | 419,11, | 419,12, | 419,13, | 419,14, | 419,15, | 419,16, | 419,17, | 419,18, | 419,19, | 419,20, | 419,21, | 419,22, | 419,23, | 419,24, | 419,25, | 419,26, | 419,27, | 419,28, | 419,29, | 419,30, | 419,31, | 419,32, | 419,33, | 419,34, | 419,35, | 419,36, | 419,37, | 419,38, | 419,39, | 419,40, | 419,41, | 419,42, | 419,43, | 419,44, | 419,45, | 419,46, | 419,47, | 419,48, | 419,49, | 419,50, | 419,51, | 419,52, | 419,53, | 419,54, | 419,55, | 419,56, | 419,57, | 419,58, | 419,59, | 419,60, | 419,61, | 419,62, | 419,63, | 419,64, | 419,65, | 419,66, | 419,67, | 419,68, | 419,69, | 419,70, | 419,71, | 419,72, | 419,73, | 419,74, | 419,75, | 419,76, | 419,77, | 419,78, | 419,79, | 419,80, | 419,81, | 419,82, | 419,83, | 419,84, | 419,85, | 420,1, | 420,2, | 420,3, | 420,4, | 420,5, | 420,6, | 420,7, | 420,8, | 420,9, | 420,10, | 420,11, | 420,12, | 420,13, | 420,14, | 420,15, | 420,16, | 420,17, | 420,18, | 420,19, | 420,20, | 420,21, | 420,22, | 420,23, | 420,24, | 420,25, | 420,26, | 420,27, | 420,28, | 420,29, | 420,30, | 420,31, | 420,32, | 420,33, | 420,34, | 420,35, | 420,36, | 420,37, | 420,38, | 420,39, | 420,40, | 420,41, | 420,42, | 420,43, | 420,44, | 420,45, | 420,46, | 420,47, | 420,48, | 420,49, | 420,50, | 420,51, | 420,52, | 420,53, | 420,54, | 420,55, | 420,56, | 420,57, | 420,58, | 420,59, | 420,60, | 420,61, | 420,62, | 420,63, | 420,64, | 420,65, | 420,66, | 420,67, | 420,68, | 420,69, | 420,70, | 420,71, | 420,72, | 420,73, | 420,74, | 420,75, | 420,76, | 420,77, | 420,78, | 420,79, | 420,80, | 420,81, | 420,82, | 420,83, | 420,84, | 420,85, | 421,1, | 421,2, | 421,3, | 421,4, | 421,5, | 421,6, | 421,7, | 421,8, | 421,9, | 421,10, | 421,11, | 421,12, | 421,13, | 421,14, | 421,15, | 421,16, | 421,17, | 421,18, | 421,19, | 421,20, | 421,21, | 421,22, | 421,23, | 421,24, | 421,25, | 421,26, | 421,27, | 421,28, | 421,29, | 421,30, | 421,31, | 421,32, | 421,33, | 421,34, | 421,35, | 421,36, | 421,37, | 421,38, | 421,39, | 421,40, | 421,41, | 421,42, | 421,43, | 421,44, | 421,45, | 421,46, | 421,47, | 421,48, | 421,49, | 421,50, | 421,51, | 421,52, | 421,53, | 421,54, | 421,55, | 421,56, | 421,57, | 421,58, | 421,59, | 421,60, | 421,61, | 421,62, | 421,63, | 421,64, | 421,65, | 421,66, | 421,67, | 421,68, | 421,69, | 421,70, | 421,71, | 421,72, | 421,73, | 421,74, | 421,75, | 421,76, | 421,77, | 421,78, | 421,79, | 421,80, | 421,81, | 421,82, | 421,83, | 421,84, | 421,85, | 422,1, | 422,2, | 422,3, | 422,4, | 422,5, | 422,6, | 422,7, | 422,8, | 422,9, | 422,10, | 422,11, | 422,12, | 422,13, | 422,14, | 422,15, | 422,16, | 422,17, | 422,18, | 422,19, | 422,20, | 422,21, | 422,22, | 422,23, | 422,24, | 422,25, | 422,26, | 422,27, | 422,28, | 422,29, | 422,30, | 422,31, | 422,32, | 422,33, | 422,34, | 422,35, | 422,36, | 422,37, | 422,38, | 422,39, | 422,40, | 422,41, | 422,42, | 422,43, | 422,44, | 422,45, | 422,46, | 422,47, | 422,48, | 422,49, | 422,50, | 422,51, | 422,52, | 422,53, | 422,54, | 422,55, | 422,56, | 422,57, | 422,58, | 422,59, | 422,60, | 422,61, | 422,62, | 422,63, | 422,64, | 422,65, | 422,66, | 422,67, | 422,68, | 422,69, | 422,70, | 422,71, | 422,72, | 422,73, | 422,74, | 422,75, | 422,76, | 422,77, | 422,78, | 422,79, | 422,80, | 422,81, | 422,82, | 422,83, | 422,84, | 422,85, | 423,1, | 423,2, | 423,3, | 423,4, | 423,5, | 423,6, | 423,7, | 423,8, | 423,9, | 423,10, | 423,11, | 423,12, | 423,13, | 423,14, | 423,15, | 423,16, | 423,17, | 423,18, | 423,19, | 423,20, | 423,21, | 423,22, | 423,23, | 423,24, | 423,25, | 423,26, | 423,27, | 423,28, | 423,29, | 423,30, | 423,31, | 423,32, | 423,33, | 423,34, | 423,35, | 423,36, | 423,37, | 423,38, | 423,39, | 423,40, | 423,41, | 423,42, | 423,43, | 423,44, | 423,45, | 423,46, | 423,47, | 423,48, | 423,49, | 423,50, | 423,51, | 423,52, | 423,53, | 423,54, | 423,55, | 423,56, | 423,57, | 423,58, | 423,59, | 423,60, | 423,61, | 423,62, | 423,63, | 423,64, | 423,65, | 423,66, | 423,67, | 423,68, | 423,69, | 423,70, | 423,71, | 423,72, | 423,73, | 423,74, | 423,75, | 423,76, | 423,77, | 423,78, | 423,79, | 423,80, | 423,81, | 423,82, | 423,83, | 423,84, | 423,85, | 424,1, | 424,2, | 424,3, | 424,4, | 424,5, | 424,6, | 424,7, | 424,8, | 424,9, | 424,10, | 424,11, | 424,12, | 424,13, | 424,14, | 424,15, | 424,16, | 424,17, | 424,18, | 424,19, | 424,20, | 424,21, | 424,22, | 424,23, | 424,24, | 424,25, | 424,26, | 424,27, | 424,28, | 424,29, | 424,30, | 424,31, | 424,32, | 424,33, | 424,34, | 424,35, | 424,36, | 424,37, | 424,38, | 424,39, | 424,40, | 424,41, | 424,42, | 424,43, | 424,44, | 424,45, | 424,46, | 424,47, | 424,48, | 424,49, | 424,50, | 424,51, | 424,52, | 424,53, | 424,54, | 424,55, | 424,56, | 424,57, | 424,58, | 424,59, | 424,60, | 424,61, | 424,62, | 424,63, | 424,64, | 424,65, | 424,66, | 424,67, | 424,68, | 424,69, | 424,70, | 424,71, | 424,72, | 424,73, | 424,74, | 424,75, | 424,76, | 424,77, | 424,78, | 424,79, | 424,80, | 424,81, | 424,82, | 424,83, | 424,84, | 424,85, | 425,1, | 425,2, | 425,3, | 425,4, | 425,5, | 425,6, | 425,7, | 425,8, | 425,9, | 425,10, | 425,11, | 425,12, | 425,13, | 425,14, | 425,15, | 425,16, | 425,17, | 425,18, | 425,19, | 425,20, | 425,21, | 425,22, | 425,23, | 425,24, | 425,25, | 425,26, | 425,27, | 425,28, | 425,29, | 425,30, | 425,31, | 425,32, | 425,33, | 425,34, | 425,35, | 425,36, | 425,37, | 425,38, | 425,39, | 425,40, | 425,41, | 425,42, | 425,43, | 425,44, | 425,45, | 425,46, | 425,47, | 425,48, | 425,49, | 425,50, | 425,51, | 425,52, | 425,53, | 425,54, | 425,55, | 425,56, | 425,57, | 425,58, | 425,59, | 425,60, | 425,61, | 425,62, | 425,63, | 425,64, | 425,65, | 425,66, | 425,67, | 425,68, | 425,69, | 425,70, | 425,71, | 425,72, | 425,73, | 425,74, | 425,75, | 425,76, | 425,77, | 425,78, | 425,79, | 425,80, | 425,81, | 425,82, | 425,83, | 425,84, | 425,85, | 426,1, | 426,2, | 426,3, | 426,4, | 426,5, | 426,6, | 426,7, | 426,8, | 426,9, | 426,10, | 426,11, | 426,12, | 426,13, | 426,14, | 426,15, | 426,16, | 426,17, | 426,18, | 426,19, | 426,20, | 426,21, | 426,22, | 426,23, | 426,24, | 426,25, | 426,26, | 426,27, | 426,28, | 426,29, | 426,30, | 426,31, | 426,32, | 426,33, | 426,34, | 426,35, | 426,36, | 426,37, | 426,38, | 426,39, | 426,40, | 426,41, | 426,42, | 426,43, | 426,44, | 426,45, | 426,46, | 426,47, | 426,48, | 426,49, | 426,50, | 426,51, | 426,52, | 426,53, | 426,54, | 426,55, | 426,56, | 426,57, | 426,58, | 426,59, | 426,60, | 426,61, | 426,62, | 426,63, | 426,64, | 426,65, | 426,66, | 426,67, | 426,68, | 426,69, | 426,70, | 426,71, | 426,72, | 426,73, | 426,74, | 426,75, | 426,76, | 426,77, | 426,78, | 426,79, | 426,80, | 426,81, | 426,82, | 426,83, | 426,84, | 426,85, | 427,1, | 427,2, | 427,3, | 427,4, | 427,5, | 427,6, | 427,7, | 427,8, | 427,9, | 427,10, | 427,11, | 427,12, | 427,13, | 427,14, | 427,15, | 427,16, | 427,17, | 427,18, | 427,19, | 427,20, | 427,21, | 427,22, | 427,23, | 427,24, | 427,25, | 427,26, | 427,27, | 427,28, | 427,29, | 427,30, | 427,31, | 427,32, | 427,33, | 427,34, | 427,35, | 427,36, | 427,37, | 427,38, | 427,39, | 427,40, | 427,41, | 427,42, | 427,43, | 427,44, | 427,45, | 427,46, | 427,47, | 427,48, | 427,49, | 427,50, | 427,51, | 427,52, | 427,53, | 427,54, | 427,55, | 427,56, | 427,57, | 427,58, | 427,59, | 427,60, | 427,61, | 427,62, | 427,63, | 427,64, | 427,65, | 427,66, | 427,67, | 427,68, | 427,69, | 427,70, | 427,71, | 427,72, | 427,73, | 427,74, | 427,75, | 427,76, | 427,77, | 427,78, | 427,79, | 427,80, | 427,81, | 427,82, | 427,83, | 427,84, | 427,85, | 428,1, | 428,2, | 428,3, | 428,4, | 428,5, | 428,6, | 428,7, | 428,8, | 428,9, | 428,10, | 428,11, | 428,12, | 428,13, | 428,14, | 428,15, | 428,16, | 428,17, | 428,18, | 428,19, | 428,20, | 428,21, | 428,22, | 428,23, | 428,24, | 428,25, | 428,26, | 428,27, | 428,28, | 428,29, | 428,30, | 428,31, | 428,32, | 428,33, | 428,34, | 428,35, | 428,36, | 428,37, | 428,38, | 428,39, | 428,40, | 428,41, | 428,42, | 428,43, | 428,44, | 428,45, | 428,46, | 428,47, | 428,48, | 428,49, | 428,50, | 428,51, | 428,52, | 428,53, | 428,54, | 428,55, | 428,56, | 428,57, | 428,58, | 428,59, | 428,60, | 428,61, | 428,62, | 428,63, | 428,64, | 428,65, | 428,66, | 428,67, | 428,68, | 428,69, | 428,70, | 428,71, | 428,72, | 428,73, | 428,74, | 428,75, | 428,76, | 428,77, | 428,78, | 428,79, | 428,80, | 428,81, | 428,82, | 428,83, | 428,84, | 428,85, | 429,1, | 429,2, | 429,3, | 429,4, | 429,5, | 429,6, | 429,7, | 429,8, | 429,9, | 429,10, | 429,11, | 429,12, | 429,13, | 429,14, | 429,15, | 429,16, | 429,17, | 429,18, | 429,19, | 429,20, | 429,21, | 429,22, | 429,23, | 429,24, | 429,25, | 429,26, | 429,27, | 429,28, | 429,29, | 429,30, | 429,31, | 429,32, | 429,33, | 429,34, | 429,35, | 429,36, | 429,37, | 429,38, | 429,39, | 429,40, | 429,41, | 429,42, | 429,43, | 429,44, | 429,45, | 429,46, | 429,47, | 429,48, | 429,49, | 429,50, | 429,51, | 429,52, | 429,53, | 429,54, | 429,55, | 429,56, | 429,57, | 429,58, | 429,59, | 429,60, | 429,61, | 429,62, | 429,63, | 429,64, | 429,65, | 429,66, | 429,67, | 429,68, | 429,69, | 429,70, | 429,71, | 429,72, | 429,73, | 429,74, | 429,75, | 429,76, | 429,77, | 429,78, | 429,79, | 429,80, | 429,81, | 429,82, | 429,83, | 429,84, | 429,85, | 430,1, | 430,2, | 430,3, | 430,4, | 430,5, | 430,6, | 430,7, | 430,8, | 430,9, | 430,10, | 430,11, | 430,12, | 430,13, | 430,14, | 430,15, | 430,16, | 430,17, | 430,18, | 430,19, | 430,20, | 430,21, | 430,22, | 430,23, | 430,24, | 430,25, | 430,26, | 430,27, | 430,28, | 430,29, | 430,30, | 430,31, | 430,32, | 430,33, | 430,34, | 430,35, | 430,36, | 430,37, | 430,38, | 430,39, | 430,40, | 430,41, | 430,42, | 430,43, | 430,44, | 430,45, | 430,46, | 430,47, | 430,48, | 430,49, | 430,50, | 430,51, | 430,52, | 430,53, | 430,54, | 430,55, | 430,56, | 430,57, | 430,58, | 430,59, | 430,60, | 430,61, | 430,62, | 430,63, | 430,64, | 430,65, | 430,66, | 430,67, | 430,68, | 430,69, | 430,70, | 430,71, | 430,72, | 430,73, | 430,74, | 430,75, | 430,76, | 430,77, | 430,78, | 430,79, | 430,80, | 430,81, | 430,82, | 430,83, | 430,84, | 430,85, | 431,1, | 431,2, | 431,3, | 431,4, | 431,5, | 431,6, | 431,7, | 431,8, | 431,9, | 431,10, | 431,11, | 431,12, | 431,13, | 431,14, | 431,15, | 431,16, | 431,17, | 431,18, | 431,19, | 431,20, | 431,21, | 431,22, | 431,23, | 431,24, | 431,25, | 431,26, | 431,27, | 431,28, | 431,29, | 431,30, | 431,31, | 431,32, | 431,33, | 431,34, | 431,35, | 431,36, | 431,37, | 431,38, | 431,39, | 431,40, | 431,41, | 431,42, | 431,43, | 431,44, | 431,45, | 431,46, | 431,47, | 431,48, | 431,49, | 431,50, | 431,51, | 431,52, | 431,53, | 431,54, | 431,55, | 431,56, | 431,57, | 431,58, | 431,59, | 431,60, | 431,61, | 431,62, | 431,63, | 431,64, | 431,65, | 431,66, | 431,67, | 431,68, | 431,69, | 431,70, | 431,71, | 431,72, | 431,73, | 431,74, | 431,75, | 431,76, | 431,77, | 431,78, | 431,79, | 431,80, | 431,81, | 431,82, | 431,83, | 431,84, | 431,85, | 432,1, | 432,2, | 432,3, | 432,4, | 432,5, | 432,6, | 432,7, | 432,8, | 432,9, | 432,10, | 432,11, | 432,12, | 432,13, | 432,14, | 432,15, | 432,16, | 432,17, | 432,18, | 432,19, | 432,20, | 432,21, | 432,22, | 432,23, | 432,24, | 432,25, | 432,26, | 432,27, | 432,28, | 432,29, | 432,30, | 432,31, | 432,32, | 432,33, | 432,34, | 432,35, | 432,36, | 432,37, | 432,38, | 432,39, | 432,40, | 432,41, | 432,42, | 432,43, | 432,44, | 432,45, | 432,46, | 432,47, | 432,48, | 432,49, | 432,50, | 432,51, | 432,52, | 432,53, | 432,54, | 432,55, | 432,56, | 432,57, | 432,58, | 432,59, | 432,60, | 432,61, | 432,62, | 432,63, | 432,64, | 432,65, | 432,66, | 432,67, | 432,68, | 432,69, | 432,70, | 432,71, | 432,72, | 432,73, | 432,74, | 432,75, | 432,76, | 432,77, | 432,78, | 432,79, | 432,80, | 432,81, | 432,82, | 432,83, | 432,84, | 432,85, | 433,1, | 433,2, | 433,3, | 433,4, | 433,5, | 433,6, | 433,7, | 433,8, | 433,9, | 433,10, | 433,11, | 433,12, | 433,13, | 433,14, | 433,15, | 433,16, | 433,17, | 433,18, | 433,19, | 433,20, | 433,21, | 433,22, | 433,23, | 433,24, | 433,25, | 433,26, | 433,27, | 433,28, | 433,29, | 433,30, | 433,31, | 433,32, | 433,33, | 433,34, | 433,35, | 433,36, | 433,37, | 433,38, | 433,39, | 433,40, | 433,41, | 433,42, | 433,43, | 433,44, | 433,45, | 433,46, | 433,47, | 433,48, | 433,49, | 433,50, | 433,51, | 433,52, | 433,53, | 433,54, | 433,55, | 433,56, | 433,57, | 433,58, | 433,59, | 433,60, | 433,61, | 433,62, | 433,63, | 433,64, | 433,65, | 433,66, | 433,67, | 433,68, | 433,69, | 433,70, | 433,71, | 433,72, | 433,73, | 433,74, | 433,75, | 433,76, | 433,77, | 433,78, | 433,79, | 433,80, | 433,81, | 433,82, | 433,83, | 433,84, | 433,85, | 434,1, | 434,2, | 434,3, | 434,4, | 434,5, | 434,6, | 434,7, | 434,8, | 434,9, | 434,10, | 434,11, | 434,12, | 434,13, | 434,14, | 434,15, | 434,16, | 434,17, | 434,18, | 434,19, | 434,20, | 434,21, | 434,22, | 434,23, | 434,24, | 434,25, | 434,26, | 434,27, | 434,28, | 434,29, | 434,30, | 434,31, | 434,32, | 434,33, | 434,34, | 434,35, | 434,36, | 434,37, | 434,38, | 434,39, | 434,40, | 434,41, | 434,42, | 434,43, | 434,44, | 434,45, | 434,46, | 434,47, | 434,48, | 434,49, | 434,50, | 434,51, | 434,52, | 434,53, | 434,54, | 434,55, | 434,56, | 434,57, | 434,58, | 434,59, | 434,60, | 434,61, | 434,62, | 434,63, | 434,64, | 434,65, | 434,66, | 434,67, | 434,68, | 434,69, | 434,70, | 434,71, | 434,72, | 434,73, | 434,74, | 434,75, | 434,76, | 434,77, | 434,78, | 434,79, | 434,80, | 434,81, | 434,82, | 434,83, | 434,84, | 434,85, | 435,1, | 435,2, | 435,3, | 435,4, | 435,5, | 435,6, | 435,7, | 435,8, | 435,9, | 435,10, | 435,11, | 435,12, | 435,13, | 435,14, | 435,15, | 435,16, | 435,17, | 435,18, | 435,19, | 435,20, | 435,21, | 435,22, | 435,23, | 435,24, | 435,25, | 435,26, | 435,27, | 435,28, | 435,29, | 435,30, | 435,31, | 435,32, | 435,33, | 435,34, | 435,35, | 435,36, | 435,37, | 435,38, | 435,39, | 435,40, | 435,41, | 435,42, | 435,43, | 435,44, | 435,45, | 435,46, | 435,47, | 435,48, | 435,49, | 435,50, | 435,51, | 435,52, | 435,53, | 435,54, | 435,55, | 435,56, | 435,57, | 435,58, | 435,59, | 435,60, | 435,61, | 435,62, | 435,63, | 435,64, | 435,65, | 435,66, | 435,67, | 435,68, | 435,69, | 435,70, | 435,71, | 435,72, | 435,73, | 435,74, | 435,75, | 435,76, | 435,77, | 435,78, | 435,79, | 435,80, | 435,81, | 435,82, | 435,83, | 435,84, | 435,85, | 436,1, | 436,2, | 436,3, | 436,4, | 436,5, | 436,6, | 436,7, | 436,8, | 436,9, | 436,10, | 436,11, | 436,12, | 436,13, | 436,14, | 436,15, | 436,16, | 436,17, | 436,18, | 436,19, | 436,20, | 436,21, | 436,22, | 436,23, | 436,24, | 436,25, | 436,26, | 436,27, | 436,28, | 436,29, | 436,30, | 436,31, | 436,32, | 436,33, | 436,34, | 436,35, | 436,36, | 436,37, | 436,38, | 436,39, | 436,40, | 436,41, | 436,42, | 436,43, | 436,44, | 436,45, | 436,46, | 436,47, | 436,48, | 436,49, | 436,50, | 436,51, | 436,52, | 436,53, | 436,54, | 436,55, | 436,56, | 436,57, | 436,58, | 436,59, | 436,60, | 436,61, | 436,62, | 436,63, | 436,64, | 436,65, | 436,66, | 436,67, | 436,68, | 436,69, | 436,70, | 436,71, | 436,72, | 436,73, | 436,74, | 436,75, | 436,76, | 436,77, | 436,78, | 436,79, | 436,80, | 436,81, | 436,82, | 436,83, | 436,84, | 436,85, | 437,1, | 437,2, | 437,3, | 437,4, | 437,5, | 437,6, | 437,7, | 437,8, | 437,9, | 437,10, | 437,11, | 437,12, | 437,13, | 437,14, | 437,15, | 437,16, | 437,17, | 437,18, | 437,19, | 437,20, | 437,21, | 437,22, | 437,23, | 437,24, | 437,25, | 437,26, | 437,27, | 437,28, | 437,29, | 437,30, | 437,31, | 437,32, | 437,33, | 437,34, | 437,35, | 437,36, | 437,37, | 437,38, | 437,39, | 437,40, | 437,41, | 437,42, | 437,43, | 437,44, | 437,45, | 437,46, | 437,47, | 437,48, | 437,49, | 437,50, | 437,51, | 437,52, | 437,53, | 437,54, | 437,55, | 437,56, | 437,57, | 437,58, | 437,59, | 437,60, | 437,61, | 437,62, | 437,63, | 437,64, | 437,65, | 437,66, | 437,67, | 437,68, | 437,69, | 437,70, | 437,71, | 437,72, | 437,73, | 437,74, | 437,75, | 437,76, | 437,77, | 437,78, | 437,79, | 437,80, | 437,81, | 437,82, | 437,83, | 437,84, | 437,85, | 438,1, | 438,2, | 438,3, | 438,4, | 438,5, | 438,6, | 438,7, | 438,8, | 438,9, | 438,10, | 438,11, | 438,12, | 438,13, | 438,14, | 438,15, | 438,16, | 438,17, | 438,18, | 438,19, | 438,20, | 438,21, | 438,22, | 438,23, | 438,24, | 438,25, | 438,26, | 438,27, | 438,28, | 438,29, | 438,30, | 438,31, | 438,32, | 438,33, | 438,34, | 438,35, | 438,36, | 438,37, | 438,38, | 438,39, | 438,40, | 438,41, | 438,42, | 438,43, | 438,44, | 438,45, | 438,46, | 438,47, | 438,48, | 438,49, | 438,50, | 438,51, | 438,52, | 438,53, | 438,54, | 438,55, | 438,56, | 438,57, | 438,58, | 438,59, | 438,60, | 438,61, | 438,62, | 438,63, | 438,64, | 438,65, | 438,66, | 438,67, | 438,68, | 438,69, | 438,70, | 438,71, | 438,72, | 438,73, | 438,74, | 438,75, | 438,76, | 438,77, | 438,78, | 438,79, | 438,80, | 438,81, | 438,82, | 438,83, | 438,84, | 438,85, | 439,1, | 439,2, | 439,3, | 439,4, | 439,5, | 439,6, | 439,7, | 439,8, | 439,9, | 439,10, | 439,11, | 439,12, | 439,13, | 439,14, | 439,15, | 439,16, | 439,17, | 439,18, | 439,19, | 439,20, | 439,21, | 439,22, | 439,23, | 439,24, | 439,25, | 439,26, | 439,27, | 439,28, | 439,29, | 439,30, | 439,31, | 439,32, | 439,33, | 439,34, | 439,35, | 439,36, | 439,37, | 439,38, | 439,39, | 439,40, | 439,41, | 439,42, | 439,43, | 439,44, | 439,45, | 439,46, | 439,47, | 439,48, | 439,49, | 439,50, | 439,51, | 439,52, | 439,53, | 439,54, | 439,55, | 439,56, | 439,57, | 439,58, | 439,59, | 439,60, | 439,61, | 439,62, | 439,63, | 439,64, | 439,65, | 439,66, | 439,67, | 439,68, | 439,69, | 439,70, | 439,71, | 439,72, | 439,73, | 439,74, | 439,75, | 439,76, | 439,77, | 439,78, | 439,79, | 439,80, | 439,81, | 439,82, | 439,83, | 439,84, | 439,85, | 440,1, | 440,2, | 440,3, | 440,4, | 440,5, | 440,6, | 440,7, | 440,8, | 440,9, | 440,10, | 440,11, | 440,12, | 440,13, | 440,14, | 440,15, | 440,16, | 440,17, | 440,18, | 440,19, | 440,20, | 440,21, | 440,22, | 440,23, | 440,24, | 440,25, | 440,26, | 440,27, | 440,28, | 440,29, | 440,30, | 440,31, | 440,32, | 440,33, | 440,34, | 440,35, | 440,36, | 440,37, | 440,38, | 440,39, | 440,40, | 440,41, | 440,42, | 440,43, | 440,44, | 440,45, | 440,46, | 440,47, | 440,48, | 440,49, | 440,50, | 440,51, | 440,52, | 440,53, | 440,54, | 440,55, | 440,56, | 440,57, | 440,58, | 440,59, | 440,60, | 440,61, | 440,62, | 440,63, | 440,64, | 440,65, | 440,66, | 440,67, | 440,68, | 440,69, | 440,70, | 440,71, | 440,72, | 440,73, | 440,74, | 440,75, | 440,76, | 440,77, | 440,78, | 440,79, | 440,80, | 440,81, | 440,82, | 440,83, | 440,84, | 440,85, | 441,1, | 441,2, | 441,3, | 441,4, | 441,5, | 441,6, | 441,7, | 441,8, | 441,9, | 441,10, | 441,11, | 441,12, | 441,13, | 441,14, | 441,15, | 441,16, | 441,17, | 441,18, | 441,19, | 441,20, | 441,21, | 441,22, | 441,23, | 441,24, | 441,25, | 441,26, | 441,27, | 441,28, | 441,29, | 441,30, | 441,31, | 441,32, | 441,33, | 441,34, | 441,35, | 441,36, | 441,37, | 441,38, | 441,39, | 441,40, | 441,41, | 441,42, | 441,43, | 441,44, | 441,45, | 441,46, | 441,47, | 441,48, | 441,49, | 441,50, | 441,51, | 441,52, | 441,53, | 441,54, | 441,55, | 441,56, | 441,57, | 441,58, | 441,59, | 441,60, | 441,61, | 441,62, | 441,63, | 441,64, | 441,65, | 441,66, | 441,67, | 441,68, | 441,69, | 441,70, | 441,71, | 441,72, | 441,73, | 441,74, | 441,75, | 441,76, | 441,77, | 441,78, | 441,79, | 441,80, | 441,81, | 441,82, | 441,83, | 441,84, | 441,85, | 442,1, | 442,2, | 442,3, | 442,4, | 442,5, | 442,6, | 442,7, | 442,8, | 442,9, | 442,10, | 442,11, | 442,12, | 442,13, | 442,14, | 442,15, | 442,16, | 442,17, | 442,18, | 442,19, | 442,20, | 442,21, | 442,22, | 442,23, | 442,24, | 442,25, | 442,26, | 442,27, | 442,28, | 442,29, | 442,30, | 442,31, | 442,32, | 442,33, | 442,34, | 442,35, | 442,36, | 442,37, | 442,38, | 442,39, | 442,40, | 442,41, | 442,42, | 442,43, | 442,44, | 442,45, | 442,46, | 442,47, | 442,48, | 442,49, | 442,50, | 442,51, | 442,52, | 442,53, | 442,54, | 442,55, | 442,56, | 442,57, | 442,58, | 442,59, | 442,60, | 442,61, | 442,62, | 442,63, | 442,64, | 442,65, | 442,66, | 442,67, | 442,68, | 442,69, | 442,70, | 442,71, | 442,72, | 442,73, | 442,74, | 442,75, | 442,76, | 442,77, | 442,78, | 442,79, | 442,80, | 442,81, | 442,82, | 442,83, | 442,84, | 442,85, | 443,1, | 443,2, | 443,3, | 443,4, | 443,5, | 443,6, | 443,7, | 443,8, | 443,9, | 443,10, | 443,11, | 443,12, | 443,13, | 443,14, | 443,15, | 443,16, | 443,17, | 443,18, | 443,19, | 443,20, | 443,21, | 443,22, | 443,23, | 443,24, | 443,25, | 443,26, | 443,27, | 443,28, | 443,29, | 443,30, | 443,31, | 443,32, | 443,33, | 443,34, | 443,35, | 443,36, | 443,37, | 443,38, | 443,39, | 443,40, | 443,41, | 443,42, | 443,43, | 443,44, | 443,45, | 443,46, | 443,47, | 443,48, | 443,49, | 443,50, | 443,51, | 443,52, | 443,53, | 443,54, | 443,55, | 443,56, | 443,57, | 443,58, | 443,59, | 443,60, | 443,61, | 443,62, | 443,63, | 443,64, | 443,65, | 443,66, | 443,67, | 443,68, | 443,69, | 443,70, | 443,71, | 443,72, | 443,73, | 443,74, | 443,75, | 443,76, | 443,77, | 443,78, | 443,79, | 443,80, | 443,81, | 443,82, | 443,83, | 443,84, | 443,85, | 444,1, | 444,2, | 444,3, | 444,4, | 444,5, | 444,6, | 444,7, | 444,8, | 444,9, | 444,10, | 444,11, | 444,12, | 444,13, | 444,14, | 444,15, | 444,16, | 444,17, | 444,18, | 444,19, | 444,20, | 444,21, | 444,22, | 444,23, | 444,24, | 444,25, | 444,26, | 444,27, | 444,28, | 444,29, | 444,30, | 444,31, | 444,32, | 444,33, | 444,34, | 444,35, | 444,36, | 444,37, | 444,38, | 444,39, | 444,40, | 444,41, | 444,42, | 444,43, | 444,44, | 444,45, | 444,46, | 444,47, | 444,48, | 444,49, | 444,50, | 444,51, | 444,52, | 444,53, | 444,54, | 444,55, | 444,56, | 444,57, | 444,58, | 444,59, | 444,60, | 444,61, | 444,62, | 444,63, | 444,64, | 444,65, | 444,66, | 444,67, | 444,68, | 444,69, | 444,70, | 444,71, | 444,72, | 444,73, | 444,74, | 444,75, | 444,76, | 444,77, | 444,78, | 444,79, | 444,80, | 444,81, | 444,82, | 444,83, | 444,84, | 444,85, | 445,1, | 445,2, | 445,3, | 445,4, | 445,5, | 445,6, | 445,7, | 445,8, | 445,9, | 445,10, | 445,11, | 445,12, | 445,13, | 445,14, | 445,15, | 445,16, | 445,17, | 445,18, | 445,19, | 445,20, | 445,21, | 445,22, | 445,23, | 445,24, | 445,25, | 445,26, | 445,27, | 445,28, | 445,29, | 445,30, | 445,31, | 445,32, | 445,33, | 445,34, | 445,35, | 445,36, | 445,37, | 445,38, | 445,39, | 445,40, | 445,41, | 445,42, | 445,43, | 445,44, | 445,45, | 445,46, | 445,47, | 445,48, | 445,49, | 445,50, | 445,51, | 445,52, | 445,53, | 445,54, | 445,55, | 445,56, | 445,57, | 445,58, | 445,59, | 445,60, | 445,61, | 445,62, | 445,63, | 445,64, | 445,65, | 445,66, | 445,67, | 445,68, | 445,69, | 445,70, | 445,71, | 445,72, | 445,73, | 445,74, | 445,75, | 445,76, | 445,77, | 445,78, | 445,79, | 445,80, | 445,81, | 445,82, | 445,83, | 445,84, | 445,85, | 446,1, | 446,2, | 446,3, | 446,4, | 446,5, | 446,6, | 446,7, | 446,8, | 446,9, | 446,10, | 446,11, | 446,12, | 446,13, | 446,14, | 446,15, | 446,16, | 446,17, | 446,18, | 446,19, | 446,20, | 446,21, | 446,22, | 446,23, | 446,24, | 446,25, | 446,26, | 446,27, | 446,28, | 446,29, | 446,30, | 446,31, | 446,32, | 446,33, | 446,34, | 446,35, | 446,36, | 446,37, | 446,38, | 446,39, | 446,40, | 446,41, | 446,42, | 446,43, | 446,44, | 446,45, | 446,46, | 446,47, | 446,48, | 446,49, | 446,50, | 446,51, | 446,52, | 446,53, | 446,54, | 446,55, | 446,56, | 446,57, | 446,58, | 446,59, | 446,60, | 446,61, | 446,62, | 446,63, | 446,64, | 446,65, | 446,66, | 446,67, | 446,68, | 446,69, | 446,70, | 446,71, | 446,72, | 446,73, | 446,74, | 446,75, | 446,76, | 446,77, | 446,78, | 446,79, | 446,80, | 446,81, | 446,82, | 446,83, | 446,84, | 446,85, | 447,1, | 447,2, | 447,3, | 447,4, | 447,5, | 447,6, | 447,7, | 447,8, | 447,9, | 447,10, | 447,11, | 447,12, | 447,13, | 447,14, | 447,15, | 447,16, | 447,17, | 447,18, | 447,19, | 447,20, | 447,21, | 447,22, | 447,23, | 447,24, | 447,25, | 447,26, | 447,27, | 447,28, | 447,29, | 447,30, | 447,31, | 447,32, | 447,33, | 447,34, | 447,35, | 447,36, | 447,37, | 447,38, | 447,39, | 447,40, | 447,41, | 447,42, | 447,43, | 447,44, | 447,45, | 447,46, | 447,47, | 447,48, | 447,49, | 447,50, | 447,51, | 447,52, | 447,53, | 447,54, | 447,55, | 447,56, | 447,57, | 447,58, | 447,59, | 447,60, | 447,61, | 447,62, | 447,63, | 447,64, | 447,65, | 447,66, | 447,67, | 447,68, | 447,69, | 447,70, | 447,71, | 447,72, | 447,73, | 447,74, | 447,75, | 447,76, | 447,77, | 447,78, | 447,79, | 447,80, | 447,81, | 447,82, | 447,83, | 447,84, | 447,85, | 448,1, | 448,2, | 448,3, | 448,4, | 448,5, | 448,6, | 448,7, | 448,8, | 448,9, | 448,10, | 448,11, | 448,12, | 448,13, | 448,14, | 448,15, | 448,16, | 448,17, | 448,18, | 448,19, | 448,20, | 448,21, | 448,22, | 448,23, | 448,24, | 448,25, | 448,26, | 448,27, | 448,28, | 448,29, | 448,30, | 448,31, | 448,32, | 448,33, | 448,34, | 448,35, | 448,36, | 448,37, | 448,38, | 448,39, | 448,40, | 448,41, | 448,42, | 448,43, | 448,44, | 448,45, | 448,46, | 448,47, | 448,48, | 448,49, | 448,50, | 448,51, | 448,52, | 448,53, | 448,54, | 448,55, | 448,56, | 448,57, | 448,58, | 448,59, | 448,60, | 448,61, | 448,62, | 448,63, | 448,64, | 448,65, | 448,66, | 448,67, | 448,68, | 448,69, | 448,70, | 448,71, | 448,72, | 448,73, | 448,74, | 448,75, | 448,76, | 448,77, | 448,78, | 448,79, | 448,80, | 448,81, | 448,82, | 448,83, | 448,84, | 448,85, | 449,1, | 449,2, | 449,3, | 449,4, | 449,5, | 449,6, | 449,7, | 449,8, | 449,9, | 449,10, | 449,11, | 449,12, | 449,13, | 449,14, | 449,15, | 449,16, | 449,17, | 449,18, | 449,19, | 449,20, | 449,21, | 449,22, | 449,23, | 449,24, | 449,25, | 449,26, | 449,27, | 449,28, | 449,29, | 449,30, | 449,31, | 449,32, | 449,33, | 449,34, | 449,35, | 449,36, | 449,37, | 449,38, | 449,39, | 449,40, | 449,41, | 449,42, | 449,43, | 449,44, | 449,45, | 449,46, | 449,47, | 449,48, | 449,49, | 449,50, | 449,51, | 449,52, | 449,53, | 449,54, | 449,55, | 449,56, | 449,57, | 449,58, | 449,59, | 449,60, | 449,61, | 449,62, | 449,63, | 449,64, | 449,65, | 449,66, | 449,67, | 449,68, | 449,69, | 449,70, | 449,71, | 449,72, | 449,73, | 449,74, | 449,75, | 449,76, | 449,77, | 449,78, | 449,79, | 449,80, | 449,81, | 449,82, | 449,83, | 449,84, | 449,85, | 450,1, | 450,2, | 450,3, | 450,4, | 450,5, | 450,6, | 450,7, | 450,8, | 450,9, | 450,10, | 450,11, | 450,12, | 450,13, | 450,14, | 450,15, | 450,16, | 450,17, | 450,18, | 450,19, | 450,20, | 450,21, | 450,22, | 450,23, | 450,24, | 450,25, | 450,26, | 450,27, | 450,28, | 450,29, | 450,30, | 450,31, | 450,32, | 450,33, | 450,34, | 450,35, | 450,36, | 450,37, | 450,38, | 450,39, | 450,40, | 450,41, | 450,42, | 450,43, | 450,44, | 450,45, | 450,46, | 450,47, | 450,48, | 450,49, | 450,50, | 450,51, | 450,52, | 450,53, | 450,54, | 450,55, | 450,56, | 450,57, | 450,58, | 450,59, | 450,60, | 450,61, | 450,62, | 450,63, | 450,64, | 450,65, | 450,66, | 450,67, | 450,68, | 450,69, | 450,70, | 450,71, | 450,72, | 450,73, | 450,74, | 450,75, | 450,76, | 450,77, | 450,78, | 450,79, | 450,80, | 450,81, | 450,82, | 450,83, | 450,84, | 450,85, | 451,1, | 451,2, | 451,3, | 451,4, | 451,5, | 451,6, | 451,7, | 451,8, | 451,9, | 451,10, | 451,11, | 451,12, | 451,13, | 451,14, | 451,15, | 451,16, | 451,17, | 451,18, | 451,19, | 451,20, | 451,21, | 451,22, | 451,23, | 451,24, | 451,25, | 451,26, | 451,27, | 451,28, | 451,29, | 451,30, | 451,31, | 451,32, | 451,33, | 451,34, | 451,35, | 451,36, | 451,37, | 451,38, | 451,39, | 451,40, | 451,41, | 451,42, | 451,43, | 451,44, | 451,45, | 451,46, | 451,47, | 451,48, | 451,49, | 451,50, | 451,51, | 451,52, | 451,53, | 451,54, | 451,55, | 451,56, | 451,57, | 451,58, | 451,59, | 451,60, | 451,61, | 451,62, | 451,63, | 451,64, | 451,65, | 451,66, | 451,67, | 451,68, | 451,69, | 451,70, | 451,71, | 451,72, | 451,73, | 451,74, | 451,75, | 451,76, | 451,77, | 451,78, | 451,79, | 451,80, | 451,81, | 451,82, | 451,83, | 451,84, | 451,85, | 452,1, | 452,2, | 452,3, | 452,4, | 452,5, | 452,6, | 452,7, | 452,8, | 452,9, | 452,10, | 452,11, | 452,12, | 452,13, | 452,14, | 452,15, | 452,16, | 452,17, | 452,18, | 452,19, | 452,20, | 452,21, | 452,22, | 452,23, | 452,24, | 452,25, | 452,26, | 452,27, | 452,28, | 452,29, | 452,30, | 452,31, | 452,32, | 452,33, | 452,34, | 452,35, | 452,36, | 452,37, | 452,38, | 452,39, | 452,40, | 452,41, | 452,42, | 452,43, | 452,44, | 452,45, | 452,46, | 452,47, | 452,48, | 452,49, | 452,50, | 452,51, | 452,52, | 452,53, | 452,54, | 452,55, | 452,56, | 452,57, | 452,58, | 452,59, | 452,60, | 452,61, | 452,62, | 452,63, | 452,64, | 452,65, | 452,66, | 452,67, | 452,68, | 452,69, | 452,70, | 452,71, | 452,72, | 452,73, | 452,74, | 452,75, | 452,76, | 452,77, | 452,78, | 452,79, | 452,80, | 452,81, | 452,82, | 452,83, | 452,84, | 452,85, | 453,1, | 453,2, | 453,3, | 453,4, | 453,5, | 453,6, | 453,7, | 453,8, | 453,9, | 453,10, | 453,11, | 453,12, | 453,13, | 453,14, | 453,15, | 453,16, | 453,17, | 453,18, | 453,19, | 453,20, | 453,21, | 453,22, | 453,23, | 453,24, | 453,25, | 453,26, | 453,27, | 453,28, | 453,29, | 453,30, | 453,31, | 453,32, | 453,33, | 453,34, | 453,35, | 453,36, | 453,37, | 453,38, | 453,39, | 453,40, | 453,41, | 453,42, | 453,43, | 453,44, | 453,45, | 453,46, | 453,47, | 453,48, | 453,49, | 453,50, | 453,51, | 453,52, | 453,53, | 453,54, | 453,55, | 453,56, | 453,57, | 453,58, | 453,59, | 453,60, | 453,61, | 453,62, | 453,63, | 453,64, | 453,65, | 453,66, | 453,67, | 453,68, | 453,69, | 453,70, | 453,71, | 453,72, | 453,73, | 453,74, | 453,75, | 453,76, | 453,77, | 453,78, | 453,79, | 453,80, | 453,81, | 453,82, | 453,83, | 453,84, | 453,85, | 454,1, | 454,2, | 454,3, | 454,4, | 454,5, | 454,6, | 454,7, | 454,8, | 454,9, | 454,10, | 454,11, | 454,12, | 454,13, | 454,14, | 454,15, | 454,16, | 454,17, | 454,18, | 454,19, | 454,20, | 454,21, | 454,22, | 454,23, | 454,24, | 454,25, | 454,26, | 454,27, | 454,28, | 454,29, | 454,30, | 454,31, | 454,32, | 454,33, | 454,34, | 454,35, | 454,36, | 454,37, | 454,38, | 454,39, | 454,40, | 454,41, | 454,42, | 454,43, | 454,44, | 454,45, | 454,46, | 454,47, | 454,48, | 454,49, | 454,50, | 454,51, | 454,52, | 454,53, | 454,54, | 454,55, | 454,56, | 454,57, | 454,58, | 454,59, | 454,60, | 454,61, | 454,62, | 454,63, | 454,64, | 454,65, | 454,66, | 454,67, | 454,68, | 454,69, | 454,70, | 454,71, | 454,72, | 454,73, | 454,74, | 454,75, | 454,76, | 454,77, | 454,78, | 454,79, | 454,80, | 454,81, | 454,82, | 454,83, | 454,84, | 454,85, | 455,1, | 455,2, | 455,3, | 455,4, | 455,5, | 455,6, | 455,7, | 455,8, | 455,9, | 455,10, | 455,11, | 455,12, | 455,13, | 455,14, | 455,15, | 455,16, | 455,17, | 455,18, | 455,19, | 455,20, | 455,21, | 455,22, | 455,23, | 455,24, | 455,25, | 455,26, | 455,27, | 455,28, | 455,29, | 455,30, | 455,31, | 455,32, | 455,33, | 455,34, | 455,35, | 455,36, | 455,37, | 455,38, | 455,39, | 455,40, | 455,41, | 455,42, | 455,43, | 455,44, | 455,45, | 455,46, | 455,47, | 455,48, | 455,49, | 455,50, | 455,51, | 455,52, | 455,53, | 455,54, | 455,55, | 455,56, | 455,57, | 455,58, | 455,59, | 455,60, | 455,61, | 455,62, | 455,63, | 455,64, | 455,65, | 455,66, | 455,67, | 455,68, | 455,69, | 455,70, | 455,71, | 455,72, | 455,73, | 455,74, | 455,75, | 455,76, | 455,77, | 455,78, | 455,79, | 455,80, | 455,81, | 455,82, | 455,83, | 455,84, | 455,85, | 456,1, | 456,2, | 456,3, | 456,4, | 456,5, | 456,6, | 456,7, | 456,8, | 456,9, | 456,10, | 456,11, | 456,12, | 456,13, | 456,14, | 456,15, | 456,16, | 456,17, | 456,18, | 456,19, | 456,20, | 456,21, | 456,22, | 456,23, | 456,24, | 456,25, | 456,26, | 456,27, | 456,28, | 456,29, | 456,30, | 456,31, | 456,32, | 456,33, | 456,34, | 456,35, | 456,36, | 456,37, | 456,38, | 456,39, | 456,40, | 456,41, | 456,42, | 456,43, | 456,44, | 456,45, | 456,46, | 456,47, | 456,48, | 456,49, | 456,50, | 456,51, | 456,52, | 456,53, | 456,54, | 456,55, | 456,56, | 456,57, | 456,58, | 456,59, | 456,60, | 456,61, | 456,62, | 456,63, | 456,64, | 456,65, | 456,66, | 456,67, | 456,68, | 456,69, | 456,70, | 456,71, | 456,72, | 456,73, | 456,74, | 456,75, | 456,76, | 456,77, | 456,78, | 456,79, | 456,80, | 456,81, | 456,82, | 456,83, | 456,84, | 456,85, | 457,1, | 457,2, | 457,3, | 457,4, | 457,5, | 457,6, | 457,7, | 457,8, | 457,9, | 457,10, | 457,11, | 457,12, | 457,13, | 457,14, | 457,15, | 457,16, | 457,17, | 457,18, | 457,19, | 457,20, | 457,21, | 457,22, | 457,23, | 457,24, | 457,25, | 457,26, | 457,27, | 457,28, | 457,29, | 457,30, | 457,31, | 457,32, | 457,33, | 457,34, | 457,35, | 457,36, | 457,37, | 457,38, | 457,39, | 457,40, | 457,41, | 457,42, | 457,43, | 457,44, | 457,45, | 457,46, | 457,47, | 457,48, | 457,49, | 457,50, | 457,51, | 457,52, | 457,53, | 457,54, | 457,55, | 457,56, | 457,57, | 457,58, | 457,59, | 457,60, | 457,61, | 457,62, | 457,63, | 457,64, | 457,65, | 457,66, | 457,67, | 457,68, | 457,69, | 457,70, | 457,71, | 457,72, | 457,73, | 457,74, | 457,75, | 457,76, | 457,77, | 457,78, | 457,79, | 457,80, | 457,81, | 457,82, | 457,83, | 457,84, | 457,85, | 458,1, | 458,2, | 458,3, | 458,4, | 458,5, | 458,6, | 458,7, | 458,8, | 458,9, | 458,10, | 458,11, | 458,12, | 458,13, | 458,14, | 458,15, | 458,16, | 458,17, | 458,18, | 458,19, | 458,20, | 458,21, | 458,22, | 458,23, | 458,24, | 458,25, | 458,26, | 458,27, | 458,28, | 458,29, | 458,30, | 458,31, | 458,32, | 458,33, | 458,34, | 458,35, | 458,36, | 458,37, | 458,38, | 458,39, | 458,40, | 458,41, | 458,42, | 458,43, | 458,44, | 458,45, | 458,46, | 458,47, | 458,48, | 458,49, | 458,50, | 458,51, | 458,52, | 458,53, | 458,54, | 458,55, | 458,56, | 458,57, | 458,58, | 458,59, | 458,60, | 458,61, | 458,62, | 458,63, | 458,64, | 458,65, | 458,66, | 458,67, | 458,68, | 458,69, | 458,70, | 458,71, | 458,72, | 458,73, | 458,74, | 458,75, | 458,76, | 458,77, | 458,78, | 458,79, | 458,80, | 458,81, | 458,82, | 458,83, | 458,84, | 458,85, | 459,1, | 459,2, | 459,3, | 459,4, | 459,5, | 459,6, | 459,7, | 459,8, | 459,9, | 459,10, | 459,11, | 459,12, | 459,13, | 459,14, | 459,15, | 459,16, | 459,17, | 459,18, | 459,19, | 459,20, | 459,21, | 459,22, | 459,23, | 459,24, | 459,25, | 459,26, | 459,27, | 459,28, | 459,29, | 459,30, | 459,31, | 459,32, | 459,33, | 459,34, | 459,35, | 459,36, | 459,37, | 459,38, | 459,39, | 459,40, | 459,41, | 459,42, | 459,43, | 459,44, | 459,45, | 459,46, | 459,47, | 459,48, | 459,49, | 459,50, | 459,51, | 459,52, | 459,53, | 459,54, | 459,55, | 459,56, | 459,57, | 459,58, | 459,59, | 459,60, | 459,61, | 459,62, | 459,63, | 459,64, | 459,65, | 459,66, | 459,67, | 459,68, | 459,69, | 459,70, | 459,71, | 459,72, | 459,73, | 459,74, | 459,75, | 459,76, | 459,77, | 459,78, | 459,79, | 459,80, | 459,81, | 459,82, | 459,83, | 459,84, | 459,85, | 460,1, | 460,2, | 460,3, | 460,4, | 460,5, | 460,6, | 460,7, | 460,8, | 460,9, | 460,10, | 460,11, | 460,12, | 460,13, | 460,14, | 460,15, | 460,16, | 460,17, | 460,18, | 460,19, | 460,20, | 460,21, | 460,22, | 460,23, | 460,24, | 460,25, | 460,26, | 460,27, | 460,28, | 460,29, | 460,30, | 460,31, | 460,32, | 460,33, | 460,34, | 460,35, | 460,36, | 460,37, | 460,38, | 460,39, | 460,40, | 460,41, | 460,42, | 460,43, | 460,44, | 460,45, | 460,46, | 460,47, | 460,48, | 460,49, | 460,50, | 460,51, | 460,52, | 460,53, | 460,54, | 460,55, | 460,56, | 460,57, | 460,58, | 460,59, | 460,60, | 460,61, | 460,62, | 460,63, | 460,64, | 460,65, | 460,66, | 460,67, | 460,68, | 460,69, | 460,70, | 460,71, | 460,72, | 460,73, | 460,74, | 460,75, | 460,76, | 460,77, | 460,78, | 460,79, | 460,80, | 460,81, | 460,82, | 460,83, | 460,84, | 460,85, | 461,1, | 461,2, | 461,3, | 461,4, | 461,5, | 461,6, | 461,7, | 461,8, | 461,9, | 461,10, | 461,11, | 461,12, | 461,13, | 461,14, | 461,15, | 461,16, | 461,17, | 461,18, | 461,19, | 461,20, | 461,21, | 461,22, | 461,23, | 461,24, | 461,25, | 461,26, | 461,27, | 461,28, | 461,29, | 461,30, | 461,31, | 461,32, | 461,33, | 461,34, | 461,35, | 461,36, | 461,37, | 461,38, | 461,39, | 461,40, | 461,41, | 461,42, | 461,43, | 461,44, | 461,45, | 461,46, | 461,47, | 461,48, | 461,49, | 461,50, | 461,51, | 461,52, | 461,53, | 461,54, | 461,55, | 461,56, | 461,57, | 461,58, | 461,59, | 461,60, | 461,61, | 461,62, | 461,63, | 461,64, | 461,65, | 461,66, | 461,67, | 461,68, | 461,69, | 461,70, | 461,71, | 461,72, | 461,73, | 461,74, | 461,75, | 461,76, | 461,77, | 461,78, | 461,79, | 461,80, | 461,81, | 461,82, | 461,83, | 461,84, | 461,85, | 462,1, | 462,2, | 462,3, | 462,4, | 462,5, | 462,6, | 462,7, | 462,8, | 462,9, | 462,10, | 462,11, | 462,12, | 462,13, | 462,14, | 462,15, | 462,16, | 462,17, | 462,18, | 462,19, | 462,20, | 462,21, | 462,22, | 462,23, | 462,24, | 462,25, | 462,26, | 462,27, | 462,28, | 462,29, | 462,30, | 462,31, | 462,32, | 462,33, | 462,34, | 462,35, | 462,36, | 462,37, | 462,38, | 462,39, | 462,40, | 462,41, | 462,42, | 462,43, | 462,44, | 462,45, | 462,46, | 462,47, | 462,48, | 462,49, | 462,50, | 462,51, | 462,52, | 462,53, | 462,54, | 462,55, | 462,56, | 462,57, | 462,58, | 462,59, | 462,60, | 462,61, | 462,62, | 462,63, | 462,64, | 462,65, | 462,66, | 462,67, | 462,68, | 462,69, | 462,70, | 462,71, | 462,72, | 462,73, | 462,74, | 462,75, | 462,76, | 462,77, | 462,78, | 462,79, | 462,80, | 462,81, | 462,82, | 462,83, | 462,84, | 462,85, | 463,1, | 463,2, | 463,3, | 463,4, | 463,5, | 463,6, | 463,7, | 463,8, | 463,9, | 463,10, | 463,11, | 463,12, | 463,13, | 463,14, | 463,15, | 463,16, | 463,17, | 463,18, | 463,19, | 463,20, | 463,21, | 463,22, | 463,23, | 463,24, | 463,25, | 463,26, | 463,27, | 463,28, | 463,29, | 463,30, | 463,31, | 463,32, | 463,33, | 463,34, | 463,35, | 463,36, | 463,37, | 463,38, | 463,39, | 463,40, | 463,41, | 463,42, | 463,43, | 463,44, | 463,45, | 463,46, | 463,47, | 463,48, | 463,49, | 463,50, | 463,51, | 463,52, | 463,53, | 463,54, | 463,55, | 463,56, | 463,57, | 463,58, | 463,59, | 463,60, | 463,61, | 463,62, | 463,63, | 463,64, | 463,65, | 463,66, | 463,67, | 463,68, | 463,69, | 463,70, | 463,71, | 463,72, | 463,73, | 463,74, | 463,75, | 463,76, | 463,77, | 463,78, | 463,79, | 463,80, | 463,81, | 463,82, | 463,83, | 463,84, | 463,85, | 464,1, | 464,2, | 464,3, | 464,4, | 464,5, | 464,6, | 464,7, | 464,8, | 464,9, | 464,10, | 464,11, | 464,12, | 464,13, | 464,14, | 464,15, | 464,16, | 464,17, | 464,18, | 464,19, | 464,20, | 464,21, | 464,22, | 464,23, | 464,24, | 464,25, | 464,26, | 464,27, | 464,28, | 464,29, | 464,30, | 464,31, | 464,32, | 464,33, | 464,34, | 464,35, | 464,36, | 464,37, | 464,38, | 464,39, | 464,40, | 464,41, | 464,42, | 464,43, | 464,44, | 464,45, | 464,46, | 464,47, | 464,48, | 464,49, | 464,50, | 464,51, | 464,52, | 464,53, | 464,54, | 464,55, | 464,56, | 464,57, | 464,58, | 464,59, | 464,60, | 464,61, | 464,62, | 464,63, | 464,64, | 464,65, | 464,66, | 464,67, | 464,68, | 464,69, | 464,70, | 464,71, | 464,72, | 464,73, | 464,74, | 464,75, | 464,76, | 464,77, | 464,78, | 464,79, | 464,80, | 464,81, | 464,82, | 464,83, | 464,84, | 464,85, | 465,1, | 465,2, | 465,3, | 465,4, | 465,5, | 465,6, | 465,7, | 465,8, | 465,9, | 465,10, | 465,11, | 465,12, | 465,13, | 465,14, | 465,15, | 465,16, | 465,17, | 465,18, | 465,19, | 465,20, | 465,21, | 465,22, | 465,23, | 465,24, | 465,25, | 465,26, | 465,27, | 465,28, | 465,29, | 465,30, | 465,31, | 465,32, | 465,33, | 465,34, | 465,35, | 465,36, | 465,37, | 465,38, | 465,39, | 465,40, | 465,41, | 465,42, | 465,43, | 465,44, | 465,45, | 465,46, | 465,47, | 465,48, | 465,49, | 465,50, | 465,51, | 465,52, | 465,53, | 465,54, | 465,55, | 465,56, | 465,57, | 465,58, | 465,59, | 465,60, | 465,61, | 465,62, | 465,63, | 465,64, | 465,65, | 465,66, | 465,67, | 465,68, | 465,69, | 465,70, | 465,71, | 465,72, | 465,73, | 465,74, | 465,75, | 465,76, | 465,77, | 465,78, | 465,79, | 465,80, | 465,81, | 465,82, | 465,83, | 465,84, | 465,85, | 466,1, | 466,2, | 466,3, | 466,4, | 466,5, | 466,6, | 466,7, | 466,8, | 466,9, | 466,10, | 466,11, | 466,12, | 466,13, | 466,14, | 466,15, | 466,16, | 466,17, | 466,18, | 466,19, | 466,20, | 466,21, | 466,22, | 466,23, | 466,24, | 466,25, | 466,26, | 466,27, | 466,28, | 466,29, | 466,30, | 466,31, | 466,32, | 466,33, | 466,34, | 466,35, | 466,36, | 466,37, | 466,38, | 466,39, | 466,40, | 466,41, | 466,42, | 466,43, | 466,44, | 466,45, | 466,46, | 466,47, | 466,48, | 466,49, | 466,50, | 466,51, | 466,52, | 466,53, | 466,54, | 466,55, | 466,56, | 466,57, | 466,58, | 466,59, | 466,60, | 466,61, | 466,62, | 466,63, | 466,64, | 466,65, | 466,66, | 466,67, | 466,68, | 466,69, | 466,70, | 466,71, | 466,72, | 466,73, | 466,74, | 466,75, | 466,76, | 466,77, | 466,78, | 466,79, | 466,80, | 466,81, | 466,82, | 466,83, | 466,84, | 466,85, | 467,1, | 467,2, | 467,3, | 467,4, | 467,5, | 467,6, | 467,7, | 467,8, | 467,9, | 467,10, | 467,11, | 467,12, | 467,13, | 467,14, | 467,15, | 467,16, | 467,17, | 467,18, | 467,19, | 467,20, | 467,21, | 467,22, | 467,23, | 467,24, | 467,25, | 467,26, | 467,27, | 467,28, | 467,29, | 467,30, | 467,31, | 467,32, | 467,33, | 467,34, | 467,35, | 467,36, | 467,37, | 467,38, | 467,39, | 467,40, | 467,41, | 467,42, | 467,43, | 467,44, | 467,45, | 467,46, | 467,47, | 467,48, | 467,49, | 467,50, | 467,51, | 467,52, | 467,53, | 467,54, | 467,55, | 467,56, | 467,57, | 467,58, | 467,59, | 467,60, | 467,61, | 467,62, | 467,63, | 467,64, | 467,65, | 467,66, | 467,67, | 467,68, | 467,69, | 467,70, | 467,71, | 467,72, | 467,73, | 467,74, | 467,75, | 467,76, | 467,77, | 467,78, | 467,79, | 467,80, | 467,81, | 467,82, | 467,83, | 467,84, | 467,85, | 468,1, | 468,2, | 468,3, | 468,4, | 468,5, | 468,6, | 468,7, | 468,8, | 468,9, | 468,10, | 468,11, | 468,12, | 468,13, | 468,14, | 468,15, | 468,16, | 468,17, | 468,18, | 468,19, | 468,20, | 468,21, | 468,22, | 468,23, | 468,24, | 468,25, | 468,26, | 468,27, | 468,28, | 468,29, | 468,30, | 468,31, | 468,32, | 468,33, | 468,34, | 468,35, | 468,36, | 468,37, | 468,38, | 468,39, | 468,40, | 468,41, | 468,42, | 468,43, | 468,44, | 468,45, | 468,46, | 468,47, | 468,48, | 468,49, | 468,50, | 468,51, | 468,52, | 468,53, | 468,54, | 468,55, | 468,56, | 468,57, | 468,58, | 468,59, | 468,60, | 468,61, | 468,62, | 468,63, | 468,64, | 468,65, | 468,66, | 468,67, | 468,68, | 468,69, | 468,70, | 468,71, | 468,72, | 468,73, | 468,74, | 468,75, | 468,76, | 468,77, | 468,78, | 468,79, | 468,80, | 468,81, | 468,82, | 468,83, | 468,84, | 468,85, | 469,1, | 469,2, | 469,3, | 469,4, | 469,5, | 469,6, | 469,7, | 469,8, | 469,9, | 469,10, | 469,11, | 469,12, | 469,13, | 469,14, | 469,15, | 469,16, | 469,17, | 469,18, | 469,19, | 469,20, | 469,21, | 469,22, | 469,23, | 469,24, | 469,25, | 469,26, | 469,27, | 469,28, | 469,29, | 469,30, | 469,31, | 469,32, | 469,33, | 469,34, | 469,35, | 469,36, | 469,37, | 469,38, | 469,39, | 469,40, | 469,41, | 469,42, | 469,43, | 469,44, | 469,45, | 469,46, | 469,47, | 469,48, | 469,49, | 469,50, | 469,51, | 469,52, | 469,53, | 469,54, | 469,55, | 469,56, | 469,57, | 469,58, | 469,59, | 469,60, | 469,61, | 469,62, | 469,63, | 469,64, | 469,65, | 469,66, | 469,67, | 469,68, | 469,69, | 469,70, | 469,71, | 469,72, | 469,73, | 469,74, | 469,75, | 469,76, | 469,77, | 469,78, | 469,79, | 469,80, | 469,81, | 469,82, | 469,83, | 469,84, | 469,85, | 470,1, | 470,2, | 470,3, | 470,4, | 470,5, | 470,6, | 470,7, | 470,8, | 470,9, | 470,10, | 470,11, | 470,12, | 470,13, | 470,14, | 470,15, | 470,16, | 470,17, | 470,18, | 470,19, | 470,20, | 470,21, | 470,22, | 470,23, | 470,24, | 470,25, | 470,26, | 470,27, | 470,28, | 470,29, | 470,30, | 470,31, | 470,32, | 470,33, | 470,34, | 470,35, | 470,36, | 470,37, | 470,38, | 470,39, | 470,40, | 470,41, | 470,42, | 470,43, | 470,44, | 470,45, | 470,46, | 470,47, | 470,48, | 470,49, | 470,50, | 470,51, | 470,52, | 470,53, | 470,54, | 470,55, | 470,56, | 470,57, | 470,58, | 470,59, | 470,60, | 470,61, | 470,62, | 470,63, | 470,64, | 470,65, | 470,66, | 470,67, | 470,68, | 470,69, | 470,70, | 470,71, | 470,72, | 470,73, | 470,74, | 470,75, | 470,76, | 470,77, | 470,78, | 470,79, | 470,80, | 470,81, | 470,82, | 470,83, | 470,84, | 470,85, | 471,1, | 471,2, | 471,3, | 471,4, | 471,5, | 471,6, | 471,7, | 471,8, | 471,9, | 471,10, | 471,11, | 471,12, | 471,13, | 471,14, | 471,15, | 471,16, | 471,17, | 471,18, | 471,19, | 471,20, | 471,21, | 471,22, | 471,23, | 471,24, | 471,25, | 471,26, | 471,27, | 471,28, | 471,29, | 471,30, | 471,31, | 471,32, | 471,33, | 471,34, | 471,35, | 471,36, | 471,37, | 471,38, | 471,39, | 471,40, | 471,41, | 471,42, | 471,43, | 471,44, | 471,45, | 471,46, | 471,47, | 471,48, | 471,49, | 471,50, | 471,51, | 471,52, | 471,53, | 471,54, | 471,55, | 471,56, | 471,57, | 471,58, | 471,59, | 471,60, | 471,61, | 471,62, | 471,63, | 471,64, | 471,65, | 471,66, | 471,67, | 471,68, | 471,69, | 471,70, | 471,71, | 471,72, | 471,73, | 471,74, | 471,75, | 471,76, | 471,77, | 471,78, | 471,79, | 471,80, | 471,81, | 471,82, | 471,83, | 471,84, | 471,85, | 472,1, | 472,2, | 472,3, | 472,4, | 472,5, | 472,6, | 472,7, | 472,8, | 472,9, | 472,10, | 472,11, | 472,12, | 472,13, | 472,14, | 472,15, | 472,16, | 472,17, | 472,18, | 472,19, | 472,20, | 472,21, | 472,22, | 472,23, | 472,24, | 472,25, | 472,26, | 472,27, | 472,28, | 472,29, | 472,30, | 472,31, | 472,32, | 472,33, | 472,34, | 472,35, | 472,36, | 472,37, | 472,38, | 472,39, | 472,40, | 472,41, | 472,42, | 472,43, | 472,44, | 472,45, | 472,46, | 472,47, | 472,48, | 472,49, | 472,50, | 472,51, | 472,52, | 472,53, | 472,54, | 472,55, | 472,56, | 472,57, | 472,58, | 472,59, | 472,60, | 472,61, | 472,62, | 472,63, | 472,64, | 472,65, | 472,66, | 472,67, | 472,68, | 472,69, | 472,70, | 472,71, | 472,72, | 472,73, | 472,74, | 472,75, | 472,76, | 472,77, | 472,78, | 472,79, | 472,80, | 472,81, | 472,82, | 472,83, | 472,84, | 472,85, | 473,1, | 473,2, | 473,3, | 473,4, | 473,5, | 473,6, | 473,7, | 473,8, | 473,9, | 473,10, | 473,11, | 473,12, | 473,13, | 473,14, | 473,15, | 473,16, | 473,17, | 473,18, | 473,19, | 473,20, | 473,21, | 473,22, | 473,23, | 473,24, | 473,25, | 473,26, | 473,27, | 473,28, | 473,29, | 473,30, | 473,31, | 473,32, | 473,33, | 473,34, | 473,35, | 473,36, | 473,37, | 473,38, | 473,39, | 473,40, | 473,41, | 473,42, | 473,43, | 473,44, | 473,45, | 473,46, | 473,47, | 473,48, | 473,49, | 473,50, | 473,51, | 473,52, | 473,53, | 473,54, | 473,55, | 473,56, | 473,57, | 473,58, | 473,59, | 473,60, | 473,61, | 473,62, | 473,63, | 473,64, | 473,65, | 473,66, | 473,67, | 473,68, | 473,69, | 473,70, | 473,71, | 473,72, | 473,73, | 473,74, | 473,75, | 473,76, | 473,77, | 473,78, | 473,79, | 473,80, | 473,81, | 473,82, | 473,83, | 473,84, | 473,85, | 474,1, | 474,2, | 474,3, | 474,4, | 474,5, | 474,6, | 474,7, | 474,8, | 474,9, | 474,10, | 474,11, | 474,12, | 474,13, | 474,14, | 474,15, | 474,16, | 474,17, | 474,18, | 474,19, | 474,20, | 474,21, | 474,22, | 474,23, | 474,24, | 474,25, | 474,26, | 474,27, | 474,28, | 474,29, | 474,30, | 474,31, | 474,32, | 474,33, | 474,34, | 474,35, | 474,36, | 474,37, | 474,38, | 474,39, | 474,40, | 474,41, | 474,42, | 474,43, | 474,44, | 474,45, | 474,46, | 474,47, | 474,48, | 474,49, | 474,50, | 474,51, | 474,52, | 474,53, | 474,54, | 474,55, | 474,56, | 474,57, | 474,58, | 474,59, | 474,60, | 474,61, | 474,62, | 474,63, | 474,64, | 474,65, | 474,66, | 474,67, | 474,68, | 474,69, | 474,70, | 474,71, | 474,72, | 474,73, | 474,74, | 474,75, | 474,76, | 474,77, | 474,78, | 474,79, | 474,80, | 474,81, | 474,82, | 474,83, | 474,84, | 474,85, | 475,1, | 475,2, | 475,3, | 475,4, | 475,5, | 475,6, | 475,7, | 475,8, | 475,9, | 475,10, | 475,11, | 475,12, | 475,13, | 475,14, | 475,15, | 475,16, | 475,17, | 475,18, | 475,19, | 475,20, | 475,21, | 475,22, | 475,23, | 475,24, | 475,25, | 475,26, | 475,27, | 475,28, | 475,29, | 475,30, | 475,31, | 475,32, | 475,33, | 475,34, | 475,35, | 475,36, | 475,37, | 475,38, | 475,39, | 475,40, | 475,41, | 475,42, | 475,43, | 475,44, | 475,45, | 475,46, | 475,47, | 475,48, | 475,49, | 475,50, | 475,51, | 475,52, | 475,53, | 475,54, | 475,55, | 475,56, | 475,57, | 475,58, | 475,59, | 475,60, | 475,61, | 475,62, | 475,63, | 475,64, | 475,65, | 475,66, | 475,67, | 475,68, | 475,69, | 475,70, | 475,71, | 475,72, | 475,73, | 475,74, | 475,75, | 475,76, | 475,77, | 475,78, | 475,79, | 475,80, | 475,81, | 475,82, | 475,83, | 475,84, | 475,85, | 476,1, | 476,2, | 476,3, | 476,4, | 476,5, | 476,6, | 476,7, | 476,8, | 476,9, | 476,10, | 476,11, | 476,12, | 476,13, | 476,14, | 476,15, | 476,16, | 476,17, | 476,18, | 476,19, | 476,20, | 476,21, | 476,22, | 476,23, | 476,24, | 476,25, | 476,26, | 476,27, | 476,28, | 476,29, | 476,30, | 476,31, | 476,32, | 476,33, | 476,34, | 476,35, | 476,36, | 476,37, | 476,38, | 476,39, | 476,40, | 476,41, | 476,42, | 476,43, | 476,44, | 476,45, | 476,46, | 476,47, | 476,48, | 476,49, | 476,50, | 476,51, | 476,52, | 476,53, | 476,54, | 476,55, | 476,56, | 476,57, | 476,58, | 476,59, | 476,60, | 476,61, | 476,62, | 476,63, | 476,64, | 476,65, | 476,66, | 476,67, | 476,68, | 476,69, | 476,70, | 476,71, | 476,72, | 476,73, | 476,74, | 476,75, | 476,76, | 476,77, | 476,78, | 476,79, | 476,80, | 476,81, | 476,82, | 476,83, | 476,84, | 476,85, | 477,1, | 477,2, | 477,3, | 477,4, | 477,5, | 477,6, | 477,7, | 477,8, | 477,9, | 477,10, | 477,11, | 477,12, | 477,13, | 477,14, | 477,15, | 477,16, | 477,17, | 477,18, | 477,19, | 477,20, | 477,21, | 477,22, | 477,23, | 477,24, | 477,25, | 477,26, | 477,27, | 477,28, | 477,29, | 477,30, | 477,31, | 477,32, | 477,33, | 477,34, | 477,35, | 477,36, | 477,37, | 477,38, | 477,39, | 477,40, | 477,41, | 477,42, | 477,43, | 477,44, | 477,45, | 477,46, | 477,47, | 477,48, | 477,49, | 477,50, | 477,51, | 477,52, | 477,53, | 477,54, | 477,55, | 477,56, | 477,57, | 477,58, | 477,59, | 477,60, | 477,61, | 477,62, | 477,63, | 477,64, | 477,65, | 477,66, | 477,67, | 477,68, | 477,69, | 477,70, | 477,71, | 477,72, | 477,73, | 477,74, | 477,75, | 477,76, | 477,77, | 477,78, | 477,79, | 477,80, | 477,81, | 477,82, | 477,83, | 477,84, | 477,85, | 478,1, | 478,2, | 478,3, | 478,4, | 478,5, | 478,6, | 478,7, | 478,8, | 478,9, | 478,10, | 478,11, | 478,12, | 478,13, | 478,14, | 478,15, | 478,16, | 478,17, | 478,18, | 478,19, | 478,20, | 478,21, | 478,22, | 478,23, | 478,24, | 478,25, | 478,26, | 478,27, | 478,28, | 478,29, | 478,30, | 478,31, | 478,32, | 478,33, | 478,34, | 478,35, | 478,36, | 478,37, | 478,38, | 478,39, | 478,40, | 478,41, | 478,42, | 478,43, | 478,44, | 478,45, | 478,46, | 478,47, | 478,48, | 478,49, | 478,50, | 478,51, | 478,52, | 478,53, | 478,54, | 478,55, | 478,56, | 478,57, | 478,58, | 478,59, | 478,60, | 478,61, | 478,62, | 478,63, | 478,64, | 478,65, | 478,66, | 478,67, | 478,68, | 478,69, | 478,70, | 478,71, | 478,72, | 478,73, | 478,74, | 478,75, | 478,76, | 478,77, | 478,78, | 478,79, | 478,80, | 478,81, | 478,82, | 478,83, | 478,84, | 478,85, | 479,1, | 479,2, | 479,3, | 479,4, | 479,5, | 479,6, | 479,7, | 479,8, | 479,9, | 479,10, | 479,11, | 479,12, | 479,13, | 479,14, | 479,15, | 479,16, | 479,17, | 479,18, | 479,19, | 479,20, | 479,21, | 479,22, | 479,23, | 479,24, | 479,25, | 479,26, | 479,27, | 479,28, | 479,29, | 479,30, | 479,31, | 479,32, | 479,33, | 479,34, | 479,35, | 479,36, | 479,37, | 479,38, | 479,39, | 479,40, | 479,41, | 479,42, | 479,43, | 479,44, | 479,45, | 479,46, | 479,47, | 479,48, | 479,49, | 479,50, | 479,51, | 479,52, | 479,53, | 479,54, | 479,55, | 479,56, | 479,57, | 479,58, | 479,59, | 479,60, | 479,61, | 479,62, | 479,63, | 479,64, | 479,65, | 479,66, | 479,67, | 479,68, | 479,69, | 479,70, | 479,71, | 479,72, | 479,73, | 479,74, | 479,75, | 479,76, | 479,77, | 479,78, | 479,79, | 479,80, | 479,81, | 479,82, | 479,83, | 479,84, | 479,85, | 480,1, | 480,2, | 480,3, | 480,4, | 480,5, | 480,6, | 480,7, | 480,8, | 480,9, | 480,10, | 480,11, | 480,12, | 480,13, | 480,14, | 480,15, | 480,16, | 480,17, | 480,18, | 480,19, | 480,20, | 480,21, | 480,22, | 480,23, | 480,24, | 480,25, | 480,26, | 480,27, | 480,28, | 480,29, | 480,30, | 480,31, | 480,32, | 480,33, | 480,34, | 480,35, | 480,36, | 480,37, | 480,38, | 480,39, | 480,40, | 480,41, | 480,42, | 480,43, | 480,44, | 480,45, | 480,46, | 480,47, | 480,48, | 480,49, | 480,50, | 480,51, | 480,52, | 480,53, | 480,54, | 480,55, | 480,56, | 480,57, | 480,58, | 480,59, | 480,60, | 480,61, | 480,62, | 480,63, | 480,64, | 480,65, | 480,66, | 480,67, | 480,68, | 480,69, | 480,70, | 480,71, | 480,72, | 480,73, | 480,74, | 480,75, | 480,76, | 480,77, | 480,78, | 480,79, | 480,80, | 480,81, | 480,82, | 480,83, | 480,84, | 480,85, | 481,1, | 481,2, | 481,3, | 481,4, | 481,5, | 481,6, | 481,7, | 481,8, | 481,9, | 481,10, | 481,11, | 481,12, | 481,13, | 481,14, | 481,15, | 481,16, | 481,17, | 481,18, | 481,19, | 481,20, | 481,21, | 481,22, | 481,23, | 481,24, | 481,25, | 481,26, | 481,27, | 481,28, | 481,29, | 481,30, | 481,31, | 481,32, | 481,33, | 481,34, | 481,35, | 481,36, | 481,37, | 481,38, | 481,39, | 481,40, | 481,41, | 481,42, | 481,43, | 481,44, | 481,45, | 481,46, | 481,47, | 481,48, | 481,49, | 481,50, | 481,51, | 481,52, | 481,53, | 481,54, | 481,55, | 481,56, | 481,57, | 481,58, | 481,59, | 481,60, | 481,61, | 481,62, | 481,63, | 481,64, | 481,65, | 481,66, | 481,67, | 481,68, | 481,69, | 481,70, | 481,71, | 481,72, | 481,73, | 481,74, | 481,75, | 481,76, | 481,77, | 481,78, | 481,79, | 481,80, | 481,81, | 481,82, | 481,83, | 481,84, | 481,85, | 482,1, | 482,2, | 482,3, | 482,4, | 482,5, | 482,6, | 482,7, | 482,8, | 482,9, | 482,10, | 482,11, | 482,12, | 482,13, | 482,14, | 482,15, | 482,16, | 482,17, | 482,18, | 482,19, | 482,20, | 482,21, | 482,22, | 482,23, | 482,24, | 482,25, | 482,26, | 482,27, | 482,28, | 482,29, | 482,30, | 482,31, | 482,32, | 482,33, | 482,34, | 482,35, | 482,36, | 482,37, | 482,38, | 482,39, | 482,40, | 482,41, | 482,42, | 482,43, | 482,44, | 482,45, | 482,46, | 482,47, | 482,48, | 482,49, | 482,50, | 482,51, | 482,52, | 482,53, | 482,54, | 482,55, | 482,56, | 482,57, | 482,58, | 482,59, | 482,60, | 482,61, | 482,62, | 482,63, | 482,64, | 482,65, | 482,66, | 482,67, | 482,68, | 482,69, | 482,70, | 482,71, | 482,72, | 482,73, | 482,74, | 482,75, | 482,76, | 482,77, | 482,78, | 482,79, | 482,80, | 482,81, | 482,82, | 482,83, | 482,84, | 482,85, | 483,1, | 483,2, | 483,3, | 483,4, | 483,5, | 483,6, | 483,7, | 483,8, | 483,9, | 483,10, | 483,11, | 483,12, | 483,13, | 483,14, | 483,15, | 483,16, | 483,17, | 483,18, | 483,19, | 483,20, | 483,21, | 483,22, | 483,23, | 483,24, | 483,25, | 483,26, | 483,27, | 483,28, | 483,29, | 483,30, | 483,31, | 483,32, | 483,33, | 483,34, | 483,35, | 483,36, | 483,37, | 483,38, | 483,39, | 483,40, | 483,41, | 483,42, | 483,43, | 483,44, | 483,45, | 483,46, | 483,47, | 483,48, | 483,49, | 483,50, | 483,51, | 483,52, | 483,53, | 483,54, | 483,55, | 483,56, | 483,57, | 483,58, | 483,59, | 483,60, | 483,61, | 483,62, | 483,63, | 483,64, | 483,65, | 483,66, | 483,67, | 483,68, | 483,69, | 483,70, | 483,71, | 483,72, | 483,73, | 483,74, | 483,75, | 483,76, | 483,77, | 483,78, | 483,79, | 483,80, | 483,81, | 483,82, | 483,83, | 483,84, | 483,85, | 484,1, | 484,2, | 484,3, | 484,4, | 484,5, | 484,6, | 484,7, | 484,8, | 484,9, | 484,10, | 484,11, | 484,12, | 484,13, | 484,14, | 484,15, | 484,16, | 484,17, | 484,18, | 484,19, | 484,20, | 484,21, | 484,22, | 484,23, | 484,24, | 484,25, | 484,26, | 484,27, | 484,28, | 484,29, | 484,30, | 484,31, | 484,32, | 484,33, | 484,34, | 484,35, | 484,36, | 484,37, | 484,38, | 484,39, | 484,40, | 484,41, | 484,42, | 484,43, | 484,44, | 484,45, | 484,46, | 484,47, | 484,48, | 484,49, | 484,50, | 484,51, | 484,52, | 484,53, | 484,54, | 484,55, | 484,56, | 484,57, | 484,58, | 484,59, | 484,60, | 484,61, | 484,62, | 484,63, | 484,64, | 484,65, | 484,66, | 484,67, | 484,68, | 484,69, | 484,70, | 484,71, | 484,72, | 484,73, | 484,74, | 484,75, | 484,76, | 484,77, | 484,78, | 484,79, | 484,80, | 484,81, | 484,82, | 484,83, | 484,84, | 484,85, | 485,1, | 485,2, | 485,3, | 485,4, | 485,5, | 485,6, | 485,7, | 485,8, | 485,9, | 485,10, | 485,11, | 485,12, | 485,13, | 485,14, | 485,15, | 485,16, | 485,17, | 485,18, | 485,19, | 485,20, | 485,21, | 485,22, | 485,23, | 485,24, | 485,25, | 485,26, | 485,27, | 485,28, | 485,29, | 485,30, | 485,31, | 485,32, | 485,33, | 485,34, | 485,35, | 485,36, | 485,37, | 485,38, | 485,39, | 485,40, | 485,41, | 485,42, | 485,43, | 485,44, | 485,45, | 485,46, | 485,47, | 485,48, | 485,49, | 485,50, | 485,51, | 485,52, | 485,53, | 485,54, | 485,55, | 485,56, | 485,57, | 485,58, | 485,59, | 485,60, | 485,61, | 485,62, | 485,63, | 485,64, | 485,65, | 485,66, | 485,67, | 485,68, | 485,69, | 485,70, | 485,71, | 485,72, | 485,73, | 485,74, | 485,75, | 485,76, | 485,77, | 485,78, | 485,79, | 485,80, | 485,81, | 485,82, | 485,83, | 485,84, | 485,85, | 486,1, | 486,2, | 486,3, | 486,4, | 486,5, | 486,6, | 486,7, | 486,8, | 486,9, | 486,10, | 486,11, | 486,12, | 486,13, | 486,14, | 486,15, | 486,16, | 486,17, | 486,18, | 486,19, | 486,20, | 486,21, | 486,22, | 486,23, | 486,24, | 486,25, | 486,26, | 486,27, | 486,28, | 486,29, | 486,30, | 486,31, | 486,32, | 486,33, | 486,34, | 486,35, | 486,36, | 486,37, | 486,38, | 486,39, | 486,40, | 486,41, | 486,42, | 486,43, | 486,44, | 486,45, | 486,46, | 486,47, | 486,48, | 486,49, | 486,50, | 486,51, | 486,52, | 486,53, | 486,54, | 486,55, | 486,56, | 486,57, | 486,58, | 486,59, | 486,60, | 486,61, | 486,62, | 486,63, | 486,64, | 486,65, | 486,66, | 486,67, | 486,68, | 486,69, | 486,70, | 486,71, | 486,72, | 486,73, | 486,74, | 486,75, | 486,76, | 486,77, | 486,78, | 486,79, | 486,80, | 486,81, | 486,82, | 486,83, | 486,84, | 486,85, | 487,1, | 487,2, | 487,3, | 487,4, | 487,5, | 487,6, | 487,7, | 487,8, | 487,9, | 487,10, | 487,11, | 487,12, | 487,13, | 487,14, | 487,15, | 487,16, | 487,17, | 487,18, | 487,19, | 487,20, | 487,21, | 487,22, | 487,23, | 487,24, | 487,25, | 487,26, | 487,27, | 487,28, | 487,29, | 487,30, | 487,31, | 487,32, | 487,33, | 487,34, | 487,35, | 487,36, | 487,37, | 487,38, | 487,39, | 487,40, | 487,41, | 487,42, | 487,43, | 487,44, | 487,45, | 487,46, | 487,47, | 487,48, | 487,49, | 487,50, | 487,51, | 487,52, | 487,53, | 487,54, | 487,55, | 487,56, | 487,57, | 487,58, | 487,59, | 487,60, | 487,61, | 487,62, | 487,63, | 487,64, | 487,65, | 487,66, | 487,67, | 487,68, | 487,69, | 487,70, | 487,71, | 487,72, | 487,73, | 487,74, | 487,75, | 487,76, | 487,77, | 487,78, | 487,79, | 487,80, | 487,81, | 487,82, | 487,83, | 487,84, | 487,85, | 488,1, | 488,2, | 488,3, | 488,4, | 488,5, | 488,6, | 488,7, | 488,8, | 488,9, | 488,10, | 488,11, | 488,12, | 488,13, | 488,14, | 488,15, | 488,16, | 488,17, | 488,18, | 488,19, | 488,20, | 488,21, | 488,22, | 488,23, | 488,24, | 488,25, | 488,26, | 488,27, | 488,28, | 488,29, | 488,30, | 488,31, | 488,32, | 488,33, | 488,34, | 488,35, | 488,36, | 488,37, | 488,38, | 488,39, | 488,40, | 488,41, | 488,42, | 488,43, | 488,44, | 488,45, | 488,46, | 488,47, | 488,48, | 488,49, | 488,50, | 488,51, | 488,52, | 488,53, | 488,54, | 488,55, | 488,56, | 488,57, | 488,58, | 488,59, | 488,60, | 488,61, | 488,62, | 488,63, | 488,64, | 488,65, | 488,66, | 488,67, | 488,68, | 488,69, | 488,70, | 488,71, | 488,72, | 488,73, | 488,74, | 488,75, | 488,76, | 488,77, | 488,78, | 488,79, | 488,80, | 488,81, | 488,82, | 488,83, | 488,84, | 488,85, | 489,1, | 489,2, | 489,3, | 489,4, | 489,5, | 489,6, | 489,7, | 489,8, | 489,9, | 489,10, | 489,11, | 489,12, | 489,13, | 489,14, | 489,15, | 489,16, | 489,17, | 489,18, | 489,19, | 489,20, | 489,21, | 489,22, | 489,23, | 489,24, | 489,25, | 489,26, | 489,27, | 489,28, | 489,29, | 489,30, | 489,31, | 489,32, | 489,33, | 489,34, | 489,35, | 489,36, | 489,37, | 489,38, | 489,39, | 489,40, | 489,41, | 489,42, | 489,43, | 489,44, | 489,45, | 489,46, | 489,47, | 489,48, | 489,49, | 489,50, | 489,51, | 489,52, | 489,53, | 489,54, | 489,55, | 489,56, | 489,57, | 489,58, | 489,59, | 489,60, | 489,61, | 489,62, | 489,63, | 489,64, | 489,65, | 489,66, | 489,67, | 489,68, | 489,69, | 489,70, | 489,71, | 489,72, | 489,73, | 489,74, | 489,75, | 489,76, | 489,77, | 489,78, | 489,79, | 489,80, | 489,81, | 489,82, | 489,83, | 489,84, | 489,85, | 490,1, | 490,2, | 490,3, | 490,4, | 490,5, | 490,6, | 490,7, | 490,8, | 490,9, | 490,10, | 490,11, | 490,12, | 490,13, | 490,14, | 490,15, | 490,16, | 490,17, | 490,18, | 490,19, | 490,20, | 490,21, | 490,22, | 490,23, | 490,24, | 490,25, | 490,26, | 490,27, | 490,28, | 490,29, | 490,30, | 490,31, | 490,32, | 490,33, | 490,34, | 490,35, | 490,36, | 490,37, | 490,38, | 490,39, | 490,40, | 490,41, | 490,42, | 490,43, | 490,44, | 490,45, | 490,46, | 490,47, | 490,48, | 490,49, | 490,50, | 490,51, | 490,52, | 490,53, | 490,54, | 490,55, | 490,56, | 490,57, | 490,58, | 490,59, | 490,60, | 490,61, | 490,62, | 490,63, | 490,64, | 490,65, | 490,66, | 490,67, | 490,68, | 490,69, | 490,70, | 490,71, | 490,72, | 490,73, | 490,74, | 490,75, | 490,76, | 490,77, | 490,78, | 490,79, | 490,80, | 490,81, | 490,82, | 490,83, | 490,84, | 490,85, | 491,1, | 491,2, | 491,3, | 491,4, | 491,5, | 491,6, | 491,7, | 491,8, | 491,9, | 491,10, | 491,11, | 491,12, | 491,13, | 491,14, | 491,15, | 491,16, | 491,17, | 491,18, | 491,19, | 491,20, | 491,21, | 491,22, | 491,23, | 491,24, | 491,25, | 491,26, | 491,27, | 491,28, | 491,29, | 491,30, | 491,31, | 491,32, | 491,33, | 491,34, | 491,35, | 491,36, | 491,37, | 491,38, | 491,39, | 491,40, | 491,41, | 491,42, | 491,43, | 491,44, | 491,45, | 491,46, | 491,47, | 491,48, | 491,49, | 491,50, | 491,51, | 491,52, | 491,53, | 491,54, | 491,55, | 491,56, | 491,57, | 491,58, | 491,59, | 491,60, | 491,61, | 491,62, | 491,63, | 491,64, | 491,65, | 491,66, | 491,67, | 491,68, | 491,69, | 491,70, | 491,71, | 491,72, | 491,73, | 491,74, | 491,75, | 491,76, | 491,77, | 491,78, | 491,79, | 491,80, | 491,81, | 491,82, | 491,83, | 491,84, | 491,85, | 492,1, | 492,2, | 492,3, | 492,4, | 492,5, | 492,6, | 492,7, | 492,8, | 492,9, | 492,10, | 492,11, | 492,12, | 492,13, | 492,14, | 492,15, | 492,16, | 492,17, | 492,18, | 492,19, | 492,20, | 492,21, | 492,22, | 492,23, | 492,24, | 492,25, | 492,26, | 492,27, | 492,28, | 492,29, | 492,30, | 492,31, | 492,32, | 492,33, | 492,34, | 492,35, | 492,36, | 492,37, | 492,38, | 492,39, | 492,40, | 492,41, | 492,42, | 492,43, | 492,44, | 492,45, | 492,46, | 492,47, | 492,48, | 492,49, | 492,50, | 492,51, | 492,52, | 492,53, | 492,54, | 492,55, | 492,56, | 492,57, | 492,58, | 492,59, | 492,60, | 492,61, | 492,62, | 492,63, | 492,64, | 492,65, | 492,66, | 492,67, | 492,68, | 492,69, | 492,70, | 492,71, | 492,72, | 492,73, | 492,74, | 492,75, | 492,76, | 492,77, | 492,78, | 492,79, | 492,80, | 492,81, | 492,82, | 492,83, | 492,84, | 492,85, | 493,1, | 493,2, | 493,3, | 493,4, | 493,5, | 493,6, | 493,7, | 493,8, | 493,9, | 493,10, | 493,11, | 493,12, | 493,13, | 493,14, | 493,15, | 493,16, | 493,17, | 493,18, | 493,19, | 493,20, | 493,21, | 493,22, | 493,23, | 493,24, | 493,25, | 493,26, | 493,27, | 493,28, | 493,29, | 493,30, | 493,31, | 493,32, | 493,33, | 493,34, | 493,35, | 493,36, | 493,37, | 493,38, | 493,39, | 493,40, | 493,41, | 493,42, | 493,43, | 493,44, | 493,45, | 493,46, | 493,47, | 493,48, | 493,49, | 493,50, | 493,51, | 493,52, | 493,53, | 493,54, | 493,55, | 493,56, | 493,57, | 493,58, | 493,59, | 493,60, | 493,61, | 493,62, | 493,63, | 493,64, | 493,65, | 493,66, | 493,67, | 493,68, | 493,69, | 493,70, | 493,71, | 493,72, | 493,73, | 493,74, | 493,75, | 493,76, | 493,77, | 493,78, | 493,79, | 493,80, | 493,81, | 493,82, | 493,83, | 493,84, | 493,85, | 494,1, | 494,2, | 494,3, | 494,4, | 494,5, | 494,6, | 494,7, | 494,8, | 494,9, | 494,10, | 494,11, | 494,12, | 494,13, | 494,14, | 494,15, | 494,16, | 494,17, | 494,18, | 494,19, | 494,20, | 494,21, | 494,22, | 494,23, | 494,24, | 494,25, | 494,26, | 494,27, | 494,28, | 494,29, | 494,30, | 494,31, | 494,32, | 494,33, | 494,34, | 494,35, | 494,36, | 494,37, | 494,38, | 494,39, | 494,40, | 494,41, | 494,42, | 494,43, | 494,44, | 494,45, | 494,46, | 494,47, | 494,48, | 494,49, | 494,50, | 494,51, | 494,52, | 494,53, | 494,54, | 494,55, | 494,56, | 494,57, | 494,58, | 494,59, | 494,60, | 494,61, | 494,62, | 494,63, | 494,64, | 494,65, | 494,66, | 494,67, | 494,68, | 494,69, | 494,70, | 494,71, | 494,72, | 494,73, | 494,74, | 494,75, | 494,76, | 494,77, | 494,78, | 494,79, | 494,80, | 494,81, | 494,82, | 494,83, | 494,84, | 494,85, | 495,1, | 495,2, | 495,3, | 495,4, | 495,5, | 495,6, | 495,7, | 495,8, | 495,9, | 495,10, | 495,11, | 495,12, | 495,13, | 495,14, | 495,15, | 495,16, | 495,17, | 495,18, | 495,19, | 495,20, | 495,21, | 495,22, | 495,23, | 495,24, | 495,25, | 495,26, | 495,27, | 495,28, | 495,29, | 495,30, | 495,31, | 495,32, | 495,33, | 495,34, | 495,35, | 495,36, | 495,37, | 495,38, | 495,39, | 495,40, | 495,41, | 495,42, | 495,43, | 495,44, | 495,45, | 495,46, | 495,47, | 495,48, | 495,49, | 495,50, | 495,51, | 495,52, | 495,53, | 495,54, | 495,55, | 495,56, | 495,57, | 495,58, | 495,59, | 495,60, | 495,61, | 495,62, | 495,63, | 495,64, | 495,65, | 495,66, | 495,67, | 495,68, | 495,69, | 495,70, | 495,71, | 495,72, | 495,73, | 495,74, | 495,75, | 495,76, | 495,77, | 495,78, | 495,79, | 495,80, | 495,81, | 495,82, | 495,83, | 495,84, | 495,85, | 496,1, | 496,2, | 496,3, | 496,4, | 496,5, | 496,6, | 496,7, | 496,8, | 496,9, | 496,10, | 496,11, | 496,12, | 496,13, | 496,14, | 496,15, | 496,16, | 496,17, | 496,18, | 496,19, | 496,20, | 496,21, | 496,22, | 496,23, | 496,24, | 496,25, | 496,26, | 496,27, | 496,28, | 496,29, | 496,30, | 496,31, | 496,32, | 496,33, | 496,34, | 496,35, | 496,36, | 496,37, | 496,38, | 496,39, | 496,40, | 496,41, | 496,42, | 496,43, | 496,44, | 496,45, | 496,46, | 496,47, | 496,48, | 496,49, | 496,50, | 496,51, | 496,52, | 496,53, | 496,54, | 496,55, | 496,56, | 496,57, | 496,58, | 496,59, | 496,60, | 496,61, | 496,62, | 496,63, | 496,64, | 496,65, | 496,66, | 496,67, | 496,68, | 496,69, | 496,70, | 496,71, | 496,72, | 496,73, | 496,74, | 496,75, | 496,76, | 496,77, | 496,78, | 496,79, | 496,80, | 496,81, | 496,82, | 496,83, | 496,84, | 496,85, | 497,1, | 497,2, | 497,3, | 497,4, | 497,5, | 497,6, | 497,7, | 497,8, | 497,9, | 497,10, | 497,11, | 497,12, | 497,13, | 497,14, | 497,15, | 497,16, | 497,17, | 497,18, | 497,19, | 497,20, | 497,21, | 497,22, | 497,23, | 497,24, | 497,25, | 497,26, | 497,27, | 497,28, | 497,29, | 497,30, | 497,31, | 497,32, | 497,33, | 497,34, | 497,35, | 497,36, | 497,37, | 497,38, | 497,39, | 497,40, | 497,41, | 497,42, | 497,43, | 497,44, | 497,45, | 497,46, | 497,47, | 497,48, | 497,49, | 497,50, | 497,51, | 497,52, | 497,53, | 497,54, | 497,55, | 497,56, | 497,57, | 497,58, | 497,59, | 497,60, | 497,61, | 497,62, | 497,63, | 497,64, | 497,65, | 497,66, | 497,67, | 497,68, | 497,69, | 497,70, | 497,71, | 497,72, | 497,73, | 497,74, | 497,75, | 497,76, | 497,77, | 497,78, | 497,79, | 497,80, | 497,81, | 497,82, | 497,83, | 497,84, | 497,85, | 498,1, | 498,2, | 498,3, | 498,4, | 498,5, | 498,6, | 498,7, | 498,8, | 498,9, | 498,10, | 498,11, | 498,12, | 498,13, | 498,14, | 498,15, | 498,16, | 498,17, | 498,18, | 498,19, | 498,20, | 498,21, | 498,22, | 498,23, | 498,24, | 498,25, | 498,26, | 498,27, | 498,28, | 498,29, | 498,30, | 498,31, | 498,32, | 498,33, | 498,34, | 498,35, | 498,36, | 498,37, | 498,38, | 498,39, | 498,40, | 498,41, | 498,42, | 498,43, | 498,44, | 498,45, | 498,46, | 498,47, | 498,48, | 498,49, | 498,50, | 498,51, | 498,52, | 498,53, | 498,54, | 498,55, | 498,56, | 498,57, | 498,58, | 498,59, | 498,60, | 498,61, | 498,62, | 498,63, | 498,64, | 498,65, | 498,66, | 498,67, | 498,68, | 498,69, | 498,70, | 498,71, | 498,72, | 498,73, | 498,74, | 498,75, | 498,76, | 498,77, | 498,78, | 498,79, | 498,80, | 498,81, | 498,82, | 498,83, | 498,84, | 498,85, | 499,1, | 499,2, | 499,3, | 499,4, | 499,5, | 499,6, | 499,7, | 499,8, | 499,9, | 499,10, | 499,11, | 499,12, | 499,13, | 499,14, | 499,15, | 499,16, | 499,17, | 499,18, | 499,19, | 499,20, | 499,21, | 499,22, | 499,23, | 499,24, | 499,25, | 499,26, | 499,27, | 499,28, | 499,29, | 499,30, | 499,31, | 499,32, | 499,33, | 499,34, | 499,35, | 499,36, | 499,37, | 499,38, | 499,39, | 499,40, | 499,41, | 499,42, | 499,43, | 499,44, | 499,45, | 499,46, | 499,47, | 499,48, | 499,49, | 499,50, | 499,51, | 499,52, | 499,53, | 499,54, | 499,55, | 499,56, | 499,57, | 499,58, | 499,59, | 499,60, | 499,61, | 499,62, | 499,63, | 499,64, | 499,65, | 499,66, | 499,67, | 499,68, | 499,69, | 499,70, | 499,71, | 499,72, | 499,73, | 499,74, | 499,75, | 499,76, | 499,77, | 499,78, | 499,79, | 499,80, | 499,81, | 499,82, | 499,83, | 499,84, | 499,85, | 500,1, | 500,2, | 500,3, | 500,4, | 500,5, | 500,6, | 500,7, | 500,8, | 500,9, | 500,10, | 500,11, | 500,12, | 500,13, | 500,14, | 500,15, | 500,16, | 500,17, | 500,18, | 500,19, | 500,20, | 500,21, | 500,22, | 500,23, | 500,24, | 500,25, | 500,26, | 500,27, | 500,28, | 500,29, | 500,30, | 500,31, | 500,32, | 500,33, | 500,34, | 500,35, | 500,36, | 500,37, | 500,38, | 500,39, | 500,40, | 500,41, | 500,42, | 500,43, | 500,44, | 500,45, | 500,46, | 500,47, | 500,48, | 500,49, | 500,50, | 500,51, | 500,52, | 500,53, | 500,54, | 500,55, | 500,56, | 500,57, | 500,58, | 500,59, | 500,60, | 500,61, | 500,62, | 500,63, | 500,64, | 500,65, | 500,66, | 500,67, | 500,68, | 500,69, | 500,70, | 500,71, | 500,72, | 500,73, | 500,74, | 500,75, | 500,76, | 500,77, | 500,78, | 500,79, | 500,80, | 500,81, | 500,82, | 500,83, | 500,84, | 500,85, | 501,1, | 501,2, | 501,3, | 501,4, | 501,5, | 501,6, | 501,7, | 501,8, | 501,9, | 501,10, | 501,11, | 501,12, | 501,13, | 501,14, | 501,15, | 501,16, | 501,17, | 501,18, | 501,19, | 501,20, | 501,21, | 501,22, | 501,23, | 501,24, | 501,25, | 501,26, | 501,27, | 501,28, | 501,29, | 501,30, | 501,31, | 501,32, | 501,33, | 501,34, | 501,35, | 501,36, | 501,37, | 501,38, | 501,39, | 501,40, | 501,41, | 501,42, | 501,43, | 501,44, | 501,45, | 501,46, | 501,47, | 501,48, | 501,49, | 501,50, | 501,51, | 501,52, | 501,53, | 501,54, | 501,55, | 501,56, | 501,57, | 501,58, | 501,59, | 501,60, | 501,61, | 501,62, | 501,63, | 501,64, | 501,65, | 501,66, | 501,67, | 501,68, | 501,69, | 501,70, | 501,71, | 501,72, | 501,73, | 501,74, | 501,75, | 501,76, | 501,77, | 501,78, | 501,79, | 501,80, | 501,81, | 501,82, | 501,83, | 501,84, | 501,85, | 502,1, | 502,2, | 502,3, | 502,4, | 502,5, | 502,6, | 502,7, | 502,8, | 502,9, | 502,10, | 502,11, | 502,12, | 502,13, | 502,14, | 502,15, | 502,16, | 502,17, | 502,18, | 502,19, | 502,20, | 502,21, | 502,22, | 502,23, | 502,24, | 502,25, | 502,26, | 502,27, | 502,28, | 502,29, | 502,30, | 502,31, | 502,32, | 502,33, | 502,34, | 502,35, | 502,36, | 502,37, | 502,38, | 502,39, | 502,40, | 502,41, | 502,42, | 502,43, | 502,44, | 502,45, | 502,46, | 502,47, | 502,48, | 502,49, | 502,50, | 502,51, | 502,52, | 502,53, | 502,54, | 502,55, | 502,56, | 502,57, | 502,58, | 502,59, | 502,60, | 502,61, | 502,62, | 502,63, | 502,64, | 502,65, | 502,66, | 502,67, | 502,68, | 502,69, | 502,70, | 502,71, | 502,72, | 502,73, | 502,74, | 502,75, | 502,76, | 502,77, | 502,78, | 502,79, | 502,80, | 502,81, | 502,82, | 502,83, | 502,84, | 502,85, | 503,1, | 503,2, | 503,3, | 503,4, | 503,5, | 503,6, | 503,7, | 503,8, | 503,9, | 503,10, | 503,11, | 503,12, | 503,13, | 503,14, | 503,15, | 503,16, | 503,17, | 503,18, | 503,19, | 503,20, | 503,21, | 503,22, | 503,23, | 503,24, | 503,25, | 503,26, | 503,27, | 503,28, | 503,29, | 503,30, | 503,31, | 503,32, | 503,33, | 503,34, | 503,35, | 503,36, | 503,37, | 503,38, | 503,39, | 503,40, | 503,41, | 503,42, | 503,43, | 503,44, | 503,45, | 503,46, | 503,47, | 503,48, | 503,49, | 503,50, | 503,51, | 503,52, | 503,53, | 503,54, | 503,55, | 503,56, | 503,57, | 503,58, | 503,59, | 503,60, | 503,61, | 503,62, | 503,63, | 503,64, | 503,65, | 503,66, | 503,67, | 503,68, | 503,69, | 503,70, | 503,71, | 503,72, | 503,73, | 503,74, | 503,75, | 503,76, | 503,77, | 503,78, | 503,79, | 503,80, | 503,81, | 503,82, | 503,83, | 503,84, | 503,85, | 504,1, | 504,2, | 504,3, | 504,4, | 504,5, | 504,6, | 504,7, | 504,8, | 504,9, | 504,10, | 504,11, | 504,12, | 504,13, | 504,14, | 504,15, | 504,16, | 504,17, | 504,18, | 504,19, | 504,20, | 504,21, | 504,22, | 504,23, | 504,24, | 504,25, | 504,26, | 504,27, | 504,28, | 504,29, | 504,30, | 504,31, | 504,32, | 504,33, | 504,34, | 504,35, | 504,36, | 504,37, | 504,38, | 504,39, | 504,40, | 504,41, | 504,42, | 504,43, | 504,44, | 504,45, | 504,46, | 504,47, | 504,48, | 504,49, | 504,50, | 504,51, | 504,52, | 504,53, | 504,54, | 504,55, | 504,56, | 504,57, | 504,58, | 504,59, | 504,60, | 504,61, | 504,62, | 504,63, | 504,64, | 504,65, | 504,66, | 504,67, | 504,68, | 504,69, | 504,70, | 504,71, | 504,72, | 504,73, | 504,74, | 504,75, | 504,76, | 504,77, | 504,78, | 504,79, | 504,80, | 504,81, | 504,82, | 504,83, | 504,84, | 504,85, | 505,1, | 505,2, | 505,3, | 505,4, | 505,5, | 505,6, | 505,7, | 505,8, | 505,9, | 505,10, | 505,11, | 505,12, | 505,13, | 505,14, | 505,15, | 505,16, | 505,17, | 505,18, | 505,19, | 505,20, | 505,21, | 505,22, | 505,23, | 505,24, | 505,25, | 505,26, | 505,27, | 505,28, | 505,29, | 505,30, | 505,31, | 505,32, | 505,33, | 505,34, | 505,35, | 505,36, | 505,37, | 505,38, | 505,39, | 505,40, | 505,41, | 505,42, | 505,43, | 505,44, | 505,45, | 505,46, | 505,47, | 505,48, | 505,49, | 505,50, | 505,51, | 505,52, | 505,53, | 505,54, | 505,55, | 505,56, | 505,57, | 505,58, | 505,59, | 505,60, | 505,61, | 505,62, | 505,63, | 505,64, | 505,65, | 505,66, | 505,67, | 505,68, | 505,69, | 505,70, | 505,71, | 505,72, | 505,73, | 505,74, | 505,75, | 505,76, | 505,77, | 505,78, | 505,79, | 505,80, | 505,81, | 505,82, | 505,83, | 505,84, | 505,85, | 506,1, | 506,2, | 506,3, | 506,4, | 506,5, | 506,6, | 506,7, | 506,8, | 506,9, | 506,10, | 506,11, | 506,12, | 506,13, | 506,14, | 506,15, | 506,16, | 506,17, | 506,18, | 506,19, | 506,20, | 506,21, | 506,22, | 506,23, | 506,24, | 506,25, | 506,26, | 506,27, | 506,28, | 506,29, | 506,30, | 506,31, | 506,32, | 506,33, | 506,34, | 506,35, | 506,36, | 506,37, | 506,38, | 506,39, | 506,40, | 506,41, | 506,42, | 506,43, | 506,44, | 506,45, | 506,46, | 506,47, | 506,48, | 506,49, | 506,50, | 506,51, | 506,52, | 506,53, | 506,54, | 506,55, | 506,56, | 506,57, | 506,58, | 506,59, | 506,60, | 506,61, | 506,62, | 506,63, | 506,64, | 506,65, | 506,66, | 506,67, | 506,68, | 506,69, | 506,70, | 506,71, | 506,72, | 506,73, | 506,74, | 506,75, | 506,76, | 506,77, | 506,78, | 506,79, | 506,80, | 506,81, | 506,82, | 506,83, | 506,84, | 506,85, | 507,1, | 507,2, | 507,3, | 507,4, | 507,5, | 507,6, | 507,7, | 507,8, | 507,9, | 507,10, | 507,11, | 507,12, | 507,13, | 507,14, | 507,15, | 507,16, | 507,17, | 507,18, | 507,19, | 507,20, | 507,21, | 507,22, | 507,23, | 507,24, | 507,25, | 507,26, | 507,27, | 507,28, | 507,29, | 507,30, | 507,31, | 507,32, | 507,33, | 507,34, | 507,35, | 507,36, | 507,37, | 507,38, | 507,39, | 507,40, | 507,41, | 507,42, | 507,43, | 507,44, | 507,45, | 507,46, | 507,47, | 507,48, | 507,49, | 507,50, | 507,51, | 507,52, | 507,53, | 507,54, | 507,55, | 507,56, | 507,57, | 507,58, | 507,59, | 507,60, | 507,61, | 507,62, | 507,63, | 507,64, | 507,65, | 507,66, | 507,67, | 507,68, | 507,69, | 507,70, | 507,71, | 507,72, | 507,73, | 507,74, | 507,75, | 507,76, | 507,77, | 507,78, | 507,79, | 507,80, | 507,81, | 507,82, | 507,83, | 507,84, | 507,85, | 508,1, | 508,2, | 508,3, | 508,4, | 508,5, | 508,6, | 508,7, | 508,8, | 508,9, | 508,10, | 508,11, | 508,12, | 508,13, | 508,14, | 508,15, | 508,16, | 508,17, | 508,18, | 508,19, | 508,20, | 508,21, | 508,22, | 508,23, | 508,24, | 508,25, | 508,26, | 508,27, | 508,28, | 508,29, | 508,30, | 508,31, | 508,32, | 508,33, | 508,34, | 508,35, | 508,36, | 508,37, | 508,38, | 508,39, | 508,40, | 508,41, | 508,42, | 508,43, | 508,44, | 508,45, | 508,46, | 508,47, | 508,48, | 508,49, | 508,50, | 508,51, | 508,52, | 508,53, | 508,54, | 508,55, | 508,56, | 508,57, | 508,58, | 508,59, | 508,60, | 508,61, | 508,62, | 508,63, | 508,64, | 508,65, | 508,66, | 508,67, | 508,68, | 508,69, | 508,70, | 508,71, | 508,72, | 508,73, | 508,74, | 508,75, | 508,76, | 508,77, | 508,78, | 508,79, | 508,80, | 508,81, | 508,82, | 508,83, | 508,84, | 508,85, | 509,1, | 509,2, | 509,3, | 509,4, | 509,5, | 509,6, | 509,7, | 509,8, | 509,9, | 509,10, | 509,11, | 509,12, | 509,13, | 509,14, | 509,15, | 509,16, | 509,17, | 509,18, | 509,19, | 509,20, | 509,21, | 509,22, | 509,23, | 509,24, | 509,25, | 509,26, | 509,27, | 509,28, | 509,29, | 509,30, | 509,31, | 509,32, | 509,33, | 509,34, | 509,35, | 509,36, | 509,37, | 509,38, | 509,39, | 509,40, | 509,41, | 509,42, | 509,43, | 509,44, | 509,45, | 509,46, | 509,47, | 509,48, | 509,49, | 509,50, | 509,51, | 509,52, | 509,53, | 509,54, | 509,55, | 509,56, | 509,57, | 509,58, | 509,59, | 509,60, | 509,61, | 509,62, | 509,63, | 509,64, | 509,65, | 509,66, | 509,67, | 509,68, | 509,69, | 509,70, | 509,71, | 509,72, | 509,73, | 509,74, | 509,75, | 509,76, | 509,77, | 509,78, | 509,79, | 509,80, | 509,81, | 509,82, | 509,83, | 509,84, | 509,85, | 510,1, | 510,2, | 510,3, | 510,4, | 510,5, | 510,6, | 510,7, | 510,8, | 510,9, | 510,10, | 510,11, | 510,12, | 510,13, | 510,14, | 510,15, | 510,16, | 510,17, | 510,18, | 510,19, | 510,20, | 510,21, | 510,22, | 510,23, | 510,24, | 510,25, | 510,26, | 510,27, | 510,28, | 510,29, | 510,30, | 510,31, | 510,32, | 510,33, | 510,34, | 510,35, | 510,36, | 510,37, | 510,38, | 510,39, | 510,40, | 510,41, | 510,42, | 510,43, | 510,44, | 510,45, | 510,46, | 510,47, | 510,48, | 510,49, | 510,50, | 510,51, | 510,52, | 510,53, | 510,54, | 510,55, | 510,56, | 510,57, | 510,58, | 510,59, | 510,60, | 510,61, | 510,62, | 510,63, | 510,64, | 510,65, | 510,66, | 510,67, | 510,68, | 510,69, | 510,70, | 510,71, | 510,72, | 510,73, | 510,74, | 510,75, | 510,76, | 510,77, | 510,78, | 510,79, | 510,80, | 510,81, | 510,82, | 510,83, | 510,84, | 510,85, | 511,1, | 511,2, | 511,3, | 511,4, | 511,5, | 511,6, | 511,7, | 511,8, | 511,9, | 511,10, | 511,11, | 511,12, | 511,13, | 511,14, | 511,15, | 511,16, | 511,17, | 511,18, | 511,19, | 511,20, | 511,21, | 511,22, | 511,23, | 511,24, | 511,25, | 511,26, | 511,27, | 511,28, | 511,29, | 511,30, | 511,31, | 511,32, | 511,33, | 511,34, | 511,35, | 511,36, | 511,37, | 511,38, | 511,39, | 511,40, | 511,41, | 511,42, | 511,43, | 511,44, | 511,45, | 511,46, | 511,47, | 511,48, | 511,49, | 511,50, | 511,51, | 511,52, | 511,53, | 511,54, | 511,55, | 511,56, | 511,57, | 511,58, | 511,59, | 511,60, | 511,61, | 511,62, | 511,63, | 511,64, | 511,65, | 511,66, | 511,67, | 511,68, | 511,69, | 511,70, | 511,71, | 511,72, | 511,73, | 511,74, | 511,75, | 511,76, | 511,77, | 511,78, | 511,79, | 511,80, | 511,81, | 511,82, | 511,83, | 511,84, | 511,85, | 512,1, | 512,2, | 512,3, | 512,4, | 512,5, | 512,6, | 512,7, | 512,8, | 512,9, | 512,10, | 512,11, | 512,12, | 512,13, | 512,14, | 512,15, | 512,16, | 512,17, | 512,18, | 512,19, | 512,20, | 512,21, | 512,22, | 512,23, | 512,24, | 512,25, | 512,26, | 512,27, | 512,28, | 512,29, | 512,30, | 512,31, | 512,32, | 512,33, | 512,34, | 512,35, | 512,36, | 512,37, | 512,38, | 512,39, | 512,40, | 512,41, | 512,42, | 512,43, | 512,44, | 512,45, | 512,46, | 512,47, | 512,48, | 512,49, | 512,50, | 512,51, | 512,52, | 512,53, | 512,54, | 512,55, | 512,56, | 512,57, | 512,58, | 512,59, | 512,60, | 512,61, | 512,62, | 512,63, | 512,64, | 512,65, | 512,66, | 512,67, | 512,68, | 512,69, | 512,70, | 512,71, | 512,72, | 512,73, | 512,74, | 512,75, | 512,76, | 512,77, | 512,78, | 512,79, | 512,80, | 512,81, | 512,82, | 512,83, | 512,84, | 512,85, | 513,1, | 513,2, | 513,3, | 513,4, | 513,5, | 513,6, | 513,7, | 513,8, | 513,9, | 513,10, | 513,11, | 513,12, | 513,13, | 513,14, | 513,15, | 513,16, | 513,17, | 513,18, | 513,19, | 513,20, | 513,21, | 513,22, | 513,23, | 513,24, | 513,25, | 513,26, | 513,27, | 513,28, | 513,29, | 513,30, | 513,31, | 513,32, | 513,33, | 513,34, | 513,35, | 513,36, | 513,37, | 513,38, | 513,39, | 513,40, | 513,41, | 513,42, | 513,43, | 513,44, | 513,45, | 513,46, | 513,47, | 513,48, | 513,49, | 513,50, | 513,51, | 513,52, | 513,53, | 513,54, | 513,55, | 513,56, | 513,57, | 513,58, | 513,59, | 513,60, | 513,61, | 513,62, | 513,63, | 513,64, | 513,65, | 513,66, | 513,67, | 513,68, | 513,69, | 513,70, | 513,71, | 513,72, | 513,73, | 513,74, | 513,75, | 513,76, | 513,77, | 513,78, | 513,79, | 513,80, | 513,81, | 513,82, | 513,83, | 513,84, | 513,85, | 514,1, | 514,2, | 514,3, | 514,4, | 514,5, | 514,6, | 514,7, | 514,8, | 514,9, | 514,10, | 514,11, | 514,12, | 514,13, | 514,14, | 514,15, | 514,16, | 514,17, | 514,18, | 514,19, | 514,20, | 514,21, | 514,22, | 514,23, | 514,24, | 514,25, | 514,26, | 514,27, | 514,28, | 514,29, | 514,30, | 514,31, | 514,32, | 514,33, | 514,34, | 514,35, | 514,36, | 514,37, | 514,38, | 514,39, | 514,40, | 514,41, | 514,42, | 514,43, | 514,44, | 514,45, | 514,46, | 514,47, | 514,48, | 514,49, | 514,50, | 514,51, | 514,52, | 514,53, | 514,54, | 514,55, | 514,56, | 514,57, | 514,58, | 514,59, | 514,60, | 514,61, | 514,62, | 514,63, | 514,64, | 514,65, | 514,66, | 514,67, | 514,68, | 514,69, | 514,70, | 514,71, | 514,72, | 514,73, | 514,74, | 514,75, | 514,76, | 514,77, | 514,78, | 514,79, | 514,80, | 514,81, | 514,82, | 514,83, | 514,84, | 514,85, | 515,1, | 515,2, | 515,3, | 515,4, | 515,5, | 515,6, | 515,7, | 515,8, | 515,9, | 515,10, | 515,11, | 515,12, | 515,13, | 515,14, | 515,15, | 515,16, | 515,17, | 515,18, | 515,19, | 515,20, | 515,21, | 515,22, | 515,23, | 515,24, | 515,25, | 515,26, | 515,27, | 515,28, | 515,29, | 515,30, | 515,31, | 515,32, | 515,33, | 515,34, | 515,35, | 515,36, | 515,37, | 515,38, | 515,39, | 515,40, | 515,41, | 515,42, | 515,43, | 515,44, | 515,45, | 515,46, | 515,47, | 515,48, | 515,49, | 515,50, | 515,51, | 515,52, | 515,53, | 515,54, | 515,55, | 515,56, | 515,57, | 515,58, | 515,59, | 515,60, | 515,61, | 515,62, | 515,63, | 515,64, | 515,65, | 515,66, | 515,67, | 515,68, | 515,69, | 515,70, | 515,71, | 515,72, | 515,73, | 515,74, | 515,75, | 515,76, | 515,77, | 515,78, | 515,79, | 515,80, | 515,81, | 515,82, | 515,83, | 515,84, | 515,85, | 516,1, | 516,2, | 516,3, | 516,4, | 516,5, | 516,6, | 516,7, | 516,8, | 516,9, | 516,10, | 516,11, | 516,12, | 516,13, | 516,14, | 516,15, | 516,16, | 516,17, | 516,18, | 516,19, | 516,20, | 516,21, | 516,22, | 516,23, | 516,24, | 516,25, | 516,26, | 516,27, | 516,28, | 516,29, | 516,30, | 516,31, | 516,32, | 516,33, | 516,34, | 516,35, | 516,36, | 516,37, | 516,38, | 516,39, | 516,40, | 516,41, | 516,42, | 516,43, | 516,44, | 516,45, | 516,46, | 516,47, | 516,48, | 516,49, | 516,50, | 516,51, | 516,52, | 516,53, | 516,54, | 516,55, | 516,56, | 516,57, | 516,58, | 516,59, | 516,60, | 516,61, | 516,62, | 516,63, | 516,64, | 516,65, | 516,66, | 516,67, | 516,68, | 516,69, | 516,70, | 516,71, | 516,72, | 516,73, | 516,74, | 516,75, | 516,76, | 516,77, | 516,78, | 516,79, | 516,80, | 516,81, | 516,82, | 516,83, | 516,84, | 516,85, | 517,1, | 517,2, | 517,3, | 517,4, | 517,5, | 517,6, | 517,7, | 517,8, | 517,9, | 517,10, | 517,11, | 517,12, | 517,13, | 517,14, | 517,15, | 517,16, | 517,17, | 517,18, | 517,19, | 517,20, | 517,21, | 517,22, | 517,23, | 517,24, | 517,25, | 517,26, | 517,27, | 517,28, | 517,29, | 517,30, | 517,31, | 517,32, | 517,33, | 517,34, | 517,35, | 517,36, | 517,37, | 517,38, | 517,39, | 517,40, | 517,41, | 517,42, | 517,43, | 517,44, | 517,45, | 517,46, | 517,47, | 517,48, | 517,49, | 517,50, | 517,51, | 517,52, | 517,53, | 517,54, | 517,55, | 517,56, | 517,57, | 517,58, | 517,59, | 517,60, | 517,61, | 517,62, | 517,63, | 517,64, | 517,65, | 517,66, | 517,67, | 517,68, | 517,69, | 517,70, | 517,71, | 517,72, | 517,73, | 517,74, | 517,75, | 517,76, | 517,77, | 517,78, | 517,79, | 517,80, | 517,81, | 517,82, | 517,83, | 517,84, | 517,85, | 518,1, | 518,2, | 518,3, | 518,4, | 518,5, | 518,6, | 518,7, | 518,8, | 518,9, | 518,10, | 518,11, | 518,12, | 518,13, | 518,14, | 518,15, | 518,16, | 518,17, | 518,18, | 518,19, | 518,20, | 518,21, | 518,22, | 518,23, | 518,24, | 518,25, | 518,26, | 518,27, | 518,28, | 518,29, | 518,30, | 518,31, | 518,32, | 518,33, | 518,34, | 518,35, | 518,36, | 518,37, | 518,38, | 518,39, | 518,40, | 518,41, | 518,42, | 518,43, | 518,44, | 518,45, | 518,46, | 518,47, | 518,48, | 518,49, | 518,50, | 518,51, | 518,52, | 518,53, | 518,54, | 518,55, | 518,56, | 518,57, | 518,58, | 518,59, | 518,60, | 518,61, | 518,62, | 518,63, | 518,64, | 518,65, | 518,66, | 518,67, | 518,68, | 518,69, | 518,70, | 518,71, | 518,72, | 518,73, | 518,74, | 518,75, | 518,76, | 518,77, | 518,78, | 518,79, | 518,80, | 518,81, | 518,82, | 518,83, | 518,84, | 518,85, | 519,1, | 519,2, | 519,3, | 519,4, | 519,5, | 519,6, | 519,7, | 519,8, | 519,9, | 519,10, | 519,11, | 519,12, | 519,13, | 519,14, | 519,15, | 519,16, | 519,17, | 519,18, | 519,19, | 519,20, | 519,21, | 519,22, | 519,23, | 519,24, | 519,25, | 519,26, | 519,27, | 519,28, | 519,29, | 519,30, | 519,31, | 519,32, | 519,33, | 519,34, | 519,35, | 519,36, | 519,37, | 519,38, | 519,39, | 519,40, | 519,41, | 519,42, | 519,43, | 519,44, | 519,45, | 519,46, | 519,47, | 519,48, | 519,49, | 519,50, | 519,51, | 519,52, | 519,53, | 519,54, | 519,55, | 519,56, | 519,57, | 519,58, | 519,59, | 519,60, | 519,61, | 519,62, | 519,63, | 519,64, | 519,65, | 519,66, | 519,67, | 519,68, | 519,69, | 519,70, | 519,71, | 519,72, | 519,73, | 519,74, | 519,75, | 519,76, | 519,77, | 519,78, | 519,79, | 519,80, | 519,81, | 519,82, | 519,83, | 519,84, | 519,85, | 520,1, | 520,2, | 520,3, | 520,4, | 520,5, | 520,6, | 520,7, | 520,8, | 520,9, | 520,10, | 520,11, | 520,12, | 520,13, | 520,14, | 520,15, | 520,16, | 520,17, | 520,18, | 520,19, | 520,20, | 520,21, | 520,22, | 520,23, | 520,24, | 520,25, | 520,26, | 520,27, | 520,28, | 520,29, | 520,30, | 520,31, | 520,32, | 520,33, | 520,34, | 520,35, | 520,36, | 520,37, | 520,38, | 520,39, | 520,40, | 520,41, | 520,42, | 520,43, | 520,44, | 520,45, | 520,46, | 520,47, | 520,48, | 520,49, | 520,50, | 520,51, | 520,52, | 520,53, | 520,54, | 520,55, | 520,56, | 520,57, | 520,58, | 520,59, | 520,60, | 520,61, | 520,62, | 520,63, | 520,64, | 520,65, | 520,66, | 520,67, | 520,68, | 520,69, | 520,70, | 520,71, | 520,72, | 520,73, | 520,74, | 520,75, | 520,76, | 520,77, | 520,78, | 520,79, | 520,80, | 520,81, | 520,82, | 520,83, | 520,84, | 520,85, | 521,1, | 521,2, | 521,3, | 521,4, | 521,5, | 521,6, | 521,7, | 521,8, | 521,9, | 521,10, | 521,11, | 521,12, | 521,13, | 521,14, | 521,15, | 521,16, | 521,17, | 521,18, | 521,19, | 521,20, | 521,21, | 521,22, | 521,23, | 521,24, | 521,25, | 521,26, | 521,27, | 521,28, | 521,29, | 521,30, | 521,31, | 521,32, | 521,33, | 521,34, | 521,35, | 521,36, | 521,37, | 521,38, | 521,39, | 521,40, | 521,41, | 521,42, | 521,43, | 521,44, | 521,45, | 521,46, | 521,47, | 521,48, | 521,49, | 521,50, | 521,51, | 521,52, | 521,53, | 521,54, | 521,55, | 521,56, | 521,57, | 521,58, | 521,59, | 521,60, | 521,61, | 521,62, | 521,63, | 521,64, | 521,65, | 521,66, | 521,67, | 521,68, | 521,69, | 521,70, | 521,71, | 521,72, | 521,73, | 521,74, | 521,75, | 521,76, | 521,77, | 521,78, | 521,79, | 521,80, | 521,81, | 521,82, | 521,83, | 521,84, | 521,85, | 522,1, | 522,2, | 522,3, | 522,4, | 522,5, | 522,6, | 522,7, | 522,8, | 522,9, | 522,10, | 522,11, | 522,12, | 522,13, | 522,14, | 522,15, | 522,16, | 522,17, | 522,18, | 522,19, | 522,20, | 522,21, | 522,22, | 522,23, | 522,24, | 522,25, | 522,26, | 522,27, | 522,28, | 522,29, | 522,30, | 522,31, | 522,32, | 522,33, | 522,34, | 522,35, | 522,36, | 522,37, | 522,38, | 522,39, | 522,40, | 522,41, | 522,42, | 522,43, | 522,44, | 522,45, | 522,46, | 522,47, | 522,48, | 522,49, | 522,50, | 522,51, | 522,52, | 522,53, | 522,54, | 522,55, | 522,56, | 522,57, | 522,58, | 522,59, | 522,60, | 522,61, | 522,62, | 522,63, | 522,64, | 522,65, | 522,66, | 522,67, | 522,68, | 522,69, | 522,70, | 522,71, | 522,72, | 522,73, | 522,74, | 522,75, | 522,76, | 522,77, | 522,78, | 522,79, | 522,80, | 522,81, | 522,82, | 522,83, | 522,84, | 522,85, | 523,1, | 523,2, | 523,3, | 523,4, | 523,5, | 523,6, | 523,7, | 523,8, | 523,9, | 523,10, | 523,11, | 523,12, | 523,13, | 523,14, | 523,15, | 523,16, | 523,17, | 523,18, | 523,19, | 523,20, | 523,21, | 523,22, | 523,23, | 523,24, | 523,25, | 523,26, | 523,27, | 523,28, | 523,29, | 523,30, | 523,31, | 523,32, | 523,33, | 523,34, | 523,35, | 523,36, | 523,37, | 523,38, | 523,39, | 523,40, | 523,41, | 523,42, | 523,43, | 523,44, | 523,45, | 523,46, | 523,47, | 523,48, | 523,49, | 523,50, | 523,51, | 523,52, | 523,53, | 523,54, | 523,55, | 523,56, | 523,57, | 523,58, | 523,59, | 523,60, | 523,61, | 523,62, | 523,63, | 523,64, | 523,65, | 523,66, | 523,67, | 523,68, | 523,69, | 523,70, | 523,71, | 523,72, | 523,73, | 523,74, | 523,75, | 523,76, | 523,77, | 523,78, | 523,79, | 523,80, | 523,81, | 523,82, | 523,83, | 523,84, | 523,85, | 524,1, | 524,2, | 524,3, | 524,4, | 524,5, | 524,6, | 524,7, | 524,8, | 524,9, | 524,10, | 524,11, | 524,12, | 524,13, | 524,14, | 524,15, | 524,16, | 524,17, | 524,18, | 524,19, | 524,20, | 524,21, | 524,22, | 524,23, | 524,24, | 524,25, | 524,26, | 524,27, | 524,28, | 524,29, | 524,30, | 524,31, | 524,32, | 524,33, | 524,34, | 524,35, | 524,36, | 524,37, | 524,38, | 524,39, | 524,40, | 524,41, | 524,42, | 524,43, | 524,44, | 524,45, | 524,46, | 524,47, | 524,48, | 524,49, | 524,50, | 524,51, | 524,52, | 524,53, | 524,54, | 524,55, | 524,56, | 524,57, | 524,58, | 524,59, | 524,60, | 524,61, | 524,62, | 524,63, | 524,64, | 524,65, | 524,66, | 524,67, | 524,68, | 524,69, | 524,70, | 524,71, | 524,72, | 524,73, | 524,74, | 524,75, | 524,76, | 524,77, | 524,78, | 524,79, | 524,80, | 524,81, | 524,82, | 524,83, | 524,84, | 524,85, | 525,1, | 525,2, | 525,3, | 525,4, | 525,5, | 525,6, | 525,7, | 525,8, | 525,9, | 525,10, | 525,11, | 525,12, | 525,13, | 525,14, | 525,15, | 525,16, | 525,17, | 525,18, | 525,19, | 525,20, | 525,21, | 525,22, | 525,23, | 525,24, | 525,25, | 525,26, | 525,27, | 525,28, | 525,29, | 525,30, | 525,31, | 525,32, | 525,33, | 525,34, | 525,35, | 525,36, | 525,37, | 525,38, | 525,39, | 525,40, | 525,41, | 525,42, | 525,43, | 525,44, | 525,45, | 525,46, | 525,47, | 525,48, | 525,49, | 525,50, | 525,51, | 525,52, | 525,53, | 525,54, | 525,55, | 525,56, | 525,57, | 525,58, | 525,59, | 525,60, | 525,61, | 525,62, | 525,63, | 525,64, | 525,65, | 525,66, | 525,67, | 525,68, | 525,69, | 525,70, | 525,71, | 525,72, | 525,73, | 525,74, | 525,75, | 525,76, | 525,77, | 525,78, | 525,79, | 525,80, | 525,81, | 525,82, | 525,83, | 525,84, | 525,85, | 526,1, | 526,2, | 526,3, | 526,4, | 526,5, | 526,6, | 526,7, | 526,8, | 526,9, | 526,10, | 526,11, | 526,12, | 526,13, | 526,14, | 526,15, | 526,16, | 526,17, | 526,18, | 526,19, | 526,20, | 526,21, | 526,22, | 526,23, | 526,24, | 526,25, | 526,26, | 526,27, | 526,28, | 526,29, | 526,30, | 526,31, | 526,32, | 526,33, | 526,34, | 526,35, | 526,36, | 526,37, | 526,38, | 526,39, | 526,40, | 526,41, | 526,42, | 526,43, | 526,44, | 526,45, | 526,46, | 526,47, | 526,48, | 526,49, | 526,50, | 526,51, | 526,52, | 526,53, | 526,54, | 526,55, | 526,56, | 526,57, | 526,58, | 526,59, | 526,60, | 526,61, | 526,62, | 526,63, | 526,64, | 526,65, | 526,66, | 526,67, | 526,68, | 526,69, | 526,70, | 526,71, | 526,72, | 526,73, | 526,74, | 526,75, | 526,76, | 526,77, | 526,78, | 526,79, | 526,80, | 526,81, | 526,82, | 526,83, | 526,84, | 526,85, | 527,1, | 527,2, | 527,3, | 527,4, | 527,5, | 527,6, | 527,7, | 527,8, | 527,9, | 527,10, | 527,11, | 527,12, | 527,13, | 527,14, | 527,15, | 527,16, | 527,17, | 527,18, | 527,19, | 527,20, | 527,21, | 527,22, | 527,23, | 527,24, | 527,25, | 527,26, | 527,27, | 527,28, | 527,29, | 527,30, | 527,31, | 527,32, | 527,33, | 527,34, | 527,35, | 527,36, | 527,37, | 527,38, | 527,39, | 527,40, | 527,41, | 527,42, | 527,43, | 527,44, | 527,45, | 527,46, | 527,47, | 527,48, | 527,49, | 527,50, | 527,51, | 527,52, | 527,53, | 527,54, | 527,55, | 527,56, | 527,57, | 527,58, | 527,59, | 527,60, | 527,61, | 527,62, | 527,63, | 527,64, | 527,65, | 527,66, | 527,67, | 527,68, | 527,69, | 527,70, | 527,71, | 527,72, | 527,73, | 527,74, | 527,75, | 527,76, | 527,77, | 527,78, | 527,79, | 527,80, | 527,81, | 527,82, | 527,83, | 527,84, | 527,85, | 528,1, | 528,2, | 528,3, | 528,4, | 528,5, | 528,6, | 528,7, | 528,8, | 528,9, | 528,10, | 528,11, | 528,12, | 528,13, | 528,14, | 528,15, | 528,16, | 528,17, | 528,18, | 528,19, | 528,20, | 528,21, | 528,22, | 528,23, | 528,24, | 528,25, | 528,26, | 528,27, | 528,28, | 528,29, | 528,30, | 528,31, | 528,32, | 528,33, | 528,34, | 528,35, | 528,36, | 528,37, | 528,38, | 528,39, | 528,40, | 528,41, | 528,42, | 528,43, | 528,44, | 528,45, | 528,46, | 528,47, | 528,48, | 528,49, | 528,50, | 528,51, | 528,52, | 528,53, | 528,54, | 528,55, | 528,56, | 528,57, | 528,58, | 528,59, | 528,60, | 528,61, | 528,62, | 528,63, | 528,64, | 528,65, | 528,66, | 528,67, | 528,68, | 528,69, | 528,70, | 528,71, | 528,72, | 528,73, | 528,74, | 528,75, | 528,76, | 528,77, | 528,78, | 528,79, | 528,80, | 528,81, | 528,82, | 528,83, | 528,84, | 528,85, | 529,1, | 529,2, | 529,3, | 529,4, | 529,5, | 529,6, | 529,7, | 529,8, | 529,9, | 529,10, | 529,11, | 529,12, | 529,13, | 529,14, | 529,15, | 529,16, | 529,17, | 529,18, | 529,19, | 529,20, | 529,21, | 529,22, | 529,23, | 529,24, | 529,25, | 529,26, | 529,27, | 529,28, | 529,29, | 529,30, | 529,31, | 529,32, | 529,33, | 529,34, | 529,35, | 529,36, | 529,37, | 529,38, | 529,39, | 529,40, | 529,41, | 529,42, | 529,43, | 529,44, | 529,45, | 529,46, | 529,47, | 529,48, | 529,49, | 529,50, | 529,51, | 529,52, | 529,53, | 529,54, | 529,55, | 529,56, | 529,57, | 529,58, | 529,59, | 529,60, | 529,61, | 529,62, | 529,63, | 529,64, | 529,65, | 529,66, | 529,67, | 529,68, | 529,69, | 529,70, | 529,71, | 529,72, | 529,73, | 529,74, | 529,75, | 529,76, | 529,77, | 529,78, | 529,79, | 529,80, | 529,81, | 529,82, | 529,83, | 529,84, | 529,85, | 530,1, | 530,2, | 530,3, | 530,4, | 530,5, | 530,6, | 530,7, | 530,8, | 530,9, | 530,10, | 530,11, | 530,12, | 530,13, | 530,14, | 530,15, | 530,16, | 530,17, | 530,18, | 530,19, | 530,20, | 530,21, | 530,22, | 530,23, | 530,24, | 530,25, | 530,26, | 530,27, | 530,28, | 530,29, | 530,30, | 530,31, | 530,32, | 530,33, | 530,34, | 530,35, | 530,36, | 530,37, | 530,38, | 530,39, | 530,40, | 530,41, | 530,42, | 530,43, | 530,44, | 530,45, | 530,46, | 530,47, | 530,48, | 530,49, | 530,50, | 530,51, | 530,52, | 530,53, | 530,54, | 530,55, | 530,56, | 530,57, | 530,58, | 530,59, | 530,60, | 530,61, | 530,62, | 530,63, | 530,64, | 530,65, | 530,66, | 530,67, | 530,68, | 530,69, | 530,70, | 530,71, | 530,72, | 530,73, | 530,74, | 530,75, | 530,76, | 530,77, | 530,78, | 530,79, | 530,80, | 530,81, | 530,82, | 530,83, | 530,84, | 530,85, | 531,1, | 531,2, | 531,3, | 531,4, | 531,5, | 531,6, | 531,7, | 531,8, | 531,9, | 531,10, | 531,11, | 531,12, | 531,13, | 531,14, | 531,15, | 531,16, | 531,17, | 531,18, | 531,19, | 531,20, | 531,21, | 531,22, | 531,23, | 531,24, | 531,25, | 531,26, | 531,27, | 531,28, | 531,29, | 531,30, | 531,31, | 531,32, | 531,33, | 531,34, | 531,35, | 531,36, | 531,37, | 531,38, | 531,39, | 531,40, | 531,41, | 531,42, | 531,43, | 531,44, | 531,45, | 531,46, | 531,47, | 531,48, | 531,49, | 531,50, | 531,51, | 531,52, | 531,53, | 531,54, | 531,55, | 531,56, | 531,57, | 531,58, | 531,59, | 531,60, | 531,61, | 531,62, | 531,63, | 531,64, | 531,65, | 531,66, | 531,67, | 531,68, | 531,69, | 531,70, | 531,71, | 531,72, | 531,73, | 531,74, | 531,75, | 531,76, | 531,77, | 531,78, | 531,79, | 531,80, | 531,81, | 531,82, | 531,83, | 531,84, | 531,85, | 532,1, | 532,2, | 532,3, | 532,4, | 532,5, | 532,6, | 532,7, | 532,8, | 532,9, | 532,10, | 532,11, | 532,12, | 532,13, | 532,14, | 532,15, | 532,16, | 532,17, | 532,18, | 532,19, | 532,20, | 532,21, | 532,22, | 532,23, | 532,24, | 532,25, | 532,26, | 532,27, | 532,28, | 532,29, | 532,30, | 532,31, | 532,32, | 532,33, | 532,34, | 532,35, | 532,36, | 532,37, | 532,38, | 532,39, | 532,40, | 532,41, | 532,42, | 532,43, | 532,44, | 532,45, | 532,46, | 532,47, | 532,48, | 532,49, | 532,50, | 532,51, | 532,52, | 532,53, | 532,54, | 532,55, | 532,56, | 532,57, | 532,58, | 532,59, | 532,60, | 532,61, | 532,62, | 532,63, | 532,64, | 532,65, | 532,66, | 532,67, | 532,68, | 532,69, | 532,70, | 532,71, | 532,72, | 532,73, | 532,74, | 532,75, | 532,76, | 532,77, | 532,78, | 532,79, | 532,80, | 532,81, | 532,82, | 532,83, | 532,84, | 532,85, | 533,1, | 533,2, | 533,3, | 533,4, | 533,5, | 533,6, | 533,7, | 533,8, | 533,9, | 533,10, | 533,11, | 533,12, | 533,13, | 533,14, | 533,15, | 533,16, | 533,17, | 533,18, | 533,19, | 533,20, | 533,21, | 533,22, | 533,23, | 533,24, | 533,25, | 533,26, | 533,27, | 533,28, | 533,29, | 533,30, | 533,31, | 533,32, | 533,33, | 533,34, | 533,35, | 533,36, | 533,37, | 533,38, | 533,39, | 533,40, | 533,41, | 533,42, | 533,43, | 533,44, | 533,45, | 533,46, | 533,47, | 533,48, | 533,49, | 533,50, | 533,51, | 533,52, | 533,53, | 533,54, | 533,55, | 533,56, | 533,57, | 533,58, | 533,59, | 533,60, | 533,61, | 533,62, | 533,63, | 533,64, | 533,65, | 533,66, | 533,67, | 533,68, | 533,69, | 533,70, | 533,71, | 533,72, | 533,73, | 533,74, | 533,75, | 533,76, | 533,77, | 533,78, | 533,79, | 533,80, | 533,81, | 533,82, | 533,83, | 533,84, | 533,85, | 534,1, | 534,2, | 534,3, | 534,4, | 534,5, | 534,6, | 534,7, | 534,8, | 534,9, | 534,10, | 534,11, | 534,12, | 534,13, | 534,14, | 534,15, | 534,16, | 534,17, | 534,18, | 534,19, | 534,20, | 534,21, | 534,22, | 534,23, | 534,24, | 534,25, | 534,26, | 534,27, | 534,28, | 534,29, | 534,30, | 534,31, | 534,32, | 534,33, | 534,34, | 534,35, | 534,36, | 534,37, | 534,38, | 534,39, | 534,40, | 534,41, | 534,42, | 534,43, | 534,44, | 534,45, | 534,46, | 534,47, | 534,48, | 534,49, | 534,50, | 534,51, | 534,52, | 534,53, | 534,54, | 534,55, | 534,56, | 534,57, | 534,58, | 534,59, | 534,60, | 534,61, | 534,62, | 534,63, | 534,64, | 534,65, | 534,66, | 534,67, | 534,68, | 534,69, | 534,70, | 534,71, | 534,72, | 534,73, | 534,74, | 534,75, | 534,76, | 534,77, | 534,78, | 534,79, | 534,80, | 534,81, | 534,82, | 534,83, | 534,84, | 534,85, | 535,1, | 535,2, | 535,3, | 535,4, | 535,5, | 535,6, | 535,7, | 535,8, | 535,9, | 535,10, | 535,11, | 535,12, | 535,13, | 535,14, | 535,15, | 535,16, | 535,17, | 535,18, | 535,19, | 535,20, | 535,21, | 535,22, | 535,23, | 535,24, | 535,25, | 535,26, | 535,27, | 535,28, | 535,29, | 535,30, | 535,31, | 535,32, | 535,33, | 535,34, | 535,35, | 535,36, | 535,37, | 535,38, | 535,39, | 535,40, | 535,41, | 535,42, | 535,43, | 535,44, | 535,45, | 535,46, | 535,47, | 535,48, | 535,49, | 535,50, | 535,51, | 535,52, | 535,53, | 535,54, | 535,55, | 535,56, | 535,57, | 535,58, | 535,59, | 535,60, | 535,61, | 535,62, | 535,63, | 535,64, | 535,65, | 535,66, | 535,67, | 535,68, | 535,69, | 535,70, | 535,71, | 535,72, | 535,73, | 535,74, | 535,75, | 535,76, | 535,77, | 535,78, | 535,79, | 535,80, | 535,81, | 535,82, | 535,83, | 535,84, | 535,85, | 536,1, | 536,2, | 536,3, | 536,4, | 536,5, | 536,6, | 536,7, | 536,8, | 536,9, | 536,10, | 536,11, | 536,12, | 536,13, | 536,14, | 536,15, | 536,16, | 536,17, | 536,18, | 536,19, | 536,20, | 536,21, | 536,22, | 536,23, | 536,24, | 536,25, | 536,26, | 536,27, | 536,28, | 536,29, | 536,30, | 536,31, | 536,32, | 536,33, | 536,34, | 536,35, | 536,36, | 536,37, | 536,38, | 536,39, | 536,40, | 536,41, | 536,42, | 536,43, | 536,44, | 536,45, | 536,46, | 536,47, | 536,48, | 536,49, | 536,50, | 536,51, | 536,52, | 536,53, | 536,54, | 536,55, | 536,56, | 536,57, | 536,58, | 536,59, | 536,60, | 536,61, | 536,62, | 536,63, | 536,64, | 536,65, | 536,66, | 536,67, | 536,68, | 536,69, | 536,70, | 536,71, | 536,72, | 536,73, | 536,74, | 536,75, | 536,76, | 536,77, | 536,78, | 536,79, | 536,80, | 536,81, | 536,82, | 536,83, | 536,84, | 536,85, | 537,1, | 537,2, | 537,3, | 537,4, | 537,5, | 537,6, | 537,7, | 537,8, | 537,9, | 537,10, | 537,11, | 537,12, | 537,13, | 537,14, | 537,15, | 537,16, | 537,17, | 537,18, | 537,19, | 537,20, | 537,21, | 537,22, | 537,23, | 537,24, | 537,25, | 537,26, | 537,27, | 537,28, | 537,29, | 537,30, | 537,31, | 537,32, | 537,33, | 537,34, | 537,35, | 537,36, | 537,37, | 537,38, | 537,39, | 537,40, | 537,41, | 537,42, | 537,43, | 537,44, | 537,45, | 537,46, | 537,47, | 537,48, | 537,49, | 537,50, | 537,51, | 537,52, | 537,53, | 537,54, | 537,55, | 537,56, | 537,57, | 537,58, | 537,59, | 537,60, | 537,61, | 537,62, | 537,63, | 537,64, | 537,65, | 537,66, | 537,67, | 537,68, | 537,69, | 537,70, | 537,71, | 537,72, | 537,73, | 537,74, | 537,75, | 537,76, | 537,77, | 537,78, | 537,79, | 537,80, | 537,81, | 537,82, | 537,83, | 537,84, | 537,85, | 538,1, | 538,2, | 538,3, | 538,4, | 538,5, | 538,6, | 538,7, | 538,8, | 538,9, | 538,10, | 538,11, | 538,12, | 538,13, | 538,14, | 538,15, | 538,16, | 538,17, | 538,18, | 538,19, | 538,20, | 538,21, | 538,22, | 538,23, | 538,24, | 538,25, | 538,26, | 538,27, | 538,28, | 538,29, | 538,30, | 538,31, | 538,32, | 538,33, | 538,34, | 538,35, | 538,36, | 538,37, | 538,38, | 538,39, | 538,40, | 538,41, | 538,42, | 538,43, | 538,44, | 538,45, | 538,46, | 538,47, | 538,48, | 538,49, | 538,50, | 538,51, | 538,52, | 538,53, | 538,54, | 538,55, | 538,56, | 538,57, | 538,58, | 538,59, | 538,60, | 538,61, | 538,62, | 538,63, | 538,64, | 538,65, | 538,66, | 538,67, | 538,68, | 538,69, | 538,70, | 538,71, | 538,72, | 538,73, | 538,74, | 538,75, | 538,76, | 538,77, | 538,78, | 538,79, | 538,80, | 538,81, | 538,82, | 538,83, | 538,84, | 538,85, | 539,1, | 539,2, | 539,3, | 539,4, | 539,5, | 539,6, | 539,7, | 539,8, | 539,9, | 539,10, | 539,11, | 539,12, | 539,13, | 539,14, | 539,15, | 539,16, | 539,17, | 539,18, | 539,19, | 539,20, | 539,21, | 539,22, | 539,23, | 539,24, | 539,25, | 539,26, | 539,27, | 539,28, | 539,29, | 539,30, | 539,31, | 539,32, | 539,33, | 539,34, | 539,35, | 539,36, | 539,37, | 539,38, | 539,39, | 539,40, | 539,41, | 539,42, | 539,43, | 539,44, | 539,45, | 539,46, | 539,47, | 539,48, | 539,49, | 539,50, | 539,51, | 539,52, | 539,53, | 539,54, | 539,55, | 539,56, | 539,57, | 539,58, | 539,59, | 539,60, | 539,61, | 539,62, | 539,63, | 539,64, | 539,65, | 539,66, | 539,67, | 539,68, | 539,69, | 539,70, | 539,71, | 539,72, | 539,73, | 539,74, | 539,75, | 539,76, | 539,77, | 539,78, | 539,79, | 539,80, | 539,81, | 539,82, | 539,83, | 539,84, | 539,85, | 540,1, | 540,2, | 540,3, | 540,4, | 540,5, | 540,6, | 540,7, | 540,8, | 540,9, | 540,10, | 540,11, | 540,12, | 540,13, | 540,14, | 540,15, | 540,16, | 540,17, | 540,18, | 540,19, | 540,20, | 540,21, | 540,22, | 540,23, | 540,24, | 540,25, | 540,26, | 540,27, | 540,28, | 540,29, | 540,30, | 540,31, | 540,32, | 540,33, | 540,34, | 540,35, | 540,36, | 540,37, | 540,38, | 540,39, | 540,40, | 540,41, | 540,42, | 540,43, | 540,44, | 540,45, | 540,46, | 540,47, | 540,48, | 540,49, | 540,50, | 540,51, | 540,52, | 540,53, | 540,54, | 540,55, | 540,56, | 540,57, | 540,58, | 540,59, | 540,60, | 540,61, | 540,62, | 540,63, | 540,64, | 540,65, | 540,66, | 540,67, | 540,68, | 540,69, | 540,70, | 540,71, | 540,72, | 540,73, | 540,74, | 540,75, | 540,76, | 540,77, | 540,78, | 540,79, | 540,80, | 540,81, | 540,82, | 540,83, | 540,84, | 540,85, | 541,1, | 541,2, | 541,3, | 541,4, | 541,5, | 541,6, | 541,7, | 541,8, | 541,9, | 541,10, | 541,11, | 541,12, | 541,13, | 541,14, | 541,15, | 541,16, | 541,17, | 541,18, | 541,19, | 541,20, | 541,21, | 541,22, | 541,23, | 541,24, | 541,25, | 541,26, | 541,27, | 541,28, | 541,29, | 541,30, | 541,31, | 541,32, | 541,33, | 541,34, | 541,35, | 541,36, | 541,37, | 541,38, | 541,39, | 541,40, | 541,41, | 541,42, | 541,43, | 541,44, | 541,45, | 541,46, | 541,47, | 541,48, | 541,49, | 541,50, | 541,51, | 541,52, | 541,53, | 541,54, | 541,55, | 541,56, | 541,57, | 541,58, | 541,59, | 541,60, | 541,61, | 541,62, | 541,63, | 541,64, | 541,65, | 541,66, | 541,67, | 541,68, | 541,69, | 541,70, | 541,71, | 541,72, | 541,73, | 541,74, | 541,75, | 541,76, | 541,77, | 541,78, | 541,79, | 541,80, | 541,81, | 541,82, | 541,83, | 541,84, | 541,85, | 542,1, | 542,2, | 542,3, | 542,4, | 542,5, | 542,6, | 542,7, | 542,8, | 542,9, | 542,10, | 542,11, | 542,12, | 542,13, | 542,14, | 542,15, | 542,16, | 542,17, | 542,18, | 542,19, | 542,20, | 542,21, | 542,22, | 542,23, | 542,24, | 542,25, | 542,26, | 542,27, | 542,28, | 542,29, | 542,30, | 542,31, | 542,32, | 542,33, | 542,34, | 542,35, | 542,36, | 542,37, | 542,38, | 542,39, | 542,40, | 542,41, | 542,42, | 542,43, | 542,44, | 542,45, | 542,46, | 542,47, | 542,48, | 542,49, | 542,50, | 542,51, | 542,52, | 542,53, | 542,54, | 542,55, | 542,56, | 542,57, | 542,58, | 542,59, | 542,60, | 542,61, | 542,62, | 542,63, | 542,64, | 542,65, | 542,66, | 542,67, | 542,68, | 542,69, | 542,70, | 542,71, | 542,72, | 542,73, | 542,74, | 542,75, | 542,76, | 542,77, | 542,78, | 542,79, | 542,80, | 542,81, | 542,82, | 542,83, | 542,84, | 542,85, | 543,1, | 543,2, | 543,3, | 543,4, | 543,5, | 543,6, | 543,7, | 543,8, | 543,9, | 543,10, | 543,11, | 543,12, | 543,13, | 543,14, | 543,15, | 543,16, | 543,17, | 543,18, | 543,19, | 543,20, | 543,21, | 543,22, | 543,23, | 543,24, | 543,25, | 543,26, | 543,27, | 543,28, | 543,29, | 543,30, | 543,31, | 543,32, | 543,33, | 543,34, | 543,35, | 543,36, | 543,37, | 543,38, | 543,39, | 543,40, | 543,41, | 543,42, | 543,43, | 543,44, | 543,45, | 543,46, | 543,47, | 543,48, | 543,49, | 543,50, | 543,51, | 543,52, | 543,53, | 543,54, | 543,55, | 543,56, | 543,57, | 543,58, | 543,59, | 543,60, | 543,61, | 543,62, | 543,63, | 543,64, | 543,65, | 543,66, | 543,67, | 543,68, | 543,69, | 543,70, | 543,71, | 543,72, | 543,73, | 543,74, | 543,75, | 543,76, | 543,77, | 543,78, | 543,79, | 543,80, | 543,81, | 543,82, | 543,83, | 543,84, | 543,85, | 544,1, | 544,2, | 544,3, | 544,4, | 544,5, | 544,6, | 544,7, | 544,8, | 544,9, | 544,10, | 544,11, | 544,12, | 544,13, | 544,14, | 544,15, | 544,16, | 544,17, | 544,18, | 544,19, | 544,20, | 544,21, | 544,22, | 544,23, | 544,24, | 544,25, | 544,26, | 544,27, | 544,28, | 544,29, | 544,30, | 544,31, | 544,32, | 544,33, | 544,34, | 544,35, | 544,36, | 544,37, | 544,38, | 544,39, | 544,40, | 544,41, | 544,42, | 544,43, | 544,44, | 544,45, | 544,46, | 544,47, | 544,48, | 544,49, | 544,50, | 544,51, | 544,52, | 544,53, | 544,54, | 544,55, | 544,56, | 544,57, | 544,58, | 544,59, | 544,60, | 544,61, | 544,62, | 544,63, | 544,64, | 544,65, | 544,66, | 544,67, | 544,68, | 544,69, | 544,70, | 544,71, | 544,72, | 544,73, | 544,74, | 544,75, | 544,76, | 544,77, | 544,78, | 544,79, | 544,80, | 544,81, | 544,82, | 544,83, | 544,84, | 544,85, | 545,1, | 545,2, | 545,3, | 545,4, | 545,5, | 545,6, | 545,7, | 545,8, | 545,9, | 545,10, | 545,11, | 545,12, | 545,13, | 545,14, | 545,15, | 545,16, | 545,17, | 545,18, | 545,19, | 545,20, | 545,21, | 545,22, | 545,23, | 545,24, | 545,25, | 545,26, | 545,27, | 545,28, | 545,29, | 545,30, | 545,31, | 545,32, | 545,33, | 545,34, | 545,35, | 545,36, | 545,37, | 545,38, | 545,39, | 545,40, | 545,41, | 545,42, | 545,43, | 545,44, | 545,45, | 545,46, | 545,47, | 545,48, | 545,49, | 545,50, | 545,51, | 545,52, | 545,53, | 545,54, | 545,55, | 545,56, | 545,57, | 545,58, | 545,59, | 545,60, | 545,61, | 545,62, | 545,63, | 545,64, | 545,65, | 545,66, | 545,67, | 545,68, | 545,69, | 545,70, | 545,71, | 545,72, | 545,73, | 545,74, | 545,75, | 545,76, | 545,77, | 545,78, | 545,79, | 545,80, | 545,81, | 545,82, | 545,83, | 545,84, | 545,85, | 546,1, | 546,2, | 546,3, | 546,4, | 546,5, | 546,6, | 546,7, | 546,8, | 546,9, | 546,10, | 546,11, | 546,12, | 546,13, | 546,14, | 546,15, | 546,16, | 546,17, | 546,18, | 546,19, | 546,20, | 546,21, | 546,22, | 546,23, | 546,24, | 546,25, | 546,26, | 546,27, | 546,28, | 546,29, | 546,30, | 546,31, | 546,32, | 546,33, | 546,34, | 546,35, | 546,36, | 546,37, | 546,38, | 546,39, | 546,40, | 546,41, | 546,42, | 546,43, | 546,44, | 546,45, | 546,46, | 546,47, | 546,48, | 546,49, | 546,50, | 546,51, | 546,52, | 546,53, | 546,54, | 546,55, | 546,56, | 546,57, | 546,58, | 546,59, | 546,60, | 546,61, | 546,62, | 546,63, | 546,64, | 546,65, | 546,66, | 546,67, | 546,68, | 546,69, | 546,70, | 546,71, | 546,72, | 546,73, | 546,74, | 546,75, | 546,76, | 546,77, | 546,78, | 546,79, | 546,80, | 546,81, | 546,82, | 546,83, | 546,84, | 546,85, | 547,1, | 547,2, | 547,3, | 547,4, | 547,5, | 547,6, | 547,7, | 547,8, | 547,9, | 547,10, | 547,11, | 547,12, | 547,13, | 547,14, | 547,15, | 547,16, | 547,17, | 547,18, | 547,19, | 547,20, | 547,21, | 547,22, | 547,23, | 547,24, | 547,25, | 547,26, | 547,27, | 547,28, | 547,29, | 547,30, | 547,31, | 547,32, | 547,33, | 547,34, | 547,35, | 547,36, | 547,37, | 547,38, | 547,39, | 547,40, | 547,41, | 547,42, | 547,43, | 547,44, | 547,45, | 547,46, | 547,47, | 547,48, | 547,49, | 547,50, | 547,51, | 547,52, | 547,53, | 547,54, | 547,55, | 547,56, | 547,57, | 547,58, | 547,59, | 547,60, | 547,61, | 547,62, | 547,63, | 547,64, | 547,65, | 547,66, | 547,67, | 547,68, | 547,69, | 547,70, | 547,71, | 547,72, | 547,73, | 547,74, | 547,75, | 547,76, | 547,77, | 547,78, | 547,79, | 547,80, | 547,81, | 547,82, | 547,83, | 547,84, | 547,85, | 548,1, | 548,2, | 548,3, | 548,4, | 548,5, | 548,6, | 548,7, | 548,8, | 548,9, | 548,10, | 548,11, | 548,12, | 548,13, | 548,14, | 548,15, | 548,16, | 548,17, | 548,18, | 548,19, | 548,20, | 548,21, | 548,22, | 548,23, | 548,24, | 548,25, | 548,26, | 548,27, | 548,28, | 548,29, | 548,30, | 548,31, | 548,32, | 548,33, | 548,34, | 548,35, | 548,36, | 548,37, | 548,38, | 548,39, | 548,40, | 548,41, | 548,42, | 548,43, | 548,44, | 548,45, | 548,46, | 548,47, | 548,48, | 548,49, | 548,50, | 548,51, | 548,52, | 548,53, | 548,54, | 548,55, | 548,56, | 548,57, | 548,58, | 548,59, | 548,60, | 548,61, | 548,62, | 548,63, | 548,64, | 548,65, | 548,66, | 548,67, | 548,68, | 548,69, | 548,70, | 548,71, | 548,72, | 548,73, | 548,74, | 548,75, | 548,76, | 548,77, | 548,78, | 548,79, | 548,80, | 548,81, | 548,82, | 548,83, | 548,84, | 548,85, | 549,1, | 549,2, | 549,3, | 549,4, | 549,5, | 549,6, | 549,7, | 549,8, | 549,9, | 549,10, | 549,11, | 549,12, | 549,13, | 549,14, | 549,15, | 549,16, | 549,17, | 549,18, | 549,19, | 549,20, | 549,21, | 549,22, | 549,23, | 549,24, | 549,25, | 549,26, | 549,27, | 549,28, | 549,29, | 549,30, | 549,31, | 549,32, | 549,33, | 549,34, | 549,35, | 549,36, | 549,37, | 549,38, | 549,39, | 549,40, | 549,41, | 549,42, | 549,43, | 549,44, | 549,45, | 549,46, | 549,47, | 549,48, | 549,49, | 549,50, | 549,51, | 549,52, | 549,53, | 549,54, | 549,55, | 549,56, | 549,57, | 549,58, | 549,59, | 549,60, | 549,61, | 549,62, | 549,63, | 549,64, | 549,65, | 549,66, | 549,67, | 549,68, | 549,69, | 549,70, | 549,71, | 549,72, | 549,73, | 549,74, | 549,75, | 549,76, | 549,77, | 549,78, | 549,79, | 549,80, | 549,81, | 549,82, | 549,83, | 549,84, | 549,85, | 550,1, | 550,2, | 550,3, | 550,4, | 550,5, | 550,6, | 550,7, | 550,8, | 550,9, | 550,10, | 550,11, | 550,12, | 550,13, | 550,14, | 550,15, | 550,16, | 550,17, | 550,18, | 550,19, | 550,20, | 550,21, | 550,22, | 550,23, | 550,24, | 550,25, | 550,26, | 550,27, | 550,28, | 550,29, | 550,30, | 550,31, | 550,32, | 550,33, | 550,34, | 550,35, | 550,36, | 550,37, | 550,38, | 550,39, | 550,40, | 550,41, | 550,42, | 550,43, | 550,44, | 550,45, | 550,46, | 550,47, | 550,48, | 550,49, | 550,50, | 550,51, | 550,52, | 550,53, | 550,54, | 550,55, | 550,56, | 550,57, | 550,58, | 550,59, | 550,60, | 550,61, | 550,62, | 550,63, | 550,64, | 550,65, | 550,66, | 550,67, | 550,68, | 550,69, | 550,70, | 550,71, | 550,72, | 550,73, | 550,74, | 550,75, | 550,76, | 550,77, | 550,78, | 550,79, | 550,80, | 550,81, | 550,82, | 550,83, | 550,84, | 550,85, | 551,1, | 551,2, | 551,3, | 551,4, | 551,5, | 551,6, | 551,7, | 551,8, | 551,9, | 551,10, | 551,11, | 551,12, | 551,13, | 551,14, | 551,15, | 551,16, | 551,17, | 551,18, | 551,19, | 551,20, | 551,21, | 551,22, | 551,23, | 551,24, | 551,25, | 551,26, | 551,27, | 551,28, | 551,29, | 551,30, | 551,31, | 551,32, | 551,33, | 551,34, | 551,35, | 551,36, | 551,37, | 551,38, | 551,39, | 551,40, | 551,41, | 551,42, | 551,43, | 551,44, | 551,45, | 551,46, | 551,47, | 551,48, | 551,49, | 551,50, | 551,51, | 551,52, | 551,53, | 551,54, | 551,55, | 551,56, | 551,57, | 551,58, | 551,59, | 551,60, | 551,61, | 551,62, | 551,63, | 551,64, | 551,65, | 551,66, | 551,67, | 551,68, | 551,69, | 551,70, | 551,71, | 551,72, | 551,73, | 551,74, | 551,75, | 551,76, | 551,77, | 551,78, | 551,79, | 551,80, | 551,81, | 551,82, | 551,83, | 551,84, | 551,85, | 552,1, | 552,2, | 552,3, | 552,4, | 552,5, | 552,6, | 552,7, | 552,8, | 552,9, | 552,10, | 552,11, | 552,12, | 552,13, | 552,14, | 552,15, | 552,16, | 552,17, | 552,18, | 552,19, | 552,20, | 552,21, | 552,22, | 552,23, | 552,24, | 552,25, | 552,26, | 552,27, | 552,28, | 552,29, | 552,30, | 552,31, | 552,32, | 552,33, | 552,34, | 552,35, | 552,36, | 552,37, | 552,38, | 552,39, | 552,40, | 552,41, | 552,42, | 552,43, | 552,44, | 552,45, | 552,46, | 552,47, | 552,48, | 552,49, | 552,50, | 552,51, | 552,52, | 552,53, | 552,54, | 552,55, | 552,56, | 552,57, | 552,58, | 552,59, | 552,60, | 552,61, | 552,62, | 552,63, | 552,64, | 552,65, | 552,66, | 552,67, | 552,68, | 552,69, | 552,70, | 552,71, | 552,72, | 552,73, | 552,74, | 552,75, | 552,76, | 552,77, | 552,78, | 552,79, | 552,80, | 552,81, | 552,82, | 552,83, | 552,84, | 552,85, | 553,1, | 553,2, | 553,3, | 553,4, | 553,5, | 553,6, | 553,7, | 553,8, | 553,9, | 553,10, | 553,11, | 553,12, | 553,13, | 553,14, | 553,15, | 553,16, | 553,17, | 553,18, | 553,19, | 553,20, | 553,21, | 553,22, | 553,23, | 553,24, | 553,25, | 553,26, | 553,27, | 553,28, | 553,29, | 553,30, | 553,31, | 553,32, | 553,33, | 553,34, | 553,35, | 553,36, | 553,37, | 553,38, | 553,39, | 553,40, | 553,41, | 553,42, | 553,43, | 553,44, | 553,45, | 553,46, | 553,47, | 553,48, | 553,49, | 553,50, | 553,51, | 553,52, | 553,53, | 553,54, | 553,55, | 553,56, | 553,57, | 553,58, | 553,59, | 553,60, | 553,61, | 553,62, | 553,63, | 553,64, | 553,65, | 553,66, | 553,67, | 553,68, | 553,69, | 553,70, | 553,71, | 553,72, | 553,73, | 553,74, | 553,75, | 553,76, | 553,77, | 553,78, | 553,79, | 553,80, | 553,81, | 553,82, | 553,83, | 553,84, | 553,85, | 554,1, | 554,2, | 554,3, | 554,4, | 554,5, | 554,6, | 554,7, | 554,8, | 554,9, | 554,10, | 554,11, | 554,12, | 554,13, | 554,14, | 554,15, | 554,16, | 554,17, | 554,18, | 554,19, | 554,20, | 554,21, | 554,22, | 554,23, | 554,24, | 554,25, | 554,26, | 554,27, | 554,28, | 554,29, | 554,30, | 554,31, | 554,32, | 554,33, | 554,34, | 554,35, | 554,36, | 554,37, | 554,38, | 554,39, | 554,40, | 554,41, | 554,42, | 554,43, | 554,44, | 554,45, | 554,46, | 554,47, | 554,48, | 554,49, | 554,50, | 554,51, | 554,52, | 554,53, | 554,54, | 554,55, | 554,56, | 554,57, | 554,58, | 554,59, | 554,60, | 554,61, | 554,62, | 554,63, | 554,64, | 554,65, | 554,66, | 554,67, | 554,68, | 554,69, | 554,70, | 554,71, | 554,72, | 554,73, | 554,74, | 554,75, | 554,76, | 554,77, | 554,78, | 554,79, | 554,80, | 554,81, | 554,82, | 554,83, | 554,84, | 554,85, | 555,1, | 555,2, | 555,3, | 555,4, | 555,5, | 555,6, | 555,7, | 555,8, | 555,9, | 555,10, | 555,11, | 555,12, | 555,13, | 555,14, | 555,15, | 555,16, | 555,17, | 555,18, | 555,19, | 555,20, | 555,21, | 555,22, | 555,23, | 555,24, | 555,25, | 555,26, | 555,27, | 555,28, | 555,29, | 555,30, | 555,31, | 555,32, | 555,33, | 555,34, | 555,35, | 555,36, | 555,37, | 555,38, | 555,39, | 555,40, | 555,41, | 555,42, | 555,43, | 555,44, | 555,45, | 555,46, | 555,47, | 555,48, | 555,49, | 555,50, | 555,51, | 555,52, | 555,53, | 555,54, | 555,55, | 555,56, | 555,57, | 555,58, | 555,59, | 555,60, | 555,61, | 555,62, | 555,63, | 555,64, | 555,65, | 555,66, | 555,67, | 555,68, | 555,69, | 555,70, | 555,71, | 555,72, | 555,73, | 555,74, | 555,75, | 555,76, | 555,77, | 555,78, | 555,79, | 555,80, | 555,81, | 555,82, | 555,83, | 555,84, | 555,85, | 556,1, | 556,2, | 556,3, | 556,4, | 556,5, | 556,6, | 556,7, | 556,8, | 556,9, | 556,10, | 556,11, | 556,12, | 556,13, | 556,14, | 556,15, | 556,16, | 556,17, | 556,18, | 556,19, | 556,20, | 556,21, | 556,22, | 556,23, | 556,24, | 556,25, | 556,26, | 556,27, | 556,28, | 556,29, | 556,30, | 556,31, | 556,32, | 556,33, | 556,34, | 556,35, | 556,36, | 556,37, | 556,38, | 556,39, | 556,40, | 556,41, | 556,42, | 556,43, | 556,44, | 556,45, | 556,46, | 556,47, | 556,48, | 556,49, | 556,50, | 556,51, | 556,52, | 556,53, | 556,54, | 556,55, | 556,56, | 556,57, | 556,58, | 556,59, | 556,60, | 556,61, | 556,62, | 556,63, | 556,64, | 556,65, | 556,66, | 556,67, | 556,68, | 556,69, | 556,70, | 556,71, | 556,72, | 556,73, | 556,74, | 556,75, | 556,76, | 556,77, | 556,78, | 556,79, | 556,80, | 556,81, | 556,82, | 556,83, | 556,84, | 556,85, | 557,1, | 557,2, | 557,3, | 557,4, | 557,5, | 557,6, | 557,7, | 557,8, | 557,9, | 557,10, | 557,11, | 557,12, | 557,13, | 557,14, | 557,15, | 557,16, | 557,17, | 557,18, | 557,19, | 557,20, | 557,21, | 557,22, | 557,23, | 557,24, | 557,25, | 557,26, | 557,27, | 557,28, | 557,29, | 557,30, | 557,31, | 557,32, | 557,33, | 557,34, | 557,35, | 557,36, | 557,37, | 557,38, | 557,39, | 557,40, | 557,41, | 557,42, | 557,43, | 557,44, | 557,45, | 557,46, | 557,47, | 557,48, | 557,49, | 557,50, | 557,51, | 557,52, | 557,53, | 557,54, | 557,55, | 557,56, | 557,57, | 557,58, | 557,59, | 557,60, | 557,61, | 557,62, | 557,63, | 557,64, | 557,65, | 557,66, | 557,67, | 557,68, | 557,69, | 557,70, | 557,71, | 557,72, | 557,73, | 557,74, | 557,75, | 557,76, | 557,77, | 557,78, | 557,79, | 557,80, | 557,81, | 557,82, | 557,83, | 557,84, | 557,85, | 558,1, | 558,2, | 558,3, | 558,4, | 558,5, | 558,6, | 558,7, | 558,8, | 558,9, | 558,10, | 558,11, | 558,12, | 558,13, | 558,14, | 558,15, | 558,16, | 558,17, | 558,18, | 558,19, | 558,20, | 558,21, | 558,22, | 558,23, | 558,24, | 558,25, | 558,26, | 558,27, | 558,28, | 558,29, | 558,30, | 558,31, | 558,32, | 558,33, | 558,34, | 558,35, | 558,36, | 558,37, | 558,38, | 558,39, | 558,40, | 558,41, | 558,42, | 558,43, | 558,44, | 558,45, | 558,46, | 558,47, | 558,48, | 558,49, | 558,50, | 558,51, | 558,52, | 558,53, | 558,54, | 558,55, | 558,56, | 558,57, | 558,58, | 558,59, | 558,60, | 558,61, | 558,62, | 558,63, | 558,64, | 558,65, | 558,66, | 558,67, | 558,68, | 558,69, | 558,70, | 558,71, | 558,72, | 558,73, | 558,74, | 558,75, | 558,76, | 558,77, | 558,78, | 558,79, | 558,80, | 558,81, | 558,82, | 558,83, | 558,84, | 558,85, | 559,1, | 559,2, | 559,3, | 559,4, | 559,5, | 559,6, | 559,7, | 559,8, | 559,9, | 559,10, | 559,11, | 559,12, | 559,13, | 559,14, | 559,15, | 559,16, | 559,17, | 559,18, | 559,19, | 559,20, | 559,21, | 559,22, | 559,23, | 559,24, | 559,25, | 559,26, | 559,27, | 559,28, | 559,29, | 559,30, | 559,31, | 559,32, | 559,33, | 559,34, | 559,35, | 559,36, | 559,37, | 559,38, | 559,39, | 559,40, | 559,41, | 559,42, | 559,43, | 559,44, | 559,45, | 559,46, | 559,47, | 559,48, | 559,49, | 559,50, | 559,51, | 559,52, | 559,53, | 559,54, | 559,55, | 559,56, | 559,57, | 559,58, | 559,59, | 559,60, | 559,61, | 559,62, | 559,63, | 559,64, | 559,65, | 559,66, | 559,67, | 559,68, | 559,69, | 559,70, | 559,71, | 559,72, | 559,73, | 559,74, | 559,75, | 559,76, | 559,77, | 559,78, | 559,79, | 559,80, | 559,81, | 559,82, | 559,83, | 559,84, | 559,85, | 560,1, | 560,2, | 560,3, | 560,4, | 560,5, | 560,6, | 560,7, | 560,8, | 560,9, | 560,10, | 560,11, | 560,12, | 560,13, | 560,14, | 560,15, | 560,16, | 560,17, | 560,18, | 560,19, | 560,20, | 560,21, | 560,22, | 560,23, | 560,24, | 560,25, | 560,26, | 560,27, | 560,28, | 560,29, | 560,30, | 560,31, | 560,32, | 560,33, | 560,34, | 560,35, | 560,36, | 560,37, | 560,38, | 560,39, | 560,40, | 560,41, | 560,42, | 560,43, | 560,44, | 560,45, | 560,46, | 560,47, | 560,48, | 560,49, | 560,50, | 560,51, | 560,52, | 560,53, | 560,54, | 560,55, | 560,56, | 560,57, | 560,58, | 560,59, | 560,60, | 560,61, | 560,62, | 560,63, | 560,64, | 560,65, | 560,66, | 560,67, | 560,68, | 560,69, | 560,70, | 560,71, | 560,72, | 560,73, | 560,74, | 560,75, | 560,76, | 560,77, | 560,78, | 560,79, | 560,80, | 560,81, | 560,82, | 560,83, | 560,84, | 560,85, | 561,1, | 561,2, | 561,3, | 561,4, | 561,5, | 561,6, | 561,7, | 561,8, | 561,9, | 561,10, | 561,11, | 561,12, | 561,13, | 561,14, | 561,15, | 561,16, | 561,17, | 561,18, | 561,19, | 561,20, | 561,21, | 561,22, | 561,23, | 561,24, | 561,25, | 561,26, | 561,27, | 561,28, | 561,29, | 561,30, | 561,31, | 561,32, | 561,33, | 561,34, | 561,35, | 561,36, | 561,37, | 561,38, | 561,39, | 561,40, | 561,41, | 561,42, | 561,43, | 561,44, | 561,45, | 561,46, | 561,47, | 561,48, | 561,49, | 561,50, | 561,51, | 561,52, | 561,53, | 561,54, | 561,55, | 561,56, | 561,57, | 561,58, | 561,59, | 561,60, | 561,61, | 561,62, | 561,63, | 561,64, | 561,65, | 561,66, | 561,67, | 561,68, | 561,69, | 561,70, | 561,71, | 561,72, | 561,73, | 561,74, | 561,75, | 561,76, | 561,77, | 561,78, | 561,79, | 561,80, | 561,81, | 561,82, | 561,83, | 561,84, | 561,85, | 562,1, | 562,2, | 562,3, | 562,4, | 562,5, | 562,6, | 562,7, | 562,8, | 562,9, | 562,10, | 562,11, | 562,12, | 562,13, | 562,14, | 562,15, | 562,16, | 562,17, | 562,18, | 562,19, | 562,20, | 562,21, | 562,22, | 562,23, | 562,24, | 562,25, | 562,26, | 562,27, | 562,28, | 562,29, | 562,30, | 562,31, | 562,32, | 562,33, | 562,34, | 562,35, | 562,36, | 562,37, | 562,38, | 562,39, | 562,40, | 562,41, | 562,42, | 562,43, | 562,44, | 562,45, | 562,46, | 562,47, | 562,48, | 562,49, | 562,50, | 562,51, | 562,52, | 562,53, | 562,54, | 562,55, | 562,56, | 562,57, | 562,58, | 562,59, | 562,60, | 562,61, | 562,62, | 562,63, | 562,64, | 562,65, | 562,66, | 562,67, | 562,68, | 562,69, | 562,70, | 562,71, | 562,72, | 562,73, | 562,74, | 562,75, | 562,76, | 562,77, | 562,78, | 562,79, | 562,80, | 562,81, | 562,82, | 562,83, | 562,84, | 562,85, | 563,1, | 563,2, | 563,3, | 563,4, | 563,5, | 563,6, | 563,7, | 563,8, | 563,9, | 563,10, | 563,11, | 563,12, | 563,13, | 563,14, | 563,15, | 563,16, | 563,17, | 563,18, | 563,19, | 563,20, | 563,21, | 563,22, | 563,23, | 563,24, | 563,25, | 563,26, | 563,27, | 563,28, | 563,29, | 563,30, | 563,31, | 563,32, | 563,33, | 563,34, | 563,35, | 563,36, | 563,37, | 563,38, | 563,39, | 563,40, | 563,41, | 563,42, | 563,43, | 563,44, | 563,45, | 563,46, | 563,47, | 563,48, | 563,49, | 563,50, | 563,51, | 563,52, | 563,53, | 563,54, | 563,55, | 563,56, | 563,57, | 563,58, | 563,59, | 563,60, | 563,61, | 563,62, | 563,63, | 563,64, | 563,65, | 563,66, | 563,67, | 563,68, | 563,69, | 563,70, | 563,71, | 563,72, | 563,73, | 563,74, | 563,75, | 563,76, | 563,77, | 563,78, | 563,79, | 563,80, | 563,81, | 563,82, | 563,83, | 563,84, | 563,85, | 564,1, | 564,2, | 564,3, | 564,4, | 564,5, | 564,6, | 564,7, | 564,8, | 564,9, | 564,10, | 564,11, | 564,12, | 564,13, | 564,14, | 564,15, | 564,16, | 564,17, | 564,18, | 564,19, | 564,20, | 564,21, | 564,22, | 564,23, | 564,24, | 564,25, | 564,26, | 564,27, | 564,28, | 564,29, | 564,30, | 564,31, | 564,32, | 564,33, | 564,34, | 564,35, | 564,36, | 564,37, | 564,38, | 564,39, | 564,40, | 564,41, | 564,42, | 564,43, | 564,44, | 564,45, | 564,46, | 564,47, | 564,48, | 564,49, | 564,50, | 564,51, | 564,52, | 564,53, | 564,54, | 564,55, | 564,56, | 564,57, | 564,58, | 564,59, | 564,60, | 564,61, | 564,62, | 564,63, | 564,64, | 564,65, | 564,66, | 564,67, | 564,68, | 564,69, | 564,70, | 564,71, | 564,72, | 564,73, | 564,74, | 564,75, | 564,76, | 564,77, | 564,78, | 564,79, | 564,80, | 564,81, | 564,82, | 564,83, | 564,84, | 564,85, | 565,1, | 565,2, | 565,3, | 565,4, | 565,5, | 565,6, | 565,7, | 565,8, | 565,9, | 565,10, | 565,11, | 565,12, | 565,13, | 565,14, | 565,15, | 565,16, | 565,17, | 565,18, | 565,19, | 565,20, | 565,21, | 565,22, | 565,23, | 565,24, | 565,25, | 565,26, | 565,27, | 565,28, | 565,29, | 565,30, | 565,31, | 565,32, | 565,33, | 565,34, | 565,35, | 565,36, | 565,37, | 565,38, | 565,39, | 565,40, | 565,41, | 565,42, | 565,43, | 565,44, | 565,45, | 565,46, | 565,47, | 565,48, | 565,49, | 565,50, | 565,51, | 565,52, | 565,53, | 565,54, | 565,55, | 565,56, | 565,57, | 565,58, | 565,59, | 565,60, | 565,61, | 565,62, | 565,63, | 565,64, | 565,65, | 565,66, | 565,67, | 565,68, | 565,69, | 565,70, | 565,71, | 565,72, | 565,73, | 565,74, | 565,75, | 565,76, | 565,77, | 565,78, | 565,79, | 565,80, | 565,81, | 565,82, | 565,83, | 565,84, | 565,85, | 566,1, | 566,2, | 566,3, | 566,4, | 566,5, | 566,6, | 566,7, | 566,8, | 566,9, | 566,10, | 566,11, | 566,12, | 566,13, | 566,14, | 566,15, | 566,16, | 566,17, | 566,18, | 566,19, | 566,20, | 566,21, | 566,22, | 566,23, | 566,24, | 566,25, | 566,26, | 566,27, | 566,28, | 566,29, | 566,30, | 566,31, | 566,32, | 566,33, | 566,34, | 566,35, | 566,36, | 566,37, | 566,38, | 566,39, | 566,40, | 566,41, | 566,42, | 566,43, | 566,44, | 566,45, | 566,46, | 566,47, | 566,48, | 566,49, | 566,50, | 566,51, | 566,52, | 566,53, | 566,54, | 566,55, | 566,56, | 566,57, | 566,58, | 566,59, | 566,60, | 566,61, | 566,62, | 566,63, | 566,64, | 566,65, | 566,66, | 566,67, | 566,68, | 566,69, | 566,70, | 566,71, | 566,72, | 566,73, | 566,74, | 566,75, | 566,76, | 566,77, | 566,78, | 566,79, | 566,80, | 566,81, | 566,82, | 566,83, | 566,84, | 566,85, | 567,1, | 567,2, | 567,3, | 567,4, | 567,5, | 567,6, | 567,7, | 567,8, | 567,9, | 567,10, | 567,11, | 567,12, | 567,13, | 567,14, | 567,15, | 567,16, | 567,17, | 567,18, | 567,19, | 567,20, | 567,21, | 567,22, | 567,23, | 567,24, | 567,25, | 567,26, | 567,27, | 567,28, | 567,29, | 567,30, | 567,31, | 567,32, | 567,33, | 567,34, | 567,35, | 567,36, | 567,37, | 567,38, | 567,39, | 567,40, | 567,41, | 567,42, | 567,43, | 567,44, | 567,45, | 567,46, | 567,47, | 567,48, | 567,49, | 567,50, | 567,51, | 567,52, | 567,53, | 567,54, | 567,55, | 567,56, | 567,57, | 567,58, | 567,59, | 567,60, | 567,61, | 567,62, | 567,63, | 567,64, | 567,65, | 567,66, | 567,67, | 567,68, | 567,69, | 567,70, | 567,71, | 567,72, | 567,73, | 567,74, | 567,75, | 567,76, | 567,77, | 567,78, | 567,79, | 567,80, | 567,81, | 567,82, | 567,83, | 567,84, | 567,85, | 568,1, | 568,2, | 568,3, | 568,4, | 568,5, | 568,6, | 568,7, | 568,8, | 568,9, | 568,10, | 568,11, | 568,12, | 568,13, | 568,14, | 568,15, | 568,16, | 568,17, | 568,18, | 568,19, | 568,20, | 568,21, | 568,22, | 568,23, | 568,24, | 568,25, | 568,26, | 568,27, | 568,28, | 568,29, | 568,30, | 568,31, | 568,32, | 568,33, | 568,34, | 568,35, | 568,36, | 568,37, | 568,38, | 568,39, | 568,40, | 568,41, | 568,42, | 568,43, | 568,44, | 568,45, | 568,46, | 568,47, | 568,48, | 568,49, | 568,50, | 568,51, | 568,52, | 568,53, | 568,54, | 568,55, | 568,56, | 568,57, | 568,58, | 568,59, | 568,60, | 568,61, | 568,62, | 568,63, | 568,64, | 568,65, | 568,66, | 568,67, | 568,68, | 568,69, | 568,70, | 568,71, | 568,72, | 568,73, | 568,74, | 568,75, | 568,76, | 568,77, | 568,78, | 568,79, | 568,80, | 568,81, | 568,82, | 568,83, | 568,84, | 568,85, | 569,1, | 569,2, | 569,3, | 569,4, | 569,5, | 569,6, | 569,7, | 569,8, | 569,9, | 569,10, | 569,11, | 569,12, | 569,13, | 569,14, | 569,15, | 569,16, | 569,17, | 569,18, | 569,19, | 569,20, | 569,21, | 569,22, | 569,23, | 569,24, | 569,25, | 569,26, | 569,27, | 569,28, | 569,29, | 569,30, | 569,31, | 569,32, | 569,33, | 569,34, | 569,35, | 569,36, | 569,37, | 569,38, | 569,39, | 569,40, | 569,41, | 569,42, | 569,43, | 569,44, | 569,45, | 569,46, | 569,47, | 569,48, | 569,49, | 569,50, | 569,51, | 569,52, | 569,53, | 569,54, | 569,55, | 569,56, | 569,57, | 569,58, | 569,59, | 569,60, | 569,61, | 569,62, | 569,63, | 569,64, | 569,65, | 569,66, | 569,67, | 569,68, | 569,69, | 569,70, | 569,71, | 569,72, | 569,73, | 569,74, | 569,75, | 569,76, | 569,77, | 569,78, | 569,79, | 569,80, | 569,81, | 569,82, | 569,83, | 569,84, | 569,85, | 570,1, | 570,2, | 570,3, | 570,4, | 570,5, | 570,6, | 570,7, | 570,8, | 570,9, | 570,10, | 570,11, | 570,12, | 570,13, | 570,14, | 570,15, | 570,16, | 570,17, | 570,18, | 570,19, | 570,20, | 570,21, | 570,22, | 570,23, | 570,24, | 570,25, | 570,26, | 570,27, | 570,28, | 570,29, | 570,30, | 570,31, | 570,32, | 570,33, | 570,34, | 570,35, | 570,36, | 570,37, | 570,38, | 570,39, | 570,40, | 570,41, | 570,42, | 570,43, | 570,44, | 570,45, | 570,46, | 570,47, | 570,48, | 570,49, | 570,50, | 570,51, | 570,52, | 570,53, | 570,54, | 570,55, | 570,56, | 570,57, | 570,58, | 570,59, | 570,60, | 570,61, | 570,62, | 570,63, | 570,64, | 570,65, | 570,66, | 570,67, | 570,68, | 570,69, | 570,70, | 570,71, | 570,72, | 570,73, | 570,74, | 570,75, | 570,76, | 570,77, | 570,78, | 570,79, | 570,80, | 570,81, | 570,82, | 570,83, | 570,84, | 570,85, | 571,1, | 571,2, | 571,3, | 571,4, | 571,5, | 571,6, | 571,7, | 571,8, | 571,9, | 571,10, | 571,11, | 571,12, | 571,13, | 571,14, | 571,15, | 571,16, | 571,17, | 571,18, | 571,19, | 571,20, | 571,21, | 571,22, | 571,23, | 571,24, | 571,25, | 571,26, | 571,27, | 571,28, | 571,29, | 571,30, | 571,31, | 571,32, | 571,33, | 571,34, | 571,35, | 571,36, | 571,37, | 571,38, | 571,39, | 571,40, | 571,41, | 571,42, | 571,43, | 571,44, | 571,45, | 571,46, | 571,47, | 571,48, | 571,49, | 571,50, | 571,51, | 571,52, | 571,53, | 571,54, | 571,55, | 571,56, | 571,57, | 571,58, | 571,59, | 571,60, | 571,61, | 571,62, | 571,63, | 571,64, | 571,65, | 571,66, | 571,67, | 571,68, | 571,69, | 571,70, | 571,71, | 571,72, | 571,73, | 571,74, | 571,75, | 571,76, | 571,77, | 571,78, | 571,79, | 571,80, | 571,81, | 571,82, | 571,83, | 571,84, | 571,85, | 572,1, | 572,2, | 572,3, | 572,4, | 572,5, | 572,6, | 572,7, | 572,8, | 572,9, | 572,10, | 572,11, | 572,12, | 572,13, | 572,14, | 572,15, | 572,16, | 572,17, | 572,18, | 572,19, | 572,20, | 572,21, | 572,22, | 572,23, | 572,24, | 572,25, | 572,26, | 572,27, | 572,28, | 572,29, | 572,30, | 572,31, | 572,32, | 572,33, | 572,34, | 572,35, | 572,36, | 572,37, | 572,38, | 572,39, | 572,40, | 572,41, | 572,42, | 572,43, | 572,44, | 572,45, | 572,46, | 572,47, | 572,48, | 572,49, | 572,50, | 572,51, | 572,52, | 572,53, | 572,54, | 572,55, | 572,56, | 572,57, | 572,58, | 572,59, | 572,60, | 572,61, | 572,62, | 572,63, | 572,64, | 572,65, | 572,66, | 572,67, | 572,68, | 572,69, | 572,70, | 572,71, | 572,72, | 572,73, | 572,74, | 572,75, | 572,76, | 572,77, | 572,78, | 572,79, | 572,80, | 572,81, | 572,82, | 572,83, | 572,84, | 572,85, | 573,1, | 573,2, | 573,3, | 573,4, | 573,5, | 573,6, | 573,7, | 573,8, | 573,9, | 573,10, | 573,11, | 573,12, | 573,13, | 573,14, | 573,15, | 573,16, | 573,17, | 573,18, | 573,19, | 573,20, | 573,21, | 573,22, | 573,23, | 573,24, | 573,25, | 573,26, | 573,27, | 573,28, | 573,29, | 573,30, | 573,31, | 573,32, | 573,33, | 573,34, | 573,35, | 573,36, | 573,37, | 573,38, | 573,39, | 573,40, | 573,41, | 573,42, | 573,43, | 573,44, | 573,45, | 573,46, | 573,47, | 573,48, | 573,49, | 573,50, | 573,51, | 573,52, | 573,53, | 573,54, | 573,55, | 573,56, | 573,57, | 573,58, | 573,59, | 573,60, | 573,61, | 573,62, | 573,63, | 573,64, | 573,65, | 573,66, | 573,67, | 573,68, | 573,69, | 573,70, | 573,71, | 573,72, | 573,73, | 573,74, | 573,75, | 573,76, | 573,77, | 573,78, | 573,79, | 573,80, | 573,81, | 573,82, | 573,83, | 573,84, | 573,85, | 574,1, | 574,2, | 574,3, | 574,4, | 574,5, | 574,6, | 574,7, | 574,8, | 574,9, | 574,10, | 574,11, | 574,12, | 574,13, | 574,14, | 574,15, | 574,16, | 574,17, | 574,18, | 574,19, | 574,20, | 574,21, | 574,22, | 574,23, | 574,24, | 574,25, | 574,26, | 574,27, | 574,28, | 574,29, | 574,30, | 574,31, | 574,32, | 574,33, | 574,34, | 574,35, | 574,36, | 574,37, | 574,38, | 574,39, | 574,40, | 574,41, | 574,42, | 574,43, | 574,44, | 574,45, | 574,46, | 574,47, | 574,48, | 574,49, | 574,50, | 574,51, | 574,52, | 574,53, | 574,54, | 574,55, | 574,56, | 574,57, | 574,58, | 574,59, | 574,60, | 574,61, | 574,62, | 574,63, | 574,64, | 574,65, | 574,66, | 574,67, | 574,68, | 574,69, | 574,70, | 574,71, | 574,72, | 574,73, | 574,74, | 574,75, | 574,76, | 574,77, | 574,78, | 574,79, | 574,80, | 574,81, | 574,82, | 574,83, | 574,84, | 574,85, | 575,1, | 575,2, | 575,3, | 575,4, | 575,5, | 575,6, | 575,7, | 575,8, | 575,9, | 575,10, | 575,11, | 575,12, | 575,13, | 575,14, | 575,15, | 575,16, | 575,17, | 575,18, | 575,19, | 575,20, | 575,21, | 575,22, | 575,23, | 575,24, | 575,25, | 575,26, | 575,27, | 575,28, | 575,29, | 575,30, | 575,31, | 575,32, | 575,33, | 575,34, | 575,35, | 575,36, | 575,37, | 575,38, | 575,39, | 575,40, | 575,41, | 575,42, | 575,43, | 575,44, | 575,45, | 575,46, | 575,47, | 575,48, | 575,49, | 575,50, | 575,51, | 575,52, | 575,53, | 575,54, | 575,55, | 575,56, | 575,57, | 575,58, | 575,59, | 575,60, | 575,61, | 575,62, | 575,63, | 575,64, | 575,65, | 575,66, | 575,67, | 575,68, | 575,69, | 575,70, | 575,71, | 575,72, | 575,73, | 575,74, | 575,75, | 575,76, | 575,77, | 575,78, | 575,79, | 575,80, | 575,81, | 575,82, | 575,83, | 575,84, | 575,85, | 576,1, | 576,2, | 576,3, | 576,4, | 576,5, | 576,6, | 576,7, | 576,8, | 576,9, | 576,10, | 576,11, | 576,12, | 576,13, | 576,14, | 576,15, | 576,16, | 576,17, | 576,18, | 576,19, | 576,20, | 576,21, | 576,22, | 576,23, | 576,24, | 576,25, | 576,26, | 576,27, | 576,28, | 576,29, | 576,30, | 576,31, | 576,32, | 576,33, | 576,34, | 576,35, | 576,36, | 576,37, | 576,38, | 576,39, | 576,40, | 576,41, | 576,42, | 576,43, | 576,44, | 576,45, | 576,46, | 576,47, | 576,48, | 576,49, | 576,50, | 576,51, | 576,52, | 576,53, | 576,54, | 576,55, | 576,56, | 576,57, | 576,58, | 576,59, | 576,60, | 576,61, | 576,62, | 576,63, | 576,64, | 576,65, | 576,66, | 576,67, | 576,68, | 576,69, | 576,70, | 576,71, | 576,72, | 576,73, | 576,74, | 576,75, | 576,76, | 576,77, | 576,78, | 576,79, | 576,80, | 576,81, | 576,82, | 576,83, | 576,84, | 576,85, | 577,1, | 577,2, | 577,3, | 577,4, | 577,5, | 577,6, | 577,7, | 577,8, | 577,9, | 577,10, | 577,11, | 577,12, | 577,13, | 577,14, | 577,15, | 577,16, | 577,17, | 577,18, | 577,19, | 577,20, | 577,21, | 577,22, | 577,23, | 577,24, | 577,25, | 577,26, | 577,27, | 577,28, | 577,29, | 577,30, | 577,31, | 577,32, | 577,33, | 577,34, | 577,35, | 577,36, | 577,37, | 577,38, | 577,39, | 577,40, | 577,41, | 577,42, | 577,43, | 577,44, | 577,45, | 577,46, | 577,47, | 577,48, | 577,49, | 577,50, | 577,51, | 577,52, | 577,53, | 577,54, | 577,55, | 577,56, | 577,57, | 577,58, | 577,59, | 577,60, | 577,61, | 577,62, | 577,63, | 577,64, | 577,65, | 577,66, | 577,67, | 577,68, | 577,69, | 577,70, | 577,71, | 577,72, | 577,73, | 577,74, | 577,75, | 577,76, | 577,77, | 577,78, | 577,79, | 577,80, | 577,81, | 577,82, | 577,83, | 577,84, | 577,85, | 578,1, | 578,2, | 578,3, | 578,4, | 578,5, | 578,6, | 578,7, | 578,8, | 578,9, | 578,10, | 578,11, | 578,12, | 578,13, | 578,14, | 578,15, | 578,16, | 578,17, | 578,18, | 578,19, | 578,20, | 578,21, | 578,22, | 578,23, | 578,24, | 578,25, | 578,26, | 578,27, | 578,28, | 578,29, | 578,30, | 578,31, | 578,32, | 578,33, | 578,34, | 578,35, | 578,36, | 578,37, | 578,38, | 578,39, | 578,40, | 578,41, | 578,42, | 578,43, | 578,44, | 578,45, | 578,46, | 578,47, | 578,48, | 578,49, | 578,50, | 578,51, | 578,52, | 578,53, | 578,54, | 578,55, | 578,56, | 578,57, | 578,58, | 578,59, | 578,60, | 578,61, | 578,62, | 578,63, | 578,64, | 578,65, | 578,66, | 578,67, | 578,68, | 578,69, | 578,70, | 578,71, | 578,72, | 578,73, | 578,74, | 578,75, | 578,76, | 578,77, | 578,78, | 578,79, | 578,80, | 578,81, | 578,82, | 578,83, | 578,84, | 578,85, | 579,1, | 579,2, | 579,3, | 579,4, | 579,5, | 579,6, | 579,7, | 579,8, | 579,9, | 579,10, | 579,11, | 579,12, | 579,13, | 579,14, | 579,15, | 579,16, | 579,17, | 579,18, | 579,19, | 579,20, | 579,21, | 579,22, | 579,23, | 579,24, | 579,25, | 579,26, | 579,27, | 579,28, | 579,29, | 579,30, | 579,31, | 579,32, | 579,33, | 579,34, | 579,35, | 579,36, | 579,37, | 579,38, | 579,39, | 579,40, | 579,41, | 579,42, | 579,43, | 579,44, | 579,45, | 579,46, | 579,47, | 579,48, | 579,49, | 579,50, | 579,51, | 579,52, | 579,53, | 579,54, | 579,55, | 579,56, | 579,57, | 579,58, | 579,59, | 579,60, | 579,61, | 579,62, | 579,63, | 579,64, | 579,65, | 579,66, | 579,67, | 579,68, | 579,69, | 579,70, | 579,71, | 579,72, | 579,73, | 579,74, | 579,75, | 579,76, | 579,77, | 579,78, | 579,79, | 579,80, | 579,81, | 579,82, | 579,83, | 579,84, | 579,85, | 580,1, | 580,2, | 580,3, | 580,4, | 580,5, | 580,6, | 580,7, | 580,8, | 580,9, | 580,10, | 580,11, | 580,12, | 580,13, | 580,14, | 580,15, | 580,16, | 580,17, | 580,18, | 580,19, | 580,20, | 580,21, | 580,22, | 580,23, | 580,24, | 580,25, | 580,26, | 580,27, | 580,28, | 580,29, | 580,30, | 580,31, | 580,32, | 580,33, | 580,34, | 580,35, | 580,36, | 580,37, | 580,38, | 580,39, | 580,40, | 580,41, | 580,42, | 580,43, | 580,44, | 580,45, | 580,46, | 580,47, | 580,48, | 580,49, | 580,50, | 580,51, | 580,52, | 580,53, | 580,54, | 580,55, | 580,56, | 580,57, | 580,58, | 580,59, | 580,60, | 580,61, | 580,62, | 580,63, | 580,64, | 580,65, | 580,66, | 580,67, | 580,68, | 580,69, | 580,70, | 580,71, | 580,72, | 580,73, | 580,74, | 580,75, | 580,76, | 580,77, | 580,78, | 580,79, | 580,80, | 580,81, | 580,82, | 580,83, | 580,84, | 580,85, | 581,1, | 581,2, | 581,3, | 581,4, | 581,5, | 581,6, | 581,7, | 581,8, | 581,9, | 581,10, | 581,11, | 581,12, | 581,13, | 581,14, | 581,15, | 581,16, | 581,17, | 581,18, | 581,19, | 581,20, | 581,21, | 581,22, | 581,23, | 581,24, | 581,25, | 581,26, | 581,27, | 581,28, | 581,29, | 581,30, | 581,31, | 581,32, | 581,33, | 581,34, | 581,35, | 581,36, | 581,37, | 581,38, | 581,39, | 581,40, | 581,41, | 581,42, | 581,43, | 581,44, | 581,45, | 581,46, | 581,47, | 581,48, | 581,49, | 581,50, | 581,51, | 581,52, | 581,53, | 581,54, | 581,55, | 581,56, | 581,57, | 581,58, | 581,59, | 581,60, | 581,61, | 581,62, | 581,63, | 581,64, | 581,65, | 581,66, | 581,67, | 581,68, | 581,69, | 581,70, | 581,71, | 581,72, | 581,73, | 581,74, | 581,75, | 581,76, | 581,77, | 581,78, | 581,79, | 581,80, | 581,81, | 581,82, | 581,83, | 581,84, | 581,85, | 582,1, | 582,2, | 582,3, | 582,4, | 582,5, | 582,6, | 582,7, | 582,8, | 582,9, | 582,10, | 582,11, | 582,12, | 582,13, | 582,14, | 582,15, | 582,16, | 582,17, | 582,18, | 582,19, | 582,20, | 582,21, | 582,22, | 582,23, | 582,24, | 582,25, | 582,26, | 582,27, | 582,28, | 582,29, | 582,30, | 582,31, | 582,32, | 582,33, | 582,34, | 582,35, | 582,36, | 582,37, | 582,38, | 582,39, | 582,40, | 582,41, | 582,42, | 582,43, | 582,44, | 582,45, | 582,46, | 582,47, | 582,48, | 582,49, | 582,50, | 582,51, | 582,52, | 582,53, | 582,54, | 582,55, | 582,56, | 582,57, | 582,58, | 582,59, | 582,60, | 582,61, | 582,62, | 582,63, | 582,64, | 582,65, | 582,66, | 582,67, | 582,68, | 582,69, | 582,70, | 582,71, | 582,72, | 582,73, | 582,74, | 582,75, | 582,76, | 582,77, | 582,78, | 582,79, | 582,80, | 582,81, | 582,82, | 582,83, | 582,84, | 582,85, | 583,1, | 583,2, | 583,3, | 583,4, | 583,5, | 583,6, | 583,7, | 583,8, | 583,9, | 583,10, | 583,11, | 583,12, | 583,13, | 583,14, | 583,15, | 583,16, | 583,17, | 583,18, | 583,19, | 583,20, | 583,21, | 583,22, | 583,23, | 583,24, | 583,25, | 583,26, | 583,27, | 583,28, | 583,29, | 583,30, | 583,31, | 583,32, | 583,33, | 583,34, | 583,35, | 583,36, | 583,37, | 583,38, | 583,39, | 583,40, | 583,41, | 583,42, | 583,43, | 583,44, | 583,45, | 583,46, | 583,47, | 583,48, | 583,49, | 583,50, | 583,51, | 583,52, | 583,53, | 583,54, | 583,55, | 583,56, | 583,57, | 583,58, | 583,59, | 583,60, | 583,61, | 583,62, | 583,63, | 583,64, | 583,65, | 583,66, | 583,67, | 583,68, | 583,69, | 583,70, | 583,71, | 583,72, | 583,73, | 583,74, | 583,75, | 583,76, | 583,77, | 583,78, | 583,79, | 583,80, | 583,81, | 583,82, | 583,83, | 583,84, | 583,85, | 584,1, | 584,2, | 584,3, | 584,4, | 584,5, | 584,6, | 584,7, | 584,8, | 584,9, | 584,10, | 584,11, | 584,12, | 584,13, | 584,14, | 584,15, | 584,16, | 584,17, | 584,18, | 584,19, | 584,20, | 584,21, | 584,22, | 584,23, | 584,24, | 584,25, | 584,26, | 584,27, | 584,28, | 584,29, | 584,30, | 584,31, | 584,32, | 584,33, | 584,34, | 584,35, | 584,36, | 584,37, | 584,38, | 584,39, | 584,40, | 584,41, | 584,42, | 584,43, | 584,44, | 584,45, | 584,46, | 584,47, | 584,48, | 584,49, | 584,50, | 584,51, | 584,52, | 584,53, | 584,54, | 584,55, | 584,56, | 584,57, | 584,58, | 584,59, | 584,60, | 584,61, | 584,62, | 584,63, | 584,64, | 584,65, | 584,66, | 584,67, | 584,68, | 584,69, | 584,70, | 584,71, | 584,72, | 584,73, | 584,74, | 584,75, | 584,76, | 584,77, | 584,78, | 584,79, | 584,80, | 584,81, | 584,82, | 584,83, | 584,84, | 584,85, | 585,1, | 585,2, | 585,3, | 585,4, | 585,5, | 585,6, | 585,7, | 585,8, | 585,9, | 585,10, | 585,11, | 585,12, | 585,13, | 585,14, | 585,15, | 585,16, | 585,17, | 585,18, | 585,19, | 585,20, | 585,21, | 585,22, | 585,23, | 585,24, | 585,25, | 585,26, | 585,27, | 585,28, | 585,29, | 585,30, | 585,31, | 585,32, | 585,33, | 585,34, | 585,35, | 585,36, | 585,37, | 585,38, | 585,39, | 585,40, | 585,41, | 585,42, | 585,43, | 585,44, | 585,45, | 585,46, | 585,47, | 585,48, | 585,49, | 585,50, | 585,51, | 585,52, | 585,53, | 585,54, | 585,55, | 585,56, | 585,57, | 585,58, | 585,59, | 585,60, | 585,61, | 585,62, | 585,63, | 585,64, | 585,65, | 585,66, | 585,67, | 585,68, | 585,69, | 585,70, | 585,71, | 585,72, | 585,73, | 585,74, | 585,75, | 585,76, | 585,77, | 585,78, | 585,79, | 585,80, | 585,81, | 585,82, | 585,83, | 585,84, | 585,85, | 586,1, | 586,2, | 586,3, | 586,4, | 586,5, | 586,6, | 586,7, | 586,8, | 586,9, | 586,10, | 586,11, | 586,12, | 586,13, | 586,14, | 586,15, | 586,16, | 586,17, | 586,18, | 586,19, | 586,20, | 586,21, | 586,22, | 586,23, | 586,24, | 586,25, | 586,26, | 586,27, | 586,28, | 586,29, | 586,30, | 586,31, | 586,32, | 586,33, | 586,34, | 586,35, | 586,36, | 586,37, | 586,38, | 586,39, | 586,40, | 586,41, | 586,42, | 586,43, | 586,44, | 586,45, | 586,46, | 586,47, | 586,48, | 586,49, | 586,50, | 586,51, | 586,52, | 586,53, | 586,54, | 586,55, | 586,56, | 586,57, | 586,58, | 586,59, | 586,60, | 586,61, | 586,62, | 586,63, | 586,64, | 586,65, | 586,66, | 586,67, | 586,68, | 586,69, | 586,70, | 586,71, | 586,72, | 586,73, | 586,74, | 586,75, | 586,76, | 586,77, | 586,78, | 586,79, | 586,80, | 586,81, | 586,82, | 586,83, | 586,84, | 586,85, | 587,1, | 587,2, | 587,3, | 587,4, | 587,5, | 587,6, | 587,7, | 587,8, | 587,9, | 587,10, | 587,11, | 587,12, | 587,13, | 587,14, | 587,15, | 587,16, | 587,17, | 587,18, | 587,19, | 587,20, | 587,21, | 587,22, | 587,23, | 587,24, | 587,25, | 587,26, | 587,27, | 587,28, | 587,29, | 587,30, | 587,31, | 587,32, | 587,33, | 587,34, | 587,35, | 587,36, | 587,37, | 587,38, | 587,39, | 587,40, | 587,41, | 587,42, | 587,43, | 587,44, | 587,45, | 587,46, | 587,47, | 587,48, | 587,49, | 587,50, | 587,51, | 587,52, | 587,53, | 587,54, | 587,55, | 587,56, | 587,57, | 587,58, | 587,59, | 587,60, | 587,61, | 587,62, | 587,63, | 587,64, | 587,65, | 587,66, | 587,67, | 587,68, | 587,69, | 587,70, | 587,71, | 587,72, | 587,73, | 587,74, | 587,75, | 587,76, | 587,77, | 587,78, | 587,79, | 587,80, | 587,81, | 587,82, | 587,83, | 587,84, | 587,85, | 588,1, | 588,2, | 588,3, | 588,4, | 588,5, | 588,6, | 588,7, | 588,8, | 588,9, | 588,10, | 588,11, | 588,12, | 588,13, | 588,14, | 588,15, | 588,16, | 588,17, | 588,18, | 588,19, | 588,20, | 588,21, | 588,22, | 588,23, | 588,24, | 588,25, | 588,26, | 588,27, | 588,28, | 588,29, | 588,30, | 588,31, | 588,32, | 588,33, | 588,34, | 588,35, | 588,36, | 588,37, | 588,38, | 588,39, | 588,40, | 588,41, | 588,42, | 588,43, | 588,44, | 588,45, | 588,46, | 588,47, | 588,48, | 588,49, | 588,50, | 588,51, | 588,52, | 588,53, | 588,54, | 588,55, | 588,56, | 588,57, | 588,58, | 588,59, | 588,60, | 588,61, | 588,62, | 588,63, | 588,64, | 588,65, | 588,66, | 588,67, | 588,68, | 588,69, | 588,70, | 588,71, | 588,72, | 588,73, | 588,74, | 588,75, | 588,76, | 588,77, | 588,78, | 588,79, | 588,80, | 588,81, | 588,82, | 588,83, | 588,84, | 588,85, | 589,1, | 589,2, | 589,3, | 589,4, | 589,5, | 589,6, | 589,7, | 589,8, | 589,9, | 589,10, | 589,11, | 589,12, | 589,13, | 589,14, | 589,15, | 589,16, | 589,17, | 589,18, | 589,19, | 589,20, | 589,21, | 589,22, | 589,23, | 589,24, | 589,25, | 589,26, | 589,27, | 589,28, | 589,29, | 589,30, | 589,31, | 589,32, | 589,33, | 589,34, | 589,35, | 589,36, | 589,37, | 589,38, | 589,39, | 589,40, | 589,41, | 589,42, | 589,43, | 589,44, | 589,45, | 589,46, | 589,47, | 589,48, | 589,49, | 589,50, | 589,51, | 589,52, | 589,53, | 589,54, | 589,55, | 589,56, | 589,57, | 589,58, | 589,59, | 589,60, | 589,61, | 589,62, | 589,63, | 589,64, | 589,65, | 589,66, | 589,67, | 589,68, | 589,69, | 589,70, | 589,71, | 589,72, | 589,73, | 589,74, | 589,75, | 589,76, | 589,77, | 589,78, | 589,79, | 589,80, | 589,81, | 589,82, | 589,83, | 589,84, | 589,85, | 590,1, | 590,2, | 590,3, | 590,4, | 590,5, | 590,6, | 590,7, | 590,8, | 590,9, | 590,10, | 590,11, | 590,12, | 590,13, | 590,14, | 590,15, | 590,16, | 590,17, | 590,18, | 590,19, | 590,20, | 590,21, | 590,22, | 590,23, | 590,24, | 590,25, | 590,26, | 590,27, | 590,28, | 590,29, | 590,30, | 590,31, | 590,32, | 590,33, | 590,34, | 590,35, | 590,36, | 590,37, | 590,38, | 590,39, | 590,40, | 590,41, | 590,42, | 590,43, | 590,44, | 590,45, | 590,46, | 590,47, | 590,48, | 590,49, | 590,50, | 590,51, | 590,52, | 590,53, | 590,54, | 590,55, | 590,56, | 590,57, | 590,58, | 590,59, | 590,60, | 590,61, | 590,62, | 590,63, | 590,64, | 590,65, | 590,66, | 590,67, | 590,68, | 590,69, | 590,70, | 590,71, | 590,72, | 590,73, | 590,74, | 590,75, | 590,76, | 590,77, | 590,78, | 590,79, | 590,80, | 590,81, | 590,82, | 590,83, | 590,84, | 590,85, | 591,1, | 591,2, | 591,3, | 591,4, | 591,5, | 591,6, | 591,7, | 591,8, | 591,9, | 591,10, | 591,11, | 591,12, | 591,13, | 591,14, | 591,15, | 591,16, | 591,17, | 591,18, | 591,19, | 591,20, | 591,21, | 591,22, | 591,23, | 591,24, | 591,25, | 591,26, | 591,27, | 591,28, | 591,29, | 591,30, | 591,31, | 591,32, | 591,33, | 591,34, | 591,35, | 591,36, | 591,37, | 591,38, | 591,39, | 591,40, | 591,41, | 591,42, | 591,43, | 591,44, | 591,45, | 591,46, | 591,47, | 591,48, | 591,49, | 591,50, | 591,51, | 591,52, | 591,53, | 591,54, | 591,55, | 591,56, | 591,57, | 591,58, | 591,59, | 591,60, | 591,61, | 591,62, | 591,63, | 591,64, | 591,65, | 591,66, | 591,67, | 591,68, | 591,69, | 591,70, | 591,71, | 591,72, | 591,73, | 591,74, | 591,75, | 591,76, | 591,77, | 591,78, | 591,79, | 591,80, | 591,81, | 591,82, | 591,83, | 591,84, | 591,85, | 592,1, | 592,2, | 592,3, | 592,4, | 592,5, | 592,6, | 592,7, | 592,8, | 592,9, | 592,10, | 592,11, | 592,12, | 592,13, | 592,14, | 592,15, | 592,16, | 592,17, | 592,18, | 592,19, | 592,20, | 592,21, | 592,22, | 592,23, | 592,24, | 592,25, | 592,26, | 592,27, | 592,28, | 592,29, | 592,30, | 592,31, | 592,32, | 592,33, | 592,34, | 592,35, | 592,36, | 592,37, | 592,38, | 592,39, | 592,40, | 592,41, | 592,42, | 592,43, | 592,44, | 592,45, | 592,46, | 592,47, | 592,48, | 592,49, | 592,50, | 592,51, | 592,52, | 592,53, | 592,54, | 592,55, | 592,56, | 592,57, | 592,58, | 592,59, | 592,60, | 592,61, | 592,62, | 592,63, | 592,64, | 592,65, | 592,66, | 592,67, | 592,68, | 592,69, | 592,70, | 592,71, | 592,72, | 592,73, | 592,74, | 592,75, | 592,76, | 592,77, | 592,78, | 592,79, | 592,80, | 592,81, | 592,82, | 592,83, | 592,84, | 592,85, | 593,1, | 593,2, | 593,3, | 593,4, | 593,5, | 593,6, | 593,7, | 593,8, | 593,9, | 593,10, | 593,11, | 593,12, | 593,13, | 593,14, | 593,15, | 593,16, | 593,17, | 593,18, | 593,19, | 593,20, | 593,21, | 593,22, | 593,23, | 593,24, | 593,25, | 593,26, | 593,27, | 593,28, | 593,29, | 593,30, | 593,31, | 593,32, | 593,33, | 593,34, | 593,35, | 593,36, | 593,37, | 593,38, | 593,39, | 593,40, | 593,41, | 593,42, | 593,43, | 593,44, | 593,45, | 593,46, | 593,47, | 593,48, | 593,49, | 593,50, | 593,51, | 593,52, | 593,53, | 593,54, | 593,55, | 593,56, | 593,57, | 593,58, | 593,59, | 593,60, | 593,61, | 593,62, | 593,63, | 593,64, | 593,65, | 593,66, | 593,67, | 593,68, | 593,69, | 593,70, | 593,71, | 593,72, | 593,73, | 593,74, | 593,75, | 593,76, | 593,77, | 593,78, | 593,79, | 593,80, | 593,81, | 593,82, | 593,83, | 593,84, | 593,85, | 594,1, | 594,2, | 594,3, | 594,4, | 594,5, | 594,6, | 594,7, | 594,8, | 594,9, | 594,10, | 594,11, | 594,12, | 594,13, | 594,14, | 594,15, | 594,16, | 594,17, | 594,18, | 594,19, | 594,20, | 594,21, | 594,22, | 594,23, | 594,24, | 594,25, | 594,26, | 594,27, | 594,28, | 594,29, | 594,30, | 594,31, | 594,32, | 594,33, | 594,34, | 594,35, | 594,36, | 594,37, | 594,38, | 594,39, | 594,40, | 594,41, | 594,42, | 594,43, | 594,44, | 594,45, | 594,46, | 594,47, | 594,48, | 594,49, | 594,50, | 594,51, | 594,52, | 594,53, | 594,54, | 594,55, | 594,56, | 594,57, | 594,58, | 594,59, | 594,60, | 594,61, | 594,62, | 594,63, | 594,64, | 594,65, | 594,66, | 594,67, | 594,68, | 594,69, | 594,70, | 594,71, | 594,72, | 594,73, | 594,74, | 594,75, | 594,76, | 594,77, | 594,78, | 594,79, | 594,80, | 594,81, | 594,82, | 594,83, | 594,84, | 594,85, | 595,1, | 595,2, | 595,3, | 595,4, | 595,5, | 595,6, | 595,7, | 595,8, | 595,9, | 595,10, | 595,11, | 595,12, | 595,13, | 595,14, | 595,15, | 595,16, | 595,17, | 595,18, | 595,19, | 595,20, | 595,21, | 595,22, | 595,23, | 595,24, | 595,25, | 595,26, | 595,27, | 595,28, | 595,29, | 595,30, | 595,31, | 595,32, | 595,33, | 595,34, | 595,35, | 595,36, | 595,37, | 595,38, | 595,39, | 595,40, | 595,41, | 595,42, | 595,43, | 595,44, | 595,45, | 595,46, | 595,47, | 595,48, | 595,49, | 595,50, | 595,51, | 595,52, | 595,53, | 595,54, | 595,55, | 595,56, | 595,57, | 595,58, | 595,59, | 595,60, | 595,61, | 595,62, | 595,63, | 595,64, | 595,65, | 595,66, | 595,67, | 595,68, | 595,69, | 595,70, | 595,71, | 595,72, | 595,73, | 595,74, | 595,75, | 595,76, | 595,77, | 595,78, | 595,79, | 595,80, | 595,81, | 595,82, | 595,83, | 595,84, | 595,85, | 596,1, | 596,2, | 596,3, | 596,4, | 596,5, | 596,6, | 596,7, | 596,8, | 596,9, | 596,10, | 596,11, | 596,12, | 596,13, | 596,14, | 596,15, | 596,16, | 596,17, | 596,18, | 596,19, | 596,20, | 596,21, | 596,22, | 596,23, | 596,24, | 596,25, | 596,26, | 596,27, | 596,28, | 596,29, | 596,30, | 596,31, | 596,32, | 596,33, | 596,34, | 596,35, | 596,36, | 596,37, | 596,38, | 596,39, | 596,40, | 596,41, | 596,42, | 596,43, | 596,44, | 596,45, | 596,46, | 596,47, | 596,48, | 596,49, | 596,50, | 596,51, | 596,52, | 596,53, | 596,54, | 596,55, | 596,56, | 596,57, | 596,58, | 596,59, | 596,60, | 596,61, | 596,62, | 596,63, | 596,64, | 596,65, | 596,66, | 596,67, | 596,68, | 596,69, | 596,70, | 596,71, | 596,72, | 596,73, | 596,74, | 596,75, | 596,76, | 596,77, | 596,78, | 596,79, | 596,80, | 596,81, | 596,82, | 596,83, | 596,84, | 596,85, | 597,1, | 597,2, | 597,3, | 597,4, | 597,5, | 597,6, | 597,7, | 597,8, | 597,9, | 597,10, | 597,11, | 597,12, | 597,13, | 597,14, | 597,15, | 597,16, | 597,17, | 597,18, | 597,19, | 597,20, | 597,21, | 597,22, | 597,23, | 597,24, | 597,25, | 597,26, | 597,27, | 597,28, | 597,29, | 597,30, | 597,31, | 597,32, | 597,33, | 597,34, | 597,35, | 597,36, | 597,37, | 597,38, | 597,39, | 597,40, | 597,41, | 597,42, | 597,43, | 597,44, | 597,45, | 597,46, | 597,47, | 597,48, | 597,49, | 597,50, | 597,51, | 597,52, | 597,53, | 597,54, | 597,55, | 597,56, | 597,57, | 597,58, | 597,59, | 597,60, | 597,61, | 597,62, | 597,63, | 597,64, | 597,65, | 597,66, | 597,67, | 597,68, | 597,69, | 597,70, | 597,71, | 597,72, | 597,73, | 597,74, | 597,75, | 597,76, | 597,77, | 597,78, | 597,79, | 597,80, | 597,81, | 597,82, | 597,83, | 597,84, | 597,85, | 598,1, | 598,2, | 598,3, | 598,4, | 598,5, | 598,6, | 598,7, | 598,8, | 598,9, | 598,10, | 598,11, | 598,12, | 598,13, | 598,14, | 598,15, | 598,16, | 598,17, | 598,18, | 598,19, | 598,20, | 598,21, | 598,22, | 598,23, | 598,24, | 598,25, | 598,26, | 598,27, | 598,28, | 598,29, | 598,30, | 598,31, | 598,32, | 598,33, | 598,34, | 598,35, | 598,36, | 598,37, | 598,38, | 598,39, | 598,40, | 598,41, | 598,42, | 598,43, | 598,44, | 598,45, | 598,46, | 598,47, | 598,48, | 598,49, | 598,50, | 598,51, | 598,52, | 598,53, | 598,54, | 598,55, | 598,56, | 598,57, | 598,58, | 598,59, | 598,60, | 598,61, | 598,62, | 598,63, | 598,64, | 598,65, | 598,66, | 598,67, | 598,68, | 598,69, | 598,70, | 598,71, | 598,72, | 598,73, | 598,74, | 598,75, | 598,76, | 598,77, | 598,78, | 598,79, | 598,80, | 598,81, | 598,82, | 598,83, | 598,84, | 598,85, | 599,1, | 599,2, | 599,3, | 599,4, | 599,5, | 599,6, | 599,7, | 599,8, | 599,9, | 599,10, | 599,11, | 599,12, | 599,13, | 599,14, | 599,15, | 599,16, | 599,17, | 599,18, | 599,19, | 599,20, | 599,21, | 599,22, | 599,23, | 599,24, | 599,25, | 599,26, | 599,27, | 599,28, | 599,29, | 599,30, | 599,31, | 599,32, | 599,33, | 599,34, | 599,35, | 599,36, | 599,37, | 599,38, | 599,39, | 599,40, | 599,41, | 599,42, | 599,43, | 599,44, | 599,45, | 599,46, | 599,47, | 599,48, | 599,49, | 599,50, | 599,51, | 599,52, | 599,53, | 599,54, | 599,55, | 599,56, | 599,57, | 599,58, | 599,59, | 599,60, | 599,61, | 599,62, | 599,63, | 599,64, | 599,65, | 599,66, | 599,67, | 599,68, | 599,69, | 599,70, | 599,71, | 599,72, | 599,73, | 599,74, | 599,75, | 599,76, | 599,77, | 599,78, | 599,79, | 599,80, | 599,81, | 599,82, | 599,83, | 599,84, | 599,85, | 600,1, | 600,2, | 600,3, | 600,4, | 600,5, | 600,6, | 600,7, | 600,8, | 600,9, | 600,10, | 600,11, | 600,12, | 600,13, | 600,14, | 600,15, | 600,16, | 600,17, | 600,18, | 600,19, | 600,20, | 600,21, | 600,22, | 600,23, | 600,24, | 600,25, | 600,26, | 600,27, | 600,28, | 600,29, | 600,30, | 600,31, | 600,32, | 600,33, | 600,34, | 600,35, | 600,36, | 600,37, | 600,38, | 600,39, | 600,40, | 600,41, | 600,42, | 600,43, | 600,44, | 600,45, | 600,46, | 600,47, | 600,48, | 600,49, | 600,50, | 600,51, | 600,52, | 600,53, | 600,54, | 600,55, | 600,56, | 600,57, | 600,58, | 600,59, | 600,60, | 600,61, | 600,62, | 600,63, | 600,64, | 600,65, | 600,66, | 600,67, | 600,68, | 600,69, | 600,70, | 600,71, | 600,72, | 600,73, | 600,74, | 600,75, | 600,76, | 600,77, | 600,78, | 600,79, | 600,80, | 600,81, | 600,82, | 600,83, | 600,84, | 600,85, | 601,1, | 601,2, | 601,3, | 601,4, | 601,5, | 601,6, | 601,7, | 601,8, | 601,9, | 601,10, | 601,11, | 601,12, | 601,13, | 601,14, | 601,15, | 601,16, | 601,17, | 601,18, | 601,19, | 601,20, | 601,21, | 601,22, | 601,23, | 601,24, | 601,25, | 601,26, | 601,27, | 601,28, | 601,29, | 601,30, | 601,31, | 601,32, | 601,33, | 601,34, | 601,35, | 601,36, | 601,37, | 601,38, | 601,39, | 601,40, | 601,41, | 601,42, | 601,43, | 601,44, | 601,45, | 601,46, | 601,47, | 601,48, | 601,49, | 601,50, | 601,51, | 601,52, | 601,53, | 601,54, | 601,55, | 601,56, | 601,57, | 601,58, | 601,59, | 601,60, | 601,61, | 601,62, | 601,63, | 601,64, | 601,65, | 601,66, | 601,67, | 601,68, | 601,69, | 601,70, | 601,71, | 601,72, | 601,73, | 601,74, | 601,75, | 601,76, | 601,77, | 601,78, | 601,79, | 601,80, | 601,81, | 601,82, | 601,83, | 601,84, | 601,85, | 602,1, | 602,2, | 602,3, | 602,4, | 602,5, | 602,6, | 602,7, | 602,8, | 602,9, | 602,10, | 602,11, | 602,12, | 602,13, | 602,14, | 602,15, | 602,16, | 602,17, | 602,18, | 602,19, | 602,20, | 602,21, | 602,22, | 602,23, | 602,24, | 602,25, | 602,26, | 602,27, | 602,28, | 602,29, | 602,30, | 602,31, | 602,32, | 602,33, | 602,34, | 602,35, | 602,36, | 602,37, | 602,38, | 602,39, | 602,40, | 602,41, | 602,42, | 602,43, | 602,44, | 602,45, | 602,46, | 602,47, | 602,48, | 602,49, | 602,50, | 602,51, | 602,52, | 602,53, | 602,54, | 602,55, | 602,56, | 602,57, | 602,58, | 602,59, | 602,60, | 602,61, | 602,62, | 602,63, | 602,64, | 602,65, | 602,66, | 602,67, | 602,68, | 602,69, | 602,70, | 602,71, | 602,72, | 602,73, | 602,74, | 602,75, | 602,76, | 602,77, | 602,78, | 602,79, | 602,80, | 602,81, | 602,82, | 602,83, | 602,84, | 602,85, | 603,1, | 603,2, | 603,3, | 603,4, | 603,5, | 603,6, | 603,7, | 603,8, | 603,9, | 603,10, | 603,11, | 603,12, | 603,13, | 603,14, | 603,15, | 603,16, | 603,17, | 603,18, | 603,19, | 603,20, | 603,21, | 603,22, | 603,23, | 603,24, | 603,25, | 603,26, | 603,27, | 603,28, | 603,29, | 603,30, | 603,31, | 603,32, | 603,33, | 603,34, | 603,35, | 603,36, | 603,37, | 603,38, | 603,39, | 603,40, | 603,41, | 603,42, | 603,43, | 603,44, | 603,45, | 603,46, | 603,47, | 603,48, | 603,49, | 603,50, | 603,51, | 603,52, | 603,53, | 603,54, | 603,55, | 603,56, | 603,57, | 603,58, | 603,59, | 603,60, | 603,61, | 603,62, | 603,63, | 603,64, | 603,65, | 603,66, | 603,67, | 603,68, | 603,69, | 603,70, | 603,71, | 603,72, | 603,73, | 603,74, | 603,75, | 603,76, | 603,77, | 603,78, | 603,79, | 603,80, | 603,81, | 603,82, | 603,83, | 603,84, | 603,85, | 604,1, | 604,2, | 604,3, | 604,4, | 604,5, | 604,6, | 604,7, | 604,8, | 604,9, | 604,10, | 604,11, | 604,12, | 604,13, | 604,14, | 604,15, | 604,16, | 604,17, | 604,18, | 604,19, | 604,20, | 604,21, | 604,22, | 604,23, | 604,24, | 604,25, | 604,26, | 604,27, | 604,28, | 604,29, | 604,30, | 604,31, | 604,32, | 604,33, | 604,34, | 604,35, | 604,36, | 604,37, | 604,38, | 604,39, | 604,40, | 604,41, | 604,42, | 604,43, | 604,44, | 604,45, | 604,46, | 604,47, | 604,48, | 604,49, | 604,50, | 604,51, | 604,52, | 604,53, | 604,54, | 604,55, | 604,56, | 604,57, | 604,58, | 604,59, | 604,60, | 604,61, | 604,62, | 604,63, | 604,64, | 604,65, | 604,66, | 604,67, | 604,68, | 604,69, | 604,70, | 604,71, | 604,72, | 604,73, | 604,74, | 604,75, | 604,76, | 604,77, | 604,78, | 604,79, | 604,80, | 604,81, | 604,82, | 604,83, | 604,84, | 604,85, | 605,1, | 605,2, | 605,3, | 605,4, | 605,5, | 605,6, | 605,7, | 605,8, | 605,9, | 605,10, | 605,11, | 605,12, | 605,13, | 605,14, | 605,15, | 605,16, | 605,17, | 605,18, | 605,19, | 605,20, | 605,21, | 605,22, | 605,23, | 605,24, | 605,25, | 605,26, | 605,27, | 605,28, | 605,29, | 605,30, | 605,31, | 605,32, | 605,33, | 605,34, | 605,35, | 605,36, | 605,37, | 605,38, | 605,39, | 605,40, | 605,41, | 605,42, | 605,43, | 605,44, | 605,45, | 605,46, | 605,47, | 605,48, | 605,49, | 605,50, | 605,51, | 605,52, | 605,53, | 605,54, | 605,55, | 605,56, | 605,57, | 605,58, | 605,59, | 605,60, | 605,61, | 605,62, | 605,63, | 605,64, | 605,65, | 605,66, | 605,67, | 605,68, | 605,69, | 605,70, | 605,71, | 605,72, | 605,73, | 605,74, | 605,75, | 605,76, | 605,77, | 605,78, | 605,79, | 605,80, | 605,81, | 605,82, | 605,83, | 605,84, | 605,85, | 606,1, | 606,2, | 606,3, | 606,4, | 606,5, | 606,6, | 606,7, | 606,8, | 606,9, | 606,10, | 606,11, | 606,12, | 606,13, | 606,14, | 606,15, | 606,16, | 606,17, | 606,18, | 606,19, | 606,20, | 606,21, | 606,22, | 606,23, | 606,24, | 606,25, | 606,26, | 606,27, | 606,28, | 606,29, | 606,30, | 606,31, | 606,32, | 606,33, | 606,34, | 606,35, | 606,36, | 606,37, | 606,38, | 606,39, | 606,40, | 606,41, | 606,42, | 606,43, | 606,44, | 606,45, | 606,46, | 606,47, | 606,48, | 606,49, | 606,50, | 606,51, | 606,52, | 606,53, | 606,54, | 606,55, | 606,56, | 606,57, | 606,58, | 606,59, | 606,60, | 606,61, | 606,62, | 606,63, | 606,64, | 606,65, | 606,66, | 606,67, | 606,68, | 606,69, | 606,70, | 606,71, | 606,72, | 606,73, | 606,74, | 606,75, | 606,76, | 606,77, | 606,78, | 606,79, | 606,80, | 606,81, | 606,82, | 606,83, | 606,84, | 606,85, | 607,1, | 607,2, | 607,3, | 607,4, | 607,5, | 607,6, | 607,7, | 607,8, | 607,9, | 607,10, | 607,11, | 607,12, | 607,13, | 607,14, | 607,15, | 607,16, | 607,17, | 607,18, | 607,19, | 607,20, | 607,21, | 607,22, | 607,23, | 607,24, | 607,25, | 607,26, | 607,27, | 607,28, | 607,29, | 607,30, | 607,31, | 607,32, | 607,33, | 607,34, | 607,35, | 607,36, | 607,37, | 607,38, | 607,39, | 607,40, | 607,41, | 607,42, | 607,43, | 607,44, | 607,45, | 607,46, | 607,47, | 607,48, | 607,49, | 607,50, | 607,51, | 607,52, | 607,53, | 607,54, | 607,55, | 607,56, | 607,57, | 607,58, | 607,59, | 607,60, | 607,61, | 607,62, | 607,63, | 607,64, | 607,65, | 607,66, | 607,67, | 607,68, | 607,69, | 607,70, | 607,71, | 607,72, | 607,73, | 607,74, | 607,75, | 607,76, | 607,77, | 607,78, | 607,79, | 607,80, | 607,81, | 607,82, | 607,83, | 607,84, | 607,85, | 608,1, | 608,2, | 608,3, | 608,4, | 608,5, | 608,6, | 608,7, | 608,8, | 608,9, | 608,10, | 608,11, | 608,12, | 608,13, | 608,14, | 608,15, | 608,16, | 608,17, | 608,18, | 608,19, | 608,20, | 608,21, | 608,22, | 608,23, | 608,24, | 608,25, | 608,26, | 608,27, | 608,28, | 608,29, | 608,30, | 608,31, | 608,32, | 608,33, | 608,34, | 608,35, | 608,36, | 608,37, | 608,38, | 608,39, | 608,40, | 608,41, | 608,42, | 608,43, | 608,44, | 608,45, | 608,46, | 608,47, | 608,48, | 608,49, | 608,50, | 608,51, | 608,52, | 608,53, | 608,54, | 608,55, | 608,56, | 608,57, | 608,58, | 608,59, | 608,60, | 608,61, | 608,62, | 608,63, | 608,64, | 608,65, | 608,66, | 608,67, | 608,68, | 608,69, | 608,70, | 608,71, | 608,72, | 608,73, | 608,74, | 608,75, | 608,76, | 608,77, | 608,78, | 608,79, | 608,80, | 608,81, | 608,82, | 608,83, | 608,84, | 608,85, | 609,1, | 609,2, | 609,3, | 609,4, | 609,5, | 609,6, | 609,7, | 609,8, | 609,9, | 609,10, | 609,11, | 609,12, | 609,13, | 609,14, | 609,15, | 609,16, | 609,17, | 609,18, | 609,19, | 609,20, | 609,21, | 609,22, | 609,23, | 609,24, | 609,25, | 609,26, | 609,27, | 609,28, | 609,29, | 609,30, | 609,31, | 609,32, | 609,33, | 609,34, | 609,35, | 609,36, | 609,37, | 609,38, | 609,39, | 609,40, | 609,41, | 609,42, | 609,43, | 609,44, | 609,45, | 609,46, | 609,47, | 609,48, | 609,49, | 609,50, | 609,51, | 609,52, | 609,53, | 609,54, | 609,55, | 609,56, | 609,57, | 609,58, | 609,59, | 609,60, | 609,61, | 609,62, | 609,63, | 609,64, | 609,65, | 609,66, | 609,67, | 609,68, | 609,69, | 609,70, | 609,71, | 609,72, | 609,73, | 609,74, | 609,75, | 609,76, | 609,77, | 609,78, | 609,79, | 609,80, | 609,81, | 609,82, | 609,83, | 609,84, | 609,85, | 610,1, | 610,2, | 610,3, | 610,4, | 610,5, | 610,6, | 610,7, | 610,8, | 610,9, | 610,10, | 610,11, | 610,12, | 610,13, | 610,14, | 610,15, | 610,16, | 610,17, | 610,18, | 610,19, | 610,20, | 610,21, | 610,22, | 610,23, | 610,24, | 610,25, | 610,26, | 610,27, | 610,28, | 610,29, | 610,30, | 610,31, | 610,32, | 610,33, | 610,34, | 610,35, | 610,36, | 610,37, | 610,38, | 610,39, | 610,40, | 610,41, | 610,42, | 610,43, | 610,44, | 610,45, | 610,46, | 610,47, | 610,48, | 610,49, | 610,50, | 610,51, | 610,52, | 610,53, | 610,54, | 610,55, | 610,56, | 610,57, | 610,58, | 610,59, | 610,60, | 610,61, | 610,62, | 610,63, | 610,64, | 610,65, | 610,66, | 610,67, | 610,68, | 610,69, | 610,70, | 610,71, | 610,72, | 610,73, | 610,74, | 610,75, | 610,76, | 610,77, | 610,78, | 610,79, | 610,80, | 610,81, | 610,82, | 610,83, | 610,84, | 610,85, | 611,1, | 611,2, | 611,3, | 611,4, | 611,5, | 611,6, | 611,7, | 611,8, | 611,9, | 611,10, | 611,11, | 611,12, | 611,13, | 611,14, | 611,15, | 611,16, | 611,17, | 611,18, | 611,19, | 611,20, | 611,21, | 611,22, | 611,23, | 611,24, | 611,25, | 611,26, | 611,27, | 611,28, | 611,29, | 611,30, | 611,31, | 611,32, | 611,33, | 611,34, | 611,35, | 611,36, | 611,37, | 611,38, | 611,39, | 611,40, | 611,41, | 611,42, | 611,43, | 611,44, | 611,45, | 611,46, | 611,47, | 611,48, | 611,49, | 611,50, | 611,51, | 611,52, | 611,53, | 611,54, | 611,55, | 611,56, | 611,57, | 611,58, | 611,59, | 611,60, | 611,61, | 611,62, | 611,63, | 611,64, | 611,65, | 611,66, | 611,67, | 611,68, | 611,69, | 611,70, | 611,71, | 611,72, | 611,73, | 611,74, | 611,75, | 611,76, | 611,77, | 611,78, | 611,79, | 611,80, | 611,81, | 611,82, | 611,83, | 611,84, | 611,85, | 612,1, | 612,2, | 612,3, | 612,4, | 612,5, | 612,6, | 612,7, | 612,8, | 612,9, | 612,10, | 612,11, | 612,12, | 612,13, | 612,14, | 612,15, | 612,16, | 612,17, | 612,18, | 612,19, | 612,20, | 612,21, | 612,22, | 612,23, | 612,24, | 612,25, | 612,26, | 612,27, | 612,28, | 612,29, | 612,30, | 612,31, | 612,32, | 612,33, | 612,34, | 612,35, | 612,36, | 612,37, | 612,38, | 612,39, | 612,40, | 612,41, | 612,42, | 612,43, | 612,44, | 612,45, | 612,46, | 612,47, | 612,48, | 612,49, | 612,50, | 612,51, | 612,52, | 612,53, | 612,54, | 612,55, | 612,56, | 612,57, | 612,58, | 612,59, | 612,60, | 612,61, | 612,62, | 612,63, | 612,64, | 612,65, | 612,66, | 612,67, | 612,68, | 612,69, | 612,70, | 612,71, | 612,72, | 612,73, | 612,74, | 612,75, | 612,76, | 612,77, | 612,78, | 612,79, | 612,80, | 612,81, | 612,82, | 612,83, | 612,84, | 612,85, | 613,1, | 613,2, | 613,3, | 613,4, | 613,5, | 613,6, | 613,7, | 613,8, | 613,9, | 613,10, | 613,11, | 613,12, | 613,13, | 613,14, | 613,15, | 613,16, | 613,17, | 613,18, | 613,19, | 613,20, | 613,21, | 613,22, | 613,23, | 613,24, | 613,25, | 613,26, | 613,27, | 613,28, | 613,29, | 613,30, | 613,31, | 613,32, | 613,33, | 613,34, | 613,35, | 613,36, | 613,37, | 613,38, | 613,39, | 613,40, | 613,41, | 613,42, | 613,43, | 613,44, | 613,45, | 613,46, | 613,47, | 613,48, | 613,49, | 613,50, | 613,51, | 613,52, | 613,53, | 613,54, | 613,55, | 613,56, | 613,57, | 613,58, | 613,59, | 613,60, | 613,61, | 613,62, | 613,63, | 613,64, | 613,65, | 613,66, | 613,67, | 613,68, | 613,69, | 613,70, | 613,71, | 613,72, | 613,73, | 613,74, | 613,75, | 613,76, | 613,77, | 613,78, | 613,79, | 613,80, | 613,81, | 613,82, | 613,83, | 613,84, | 613,85, | 614,1, | 614,2, | 614,3, | 614,4, | 614,5, | 614,6, | 614,7, | 614,8, | 614,9, | 614,10, | 614,11, | 614,12, | 614,13, | 614,14, | 614,15, | 614,16, | 614,17, | 614,18, | 614,19, | 614,20, | 614,21, | 614,22, | 614,23, | 614,24, | 614,25, | 614,26, | 614,27, | 614,28, | 614,29, | 614,30, | 614,31, | 614,32, | 614,33, | 614,34, | 614,35, | 614,36, | 614,37, | 614,38, | 614,39, | 614,40, | 614,41, | 614,42, | 614,43, | 614,44, | 614,45, | 614,46, | 614,47, | 614,48, | 614,49, | 614,50, | 614,51, | 614,52, | 614,53, | 614,54, | 614,55, | 614,56, | 614,57, | 614,58, | 614,59, | 614,60, | 614,61, | 614,62, | 614,63, | 614,64, | 614,65, | 614,66, | 614,67, | 614,68, | 614,69, | 614,70, | 614,71, | 614,72, | 614,73, | 614,74, | 614,75, | 614,76, | 614,77, | 614,78, | 614,79, | 614,80, | 614,81, | 614,82, | 614,83, | 614,84, | 614,85, | 615,1, | 615,2, | 615,3, | 615,4, | 615,5, | 615,6, | 615,7, | 615,8, | 615,9, | 615,10, | 615,11, | 615,12, | 615,13, | 615,14, | 615,15, | 615,16, | 615,17, | 615,18, | 615,19, | 615,20, | 615,21, | 615,22, | 615,23, | 615,24, | 615,25, | 615,26, | 615,27, | 615,28, | 615,29, | 615,30, | 615,31, | 615,32, | 615,33, | 615,34, | 615,35, | 615,36, | 615,37, | 615,38, | 615,39, | 615,40, | 615,41, | 615,42, | 615,43, | 615,44, | 615,45, | 615,46, | 615,47, | 615,48, | 615,49, | 615,50, | 615,51, | 615,52, | 615,53, | 615,54, | 615,55, | 615,56, | 615,57, | 615,58, | 615,59, | 615,60, | 615,61, | 615,62, | 615,63, | 615,64, | 615,65, | 615,66, | 615,67, | 615,68, | 615,69, | 615,70, | 615,71, | 615,72, | 615,73, | 615,74, | 615,75, | 615,76, | 615,77, | 615,78, | 615,79, | 615,80, | 615,81, | 615,82, | 615,83, | 615,84, | 615,85, | 616,1, | 616,2, | 616,3, | 616,4, | 616,5, | 616,6, | 616,7, | 616,8, | 616,9, | 616,10, | 616,11, | 616,12, | 616,13, | 616,14, | 616,15, | 616,16, | 616,17, | 616,18, | 616,19, | 616,20, | 616,21, | 616,22, | 616,23, | 616,24, | 616,25, | 616,26, | 616,27, | 616,28, | 616,29, | 616,30, | 616,31, | 616,32, | 616,33, | 616,34, | 616,35, | 616,36, | 616,37, | 616,38, | 616,39, | 616,40, | 616,41, | 616,42, | 616,43, | 616,44, | 616,45, | 616,46, | 616,47, | 616,48, | 616,49, | 616,50, | 616,51, | 616,52, | 616,53, | 616,54, | 616,55, | 616,56, | 616,57, | 616,58, | 616,59, | 616,60, | 616,61, | 616,62, | 616,63, | 616,64, | 616,65, | 616,66, | 616,67, | 616,68, | 616,69, | 616,70, | 616,71, | 616,72, | 616,73, | 616,74, | 616,75, | 616,76, | 616,77, | 616,78, | 616,79, | 616,80, | 616,81, | 616,82, | 616,83, | 616,84, | 616,85, | 617,1, | 617,2, | 617,3, | 617,4, | 617,5, | 617,6, | 617,7, | 617,8, | 617,9, | 617,10, | 617,11, | 617,12, | 617,13, | 617,14, | 617,15, | 617,16, | 617,17, | 617,18, | 617,19, | 617,20, | 617,21, | 617,22, | 617,23, | 617,24, | 617,25, | 617,26, | 617,27, | 617,28, | 617,29, | 617,30, | 617,31, | 617,32, | 617,33, | 617,34, | 617,35, | 617,36, | 617,37, | 617,38, | 617,39, | 617,40, | 617,41, | 617,42, | 617,43, | 617,44, | 617,45, | 617,46, | 617,47, | 617,48, | 617,49, | 617,50, | 617,51, | 617,52, | 617,53, | 617,54, | 617,55, | 617,56, | 617,57, | 617,58, | 617,59, | 617,60, | 617,61, | 617,62, | 617,63, | 617,64, | 617,65, | 617,66, | 617,67, | 617,68, | 617,69, | 617,70, | 617,71, | 617,72, | 617,73, | 617,74, | 617,75, | 617,76, | 617,77, | 617,78, | 617,79, | 617,80, | 617,81, | 617,82, | 617,83, | 617,84, | 617,85, | 618,1, | 618,2, | 618,3, | 618,4, | 618,5, | 618,6, | 618,7, | 618,8, | 618,9, | 618,10, | 618,11, | 618,12, | 618,13, | 618,14, | 618,15, | 618,16, | 618,17, | 618,18, | 618,19, | 618,20, | 618,21, | 618,22, | 618,23, | 618,24, | 618,25, | 618,26, | 618,27, | 618,28, | 618,29, | 618,30, | 618,31, | 618,32, | 618,33, | 618,34, | 618,35, | 618,36, | 618,37, | 618,38, | 618,39, | 618,40, | 618,41, | 618,42, | 618,43, | 618,44, | 618,45, | 618,46, | 618,47, | 618,48, | 618,49, | 618,50, | 618,51, | 618,52, | 618,53, | 618,54, | 618,55, | 618,56, | 618,57, | 618,58, | 618,59, | 618,60, | 618,61, | 618,62, | 618,63, | 618,64, | 618,65, | 618,66, | 618,67, | 618,68, | 618,69, | 618,70, | 618,71, | 618,72, | 618,73, | 618,74, | 618,75, | 618,76, | 618,77, | 618,78, | 618,79, | 618,80, | 618,81, | 618,82, | 618,83, | 618,84, | 618,85, | 619,1, | 619,2, | 619,3, | 619,4, | 619,5, | 619,6, | 619,7, | 619,8, | 619,9, | 619,10, | 619,11, | 619,12, | 619,13, | 619,14, | 619,15, | 619,16, | 619,17, | 619,18, | 619,19, | 619,20, | 619,21, | 619,22, | 619,23, | 619,24, | 619,25, | 619,26, | 619,27, | 619,28, | 619,29, | 619,30, | 619,31, | 619,32, | 619,33, | 619,34, | 619,35, | 619,36, | 619,37, | 619,38, | 619,39, | 619,40, | 619,41, | 619,42, | 619,43, | 619,44, | 619,45, | 619,46, | 619,47, | 619,48, | 619,49, | 619,50, | 619,51, | 619,52, | 619,53, | 619,54, | 619,55, | 619,56, | 619,57, | 619,58, | 619,59, | 619,60, | 619,61, | 619,62, | 619,63, | 619,64, | 619,65, | 619,66, | 619,67, | 619,68, | 619,69, | 619,70, | 619,71, | 619,72, | 619,73, | 619,74, | 619,75, | 619,76, | 619,77, | 619,78, | 619,79, | 619,80, | 619,81, | 619,82, | 619,83, | 619,84, | 619,85, | 620,1, | 620,2, | 620,3, | 620,4, | 620,5, | 620,6, | 620,7, | 620,8, | 620,9, | 620,10, | 620,11, | 620,12, | 620,13, | 620,14, | 620,15, | 620,16, | 620,17, | 620,18, | 620,19, | 620,20, | 620,21, | 620,22, | 620,23, | 620,24, | 620,25, | 620,26, | 620,27, | 620,28, | 620,29, | 620,30, | 620,31, | 620,32, | 620,33, | 620,34, | 620,35, | 620,36, | 620,37, | 620,38, | 620,39, | 620,40, | 620,41, | 620,42, | 620,43, | 620,44, | 620,45, | 620,46, | 620,47, | 620,48, | 620,49, | 620,50, | 620,51, | 620,52, | 620,53, | 620,54, | 620,55, | 620,56, | 620,57, | 620,58, | 620,59, | 620,60, | 620,61, | 620,62, | 620,63, | 620,64, | 620,65, | 620,66, | 620,67, | 620,68, | 620,69, | 620,70, | 620,71, | 620,72, | 620,73, | 620,74, | 620,75, | 620,76, | 620,77, | 620,78, | 620,79, | 620,80, | 620,81, | 620,82, | 620,83, | 620,84, | 620,85, | 621,1, | 621,2, | 621,3, | 621,4, | 621,5, | 621,6, | 621,7, | 621,8, | 621,9, | 621,10, | 621,11, | 621,12, | 621,13, | 621,14, | 621,15, | 621,16, | 621,17, | 621,18, | 621,19, | 621,20, | 621,21, | 621,22, | 621,23, | 621,24, | 621,25, | 621,26, | 621,27, | 621,28, | 621,29, | 621,30, | 621,31, | 621,32, | 621,33, | 621,34, | 621,35, | 621,36, | 621,37, | 621,38, | 621,39, | 621,40, | 621,41, | 621,42, | 621,43, | 621,44, | 621,45, | 621,46, | 621,47, | 621,48, | 621,49, | 621,50, | 621,51, | 621,52, | 621,53, | 621,54, | 621,55, | 621,56, | 621,57, | 621,58, | 621,59, | 621,60, | 621,61, | 621,62, | 621,63, | 621,64, | 621,65, | 621,66, | 621,67, | 621,68, | 621,69, | 621,70, | 621,71, | 621,72, | 621,73, | 621,74, | 621,75, | 621,76, | 621,77, | 621,78, | 621,79, | 621,80, | 621,81, | 621,82, | 621,83, | 621,84, | 621,85, | 622,1, | 622,2, | 622,3, | 622,4, | 622,5, | 622,6, | 622,7, | 622,8, | 622,9, | 622,10, | 622,11, | 622,12, | 622,13, | 622,14, | 622,15, | 622,16, | 622,17, | 622,18, | 622,19, | 622,20, | 622,21, | 622,22, | 622,23, | 622,24, | 622,25, | 622,26, | 622,27, | 622,28, | 622,29, | 622,30, | 622,31, | 622,32, | 622,33, | 622,34, | 622,35, | 622,36, | 622,37, | 622,38, | 622,39, | 622,40, | 622,41, | 622,42, | 622,43, | 622,44, | 622,45, | 622,46, | 622,47, | 622,48, | 622,49, | 622,50, | 622,51, | 622,52, | 622,53, | 622,54, | 622,55, | 622,56, | 622,57, | 622,58, | 622,59, | 622,60, | 622,61, | 622,62, | 622,63, | 622,64, | 622,65, | 622,66, | 622,67, | 622,68, | 622,69, | 622,70, | 622,71, | 622,72, | 622,73, | 622,74, | 622,75, | 622,76, | 622,77, | 622,78, | 622,79, | 622,80, | 622,81, | 622,82, | 622,83, | 622,84, | 622,85, | 623,1, | 623,2, | 623,3, | 623,4, | 623,5, | 623,6, | 623,7, | 623,8, | 623,9, | 623,10, | 623,11, | 623,12, | 623,13, | 623,14, | 623,15, | 623,16, | 623,17, | 623,18, | 623,19, | 623,20, | 623,21, | 623,22, | 623,23, | 623,24, | 623,25, | 623,26, | 623,27, | 623,28, | 623,29, | 623,30, | 623,31, | 623,32, | 623,33, | 623,34, | 623,35, | 623,36, | 623,37, | 623,38, | 623,39, | 623,40, | 623,41, | 623,42, | 623,43, | 623,44, | 623,45, | 623,46, | 623,47, | 623,48, | 623,49, | 623,50, | 623,51, | 623,52, | 623,53, | 623,54, | 623,55, | 623,56, | 623,57, | 623,58, | 623,59, | 623,60, | 623,61, | 623,62, | 623,63, | 623,64, | 623,65, | 623,66, | 623,67, | 623,68, | 623,69, | 623,70, | 623,71, | 623,72, | 623,73, | 623,74, | 623,75, | 623,76, | 623,77, | 623,78, | 623,79, | 623,80, | 623,81, | 623,82, | 623,83, | 623,84, | 623,85, | 624,1, | 624,2, | 624,3, | 624,4, | 624,5, | 624,6, | 624,7, | 624,8, | 624,9, | 624,10, | 624,11, | 624,12, | 624,13, | 624,14, | 624,15, | 624,16, | 624,17, | 624,18, | 624,19, | 624,20, | 624,21, | 624,22, | 624,23, | 624,24, | 624,25, | 624,26, | 624,27, | 624,28, | 624,29, | 624,30, | 624,31, | 624,32, | 624,33, | 624,34, | 624,35, | 624,36, | 624,37, | 624,38, | 624,39, | 624,40, | 624,41, | 624,42, | 624,43, | 624,44, | 624,45, | 624,46, | 624,47, | 624,48, | 624,49, | 624,50, | 624,51, | 624,52, | 624,53, | 624,54, | 624,55, | 624,56, | 624,57, | 624,58, | 624,59, | 624,60, | 624,61, | 624,62, | 624,63, | 624,64, | 624,65, | 624,66, | 624,67, | 624,68, | 624,69, | 624,70, | 624,71, | 624,72, | 624,73, | 624,74, | 624,75, | 624,76, | 624,77, | 624,78, | 624,79, | 624,80, | 624,81, | 624,82, | 624,83, | 624,84, | 624,85, | 625,1, | 625,2, | 625,3, | 625,4, | 625,5, | 625,6, | 625,7, | 625,8, | 625,9, | 625,10, | 625,11, | 625,12, | 625,13, | 625,14, | 625,15, | 625,16, | 625,17, | 625,18, | 625,19, | 625,20, | 625,21, | 625,22, | 625,23, | 625,24, | 625,25, | 625,26, | 625,27, | 625,28, | 625,29, | 625,30, | 625,31, | 625,32, | 625,33, | 625,34, | 625,35, | 625,36, | 625,37, | 625,38, | 625,39, | 625,40, | 625,41, | 625,42, | 625,43, | 625,44, | 625,45, | 625,46, | 625,47, | 625,48, | 625,49, | 625,50, | 625,51, | 625,52, | 625,53, | 625,54, | 625,55, | 625,56, | 625,57, | 625,58, | 625,59, | 625,60, | 625,61, | 625,62, | 625,63, | 625,64, | 625,65, | 625,66, | 625,67, | 625,68, | 625,69, | 625,70, | 625,71, | 625,72, | 625,73, | 625,74, | 625,75, | 625,76, | 625,77, | 625,78, | 625,79, | 625,80, | 625,81, | 625,82, | 625,83, | 625,84, | 625,85, | 626,1, | 626,2, | 626,3, | 626,4, | 626,5, | 626,6, | 626,7, | 626,8, | 626,9, | 626,10, | 626,11, | 626,12, | 626,13, | 626,14, | 626,15, | 626,16, | 626,17, | 626,18, | 626,19, | 626,20, | 626,21, | 626,22, | 626,23, | 626,24, | 626,25, | 626,26, | 626,27, | 626,28, | 626,29, | 626,30, | 626,31, | 626,32, | 626,33, | 626,34, | 626,35, | 626,36, | 626,37, | 626,38, | 626,39, | 626,40, | 626,41, | 626,42, | 626,43, | 626,44, | 626,45, | 626,46, | 626,47, | 626,48, | 626,49, | 626,50, | 626,51, | 626,52, | 626,53, | 626,54, | 626,55, | 626,56, | 626,57, | 626,58, | 626,59, | 626,60, | 626,61, | 626,62, | 626,63, | 626,64, | 626,65, | 626,66, | 626,67, | 626,68, | 626,69, | 626,70, | 626,71, | 626,72, | 626,73, | 626,74, | 626,75, | 626,76, | 626,77, | 626,78, | 626,79, | 626,80, | 626,81, | 626,82, | 626,83, | 626,84, | 626,85, | 627,1, | 627,2, | 627,3, | 627,4, | 627,5, | 627,6, | 627,7, | 627,8, | 627,9, | 627,10, | 627,11, | 627,12, | 627,13, | 627,14, | 627,15, | 627,16, | 627,17, | 627,18, | 627,19, | 627,20, | 627,21, | 627,22, | 627,23, | 627,24, | 627,25, | 627,26, | 627,27, | 627,28, | 627,29, | 627,30, | 627,31, | 627,32, | 627,33, | 627,34, | 627,35, | 627,36, | 627,37, | 627,38, | 627,39, | 627,40, | 627,41, | 627,42, | 627,43, | 627,44, | 627,45, | 627,46, | 627,47, | 627,48, | 627,49, | 627,50, | 627,51, | 627,52, | 627,53, | 627,54, | 627,55, | 627,56, | 627,57, | 627,58, | 627,59, | 627,60, | 627,61, | 627,62, | 627,63, | 627,64, | 627,65, | 627,66, | 627,67, | 627,68, | 627,69, | 627,70, | 627,71, | 627,72, | 627,73, | 627,74, | 627,75, | 627,76, | 627,77, | 627,78, | 627,79, | 627,80, | 627,81, | 627,82, | 627,83, | 627,84, | 627,85, | 628,1, | 628,2, | 628,3, | 628,4, | 628,5, | 628,6, | 628,7, | 628,8, | 628,9, | 628,10, | 628,11, | 628,12, | 628,13, | 628,14, | 628,15, | 628,16, | 628,17, | 628,18, | 628,19, | 628,20, | 628,21, | 628,22, | 628,23, | 628,24, | 628,25, | 628,26, | 628,27, | 628,28, | 628,29, | 628,30, | 628,31, | 628,32, | 628,33, | 628,34, | 628,35, | 628,36, | 628,37, | 628,38, | 628,39, | 628,40, | 628,41, | 628,42, | 628,43, | 628,44, | 628,45, | 628,46, | 628,47, | 628,48, | 628,49, | 628,50, | 628,51, | 628,52, | 628,53, | 628,54, | 628,55, | 628,56, | 628,57, | 628,58, | 628,59, | 628,60, | 628,61, | 628,62, | 628,63, | 628,64, | 628,65, | 628,66, | 628,67, | 628,68, | 628,69, | 628,70, | 628,71, | 628,72, | 628,73, | 628,74, | 628,75, | 628,76, | 628,77, | 628,78, | 628,79, | 628,80, | 628,81, | 628,82, | 628,83, | 628,84, | 628,85, | 629,1, | 629,2, | 629,3, | 629,4, | 629,5, | 629,6, | 629,7, | 629,8, | 629,9, | 629,10, | 629,11, | 629,12, | 629,13, | 629,14, | 629,15, | 629,16, | 629,17, | 629,18, | 629,19, | 629,20, | 629,21, | 629,22, | 629,23, | 629,24, | 629,25, | 629,26, | 629,27, | 629,28, | 629,29, | 629,30, | 629,31, | 629,32, | 629,33, | 629,34, | 629,35, | 629,36, | 629,37, | 629,38, | 629,39, | 629,40, | 629,41, | 629,42, | 629,43, | 629,44, | 629,45, | 629,46, | 629,47, | 629,48, | 629,49, | 629,50, | 629,51, | 629,52, | 629,53, | 629,54, | 629,55, | 629,56, | 629,57, | 629,58, | 629,59, | 629,60, | 629,61, | 629,62, | 629,63, | 629,64, | 629,65, | 629,66, | 629,67, | 629,68, | 629,69, | 629,70, | 629,71, | 629,72, | 629,73, | 629,74, | 629,75, | 629,76, | 629,77, | 629,78, | 629,79, | 629,80, | 629,81, | 629,82, | 629,83, | 629,84, | 629,85, | 630,1, | 630,2, | 630,3, | 630,4, | 630,5, | 630,6, | 630,7, | 630,8, | 630,9, | 630,10, | 630,11, | 630,12, | 630,13, | 630,14, | 630,15, | 630,16, | 630,17, | 630,18, | 630,19, | 630,20, | 630,21, | 630,22, | 630,23, | 630,24, | 630,25, | 630,26, | 630,27, | 630,28, | 630,29, | 630,30, | 630,31, | 630,32, | 630,33, | 630,34, | 630,35, | 630,36, | 630,37, | 630,38, | 630,39, | 630,40, | 630,41, | 630,42, | 630,43, | 630,44, | 630,45, | 630,46, | 630,47, | 630,48, | 630,49, | 630,50, | 630,51, | 630,52, | 630,53, | 630,54, | 630,55, | 630,56, | 630,57, | 630,58, | 630,59, | 630,60, | 630,61, | 630,62, | 630,63, | 630,64, | 630,65, | 630,66, | 630,67, | 630,68, | 630,69, | 630,70, | 630,71, | 630,72, | 630,73, | 630,74, | 630,75, | 630,76, | 630,77, | 630,78, | 630,79, | 630,80, | 630,81, | 630,82, | 630,83, | 630,84, | 630,85, | 631,1, | 631,2, | 631,3, | 631,4, | 631,5, | 631,6, | 631,7, | 631,8, | 631,9, | 631,10, | 631,11, | 631,12, | 631,13, | 631,14, | 631,15, | 631,16, | 631,17, | 631,18, | 631,19, | 631,20, | 631,21, | 631,22, | 631,23, | 631,24, | 631,25, | 631,26, | 631,27, | 631,28, | 631,29, | 631,30, | 631,31, | 631,32, | 631,33, | 631,34, | 631,35, | 631,36, | 631,37, | 631,38, | 631,39, | 631,40, | 631,41, | 631,42, | 631,43, | 631,44, | 631,45, | 631,46, | 631,47, | 631,48, | 631,49, | 631,50, | 631,51, | 631,52, | 631,53, | 631,54, | 631,55, | 631,56, | 631,57, | 631,58, | 631,59, | 631,60, | 631,61, | 631,62, | 631,63, | 631,64, | 631,65, | 631,66, | 631,67, | 631,68, | 631,69, | 631,70, | 631,71, | 631,72, | 631,73, | 631,74, | 631,75, | 631,76, | 631,77, | 631,78, | 631,79, | 631,80, | 631,81, | 631,82, | 631,83, | 631,84, | 631,85, | 632,1, | 632,2, | 632,3, | 632,4, | 632,5, | 632,6, | 632,7, | 632,8, | 632,9, | 632,10, | 632,11, | 632,12, | 632,13, | 632,14, | 632,15, | 632,16, | 632,17, | 632,18, | 632,19, | 632,20, | 632,21, | 632,22, | 632,23, | 632,24, | 632,25, | 632,26, | 632,27, | 632,28, | 632,29, | 632,30, | 632,31, | 632,32, | 632,33, | 632,34, | 632,35, | 632,36, | 632,37, | 632,38, | 632,39, | 632,40, | 632,41, | 632,42, | 632,43, | 632,44, | 632,45, | 632,46, | 632,47, | 632,48, | 632,49, | 632,50, | 632,51, | 632,52, | 632,53, | 632,54, | 632,55, | 632,56, | 632,57, | 632,58, | 632,59, | 632,60, | 632,61, | 632,62, | 632,63, | 632,64, | 632,65, | 632,66, | 632,67, | 632,68, | 632,69, | 632,70, | 632,71, | 632,72, | 632,73, | 632,74, | 632,75, | 632,76, | 632,77, | 632,78, | 632,79, | 632,80, | 632,81, | 632,82, | 632,83, | 632,84, | 632,85, | 633,1, | 633,2, | 633,3, | 633,4, | 633,5, | 633,6, | 633,7, | 633,8, | 633,9, | 633,10, | 633,11, | 633,12, | 633,13, | 633,14, | 633,15, | 633,16, | 633,17, | 633,18, | 633,19, | 633,20, | 633,21, | 633,22, | 633,23, | 633,24, | 633,25, | 633,26, | 633,27, | 633,28, | 633,29, | 633,30, | 633,31, | 633,32, | 633,33, | 633,34, | 633,35, | 633,36, | 633,37, | 633,38, | 633,39, | 633,40, | 633,41, | 633,42, | 633,43, | 633,44, | 633,45, | 633,46, | 633,47, | 633,48, | 633,49, | 633,50, | 633,51, | 633,52, | 633,53, | 633,54, | 633,55, | 633,56, | 633,57, | 633,58, | 633,59, | 633,60, | 633,61, | 633,62, | 633,63, | 633,64, | 633,65, | 633,66, | 633,67, | 633,68, | 633,69, | 633,70, | 633,71, | 633,72, | 633,73, | 633,74, | 633,75, | 633,76, | 633,77, | 633,78, | 633,79, | 633,80, | 633,81, | 633,82, | 633,83, | 633,84, | 633,85, | 634,1, | 634,2, | 634,3, | 634,4, | 634,5, | 634,6, | 634,7, | 634,8, | 634,9, | 634,10, | 634,11, | 634,12, | 634,13, | 634,14, | 634,15, | 634,16, | 634,17, | 634,18, | 634,19, | 634,20, | 634,21, | 634,22, | 634,23, | 634,24, | 634,25, | 634,26, | 634,27, | 634,28, | 634,29, | 634,30, | 634,31, | 634,32, | 634,33, | 634,34, | 634,35, | 634,36, | 634,37, | 634,38, | 634,39, | 634,40, | 634,41, | 634,42, | 634,43, | 634,44, | 634,45, | 634,46, | 634,47, | 634,48, | 634,49, | 634,50, | 634,51, | 634,52, | 634,53, | 634,54, | 634,55, | 634,56, | 634,57, | 634,58, | 634,59, | 634,60, | 634,61, | 634,62, | 634,63, | 634,64, | 634,65, | 634,66, | 634,67, | 634,68, | 634,69, | 634,70, | 634,71, | 634,72, | 634,73, | 634,74, | 634,75, | 634,76, | 634,77, | 634,78, | 634,79, | 634,80, | 634,81, | 634,82, | 634,83, | 634,84, | 634,85, | 635,1, | 635,2, | 635,3, | 635,4, | 635,5, | 635,6, | 635,7, | 635,8, | 635,9, | 635,10, | 635,11, | 635,12, | 635,13, | 635,14, | 635,15, | 635,16, | 635,17, | 635,18, | 635,19, | 635,20, | 635,21, | 635,22, | 635,23, | 635,24, | 635,25, | 635,26, | 635,27, | 635,28, | 635,29, | 635,30, | 635,31, | 635,32, | 635,33, | 635,34, | 635,35, | 635,36, | 635,37, | 635,38, | 635,39, | 635,40, | 635,41, | 635,42, | 635,43, | 635,44, | 635,45, | 635,46, | 635,47, | 635,48, | 635,49, | 635,50, | 635,51, | 635,52, | 635,53, | 635,54, | 635,55, | 635,56, | 635,57, | 635,58, | 635,59, | 635,60, | 635,61, | 635,62, | 635,63, | 635,64, | 635,65, | 635,66, | 635,67, | 635,68, | 635,69, | 635,70, | 635,71, | 635,72, | 635,73, | 635,74, | 635,75, | 635,76, | 635,77, | 635,78, | 635,79, | 635,80, | 635,81, | 635,82, | 635,83, | 635,84, | 635,85, | 636,1, | 636,2, | 636,3, | 636,4, | 636,5, | 636,6, | 636,7, | 636,8, | 636,9, | 636,10, | 636,11, | 636,12, | 636,13, | 636,14, | 636,15, | 636,16, | 636,17, | 636,18, | 636,19, | 636,20, | 636,21, | 636,22, | 636,23, | 636,24, | 636,25, | 636,26, | 636,27, | 636,28, | 636,29, | 636,30, | 636,31, | 636,32, | 636,33, | 636,34, | 636,35, | 636,36, | 636,37, | 636,38, | 636,39, | 636,40, | 636,41, | 636,42, | 636,43, | 636,44, | 636,45, | 636,46, | 636,47, | 636,48, | 636,49, | 636,50, | 636,51, | 636,52, | 636,53, | 636,54, | 636,55, | 636,56, | 636,57, | 636,58, | 636,59, | 636,60, | 636,61, | 636,62, | 636,63, | 636,64, | 636,65, | 636,66, | 636,67, | 636,68, | 636,69, | 636,70, | 636,71, | 636,72, | 636,73, | 636,74, | 636,75, | 636,76, | 636,77, | 636,78, | 636,79, | 636,80, | 636,81, | 636,82, | 636,83, | 636,84, | 636,85, | 637,1, | 637,2, | 637,3, | 637,4, | 637,5, | 637,6, | 637,7, | 637,8, | 637,9, | 637,10, | 637,11, | 637,12, | 637,13, | 637,14, | 637,15, | 637,16, | 637,17, | 637,18, | 637,19, | 637,20, | 637,21, | 637,22, | 637,23, | 637,24, | 637,25, | 637,26, | 637,27, | 637,28, | 637,29, | 637,30, | 637,31, | 637,32, | 637,33, | 637,34, | 637,35, | 637,36, | 637,37, | 637,38, | 637,39, | 637,40, | 637,41, | 637,42, | 637,43, | 637,44, | 637,45, | 637,46, | 637,47, | 637,48, | 637,49, | 637,50, | 637,51, | 637,52, | 637,53, | 637,54, | 637,55, | 637,56, | 637,57, | 637,58, | 637,59, | 637,60, | 637,61, | 637,62, | 637,63, | 637,64, | 637,65, | 637,66, | 637,67, | 637,68, | 637,69, | 637,70, | 637,71, | 637,72, | 637,73, | 637,74, | 637,75, | 637,76, | 637,77, | 637,78, | 637,79, | 637,80, | 637,81, | 637,82, | 637,83, | 637,84, | 637,85, | 638,1, | 638,2, | 638,3, | 638,4, | 638,5, | 638,6, | 638,7, | 638,8, | 638,9, | 638,10, | 638,11, | 638,12, | 638,13, | 638,14, | 638,15, | 638,16, | 638,17, | 638,18, | 638,19, | 638,20, | 638,21, | 638,22, | 638,23, | 638,24, | 638,25, | 638,26, | 638,27, | 638,28, | 638,29, | 638,30, | 638,31, | 638,32, | 638,33, | 638,34, | 638,35, | 638,36, | 638,37, | 638,38, | 638,39, | 638,40, | 638,41, | 638,42, | 638,43, | 638,44, | 638,45, | 638,46, | 638,47, | 638,48, | 638,49, | 638,50, | 638,51, | 638,52, | 638,53, | 638,54, | 638,55, | 638,56, | 638,57, | 638,58, | 638,59, | 638,60, | 638,61, | 638,62, | 638,63, | 638,64, | 638,65, | 638,66, | 638,67, | 638,68, | 638,69, | 638,70, | 638,71, | 638,72, | 638,73, | 638,74, | 638,75, | 638,76, | 638,77, | 638,78, | 638,79, | 638,80, | 638,81, | 638,82, | 638,83, | 638,84, | 638,85, | 639,1, | 639,2, | 639,3, | 639,4, | 639,5, | 639,6, | 639,7, | 639,8, | 639,9, | 639,10, | 639,11, | 639,12, | 639,13, | 639,14, | 639,15, | 639,16, | 639,17, | 639,18, | 639,19, | 639,20, | 639,21, | 639,22, | 639,23, | 639,24, | 639,25, | 639,26, | 639,27, | 639,28, | 639,29, | 639,30, | 639,31, | 639,32, | 639,33, | 639,34, | 639,35, | 639,36, | 639,37, | 639,38, | 639,39, | 639,40, | 639,41, | 639,42, | 639,43, | 639,44, | 639,45, | 639,46, | 639,47, | 639,48, | 639,49, | 639,50, | 639,51, | 639,52, | 639,53, | 639,54, | 639,55, | 639,56, | 639,57, | 639,58, | 639,59, | 639,60, | 639,61, | 639,62, | 639,63, | 639,64, | 639,65, | 639,66, | 639,67, | 639,68, | 639,69, | 639,70, | 639,71, | 639,72, | 639,73, | 639,74, | 639,75, | 639,76, | 639,77, | 639,78, | 639,79, | 639,80, | 639,81, | 639,82, | 639,83, | 639,84, | 639,85, | 640,1, | 640,2, | 640,3, | 640,4, | 640,5, | 640,6, | 640,7, | 640,8, | 640,9, | 640,10, | 640,11, | 640,12, | 640,13, | 640,14, | 640,15, | 640,16, | 640,17, | 640,18, | 640,19, | 640,20, | 640,21, | 640,22, | 640,23, | 640,24, | 640,25, | 640,26, | 640,27, | 640,28, | 640,29, | 640,30, | 640,31, | 640,32, | 640,33, | 640,34, | 640,35, | 640,36, | 640,37, | 640,38, | 640,39, | 640,40, | 640,41, | 640,42, | 640,43, | 640,44, | 640,45, | 640,46, | 640,47, | 640,48, | 640,49, | 640,50, | 640,51, | 640,52, | 640,53, | 640,54, | 640,55, | 640,56, | 640,57, | 640,58, | 640,59, | 640,60, | 640,61, | 640,62, | 640,63, | 640,64, | 640,65, | 640,66, | 640,67, | 640,68, | 640,69, | 640,70, | 640,71, | 640,72, | 640,73, | 640,74, | 640,75, | 640,76, | 640,77, | 640,78, | 640,79, | 640,80, | 640,81, | 640,82, | 640,83, | 640,84, | 640,85, | 641,1, | 641,2, | 641,3, | 641,4, | 641,5, | 641,6, | 641,7, | 641,8, | 641,9, | 641,10, | 641,11, | 641,12, | 641,13, | 641,14, | 641,15, | 641,16, | 641,17, | 641,18, | 641,19, | 641,20, | 641,21, | 641,22, | 641,23, | 641,24, | 641,25, | 641,26, | 641,27, | 641,28, | 641,29, | 641,30, | 641,31, | 641,32, | 641,33, | 641,34, | 641,35, | 641,36, | 641,37, | 641,38, | 641,39, | 641,40, | 641,41, | 641,42, | 641,43, | 641,44, | 641,45, | 641,46, | 641,47, | 641,48, | 641,49, | 641,50, | 641,51, | 641,52, | 641,53, | 641,54, | 641,55, | 641,56, | 641,57, | 641,58, | 641,59, | 641,60, | 641,61, | 641,62, | 641,63, | 641,64, | 641,65, | 641,66, | 641,67, | 641,68, | 641,69, | 641,70, | 641,71, | 641,72, | 641,73, | 641,74, | 641,75, | 641,76, | 641,77, | 641,78, | 641,79, | 641,80, | 641,81, | 641,82, | 641,83, | 641,84, | 641,85, | 642,1, | 642,2, | 642,3, | 642,4, | 642,5, | 642,6, | 642,7, | 642,8, | 642,9, | 642,10, | 642,11, | 642,12, | 642,13, | 642,14, | 642,15, | 642,16, | 642,17, | 642,18, | 642,19, | 642,20, | 642,21, | 642,22, | 642,23, | 642,24, | 642,25, | 642,26, | 642,27, | 642,28, | 642,29, | 642,30, | 642,31, | 642,32, | 642,33, | 642,34, | 642,35, | 642,36, | 642,37, | 642,38, | 642,39, | 642,40, | 642,41, | 642,42, | 642,43, | 642,44, | 642,45, | 642,46, | 642,47, | 642,48, | 642,49, | 642,50, | 642,51, | 642,52, | 642,53, | 642,54, | 642,55, | 642,56, | 642,57, | 642,58, | 642,59, | 642,60, | 642,61, | 642,62, | 642,63, | 642,64, | 642,65, | 642,66, | 642,67, | 642,68, | 642,69, | 642,70, | 642,71, | 642,72, | 642,73, | 642,74, | 642,75, | 642,76, | 642,77, | 642,78, | 642,79, | 642,80, | 642,81, | 642,82, | 642,83, | 642,84, | 642,85, | 643,1, | 643,2, | 643,3, | 643,4, | 643,5, | 643,6, | 643,7, | 643,8, | 643,9, | 643,10, | 643,11, | 643,12, | 643,13, | 643,14, | 643,15, | 643,16, | 643,17, | 643,18, | 643,19, | 643,20, | 643,21, | 643,22, | 643,23, | 643,24, | 643,25, | 643,26, | 643,27, | 643,28, | 643,29, | 643,30, | 643,31, | 643,32, | 643,33, | 643,34, | 643,35, | 643,36, | 643,37, | 643,38, | 643,39, | 643,40, | 643,41, | 643,42, | 643,43, | 643,44, | 643,45, | 643,46, | 643,47, | 643,48, | 643,49, | 643,50, | 643,51, | 643,52, | 643,53, | 643,54, | 643,55, | 643,56, | 643,57, | 643,58, | 643,59, | 643,60, | 643,61, | 643,62, | 643,63, | 643,64, | 643,65, | 643,66, | 643,67, | 643,68, | 643,69, | 643,70, | 643,71, | 643,72, | 643,73, | 643,74, | 643,75, | 643,76, | 643,77, | 643,78, | 643,79, | 643,80, | 643,81, | 643,82, | 643,83, | 643,84, | 643,85, | 644,1, | 644,2, | 644,3, | 644,4, | 644,5, | 644,6, | 644,7, | 644,8, | 644,9, | 644,10, | 644,11, | 644,12, | 644,13, | 644,14, | 644,15, | 644,16, | 644,17, | 644,18, | 644,19, | 644,20, | 644,21, | 644,22, | 644,23, | 644,24, | 644,25, | 644,26, | 644,27, | 644,28, | 644,29, | 644,30, | 644,31, | 644,32, | 644,33, | 644,34, | 644,35, | 644,36, | 644,37, | 644,38, | 644,39, | 644,40, | 644,41, | 644,42, | 644,43, | 644,44, | 644,45, | 644,46, | 644,47, | 644,48, | 644,49, | 644,50, | 644,51, | 644,52, | 644,53, | 644,54, | 644,55, | 644,56, | 644,57, | 644,58, | 644,59, | 644,60, | 644,61, | 644,62, | 644,63, | 644,64, | 644,65, | 644,66, | 644,67, | 644,68, | 644,69, | 644,70, | 644,71, | 644,72, | 644,73, | 644,74, | 644,75, | 644,76, | 644,77, | 644,78, | 644,79, | 644,80, | 644,81, | 644,82, | 644,83, | 644,84, | 644,85, | 645,1, | 645,2, | 645,3, | 645,4, | 645,5, | 645,6, | 645,7, | 645,8, | 645,9, | 645,10, | 645,11, | 645,12, | 645,13, | 645,14, | 645,15, | 645,16, | 645,17, | 645,18, | 645,19, | 645,20, | 645,21, | 645,22, | 645,23, | 645,24, | 645,25, | 645,26, | 645,27, | 645,28, | 645,29, | 645,30, | 645,31, | 645,32, | 645,33, | 645,34, | 645,35, | 645,36, | 645,37, | 645,38, | 645,39, | 645,40, | 645,41, | 645,42, | 645,43, | 645,44, | 645,45, | 645,46, | 645,47, | 645,48, | 645,49, | 645,50, | 645,51, | 645,52, | 645,53, | 645,54, | 645,55, | 645,56, | 645,57, | 645,58, | 645,59, | 645,60, | 645,61, | 645,62, | 645,63, | 645,64, | 645,65, | 645,66, | 645,67, | 645,68, | 645,69, | 645,70, | 645,71, | 645,72, | 645,73, | 645,74, | 645,75, | 645,76, | 645,77, | 645,78, | 645,79, | 645,80, | 645,81, | 645,82, | 645,83, | 645,84, | 645,85, | 646,1, | 646,2, | 646,3, | 646,4, | 646,5, | 646,6, | 646,7, | 646,8, | 646,9, | 646,10, | 646,11, | 646,12, | 646,13, | 646,14, | 646,15, | 646,16, | 646,17, | 646,18, | 646,19, | 646,20, | 646,21, | 646,22, | 646,23, | 646,24, | 646,25, | 646,26, | 646,27, | 646,28, | 646,29, | 646,30, | 646,31, | 646,32, | 646,33, | 646,34, | 646,35, | 646,36, | 646,37, | 646,38, | 646,39, | 646,40, | 646,41, | 646,42, | 646,43, | 646,44, | 646,45, | 646,46, | 646,47, | 646,48, | 646,49, | 646,50, | 646,51, | 646,52, | 646,53, | 646,54, | 646,55, | 646,56, | 646,57, | 646,58, | 646,59, | 646,60, | 646,61, | 646,62, | 646,63, | 646,64, | 646,65, | 646,66, | 646,67, | 646,68, | 646,69, | 646,70, | 646,71, | 646,72, | 646,73, | 646,74, | 646,75, | 646,76, | 646,77, | 646,78, | 646,79, | 646,80, | 646,81, | 646,82, | 646,83, | 646,84, | 646,85, | 647,1, | 647,2, | 647,3, | 647,4, | 647,5, | 647,6, | 647,7, | 647,8, | 647,9, | 647,10, | 647,11, | 647,12, | 647,13, | 647,14, | 647,15, | 647,16, | 647,17, | 647,18, | 647,19, | 647,20, | 647,21, | 647,22, | 647,23, | 647,24, | 647,25, | 647,26, | 647,27, | 647,28, | 647,29, | 647,30, | 647,31, | 647,32, | 647,33, | 647,34, | 647,35, | 647,36, | 647,37, | 647,38, | 647,39, | 647,40, | 647,41, | 647,42, | 647,43, | 647,44, | 647,45, | 647,46, | 647,47, | 647,48, | 647,49, | 647,50, | 647,51, | 647,52, | 647,53, | 647,54, | 647,55, | 647,56, | 647,57, | 647,58, | 647,59, | 647,60, | 647,61, | 647,62, | 647,63, | 647,64, | 647,65, | 647,66, | 647,67, | 647,68, | 647,69, | 647,70, | 647,71, | 647,72, | 647,73, | 647,74, | 647,75, | 647,76, | 647,77, | 647,78, | 647,79, | 647,80, | 647,81, | 647,82, | 647,83, | 647,84, | 647,85, | 648,1, | 648,2, | 648,3, | 648,4, | 648,5, | 648,6, | 648,7, | 648,8, | 648,9, | 648,10, | 648,11, | 648,12, | 648,13, | 648,14, | 648,15, | 648,16, | 648,17, | 648,18, | 648,19, | 648,20, | 648,21, | 648,22, | 648,23, | 648,24, | 648,25, | 648,26, | 648,27, | 648,28, | 648,29, | 648,30, | 648,31, | 648,32, | 648,33, | 648,34, | 648,35, | 648,36, | 648,37, | 648,38, | 648,39, | 648,40, | 648,41, | 648,42, | 648,43, | 648,44, | 648,45, | 648,46, | 648,47, | 648,48, | 648,49, | 648,50, | 648,51, | 648,52, | 648,53, | 648,54, | 648,55, | 648,56, | 648,57, | 648,58, | 648,59, | 648,60, | 648,61, | 648,62, | 648,63, | 648,64, | 648,65, | 648,66, | 648,67, | 648,68, | 648,69, | 648,70, | 648,71, | 648,72, | 648,73, | 648,74, | 648,75, | 648,76, | 648,77, | 648,78, | 648,79, | 648,80, | 648,81, | 648,82, | 648,83, | 648,84, | 648,85, | 649,1, | 649,2, | 649,3, | 649,4, | 649,5, | 649,6, | 649,7, | 649,8, | 649,9, | 649,10, | 649,11, | 649,12, | 649,13, | 649,14, | 649,15, | 649,16, | 649,17, | 649,18, | 649,19, | 649,20, | 649,21, | 649,22, | 649,23, | 649,24, | 649,25, | 649,26, | 649,27, | 649,28, | 649,29, | 649,30, | 649,31, | 649,32, | 649,33, | 649,34, | 649,35, | 649,36, | 649,37, | 649,38, | 649,39, | 649,40, | 649,41, | 649,42, | 649,43, | 649,44, | 649,45, | 649,46, | 649,47, | 649,48, | 649,49, | 649,50, | 649,51, | 649,52, | 649,53, | 649,54, | 649,55, | 649,56, | 649,57, | 649,58, | 649,59, | 649,60, | 649,61, | 649,62, | 649,63, | 649,64, | 649,65, | 649,66, | 649,67, | 649,68, | 649,69, | 649,70, | 649,71, | 649,72, | 649,73, | 649,74, | 649,75, | 649,76, | 649,77, | 649,78, | 649,79, | 649,80, | 649,81, | 649,82, | 649,83, | 649,84, | 649,85, | 650,1, | 650,2, | 650,3, | 650,4, | 650,5, | 650,6, | 650,7, | 650,8, | 650,9, | 650,10, | 650,11, | 650,12, | 650,13, | 650,14, | 650,15, | 650,16, | 650,17, | 650,18, | 650,19, | 650,20, | 650,21, | 650,22, | 650,23, | 650,24, | 650,25, | 650,26, | 650,27, | 650,28, | 650,29, | 650,30, | 650,31, | 650,32, | 650,33, | 650,34, | 650,35, | 650,36, | 650,37, | 650,38, | 650,39, | 650,40, | 650,41, | 650,42, | 650,43, | 650,44, | 650,45, | 650,46, | 650,47, | 650,48, | 650,49, | 650,50, | 650,51, | 650,52, | 650,53, | 650,54, | 650,55, | 650,56, | 650,57, | 650,58, | 650,59, | 650,60, | 650,61, | 650,62, | 650,63, | 650,64, | 650,65, | 650,66, | 650,67, | 650,68, | 650,69, | 650,70, | 650,71, | 650,72, | 650,73, | 650,74, | 650,75, | 650,76, | 650,77, | 650,78, | 650,79, | 650,80, | 650,81, | 650,82, | 650,83, | 650,84, | 650,85, | 651,1, | 651,2, | 651,3, | 651,4, | 651,5, | 651,6, | 651,7, | 651,8, | 651,9, | 651,10, | 651,11, | 651,12, | 651,13, | 651,14, | 651,15, | 651,16, | 651,17, | 651,18, | 651,19, | 651,20, | 651,21, | 651,22, | 651,23, | 651,24, | 651,25, | 651,26, | 651,27, | 651,28, | 651,29, | 651,30, | 651,31, | 651,32, | 651,33, | 651,34, | 651,35, | 651,36, | 651,37, | 651,38, | 651,39, | 651,40, | 651,41, | 651,42, | 651,43, | 651,44, | 651,45, | 651,46, | 651,47, | 651,48, | 651,49, | 651,50, | 651,51, | 651,52, | 651,53, | 651,54, | 651,55, | 651,56, | 651,57, | 651,58, | 651,59, | 651,60, | 651,61, | 651,62, | 651,63, | 651,64, | 651,65, | 651,66, | 651,67, | 651,68, | 651,69, | 651,70, | 651,71, | 651,72, | 651,73, | 651,74, | 651,75, | 651,76, | 651,77, | 651,78, | 651,79, | 651,80, | 651,81, | 651,82, | 651,83, | 651,84, | 651,85, | 652,1, | 652,2, | 652,3, | 652,4, | 652,5, | 652,6, | 652,7, | 652,8, | 652,9, | 652,10, | 652,11, | 652,12, | 652,13, | 652,14, | 652,15, | 652,16, | 652,17, | 652,18, | 652,19, | 652,20, | 652,21, | 652,22, | 652,23, | 652,24, | 652,25, | 652,26, | 652,27, | 652,28, | 652,29, | 652,30, | 652,31, | 652,32, | 652,33, | 652,34, | 652,35, | 652,36, | 652,37, | 652,38, | 652,39, | 652,40, | 652,41, | 652,42, | 652,43, | 652,44, | 652,45, | 652,46, | 652,47, | 652,48, | 652,49, | 652,50, | 652,51, | 652,52, | 652,53, | 652,54, | 652,55, | 652,56, | 652,57, | 652,58, | 652,59, | 652,60, | 652,61, | 652,62, | 652,63, | 652,64, | 652,65, | 652,66, | 652,67, | 652,68, | 652,69, | 652,70, | 652,71, | 652,72, | 652,73, | 652,74, | 652,75, | 652,76, | 652,77, | 652,78, | 652,79, | 652,80, | 652,81, | 652,82, | 652,83, | 652,84, | 652,85, | 653,1, | 653,2, | 653,3, | 653,4, | 653,5, | 653,6, | 653,7, | 653,8, | 653,9, | 653,10, | 653,11, | 653,12, | 653,13, | 653,14, | 653,15, | 653,16, | 653,17, | 653,18, | 653,19, | 653,20, | 653,21, | 653,22, | 653,23, | 653,24, | 653,25, | 653,26, | 653,27, | 653,28, | 653,29, | 653,30, | 653,31, | 653,32, | 653,33, | 653,34, | 653,35, | 653,36, | 653,37, | 653,38, | 653,39, | 653,40, | 653,41, | 653,42, | 653,43, | 653,44, | 653,45, | 653,46, | 653,47, | 653,48, | 653,49, | 653,50, | 653,51, | 653,52, | 653,53, | 653,54, | 653,55, | 653,56, | 653,57, | 653,58, | 653,59, | 653,60, | 653,61, | 653,62, | 653,63, | 653,64, | 653,65, | 653,66, | 653,67, | 653,68, | 653,69, | 653,70, | 653,71, | 653,72, | 653,73, | 653,74, | 653,75, | 653,76, | 653,77, | 653,78, | 653,79, | 653,80, | 653,81, | 653,82, | 653,83, | 653,84, | 653,85, | 654,1, | 654,2, | 654,3, | 654,4, | 654,5, | 654,6, | 654,7, | 654,8, | 654,9, | 654,10, | 654,11, | 654,12, | 654,13, | 654,14, | 654,15, | 654,16, | 654,17, | 654,18, | 654,19, | 654,20, | 654,21, | 654,22, | 654,23, | 654,24, | 654,25, | 654,26, | 654,27, | 654,28, | 654,29, | 654,30, | 654,31, | 654,32, | 654,33, | 654,34, | 654,35, | 654,36, | 654,37, | 654,38, | 654,39, | 654,40, | 654,41, | 654,42, | 654,43, | 654,44, | 654,45, | 654,46, | 654,47, | 654,48, | 654,49, | 654,50, | 654,51, | 654,52, | 654,53, | 654,54, | 654,55, | 654,56, | 654,57, | 654,58, | 654,59, | 654,60, | 654,61, | 654,62, | 654,63, | 654,64, | 654,65, | 654,66, | 654,67, | 654,68, | 654,69, | 654,70, | 654,71, | 654,72, | 654,73, | 654,74, | 654,75, | 654,76, | 654,77, | 654,78, | 654,79, | 654,80, | 654,81, | 654,82, | 654,83, | 654,84, | 654,85, | 655,1, | 655,2, | 655,3, | 655,4, | 655,5, | 655,6, | 655,7, | 655,8, | 655,9, | 655,10, | 655,11, | 655,12, | 655,13, | 655,14, | 655,15, | 655,16, | 655,17, | 655,18, | 655,19, | 655,20, | 655,21, | 655,22, | 655,23, | 655,24, | 655,25, | 655,26, | 655,27, | 655,28, | 655,29, | 655,30, | 655,31, | 655,32, | 655,33, | 655,34, | 655,35, | 655,36, | 655,37, | 655,38, | 655,39, | 655,40, | 655,41, | 655,42, | 655,43, | 655,44, | 655,45, | 655,46, | 655,47, | 655,48, | 655,49, | 655,50, | 655,51, | 655,52, | 655,53, | 655,54, | 655,55, | 655,56, | 655,57, | 655,58, | 655,59, | 655,60, | 655,61, | 655,62, | 655,63, | 655,64, | 655,65, | 655,66, | 655,67, | 655,68, | 655,69, | 655,70, | 655,71, | 655,72, | 655,73, | 655,74, | 655,75, | 655,76, | 655,77, | 655,78, | 655,79, | 655,80, | 655,81, | 655,82, | 655,83, | 655,84, | 655,85, | 656,1, | 656,2, | 656,3, | 656,4, | 656,5, | 656,6, | 656,7, | 656,8, | 656,9, | 656,10, | 656,11, | 656,12, | 656,13, | 656,14, | 656,15, | 656,16, | 656,17, | 656,18, | 656,19, | 656,20, | 656,21, | 656,22, | 656,23, | 656,24, | 656,25, | 656,26, | 656,27, | 656,28, | 656,29, | 656,30, | 656,31, | 656,32, | 656,33, | 656,34, | 656,35, | 656,36, | 656,37, | 656,38, | 656,39, | 656,40, | 656,41, | 656,42, | 656,43, | 656,44, | 656,45, | 656,46, | 656,47, | 656,48, | 656,49, | 656,50, | 656,51, | 656,52, | 656,53, | 656,54, | 656,55, | 656,56, | 656,57, | 656,58, | 656,59, | 656,60, | 656,61, | 656,62, | 656,63, | 656,64, | 656,65, | 656,66, | 656,67, | 656,68, | 656,69, | 656,70, | 656,71, | 656,72, | 656,73, | 656,74, | 656,75, | 656,76, | 656,77, | 656,78, | 656,79, | 656,80, | 656,81, | 656,82, | 656,83, | 656,84, | 656,85, | 657,1, | 657,2, | 657,3, | 657,4, | 657,5, | 657,6, | 657,7, | 657,8, | 657,9, | 657,10, | 657,11, | 657,12, | 657,13, | 657,14, | 657,15, | 657,16, | 657,17, | 657,18, | 657,19, | 657,20, | 657,21, | 657,22, | 657,23, | 657,24, | 657,25, | 657,26, | 657,27, | 657,28, | 657,29, | 657,30, | 657,31, | 657,32, | 657,33, | 657,34, | 657,35, | 657,36, | 657,37, | 657,38, | 657,39, | 657,40, | 657,41, | 657,42, | 657,43, | 657,44, | 657,45, | 657,46, | 657,47, | 657,48, | 657,49, | 657,50, | 657,51, | 657,52, | 657,53, | 657,54, | 657,55, | 657,56, | 657,57, | 657,58, | 657,59, | 657,60, | 657,61, | 657,62, | 657,63, | 657,64, | 657,65, | 657,66, | 657,67, | 657,68, | 657,69, | 657,70, | 657,71, | 657,72, | 657,73, | 657,74, | 657,75, | 657,76, | 657,77, | 657,78, | 657,79, | 657,80, | 657,81, | 657,82, | 657,83, | 657,84, | 657,85, | 658,1, | 658,2, | 658,3, | 658,4, | 658,5, | 658,6, | 658,7, | 658,8, | 658,9, | 658,10, | 658,11, | 658,12, | 658,13, | 658,14, | 658,15, | 658,16, | 658,17, | 658,18, | 658,19, | 658,20, | 658,21, | 658,22, | 658,23, | 658,24, | 658,25, | 658,26, | 658,27, | 658,28, | 658,29, | 658,30, | 658,31, | 658,32, | 658,33, | 658,34, | 658,35, | 658,36, | 658,37, | 658,38, | 658,39, | 658,40, | 658,41, | 658,42, | 658,43, | 658,44, | 658,45, | 658,46, | 658,47, | 658,48, | 658,49, | 658,50, | 658,51, | 658,52, | 658,53, | 658,54, | 658,55, | 658,56, | 658,57, | 658,58, | 658,59, | 658,60, | 658,61, | 658,62, | 658,63, | 658,64, | 658,65, | 658,66, | 658,67, | 658,68, | 658,69, | 658,70, | 658,71, | 658,72, | 658,73, | 658,74, | 658,75, | 658,76, | 658,77, | 658,78, | 658,79, | 658,80, | 658,81, | 658,82, | 658,83, | 658,84, | 658,85, | 659,1, | 659,2, | 659,3, | 659,4, | 659,5, | 659,6, | 659,7, | 659,8, | 659,9, | 659,10, | 659,11, | 659,12, | 659,13, | 659,14, | 659,15, | 659,16, | 659,17, | 659,18, | 659,19, | 659,20, | 659,21, | 659,22, | 659,23, | 659,24, | 659,25, | 659,26, | 659,27, | 659,28, | 659,29, | 659,30, | 659,31, | 659,32, | 659,33, | 659,34, | 659,35, | 659,36, | 659,37, | 659,38, | 659,39, | 659,40, | 659,41, | 659,42, | 659,43, | 659,44, | 659,45, | 659,46, | 659,47, | 659,48, | 659,49, | 659,50, | 659,51, | 659,52, | 659,53, | 659,54, | 659,55, | 659,56, | 659,57, | 659,58, | 659,59, | 659,60, | 659,61, | 659,62, | 659,63, | 659,64, | 659,65, | 659,66, | 659,67, | 659,68, | 659,69, | 659,70, | 659,71, | 659,72, | 659,73, | 659,74, | 659,75, | 659,76, | 659,77, | 659,78, | 659,79, | 659,80, | 659,81, | 659,82, | 659,83, | 659,84, | 659,85, | 660,1, | 660,2, | 660,3, | 660,4, | 660,5, | 660,6, | 660,7, | 660,8, | 660,9, | 660,10, | 660,11, | 660,12, | 660,13, | 660,14, | 660,15, | 660,16, | 660,17, | 660,18, | 660,19, | 660,20, | 660,21, | 660,22, | 660,23, | 660,24, | 660,25, | 660,26, | 660,27, | 660,28, | 660,29, | 660,30, | 660,31, | 660,32, | 660,33, | 660,34, | 660,35, | 660,36, | 660,37, | 660,38, | 660,39, | 660,40, | 660,41, | 660,42, | 660,43, | 660,44, | 660,45, | 660,46, | 660,47, | 660,48, | 660,49, | 660,50, | 660,51, | 660,52, | 660,53, | 660,54, | 660,55, | 660,56, | 660,57, | 660,58, | 660,59, | 660,60, | 660,61, | 660,62, | 660,63, | 660,64, | 660,65, | 660,66, | 660,67, | 660,68, | 660,69, | 660,70, | 660,71, | 660,72, | 660,73, | 660,74, | 660,75, | 660,76, | 660,77, | 660,78, | 660,79, | 660,80, | 660,81, | 660,82, | 660,83, | 660,84, | 660,85, | 661,1, | 661,2, | 661,3, | 661,4, | 661,5, | 661,6, | 661,7, | 661,8, | 661,9, | 661,10, | 661,11, | 661,12, | 661,13, | 661,14, | 661,15, | 661,16, | 661,17, | 661,18, | 661,19, | 661,20, | 661,21, | 661,22, | 661,23, | 661,24, | 661,25, | 661,26, | 661,27, | 661,28, | 661,29, | 661,30, | 661,31, | 661,32, | 661,33, | 661,34, | 661,35, | 661,36, | 661,37, | 661,38, | 661,39, | 661,40, | 661,41, | 661,42, | 661,43, | 661,44, | 661,45, | 661,46, | 661,47, | 661,48, | 661,49, | 661,50, | 661,51, | 661,52, | 661,53, | 661,54, | 661,55, | 661,56, | 661,57, | 661,58, | 661,59, | 661,60, | 661,61, | 661,62, | 661,63, | 661,64, | 661,65, | 661,66, | 661,67, | 661,68, | 661,69, | 661,70, | 661,71, | 661,72, | 661,73, | 661,74, | 661,75, | 661,76, | 661,77, | 661,78, | 661,79, | 661,80, | 661,81, | 661,82, | 661,83, | 661,84, | 661,85, | 662,1, | 662,2, | 662,3, | 662,4, | 662,5, | 662,6, | 662,7, | 662,8, | 662,9, | 662,10, | 662,11, | 662,12, | 662,13, | 662,14, | 662,15, | 662,16, | 662,17, | 662,18, | 662,19, | 662,20, | 662,21, | 662,22, | 662,23, | 662,24, | 662,25, | 662,26, | 662,27, | 662,28, | 662,29, | 662,30, | 662,31, | 662,32, | 662,33, | 662,34, | 662,35, | 662,36, | 662,37, | 662,38, | 662,39, | 662,40, | 662,41, | 662,42, | 662,43, | 662,44, | 662,45, | 662,46, | 662,47, | 662,48, | 662,49, | 662,50, | 662,51, | 662,52, | 662,53, | 662,54, | 662,55, | 662,56, | 662,57, | 662,58, | 662,59, | 662,60, | 662,61, | 662,62, | 662,63, | 662,64, | 662,65, | 662,66, | 662,67, | 662,68, | 662,69, | 662,70, | 662,71, | 662,72, | 662,73, | 662,74, | 662,75, | 662,76, | 662,77, | 662,78, | 662,79, | 662,80, | 662,81, | 662,82, | 662,83, | 662,84, | 662,85, | 663,1, | 663,2, | 663,3, | 663,4, | 663,5, | 663,6, | 663,7, | 663,8, | 663,9, | 663,10, | 663,11, | 663,12, | 663,13, | 663,14, | 663,15, | 663,16, | 663,17, | 663,18, | 663,19, | 663,20, | 663,21, | 663,22, | 663,23, | 663,24, | 663,25, | 663,26, | 663,27, | 663,28, | 663,29, | 663,30, | 663,31, | 663,32, | 663,33, | 663,34, | 663,35, | 663,36, | 663,37, | 663,38, | 663,39, | 663,40, | 663,41, | 663,42, | 663,43, | 663,44, | 663,45, | 663,46, | 663,47, | 663,48, | 663,49, | 663,50, | 663,51, | 663,52, | 663,53, | 663,54, | 663,55, | 663,56, | 663,57, | 663,58, | 663,59, | 663,60, | 663,61, | 663,62, | 663,63, | 663,64, | 663,65, | 663,66, | 663,67, | 663,68, | 663,69, | 663,70, | 663,71, | 663,72, | 663,73, | 663,74, | 663,75, | 663,76, | 663,77, | 663,78, | 663,79, | 663,80, | 663,81, | 663,82, | 663,83, | 663,84, | 663,85, | 664,1, | 664,2, | 664,3, | 664,4, | 664,5, | 664,6, | 664,7, | 664,8, | 664,9, | 664,10, | 664,11, | 664,12, | 664,13, | 664,14, | 664,15, | 664,16, | 664,17, | 664,18, | 664,19, | 664,20, | 664,21, | 664,22, | 664,23, | 664,24, | 664,25, | 664,26, | 664,27, | 664,28, | 664,29, | 664,30, | 664,31, | 664,32, | 664,33, | 664,34, | 664,35, | 664,36, | 664,37, | 664,38, | 664,39, | 664,40, | 664,41, | 664,42, | 664,43, | 664,44, | 664,45, | 664,46, | 664,47, | 664,48, | 664,49, | 664,50, | 664,51, | 664,52, | 664,53, | 664,54, | 664,55, | 664,56, | 664,57, | 664,58, | 664,59, | 664,60, | 664,61, | 664,62, | 664,63, | 664,64, | 664,65, | 664,66, | 664,67, | 664,68, | 664,69, | 664,70, | 664,71, | 664,72, | 664,73, | 664,74, | 664,75, | 664,76, | 664,77, | 664,78, | 664,79, | 664,80, | 664,81, | 664,82, | 664,83, | 664,84, | 664,85, | 665,1, | 665,2, | 665,3, | 665,4, | 665,5, | 665,6, | 665,7, | 665,8, | 665,9, | 665,10, | 665,11, | 665,12, | 665,13, | 665,14, | 665,15, | 665,16, | 665,17, | 665,18, | 665,19, | 665,20, | 665,21, | 665,22, | 665,23, | 665,24, | 665,25, | 665,26, | 665,27, | 665,28, | 665,29, | 665,30, | 665,31, | 665,32, | 665,33, | 665,34, | 665,35, | 665,36, | 665,37, | 665,38, | 665,39, | 665,40, | 665,41, | 665,42, | 665,43, | 665,44, | 665,45, | 665,46, | 665,47, | 665,48, | 665,49, | 665,50, | 665,51, | 665,52, | 665,53, | 665,54, | 665,55, | 665,56, | 665,57, | 665,58, | 665,59, | 665,60, | 665,61, | 665,62, | 665,63, | 665,64, | 665,65, | 665,66, | 665,67, | 665,68, | 665,69, | 665,70, | 665,71, | 665,72, | 665,73, | 665,74, | 665,75, | 665,76, | 665,77, | 665,78, | 665,79, | 665,80, | 665,81, | 665,82, | 665,83, | 665,84, | 665,85, | 666,1, | 666,2, | 666,3, | 666,4, | 666,5, | 666,6, | 666,7, | 666,8, | 666,9, | 666,10, | 666,11, | 666,12, | 666,13, | 666,14, | 666,15, | 666,16, | 666,17, | 666,18, | 666,19, | 666,20, | 666,21, | 666,22, | 666,23, | 666,24, | 666,25, | 666,26, | 666,27, | 666,28, | 666,29, | 666,30, | 666,31, | 666,32, | 666,33, | 666,34, | 666,35, | 666,36, | 666,37, | 666,38, | 666,39, | 666,40, | 666,41, | 666,42, | 666,43, | 666,44, | 666,45, | 666,46, | 666,47, | 666,48, | 666,49, | 666,50, | 666,51, | 666,52, | 666,53, | 666,54, | 666,55, | 666,56, | 666,57, | 666,58, | 666,59, | 666,60, | 666,61, | 666,62, | 666,63, | 666,64, | 666,65, | 666,66, | 666,67, | 666,68, | 666,69, | 666,70, | 666,71, | 666,72, | 666,73, | 666,74, | 666,75, | 666,76, | 666,77, | 666,78, | 666,79, | 666,80, | 666,81, | 666,82, | 666,83, | 666,84, | 666,85, | 667,1, | 667,2, | 667,3, | 667,4, | 667,5, | 667,6, | 667,7, | 667,8, | 667,9, | 667,10, | 667,11, | 667,12, | 667,13, | 667,14, | 667,15, | 667,16, | 667,17, | 667,18, | 667,19, | 667,20, | 667,21, | 667,22, | 667,23, | 667,24, | 667,25, | 667,26, | 667,27, | 667,28, | 667,29, | 667,30, | 667,31, | 667,32, | 667,33, | 667,34, | 667,35, | 667,36, | 667,37, | 667,38, | 667,39, | 667,40, | 667,41, | 667,42, | 667,43, | 667,44, | 667,45, | 667,46, | 667,47, | 667,48, | 667,49, | 667,50, | 667,51, | 667,52, | 667,53, | 667,54, | 667,55, | 667,56, | 667,57, | 667,58, | 667,59, | 667,60, | 667,61, | 667,62, | 667,63, | 667,64, | 667,65, | 667,66, | 667,67, | 667,68, | 667,69, | 667,70, | 667,71, | 667,72, | 667,73, | 667,74, | 667,75, | 667,76, | 667,77, | 667,78, | 667,79, | 667,80, | 667,81, | 667,82, | 667,83, | 667,84, | 667,85, | 668,1, | 668,2, | 668,3, | 668,4, | 668,5, | 668,6, | 668,7, | 668,8, | 668,9, | 668,10, | 668,11, | 668,12, | 668,13, | 668,14, | 668,15, | 668,16, | 668,17, | 668,18, | 668,19, | 668,20, | 668,21, | 668,22, | 668,23, | 668,24, | 668,25, | 668,26, | 668,27, | 668,28, | 668,29, | 668,30, | 668,31, | 668,32, | 668,33, | 668,34, | 668,35, | 668,36, | 668,37, | 668,38, | 668,39, | 668,40, | 668,41, | 668,42, | 668,43, | 668,44, | 668,45, | 668,46, | 668,47, | 668,48, | 668,49, | 668,50, | 668,51, | 668,52, | 668,53, | 668,54, | 668,55, | 668,56, | 668,57, | 668,58, | 668,59, | 668,60, | 668,61, | 668,62, | 668,63, | 668,64, | 668,65, | 668,66, | 668,67, | 668,68, | 668,69, | 668,70, | 668,71, | 668,72, | 668,73, | 668,74, | 668,75, | 668,76, | 668,77, | 668,78, | 668,79, | 668,80, | 668,81, | 668,82, | 668,83, | 668,84, | 668,85, | 669,1, | 669,2, | 669,3, | 669,4, | 669,5, | 669,6, | 669,7, | 669,8, | 669,9, | 669,10, | 669,11, | 669,12, | 669,13, | 669,14, | 669,15, | 669,16, | 669,17, | 669,18, | 669,19, | 669,20, | 669,21, | 669,22, | 669,23, | 669,24, | 669,25, | 669,26, | 669,27, | 669,28, | 669,29, | 669,30, | 669,31, | 669,32, | 669,33, | 669,34, | 669,35, | 669,36, | 669,37, | 669,38, | 669,39, | 669,40, | 669,41, | 669,42, | 669,43, | 669,44, | 669,45, | 669,46, | 669,47, | 669,48, | 669,49, | 669,50, | 669,51, | 669,52, | 669,53, | 669,54, | 669,55, | 669,56, | 669,57, | 669,58, | 669,59, | 669,60, | 669,61, | 669,62, | 669,63, | 669,64, | 669,65, | 669,66, | 669,67, | 669,68, | 669,69, | 669,70, | 669,71, | 669,72, | 669,73, | 669,74, | 669,75, | 669,76, | 669,77, | 669,78, | 669,79, | 669,80, | 669,81, | 669,82, | 669,83, | 669,84, | 669,85, | 670,1, | 670,2, | 670,3, | 670,4, | 670,5, | 670,6, | 670,7, | 670,8, | 670,9, | 670,10, | 670,11, | 670,12, | 670,13, | 670,14, | 670,15, | 670,16, | 670,17, | 670,18, | 670,19, | 670,20, | 670,21, | 670,22, | 670,23, | 670,24, | 670,25, | 670,26, | 670,27, | 670,28, | 670,29, | 670,30, | 670,31, | 670,32, | 670,33, | 670,34, | 670,35, | 670,36, | 670,37, | 670,38, | 670,39, | 670,40, | 670,41, | 670,42, | 670,43, | 670,44, | 670,45, | 670,46, | 670,47, | 670,48, | 670,49, | 670,50, | 670,51, | 670,52, | 670,53, | 670,54, | 670,55, | 670,56, | 670,57, | 670,58, | 670,59, | 670,60, | 670,61, | 670,62, | 670,63, | 670,64, | 670,65, | 670,66, | 670,67, | 670,68, | 670,69, | 670,70, | 670,71, | 670,72, | 670,73, | 670,74, | 670,75, | 670,76, | 670,77, | 670,78, | 670,79, | 670,80, | 670,81, | 670,82, | 670,83, | 670,84, | 670,85, | 671,1, | 671,2, | 671,3, | 671,4, | 671,5, | 671,6, | 671,7, | 671,8, | 671,9, | 671,10, | 671,11, | 671,12, | 671,13, | 671,14, | 671,15, | 671,16, | 671,17, | 671,18, | 671,19, | 671,20, | 671,21, | 671,22, | 671,23, | 671,24, | 671,25, | 671,26, | 671,27, | 671,28, | 671,29, | 671,30, | 671,31, | 671,32, | 671,33, | 671,34, | 671,35, | 671,36, | 671,37, | 671,38, | 671,39, | 671,40, | 671,41, | 671,42, | 671,43, | 671,44, | 671,45, | 671,46, | 671,47, | 671,48, | 671,49, | 671,50, | 671,51, | 671,52, | 671,53, | 671,54, | 671,55, | 671,56, | 671,57, | 671,58, | 671,59, | 671,60, | 671,61, | 671,62, | 671,63, | 671,64, | 671,65, | 671,66, | 671,67, | 671,68, | 671,69, | 671,70, | 671,71, | 671,72, | 671,73, | 671,74, | 671,75, | 671,76, | 671,77, | 671,78, | 671,79, | 671,80, | 671,81, | 671,82, | 671,83, | 671,84, | 671,85, | 672,1, | 672,2, | 672,3, | 672,4, | 672,5, | 672,6, | 672,7, | 672,8, | 672,9, | 672,10, | 672,11, | 672,12, | 672,13, | 672,14, | 672,15, | 672,16, | 672,17, | 672,18, | 672,19, | 672,20, | 672,21, | 672,22, | 672,23, | 672,24, | 672,25, | 672,26, | 672,27, | 672,28, | 672,29, | 672,30, | 672,31, | 672,32, | 672,33, | 672,34, | 672,35, | 672,36, | 672,37, | 672,38, | 672,39, | 672,40, | 672,41, | 672,42, | 672,43, | 672,44, | 672,45, | 672,46, | 672,47, | 672,48, | 672,49, | 672,50, | 672,51, | 672,52, | 672,53, | 672,54, | 672,55, | 672,56, | 672,57, | 672,58, | 672,59, | 672,60, | 672,61, | 672,62, | 672,63, | 672,64, | 672,65, | 672,66, | 672,67, | 672,68, | 672,69, | 672,70, | 672,71, | 672,72, | 672,73, | 672,74, | 672,75, | 672,76, | 672,77, | 672,78, | 672,79, | 672,80, | 672,81, | 672,82, | 672,83, | 672,84, | 672,85, | 673,1, | 673,2, | 673,3, | 673,4, | 673,5, | 673,6, | 673,7, | 673,8, | 673,9, | 673,10, | 673,11, | 673,12, | 673,13, | 673,14, | 673,15, | 673,16, | 673,17, | 673,18, | 673,19, | 673,20, | 673,21, | 673,22, | 673,23, | 673,24, | 673,25, | 673,26, | 673,27, | 673,28, | 673,29, | 673,30, | 673,31, | 673,32, | 673,33, | 673,34, | 673,35, | 673,36, | 673,37, | 673,38, | 673,39, | 673,40, | 673,41, | 673,42, | 673,43, | 673,44, | 673,45, | 673,46, | 673,47, | 673,48, | 673,49, | 673,50, | 673,51, | 673,52, | 673,53, | 673,54, | 673,55, | 673,56, | 673,57, | 673,58, | 673,59, | 673,60, | 673,61, | 673,62, | 673,63, | 673,64, | 673,65, | 673,66, | 673,67, | 673,68, | 673,69, | 673,70, | 673,71, | 673,72, | 673,73, | 673,74, | 673,75, | 673,76, | 673,77, | 673,78, | 673,79, | 673,80, | 673,81, | 673,82, | 673,83, | 673,84, | 673,85, | 674,1, | 674,2, | 674,3, | 674,4, | 674,5, | 674,6, | 674,7, | 674,8, | 674,9, | 674,10, | 674,11, | 674,12, | 674,13, | 674,14, | 674,15, | 674,16, | 674,17, | 674,18, | 674,19, | 674,20, | 674,21, | 674,22, | 674,23, | 674,24, | 674,25, | 674,26, | 674,27, | 674,28, | 674,29, | 674,30, | 674,31, | 674,32, | 674,33, | 674,34, | 674,35, | 674,36, | 674,37, | 674,38, | 674,39, | 674,40, | 674,41, | 674,42, | 674,43, | 674,44, | 674,45, | 674,46, | 674,47, | 674,48, | 674,49, | 674,50, | 674,51, | 674,52, | 674,53, | 674,54, | 674,55, | 674,56, | 674,57, | 674,58, | 674,59, | 674,60, | 674,61, | 674,62, | 674,63, | 674,64, | 674,65, | 674,66, | 674,67, | 674,68, | 674,69, | 674,70, | 674,71, | 674,72, | 674,73, | 674,74, | 674,75, | 674,76, | 674,77, | 674,78, | 674,79, | 674,80, | 674,81, | 674,82, | 674,83, | 674,84, | 674,85, | 675,1, | 675,2, | 675,3, | 675,4, | 675,5, | 675,6, | 675,7, | 675,8, | 675,9, | 675,10, | 675,11, | 675,12, | 675,13, | 675,14, | 675,15, | 675,16, | 675,17, | 675,18, | 675,19, | 675,20, | 675,21, | 675,22, | 675,23, | 675,24, | 675,25, | 675,26, | 675,27, | 675,28, | 675,29, | 675,30, | 675,31, | 675,32, | 675,33, | 675,34, | 675,35, | 675,36, | 675,37, | 675,38, | 675,39, | 675,40, | 675,41, | 675,42, | 675,43, | 675,44, | 675,45, | 675,46, | 675,47, | 675,48, | 675,49, | 675,50, | 675,51, | 675,52, | 675,53, | 675,54, | 675,55, | 675,56, | 675,57, | 675,58, | 675,59, | 675,60, | 675,61, | 675,62, | 675,63, | 675,64, | 675,65, | 675,66, | 675,67, | 675,68, | 675,69, | 675,70, | 675,71, | 675,72, | 675,73, | 675,74, | 675,75, | 675,76, | 675,77, | 675,78, | 675,79, | 675,80, | 675,81, | 675,82, | 675,83, | 675,84, | 675,85, | 676,1, | 676,2, | 676,3, | 676,4, | 676,5, | 676,6, | 676,7, | 676,8, | 676,9, | 676,10, | 676,11, | 676,12, | 676,13, | 676,14, | 676,15, | 676,16, | 676,17, | 676,18, | 676,19, | 676,20, | 676,21, | 676,22, | 676,23, | 676,24, | 676,25, | 676,26, | 676,27, | 676,28, | 676,29, | 676,30, | 676,31, | 676,32, | 676,33, | 676,34, | 676,35, | 676,36, | 676,37, | 676,38, | 676,39, | 676,40, | 676,41, | 676,42, | 676,43, | 676,44, | 676,45, | 676,46, | 676,47, | 676,48, | 676,49, | 676,50, | 676,51, | 676,52, | 676,53, | 676,54, | 676,55, | 676,56, | 676,57, | 676,58, | 676,59, | 676,60, | 676,61, | 676,62, | 676,63, | 676,64, | 676,65, | 676,66, | 676,67, | 676,68, | 676,69, | 676,70, | 676,71, | 676,72, | 676,73, | 676,74, | 676,75, | 676,76, | 676,77, | 676,78, | 676,79, | 676,80, | 676,81, | 676,82, | 676,83, | 676,84, | 676,85, | 677,1, | 677,2, | 677,3, | 677,4, | 677,5, | 677,6, | 677,7, | 677,8, | 677,9, | 677,10, | 677,11, | 677,12, | 677,13, | 677,14, | 677,15, | 677,16, | 677,17, | 677,18, | 677,19, | 677,20, | 677,21, | 677,22, | 677,23, | 677,24, | 677,25, | 677,26, | 677,27, | 677,28, | 677,29, | 677,30, | 677,31, | 677,32, | 677,33, | 677,34, | 677,35, | 677,36, | 677,37, | 677,38, | 677,39, | 677,40, | 677,41, | 677,42, | 677,43, | 677,44, | 677,45, | 677,46, | 677,47, | 677,48, | 677,49, | 677,50, | 677,51, | 677,52, | 677,53, | 677,54, | 677,55, | 677,56, | 677,57, | 677,58, | 677,59, | 677,60, | 677,61, | 677,62, | 677,63, | 677,64, | 677,65, | 677,66, | 677,67, | 677,68, | 677,69, | 677,70, | 677,71, | 677,72, | 677,73, | 677,74, | 677,75, | 677,76, | 677,77, | 677,78, | 677,79, | 677,80, | 677,81, | 677,82, | 677,83, | 677,84, | 677,85, | 678,1, | 678,2, | 678,3, | 678,4, | 678,5, | 678,6, | 678,7, | 678,8, | 678,9, | 678,10, | 678,11, | 678,12, | 678,13, | 678,14, | 678,15, | 678,16, | 678,17, | 678,18, | 678,19, | 678,20, | 678,21, | 678,22, | 678,23, | 678,24, | 678,25, | 678,26, | 678,27, | 678,28, | 678,29, | 678,30, | 678,31, | 678,32, | 678,33, | 678,34, | 678,35, | 678,36, | 678,37, | 678,38, | 678,39, | 678,40, | 678,41, | 678,42, | 678,43, | 678,44, | 678,45, | 678,46, | 678,47, | 678,48, | 678,49, | 678,50, | 678,51, | 678,52, | 678,53, | 678,54, | 678,55, | 678,56, | 678,57, | 678,58, | 678,59, | 678,60, | 678,61, | 678,62, | 678,63, | 678,64, | 678,65, | 678,66, | 678,67, | 678,68, | 678,69, | 678,70, | 678,71, | 678,72, | 678,73, | 678,74, | 678,75, | 678,76, | 678,77, | 678,78, | 678,79, | 678,80, | 678,81, | 678,82, | 678,83, | 678,84, | 678,85, | 679,1, | 679,2, | 679,3, | 679,4, | 679,5, | 679,6, | 679,7, | 679,8, | 679,9, | 679,10, | 679,11, | 679,12, | 679,13, | 679,14, | 679,15, | 679,16, | 679,17, | 679,18, | 679,19, | 679,20, | 679,21, | 679,22, | 679,23, | 679,24, | 679,25, | 679,26, | 679,27, | 679,28, | 679,29, | 679,30, | 679,31, | 679,32, | 679,33, | 679,34, | 679,35, | 679,36, | 679,37, | 679,38, | 679,39, | 679,40, | 679,41, | 679,42, | 679,43, | 679,44, | 679,45, | 679,46, | 679,47, | 679,48, | 679,49, | 679,50, | 679,51, | 679,52, | 679,53, | 679,54, | 679,55, | 679,56, | 679,57, | 679,58, | 679,59, | 679,60, | 679,61, | 679,62, | 679,63, | 679,64, | 679,65, | 679,66, | 679,67, | 679,68, | 679,69, | 679,70, | 679,71, | 679,72, | 679,73, | 679,74, | 679,75, | 679,76, | 679,77, | 679,78, | 679,79, | 679,80, | 679,81, | 679,82, | 679,83, | 679,84, | 679,85, | 680,1, | 680,2, | 680,3, | 680,4, | 680,5, | 680,6, | 680,7, | 680,8, | 680,9, | 680,10, | 680,11, | 680,12, | 680,13, | 680,14, | 680,15, | 680,16, | 680,17, | 680,18, | 680,19, | 680,20, | 680,21, | 680,22, | 680,23, | 680,24, | 680,25, | 680,26, | 680,27, | 680,28, | 680,29, | 680,30, | 680,31, | 680,32, | 680,33, | 680,34, | 680,35, | 680,36, | 680,37, | 680,38, | 680,39, | 680,40, | 680,41, | 680,42, | 680,43, | 680,44, | 680,45, | 680,46, | 680,47, | 680,48, | 680,49, | 680,50, | 680,51, | 680,52, | 680,53, | 680,54, | 680,55, | 680,56, | 680,57, | 680,58, | 680,59, | 680,60, | 680,61, | 680,62, | 680,63, | 680,64, | 680,65, | 680,66, | 680,67, | 680,68, | 680,69, | 680,70, | 680,71, | 680,72, | 680,73, | 680,74, | 680,75, | 680,76, | 680,77, | 680,78, | 680,79, | 680,80, | 680,81, | 680,82, | 680,83, | 680,84, | 680,85, | 681,1, | 681,2, | 681,3, | 681,4, | 681,5, | 681,6, | 681,7, | 681,8, | 681,9, | 681,10, | 681,11, | 681,12, | 681,13, | 681,14, | 681,15, | 681,16, | 681,17, | 681,18, | 681,19, | 681,20, | 681,21, | 681,22, | 681,23, | 681,24, | 681,25, | 681,26, | 681,27, | 681,28, | 681,29, | 681,30, | 681,31, | 681,32, | 681,33, | 681,34, | 681,35, | 681,36, | 681,37, | 681,38, | 681,39, | 681,40, | 681,41, | 681,42, | 681,43, | 681,44, | 681,45, | 681,46, | 681,47, | 681,48, | 681,49, | 681,50, | 681,51, | 681,52, | 681,53, | 681,54, | 681,55, | 681,56, | 681,57, | 681,58, | 681,59, | 681,60, | 681,61, | 681,62, | 681,63, | 681,64, | 681,65, | 681,66, | 681,67, | 681,68, | 681,69, | 681,70, | 681,71, | 681,72, | 681,73, | 681,74, | 681,75, | 681,76, | 681,77, | 681,78, | 681,79, | 681,80, | 681,81, | 681,82, | 681,83, | 681,84, | 681,85, | 682,1, | 682,2, | 682,3, | 682,4, | 682,5, | 682,6, | 682,7, | 682,8, | 682,9, | 682,10, | 682,11, | 682,12, | 682,13, | 682,14, | 682,15, | 682,16, | 682,17, | 682,18, | 682,19, | 682,20, | 682,21, | 682,22, | 682,23, | 682,24, | 682,25, | 682,26, | 682,27, | 682,28, | 682,29, | 682,30, | 682,31, | 682,32, | 682,33, | 682,34, | 682,35, | 682,36, | 682,37, | 682,38, | 682,39, | 682,40, | 682,41, | 682,42, | 682,43, | 682,44, | 682,45, | 682,46, | 682,47, | 682,48, | 682,49, | 682,50, | 682,51, | 682,52, | 682,53, | 682,54, | 682,55, | 682,56, | 682,57, | 682,58, | 682,59, | 682,60, | 682,61, | 682,62, | 682,63, | 682,64, | 682,65, | 682,66, | 682,67, | 682,68, | 682,69, | 682,70, | 682,71, | 682,72, | 682,73, | 682,74, | 682,75, | 682,76, | 682,77, | 682,78, | 682,79, | 682,80, | 682,81, | 682,82, | 682,83, | 682,84, | 682,85, | 683,1, | 683,2, | 683,3, | 683,4, | 683,5, | 683,6, | 683,7, | 683,8, | 683,9, | 683,10, | 683,11, | 683,12, | 683,13, | 683,14, | 683,15, | 683,16, | 683,17, | 683,18, | 683,19, | 683,20, | 683,21, | 683,22, | 683,23, | 683,24, | 683,25, | 683,26, | 683,27, | 683,28, | 683,29, | 683,30, | 683,31, | 683,32, | 683,33, | 683,34, | 683,35, | 683,36, | 683,37, | 683,38, | 683,39, | 683,40, | 683,41, | 683,42, | 683,43, | 683,44, | 683,45, | 683,46, | 683,47, | 683,48, | 683,49, | 683,50, | 683,51, | 683,52, | 683,53, | 683,54, | 683,55, | 683,56, | 683,57, | 683,58, | 683,59, | 683,60, | 683,61, | 683,62, | 683,63, | 683,64, | 683,65, | 683,66, | 683,67, | 683,68, | 683,69, | 683,70, | 683,71, | 683,72, | 683,73, | 683,74, | 683,75, | 683,76, | 683,77, | 683,78, | 683,79, | 683,80, | 683,81, | 683,82, | 683,83, | 683,84, | 683,85, | 684,1, | 684,2, | 684,3, | 684,4, | 684,5, | 684,6, | 684,7, | 684,8, | 684,9, | 684,10, | 684,11, | 684,12, | 684,13, | 684,14, | 684,15, | 684,16, | 684,17, | 684,18, | 684,19, | 684,20, | 684,21, | 684,22, | 684,23, | 684,24, | 684,25, | 684,26, | 684,27, | 684,28, | 684,29, | 684,30, | 684,31, | 684,32, | 684,33, | 684,34, | 684,35, | 684,36, | 684,37, | 684,38, | 684,39, | 684,40, | 684,41, | 684,42, | 684,43, | 684,44, | 684,45, | 684,46, | 684,47, | 684,48, | 684,49, | 684,50, | 684,51, | 684,52, | 684,53, | 684,54, | 684,55, | 684,56, | 684,57, | 684,58, | 684,59, | 684,60, | 684,61, | 684,62, | 684,63, | 684,64, | 684,65, | 684,66, | 684,67, | 684,68, | 684,69, | 684,70, | 684,71, | 684,72, | 684,73, | 684,74, | 684,75, | 684,76, | 684,77, | 684,78, | 684,79, | 684,80, | 684,81, | 684,82, | 684,83, | 684,84, | 684,85, | 685,1, | 685,2, | 685,3, | 685,4, | 685,5, | 685,6, | 685,7, | 685,8, | 685,9, | 685,10, | 685,11, | 685,12, | 685,13, | 685,14, | 685,15, | 685,16, | 685,17, | 685,18, | 685,19, | 685,20, | 685,21, | 685,22, | 685,23, | 685,24, | 685,25, | 685,26, | 685,27, | 685,28, | 685,29, | 685,30, | 685,31, | 685,32, | 685,33, | 685,34, | 685,35, | 685,36, | 685,37, | 685,38, | 685,39, | 685,40, | 685,41, | 685,42, | 685,43, | 685,44, | 685,45, | 685,46, | 685,47, | 685,48, | 685,49, | 685,50, | 685,51, | 685,52, | 685,53, | 685,54, | 685,55, | 685,56, | 685,57, | 685,58, | 685,59, | 685,60, | 685,61, | 685,62, | 685,63, | 685,64, | 685,65, | 685,66, | 685,67, | 685,68, | 685,69, | 685,70, | 685,71, | 685,72, | 685,73, | 685,74, | 685,75, | 685,76, | 685,77, | 685,78, | 685,79, | 685,80, | 685,81, | 685,82, | 685,83, | 685,84, | 685,85, | 686,1, | 686,2, | 686,3, | 686,4, | 686,5, | 686,6, | 686,7, | 686,8, | 686,9, | 686,10, | 686,11, | 686,12, | 686,13, | 686,14, | 686,15, | 686,16, | 686,17, | 686,18, | 686,19, | 686,20, | 686,21, | 686,22, | 686,23, | 686,24, | 686,25, | 686,26, | 686,27, | 686,28, | 686,29, | 686,30, | 686,31, | 686,32, | 686,33, | 686,34, | 686,35, | 686,36, | 686,37, | 686,38, | 686,39, | 686,40, | 686,41, | 686,42, | 686,43, | 686,44, | 686,45, | 686,46, | 686,47, | 686,48, | 686,49, | 686,50, | 686,51, | 686,52, | 686,53, | 686,54, | 686,55, | 686,56, | 686,57, | 686,58, | 686,59, | 686,60, | 686,61, | 686,62, | 686,63, | 686,64, | 686,65, | 686,66, | 686,67, | 686,68, | 686,69, | 686,70, | 686,71, | 686,72, | 686,73, | 686,74, | 686,75, | 686,76, | 686,77, | 686,78, | 686,79, | 686,80, | 686,81, | 686,82, | 686,83, | 686,84, | 686,85, | 687,1, | 687,2, | 687,3, | 687,4, | 687,5, | 687,6, | 687,7, | 687,8, | 687,9, | 687,10, | 687,11, | 687,12, | 687,13, | 687,14, | 687,15, | 687,16, | 687,17, | 687,18, | 687,19, | 687,20, | 687,21, | 687,22, | 687,23, | 687,24, | 687,25, | 687,26, | 687,27, | 687,28, | 687,29, | 687,30, | 687,31, | 687,32, | 687,33, | 687,34, | 687,35, | 687,36, | 687,37, | 687,38, | 687,39, | 687,40, | 687,41, | 687,42, | 687,43, | 687,44, | 687,45, | 687,46, | 687,47, | 687,48, | 687,49, | 687,50, | 687,51, | 687,52, | 687,53, | 687,54, | 687,55, | 687,56, | 687,57, | 687,58, | 687,59, | 687,60, | 687,61, | 687,62, | 687,63, | 687,64, | 687,65, | 687,66, | 687,67, | 687,68, | 687,69, | 687,70, | 687,71, | 687,72, | 687,73, | 687,74, | 687,75, | 687,76, | 687,77, | 687,78, | 687,79, | 687,80, | 687,81, | 687,82, | 687,83, | 687,84, | 687,85, | 688,1, | 688,2, | 688,3, | 688,4, | 688,5, | 688,6, | 688,7, | 688,8, | 688,9, | 688,10, | 688,11, | 688,12, | 688,13, | 688,14, | 688,15, | 688,16, | 688,17, | 688,18, | 688,19, | 688,20, | 688,21, | 688,22, | 688,23, | 688,24, | 688,25, | 688,26, | 688,27, | 688,28, | 688,29, | 688,30, | 688,31, | 688,32, | 688,33, | 688,34, | 688,35, | 688,36, | 688,37, | 688,38, | 688,39, | 688,40, | 688,41, | 688,42, | 688,43, | 688,44, | 688,45, | 688,46, | 688,47, | 688,48, | 688,49, | 688,50, | 688,51, | 688,52, | 688,53, | 688,54, | 688,55, | 688,56, | 688,57, | 688,58, | 688,59, | 688,60, | 688,61, | 688,62, | 688,63, | 688,64, | 688,65, | 688,66, | 688,67, | 688,68, | 688,69, | 688,70, | 688,71, | 688,72, | 688,73, | 688,74, | 688,75, | 688,76, | 688,77, | 688,78, | 688,79, | 688,80, | 688,81, | 688,82, | 688,83, | 688,84, | 688,85, | 689,1, | 689,2, | 689,3, | 689,4, | 689,5, | 689,6, | 689,7, | 689,8, | 689,9, | 689,10, | 689,11, | 689,12, | 689,13, | 689,14, | 689,15, | 689,16, | 689,17, | 689,18, | 689,19, | 689,20, | 689,21, | 689,22, | 689,23, | 689,24, | 689,25, | 689,26, | 689,27, | 689,28, | 689,29, | 689,30, | 689,31, | 689,32, | 689,33, | 689,34, | 689,35, | 689,36, | 689,37, | 689,38, | 689,39, | 689,40, | 689,41, | 689,42, | 689,43, | 689,44, | 689,45, | 689,46, | 689,47, | 689,48, | 689,49, | 689,50, | 689,51, | 689,52, | 689,53, | 689,54, | 689,55, | 689,56, | 689,57, | 689,58, | 689,59, | 689,60, | 689,61, | 689,62, | 689,63, | 689,64, | 689,65, | 689,66, | 689,67, | 689,68, | 689,69, | 689,70, | 689,71, | 689,72, | 689,73, | 689,74, | 689,75, | 689,76, | 689,77, | 689,78, | 689,79, | 689,80, | 689,81, | 689,82, | 689,83, | 689,84, | 689,85, | 690,1, | 690,2, | 690,3, | 690,4, | 690,5, | 690,6, | 690,7, | 690,8, | 690,9, | 690,10, | 690,11, | 690,12, | 690,13, | 690,14, | 690,15, | 690,16, | 690,17, | 690,18, | 690,19, | 690,20, | 690,21, | 690,22, | 690,23, | 690,24, | 690,25, | 690,26, | 690,27, | 690,28, | 690,29, | 690,30, | 690,31, | 690,32, | 690,33, | 690,34, | 690,35, | 690,36, | 690,37, | 690,38, | 690,39, | 690,40, | 690,41, | 690,42, | 690,43, | 690,44, | 690,45, | 690,46, | 690,47, | 690,48, | 690,49, | 690,50, | 690,51, | 690,52, | 690,53, | 690,54, | 690,55, | 690,56, | 690,57, | 690,58, | 690,59, | 690,60, | 690,61, | 690,62, | 690,63, | 690,64, | 690,65, | 690,66, | 690,67, | 690,68, | 690,69, | 690,70, | 690,71, | 690,72, | 690,73, | 690,74, | 690,75, | 690,76, | 690,77, | 690,78, | 690,79, | 690,80, | 690,81, | 690,82, | 690,83, | 690,84, | 690,85, | 691,1, | 691,2, | 691,3, | 691,4, | 691,5, | 691,6, | 691,7, | 691,8, | 691,9, | 691,10, | 691,11, | 691,12, | 691,13, | 691,14, | 691,15, | 691,16, | 691,17, | 691,18, | 691,19, | 691,20, | 691,21, | 691,22, | 691,23, | 691,24, | 691,25, | 691,26, | 691,27, | 691,28, | 691,29, | 691,30, | 691,31, | 691,32, | 691,33, | 691,34, | 691,35, | 691,36, | 691,37, | 691,38, | 691,39, | 691,40, | 691,41, | 691,42, | 691,43, | 691,44, | 691,45, | 691,46, | 691,47, | 691,48, | 691,49, | 691,50, | 691,51, | 691,52, | 691,53, | 691,54, | 691,55, | 691,56, | 691,57, | 691,58, | 691,59, | 691,60, | 691,61, | 691,62, | 691,63, | 691,64, | 691,65, | 691,66, | 691,67, | 691,68, | 691,69, | 691,70, | 691,71, | 691,72, | 691,73, | 691,74, | 691,75, | 691,76, | 691,77, | 691,78, | 691,79, | 691,80, | 691,81, | 691,82, | 691,83, | 691,84, | 691,85, | 692,1, | 692,2, | 692,3, | 692,4, | 692,5, | 692,6, | 692,7, | 692,8, | 692,9, | 692,10, | 692,11, | 692,12, | 692,13, | 692,14, | 692,15, | 692,16, | 692,17, | 692,18, | 692,19, | 692,20, | 692,21, | 692,22, | 692,23, | 692,24, | 692,25, | 692,26, | 692,27, | 692,28, | 692,29, | 692,30, | 692,31, | 692,32, | 692,33, | 692,34, | 692,35, | 692,36, | 692,37, | 692,38, | 692,39, | 692,40, | 692,41, | 692,42, | 692,43, | 692,44, | 692,45, | 692,46, | 692,47, | 692,48, | 692,49, | 692,50, | 692,51, | 692,52, | 692,53, | 692,54, | 692,55, | 692,56, | 692,57, | 692,58, | 692,59, | 692,60, | 692,61, | 692,62, | 692,63, | 692,64, | 692,65, | 692,66, | 692,67, | 692,68, | 692,69, | 692,70, | 692,71, | 692,72, | 692,73, | 692,74, | 692,75, | 692,76, | 692,77, | 692,78, | 692,79, | 692,80, | 692,81, | 692,82, | 692,83, | 692,84, | 692,85, | 693,1, | 693,2, | 693,3, | 693,4, | 693,5, | 693,6, | 693,7, | 693,8, | 693,9, | 693,10, | 693,11, | 693,12, | 693,13, | 693,14, | 693,15, | 693,16, | 693,17, | 693,18, | 693,19, | 693,20, | 693,21, | 693,22, | 693,23, | 693,24, | 693,25, | 693,26, | 693,27, | 693,28, | 693,29, | 693,30, | 693,31, | 693,32, | 693,33, | 693,34, | 693,35, | 693,36, | 693,37, | 693,38, | 693,39, | 693,40, | 693,41, | 693,42, | 693,43, | 693,44, | 693,45, | 693,46, | 693,47, | 693,48, | 693,49, | 693,50, | 693,51, | 693,52, | 693,53, | 693,54, | 693,55, | 693,56, | 693,57, | 693,58, | 693,59, | 693,60, | 693,61, | 693,62, | 693,63, | 693,64, | 693,65, | 693,66, | 693,67, | 693,68, | 693,69, | 693,70, | 693,71, | 693,72, | 693,73, | 693,74, | 693,75, | 693,76, | 693,77, | 693,78, | 693,79, | 693,80, | 693,81, | 693,82, | 693,83, | 693,84, | 693,85, | 694,1, | 694,2, | 694,3, | 694,4, | 694,5, | 694,6, | 694,7, | 694,8, | 694,9, | 694,10, | 694,11, | 694,12, | 694,13, | 694,14, | 694,15, | 694,16, | 694,17, | 694,18, | 694,19, | 694,20, | 694,21, | 694,22, | 694,23, | 694,24, | 694,25, | 694,26, | 694,27, | 694,28, | 694,29, | 694,30, | 694,31, | 694,32, | 694,33, | 694,34, | 694,35, | 694,36, | 694,37, | 694,38, | 694,39, | 694,40, | 694,41, | 694,42, | 694,43, | 694,44, | 694,45, | 694,46, | 694,47, | 694,48, | 694,49, | 694,50, | 694,51, | 694,52, | 694,53, | 694,54, | 694,55, | 694,56, | 694,57, | 694,58, | 694,59, | 694,60, | 694,61, | 694,62, | 694,63, | 694,64, | 694,65, | 694,66, | 694,67, | 694,68, | 694,69, | 694,70, | 694,71, | 694,72, | 694,73, | 694,74, | 694,75, | 694,76, | 694,77, | 694,78, | 694,79, | 694,80, | 694,81, | 694,82, | 694,83, | 694,84, | 694,85, | 695,1, | 695,2, | 695,3, | 695,4, | 695,5, | 695,6, | 695,7, | 695,8, | 695,9, | 695,10, | 695,11, | 695,12, | 695,13, | 695,14, | 695,15, | 695,16, | 695,17, | 695,18, | 695,19, | 695,20, | 695,21, | 695,22, | 695,23, | 695,24, | 695,25, | 695,26, | 695,27, | 695,28, | 695,29, | 695,30, | 695,31, | 695,32, | 695,33, | 695,34, | 695,35, | 695,36, | 695,37, | 695,38, | 695,39, | 695,40, | 695,41, | 695,42, | 695,43, | 695,44, | 695,45, | 695,46, | 695,47, | 695,48, | 695,49, | 695,50, | 695,51, | 695,52, | 695,53, | 695,54, | 695,55, | 695,56, | 695,57, | 695,58, | 695,59, | 695,60, | 695,61, | 695,62, | 695,63, | 695,64, | 695,65, | 695,66, | 695,67, | 695,68, | 695,69, | 695,70, | 695,71, | 695,72, | 695,73, | 695,74, | 695,75, | 695,76, | 695,77, | 695,78, | 695,79, | 695,80, | 695,81, | 695,82, | 695,83, | 695,84, | 695,85, | 696,1, | 696,2, | 696,3, | 696,4, | 696,5, | 696,6, | 696,7, | 696,8, | 696,9, | 696,10, | 696,11, | 696,12, | 696,13, | 696,14, | 696,15, | 696,16, | 696,17, | 696,18, | 696,19, | 696,20, | 696,21, | 696,22, | 696,23, | 696,24, | 696,25, | 696,26, | 696,27, | 696,28, | 696,29, | 696,30, | 696,31, | 696,32, | 696,33, | 696,34, | 696,35, | 696,36, | 696,37, | 696,38, | 696,39, | 696,40, | 696,41, | 696,42, | 696,43, | 696,44, | 696,45, | 696,46, | 696,47, | 696,48, | 696,49, | 696,50, | 696,51, | 696,52, | 696,53, | 696,54, | 696,55, | 696,56, | 696,57, | 696,58, | 696,59, | 696,60, | 696,61, | 696,62, | 696,63, | 696,64, | 696,65, | 696,66, | 696,67, | 696,68, | 696,69, | 696,70, | 696,71, | 696,72, | 696,73, | 696,74, | 696,75, | 696,76, | 696,77, | 696,78, | 696,79, | 696,80, | 696,81, | 696,82, | 696,83, | 696,84, | 696,85, | 697,1, | 697,2, | 697,3, | 697,4, | 697,5, | 697,6, | 697,7, | 697,8, | 697,9, | 697,10, | 697,11, | 697,12, | 697,13, | 697,14, | 697,15, | 697,16, | 697,17, | 697,18, | 697,19, | 697,20, | 697,21, | 697,22, | 697,23, | 697,24, | 697,25, | 697,26, | 697,27, | 697,28, | 697,29, | 697,30, | 697,31, | 697,32, | 697,33, | 697,34, | 697,35, | 697,36, | 697,37, | 697,38, | 697,39, | 697,40, | 697,41, | 697,42, | 697,43, | 697,44, | 697,45, | 697,46, | 697,47, | 697,48, | 697,49, | 697,50, | 697,51, | 697,52, | 697,53, | 697,54, | 697,55, | 697,56, | 697,57, | 697,58, | 697,59, | 697,60, | 697,61, | 697,62, | 697,63, | 697,64, | 697,65, | 697,66, | 697,67, | 697,68, | 697,69, | 697,70, | 697,71, | 697,72, | 697,73, | 697,74, | 697,75, | 697,76, | 697,77, | 697,78, | 697,79, | 697,80, | 697,81, | 697,82, | 697,83, | 697,84, | 697,85, | 698,1, | 698,2, | 698,3, | 698,4, | 698,5, | 698,6, | 698,7, | 698,8, | 698,9, | 698,10, | 698,11, | 698,12, | 698,13, | 698,14, | 698,15, | 698,16, | 698,17, | 698,18, | 698,19, | 698,20, | 698,21, | 698,22, | 698,23, | 698,24, | 698,25, | 698,26, | 698,27, | 698,28, | 698,29, | 698,30, | 698,31, | 698,32, | 698,33, | 698,34, | 698,35, | 698,36, | 698,37, | 698,38, | 698,39, | 698,40, | 698,41, | 698,42, | 698,43, | 698,44, | 698,45, | 698,46, | 698,47, | 698,48, | 698,49, | 698,50, | 698,51, | 698,52, | 698,53, | 698,54, | 698,55, | 698,56, | 698,57, | 698,58, | 698,59, | 698,60, | 698,61, | 698,62, | 698,63, | 698,64, | 698,65, | 698,66, | 698,67, | 698,68, | 698,69, | 698,70, | 698,71, | 698,72, | 698,73, | 698,74, | 698,75, | 698,76, | 698,77, | 698,78, | 698,79, | 698,80, | 698,81, | 698,82, | 698,83, | 698,84, | 698,85, | 699,1, | 699,2, | 699,3, | 699,4, | 699,5, | 699,6, | 699,7, | 699,8, | 699,9, | 699,10, | 699,11, | 699,12, | 699,13, | 699,14, | 699,15, | 699,16, | 699,17, | 699,18, | 699,19, | 699,20, | 699,21, | 699,22, | 699,23, | 699,24, | 699,25, | 699,26, | 699,27, | 699,28, | 699,29, | 699,30, | 699,31, | 699,32, | 699,33, | 699,34, | 699,35, | 699,36, | 699,37, | 699,38, | 699,39, | 699,40, | 699,41, | 699,42, | 699,43, | 699,44, | 699,45, | 699,46, | 699,47, | 699,48, | 699,49, | 699,50, | 699,51, | 699,52, | 699,53, | 699,54, | 699,55, | 699,56, | 699,57, | 699,58, | 699,59, | 699,60, | 699,61, | 699,62, | 699,63, | 699,64, | 699,65, | 699,66, | 699,67, | 699,68, | 699,69, | 699,70, | 699,71, | 699,72, | 699,73, | 699,74, | 699,75, | 699,76, | 699,77, | 699,78, | 699,79, | 699,80, | 699,81, | 699,82, | 699,83, | 699,84, | 699,85, | 700,1, | 700,2, | 700,3, | 700,4, | 700,5, | 700,6, | 700,7, | 700,8, | 700,9, | 700,10, | 700,11, | 700,12, | 700,13, | 700,14, | 700,15, | 700,16, | 700,17, | 700,18, | 700,19, | 700,20, | 700,21, | 700,22, | 700,23, | 700,24, | 700,25, | 700,26, | 700,27, | 700,28, | 700,29, | 700,30, | 700,31, | 700,32, | 700,33, | 700,34, | 700,35, | 700,36, | 700,37, | 700,38, | 700,39, | 700,40, | 700,41, | 700,42, | 700,43, | 700,44, | 700,45, | 700,46, | 700,47, | 700,48, | 700,49, | 700,50, | 700,51, | 700,52, | 700,53, | 700,54, | 700,55, | 700,56, | 700,57, | 700,58, | 700,59, | 700,60, | 700,61, | 700,62, | 700,63, | 700,64, | 700,65, | 700,66, | 700,67, | 700,68, | 700,69, | 700,70, | 700,71, | 700,72, | 700,73, | 700,74, | 700,75, | 700,76, | 700,77, | 700,78, | 700,79, | 700,80, | 700,81, | 700,82, | 700,83, | 700,84, | 700,85, | 701,1, | 701,2, | 701,3, | 701,4, | 701,5, | 701,6, | 701,7, | 701,8, | 701,9, | 701,10, | 701,11, | 701,12, | 701,13, | 701,14, | 701,15, | 701,16, | 701,17, | 701,18, | 701,19, | 701,20, | 701,21, | 701,22, | 701,23, | 701,24, | 701,25, | 701,26, | 701,27, | 701,28, | 701,29, | 701,30, | 701,31, | 701,32, | 701,33, | 701,34, | 701,35, | 701,36, | 701,37, | 701,38, | 701,39, | 701,40, | 701,41, | 701,42, | 701,43, | 701,44, | 701,45, | 701,46, | 701,47, | 701,48, | 701,49, | 701,50, | 701,51, | 701,52, | 701,53, | 701,54, | 701,55, | 701,56, | 701,57, | 701,58, | 701,59, | 701,60, | 701,61, | 701,62, | 701,63, | 701,64, | 701,65, | 701,66, | 701,67, | 701,68, | 701,69, | 701,70, | 701,71, | 701,72, | 701,73, | 701,74, | 701,75, | 701,76, | 701,77, | 701,78, | 701,79, | 701,80, | 701,81, | 701,82, | 701,83, | 701,84, | 701,85, | 702,1, | 702,2, | 702,3, | 702,4, | 702,5, | 702,6, | 702,7, | 702,8, | 702,9, | 702,10, | 702,11, | 702,12, | 702,13, | 702,14, | 702,15, | 702,16, | 702,17, | 702,18, | 702,19, | 702,20, | 702,21, | 702,22, | 702,23, | 702,24, | 702,25, | 702,26, | 702,27, | 702,28, | 702,29, | 702,30, | 702,31, | 702,32, | 702,33, | 702,34, | 702,35, | 702,36, | 702,37, | 702,38, | 702,39, | 702,40, | 702,41, | 702,42, | 702,43, | 702,44, | 702,45, | 702,46, | 702,47, | 702,48, | 702,49, | 702,50, | 702,51, | 702,52, | 702,53, | 702,54, | 702,55, | 702,56, | 702,57, | 702,58, | 702,59, | 702,60, | 702,61, | 702,62, | 702,63, | 702,64, | 702,65, | 702,66, | 702,67, | 702,68, | 702,69, | 702,70, | 702,71, | 702,72, | 702,73, | 702,74, | 702,75, | 702,76, | 702,77, | 702,78, | 702,79, | 702,80, | 702,81, | 702,82, | 702,83, | 702,84, | 702,85, | 703,1, | 703,2, | 703,3, | 703,4, | 703,5, | 703,6, | 703,7, | 703,8, | 703,9, | 703,10, | 703,11, | 703,12, | 703,13, | 703,14, | 703,15, | 703,16, | 703,17, | 703,18, | 703,19, | 703,20, | 703,21, | 703,22, | 703,23, | 703,24, | 703,25, | 703,26, | 703,27, | 703,28, | 703,29, | 703,30, | 703,31, | 703,32, | 703,33, | 703,34, | 703,35, | 703,36, | 703,37, | 703,38, | 703,39, | 703,40, | 703,41, | 703,42, | 703,43, | 703,44, | 703,45, | 703,46, | 703,47, | 703,48, | 703,49, | 703,50, | 703,51, | 703,52, | 703,53, | 703,54, | 703,55, | 703,56, | 703,57, | 703,58, | 703,59, | 703,60, | 703,61, | 703,62, | 703,63, | 703,64, | 703,65, | 703,66, | 703,67, | 703,68, | 703,69, | 703,70, | 703,71, | 703,72, | 703,73, | 703,74, | 703,75, | 703,76, | 703,77, | 703,78, | 703,79, | 703,80, | 703,81, | 703,82, | 703,83, | 703,84, | 703,85, | 704,1, | 704,2, | 704,3, | 704,4, | 704,5, | 704,6, | 704,7, | 704,8, | 704,9, | 704,10, | 704,11, | 704,12, | 704,13, | 704,14, | 704,15, | 704,16, | 704,17, | 704,18, | 704,19, | 704,20, | 704,21, | 704,22, | 704,23, | 704,24, | 704,25, | 704,26, | 704,27, | 704,28, | 704,29, | 704,30, | 704,31, | 704,32, | 704,33, | 704,34, | 704,35, | 704,36, | 704,37, | 704,38, | 704,39, | 704,40, | 704,41, | 704,42, | 704,43, | 704,44, | 704,45, | 704,46, | 704,47, | 704,48, | 704,49, | 704,50, | 704,51, | 704,52, | 704,53, | 704,54, | 704,55, | 704,56, | 704,57, | 704,58, | 704,59, | 704,60, | 704,61, | 704,62, | 704,63, | 704,64, | 704,65, | 704,66, | 704,67, | 704,68, | 704,69, | 704,70, | 704,71, | 704,72, | 704,73, | 704,74, | 704,75, | 704,76, | 704,77, | 704,78, | 704,79, | 704,80, | 704,81, | 704,82, | 704,83, | 704,84, | 704,85, | 705,1, | 705,2, | 705,3, | 705,4, | 705,5, | 705,6, | 705,7, | 705,8, | 705,9, | 705,10, | 705,11, | 705,12, | 705,13, | 705,14, | 705,15, | 705,16, | 705,17, | 705,18, | 705,19, | 705,20, | 705,21, | 705,22, | 705,23, | 705,24, | 705,25, | 705,26, | 705,27, | 705,28, | 705,29, | 705,30, | 705,31, | 705,32, | 705,33, | 705,34, | 705,35, | 705,36, | 705,37, | 705,38, | 705,39, | 705,40, | 705,41, | 705,42, | 705,43, | 705,44, | 705,45, | 705,46, | 705,47, | 705,48, | 705,49, | 705,50, | 705,51, | 705,52, | 705,53, | 705,54, | 705,55, | 705,56, | 705,57, | 705,58, | 705,59, | 705,60, | 705,61, | 705,62, | 705,63, | 705,64, | 705,65, | 705,66, | 705,67, | 705,68, | 705,69, | 705,70, | 705,71, | 705,72, | 705,73, | 705,74, | 705,75, | 705,76, | 705,77, | 705,78, | 705,79, | 705,80, | 705,81, | 705,82, | 705,83, | 705,84, | 705,85, | 706,1, | 706,2, | 706,3, | 706,4, | 706,5, | 706,6, | 706,7, | 706,8, | 706,9, | 706,10, | 706,11, | 706,12, | 706,13, | 706,14, | 706,15, | 706,16, | 706,17, | 706,18, | 706,19, | 706,20, | 706,21, | 706,22, | 706,23, | 706,24, | 706,25, | 706,26, | 706,27, | 706,28, | 706,29, | 706,30, | 706,31, | 706,32, | 706,33, | 706,34, | 706,35, | 706,36, | 706,37, | 706,38, | 706,39, | 706,40, | 706,41, | 706,42, | 706,43, | 706,44, | 706,45, | 706,46, | 706,47, | 706,48, | 706,49, | 706,50, | 706,51, | 706,52, | 706,53, | 706,54, | 706,55, | 706,56, | 706,57, | 706,58, | 706,59, | 706,60, | 706,61, | 706,62, | 706,63, | 706,64, | 706,65, | 706,66, | 706,67, | 706,68, | 706,69, | 706,70, | 706,71, | 706,72, | 706,73, | 706,74, | 706,75, | 706,76, | 706,77, | 706,78, | 706,79, | 706,80, | 706,81, | 706,82, | 706,83, | 706,84, | 706,85, | 707,1, | 707,2, | 707,3, | 707,4, | 707,5, | 707,6, | 707,7, | 707,8, | 707,9, | 707,10, | 707,11, | 707,12, | 707,13, | 707,14, | 707,15, | 707,16, | 707,17, | 707,18, | 707,19, | 707,20, | 707,21, | 707,22, | 707,23, | 707,24, | 707,25, | 707,26, | 707,27, | 707,28, | 707,29, | 707,30, | 707,31, | 707,32, | 707,33, | 707,34, | 707,35, | 707,36, | 707,37, | 707,38, | 707,39, | 707,40, | 707,41, | 707,42, | 707,43, | 707,44, | 707,45, | 707,46, | 707,47, | 707,48, | 707,49, | 707,50, | 707,51, | 707,52, | 707,53, | 707,54, | 707,55, | 707,56, | 707,57, | 707,58, | 707,59, | 707,60, | 707,61, | 707,62, | 707,63, | 707,64, | 707,65, | 707,66, | 707,67, | 707,68, | 707,69, | 707,70, | 707,71, | 707,72, | 707,73, | 707,74, | 707,75, | 707,76, | 707,77, | 707,78, | 707,79, | 707,80, | 707,81, | 707,82, | 707,83, | 707,84, | 707,85, | 708,1, | 708,2, | 708,3, | 708,4, | 708,5, | 708,6, | 708,7, | 708,8, | 708,9, | 708,10, | 708,11, | 708,12, | 708,13, | 708,14, | 708,15, | 708,16, | 708,17, | 708,18, | 708,19, | 708,20, | 708,21, | 708,22, | 708,23, | 708,24, | 708,25, | 708,26, | 708,27, | 708,28, | 708,29, | 708,30, | 708,31, | 708,32, | 708,33, | 708,34, | 708,35, | 708,36, | 708,37, | 708,38, | 708,39, | 708,40, | 708,41, | 708,42, | 708,43, | 708,44, | 708,45, | 708,46, | 708,47, | 708,48, | 708,49, | 708,50, | 708,51, | 708,52, | 708,53, | 708,54, | 708,55, | 708,56, | 708,57, | 708,58, | 708,59, | 708,60, | 708,61, | 708,62, | 708,63, | 708,64, | 708,65, | 708,66, | 708,67, | 708,68, | 708,69, | 708,70, | 708,71, | 708,72, | 708,73, | 708,74, | 708,75, | 708,76, | 708,77, | 708,78, | 708,79, | 708,80, | 708,81, | 708,82, | 708,83, | 708,84, | 708,85, | 709,1, | 709,2, | 709,3, | 709,4, | 709,5, | 709,6, | 709,7, | 709,8, | 709,9, | 709,10, | 709,11, | 709,12, | 709,13, | 709,14, | 709,15, | 709,16, | 709,17, | 709,18, | 709,19, | 709,20, | 709,21, | 709,22, | 709,23, | 709,24, | 709,25, | 709,26, | 709,27, | 709,28, | 709,29, | 709,30, | 709,31, | 709,32, | 709,33, | 709,34, | 709,35, | 709,36, | 709,37, | 709,38, | 709,39, | 709,40, | 709,41, | 709,42, | 709,43, | 709,44, | 709,45, | 709,46, | 709,47, | 709,48, | 709,49, | 709,50, | 709,51, | 709,52, | 709,53, | 709,54, | 709,55, | 709,56, | 709,57, | 709,58, | 709,59, | 709,60, | 709,61, | 709,62, | 709,63, | 709,64, | 709,65, | 709,66, | 709,67, | 709,68, | 709,69, | 709,70, | 709,71, | 709,72, | 709,73, | 709,74, | 709,75, | 709,76, | 709,77, | 709,78, | 709,79, | 709,80, | 709,81, | 709,82, | 709,83, | 709,84, | 709,85, | 710,1, | 710,2, | 710,3, | 710,4, | 710,5, | 710,6, | 710,7, | 710,8, | 710,9, | 710,10, | 710,11, | 710,12, | 710,13, | 710,14, | 710,15, | 710,16, | 710,17, | 710,18, | 710,19, | 710,20, | 710,21, | 710,22, | 710,23, | 710,24, | 710,25, | 710,26, | 710,27, | 710,28, | 710,29, | 710,30, | 710,31, | 710,32, | 710,33, | 710,34, | 710,35, | 710,36, | 710,37, | 710,38, | 710,39, | 710,40, | 710,41, | 710,42, | 710,43, | 710,44, | 710,45, | 710,46, | 710,47, | 710,48, | 710,49, | 710,50, | 710,51, | 710,52, | 710,53, | 710,54, | 710,55, | 710,56, | 710,57, | 710,58, | 710,59, | 710,60, | 710,61, | 710,62, | 710,63, | 710,64, | 710,65, | 710,66, | 710,67, | 710,68, | 710,69, | 710,70, | 710,71, | 710,72, | 710,73, | 710,74, | 710,75, | 710,76, | 710,77, | 710,78, | 710,79, | 710,80, | 710,81, | 710,82, | 710,83, | 710,84, | 710,85, | 711,1, | 711,2, | 711,3, | 711,4, | 711,5, | 711,6, | 711,7, | 711,8, | 711,9, | 711,10, | 711,11, | 711,12, | 711,13, | 711,14, | 711,15, | 711,16, | 711,17, | 711,18, | 711,19, | 711,20, | 711,21, | 711,22, | 711,23, | 711,24, | 711,25, | 711,26, | 711,27, | 711,28, | 711,29, | 711,30, | 711,31, | 711,32, | 711,33, | 711,34, | 711,35, | 711,36, | 711,37, | 711,38, | 711,39, | 711,40, | 711,41, | 711,42, | 711,43, | 711,44, | 711,45, | 711,46, | 711,47, | 711,48, | 711,49, | 711,50, | 711,51, | 711,52, | 711,53, | 711,54, | 711,55, | 711,56, | 711,57, | 711,58, | 711,59, | 711,60, | 711,61, | 711,62, | 711,63, | 711,64, | 711,65, | 711,66, | 711,67, | 711,68, | 711,69, | 711,70, | 711,71, | 711,72, | 711,73, | 711,74, | 711,75, | 711,76, | 711,77, | 711,78, | 711,79, | 711,80, | 711,81, | 711,82, | 711,83, | 711,84, | 711,85, | 712,1, | 712,2, | 712,3, | 712,4, | 712,5, | 712,6, | 712,7, | 712,8, | 712,9, | 712,10, | 712,11, | 712,12, | 712,13, | 712,14, | 712,15, | 712,16, | 712,17, | 712,18, | 712,19, | 712,20, | 712,21, | 712,22, | 712,23, | 712,24, | 712,25, | 712,26, | 712,27, | 712,28, | 712,29, | 712,30, | 712,31, | 712,32, | 712,33, | 712,34, | 712,35, | 712,36, | 712,37, | 712,38, | 712,39, | 712,40, | 712,41, | 712,42, | 712,43, | 712,44, | 712,45, | 712,46, | 712,47, | 712,48, | 712,49, | 712,50, | 712,51, | 712,52, | 712,53, | 712,54, | 712,55, | 712,56, | 712,57, | 712,58, | 712,59, | 712,60, | 712,61, | 712,62, | 712,63, | 712,64, | 712,65, | 712,66, | 712,67, | 712,68, | 712,69, | 712,70, | 712,71, | 712,72, | 712,73, | 712,74, | 712,75, | 712,76, | 712,77, | 712,78, | 712,79, | 712,80, | 712,81, | 712,82, | 712,83, | 712,84, | 712,85, | 713,1, | 713,2, | 713,3, | 713,4, | 713,5, | 713,6, | 713,7, | 713,8, | 713,9, | 713,10, | 713,11, | 713,12, | 713,13, | 713,14, | 713,15, | 713,16, | 713,17, | 713,18, | 713,19, | 713,20, | 713,21, | 713,22, | 713,23, | 713,24, | 713,25, | 713,26, | 713,27, | 713,28, | 713,29, | 713,30, | 713,31, | 713,32, | 713,33, | 713,34, | 713,35, | 713,36, | 713,37, | 713,38, | 713,39, | 713,40, | 713,41, | 713,42, | 713,43, | 713,44, | 713,45, | 713,46, | 713,47, | 713,48, | 713,49, | 713,50, | 713,51, | 713,52, | 713,53, | 713,54, | 713,55, | 713,56, | 713,57, | 713,58, | 713,59, | 713,60, | 713,61, | 713,62, | 713,63, | 713,64, | 713,65, | 713,66, | 713,67, | 713,68, | 713,69, | 713,70, | 713,71, | 713,72, | 713,73, | 713,74, | 713,75, | 713,76, | 713,77, | 713,78, | 713,79, | 713,80, | 713,81, | 713,82, | 713,83, | 713,84, | 713,85, | 714,1, | 714,2, | 714,3, | 714,4, | 714,5, | 714,6, | 714,7, | 714,8, | 714,9, | 714,10, | 714,11, | 714,12, | 714,13, | 714,14, | 714,15, | 714,16, | 714,17, | 714,18, | 714,19, | 714,20, | 714,21, | 714,22, | 714,23, | 714,24, | 714,25, | 714,26, | 714,27, | 714,28, | 714,29, | 714,30, | 714,31, | 714,32, | 714,33, | 714,34, | 714,35, | 714,36, | 714,37, | 714,38, | 714,39, | 714,40, | 714,41, | 714,42, | 714,43, | 714,44, | 714,45, | 714,46, | 714,47, | 714,48, | 714,49, | 714,50, | 714,51, | 714,52, | 714,53, | 714,54, | 714,55, | 714,56, | 714,57, | 714,58, | 714,59, | 714,60, | 714,61, | 714,62, | 714,63, | 714,64, | 714,65, | 714,66, | 714,67, | 714,68, | 714,69, | 714,70, | 714,71, | 714,72, | 714,73, | 714,74, | 714,75, | 714,76, | 714,77, | 714,78, | 714,79, | 714,80, | 714,81, | 714,82, | 714,83, | 714,84, | 714,85, | 715,1, | 715,2, | 715,3, | 715,4, | 715,5, | 715,6, | 715,7, | 715,8, | 715,9, | 715,10, | 715,11, | 715,12, | 715,13, | 715,14, | 715,15, | 715,16, | 715,17, | 715,18, | 715,19, | 715,20, | 715,21, | 715,22, | 715,23, | 715,24, | 715,25, | 715,26, | 715,27, | 715,28, | 715,29, | 715,30, | 715,31, | 715,32, | 715,33, | 715,34, | 715,35, | 715,36, | 715,37, | 715,38, | 715,39, | 715,40, | 715,41, | 715,42, | 715,43, | 715,44, | 715,45, | 715,46, | 715,47, | 715,48, | 715,49, | 715,50, | 715,51, | 715,52, | 715,53, | 715,54, | 715,55, | 715,56, | 715,57, | 715,58, | 715,59, | 715,60, | 715,61, | 715,62, | 715,63, | 715,64, | 715,65, | 715,66, | 715,67, | 715,68, | 715,69, | 715,70, | 715,71, | 715,72, | 715,73, | 715,74, | 715,75, | 715,76, | 715,77, | 715,78, | 715,79, | 715,80, | 715,81, | 715,82, | 715,83, | 715,84, | 715,85, | 716,1, | 716,2, | 716,3, | 716,4, | 716,5, | 716,6, | 716,7, | 716,8, | 716,9, | 716,10, | 716,11, | 716,12, | 716,13, | 716,14, | 716,15, | 716,16, | 716,17, | 716,18, | 716,19, | 716,20, | 716,21, | 716,22, | 716,23, | 716,24, | 716,25, | 716,26, | 716,27, | 716,28, | 716,29, | 716,30, | 716,31, | 716,32, | 716,33, | 716,34, | 716,35, | 716,36, | 716,37, | 716,38, | 716,39, | 716,40, | 716,41, | 716,42, | 716,43, | 716,44, | 716,45, | 716,46, | 716,47, | 716,48, | 716,49, | 716,50, | 716,51, | 716,52, | 716,53, | 716,54, | 716,55, | 716,56, | 716,57, | 716,58, | 716,59, | 716,60, | 716,61, | 716,62, | 716,63, | 716,64, | 716,65, | 716,66, | 716,67, | 716,68, | 716,69, | 716,70, | 716,71, | 716,72, | 716,73, | 716,74, | 716,75, | 716,76, | 716,77, | 716,78, | 716,79, | 716,80, | 716,81, | 716,82, | 716,83, | 716,84, | 716,85, | 717,1, | 717,2, | 717,3, | 717,4, | 717,5, | 717,6, | 717,7, | 717,8, | 717,9, | 717,10, | 717,11, | 717,12, | 717,13, | 717,14, | 717,15, | 717,16, | 717,17, | 717,18, | 717,19, | 717,20, | 717,21, | 717,22, | 717,23, | 717,24, | 717,25, | 717,26, | 717,27, | 717,28, | 717,29, | 717,30, | 717,31, | 717,32, | 717,33, | 717,34, | 717,35, | 717,36, | 717,37, | 717,38, | 717,39, | 717,40, | 717,41, | 717,42, | 717,43, | 717,44, | 717,45, | 717,46, | 717,47, | 717,48, | 717,49, | 717,50, | 717,51, | 717,52, | 717,53, | 717,54, | 717,55, | 717,56, | 717,57, | 717,58, | 717,59, | 717,60, | 717,61, | 717,62, | 717,63, | 717,64, | 717,65, | 717,66, | 717,67, | 717,68, | 717,69, | 717,70, | 717,71, | 717,72, | 717,73, | 717,74, | 717,75, | 717,76, | 717,77, | 717,78, | 717,79, | 717,80, | 717,81, | 717,82, | 717,83, | 717,84, | 717,85, | 718,1, | 718,2, | 718,3, | 718,4, | 718,5, | 718,6, | 718,7, | 718,8, | 718,9, | 718,10, | 718,11, | 718,12, | 718,13, | 718,14, | 718,15, | 718,16, | 718,17, | 718,18, | 718,19, | 718,20, | 718,21, | 718,22, | 718,23, | 718,24, | 718,25, | 718,26, | 718,27, | 718,28, | 718,29, | 718,30, | 718,31, | 718,32, | 718,33, | 718,34, | 718,35, | 718,36, | 718,37, | 718,38, | 718,39, | 718,40, | 718,41, | 718,42, | 718,43, | 718,44, | 718,45, | 718,46, | 718,47, | 718,48, | 718,49, | 718,50, | 718,51, | 718,52, | 718,53, | 718,54, | 718,55, | 718,56, | 718,57, | 718,58, | 718,59, | 718,60, | 718,61, | 718,62, | 718,63, | 718,64, | 718,65, | 718,66, | 718,67, | 718,68, | 718,69, | 718,70, | 718,71, | 718,72, | 718,73, | 718,74, | 718,75, | 718,76, | 718,77, | 718,78, | 718,79, | 718,80, | 718,81, | 718,82, | 718,83, | 718,84, | 718,85, | 719,1, | 719,2, | 719,3, | 719,4, | 719,5, | 719,6, | 719,7, | 719,8, | 719,9, | 719,10, | 719,11, | 719,12, | 719,13, | 719,14, | 719,15, | 719,16, | 719,17, | 719,18, | 719,19, | 719,20, | 719,21, | 719,22, | 719,23, | 719,24, | 719,25, | 719,26, | 719,27, | 719,28, | 719,29, | 719,30, | 719,31, | 719,32, | 719,33, | 719,34, | 719,35, | 719,36, | 719,37, | 719,38, | 719,39, | 719,40, | 719,41, | 719,42, | 719,43, | 719,44, | 719,45, | 719,46, | 719,47, | 719,48, | 719,49, | 719,50, | 719,51, | 719,52, | 719,53, | 719,54, | 719,55, | 719,56, | 719,57, | 719,58, | 719,59, | 719,60, | 719,61, | 719,62, | 719,63, | 719,64, | 719,65, | 719,66, | 719,67, | 719,68, | 719,69, | 719,70, | 719,71, | 719,72, | 719,73, | 719,74, | 719,75, | 719,76, | 719,77, | 719,78, | 719,79, | 719,80, | 719,81, | 719,82, | 719,83, | 719,84, | 719,85, | 720,1, | 720,2, | 720,3, | 720,4, | 720,5, | 720,6, | 720,7, | 720,8, | 720,9, | 720,10, | 720,11, | 720,12, | 720,13, | 720,14, | 720,15, | 720,16, | 720,17, | 720,18, | 720,19, | 720,20, | 720,21, | 720,22, | 720,23, | 720,24, | 720,25, | 720,26, | 720,27, | 720,28, | 720,29, | 720,30, | 720,31, | 720,32, | 720,33, | 720,34, | 720,35, | 720,36, | 720,37, | 720,38, | 720,39, | 720,40, | 720,41, | 720,42, | 720,43, | 720,44, | 720,45, | 720,46, | 720,47, | 720,48, | 720,49, | 720,50, | 720,51, | 720,52, | 720,53, | 720,54, | 720,55, | 720,56, | 720,57, | 720,58, | 720,59, | 720,60, | 720,61, | 720,62, | 720,63, | 720,64, | 720,65, | 720,66, | 720,67, | 720,68, | 720,69, | 720,70, | 720,71, | 720,72, | 720,73, | 720,74, | 720,75, | 720,76, | 720,77, | 720,78, | 720,79, | 720,80, | 720,81, | 720,82, | 720,83, | 720,84, | 720,85, | 721,1, | 721,2, | 721,3, | 721,4, | 721,5, | 721,6, | 721,7, | 721,8, | 721,9, | 721,10, | 721,11, | 721,12, | 721,13, | 721,14, | 721,15, | 721,16, | 721,17, | 721,18, | 721,19, | 721,20, | 721,21, | 721,22, | 721,23, | 721,24, | 721,25, | 721,26, | 721,27, | 721,28, | 721,29, | 721,30, | 721,31, | 721,32, | 721,33, | 721,34, | 721,35, | 721,36, | 721,37, | 721,38, | 721,39, | 721,40, | 721,41, | 721,42, | 721,43, | 721,44, | 721,45, | 721,46, | 721,47, | 721,48, | 721,49, | 721,50, | 721,51, | 721,52, | 721,53, | 721,54, | 721,55, | 721,56, | 721,57, | 721,58, | 721,59, | 721,60, | 721,61, | 721,62, | 721,63, | 721,64, | 721,65, | 721,66, | 721,67, | 721,68, | 721,69, | 721,70, | 721,71, | 721,72, | 721,73, | 721,74, | 721,75, | 721,76, | 721,77, | 721,78, | 721,79, | 721,80, | 721,81, | 721,82, | 721,83, | 721,84, | 721,85, | 722,1, | 722,2, | 722,3, | 722,4, | 722,5, | 722,6, | 722,7, | 722,8, | 722,9, | 722,10, | 722,11, | 722,12, | 722,13, | 722,14, | 722,15, | 722,16, | 722,17, | 722,18, | 722,19, | 722,20, | 722,21, | 722,22, | 722,23, | 722,24, | 722,25, | 722,26, | 722,27, | 722,28, | 722,29, | 722,30, | 722,31, | 722,32, | 722,33, | 722,34, | 722,35, | 722,36, | 722,37, | 722,38, | 722,39, | 722,40, | 722,41, | 722,42, | 722,43, | 722,44, | 722,45, | 722,46, | 722,47, | 722,48, | 722,49, | 722,50, | 722,51, | 722,52, | 722,53, | 722,54, | 722,55, | 722,56, | 722,57, | 722,58, | 722,59, | 722,60, | 722,61, | 722,62, | 722,63, | 722,64, | 722,65, | 722,66, | 722,67, | 722,68, | 722,69, | 722,70, | 722,71, | 722,72, | 722,73, | 722,74, | 722,75, | 722,76, | 722,77, | 722,78, | 722,79, | 722,80, | 722,81, | 722,82, | 722,83, | 722,84, | 722,85, | 723,1, | 723,2, | 723,3, | 723,4, | 723,5, | 723,6, | 723,7, | 723,8, | 723,9, | 723,10, | 723,11, | 723,12, | 723,13, | 723,14, | 723,15, | 723,16, | 723,17, | 723,18, | 723,19, | 723,20, | 723,21, | 723,22, | 723,23, | 723,24, | 723,25, | 723,26, | 723,27, | 723,28, | 723,29, | 723,30, | 723,31, | 723,32, | 723,33, | 723,34, | 723,35, | 723,36, | 723,37, | 723,38, | 723,39, | 723,40, | 723,41, | 723,42, | 723,43, | 723,44, | 723,45, | 723,46, | 723,47, | 723,48, | 723,49, | 723,50, | 723,51, | 723,52, | 723,53, | 723,54, | 723,55, | 723,56, | 723,57, | 723,58, | 723,59, | 723,60, | 723,61, | 723,62, | 723,63, | 723,64, | 723,65, | 723,66, | 723,67, | 723,68, | 723,69, | 723,70, | 723,71, | 723,72, | 723,73, | 723,74, | 723,75, | 723,76, | 723,77, | 723,78, | 723,79, | 723,80, | 723,81, | 723,82, | 723,83, | 723,84, | 723,85, | 724,1, | 724,2, | 724,3, | 724,4, | 724,5, | 724,6, | 724,7, | 724,8, | 724,9, | 724,10, | 724,11, | 724,12, | 724,13, | 724,14, | 724,15, | 724,16, | 724,17, | 724,18, | 724,19, | 724,20, | 724,21, | 724,22, | 724,23, | 724,24, | 724,25, | 724,26, | 724,27, | 724,28, | 724,29, | 724,30, | 724,31, | 724,32, | 724,33, | 724,34, | 724,35, | 724,36, | 724,37, | 724,38, | 724,39, | 724,40, | 724,41, | 724,42, | 724,43, | 724,44, | 724,45, | 724,46, | 724,47, | 724,48, | 724,49, | 724,50, | 724,51, | 724,52, | 724,53, | 724,54, | 724,55, | 724,56, | 724,57, | 724,58, | 724,59, | 724,60, | 724,61, | 724,62, | 724,63, | 724,64, | 724,65, | 724,66, | 724,67, | 724,68, | 724,69, | 724,70, | 724,71, | 724,72, | 724,73, | 724,74, | 724,75, | 724,76, | 724,77, | 724,78, | 724,79, | 724,80, | 724,81, | 724,82, | 724,83, | 724,84, | 724,85, | 725,1, | 725,2, | 725,3, | 725,4, | 725,5, | 725,6, | 725,7, | 725,8, | 725,9, | 725,10, | 725,11, | 725,12, | 725,13, | 725,14, | 725,15, | 725,16, | 725,17, | 725,18, | 725,19, | 725,20, | 725,21, | 725,22, | 725,23, | 725,24, | 725,25, | 725,26, | 725,27, | 725,28, | 725,29, | 725,30, | 725,31, | 725,32, | 725,33, | 725,34, | 725,35, | 725,36, | 725,37, | 725,38, | 725,39, | 725,40, | 725,41, | 725,42, | 725,43, | 725,44, | 725,45, | 725,46, | 725,47, | 725,48, | 725,49, | 725,50, | 725,51, | 725,52, | 725,53, | 725,54, | 725,55, | 725,56, | 725,57, | 725,58, | 725,59, | 725,60, | 725,61, | 725,62, | 725,63, | 725,64, | 725,65, | 725,66, | 725,67, | 725,68, | 725,69, | 725,70, | 725,71, | 725,72, | 725,73, | 725,74, | 725,75, | 725,76, | 725,77, | 725,78, | 725,79, | 725,80, | 725,81, | 725,82, | 725,83, | 725,84, | 725,85, | 726,1, | 726,2, | 726,3, | 726,4, | 726,5, | 726,6, | 726,7, | 726,8, | 726,9, | 726,10, | 726,11, | 726,12, | 726,13, | 726,14, | 726,15, | 726,16, | 726,17, | 726,18, | 726,19, | 726,20, | 726,21, | 726,22, | 726,23, | 726,24, | 726,25, | 726,26, | 726,27, | 726,28, | 726,29, | 726,30, | 726,31, | 726,32, | 726,33, | 726,34, | 726,35, | 726,36, | 726,37, | 726,38, | 726,39, | 726,40, | 726,41, | 726,42, | 726,43, | 726,44, | 726,45, | 726,46, | 726,47, | 726,48, | 726,49, | 726,50, | 726,51, | 726,52, | 726,53, | 726,54, | 726,55, | 726,56, | 726,57, | 726,58, | 726,59, | 726,60, | 726,61, | 726,62, | 726,63, | 726,64, | 726,65, | 726,66, | 726,67, | 726,68, | 726,69, | 726,70, | 726,71, | 726,72, | 726,73, | 726,74, | 726,75, | 726,76, | 726,77, | 726,78, | 726,79, | 726,80, | 726,81, | 726,82, | 726,83, | 726,84, | 726,85, | 727,1, | 727,2, | 727,3, | 727,4, | 727,5, | 727,6, | 727,7, | 727,8, | 727,9, | 727,10, | 727,11, | 727,12, | 727,13, | 727,14, | 727,15, | 727,16, | 727,17, | 727,18, | 727,19, | 727,20, | 727,21, | 727,22, | 727,23, | 727,24, | 727,25, | 727,26, | 727,27, | 727,28, | 727,29, | 727,30, | 727,31, | 727,32, | 727,33, | 727,34, | 727,35, | 727,36, | 727,37, | 727,38, | 727,39, | 727,40, | 727,41, | 727,42, | 727,43, | 727,44, | 727,45, | 727,46, | 727,47, | 727,48, | 727,49, | 727,50, | 727,51, | 727,52, | 727,53, | 727,54, | 727,55, | 727,56, | 727,57, | 727,58, | 727,59, | 727,60, | 727,61, | 727,62, | 727,63, | 727,64, | 727,65, | 727,66, | 727,67, | 727,68, | 727,69, | 727,70, | 727,71, | 727,72, | 727,73, | 727,74, | 727,75, | 727,76, | 727,77, | 727,78, | 727,79, | 727,80, | 727,81, | 727,82, | 727,83, | 727,84, | 727,85, | 728,1, | 728,2, | 728,3, | 728,4, | 728,5, | 728,6, | 728,7, | 728,8, | 728,9, | 728,10, | 728,11, | 728,12, | 728,13, | 728,14, | 728,15, | 728,16, | 728,17, | 728,18, | 728,19, | 728,20, | 728,21, | 728,22, | 728,23, | 728,24, | 728,25, | 728,26, | 728,27, | 728,28, | 728,29, | 728,30, | 728,31, | 728,32, | 728,33, | 728,34, | 728,35, | 728,36, | 728,37, | 728,38, | 728,39, | 728,40, | 728,41, | 728,42, | 728,43, | 728,44, | 728,45, | 728,46, | 728,47, | 728,48, | 728,49, | 728,50, | 728,51, | 728,52, | 728,53, | 728,54, | 728,55, | 728,56, | 728,57, | 728,58, | 728,59, | 728,60, | 728,61, | 728,62, | 728,63, | 728,64, | 728,65, | 728,66, | 728,67, | 728,68, | 728,69, | 728,70, | 728,71, | 728,72, | 728,73, | 728,74, | 728,75, | 728,76, | 728,77, | 728,78, | 728,79, | 728,80, | 728,81, | 728,82, | 728,83, | 728,84, | 728,85, | 729,1, | 729,2, | 729,3, | 729,4, | 729,5, | 729,6, | 729,7, | 729,8, | 729,9, | 729,10, | 729,11, | 729,12, | 729,13, | 729,14, | 729,15, | 729,16, | 729,17, | 729,18, | 729,19, | 729,20, | 729,21, | 729,22, | 729,23, | 729,24, | 729,25, | 729,26, | 729,27, | 729,28, | 729,29, | 729,30, | 729,31, | 729,32, | 729,33, | 729,34, | 729,35, | 729,36, | 729,37, | 729,38, | 729,39, | 729,40, | 729,41, | 729,42, | 729,43, | 729,44, | 729,45, | 729,46, | 729,47, | 729,48, | 729,49, | 729,50, | 729,51, | 729,52, | 729,53, | 729,54, | 729,55, | 729,56, | 729,57, | 729,58, | 729,59, | 729,60, | 729,61, | 729,62, | 729,63, | 729,64, | 729,65, | 729,66, | 729,67, | 729,68, | 729,69, | 729,70, | 729,71, | 729,72, | 729,73, | 729,74, | 729,75, | 729,76, | 729,77, | 729,78, | 729,79, | 729,80, | 729,81, | 729,82, | 729,83, | 729,84, | 729,85, | 730,1, | 730,2, | 730,3, | 730,4, | 730,5, | 730,6, | 730,7, | 730,8, | 730,9, | 730,10, | 730,11, | 730,12, | 730,13, | 730,14, | 730,15, | 730,16, | 730,17, | 730,18, | 730,19, | 730,20, | 730,21, | 730,22, | 730,23, | 730,24, | 730,25, | 730,26, | 730,27, | 730,28, | 730,29, | 730,30, | 730,31, | 730,32, | 730,33, | 730,34, | 730,35, | 730,36, | 730,37, | 730,38, | 730,39, | 730,40, | 730,41, | 730,42, | 730,43, | 730,44, | 730,45, | 730,46, | 730,47, | 730,48, | 730,49, | 730,50, | 730,51, | 730,52, | 730,53, | 730,54, | 730,55, | 730,56, | 730,57, | 730,58, | 730,59, | 730,60, | 730,61, | 730,62, | 730,63, | 730,64, | 730,65, | 730,66, | 730,67, | 730,68, | 730,69, | 730,70, | 730,71, | 730,72, | 730,73, | 730,74, | 730,75, | 730,76, | 730,77, | 730,78, | 730,79, | 730,80, | 730,81, | 730,82, | 730,83, | 730,84, | 730,85, | 731,1, | 731,2, | 731,3, | 731,4, | 731,5, | 731,6, | 731,7, | 731,8, | 731,9, | 731,10, | 731,11, | 731,12, | 731,13, | 731,14, | 731,15, | 731,16, | 731,17, | 731,18, | 731,19, | 731,20, | 731,21, | 731,22, | 731,23, | 731,24, | 731,25, | 731,26, | 731,27, | 731,28, | 731,29, | 731,30, | 731,31, | 731,32, | 731,33, | 731,34, | 731,35, | 731,36, | 731,37, | 731,38, | 731,39, | 731,40, | 731,41, | 731,42, | 731,43, | 731,44, | 731,45, | 731,46, | 731,47, | 731,48, | 731,49, | 731,50, | 731,51, | 731,52, | 731,53, | 731,54, | 731,55, | 731,56, | 731,57, | 731,58, | 731,59, | 731,60, | 731,61, | 731,62, | 731,63, | 731,64, | 731,65, | 731,66, | 731,67, | 731,68, | 731,69, | 731,70, | 731,71, | 731,72, | 731,73, | 731,74, | 731,75, | 731,76, | 731,77, | 731,78, | 731,79, | 731,80, | 731,81, | 731,82, | 731,83, | 731,84, | 731,85, | 732,1, | 732,2, | 732,3, | 732,4, | 732,5, | 732,6, | 732,7, | 732,8, | 732,9, | 732,10, | 732,11, | 732,12, | 732,13, | 732,14, | 732,15, | 732,16, | 732,17, | 732,18, | 732,19, | 732,20, | 732,21, | 732,22, | 732,23, | 732,24, | 732,25, | 732,26, | 732,27, | 732,28, | 732,29, | 732,30, | 732,31, | 732,32, | 732,33, | 732,34, | 732,35, | 732,36, | 732,37, | 732,38, | 732,39, | 732,40, | 732,41, | 732,42, | 732,43, | 732,44, | 732,45, | 732,46, | 732,47, | 732,48, | 732,49, | 732,50, | 732,51, | 732,52, | 732,53, | 732,54, | 732,55, | 732,56, | 732,57, | 732,58, | 732,59, | 732,60, | 732,61, | 732,62, | 732,63, | 732,64, | 732,65, | 732,66, | 732,67, | 732,68, | 732,69, | 732,70, | 732,71, | 732,72, | 732,73, | 732,74, | 732,75, | 732,76, | 732,77, | 732,78, | 732,79, | 732,80, | 732,81, | 732,82, | 732,83, | 732,84, | 732,85, | 733,1, | 733,2, | 733,3, | 733,4, | 733,5, | 733,6, | 733,7, | 733,8, | 733,9, | 733,10, | 733,11, | 733,12, | 733,13, | 733,14, | 733,15, | 733,16, | 733,17, | 733,18, | 733,19, | 733,20, | 733,21, | 733,22, | 733,23, | 733,24, | 733,25, | 733,26, | 733,27, | 733,28, | 733,29, | 733,30, | 733,31, | 733,32, | 733,33, | 733,34, | 733,35, | 733,36, | 733,37, | 733,38, | 733,39, | 733,40, | 733,41, | 733,42, | 733,43, | 733,44, | 733,45, | 733,46, | 733,47, | 733,48, | 733,49, | 733,50, | 733,51, | 733,52, | 733,53, | 733,54, | 733,55, | 733,56, | 733,57, | 733,58, | 733,59, | 733,60, | 733,61, | 733,62, | 733,63, | 733,64, | 733,65, | 733,66, | 733,67, | 733,68, | 733,69, | 733,70, | 733,71, | 733,72, | 733,73, | 733,74, | 733,75, | 733,76, | 733,77, | 733,78, | 733,79, | 733,80, | 733,81, | 733,82, | 733,83, | 733,84, | 733,85, | 734,1, | 734,2, | 734,3, | 734,4, | 734,5, | 734,6, | 734,7, | 734,8, | 734,9, | 734,10, | 734,11, | 734,12, | 734,13, | 734,14, | 734,15, | 734,16, | 734,17, | 734,18, | 734,19, | 734,20, | 734,21, | 734,22, | 734,23, | 734,24, | 734,25, | 734,26, | 734,27, | 734,28, | 734,29, | 734,30, | 734,31, | 734,32, | 734,33, | 734,34, | 734,35, | 734,36, | 734,37, | 734,38, | 734,39, | 734,40, | 734,41, | 734,42, | 734,43, | 734,44, | 734,45, | 734,46, | 734,47, | 734,48, | 734,49, | 734,50, | 734,51, | 734,52, | 734,53, | 734,54, | 734,55, | 734,56, | 734,57, | 734,58, | 734,59, | 734,60, | 734,61, | 734,62, | 734,63, | 734,64, | 734,65, | 734,66, | 734,67, | 734,68, | 734,69, | 734,70, | 734,71, | 734,72, | 734,73, | 734,74, | 734,75, | 734,76, | 734,77, | 734,78, | 734,79, | 734,80, | 734,81, | 734,82, | 734,83, | 734,84, | 734,85, | 735,1, | 735,2, | 735,3, | 735,4, | 735,5, | 735,6, | 735,7, | 735,8, | 735,9, | 735,10, | 735,11, | 735,12, | 735,13, | 735,14, | 735,15, | 735,16, | 735,17, | 735,18, | 735,19, | 735,20, | 735,21, | 735,22, | 735,23, | 735,24, | 735,25, | 735,26, | 735,27, | 735,28, | 735,29, | 735,30, | 735,31, | 735,32, | 735,33, | 735,34, | 735,35, | 735,36, | 735,37, | 735,38, | 735,39, | 735,40, | 735,41, | 735,42, | 735,43, | 735,44, | 735,45, | 735,46, | 735,47, | 735,48, | 735,49, | 735,50, | 735,51, | 735,52, | 735,53, | 735,54, | 735,55, | 735,56, | 735,57, | 735,58, | 735,59, | 735,60, | 735,61, | 735,62, | 735,63, | 735,64, | 735,65, | 735,66, | 735,67, | 735,68, | 735,69, | 735,70, | 735,71, | 735,72, | 735,73, | 735,74, | 735,75, | 735,76, | 735,77, | 735,78, | 735,79, | 735,80, | 735,81, | 735,82, | 735,83, | 735,84, | 735,85, | 736,1, | 736,2, | 736,3, | 736,4, | 736,5, | 736,6, | 736,7, | 736,8, | 736,9, | 736,10, | 736,11, | 736,12, | 736,13, | 736,14, | 736,15, | 736,16, | 736,17, | 736,18, | 736,19, | 736,20, | 736,21, | 736,22, | 736,23, | 736,24, | 736,25, | 736,26, | 736,27, | 736,28, | 736,29, | 736,30, | 736,31, | 736,32, | 736,33, | 736,34, | 736,35, | 736,36, | 736,37, | 736,38, | 736,39, | 736,40, | 736,41, | 736,42, | 736,43, | 736,44, | 736,45, | 736,46, | 736,47, | 736,48, | 736,49, | 736,50, | 736,51, | 736,52, | 736,53, | 736,54, | 736,55, | 736,56, | 736,57, | 736,58, | 736,59, | 736,60, | 736,61, | 736,62, | 736,63, | 736,64, | 736,65, | 736,66, | 736,67, | 736,68, | 736,69, | 736,70, | 736,71, | 736,72, | 736,73, | 736,74, | 736,75, | 736,76, | 736,77, | 736,78, | 736,79, | 736,80, | 736,81, | 736,82, | 736,83, | 736,84, | 736,85, | 737,1, | 737,2, | 737,3, | 737,4, | 737,5, | 737,6, | 737,7, | 737,8, | 737,9, | 737,10, | 737,11, | 737,12, | 737,13, | 737,14, | 737,15, | 737,16, | 737,17, | 737,18, | 737,19, | 737,20, | 737,21, | 737,22, | 737,23, | 737,24, | 737,25, | 737,26, | 737,27, | 737,28, | 737,29, | 737,30, | 737,31, | 737,32, | 737,33, | 737,34, | 737,35, | 737,36, | 737,37, | 737,38, | 737,39, | 737,40, | 737,41, | 737,42, | 737,43, | 737,44, | 737,45, | 737,46, | 737,47, | 737,48, | 737,49, | 737,50, | 737,51, | 737,52, | 737,53, | 737,54, | 737,55, | 737,56, | 737,57, | 737,58, | 737,59, | 737,60, | 737,61, | 737,62, | 737,63, | 737,64, | 737,65, | 737,66, | 737,67, | 737,68, | 737,69, | 737,70, | 737,71, | 737,72, | 737,73, | 737,74, | 737,75, | 737,76, | 737,77, | 737,78, | 737,79, | 737,80, | 737,81, | 737,82, | 737,83, | 737,84, | 737,85, | 738,1, | 738,2, | 738,3, | 738,4, | 738,5, | 738,6, | 738,7, | 738,8, | 738,9, | 738,10, | 738,11, | 738,12, | 738,13, | 738,14, | 738,15, | 738,16, | 738,17, | 738,18, | 738,19, | 738,20, | 738,21, | 738,22, | 738,23, | 738,24, | 738,25, | 738,26, | 738,27, | 738,28, | 738,29, | 738,30, | 738,31, | 738,32, | 738,33, | 738,34, | 738,35, | 738,36, | 738,37, | 738,38, | 738,39, | 738,40, | 738,41, | 738,42, | 738,43, | 738,44, | 738,45, | 738,46, | 738,47, | 738,48, | 738,49, | 738,50, | 738,51, | 738,52, | 738,53, | 738,54, | 738,55, | 738,56, | 738,57, | 738,58, | 738,59, | 738,60, | 738,61, | 738,62, | 738,63, | 738,64, | 738,65, | 738,66, | 738,67, | 738,68, | 738,69, | 738,70, | 738,71, | 738,72, | 738,73, | 738,74, | 738,75, | 738,76, | 738,77, | 738,78, | 738,79, | 738,80, | 738,81, | 738,82, | 738,83, | 738,84, | 738,85, | 739,1, | 739,2, | 739,3, | 739,4, | 739,5, | 739,6, | 739,7, | 739,8, | 739,9, | 739,10, | 739,11, | 739,12, | 739,13, | 739,14, | 739,15, | 739,16, | 739,17, | 739,18, | 739,19, | 739,20, | 739,21, | 739,22, | 739,23, | 739,24, | 739,25, | 739,26, | 739,27, | 739,28, | 739,29, | 739,30, | 739,31, | 739,32, | 739,33, | 739,34, | 739,35, | 739,36, | 739,37, | 739,38, | 739,39, | 739,40, | 739,41, | 739,42, | 739,43, | 739,44, | 739,45, | 739,46, | 739,47, | 739,48, | 739,49, | 739,50, | 739,51, | 739,52, | 739,53, | 739,54, | 739,55, | 739,56, | 739,57, | 739,58, | 739,59, | 739,60, | 739,61, | 739,62, | 739,63, | 739,64, | 739,65, | 739,66, | 739,67, | 739,68, | 739,69, | 739,70, | 739,71, | 739,72, | 739,73, | 739,74, | 739,75, | 739,76, | 739,77, | 739,78, | 739,79, | 739,80, | 739,81, | 739,82, | 739,83, | 739,84, | 739,85, | 740,1, | 740,2, | 740,3, | 740,4, | 740,5, | 740,6, | 740,7, | 740,8, | 740,9, | 740,10, | 740,11, | 740,12, | 740,13, | 740,14, | 740,15, | 740,16, | 740,17, | 740,18, | 740,19, | 740,20, | 740,21, | 740,22, | 740,23, | 740,24, | 740,25, | 740,26, | 740,27, | 740,28, | 740,29, | 740,30, | 740,31, | 740,32, | 740,33, | 740,34, | 740,35, | 740,36, | 740,37, | 740,38, | 740,39, | 740,40, | 740,41, | 740,42, | 740,43, | 740,44, | 740,45, | 740,46, | 740,47, | 740,48, | 740,49, | 740,50, | 740,51, | 740,52, | 740,53, | 740,54, | 740,55, | 740,56, | 740,57, | 740,58, | 740,59, | 740,60, | 740,61, | 740,62, | 740,63, | 740,64, | 740,65, | 740,66, | 740,67, | 740,68, | 740,69, | 740,70, | 740,71, | 740,72, | 740,73, | 740,74, | 740,75, | 740,76, | 740,77, | 740,78, | 740,79, | 740,80, | 740,81, | 740,82, | 740,83, | 740,84, | 740,85, | 741,1, | 741,2, | 741,3, | 741,4, | 741,5, | 741,6, | 741,7, | 741,8, | 741,9, | 741,10, | 741,11, | 741,12, | 741,13, | 741,14, | 741,15, | 741,16, | 741,17, | 741,18, | 741,19, | 741,20, | 741,21, | 741,22, | 741,23, | 741,24, | 741,25, | 741,26, | 741,27, | 741,28, | 741,29, | 741,30, | 741,31, | 741,32, | 741,33, | 741,34, | 741,35, | 741,36, | 741,37, | 741,38, | 741,39, | 741,40, | 741,41, | 741,42, | 741,43, | 741,44, | 741,45, | 741,46, | 741,47, | 741,48, | 741,49, | 741,50, | 741,51, | 741,52, | 741,53, | 741,54, | 741,55, | 741,56, | 741,57, | 741,58, | 741,59, | 741,60, | 741,61, | 741,62, | 741,63, | 741,64, | 741,65, | 741,66, | 741,67, | 741,68, | 741,69, | 741,70, | 741,71, | 741,72, | 741,73, | 741,74, | 741,75, | 741,76, | 741,77, | 741,78, | 741,79, | 741,80, | 741,81, | 741,82, | 741,83, | 741,84, | 741,85, | 742,1, | 742,2, | 742,3, | 742,4, | 742,5, | 742,6, | 742,7, | 742,8, | 742,9, | 742,10, | 742,11, | 742,12, | 742,13, | 742,14, | 742,15, | 742,16, | 742,17, | 742,18, | 742,19, | 742,20, | 742,21, | 742,22, | 742,23, | 742,24, | 742,25, | 742,26, | 742,27, | 742,28, | 742,29, | 742,30, | 742,31, | 742,32, | 742,33, | 742,34, | 742,35, | 742,36, | 742,37, | 742,38, | 742,39, | 742,40, | 742,41, | 742,42, | 742,43, | 742,44, | 742,45, | 742,46, | 742,47, | 742,48, | 742,49, | 742,50, | 742,51, | 742,52, | 742,53, | 742,54, | 742,55, | 742,56, | 742,57, | 742,58, | 742,59, | 742,60, | 742,61, | 742,62, | 742,63, | 742,64, | 742,65, | 742,66, | 742,67, | 742,68, | 742,69, | 742,70, | 742,71, | 742,72, | 742,73, | 742,74, | 742,75, | 742,76, | 742,77, | 742,78, | 742,79, | 742,80, | 742,81, | 742,82, | 742,83, | 742,84, | 742,85, | 743,1, | 743,2, | 743,3, | 743,4, | 743,5, | 743,6, | 743,7, | 743,8, | 743,9, | 743,10, | 743,11, | 743,12, | 743,13, | 743,14, | 743,15, | 743,16, | 743,17, | 743,18, | 743,19, | 743,20, | 743,21, | 743,22, | 743,23, | 743,24, | 743,25, | 743,26, | 743,27, | 743,28, | 743,29, | 743,30, | 743,31, | 743,32, | 743,33, | 743,34, | 743,35, | 743,36, | 743,37, | 743,38, | 743,39, | 743,40, | 743,41, | 743,42, | 743,43, | 743,44, | 743,45, | 743,46, | 743,47, | 743,48, | 743,49, | 743,50, | 743,51, | 743,52, | 743,53, | 743,54, | 743,55, | 743,56, | 743,57, | 743,58, | 743,59, | 743,60, | 743,61, | 743,62, | 743,63, | 743,64, | 743,65, | 743,66, | 743,67, | 743,68, | 743,69, | 743,70, | 743,71, | 743,72, | 743,73, | 743,74, | 743,75, | 743,76, | 743,77, | 743,78, | 743,79, | 743,80, | 743,81, | 743,82, | 743,83, | 743,84, | 743,85, | 744,1, | 744,2, | 744,3, | 744,4, | 744,5, | 744,6, | 744,7, | 744,8, | 744,9, | 744,10, | 744,11, | 744,12, | 744,13, | 744,14, | 744,15, | 744,16, | 744,17, | 744,18, | 744,19, | 744,20, | 744,21, | 744,22, | 744,23, | 744,24, | 744,25, | 744,26, | 744,27, | 744,28, | 744,29, | 744,30, | 744,31, | 744,32, | 744,33, | 744,34, | 744,35, | 744,36, | 744,37, | 744,38, | 744,39, | 744,40, | 744,41, | 744,42, | 744,43, | 744,44, | 744,45, | 744,46, | 744,47, | 744,48, | 744,49, | 744,50, | 744,51, | 744,52, | 744,53, | 744,54, | 744,55, | 744,56, | 744,57, | 744,58, | 744,59, | 744,60, | 744,61, | 744,62, | 744,63, | 744,64, | 744,65, | 744,66, | 744,67, | 744,68, | 744,69, | 744,70, | 744,71, | 744,72, | 744,73, | 744,74, | 744,75, | 744,76, | 744,77, | 744,78, | 744,79, | 744,80, | 744,81, | 744,82, | 744,83, | 744,84, | 744,85, | 745,1, | 745,2, | 745,3, | 745,4, | 745,5, | 745,6, | 745,7, | 745,8, | 745,9, | 745,10, | 745,11, | 745,12, | 745,13, | 745,14, | 745,15, | 745,16, | 745,17, | 745,18, | 745,19, | 745,20, | 745,21, | 745,22, | 745,23, | 745,24, | 745,25, | 745,26, | 745,27, | 745,28, | 745,29, | 745,30, | 745,31, | 745,32, | 745,33, | 745,34, | 745,35, | 745,36, | 745,37, | 745,38, | 745,39, | 745,40, | 745,41, | 745,42, | 745,43, | 745,44, | 745,45, | 745,46, | 745,47, | 745,48, | 745,49, | 745,50, | 745,51, | 745,52, | 745,53, | 745,54, | 745,55, | 745,56, | 745,57, | 745,58, | 745,59, | 745,60, | 745,61, | 745,62, | 745,63, | 745,64, | 745,65, | 745,66, | 745,67, | 745,68, | 745,69, | 745,70, | 745,71, | 745,72, | 745,73, | 745,74, | 745,75, | 745,76, | 745,77, | 745,78, | 745,79, | 745,80, | 745,81, | 745,82, | 745,83, | 745,84, | 745,85, | 746,1, | 746,2, | 746,3, | 746,4, | 746,5, | 746,6, | 746,7, | 746,8, | 746,9, | 746,10, | 746,11, | 746,12, | 746,13, | 746,14, | 746,15, | 746,16, | 746,17, | 746,18, | 746,19, | 746,20, | 746,21, | 746,22, | 746,23, | 746,24, | 746,25, | 746,26, | 746,27, | 746,28, | 746,29, | 746,30, | 746,31, | 746,32, | 746,33, | 746,34, | 746,35, | 746,36, | 746,37, | 746,38, | 746,39, | 746,40, | 746,41, | 746,42, | 746,43, | 746,44, | 746,45, | 746,46, | 746,47, | 746,48, | 746,49, | 746,50, | 746,51, | 746,52, | 746,53, | 746,54, | 746,55, | 746,56, | 746,57, | 746,58, | 746,59, | 746,60, | 746,61, | 746,62, | 746,63, | 746,64, | 746,65, | 746,66, | 746,67, | 746,68, | 746,69, | 746,70, | 746,71, | 746,72, | 746,73, | 746,74, | 746,75, | 746,76, | 746,77, | 746,78, | 746,79, | 746,80, | 746,81, | 746,82, | 746,83, | 746,84, | 746,85, | 747,1, | 747,2, | 747,3, | 747,4, | 747,5, | 747,6, | 747,7, | 747,8, | 747,9, | 747,10, | 747,11, | 747,12, | 747,13, | 747,14, | 747,15, | 747,16, | 747,17, | 747,18, | 747,19, | 747,20, | 747,21, | 747,22, | 747,23, | 747,24, | 747,25, | 747,26, | 747,27, | 747,28, | 747,29, | 747,30, | 747,31, | 747,32, | 747,33, | 747,34, | 747,35, | 747,36, | 747,37, | 747,38, | 747,39, | 747,40, | 747,41, | 747,42, | 747,43, | 747,44, | 747,45, | 747,46, | 747,47, | 747,48, | 747,49, | 747,50, | 747,51, | 747,52, | 747,53, | 747,54, | 747,55, | 747,56, | 747,57, | 747,58, | 747,59, | 747,60, | 747,61, | 747,62, | 747,63, | 747,64, | 747,65, | 747,66, | 747,67, | 747,68, | 747,69, | 747,70, | 747,71, | 747,72, | 747,73, | 747,74, | 747,75, | 747,76, | 747,77, | 747,78, | 747,79, | 747,80, | 747,81, | 747,82, | 747,83, | 747,84, | 747,85, | 748,1, | 748,2, | 748,3, | 748,4, | 748,5, | 748,6, | 748,7, | 748,8, | 748,9, | 748,10, | 748,11, | 748,12, | 748,13, | 748,14, | 748,15, | 748,16, | 748,17, | 748,18, | 748,19, | 748,20, | 748,21, | 748,22, | 748,23, | 748,24, | 748,25, | 748,26, | 748,27, | 748,28, | 748,29, | 748,30, | 748,31, | 748,32, | 748,33, | 748,34, | 748,35, | 748,36, | 748,37, | 748,38, | 748,39, | 748,40, | 748,41, | 748,42, | 748,43, | 748,44, | 748,45, | 748,46, | 748,47, | 748,48, | 748,49, | 748,50, | 748,51, | 748,52, | 748,53, | 748,54, | 748,55, | 748,56, | 748,57, | 748,58, | 748,59, | 748,60, | 748,61, | 748,62, | 748,63, | 748,64, | 748,65, | 748,66, | 748,67, | 748,68, | 748,69, | 748,70, | 748,71, | 748,72, | 748,73, | 748,74, | 748,75, | 748,76, | 748,77, | 748,78, | 748,79, | 748,80, | 748,81, | 748,82, | 748,83, | 748,84, | 748,85, | 749,1, | 749,2, | 749,3, | 749,4, | 749,5, | 749,6, | 749,7, | 749,8, | 749,9, | 749,10, | 749,11, | 749,12, | 749,13, | 749,14, | 749,15, | 749,16, | 749,17, | 749,18, | 749,19, | 749,20, | 749,21, | 749,22, | 749,23, | 749,24, | 749,25, | 749,26, | 749,27, | 749,28, | 749,29, | 749,30, | 749,31, | 749,32, | 749,33, | 749,34, | 749,35, | 749,36, | 749,37, | 749,38, | 749,39, | 749,40, | 749,41, | 749,42, | 749,43, | 749,44, | 749,45, | 749,46, | 749,47, | 749,48, | 749,49, | 749,50, | 749,51, | 749,52, | 749,53, | 749,54, | 749,55, | 749,56, | 749,57, | 749,58, | 749,59, | 749,60, | 749,61, | 749,62, | 749,63, | 749,64, | 749,65, | 749,66, | 749,67, | 749,68, | 749,69, | 749,70, | 749,71, | 749,72, | 749,73, | 749,74, | 749,75, | 749,76, | 749,77, | 749,78, | 749,79, | 749,80, | 749,81, | 749,82, | 749,83, | 749,84, | 749,85, | 750,1, | 750,2, | 750,3, | 750,4, | 750,5, | 750,6, | 750,7, | 750,8, | 750,9, | 750,10, | 750,11, | 750,12, | 750,13, | 750,14, | 750,15, | 750,16, | 750,17, | 750,18, | 750,19, | 750,20, | 750,21, | 750,22, | 750,23, | 750,24, | 750,25, | 750,26, | 750,27, | 750,28, | 750,29, | 750,30, | 750,31, | 750,32, | 750,33, | 750,34, | 750,35, | 750,36, | 750,37, | 750,38, | 750,39, | 750,40, | 750,41, | 750,42, | 750,43, | 750,44, | 750,45, | 750,46, | 750,47, | 750,48, | 750,49, | 750,50, | 750,51, | 750,52, | 750,53, | 750,54, | 750,55, | 750,56, | 750,57, | 750,58, | 750,59, | 750,60, | 750,61, | 750,62, | 750,63, | 750,64, | 750,65, | 750,66, | 750,67, | 750,68, | 750,69, | 750,70, | 750,71, | 750,72, | 750,73, | 750,74, | 750,75, | 750,76, | 750,77, | 750,78, | 750,79, | 750,80, | 750,81, | 750,82, | 750,83, | 750,84, | 750,85, | 751,1, | 751,2, | 751,3, | 751,4, | 751,5, | 751,6, | 751,7, | 751,8, | 751,9, | 751,10, | 751,11, | 751,12, | 751,13, | 751,14, | 751,15, | 751,16, | 751,17, | 751,18, | 751,19, | 751,20, | 751,21, | 751,22, | 751,23, | 751,24, | 751,25, | 751,26, | 751,27, | 751,28, | 751,29, | 751,30, | 751,31, | 751,32, | 751,33, | 751,34, | 751,35, | 751,36, | 751,37, | 751,38, | 751,39, | 751,40, | 751,41, | 751,42, | 751,43, | 751,44, | 751,45, | 751,46, | 751,47, | 751,48, | 751,49, | 751,50, | 751,51, | 751,52, | 751,53, | 751,54, | 751,55, | 751,56, | 751,57, | 751,58, | 751,59, | 751,60, | 751,61, | 751,62, | 751,63, | 751,64, | 751,65, | 751,66, | 751,67, | 751,68, | 751,69, | 751,70, | 751,71, | 751,72, | 751,73, | 751,74, | 751,75, | 751,76, | 751,77, | 751,78, | 751,79, | 751,80, | 751,81, | 751,82, | 751,83, | 751,84, | 751,85, | 752,1, | 752,2, | 752,3, | 752,4, | 752,5, | 752,6, | 752,7, | 752,8, | 752,9, | 752,10, | 752,11, | 752,12, | 752,13, | 752,14, | 752,15, | 752,16, | 752,17, | 752,18, | 752,19, | 752,20, | 752,21, | 752,22, | 752,23, | 752,24, | 752,25, | 752,26, | 752,27, | 752,28, | 752,29, | 752,30, | 752,31, | 752,32, | 752,33, | 752,34, | 752,35, | 752,36, | 752,37, | 752,38, | 752,39, | 752,40, | 752,41, | 752,42, | 752,43, | 752,44, | 752,45, | 752,46, | 752,47, | 752,48, | 752,49, | 752,50, | 752,51, | 752,52, | 752,53, | 752,54, | 752,55, | 752,56, | 752,57, | 752,58, | 752,59, | 752,60, | 752,61, | 752,62, | 752,63, | 752,64, | 752,65, | 752,66, | 752,67, | 752,68, | 752,69, | 752,70, | 752,71, | 752,72, | 752,73, | 752,74, | 752,75, | 752,76, | 752,77, | 752,78, | 752,79, | 752,80, | 752,81, | 752,82, | 752,83, | 752,84, | 752,85, | 753,1, | 753,2, | 753,3, | 753,4, | 753,5, | 753,6, | 753,7, | 753,8, | 753,9, | 753,10, | 753,11, | 753,12, | 753,13, | 753,14, | 753,15, | 753,16, | 753,17, | 753,18, | 753,19, | 753,20, | 753,21, | 753,22, | 753,23, | 753,24, | 753,25, | 753,26, | 753,27, | 753,28, | 753,29, | 753,30, | 753,31, | 753,32, | 753,33, | 753,34, | 753,35, | 753,36, | 753,37, | 753,38, | 753,39, | 753,40, | 753,41, | 753,42, | 753,43, | 753,44, | 753,45, | 753,46, | 753,47, | 753,48, | 753,49, | 753,50, | 753,51, | 753,52, | 753,53, | 753,54, | 753,55, | 753,56, | 753,57, | 753,58, | 753,59, | 753,60, | 753,61, | 753,62, | 753,63, | 753,64, | 753,65, | 753,66, | 753,67, | 753,68, | 753,69, | 753,70, | 753,71, | 753,72, | 753,73, | 753,74, | 753,75, | 753,76, | 753,77, | 753,78, | 753,79, | 753,80, | 753,81, | 753,82, | 753,83, | 753,84, | 753,85, | 754,1, | 754,2, | 754,3, | 754,4, | 754,5, | 754,6, | 754,7, | 754,8, | 754,9, | 754,10, | 754,11, | 754,12, | 754,13, | 754,14, | 754,15, | 754,16, | 754,17, | 754,18, | 754,19, | 754,20, | 754,21, | 754,22, | 754,23, | 754,24, | 754,25, | 754,26, | 754,27, | 754,28, | 754,29, | 754,30, | 754,31, | 754,32, | 754,33, | 754,34, | 754,35, | 754,36, | 754,37, | 754,38, | 754,39, | 754,40, | 754,41, | 754,42, | 754,43, | 754,44, | 754,45, | 754,46, | 754,47, | 754,48, | 754,49, | 754,50, | 754,51, | 754,52, | 754,53, | 754,54, | 754,55, | 754,56, | 754,57, | 754,58, | 754,59, | 754,60, | 754,61, | 754,62, | 754,63, | 754,64, | 754,65, | 754,66, | 754,67, | 754,68, | 754,69, | 754,70, | 754,71, | 754,72, | 754,73, | 754,74, | 754,75, | 754,76, | 754,77, | 754,78, | 754,79, | 754,80, | 754,81, | 754,82, | 754,83, | 754,84, | 754,85, | 755,1, | 755,2, | 755,3, | 755,4, | 755,5, | 755,6, | 755,7, | 755,8, | 755,9, | 755,10, | 755,11, | 755,12, | 755,13, | 755,14, | 755,15, | 755,16, | 755,17, | 755,18, | 755,19, | 755,20, | 755,21, | 755,22, | 755,23, | 755,24, | 755,25, | 755,26, | 755,27, | 755,28, | 755,29, | 755,30, | 755,31, | 755,32, | 755,33, | 755,34, | 755,35, | 755,36, | 755,37, | 755,38, | 755,39, | 755,40, | 755,41, | 755,42, | 755,43, | 755,44, | 755,45, | 755,46, | 755,47, | 755,48, | 755,49, | 755,50, | 755,51, | 755,52, | 755,53, | 755,54, | 755,55, | 755,56, | 755,57, | 755,58, | 755,59, | 755,60, | 755,61, | 755,62, | 755,63, | 755,64, | 755,65, | 755,66, | 755,67, | 755,68, | 755,69, | 755,70, | 755,71, | 755,72, | 755,73, | 755,74, | 755,75, | 755,76, | 755,77, | 755,78, | 755,79, | 755,80, | 755,81, | 755,82, | 755,83, | 755,84, | 755,85, | 756,1, | 756,2, | 756,3, | 756,4, | 756,5, | 756,6, | 756,7, | 756,8, | 756,9, | 756,10, | 756,11, | 756,12, | 756,13, | 756,14, | 756,15, | 756,16, | 756,17, | 756,18, | 756,19, | 756,20, | 756,21, | 756,22, | 756,23, | 756,24, | 756,25, | 756,26, | 756,27, | 756,28, | 756,29, | 756,30, | 756,31, | 756,32, | 756,33, | 756,34, | 756,35, | 756,36, | 756,37, | 756,38, | 756,39, | 756,40, | 756,41, | 756,42, | 756,43, | 756,44, | 756,45, | 756,46, | 756,47, | 756,48, | 756,49, | 756,50, | 756,51, | 756,52, | 756,53, | 756,54, | 756,55, | 756,56, | 756,57, | 756,58, | 756,59, | 756,60, | 756,61, | 756,62, | 756,63, | 756,64, | 756,65, | 756,66, | 756,67, | 756,68, | 756,69, | 756,70, | 756,71, | 756,72, | 756,73, | 756,74, | 756,75, | 756,76, | 756,77, | 756,78, | 756,79, | 756,80, | 756,81, | 756,82, | 756,83, | 756,84, | 756,85, | 757,1, | 757,2, | 757,3, | 757,4, | 757,5, | 757,6, | 757,7, | 757,8, | 757,9, | 757,10, | 757,11, | 757,12, | 757,13, | 757,14, | 757,15, | 757,16, | 757,17, | 757,18, | 757,19, | 757,20, | 757,21, | 757,22, | 757,23, | 757,24, | 757,25, | 757,26, | 757,27, | 757,28, | 757,29, | 757,30, | 757,31, | 757,32, | 757,33, | 757,34, | 757,35, | 757,36, | 757,37, | 757,38, | 757,39, | 757,40, | 757,41, | 757,42, | 757,43, | 757,44, | 757,45, | 757,46, | 757,47, | 757,48, | 757,49, | 757,50, | 757,51, | 757,52, | 757,53, | 757,54, | 757,55, | 757,56, | 757,57, | 757,58, | 757,59, | 757,60, | 757,61, | 757,62, | 757,63, | 757,64, | 757,65, | 757,66, | 757,67, | 757,68, | 757,69, | 757,70, | 757,71, | 757,72, | 757,73, | 757,74, | 757,75, | 757,76, | 757,77, | 757,78, | 757,79, | 757,80, | 757,81, | 757,82, | 757,83, | 757,84, | 757,85, | 758,1, | 758,2, | 758,3, | 758,4, | 758,5, | 758,6, | 758,7, | 758,8, | 758,9, | 758,10, | 758,11, | 758,12, | 758,13, | 758,14, | 758,15, | 758,16, | 758,17, | 758,18, | 758,19, | 758,20, | 758,21, | 758,22, | 758,23, | 758,24, | 758,25, | 758,26, | 758,27, | 758,28, | 758,29, | 758,30, | 758,31, | 758,32, | 758,33, | 758,34, | 758,35, | 758,36, | 758,37, | 758,38, | 758,39, | 758,40, | 758,41, | 758,42, | 758,43, | 758,44, | 758,45, | 758,46, | 758,47, | 758,48, | 758,49, | 758,50, | 758,51, | 758,52, | 758,53, | 758,54, | 758,55, | 758,56, | 758,57, | 758,58, | 758,59, | 758,60, | 758,61, | 758,62, | 758,63, | 758,64, | 758,65, | 758,66, | 758,67, | 758,68, | 758,69, | 758,70, | 758,71, | 758,72, | 758,73, | 758,74, | 758,75, | 758,76, | 758,77, | 758,78, | 758,79, | 758,80, | 758,81, | 758,82, | 758,83, | 758,84, | 758,85, | 759,1, | 759,2, | 759,3, | 759,4, | 759,5, | 759,6, | 759,7, | 759,8, | 759,9, | 759,10, | 759,11, | 759,12, | 759,13, | 759,14, | 759,15, | 759,16, | 759,17, | 759,18, | 759,19, | 759,20, | 759,21, | 759,22, | 759,23, | 759,24, | 759,25, | 759,26, | 759,27, | 759,28, | 759,29, | 759,30, | 759,31, | 759,32, | 759,33, | 759,34, | 759,35, | 759,36, | 759,37, | 759,38, | 759,39, | 759,40, | 759,41, | 759,42, | 759,43, | 759,44, | 759,45, | 759,46, | 759,47, | 759,48, | 759,49, | 759,50, | 759,51, | 759,52, | 759,53, | 759,54, | 759,55, | 759,56, | 759,57, | 759,58, | 759,59, | 759,60, | 759,61, | 759,62, | 759,63, | 759,64, | 759,65, | 759,66, | 759,67, | 759,68, | 759,69, | 759,70, | 759,71, | 759,72, | 759,73, | 759,74, | 759,75, | 759,76, | 759,77, | 759,78, | 759,79, | 759,80, | 759,81, | 759,82, | 759,83, | 759,84, | 759,85, | 760,1, | 760,2, | 760,3, | 760,4, | 760,5, | 760,6, | 760,7, | 760,8, | 760,9, | 760,10, | 760,11, | 760,12, | 760,13, | 760,14, | 760,15, | 760,16, | 760,17, | 760,18, | 760,19, | 760,20, | 760,21, | 760,22, | 760,23, | 760,24, | 760,25, | 760,26, | 760,27, | 760,28, | 760,29, | 760,30, | 760,31, | 760,32, | 760,33, | 760,34, | 760,35, | 760,36, | 760,37, | 760,38, | 760,39, | 760,40, | 760,41, | 760,42, | 760,43, | 760,44, | 760,45, | 760,46, | 760,47, | 760,48, | 760,49, | 760,50, | 760,51, | 760,52, | 760,53, | 760,54, | 760,55, | 760,56, | 760,57, | 760,58, | 760,59, | 760,60, | 760,61, | 760,62, | 760,63, | 760,64, | 760,65, | 760,66, | 760,67, | 760,68, | 760,69, | 760,70, | 760,71, | 760,72, | 760,73, | 760,74, | 760,75, | 760,76, | 760,77, | 760,78, | 760,79, | 760,80, | 760,81, | 760,82, | 760,83, | 760,84, | 760,85, | 761,1, | 761,2, | 761,3, | 761,4, | 761,5, | 761,6, | 761,7, | 761,8, | 761,9, | 761,10, | 761,11, | 761,12, | 761,13, | 761,14, | 761,15, | 761,16, | 761,17, | 761,18, | 761,19, | 761,20, | 761,21, | 761,22, | 761,23, | 761,24, | 761,25, | 761,26, | 761,27, | 761,28, | 761,29, | 761,30, | 761,31, | 761,32, | 761,33, | 761,34, | 761,35, | 761,36, | 761,37, | 761,38, | 761,39, | 761,40, | 761,41, | 761,42, | 761,43, | 761,44, | 761,45, | 761,46, | 761,47, | 761,48, | 761,49, | 761,50, | 761,51, | 761,52, | 761,53, | 761,54, | 761,55, | 761,56, | 761,57, | 761,58, | 761,59, | 761,60, | 761,61, | 761,62, | 761,63, | 761,64, | 761,65, | 761,66, | 761,67, | 761,68, | 761,69, | 761,70, | 761,71, | 761,72, | 761,73, | 761,74, | 761,75, | 761,76, | 761,77, | 761,78, | 761,79, | 761,80, | 761,81, | 761,82, | 761,83, | 761,84, | 761,85, | 762,1, | 762,2, | 762,3, | 762,4, | 762,5, | 762,6, | 762,7, | 762,8, | 762,9, | 762,10, | 762,11, | 762,12, | 762,13, | 762,14, | 762,15, | 762,16, | 762,17, | 762,18, | 762,19, | 762,20, | 762,21, | 762,22, | 762,23, | 762,24, | 762,25, | 762,26, | 762,27, | 762,28, | 762,29, | 762,30, | 762,31, | 762,32, | 762,33, | 762,34, | 762,35, | 762,36, | 762,37, | 762,38, | 762,39, | 762,40, | 762,41, | 762,42, | 762,43, | 762,44, | 762,45, | 762,46, | 762,47, | 762,48, | 762,49, | 762,50, | 762,51, | 762,52, | 762,53, | 762,54, | 762,55, | 762,56, | 762,57, | 762,58, | 762,59, | 762,60, | 762,61, | 762,62, | 762,63, | 762,64, | 762,65, | 762,66, | 762,67, | 762,68, | 762,69, | 762,70, | 762,71, | 762,72, | 762,73, | 762,74, | 762,75, | 762,76, | 762,77, | 762,78, | 762,79, | 762,80, | 762,81, | 762,82, | 762,83, | 762,84, | 762,85, | 763,1, | 763,2, | 763,3, | 763,4, | 763,5, | 763,6, | 763,7, | 763,8, | 763,9, | 763,10, | 763,11, | 763,12, | 763,13, | 763,14, | 763,15, | 763,16, | 763,17, | 763,18, | 763,19, | 763,20, | 763,21, | 763,22, | 763,23, | 763,24, | 763,25, | 763,26, | 763,27, | 763,28, | 763,29, | 763,30, | 763,31, | 763,32, | 763,33, | 763,34, | 763,35, | 763,36, | 763,37, | 763,38, | 763,39, | 763,40, | 763,41, | 763,42, | 763,43, | 763,44, | 763,45, | 763,46, | 763,47, | 763,48, | 763,49, | 763,50, | 763,51, | 763,52, | 763,53, | 763,54, | 763,55, | 763,56, | 763,57, | 763,58, | 763,59, | 763,60, | 763,61, | 763,62, | 763,63, | 763,64, | 763,65, | 763,66, | 763,67, | 763,68, | 763,69, | 763,70, | 763,71, | 763,72, | 763,73, | 763,74, | 763,75, | 763,76, | 763,77, | 763,78, | 763,79, | 763,80, | 763,81, | 763,82, | 763,83, | 763,84, | 763,85, | 764,1, | 764,2, | 764,3, | 764,4, | 764,5, | 764,6, | 764,7, | 764,8, | 764,9, | 764,10, | 764,11, | 764,12, | 764,13, | 764,14, | 764,15, | 764,16, | 764,17, | 764,18, | 764,19, | 764,20, | 764,21, | 764,22, | 764,23, | 764,24, | 764,25, | 764,26, | 764,27, | 764,28, | 764,29, | 764,30, | 764,31, | 764,32, | 764,33, | 764,34, | 764,35, | 764,36, | 764,37, | 764,38, | 764,39, | 764,40, | 764,41, | 764,42, | 764,43, | 764,44, | 764,45, | 764,46, | 764,47, | 764,48, | 764,49, | 764,50, | 764,51, | 764,52, | 764,53, | 764,54, | 764,55, | 764,56, | 764,57, | 764,58, | 764,59, | 764,60, | 764,61, | 764,62, | 764,63, | 764,64, | 764,65, | 764,66, | 764,67, | 764,68, | 764,69, | 764,70, | 764,71, | 764,72, | 764,73, | 764,74, | 764,75, | 764,76, | 764,77, | 764,78, | 764,79, | 764,80, | 764,81, | 764,82, | 764,83, | 764,84, | 764,85, | 765,1, | 765,2, | 765,3, | 765,4, | 765,5, | 765,6, | 765,7, | 765,8, | 765,9, | 765,10, | 765,11, | 765,12, | 765,13, | 765,14, | 765,15, | 765,16, | 765,17, | 765,18, | 765,19, | 765,20, | 765,21, | 765,22, | 765,23, | 765,24, | 765,25, | 765,26, | 765,27, | 765,28, | 765,29, | 765,30, | 765,31, | 765,32, | 765,33, | 765,34, | 765,35, | 765,36, | 765,37, | 765,38, | 765,39, | 765,40, | 765,41, | 765,42, | 765,43, | 765,44, | 765,45, | 765,46, | 765,47, | 765,48, | 765,49, | 765,50, | 765,51, | 765,52, | 765,53, | 765,54, | 765,55, | 765,56, | 765,57, | 765,58, | 765,59, | 765,60, | 765,61, | 765,62, | 765,63, | 765,64, | 765,65, | 765,66, | 765,67, | 765,68, | 765,69, | 765,70, | 765,71, | 765,72, | 765,73, | 765,74, | 765,75, | 765,76, | 765,77, | 765,78, | 765,79, | 765,80, | 765,81, | 765,82, | 765,83, | 765,84, | 765,85, | 766,1, | 766,2, | 766,3, | 766,4, | 766,5, | 766,6, | 766,7, | 766,8, | 766,9, | 766,10, | 766,11, | 766,12, | 766,13, | 766,14, | 766,15, | 766,16, | 766,17, | 766,18, | 766,19, | 766,20, | 766,21, | 766,22, | 766,23, | 766,24, | 766,25, | 766,26, | 766,27, | 766,28, | 766,29, | 766,30, | 766,31, | 766,32, | 766,33, | 766,34, | 766,35, | 766,36, | 766,37, | 766,38, | 766,39, | 766,40, | 766,41, | 766,42, | 766,43, | 766,44, | 766,45, | 766,46, | 766,47, | 766,48, | 766,49, | 766,50, | 766,51, | 766,52, | 766,53, | 766,54, | 766,55, | 766,56, | 766,57, | 766,58, | 766,59, | 766,60, | 766,61, | 766,62, | 766,63, | 766,64, | 766,65, | 766,66, | 766,67, | 766,68, | 766,69, | 766,70, | 766,71, | 766,72, | 766,73, | 766,74, | 766,75, | 766,76, | 766,77, | 766,78, | 766,79, | 766,80, | 766,81, | 766,82, | 766,83, | 766,84, | 766,85, | 767,1, | 767,2, | 767,3, | 767,4, | 767,5, | 767,6, | 767,7, | 767,8, | 767,9, | 767,10, | 767,11, | 767,12, | 767,13, | 767,14, | 767,15, | 767,16, | 767,17, | 767,18, | 767,19, | 767,20, | 767,21, | 767,22, | 767,23, | 767,24, | 767,25, | 767,26, | 767,27, | 767,28, | 767,29, | 767,30, | 767,31, | 767,32, | 767,33, | 767,34, | 767,35, | 767,36, | 767,37, | 767,38, | 767,39, | 767,40, | 767,41, | 767,42, | 767,43, | 767,44, | 767,45, | 767,46, | 767,47, | 767,48, | 767,49, | 767,50, | 767,51, | 767,52, | 767,53, | 767,54, | 767,55, | 767,56, | 767,57, | 767,58, | 767,59, | 767,60, | 767,61, | 767,62, | 767,63, | 767,64, | 767,65, | 767,66, | 767,67, | 767,68, | 767,69, | 767,70, | 767,71, | 767,72, | 767,73, | 767,74, | 767,75, | 767,76, | 767,77, | 767,78, | 767,79, | 767,80, | 767,81, | 767,82, | 767,83, | 767,84, | 767,85, | 768,1, | 768,2, | 768,3, | 768,4, | 768,5, | 768,6, | 768,7, | 768,8, | 768,9, | 768,10, | 768,11, | 768,12, | 768,13, | 768,14, | 768,15, | 768,16, | 768,17, | 768,18, | 768,19, | 768,20, | 768,21, | 768,22, | 768,23, | 768,24, | 768,25, | 768,26, | 768,27, | 768,28, | 768,29, | 768,30, | 768,31, | 768,32, | 768,33, | 768,34, | 768,35, | 768,36, | 768,37, | 768,38, | 768,39, | 768,40, | 768,41, | 768,42, | 768,43, | 768,44, | 768,45, | 768,46, | 768,47, | 768,48, | 768,49, | 768,50, | 768,51, | 768,52, | 768,53, | 768,54, | 768,55, | 768,56, | 768,57, | 768,58, | 768,59, | 768,60, | 768,61, | 768,62, | 768,63, | 768,64, | 768,65, | 768,66, | 768,67, | 768,68, | 768,69, | 768,70, | 768,71, | 768,72, | 768,73, | 768,74, | 768,75, | 768,76, | 768,77, | 768,78, | 768,79, | 768,80, | 768,81, | 768,82, | 768,83, | 768,84, | 768,85, | 769,1, | 769,2, | 769,3, | 769,4, | 769,5, | 769,6, | 769,7, | 769,8, | 769,9, | 769,10, | 769,11, | 769,12, | 769,13, | 769,14, | 769,15, | 769,16, | 769,17, | 769,18, | 769,19, | 769,20, | 769,21, | 769,22, | 769,23, | 769,24, | 769,25, | 769,26, | 769,27, | 769,28, | 769,29, | 769,30, | 769,31, | 769,32, | 769,33, | 769,34, | 769,35, | 769,36, | 769,37, | 769,38, | 769,39, | 769,40, | 769,41, | 769,42, | 769,43, | 769,44, | 769,45, | 769,46, | 769,47, | 769,48, | 769,49, | 769,50, | 769,51, | 769,52, | 769,53, | 769,54, | 769,55, | 769,56, | 769,57, | 769,58, | 769,59, | 769,60, | 769,61, | 769,62, | 769,63, | 769,64, | 769,65, | 769,66, | 769,67, | 769,68, | 769,69, | 769,70, | 769,71, | 769,72, | 769,73, | 769,74, | 769,75, | 769,76, | 769,77, | 769,78, | 769,79, | 769,80, | 769,81, | 769,82, | 769,83, | 769,84, | 769,85, | 770,1, | 770,2, | 770,3, | 770,4, | 770,5, | 770,6, | 770,7, | 770,8, | 770,9, | 770,10, | 770,11, | 770,12, | 770,13, | 770,14, | 770,15, | 770,16, | 770,17, | 770,18, | 770,19, | 770,20, | 770,21, | 770,22, | 770,23, | 770,24, | 770,25, | 770,26, | 770,27, | 770,28, | 770,29, | 770,30, | 770,31, | 770,32, | 770,33, | 770,34, | 770,35, | 770,36, | 770,37, | 770,38, | 770,39, | 770,40, | 770,41, | 770,42, | 770,43, | 770,44, | 770,45, | 770,46, | 770,47, | 770,48, | 770,49, | 770,50, | 770,51, | 770,52, | 770,53, | 770,54, | 770,55, | 770,56, | 770,57, | 770,58, | 770,59, | 770,60, | 770,61, | 770,62, | 770,63, | 770,64, | 770,65, | 770,66, | 770,67, | 770,68, | 770,69, | 770,70, | 770,71, | 770,72, | 770,73, | 770,74, | 770,75, | 770,76, | 770,77, | 770,78, | 770,79, | 770,80, | 770,81, | 770,82, | 770,83, | 770,84, | 770,85, | 771,1, | 771,2, | 771,3, | 771,4, | 771,5, | 771,6, | 771,7, | 771,8, | 771,9, | 771,10, | 771,11, | 771,12, | 771,13, | 771,14, | 771,15, | 771,16, | 771,17, | 771,18, | 771,19, | 771,20, | 771,21, | 771,22, | 771,23, | 771,24, | 771,25, | 771,26, | 771,27, | 771,28, | 771,29, | 771,30, | 771,31, | 771,32, | 771,33, | 771,34, | 771,35, | 771,36, | 771,37, | 771,38, | 771,39, | 771,40, | 771,41, | 771,42, | 771,43, | 771,44, | 771,45, | 771,46, | 771,47, | 771,48, | 771,49, | 771,50, | 771,51, | 771,52, | 771,53, | 771,54, | 771,55, | 771,56, | 771,57, | 771,58, | 771,59, | 771,60, | 771,61, | 771,62, | 771,63, | 771,64, | 771,65, | 771,66, | 771,67, | 771,68, | 771,69, | 771,70, | 771,71, | 771,72, | 771,73, | 771,74, | 771,75, | 771,76, | 771,77, | 771,78, | 771,79, | 771,80, | 771,81, | 771,82, | 771,83, | 771,84, | 771,85, | 772,1, | 772,2, | 772,3, | 772,4, | 772,5, | 772,6, | 772,7, | 772,8, | 772,9, | 772,10, | 772,11, | 772,12, | 772,13, | 772,14, | 772,15, | 772,16, | 772,17, | 772,18, | 772,19, | 772,20, | 772,21, | 772,22, | 772,23, | 772,24, | 772,25, | 772,26, | 772,27, | 772,28, | 772,29, | 772,30, | 772,31, | 772,32, | 772,33, | 772,34, | 772,35, | 772,36, | 772,37, | 772,38, | 772,39, | 772,40, | 772,41, | 772,42, | 772,43, | 772,44, | 772,45, | 772,46, | 772,47, | 772,48, | 772,49, | 772,50, | 772,51, | 772,52, | 772,53, | 772,54, | 772,55, | 772,56, | 772,57, | 772,58, | 772,59, | 772,60, | 772,61, | 772,62, | 772,63, | 772,64, | 772,65, | 772,66, | 772,67, | 772,68, | 772,69, | 772,70, | 772,71, | 772,72, | 772,73, | 772,74, | 772,75, | 772,76, | 772,77, | 772,78, | 772,79, | 772,80, | 772,81, | 772,82, | 772,83, | 772,84, | 772,85, | 773,1, | 773,2, | 773,3, | 773,4, | 773,5, | 773,6, | 773,7, | 773,8, | 773,9, | 773,10, | 773,11, | 773,12, | 773,13, | 773,14, | 773,15, | 773,16, | 773,17, | 773,18, | 773,19, | 773,20, | 773,21, | 773,22, | 773,23, | 773,24, | 773,25, | 773,26, | 773,27, | 773,28, | 773,29, | 773,30, | 773,31, | 773,32, | 773,33, | 773,34, | 773,35, | 773,36, | 773,37, | 773,38, | 773,39, | 773,40, | 773,41, | 773,42, | 773,43, | 773,44, | 773,45, | 773,46, | 773,47, | 773,48, | 773,49, | 773,50, | 773,51, | 773,52, | 773,53, | 773,54, | 773,55, | 773,56, | 773,57, | 773,58, | 773,59, | 773,60, | 773,61, | 773,62, | 773,63, | 773,64, | 773,65, | 773,66, | 773,67, | 773,68, | 773,69, | 773,70, | 773,71, | 773,72, | 773,73, | 773,74, | 773,75, | 773,76, | 773,77, | 773,78, | 773,79, | 773,80, | 773,81, | 773,82, | 773,83, | 773,84, | 773,85, | 774,1, | 774,2, | 774,3, | 774,4, | 774,5, | 774,6, | 774,7, | 774,8, | 774,9, | 774,10, | 774,11, | 774,12, | 774,13, | 774,14, | 774,15, | 774,16, | 774,17, | 774,18, | 774,19, | 774,20, | 774,21, | 774,22, | 774,23, | 774,24, | 774,25, | 774,26, | 774,27, | 774,28, | 774,29, | 774,30, | 774,31, | 774,32, | 774,33, | 774,34, | 774,35, | 774,36, | 774,37, | 774,38, | 774,39, | 774,40, | 774,41, | 774,42, | 774,43, | 774,44, | 774,45, | 774,46, | 774,47, | 774,48, | 774,49, | 774,50, | 774,51, | 774,52, | 774,53, | 774,54, | 774,55, | 774,56, | 774,57, | 774,58, | 774,59, | 774,60, | 774,61, | 774,62, | 774,63, | 774,64, | 774,65, | 774,66, | 774,67, | 774,68, | 774,69, | 774,70, | 774,71, | 774,72, | 774,73, | 774,74, | 774,75, | 774,76, | 774,77, | 774,78, | 774,79, | 774,80, | 774,81, | 774,82, | 774,83, | 774,84, | 774,85, | 775,1, | 775,2, | 775,3, | 775,4, | 775,5, | 775,6, | 775,7, | 775,8, | 775,9, | 775,10, | 775,11, | 775,12, | 775,13, | 775,14, | 775,15, | 775,16, | 775,17, | 775,18, | 775,19, | 775,20, | 775,21, | 775,22, | 775,23, | 775,24, | 775,25, | 775,26, | 775,27, | 775,28, | 775,29, | 775,30, | 775,31, | 775,32, | 775,33, | 775,34, | 775,35, | 775,36, | 775,37, | 775,38, | 775,39, | 775,40, | 775,41, | 775,42, | 775,43, | 775,44, | 775,45, | 775,46, | 775,47, | 775,48, | 775,49, | 775,50, | 775,51, | 775,52, | 775,53, | 775,54, | 775,55, | 775,56, | 775,57, | 775,58, | 775,59, | 775,60, | 775,61, | 775,62, | 775,63, | 775,64, | 775,65, | 775,66, | 775,67, | 775,68, | 775,69, | 775,70, | 775,71, | 775,72, | 775,73, | 775,74, | 775,75, | 775,76, | 775,77, | 775,78, | 775,79, | 775,80, | 775,81, | 775,82, | 775,83, | 775,84, | 775,85, | 776,1, | 776,2, | 776,3, | 776,4, | 776,5, | 776,6, | 776,7, | 776,8, | 776,9, | 776,10, | 776,11, | 776,12, | 776,13, | 776,14, | 776,15, | 776,16, | 776,17, | 776,18, | 776,19, | 776,20, | 776,21, | 776,22, | 776,23, | 776,24, | 776,25, | 776,26, | 776,27, | 776,28, | 776,29, | 776,30, | 776,31, | 776,32, | 776,33, | 776,34, | 776,35, | 776,36, | 776,37, | 776,38, | 776,39, | 776,40, | 776,41, | 776,42, | 776,43, | 776,44, | 776,45, | 776,46, | 776,47, | 776,48, | 776,49, | 776,50, | 776,51, | 776,52, | 776,53, | 776,54, | 776,55, | 776,56, | 776,57, | 776,58, | 776,59, | 776,60, | 776,61, | 776,62, | 776,63, | 776,64, | 776,65, | 776,66, | 776,67, | 776,68, | 776,69, | 776,70, | 776,71, | 776,72, | 776,73, | 776,74, | 776,75, | 776,76, | 776,77, | 776,78, | 776,79, | 776,80, | 776,81, | 776,82, | 776,83, | 776,84, | 776,85, | 777,1, | 777,2, | 777,3, | 777,4, | 777,5, | 777,6, | 777,7, | 777,8, | 777,9, | 777,10, | 777,11, | 777,12, | 777,13, | 777,14, | 777,15, | 777,16, | 777,17, | 777,18, | 777,19, | 777,20, | 777,21, | 777,22, | 777,23, | 777,24, | 777,25, | 777,26, | 777,27, | 777,28, | 777,29, | 777,30, | 777,31, | 777,32, | 777,33, | 777,34, | 777,35, | 777,36, | 777,37, | 777,38, | 777,39, | 777,40, | 777,41, | 777,42, | 777,43, | 777,44, | 777,45, | 777,46, | 777,47, | 777,48, | 777,49, | 777,50, | 777,51, | 777,52, | 777,53, | 777,54, | 777,55, | 777,56, | 777,57, | 777,58, | 777,59, | 777,60, | 777,61, | 777,62, | 777,63, | 777,64, | 777,65, | 777,66, | 777,67, | 777,68, | 777,69, | 777,70, | 777,71, | 777,72, | 777,73, | 777,74, | 777,75, | 777,76, | 777,77, | 777,78, | 777,79, | 777,80, | 777,81, | 777,82, | 777,83, | 777,84, | 777,85, | 778,1, | 778,2, | 778,3, | 778,4, | 778,5, | 778,6, | 778,7, | 778,8, | 778,9, | 778,10, | 778,11, | 778,12, | 778,13, | 778,14, | 778,15, | 778,16, | 778,17, | 778,18, | 778,19, | 778,20, | 778,21, | 778,22, | 778,23, | 778,24, | 778,25, | 778,26, | 778,27, | 778,28, | 778,29, | 778,30, | 778,31, | 778,32, | 778,33, | 778,34, | 778,35, | 778,36, | 778,37, | 778,38, | 778,39, | 778,40, | 778,41, | 778,42, | 778,43, | 778,44, | 778,45, | 778,46, | 778,47, | 778,48, | 778,49, | 778,50, | 778,51, | 778,52, | 778,53, | 778,54, | 778,55, | 778,56, | 778,57, | 778,58, | 778,59, | 778,60, | 778,61, | 778,62, | 778,63, | 778,64, | 778,65, | 778,66, | 778,67, | 778,68, | 778,69, | 778,70, | 778,71, | 778,72, | 778,73, | 778,74, | 778,75, | 778,76, | 778,77, | 778,78, | 778,79, | 778,80, | 778,81, | 778,82, | 778,83, | 778,84, | 778,85, | 779,1, | 779,2, | 779,3, | 779,4, | 779,5, | 779,6, | 779,7, | 779,8, | 779,9, | 779,10, | 779,11, | 779,12, | 779,13, | 779,14, | 779,15, | 779,16, | 779,17, | 779,18, | 779,19, | 779,20, | 779,21, | 779,22, | 779,23, | 779,24, | 779,25, | 779,26, | 779,27, | 779,28, | 779,29, | 779,30, | 779,31, | 779,32, | 779,33, | 779,34, | 779,35, | 779,36, | 779,37, | 779,38, | 779,39, | 779,40, | 779,41, | 779,42, | 779,43, | 779,44, | 779,45, | 779,46, | 779,47, | 779,48, | 779,49, | 779,50, | 779,51, | 779,52, | 779,53, | 779,54, | 779,55, | 779,56, | 779,57, | 779,58, | 779,59, | 779,60, | 779,61, | 779,62, | 779,63, | 779,64, | 779,65, | 779,66, | 779,67, | 779,68, | 779,69, | 779,70, | 779,71, | 779,72, | 779,73, | 779,74, | 779,75, | 779,76, | 779,77, | 779,78, | 779,79, | 779,80, | 779,81, | 779,82, | 779,83, | 779,84, | 779,85, | 780,1, | 780,2, | 780,3, | 780,4, | 780,5, | 780,6, | 780,7, | 780,8, | 780,9, | 780,10, | 780,11, | 780,12, | 780,13, | 780,14, | 780,15, | 780,16, | 780,17, | 780,18, | 780,19, | 780,20, | 780,21, | 780,22, | 780,23, | 780,24, | 780,25, | 780,26, | 780,27, | 780,28, | 780,29, | 780,30, | 780,31, | 780,32, | 780,33, | 780,34, | 780,35, | 780,36, | 780,37, | 780,38, | 780,39, | 780,40, | 780,41, | 780,42, | 780,43, | 780,44, | 780,45, | 780,46, | 780,47, | 780,48, | 780,49, | 780,50, | 780,51, | 780,52, | 780,53, | 780,54, | 780,55, | 780,56, | 780,57, | 780,58, | 780,59, | 780,60, | 780,61, | 780,62, | 780,63, | 780,64, | 780,65, | 780,66, | 780,67, | 780,68, | 780,69, | 780,70, | 780,71, | 780,72, | 780,73, | 780,74, | 780,75, | 780,76, | 780,77, | 780,78, | 780,79, | 780,80, | 780,81, | 780,82, | 780,83, | 780,84, | 780,85, | 781,1, | 781,2, | 781,3, | 781,4, | 781,5, | 781,6, | 781,7, | 781,8, | 781,9, | 781,10, | 781,11, | 781,12, | 781,13, | 781,14, | 781,15, | 781,16, | 781,17, | 781,18, | 781,19, | 781,20, | 781,21, | 781,22, | 781,23, | 781,24, | 781,25, | 781,26, | 781,27, | 781,28, | 781,29, | 781,30, | 781,31, | 781,32, | 781,33, | 781,34, | 781,35, | 781,36, | 781,37, | 781,38, | 781,39, | 781,40, | 781,41, | 781,42, | 781,43, | 781,44, | 781,45, | 781,46, | 781,47, | 781,48, | 781,49, | 781,50, | 781,51, | 781,52, | 781,53, | 781,54, | 781,55, | 781,56, | 781,57, | 781,58, | 781,59, | 781,60, | 781,61, | 781,62, | 781,63, | 781,64, | 781,65, | 781,66, | 781,67, | 781,68, | 781,69, | 781,70, | 781,71, | 781,72, | 781,73, | 781,74, | 781,75, | 781,76, | 781,77, | 781,78, | 781,79, | 781,80, | 781,81, | 781,82, | 781,83, | 781,84, | 781,85, | 782,1, | 782,2, | 782,3, | 782,4, | 782,5, | 782,6, | 782,7, | 782,8, | 782,9, | 782,10, | 782,11, | 782,12, | 782,13, | 782,14, | 782,15, | 782,16, | 782,17, | 782,18, | 782,19, | 782,20, | 782,21, | 782,22, | 782,23, | 782,24, | 782,25, | 782,26, | 782,27, | 782,28, | 782,29, | 782,30, | 782,31, | 782,32, | 782,33, | 782,34, | 782,35, | 782,36, | 782,37, | 782,38, | 782,39, | 782,40, | 782,41, | 782,42, | 782,43, | 782,44, | 782,45, | 782,46, | 782,47, | 782,48, | 782,49, | 782,50, | 782,51, | 782,52, | 782,53, | 782,54, | 782,55, | 782,56, | 782,57, | 782,58, | 782,59, | 782,60, | 782,61, | 782,62, | 782,63, | 782,64, | 782,65, | 782,66, | 782,67, | 782,68, | 782,69, | 782,70, | 782,71, | 782,72, | 782,73, | 782,74, | 782,75, | 782,76, | 782,77, | 782,78, | 782,79, | 782,80, | 782,81, | 782,82, | 782,83, | 782,84, | 782,85, | 783,1, | 783,2, | 783,3, | 783,4, | 783,5, | 783,6, | 783,7, | 783,8, | 783,9, | 783,10, | 783,11, | 783,12, | 783,13, | 783,14, | 783,15, | 783,16, | 783,17, | 783,18, | 783,19, | 783,20, | 783,21, | 783,22, | 783,23, | 783,24, | 783,25, | 783,26, | 783,27, | 783,28, | 783,29, | 783,30, | 783,31, | 783,32, | 783,33, | 783,34, | 783,35, | 783,36, | 783,37, | 783,38, | 783,39, | 783,40, | 783,41, | 783,42, | 783,43, | 783,44, | 783,45, | 783,46, | 783,47, | 783,48, | 783,49, | 783,50, | 783,51, | 783,52, | 783,53, | 783,54, | 783,55, | 783,56, | 783,57, | 783,58, | 783,59, | 783,60, | 783,61, | 783,62, | 783,63, | 783,64, | 783,65, | 783,66, | 783,67, | 783,68, | 783,69, | 783,70, | 783,71, | 783,72, | 783,73, | 783,74, | 783,75, | 783,76, | 783,77, | 783,78, | 783,79, | 783,80, | 783,81, | 783,82, | 783,83, | 783,84, | 783,85, | 784,1, | 784,2, | 784,3, | 784,4, | 784,5, | 784,6, | 784,7, | 784,8, | 784,9, | 784,10, | 784,11, | 784,12, | 784,13, | 784,14, | 784,15, | 784,16, | 784,17, | 784,18, | 784,19, | 784,20, | 784,21, | 784,22, | 784,23, | 784,24, | 784,25, | 784,26, | 784,27, | 784,28, | 784,29, | 784,30, | 784,31, | 784,32, | 784,33, | 784,34, | 784,35, | 784,36, | 784,37, | 784,38, | 784,39, | 784,40, | 784,41, | 784,42, | 784,43, | 784,44, | 784,45, | 784,46, | 784,47, | 784,48, | 784,49, | 784,50, | 784,51, | 784,52, | 784,53, | 784,54, | 784,55, | 784,56, | 784,57, | 784,58, | 784,59, | 784,60, | 784,61, | 784,62, | 784,63, | 784,64, | 784,65, | 784,66, | 784,67, | 784,68, | 784,69, | 784,70, | 784,71, | 784,72, | 784,73, | 784,74, | 784,75, | 784,76, | 784,77, | 784,78, | 784,79, | 784,80, | 784,81, | 784,82, | 784,83, | 784,84, | 784,85, | 785,1, | 785,2, | 785,3, | 785,4, | 785,5, | 785,6, | 785,7, | 785,8, | 785,9, | 785,10, | 785,11, | 785,12, | 785,13, | 785,14, | 785,15, | 785,16, | 785,17, | 785,18, | 785,19, | 785,20, | 785,21, | 785,22, | 785,23, | 785,24, | 785,25, | 785,26, | 785,27, | 785,28, | 785,29, | 785,30, | 785,31, | 785,32, | 785,33, | 785,34, | 785,35, | 785,36, | 785,37, | 785,38, | 785,39, | 785,40, | 785,41, | 785,42, | 785,43, | 785,44, | 785,45, | 785,46, | 785,47, | 785,48, | 785,49, | 785,50, | 785,51, | 785,52, | 785,53, | 785,54, | 785,55, | 785,56, | 785,57, | 785,58, | 785,59, | 785,60, | 785,61, | 785,62, | 785,63, | 785,64, | 785,65, | 785,66, | 785,67, | 785,68, | 785,69, | 785,70, | 785,71, | 785,72, | 785,73, | 785,74, | 785,75, | 785,76, | 785,77, | 785,78, | 785,79, | 785,80, | 785,81, | 785,82, | 785,83, | 785,84, | 785,85, | 786,1, | 786,2, | 786,3, | 786,4, | 786,5, | 786,6, | 786,7, | 786,8, | 786,9, | 786,10, | 786,11, | 786,12, | 786,13, | 786,14, | 786,15, | 786,16, | 786,17, | 786,18, | 786,19, | 786,20, | 786,21, | 786,22, | 786,23, | 786,24, | 786,25, | 786,26, | 786,27, | 786,28, | 786,29, | 786,30, | 786,31, | 786,32, | 786,33, | 786,34, | 786,35, | 786,36, | 786,37, | 786,38, | 786,39, | 786,40, | 786,41, | 786,42, | 786,43, | 786,44, | 786,45, | 786,46, | 786,47, | 786,48, | 786,49, | 786,50, | 786,51, | 786,52, | 786,53, | 786,54, | 786,55, | 786,56, | 786,57, | 786,58, | 786,59, | 786,60, | 786,61, | 786,62, | 786,63, | 786,64, | 786,65, | 786,66, | 786,67, | 786,68, | 786,69, | 786,70, | 786,71, | 786,72, | 786,73, | 786,74, | 786,75, | 786,76, | 786,77, | 786,78, | 786,79, | 786,80, | 786,81, | 786,82, | 786,83, | 786,84, | 786,85, | 787,1, | 787,2, | 787,3, | 787,4, | 787,5, | 787,6, | 787,7, | 787,8, | 787,9, | 787,10, | 787,11, | 787,12, | 787,13, | 787,14, | 787,15, | 787,16, | 787,17, | 787,18, | 787,19, | 787,20, | 787,21, | 787,22, | 787,23, | 787,24, | 787,25, | 787,26, | 787,27, | 787,28, | 787,29, | 787,30, | 787,31, | 787,32, | 787,33, | 787,34, | 787,35, | 787,36, | 787,37, | 787,38, | 787,39, | 787,40, | 787,41, | 787,42, | 787,43, | 787,44, | 787,45, | 787,46, | 787,47, | 787,48, | 787,49, | 787,50, | 787,51, | 787,52, | 787,53, | 787,54, | 787,55, | 787,56, | 787,57, | 787,58, | 787,59, | 787,60, | 787,61, | 787,62, | 787,63, | 787,64, | 787,65, | 787,66, | 787,67, | 787,68, | 787,69, | 787,70, | 787,71, | 787,72, | 787,73, | 787,74, | 787,75, | 787,76, | 787,77, | 787,78, | 787,79, | 787,80, | 787,81, | 787,82, | 787,83, | 787,84, | 787,85, | 788,1, | 788,2, | 788,3, | 788,4, | 788,5, | 788,6, | 788,7, | 788,8, | 788,9, | 788,10, | 788,11, | 788,12, | 788,13, | 788,14, | 788,15, | 788,16, | 788,17, | 788,18, | 788,19, | 788,20, | 788,21, | 788,22, | 788,23, | 788,24, | 788,25, | 788,26, | 788,27, | 788,28, | 788,29, | 788,30, | 788,31, | 788,32, | 788,33, | 788,34, | 788,35, | 788,36, | 788,37, | 788,38, | 788,39, | 788,40, | 788,41, | 788,42, | 788,43, | 788,44, | 788,45, | 788,46, | 788,47, | 788,48, | 788,49, | 788,50, | 788,51, | 788,52, | 788,53, | 788,54, | 788,55, | 788,56, | 788,57, | 788,58, | 788,59, | 788,60, | 788,61, | 788,62, | 788,63, | 788,64, | 788,65, | 788,66, | 788,67, | 788,68, | 788,69, | 788,70, | 788,71, | 788,72, | 788,73, | 788,74, | 788,75, | 788,76, | 788,77, | 788,78, | 788,79, | 788,80, | 788,81, | 788,82, | 788,83, | 788,84, | 788,85, | 789,1, | 789,2, | 789,3, | 789,4, | 789,5, | 789,6, | 789,7, | 789,8, | 789,9, | 789,10, | 789,11, | 789,12, | 789,13, | 789,14, | 789,15, | 789,16, | 789,17, | 789,18, | 789,19, | 789,20, | 789,21, | 789,22, | 789,23, | 789,24, | 789,25, | 789,26, | 789,27, | 789,28, | 789,29, | 789,30, | 789,31, | 789,32, | 789,33, | 789,34, | 789,35, | 789,36, | 789,37, | 789,38, | 789,39, | 789,40, | 789,41, | 789,42, | 789,43, | 789,44, | 789,45, | 789,46, | 789,47, | 789,48, | 789,49, | 789,50, | 789,51, | 789,52, | 789,53, | 789,54, | 789,55, | 789,56, | 789,57, | 789,58, | 789,59, | 789,60, | 789,61, | 789,62, | 789,63, | 789,64, | 789,65, | 789,66, | 789,67, | 789,68, | 789,69, | 789,70, | 789,71, | 789,72, | 789,73, | 789,74, | 789,75, | 789,76, | 789,77, | 789,78, | 789,79, | 789,80, | 789,81, | 789,82, | 789,83, | 789,84, | 789,85, | 790,1, | 790,2, | 790,3, | 790,4, | 790,5, | 790,6, | 790,7, | 790,8, | 790,9, | 790,10, | 790,11, | 790,12, | 790,13, | 790,14, | 790,15, | 790,16, | 790,17, | 790,18, | 790,19, | 790,20, | 790,21, | 790,22, | 790,23, | 790,24, | 790,25, | 790,26, | 790,27, | 790,28, | 790,29, | 790,30, | 790,31, | 790,32, | 790,33, | 790,34, | 790,35, | 790,36, | 790,37, | 790,38, | 790,39, | 790,40, | 790,41, | 790,42, | 790,43, | 790,44, | 790,45, | 790,46, | 790,47, | 790,48, | 790,49, | 790,50, | 790,51, | 790,52, | 790,53, | 790,54, | 790,55, | 790,56, | 790,57, | 790,58, | 790,59, | 790,60, | 790,61, | 790,62, | 790,63, | 790,64, | 790,65, | 790,66, | 790,67, | 790,68, | 790,69, | 790,70, | 790,71, | 790,72, | 790,73, | 790,74, | 790,75, | 790,76, | 790,77, | 790,78, | 790,79, | 790,80, | 790,81, | 790,82, | 790,83, | 790,84, | 790,85, | 791,1, | 791,2, | 791,3, | 791,4, | 791,5, | 791,6, | 791,7, | 791,8, | 791,9, | 791,10, | 791,11, | 791,12, | 791,13, | 791,14, | 791,15, | 791,16, | 791,17, | 791,18, | 791,19, | 791,20, | 791,21, | 791,22, | 791,23, | 791,24, | 791,25, | 791,26, | 791,27, | 791,28, | 791,29, | 791,30, | 791,31, | 791,32, | 791,33, | 791,34, | 791,35, | 791,36, | 791,37, | 791,38, | 791,39, | 791,40, | 791,41, | 791,42, | 791,43, | 791,44, | 791,45, | 791,46, | 791,47, | 791,48, | 791,49, | 791,50, | 791,51, | 791,52, | 791,53, | 791,54, | 791,55, | 791,56, | 791,57, | 791,58, | 791,59, | 791,60, | 791,61, | 791,62, | 791,63, | 791,64, | 791,65, | 791,66, | 791,67, | 791,68, | 791,69, | 791,70, | 791,71, | 791,72, | 791,73, | 791,74, | 791,75, | 791,76, | 791,77, | 791,78, | 791,79, | 791,80, | 791,81, | 791,82, | 791,83, | 791,84, | 791,85, | 792,1, | 792,2, | 792,3, | 792,4, | 792,5, | 792,6, | 792,7, | 792,8, | 792,9, | 792,10, | 792,11, | 792,12, | 792,13, | 792,14, | 792,15, | 792,16, | 792,17, | 792,18, | 792,19, | 792,20, | 792,21, | 792,22, | 792,23, | 792,24, | 792,25, | 792,26, | 792,27, | 792,28, | 792,29, | 792,30, | 792,31, | 792,32, | 792,33, | 792,34, | 792,35, | 792,36, | 792,37, | 792,38, | 792,39, | 792,40, | 792,41, | 792,42, | 792,43, | 792,44, | 792,45, | 792,46, | 792,47, | 792,48, | 792,49, | 792,50, | 792,51, | 792,52, | 792,53, | 792,54, | 792,55, | 792,56, | 792,57, | 792,58, | 792,59, | 792,60, | 792,61, | 792,62, | 792,63, | 792,64, | 792,65, | 792,66, | 792,67, | 792,68, | 792,69, | 792,70, | 792,71, | 792,72, | 792,73, | 792,74, | 792,75, | 792,76, | 792,77, | 792,78, | 792,79, | 792,80, | 792,81, | 792,82, | 792,83, | 792,84, | 792,85, | 793,1, | 793,2, | 793,3, | 793,4, | 793,5, | 793,6, | 793,7, | 793,8, | 793,9, | 793,10, | 793,11, | 793,12, | 793,13, | 793,14, | 793,15, | 793,16, | 793,17, | 793,18, | 793,19, | 793,20, | 793,21, | 793,22, | 793,23, | 793,24, | 793,25, | 793,26, | 793,27, | 793,28, | 793,29, | 793,30, | 793,31, | 793,32, | 793,33, | 793,34, | 793,35, | 793,36, | 793,37, | 793,38, | 793,39, | 793,40, | 793,41, | 793,42, | 793,43, | 793,44, | 793,45, | 793,46, | 793,47, | 793,48, | 793,49, | 793,50, | 793,51, | 793,52, | 793,53, | 793,54, | 793,55, | 793,56, | 793,57, | 793,58, | 793,59, | 793,60, | 793,61, | 793,62, | 793,63, | 793,64, | 793,65, | 793,66, | 793,67, | 793,68, | 793,69, | 793,70, | 793,71, | 793,72, | 793,73, | 793,74, | 793,75, | 793,76, | 793,77, | 793,78, | 793,79, | 793,80, | 793,81, | 793,82, | 793,83, | 793,84, | 793,85, | 794,1, | 794,2, | 794,3, | 794,4, | 794,5, | 794,6, | 794,7, | 794,8, | 794,9, | 794,10, | 794,11, | 794,12, | 794,13, | 794,14, | 794,15, | 794,16, | 794,17, | 794,18, | 794,19, | 794,20, | 794,21, | 794,22, | 794,23, | 794,24, | 794,25, | 794,26, | 794,27, | 794,28, | 794,29, | 794,30, | 794,31, | 794,32, | 794,33, | 794,34, | 794,35, | 794,36, | 794,37, | 794,38, | 794,39, | 794,40, | 794,41, | 794,42, | 794,43, | 794,44, | 794,45, | 794,46, | 794,47, | 794,48, | 794,49, | 794,50, | 794,51, | 794,52, | 794,53, | 794,54, | 794,55, | 794,56, | 794,57, | 794,58, | 794,59, | 794,60, | 794,61, | 794,62, | 794,63, | 794,64, | 794,65, | 794,66, | 794,67, | 794,68, | 794,69, | 794,70, | 794,71, | 794,72, | 794,73, | 794,74, | 794,75, | 794,76, | 794,77, | 794,78, | 794,79, | 794,80, | 794,81, | 794,82, | 794,83, | 794,84, | 794,85, | 795,1, | 795,2, | 795,3, | 795,4, | 795,5, | 795,6, | 795,7, | 795,8, | 795,9, | 795,10, | 795,11, | 795,12, | 795,13, | 795,14, | 795,15, | 795,16, | 795,17, | 795,18, | 795,19, | 795,20, | 795,21, | 795,22, | 795,23, | 795,24, | 795,25, | 795,26, | 795,27, | 795,28, | 795,29, | 795,30, | 795,31, | 795,32, | 795,33, | 795,34, | 795,35, | 795,36, | 795,37, | 795,38, | 795,39, | 795,40, | 795,41, | 795,42, | 795,43, | 795,44, | 795,45, | 795,46, | 795,47, | 795,48, | 795,49, | 795,50, | 795,51, | 795,52, | 795,53, | 795,54, | 795,55, | 795,56, | 795,57, | 795,58, | 795,59, | 795,60, | 795,61, | 795,62, | 795,63, | 795,64, | 795,65, | 795,66, | 795,67, | 795,68, | 795,69, | 795,70, | 795,71, | 795,72, | 795,73, | 795,74, | 795,75, | 795,76, | 795,77, | 795,78, | 795,79, | 795,80, | 795,81, | 795,82, | 795,83, | 795,84, | 795,85, | 796,1, | 796,2, | 796,3, | 796,4, | 796,5, | 796,6, | 796,7, | 796,8, | 796,9, | 796,10, | 796,11, | 796,12, | 796,13, | 796,14, | 796,15, | 796,16, | 796,17, | 796,18, | 796,19, | 796,20, | 796,21, | 796,22, | 796,23, | 796,24, | 796,25, | 796,26, | 796,27, | 796,28, | 796,29, | 796,30, | 796,31, | 796,32, | 796,33, | 796,34, | 796,35, | 796,36, | 796,37, | 796,38, | 796,39, | 796,40, | 796,41, | 796,42, | 796,43, | 796,44, | 796,45, | 796,46, | 796,47, | 796,48, | 796,49, | 796,50, | 796,51, | 796,52, | 796,53, | 796,54, | 796,55, | 796,56, | 796,57, | 796,58, | 796,59, | 796,60, | 796,61, | 796,62, | 796,63, | 796,64, | 796,65, | 796,66, | 796,67, | 796,68, | 796,69, | 796,70, | 796,71, | 796,72, | 796,73, | 796,74, | 796,75, | 796,76, | 796,77, | 796,78, | 796,79, | 796,80, | 796,81, | 796,82, | 796,83, | 796,84, | 796,85, | 797,1, | 797,2, | 797,3, | 797,4, | 797,5, | 797,6, | 797,7, | 797,8, | 797,9, | 797,10, | 797,11, | 797,12, | 797,13, | 797,14, | 797,15, | 797,16, | 797,17, | 797,18, | 797,19, | 797,20, | 797,21, | 797,22, | 797,23, | 797,24, | 797,25, | 797,26, | 797,27, | 797,28, | 797,29, | 797,30, | 797,31, | 797,32, | 797,33, | 797,34, | 797,35, | 797,36, | 797,37, | 797,38, | 797,39, | 797,40, | 797,41, | 797,42, | 797,43, | 797,44, | 797,45, | 797,46, | 797,47, | 797,48, | 797,49, | 797,50, | 797,51, | 797,52, | 797,53, | 797,54, | 797,55, | 797,56, | 797,57, | 797,58, | 797,59, | 797,60, | 797,61, | 797,62, | 797,63, | 797,64, | 797,65, | 797,66, | 797,67, | 797,68, | 797,69, | 797,70, | 797,71, | 797,72, | 797,73, | 797,74, | 797,75, | 797,76, | 797,77, | 797,78, | 797,79, | 797,80, | 797,81, | 797,82, | 797,83, | 797,84, | 797,85, | 798,1, | 798,2, | 798,3, | 798,4, | 798,5, | 798,6, | 798,7, | 798,8, | 798,9, | 798,10, | 798,11, | 798,12, | 798,13, | 798,14, | 798,15, | 798,16, | 798,17, | 798,18, | 798,19, | 798,20, | 798,21, | 798,22, | 798,23, | 798,24, | 798,25, | 798,26, | 798,27, | 798,28, | 798,29, | 798,30, | 798,31, | 798,32, | 798,33, | 798,34, | 798,35, | 798,36, | 798,37, | 798,38, | 798,39, | 798,40, | 798,41, | 798,42, | 798,43, | 798,44, | 798,45, | 798,46, | 798,47, | 798,48, | 798,49, | 798,50, | 798,51, | 798,52, | 798,53, | 798,54, | 798,55, | 798,56, | 798,57, | 798,58, | 798,59, | 798,60, | 798,61, | 798,62, | 798,63, | 798,64, | 798,65, | 798,66, | 798,67, | 798,68, | 798,69, | 798,70, | 798,71, | 798,72, | 798,73, | 798,74, | 798,75, | 798,76, | 798,77, | 798,78, | 798,79, | 798,80, | 798,81, | 798,82, | 798,83, | 798,84, | 798,85, | 799,1, | 799,2, | 799,3, | 799,4, | 799,5, | 799,6, | 799,7, | 799,8, | 799,9, | 799,10, | 799,11, | 799,12, | 799,13, | 799,14, | 799,15, | 799,16, | 799,17, | 799,18, | 799,19, | 799,20, | 799,21, | 799,22, | 799,23, | 799,24, | 799,25, | 799,26, | 799,27, | 799,28, | 799,29, | 799,30, | 799,31, | 799,32, | 799,33, | 799,34, | 799,35, | 799,36, | 799,37, | 799,38, | 799,39, | 799,40, | 799,41, | 799,42, | 799,43, | 799,44, | 799,45, | 799,46, | 799,47, | 799,48, | 799,49, | 799,50, | 799,51, | 799,52, | 799,53, | 799,54, | 799,55, | 799,56, | 799,57, | 799,58, | 799,59, | 799,60, | 799,61, | 799,62, | 799,63, | 799,64, | 799,65, | 799,66, | 799,67, | 799,68, | 799,69, | 799,70, | 799,71, | 799,72, | 799,73, | 799,74, | 799,75, | 799,76, | 799,77, | 799,78, | 799,79, | 799,80, | 799,81, | 799,82, | 799,83, | 799,84, | 799,85, | 800,1, | 800,2, | 800,3, | 800,4, | 800,5, | 800,6, | 800,7, | 800,8, | 800,9, | 800,10, | 800,11, | 800,12, | 800,13, | 800,14, | 800,15, | 800,16, | 800,17, | 800,18, | 800,19, | 800,20, | 800,21, | 800,22, | 800,23, | 800,24, | 800,25, | 800,26, | 800,27, | 800,28, | 800,29, | 800,30, | 800,31, | 800,32, | 800,33, | 800,34, | 800,35, | 800,36, | 800,37, | 800,38, | 800,39, | 800,40, | 800,41, | 800,42, | 800,43, | 800,44, | 800,45, | 800,46, | 800,47, | 800,48, | 800,49, | 800,50, | 800,51, | 800,52, | 800,53, | 800,54, | 800,55, | 800,56, | 800,57, | 800,58, | 800,59, | 800,60, | 800,61, | 800,62, | 800,63, | 800,64, | 800,65, | 800,66, | 800,67, | 800,68, | 800,69, | 800,70, | 800,71, | 800,72, | 800,73, | 800,74, | 800,75, | 800,76, | 800,77, | 800,78, | 800,79, | 800,80, | 800,81, | 800,82, | 800,83, | 800,84, | 800,85, | 801,1, | 801,2, | 801,3, | 801,4, | 801,5, | 801,6, | 801,7, | 801,8, | 801,9, | 801,10, | 801,11, | 801,12, | 801,13, | 801,14, | 801,15, | 801,16, | 801,17, | 801,18, | 801,19, | 801,20, | 801,21, | 801,22, | 801,23, | 801,24, | 801,25, | 801,26, | 801,27, | 801,28, | 801,29, | 801,30, | 801,31, | 801,32, | 801,33, | 801,34, | 801,35, | 801,36, | 801,37, | 801,38, | 801,39, | 801,40, | 801,41, | 801,42, | 801,43, | 801,44, | 801,45, | 801,46, | 801,47, | 801,48, | 801,49, | 801,50, | 801,51, | 801,52, | 801,53, | 801,54, | 801,55, | 801,56, | 801,57, | 801,58, | 801,59, | 801,60, | 801,61, | 801,62, | 801,63, | 801,64, | 801,65, | 801,66, | 801,67, | 801,68, | 801,69, | 801,70, | 801,71, | 801,72, | 801,73, | 801,74, | 801,75, | 801,76, | 801,77, | 801,78, | 801,79, | 801,80, | 801,81, | 801,82, | 801,83, | 801,84, | 801,85, | 802,1, | 802,2, | 802,3, | 802,4, | 802,5, | 802,6, | 802,7, | 802,8, | 802,9, | 802,10, | 802,11, | 802,12, | 802,13, | 802,14, | 802,15, | 802,16, | 802,17, | 802,18, | 802,19, | 802,20, | 802,21, | 802,22, | 802,23, | 802,24, | 802,25, | 802,26, | 802,27, | 802,28, | 802,29, | 802,30, | 802,31, | 802,32, | 802,33, | 802,34, | 802,35, | 802,36, | 802,37, | 802,38, | 802,39, | 802,40, | 802,41, | 802,42, | 802,43, | 802,44, | 802,45, | 802,46, | 802,47, | 802,48, | 802,49, | 802,50, | 802,51, | 802,52, | 802,53, | 802,54, | 802,55, | 802,56, | 802,57, | 802,58, | 802,59, | 802,60, | 802,61, | 802,62, | 802,63, | 802,64, | 802,65, | 802,66, | 802,67, | 802,68, | 802,69, | 802,70, | 802,71, | 802,72, | 802,73, | 802,74, | 802,75, | 802,76, | 802,77, | 802,78, | 802,79, | 802,80, | 802,81, | 802,82, | 802,83, | 802,84, | 802,85, | 803,1, | 803,2, | 803,3, | 803,4, | 803,5, | 803,6, | 803,7, | 803,8, | 803,9, | 803,10, | 803,11, | 803,12, | 803,13, | 803,14, | 803,15, | 803,16, | 803,17, | 803,18, | 803,19, | 803,20, | 803,21, | 803,22, | 803,23, | 803,24, | 803,25, | 803,26, | 803,27, | 803,28, | 803,29, | 803,30, | 803,31, | 803,32, | 803,33, | 803,34, | 803,35, | 803,36, | 803,37, | 803,38, | 803,39, | 803,40, | 803,41, | 803,42, | 803,43, | 803,44, | 803,45, | 803,46, | 803,47, | 803,48, | 803,49, | 803,50, | 803,51, | 803,52, | 803,53, | 803,54, | 803,55, | 803,56, | 803,57, | 803,58, | 803,59, | 803,60, | 803,61, | 803,62, | 803,63, | 803,64, | 803,65, | 803,66, | 803,67, | 803,68, | 803,69, | 803,70, | 803,71, | 803,72, | 803,73, | 803,74, | 803,75, | 803,76, | 803,77, | 803,78, | 803,79, | 803,80, | 803,81, | 803,82, | 803,83, | 803,84, | 803,85, | 804,1, | 804,2, | 804,3, | 804,4, | 804,5, | 804,6, | 804,7, | 804,8, | 804,9, | 804,10, | 804,11, | 804,12, | 804,13, | 804,14, | 804,15, | 804,16, | 804,17, | 804,18, | 804,19, | 804,20, | 804,21, | 804,22, | 804,23, | 804,24, | 804,25, | 804,26, | 804,27, | 804,28, | 804,29, | 804,30, | 804,31, | 804,32, | 804,33, | 804,34, | 804,35, | 804,36, | 804,37, | 804,38, | 804,39, | 804,40, | 804,41, | 804,42, | 804,43, | 804,44, | 804,45, | 804,46, | 804,47, | 804,48, | 804,49, | 804,50, | 804,51, | 804,52, | 804,53, | 804,54, | 804,55, | 804,56, | 804,57, | 804,58, | 804,59, | 804,60, | 804,61, | 804,62, | 804,63, | 804,64, | 804,65, | 804,66, | 804,67, | 804,68, | 804,69, | 804,70, | 804,71, | 804,72, | 804,73, | 804,74, | 804,75, | 804,76, | 804,77, | 804,78, | 804,79, | 804,80, | 804,81, | 804,82, | 804,83, | 804,84, | 804,85, | 805,1, | 805,2, | 805,3, | 805,4, | 805,5, | 805,6, | 805,7, | 805,8, | 805,9, | 805,10, | 805,11, | 805,12, | 805,13, | 805,14, | 805,15, | 805,16, | 805,17, | 805,18, | 805,19, | 805,20, | 805,21, | 805,22, | 805,23, | 805,24, | 805,25, | 805,26, | 805,27, | 805,28, | 805,29, | 805,30, | 805,31, | 805,32, | 805,33, | 805,34, | 805,35, | 805,36, | 805,37, | 805,38, | 805,39, | 805,40, | 805,41, | 805,42, | 805,43, | 805,44, | 805,45, | 805,46, | 805,47, | 805,48, | 805,49, | 805,50, | 805,51, | 805,52, | 805,53, | 805,54, | 805,55, | 805,56, | 805,57, | 805,58, | 805,59, | 805,60, | 805,61, | 805,62, | 805,63, | 805,64, | 805,65, | 805,66, | 805,67, | 805,68, | 805,69, | 805,70, | 805,71, | 805,72, | 805,73, | 805,74, | 805,75, | 805,76, | 805,77, | 805,78, | 805,79, | 805,80, | 805,81, | 805,82, | 805,83, | 805,84, | 805,85, | 806,1, | 806,2, | 806,3, | 806,4, | 806,5, | 806,6, | 806,7, | 806,8, | 806,9, | 806,10, | 806,11, | 806,12, | 806,13, | 806,14, | 806,15, | 806,16, | 806,17, | 806,18, | 806,19, | 806,20, | 806,21, | 806,22, | 806,23, | 806,24, | 806,25, | 806,26, | 806,27, | 806,28, | 806,29, | 806,30, | 806,31, | 806,32, | 806,33, | 806,34, | 806,35, | 806,36, | 806,37, | 806,38, | 806,39, | 806,40, | 806,41, | 806,42, | 806,43, | 806,44, | 806,45, | 806,46, | 806,47, | 806,48, | 806,49, | 806,50, | 806,51, | 806,52, | 806,53, | 806,54, | 806,55, | 806,56, | 806,57, | 806,58, | 806,59, | 806,60, | 806,61, | 806,62, | 806,63, | 806,64, | 806,65, | 806,66, | 806,67, | 806,68, | 806,69, | 806,70, | 806,71, | 806,72, | 806,73, | 806,74, | 806,75, | 806,76, | 806,77, | 806,78, | 806,79, | 806,80, | 806,81, | 806,82, | 806,83, | 806,84, | 806,85, | 807,1, | 807,2, | 807,3, | 807,4, | 807,5, | 807,6, | 807,7, | 807,8, | 807,9, | 807,10, | 807,11, | 807,12, | 807,13, | 807,14, | 807,15, | 807,16, | 807,17, | 807,18, | 807,19, | 807,20, | 807,21, | 807,22, | 807,23, | 807,24, | 807,25, | 807,26, | 807,27, | 807,28, | 807,29, | 807,30, | 807,31, | 807,32, | 807,33, | 807,34, | 807,35, | 807,36, | 807,37, | 807,38, | 807,39, | 807,40, | 807,41, | 807,42, | 807,43, | 807,44, | 807,45, | 807,46, | 807,47, | 807,48, | 807,49, | 807,50, | 807,51, | 807,52, | 807,53, | 807,54, | 807,55, | 807,56, | 807,57, | 807,58, | 807,59, | 807,60, | 807,61, | 807,62, | 807,63, | 807,64, | 807,65, | 807,66, | 807,67, | 807,68, | 807,69, | 807,70, | 807,71, | 807,72, | 807,73, | 807,74, | 807,75, | 807,76, | 807,77, | 807,78, | 807,79, | 807,80, | 807,81, | 807,82, | 807,83, | 807,84, | 807,85, | 808,1, | 808,2, | 808,3, | 808,4, | 808,5, | 808,6, | 808,7, | 808,8, | 808,9, | 808,10, | 808,11, | 808,12, | 808,13, | 808,14, | 808,15, | 808,16, | 808,17, | 808,18, | 808,19, | 808,20, | 808,21, | 808,22, | 808,23, | 808,24, | 808,25, | 808,26, | 808,27, | 808,28, | 808,29, | 808,30, | 808,31, | 808,32, | 808,33, | 808,34, | 808,35, | 808,36, | 808,37, | 808,38, | 808,39, | 808,40, | 808,41, | 808,42, | 808,43, | 808,44, | 808,45, | 808,46, | 808,47, | 808,48, | 808,49, | 808,50, | 808,51, | 808,52, | 808,53, | 808,54, | 808,55, | 808,56, | 808,57, | 808,58, | 808,59, | 808,60, | 808,61, | 808,62, | 808,63, | 808,64, | 808,65, | 808,66, | 808,67, | 808,68, | 808,69, | 808,70, | 808,71, | 808,72, | 808,73, | 808,74, | 808,75, | 808,76, | 808,77, | 808,78, | 808,79, | 808,80, | 808,81, | 808,82, | 808,83, | 808,84, | 808,85, | 809,1, | 809,2, | 809,3, | 809,4, | 809,5, | 809,6, | 809,7, | 809,8, | 809,9, | 809,10, | 809,11, | 809,12, | 809,13, | 809,14, | 809,15, | 809,16, | 809,17, | 809,18, | 809,19, | 809,20, | 809,21, | 809,22, | 809,23, | 809,24, | 809,25, | 809,26, | 809,27, | 809,28, | 809,29, | 809,30, | 809,31, | 809,32, | 809,33, | 809,34, | 809,35, | 809,36, | 809,37, | 809,38, | 809,39, | 809,40, | 809,41, | 809,42, | 809,43, | 809,44, | 809,45, | 809,46, | 809,47, | 809,48, | 809,49, | 809,50, | 809,51, | 809,52, | 809,53, | 809,54, | 809,55, | 809,56, | 809,57, | 809,58, | 809,59, | 809,60, | 809,61, | 809,62, | 809,63, | 809,64, | 809,65, | 809,66, | 809,67, | 809,68, | 809,69, | 809,70, | 809,71, | 809,72, | 809,73, | 809,74, | 809,75, | 809,76, | 809,77, | 809,78, | 809,79, | 809,80, | 809,81, | 809,82, | 809,83, | 809,84, | 809,85, | 810,1, | 810,2, | 810,3, | 810,4, | 810,5, | 810,6, | 810,7, | 810,8, | 810,9, | 810,10, | 810,11, | 810,12, | 810,13, | 810,14, | 810,15, | 810,16, | 810,17, | 810,18, | 810,19, | 810,20, | 810,21, | 810,22, | 810,23, | 810,24, | 810,25, | 810,26, | 810,27, | 810,28, | 810,29, | 810,30, | 810,31, | 810,32, | 810,33, | 810,34, | 810,35, | 810,36, | 810,37, | 810,38, | 810,39, | 810,40, | 810,41, | 810,42, | 810,43, | 810,44, | 810,45, | 810,46, | 810,47, | 810,48, | 810,49, | 810,50, | 810,51, | 810,52, | 810,53, | 810,54, | 810,55, | 810,56, | 810,57, | 810,58, | 810,59, | 810,60, | 810,61, | 810,62, | 810,63, | 810,64, | 810,65, | 810,66, | 810,67, | 810,68, | 810,69, | 810,70, | 810,71, | 810,72, | 810,73, | 810,74, | 810,75, | 810,76, | 810,77, | 810,78, | 810,79, | 810,80, | 810,81, | 810,82, | 810,83, | 810,84, | 810,85, | 811,1, | 811,2, | 811,3, | 811,4, | 811,5, | 811,6, | 811,7, | 811,8, | 811,9, | 811,10, | 811,11, | 811,12, | 811,13, | 811,14, | 811,15, | 811,16, | 811,17, | 811,18, | 811,19, | 811,20, | 811,21, | 811,22, | 811,23, | 811,24, | 811,25, | 811,26, | 811,27, | 811,28, | 811,29, | 811,30, | 811,31, | 811,32, | 811,33, | 811,34, | 811,35, | 811,36, | 811,37, | 811,38, | 811,39, | 811,40, | 811,41, | 811,42, | 811,43, | 811,44, | 811,45, | 811,46, | 811,47, | 811,48, | 811,49, | 811,50, | 811,51, | 811,52, | 811,53, | 811,54, | 811,55, | 811,56, | 811,57, | 811,58, | 811,59, | 811,60, | 811,61, | 811,62, | 811,63, | 811,64, | 811,65, | 811,66, | 811,67, | 811,68, | 811,69, | 811,70, | 811,71, | 811,72, | 811,73, | 811,74, | 811,75, | 811,76, | 811,77, | 811,78, | 811,79, | 811,80, | 811,81, | 811,82, | 811,83, | 811,84, | 811,85, | 812,1, | 812,2, | 812,3, | 812,4, | 812,5, | 812,6, | 812,7, | 812,8, | 812,9, | 812,10, | 812,11, | 812,12, | 812,13, | 812,14, | 812,15, | 812,16, | 812,17, | 812,18, | 812,19, | 812,20, | 812,21, | 812,22, | 812,23, | 812,24, | 812,25, | 812,26, | 812,27, | 812,28, | 812,29, | 812,30, | 812,31, | 812,32, | 812,33, | 812,34, | 812,35, | 812,36, | 812,37, | 812,38, | 812,39, | 812,40, | 812,41, | 812,42, | 812,43, | 812,44, | 812,45, | 812,46, | 812,47, | 812,48, | 812,49, | 812,50, | 812,51, | 812,52, | 812,53, | 812,54, | 812,55, | 812,56, | 812,57, | 812,58, | 812,59, | 812,60, | 812,61, | 812,62, | 812,63, | 812,64, | 812,65, | 812,66, | 812,67, | 812,68, | 812,69, | 812,70, | 812,71, | 812,72, | 812,73, | 812,74, | 812,75, | 812,76, | 812,77, | 812,78, | 812,79, | 812,80, | 812,81, | 812,82, | 812,83, | 812,84, | 812,85, | 813,1, | 813,2, | 813,3, | 813,4, | 813,5, | 813,6, | 813,7, | 813,8, | 813,9, | 813,10, | 813,11, | 813,12, | 813,13, | 813,14, | 813,15, | 813,16, | 813,17, | 813,18, | 813,19, | 813,20, | 813,21, | 813,22, | 813,23, | 813,24, | 813,25, | 813,26, | 813,27, | 813,28, | 813,29, | 813,30, | 813,31, | 813,32, | 813,33, | 813,34, | 813,35, | 813,36, | 813,37, | 813,38, | 813,39, | 813,40, | 813,41, | 813,42, | 813,43, | 813,44, | 813,45, | 813,46, | 813,47, | 813,48, | 813,49, | 813,50, | 813,51, | 813,52, | 813,53, | 813,54, | 813,55, | 813,56, | 813,57, | 813,58, | 813,59, | 813,60, | 813,61, | 813,62, | 813,63, | 813,64, | 813,65, | 813,66, | 813,67, | 813,68, | 813,69, | 813,70, | 813,71, | 813,72, | 813,73, | 813,74, | 813,75, | 813,76, | 813,77, | 813,78, | 813,79, | 813,80, | 813,81, | 813,82, | 813,83, | 813,84, | 813,85, | 814,1, | 814,2, | 814,3, | 814,4, | 814,5, | 814,6, | 814,7, | 814,8, | 814,9, | 814,10, | 814,11, | 814,12, | 814,13, | 814,14, | 814,15, | 814,16, | 814,17, | 814,18, | 814,19, | 814,20, | 814,21, | 814,22, | 814,23, | 814,24, | 814,25, | 814,26, | 814,27, | 814,28, | 814,29, | 814,30, | 814,31, | 814,32, | 814,33, | 814,34, | 814,35, | 814,36, | 814,37, | 814,38, | 814,39, | 814,40, | 814,41, | 814,42, | 814,43, | 814,44, | 814,45, | 814,46, | 814,47, | 814,48, | 814,49, | 814,50, | 814,51, | 814,52, | 814,53, | 814,54, | 814,55, | 814,56, | 814,57, | 814,58, | 814,59, | 814,60, | 814,61, | 814,62, | 814,63, | 814,64, | 814,65, | 814,66, | 814,67, | 814,68, | 814,69, | 814,70, | 814,71, | 814,72, | 814,73, | 814,74, | 814,75, | 814,76, | 814,77, | 814,78, | 814,79, | 814,80, | 814,81, | 814,82, | 814,83, | 814,84, | 814,85, | 815,1, | 815,2, | 815,3, | 815,4, | 815,5, | 815,6, | 815,7, | 815,8, | 815,9, | 815,10, | 815,11, | 815,12, | 815,13, | 815,14, | 815,15, | 815,16, | 815,17, | 815,18, | 815,19, | 815,20, | 815,21, | 815,22, | 815,23, | 815,24, | 815,25, | 815,26, | 815,27, | 815,28, | 815,29, | 815,30, | 815,31, | 815,32, | 815,33, | 815,34, | 815,35, | 815,36, | 815,37, | 815,38, | 815,39, | 815,40, | 815,41, | 815,42, | 815,43, | 815,44, | 815,45, | 815,46, | 815,47, | 815,48, | 815,49, | 815,50, | 815,51, | 815,52, | 815,53, | 815,54, | 815,55, | 815,56, | 815,57, | 815,58, | 815,59, | 815,60, | 815,61, | 815,62, | 815,63, | 815,64, | 815,65, | 815,66, | 815,67, | 815,68, | 815,69, | 815,70, | 815,71, | 815,72, | 815,73, | 815,74, | 815,75, | 815,76, | 815,77, | 815,78, | 815,79, | 815,80, | 815,81, | 815,82, | 815,83, | 815,84, | 815,85, | 816,1, | 816,2, | 816,3, | 816,4, | 816,5, | 816,6, | 816,7, | 816,8, | 816,9, | 816,10, | 816,11, | 816,12, | 816,13, | 816,14, | 816,15, | 816,16, | 816,17, | 816,18, | 816,19, | 816,20, | 816,21, | 816,22, | 816,23, | 816,24, | 816,25, | 816,26, | 816,27, | 816,28, | 816,29, | 816,30, | 816,31, | 816,32, | 816,33, | 816,34, | 816,35, | 816,36, | 816,37, | 816,38, | 816,39, | 816,40, | 816,41, | 816,42, | 816,43, | 816,44, | 816,45, | 816,46, | 816,47, | 816,48, | 816,49, | 816,50, | 816,51, | 816,52, | 816,53, | 816,54, | 816,55, | 816,56, | 816,57, | 816,58, | 816,59, | 816,60, | 816,61, | 816,62, | 816,63, | 816,64, | 816,65, | 816,66, | 816,67, | 816,68, | 816,69, | 816,70, | 816,71, | 816,72, | 816,73, | 816,74, | 816,75, | 816,76, | 816,77, | 816,78, | 816,79, | 816,80, | 816,81, | 816,82, | 816,83, | 816,84, | 816,85, | 817,1, | 817,2, | 817,3, | 817,4, | 817,5, | 817,6, | 817,7, | 817,8, | 817,9, | 817,10, | 817,11, | 817,12, | 817,13, | 817,14, | 817,15, | 817,16, | 817,17, | 817,18, | 817,19, | 817,20, | 817,21, | 817,22, | 817,23, | 817,24, | 817,25, | 817,26, | 817,27, | 817,28, | 817,29, | 817,30, | 817,31, | 817,32, | 817,33, | 817,34, | 817,35, | 817,36, | 817,37, | 817,38, | 817,39, | 817,40, | 817,41, | 817,42, | 817,43, | 817,44, | 817,45, | 817,46, | 817,47, | 817,48, | 817,49, | 817,50, | 817,51, | 817,52, | 817,53, | 817,54, | 817,55, | 817,56, | 817,57, | 817,58, | 817,59, | 817,60, | 817,61, | 817,62, | 817,63, | 817,64, | 817,65, | 817,66, | 817,67, | 817,68, | 817,69, | 817,70, | 817,71, | 817,72, | 817,73, | 817,74, | 817,75, | 817,76, | 817,77, | 817,78, | 817,79, | 817,80, | 817,81, | 817,82, | 817,83, | 817,84, | 817,85, | 818,1, | 818,2, | 818,3, | 818,4, | 818,5, | 818,6, | 818,7, | 818,8, | 818,9, | 818,10, | 818,11, | 818,12, | 818,13, | 818,14, | 818,15, | 818,16, | 818,17, | 818,18, | 818,19, | 818,20, | 818,21, | 818,22, | 818,23, | 818,24, | 818,25, | 818,26, | 818,27, | 818,28, | 818,29, | 818,30, | 818,31, | 818,32, | 818,33, | 818,34, | 818,35, | 818,36, | 818,37, | 818,38, | 818,39, | 818,40, | 818,41, | 818,42, | 818,43, | 818,44, | 818,45, | 818,46, | 818,47, | 818,48, | 818,49, | 818,50, | 818,51, | 818,52, | 818,53, | 818,54, | 818,55, | 818,56, | 818,57, | 818,58, | 818,59, | 818,60, | 818,61, | 818,62, | 818,63, | 818,64, | 818,65, | 818,66, | 818,67, | 818,68, | 818,69, | 818,70, | 818,71, | 818,72, | 818,73, | 818,74, | 818,75, | 818,76, | 818,77, | 818,78, | 818,79, | 818,80, | 818,81, | 818,82, | 818,83, | 818,84, | 818,85, | 819,1, | 819,2, | 819,3, | 819,4, | 819,5, | 819,6, | 819,7, | 819,8, | 819,9, | 819,10, | 819,11, | 819,12, | 819,13, | 819,14, | 819,15, | 819,16, | 819,17, | 819,18, | 819,19, | 819,20, | 819,21, | 819,22, | 819,23, | 819,24, | 819,25, | 819,26, | 819,27, | 819,28, | 819,29, | 819,30, | 819,31, | 819,32, | 819,33, | 819,34, | 819,35, | 819,36, | 819,37, | 819,38, | 819,39, | 819,40, | 819,41, | 819,42, | 819,43, | 819,44, | 819,45, | 819,46, | 819,47, | 819,48, | 819,49, | 819,50, | 819,51, | 819,52, | 819,53, | 819,54, | 819,55, | 819,56, | 819,57, | 819,58, | 819,59, | 819,60, | 819,61, | 819,62, | 819,63, | 819,64, | 819,65, | 819,66, | 819,67, | 819,68, | 819,69, | 819,70, | 819,71, | 819,72, | 819,73, | 819,74, | 819,75, | 819,76, | 819,77, | 819,78, | 819,79, | 819,80, | 819,81, | 819,82, | 819,83, | 819,84, | 819,85, | 820,1, | 820,2, | 820,3, | 820,4, | 820,5, | 820,6, | 820,7, | 820,8, | 820,9, | 820,10, | 820,11, | 820,12, | 820,13, | 820,14, | 820,15, | 820,16, | 820,17, | 820,18, | 820,19, | 820,20, | 820,21, | 820,22, | 820,23, | 820,24, | 820,25, | 820,26, | 820,27, | 820,28, | 820,29, | 820,30, | 820,31, | 820,32, | 820,33, | 820,34, | 820,35, | 820,36, | 820,37, | 820,38, | 820,39, | 820,40, | 820,41, | 820,42, | 820,43, | 820,44, | 820,45, | 820,46, | 820,47, | 820,48, | 820,49, | 820,50, | 820,51, | 820,52, | 820,53, | 820,54, | 820,55, | 820,56, | 820,57, | 820,58, | 820,59, | 820,60, | 820,61, | 820,62, | 820,63, | 820,64, | 820,65, | 820,66, | 820,67, | 820,68, | 820,69, | 820,70, | 820,71, | 820,72, | 820,73, | 820,74, | 820,75, | 820,76, | 820,77, | 820,78, | 820,79, | 820,80, | 820,81, | 820,82, | 820,83, | 820,84, | 820,85, | 821,1, | 821,2, | 821,3, | 821,4, | 821,5, | 821,6, | 821,7, | 821,8, | 821,9, | 821,10, | 821,11, | 821,12, | 821,13, | 821,14, | 821,15, | 821,16, | 821,17, | 821,18, | 821,19, | 821,20, | 821,21, | 821,22, | 821,23, | 821,24, | 821,25, | 821,26, | 821,27, | 821,28, | 821,29, | 821,30, | 821,31, | 821,32, | 821,33, | 821,34, | 821,35, | 821,36, | 821,37, | 821,38, | 821,39, | 821,40, | 821,41, | 821,42, | 821,43, | 821,44, | 821,45, | 821,46, | 821,47, | 821,48, | 821,49, | 821,50, | 821,51, | 821,52, | 821,53, | 821,54, | 821,55, | 821,56, | 821,57, | 821,58, | 821,59, | 821,60, | 821,61, | 821,62, | 821,63, | 821,64, | 821,65, | 821,66, | 821,67, | 821,68, | 821,69, | 821,70, | 821,71, | 821,72, | 821,73, | 821,74, | 821,75, | 821,76, | 821,77, | 821,78, | 821,79, | 821,80, | 821,81, | 821,82, | 821,83, | 821,84, | 821,85, | 822,1, | 822,2, | 822,3, | 822,4, | 822,5, | 822,6, | 822,7, | 822,8, | 822,9, | 822,10, | 822,11, | 822,12, | 822,13, | 822,14, | 822,15, | 822,16, | 822,17, | 822,18, | 822,19, | 822,20, | 822,21, | 822,22, | 822,23, | 822,24, | 822,25, | 822,26, | 822,27, | 822,28, | 822,29, | 822,30, | 822,31, | 822,32, | 822,33, | 822,34, | 822,35, | 822,36, | 822,37, | 822,38, | 822,39, | 822,40, | 822,41, | 822,42, | 822,43, | 822,44, | 822,45, | 822,46, | 822,47, | 822,48, | 822,49, | 822,50, | 822,51, | 822,52, | 822,53, | 822,54, | 822,55, | 822,56, | 822,57, | 822,58, | 822,59, | 822,60, | 822,61, | 822,62, | 822,63, | 822,64, | 822,65, | 822,66, | 822,67, | 822,68, | 822,69, | 822,70, | 822,71, | 822,72, | 822,73, | 822,74, | 822,75, | 822,76, | 822,77, | 822,78, | 822,79, | 822,80, | 822,81, | 822,82, | 822,83, | 822,84, | 822,85, | 823,1, | 823,2, | 823,3, | 823,4, | 823,5, | 823,6, | 823,7, | 823,8, | 823,9, | 823,10, | 823,11, | 823,12, | 823,13, | 823,14, | 823,15, | 823,16, | 823,17, | 823,18, | 823,19, | 823,20, | 823,21, | 823,22, | 823,23, | 823,24, | 823,25, | 823,26, | 823,27, | 823,28, | 823,29, | 823,30, | 823,31, | 823,32, | 823,33, | 823,34, | 823,35, | 823,36, | 823,37, | 823,38, | 823,39, | 823,40, | 823,41, | 823,42, | 823,43, | 823,44, | 823,45, | 823,46, | 823,47, | 823,48, | 823,49, | 823,50, | 823,51, | 823,52, | 823,53, | 823,54, | 823,55, | 823,56, | 823,57, | 823,58, | 823,59, | 823,60, | 823,61, | 823,62, | 823,63, | 823,64, | 823,65, | 823,66, | 823,67, | 823,68, | 823,69, | 823,70, | 823,71, | 823,72, | 823,73, | 823,74, | 823,75, | 823,76, | 823,77, | 823,78, | 823,79, | 823,80, | 823,81, | 823,82, | 823,83, | 823,84, | 823,85, | 824,1, | 824,2, | 824,3, | 824,4, | 824,5, | 824,6, | 824,7, | 824,8, | 824,9, | 824,10, | 824,11, | 824,12, | 824,13, | 824,14, | 824,15, | 824,16, | 824,17, | 824,18, | 824,19, | 824,20, | 824,21, | 824,22, | 824,23, | 824,24, | 824,25, | 824,26, | 824,27, | 824,28, | 824,29, | 824,30, | 824,31, | 824,32, | 824,33, | 824,34, | 824,35, | 824,36, | 824,37, | 824,38, | 824,39, | 824,40, | 824,41, | 824,42, | 824,43, | 824,44, | 824,45, | 824,46, | 824,47, | 824,48, | 824,49, | 824,50, | 824,51, | 824,52, | 824,53, | 824,54, | 824,55, | 824,56, | 824,57, | 824,58, | 824,59, | 824,60, | 824,61, | 824,62, | 824,63, | 824,64, | 824,65, | 824,66, | 824,67, | 824,68, | 824,69, | 824,70, | 824,71, | 824,72, | 824,73, | 824,74, | 824,75, | 824,76, | 824,77, | 824,78, | 824,79, | 824,80, | 824,81, | 824,82, | 824,83, | 824,84, | 824,85, | 825,1, | 825,2, | 825,3, | 825,4, | 825,5, | 825,6, | 825,7, | 825,8, | 825,9, | 825,10, | 825,11, | 825,12, | 825,13, | 825,14, | 825,15, | 825,16, | 825,17, | 825,18, | 825,19, | 825,20, | 825,21, | 825,22, | 825,23, | 825,24, | 825,25, | 825,26, | 825,27, | 825,28, | 825,29, | 825,30, | 825,31, | 825,32, | 825,33, | 825,34, | 825,35, | 825,36, | 825,37, | 825,38, | 825,39, | 825,40, | 825,41, | 825,42, | 825,43, | 825,44, | 825,45, | 825,46, | 825,47, | 825,48, | 825,49, | 825,50, | 825,51, | 825,52, | 825,53, | 825,54, | 825,55, | 825,56, | 825,57, | 825,58, | 825,59, | 825,60, | 825,61, | 825,62, | 825,63, | 825,64, | 825,65, | 825,66, | 825,67, | 825,68, | 825,69, | 825,70, | 825,71, | 825,72, | 825,73, | 825,74, | 825,75, | 825,76, | 825,77, | 825,78, | 825,79, | 825,80, | 825,81, | 825,82, | 825,83, | 825,84, | 825,85, | 826,1, | 826,2, | 826,3, | 826,4, | 826,5, | 826,6, | 826,7, | 826,8, | 826,9, | 826,10, | 826,11, | 826,12, | 826,13, | 826,14, | 826,15, | 826,16, | 826,17, | 826,18, | 826,19, | 826,20, | 826,21, | 826,22, | 826,23, | 826,24, | 826,25, | 826,26, | 826,27, | 826,28, | 826,29, | 826,30, | 826,31, | 826,32, | 826,33, | 826,34, | 826,35, | 826,36, | 826,37, | 826,38, | 826,39, | 826,40, | 826,41, | 826,42, | 826,43, | 826,44, | 826,45, | 826,46, | 826,47, | 826,48, | 826,49, | 826,50, | 826,51, | 826,52, | 826,53, | 826,54, | 826,55, | 826,56, | 826,57, | 826,58, | 826,59, | 826,60, | 826,61, | 826,62, | 826,63, | 826,64, | 826,65, | 826,66, | 826,67, | 826,68, | 826,69, | 826,70, | 826,71, | 826,72, | 826,73, | 826,74, | 826,75, | 826,76, | 826,77, | 826,78, | 826,79, | 826,80, | 826,81, | 826,82, | 826,83, | 826,84, | 826,85, | 827,1, | 827,2, | 827,3, | 827,4, | 827,5, | 827,6, | 827,7, | 827,8, | 827,9, | 827,10, | 827,11, | 827,12, | 827,13, | 827,14, | 827,15, | 827,16, | 827,17, | 827,18, | 827,19, | 827,20, | 827,21, | 827,22, | 827,23, | 827,24, | 827,25, | 827,26, | 827,27, | 827,28, | 827,29, | 827,30, | 827,31, | 827,32, | 827,33, | 827,34, | 827,35, | 827,36, | 827,37, | 827,38, | 827,39, | 827,40, | 827,41, | 827,42, | 827,43, | 827,44, | 827,45, | 827,46, | 827,47, | 827,48, | 827,49, | 827,50, | 827,51, | 827,52, | 827,53, | 827,54, | 827,55, | 827,56, | 827,57, | 827,58, | 827,59, | 827,60, | 827,61, | 827,62, | 827,63, | 827,64, | 827,65, | 827,66, | 827,67, | 827,68, | 827,69, | 827,70, | 827,71, | 827,72, | 827,73, | 827,74, | 827,75, | 827,76, | 827,77, | 827,78, | 827,79, | 827,80, | 827,81, | 827,82, | 827,83, | 827,84, | 827,85, | 828,1, | 828,2, | 828,3, | 828,4, | 828,5, | 828,6, | 828,7, | 828,8, | 828,9, | 828,10, | 828,11, | 828,12, | 828,13, | 828,14, | 828,15, | 828,16, | 828,17, | 828,18, | 828,19, | 828,20, | 828,21, | 828,22, | 828,23, | 828,24, | 828,25, | 828,26, | 828,27, | 828,28, | 828,29, | 828,30, | 828,31, | 828,32, | 828,33, | 828,34, | 828,35, | 828,36, | 828,37, | 828,38, | 828,39, | 828,40, | 828,41, | 828,42, | 828,43, | 828,44, | 828,45, | 828,46, | 828,47, | 828,48, | 828,49, | 828,50, | 828,51, | 828,52, | 828,53, | 828,54, | 828,55, | 828,56, | 828,57, | 828,58, | 828,59, | 828,60, | 828,61, | 828,62, | 828,63, | 828,64, | 828,65, | 828,66, | 828,67, | 828,68, | 828,69, | 828,70, | 828,71, | 828,72, | 828,73, | 828,74, | 828,75, | 828,76, | 828,77, | 828,78, | 828,79, | 828,80, | 828,81, | 828,82, | 828,83, | 828,84, | 828,85, | 829,1, | 829,2, | 829,3, | 829,4, | 829,5, | 829,6, | 829,7, | 829,8, | 829,9, | 829,10, | 829,11, | 829,12, | 829,13, | 829,14, | 829,15, | 829,16, | 829,17, | 829,18, | 829,19, | 829,20, | 829,21, | 829,22, | 829,23, | 829,24, | 829,25, | 829,26, | 829,27, | 829,28, | 829,29, | 829,30, | 829,31, | 829,32, | 829,33, | 829,34, | 829,35, | 829,36, | 829,37, | 829,38, | 829,39, | 829,40, | 829,41, | 829,42, | 829,43, | 829,44, | 829,45, | 829,46, | 829,47, | 829,48, | 829,49, | 829,50, | 829,51, | 829,52, | 829,53, | 829,54, | 829,55, | 829,56, | 829,57, | 829,58, | 829,59, | 829,60, | 829,61, | 829,62, | 829,63, | 829,64, | 829,65, | 829,66, | 829,67, | 829,68, | 829,69, | 829,70, | 829,71, | 829,72, | 829,73, | 829,74, | 829,75, | 829,76, | 829,77, | 829,78, | 829,79, | 829,80, | 829,81, | 829,82, | 829,83, | 829,84, | 829,85, | 830,1, | 830,2, | 830,3, | 830,4, | 830,5, | 830,6, | 830,7, | 830,8, | 830,9, | 830,10, | 830,11, | 830,12, | 830,13, | 830,14, | 830,15, | 830,16, | 830,17, | 830,18, | 830,19, | 830,20, | 830,21, | 830,22, | 830,23, | 830,24, | 830,25, | 830,26, | 830,27, | 830,28, | 830,29, | 830,30, | 830,31, | 830,32, | 830,33, | 830,34, | 830,35, | 830,36, | 830,37, | 830,38, | 830,39, | 830,40, | 830,41, | 830,42, | 830,43, | 830,44, | 830,45, | 830,46, | 830,47, | 830,48, | 830,49, | 830,50, | 830,51, | 830,52, | 830,53, | 830,54, | 830,55, | 830,56, | 830,57, | 830,58, | 830,59, | 830,60, | 830,61, | 830,62, | 830,63, | 830,64, | 830,65, | 830,66, | 830,67, | 830,68, | 830,69, | 830,70, | 830,71, | 830,72, | 830,73, | 830,74, | 830,75, | 830,76, | 830,77, | 830,78, | 830,79, | 830,80, | 830,81, | 830,82, | 830,83, | 830,84, | 830,85, | 831,1, | 831,2, | 831,3, | 831,4, | 831,5, | 831,6, | 831,7, | 831,8, | 831,9, | 831,10, | 831,11, | 831,12, | 831,13, | 831,14, | 831,15, | 831,16, | 831,17, | 831,18, | 831,19, | 831,20, | 831,21, | 831,22, | 831,23, | 831,24, | 831,25, | 831,26, | 831,27, | 831,28, | 831,29, | 831,30, | 831,31, | 831,32, | 831,33, | 831,34, | 831,35, | 831,36, | 831,37, | 831,38, | 831,39, | 831,40, | 831,41, | 831,42, | 831,43, | 831,44, | 831,45, | 831,46, | 831,47, | 831,48, | 831,49, | 831,50, | 831,51, | 831,52, | 831,53, | 831,54, | 831,55, | 831,56, | 831,57, | 831,58, | 831,59, | 831,60, | 831,61, | 831,62, | 831,63, | 831,64, | 831,65, | 831,66, | 831,67, | 831,68, | 831,69, | 831,70, | 831,71, | 831,72, | 831,73, | 831,74, | 831,75, | 831,76, | 831,77, | 831,78, | 831,79, | 831,80, | 831,81, | 831,82, | 831,83, | 831,84, | 831,85, | 832,1, | 832,2, | 832,3, | 832,4, | 832,5, | 832,6, | 832,7, | 832,8, | 832,9, | 832,10, | 832,11, | 832,12, | 832,13, | 832,14, | 832,15, | 832,16, | 832,17, | 832,18, | 832,19, | 832,20, | 832,21, | 832,22, | 832,23, | 832,24, | 832,25, | 832,26, | 832,27, | 832,28, | 832,29, | 832,30, | 832,31, | 832,32, | 832,33, | 832,34, | 832,35, | 832,36, | 832,37, | 832,38, | 832,39, | 832,40, | 832,41, | 832,42, | 832,43, | 832,44, | 832,45, | 832,46, | 832,47, | 832,48, | 832,49, | 832,50, | 832,51, | 832,52, | 832,53, | 832,54, | 832,55, | 832,56, | 832,57, | 832,58, | 832,59, | 832,60, | 832,61, | 832,62, | 832,63, | 832,64, | 832,65, | 832,66, | 832,67, | 832,68, | 832,69, | 832,70, | 832,71, | 832,72, | 832,73, | 832,74, | 832,75, | 832,76, | 832,77, | 832,78, | 832,79, | 832,80, | 832,81, | 832,82, | 832,83, | 832,84, | 832,85, | 833,1, | 833,2, | 833,3, | 833,4, | 833,5, | 833,6, | 833,7, | 833,8, | 833,9, | 833,10, | 833,11, | 833,12, | 833,13, | 833,14, | 833,15, | 833,16, | 833,17, | 833,18, | 833,19, | 833,20, | 833,21, | 833,22, | 833,23, | 833,24, | 833,25, | 833,26, | 833,27, | 833,28, | 833,29, | 833,30, | 833,31, | 833,32, | 833,33, | 833,34, | 833,35, | 833,36, | 833,37, | 833,38, | 833,39, | 833,40, | 833,41, | 833,42, | 833,43, | 833,44, | 833,45, | 833,46, | 833,47, | 833,48, | 833,49, | 833,50, | 833,51, | 833,52, | 833,53, | 833,54, | 833,55, | 833,56, | 833,57, | 833,58, | 833,59, | 833,60, | 833,61, | 833,62, | 833,63, | 833,64, | 833,65, | 833,66, | 833,67, | 833,68, | 833,69, | 833,70, | 833,71, | 833,72, | 833,73, | 833,74, | 833,75, | 833,76, | 833,77, | 833,78, | 833,79, | 833,80, | 833,81, | 833,82, | 833,83, | 833,84, | 833,85, | 834,1, | 834,2, | 834,3, | 834,4, | 834,5, | 834,6, | 834,7, | 834,8, | 834,9, | 834,10, | 834,11, | 834,12, | 834,13, | 834,14, | 834,15, | 834,16, | 834,17, | 834,18, | 834,19, | 834,20, | 834,21, | 834,22, | 834,23, | 834,24, | 834,25, | 834,26, | 834,27, | 834,28, | 834,29, | 834,30, | 834,31, | 834,32, | 834,33, | 834,34, | 834,35, | 834,36, | 834,37, | 834,38, | 834,39, | 834,40, | 834,41, | 834,42, | 834,43, | 834,44, | 834,45, | 834,46, | 834,47, | 834,48, | 834,49, | 834,50, | 834,51, | 834,52, | 834,53, | 834,54, | 834,55, | 834,56, | 834,57, | 834,58, | 834,59, | 834,60, | 834,61, | 834,62, | 834,63, | 834,64, | 834,65, | 834,66, | 834,67, | 834,68, | 834,69, | 834,70, | 834,71, | 834,72, | 834,73, | 834,74, | 834,75, | 834,76, | 834,77, | 834,78, | 834,79, | 834,80, | 834,81, | 834,82, | 834,83, | 834,84, | 834,85, | 835,1, | 835,2, | 835,3, | 835,4, | 835,5, | 835,6, | 835,7, | 835,8, | 835,9, | 835,10, | 835,11, | 835,12, | 835,13, | 835,14, | 835,15, | 835,16, | 835,17, | 835,18, | 835,19, | 835,20, | 835,21, | 835,22, | 835,23, | 835,24, | 835,25, | 835,26, | 835,27, | 835,28, | 835,29, | 835,30, | 835,31, | 835,32, | 835,33, | 835,34, | 835,35, | 835,36, | 835,37, | 835,38, | 835,39, | 835,40, | 835,41, | 835,42, | 835,43, | 835,44, | 835,45, | 835,46, | 835,47, | 835,48, | 835,49, | 835,50, | 835,51, | 835,52, | 835,53, | 835,54, | 835,55, | 835,56, | 835,57, | 835,58, | 835,59, | 835,60, | 835,61, | 835,62, | 835,63, | 835,64, | 835,65, | 835,66, | 835,67, | 835,68, | 835,69, | 835,70, | 835,71, | 835,72, | 835,73, | 835,74, | 835,75, | 835,76, | 835,77, | 835,78, | 835,79, | 835,80, | 835,81, | 835,82, | 835,83, | 835,84, | 835,85, | 836,1, | 836,2, | 836,3, | 836,4, | 836,5, | 836,6, | 836,7, | 836,8, | 836,9, | 836,10, | 836,11, | 836,12, | 836,13, | 836,14, | 836,15, | 836,16, | 836,17, | 836,18, | 836,19, | 836,20, | 836,21, | 836,22, | 836,23, | 836,24, | 836,25, | 836,26, | 836,27, | 836,28, | 836,29, | 836,30, | 836,31, | 836,32, | 836,33, | 836,34, | 836,35, | 836,36, | 836,37, | 836,38, | 836,39, | 836,40, | 836,41, | 836,42, | 836,43, | 836,44, | 836,45, | 836,46, | 836,47, | 836,48, | 836,49, | 836,50, | 836,51, | 836,52, | 836,53, | 836,54, | 836,55, | 836,56, | 836,57, | 836,58, | 836,59, | 836,60, | 836,61, | 836,62, | 836,63, | 836,64, | 836,65, | 836,66, | 836,67, | 836,68, | 836,69, | 836,70, | 836,71, | 836,72, | 836,73, | 836,74, | 836,75, | 836,76, | 836,77, | 836,78, | 836,79, | 836,80, | 836,81, | 836,82, | 836,83, | 836,84, | 836,85, | 837,1, | 837,2, | 837,3, | 837,4, | 837,5, | 837,6, | 837,7, | 837,8, | 837,9, | 837,10, | 837,11, | 837,12, | 837,13, | 837,14, | 837,15, | 837,16, | 837,17, | 837,18, | 837,19, | 837,20, | 837,21, | 837,22, | 837,23, | 837,24, | 837,25, | 837,26, | 837,27, | 837,28, | 837,29, | 837,30, | 837,31, | 837,32, | 837,33, | 837,34, | 837,35, | 837,36, | 837,37, | 837,38, | 837,39, | 837,40, | 837,41, | 837,42, | 837,43, | 837,44, | 837,45, | 837,46, | 837,47, | 837,48, | 837,49, | 837,50, | 837,51, | 837,52, | 837,53, | 837,54, | 837,55, | 837,56, | 837,57, | 837,58, | 837,59, | 837,60, | 837,61, | 837,62, | 837,63, | 837,64, | 837,65, | 837,66, | 837,67, | 837,68, | 837,69, | 837,70, | 837,71, | 837,72, | 837,73, | 837,74, | 837,75, | 837,76, | 837,77, | 837,78, | 837,79, | 837,80, | 837,81, | 837,82, | 837,83, | 837,84, | 837,85, | 838,1, | 838,2, | 838,3, | 838,4, | 838,5, | 838,6, | 838,7, | 838,8, | 838,9, | 838,10, | 838,11, | 838,12, | 838,13, | 838,14, | 838,15, | 838,16, | 838,17, | 838,18, | 838,19, | 838,20, | 838,21, | 838,22, | 838,23, | 838,24, | 838,25, | 838,26, | 838,27, | 838,28, | 838,29, | 838,30, | 838,31, | 838,32, | 838,33, | 838,34, | 838,35, | 838,36, | 838,37, | 838,38, | 838,39, | 838,40, | 838,41, | 838,42, | 838,43, | 838,44, | 838,45, | 838,46, | 838,47, | 838,48, | 838,49, | 838,50, | 838,51, | 838,52, | 838,53, | 838,54, | 838,55, | 838,56, | 838,57, | 838,58, | 838,59, | 838,60, | 838,61, | 838,62, | 838,63, | 838,64, | 838,65, | 838,66, | 838,67, | 838,68, | 838,69, | 838,70, | 838,71, | 838,72, | 838,73, | 838,74, | 838,75, | 838,76, | 838,77, | 838,78, | 838,79, | 838,80, | 838,81, | 838,82, | 838,83, | 838,84, | 838,85, | 839,1, | 839,2, | 839,3, | 839,4, | 839,5, | 839,6, | 839,7, | 839,8, | 839,9, | 839,10, | 839,11, | 839,12, | 839,13, | 839,14, | 839,15, | 839,16, | 839,17, | 839,18, | 839,19, | 839,20, | 839,21, | 839,22, | 839,23, | 839,24, | 839,25, | 839,26, | 839,27, | 839,28, | 839,29, | 839,30, | 839,31, | 839,32, | 839,33, | 839,34, | 839,35, | 839,36, | 839,37, | 839,38, | 839,39, | 839,40, | 839,41, | 839,42, | 839,43, | 839,44, | 839,45, | 839,46, | 839,47, | 839,48, | 839,49, | 839,50, | 839,51, | 839,52, | 839,53, | 839,54, | 839,55, | 839,56, | 839,57, | 839,58, | 839,59, | 839,60, | 839,61, | 839,62, | 839,63, | 839,64, | 839,65, | 839,66, | 839,67, | 839,68, | 839,69, | 839,70, | 839,71, | 839,72, | 839,73, | 839,74, | 839,75, | 839,76, | 839,77, | 839,78, | 839,79, | 839,80, | 839,81, | 839,82, | 839,83, | 839,84, | 839,85, | 840,1, | 840,2, | 840,3, | 840,4, | 840,5, | 840,6, | 840,7, | 840,8, | 840,9, | 840,10, | 840,11, | 840,12, | 840,13, | 840,14, | 840,15, | 840,16, | 840,17, | 840,18, | 840,19, | 840,20, | 840,21, | 840,22, | 840,23, | 840,24, | 840,25, | 840,26, | 840,27, | 840,28, | 840,29, | 840,30, | 840,31, | 840,32, | 840,33, | 840,34, | 840,35, | 840,36, | 840,37, | 840,38, | 840,39, | 840,40, | 840,41, | 840,42, | 840,43, | 840,44, | 840,45, | 840,46, | 840,47, | 840,48, | 840,49, | 840,50, | 840,51, | 840,52, | 840,53, | 840,54, | 840,55, | 840,56, | 840,57, | 840,58, | 840,59, | 840,60, | 840,61, | 840,62, | 840,63, | 840,64, | 840,65, | 840,66, | 840,67, | 840,68, | 840,69, | 840,70, | 840,71, | 840,72, | 840,73, | 840,74, | 840,75, | 840,76, | 840,77, | 840,78, | 840,79, | 840,80, | 840,81, | 840,82, | 840,83, | 840,84, | 840,85, | 841,1, | 841,2, | 841,3, | 841,4, | 841,5, | 841,6, | 841,7, | 841,8, | 841,9, | 841,10, | 841,11, | 841,12, | 841,13, | 841,14, | 841,15, | 841,16, | 841,17, | 841,18, | 841,19, | 841,20, | 841,21, | 841,22, | 841,23, | 841,24, | 841,25, | 841,26, | 841,27, | 841,28, | 841,29, | 841,30, | 841,31, | 841,32, | 841,33, | 841,34, | 841,35, | 841,36, | 841,37, | 841,38, | 841,39, | 841,40, | 841,41, | 841,42, | 841,43, | 841,44, | 841,45, | 841,46, | 841,47, | 841,48, | 841,49, | 841,50, | 841,51, | 841,52, | 841,53, | 841,54, | 841,55, | 841,56, | 841,57, | 841,58, | 841,59, | 841,60, | 841,61, | 841,62, | 841,63, | 841,64, | 841,65, | 841,66, | 841,67, | 841,68, | 841,69, | 841,70, | 841,71, | 841,72, | 841,73, | 841,74, | 841,75, | 841,76, | 841,77, | 841,78, | 841,79, | 841,80, | 841,81, | 841,82, | 841,83, | 841,84, | 841,85, | 842,1, | 842,2, | 842,3, | 842,4, | 842,5, | 842,6, | 842,7, | 842,8, | 842,9, | 842,10, | 842,11, | 842,12, | 842,13, | 842,14, | 842,15, | 842,16, | 842,17, | 842,18, | 842,19, | 842,20, | 842,21, | 842,22, | 842,23, | 842,24, | 842,25, | 842,26, | 842,27, | 842,28, | 842,29, | 842,30, | 842,31, | 842,32, | 842,33, | 842,34, | 842,35, | 842,36, | 842,37, | 842,38, | 842,39, | 842,40, | 842,41, | 842,42, | 842,43, | 842,44, | 842,45, | 842,46, | 842,47, | 842,48, | 842,49, | 842,50, | 842,51, | 842,52, | 842,53, | 842,54, | 842,55, | 842,56, | 842,57, | 842,58, | 842,59, | 842,60, | 842,61, | 842,62, | 842,63, | 842,64, | 842,65, | 842,66, | 842,67, | 842,68, | 842,69, | 842,70, | 842,71, | 842,72, | 842,73, | 842,74, | 842,75, | 842,76, | 842,77, | 842,78, | 842,79, | 842,80, | 842,81, | 842,82, | 842,83, | 842,84, | 842,85, | 843,1, | 843,2, | 843,3, | 843,4, | 843,5, | 843,6, | 843,7, | 843,8, | 843,9, | 843,10, | 843,11, | 843,12, | 843,13, | 843,14, | 843,15, | 843,16, | 843,17, | 843,18, | 843,19, | 843,20, | 843,21, | 843,22, | 843,23, | 843,24, | 843,25, | 843,26, | 843,27, | 843,28, | 843,29, | 843,30, | 843,31, | 843,32, | 843,33, | 843,34, | 843,35, | 843,36, | 843,37, | 843,38, | 843,39, | 843,40, | 843,41, | 843,42, | 843,43, | 843,44, | 843,45, | 843,46, | 843,47, | 843,48, | 843,49, | 843,50, | 843,51, | 843,52, | 843,53, | 843,54, | 843,55, | 843,56, | 843,57, | 843,58, | 843,59, | 843,60, | 843,61, | 843,62, | 843,63, | 843,64, | 843,65, | 843,66, | 843,67, | 843,68, | 843,69, | 843,70, | 843,71, | 843,72, | 843,73, | 843,74, | 843,75, | 843,76, | 843,77, | 843,78, | 843,79, | 843,80, | 843,81, | 843,82, | 843,83, | 843,84, | 843,85, | 844,1, | 844,2, | 844,3, | 844,4, | 844,5, | 844,6, | 844,7, | 844,8, | 844,9, | 844,10, | 844,11, | 844,12, | 844,13, | 844,14, | 844,15, | 844,16, | 844,17, | 844,18, | 844,19, | 844,20, | 844,21, | 844,22, | 844,23, | 844,24, | 844,25, | 844,26, | 844,27, | 844,28, | 844,29, | 844,30, | 844,31, | 844,32, | 844,33, | 844,34, | 844,35, | 844,36, | 844,37, | 844,38, | 844,39, | 844,40, | 844,41, | 844,42, | 844,43, | 844,44, | 844,45, | 844,46, | 844,47, | 844,48, | 844,49, | 844,50, | 844,51, | 844,52, | 844,53, | 844,54, | 844,55, | 844,56, | 844,57, | 844,58, | 844,59, | 844,60, | 844,61, | 844,62, | 844,63, | 844,64, | 844,65, | 844,66, | 844,67, | 844,68, | 844,69, | 844,70, | 844,71, | 844,72, | 844,73, | 844,74, | 844,75, | 844,76, | 844,77, | 844,78, | 844,79, | 844,80, | 844,81, | 844,82, | 844,83, | 844,84, | 844,85, | 845,1, | 845,2, | 845,3, | 845,4, | 845,5, | 845,6, | 845,7, | 845,8, | 845,9, | 845,10, | 845,11, | 845,12, | 845,13, | 845,14, | 845,15, | 845,16, | 845,17, | 845,18, | 845,19, | 845,20, | 845,21, | 845,22, | 845,23, | 845,24, | 845,25, | 845,26, | 845,27, | 845,28, | 845,29, | 845,30, | 845,31, | 845,32, | 845,33, | 845,34, | 845,35, | 845,36, | 845,37, | 845,38, | 845,39, | 845,40, | 845,41, | 845,42, | 845,43, | 845,44, | 845,45, | 845,46, | 845,47, | 845,48, | 845,49, | 845,50, | 845,51, | 845,52, | 845,53, | 845,54, | 845,55, | 845,56, | 845,57, | 845,58, | 845,59, | 845,60, | 845,61, | 845,62, | 845,63, | 845,64, | 845,65, | 845,66, | 845,67, | 845,68, | 845,69, | 845,70, | 845,71, | 845,72, | 845,73, | 845,74, | 845,75, | 845,76, | 845,77, | 845,78, | 845,79, | 845,80, | 845,81, | 845,82, | 845,83, | 845,84, | 845,85, | 846,1, | 846,2, | 846,3, | 846,4, | 846,5, | 846,6, | 846,7, | 846,8, | 846,9, | 846,10, | 846,11, | 846,12, | 846,13, | 846,14, | 846,15, | 846,16, | 846,17, | 846,18, | 846,19, | 846,20, | 846,21, | 846,22, | 846,23, | 846,24, | 846,25, | 846,26, | 846,27, | 846,28, | 846,29, | 846,30, | 846,31, | 846,32, | 846,33, | 846,34, | 846,35, | 846,36, | 846,37, | 846,38, | 846,39, | 846,40, | 846,41, | 846,42, | 846,43, | 846,44, | 846,45, | 846,46, | 846,47, | 846,48, | 846,49, | 846,50, | 846,51, | 846,52, | 846,53, | 846,54, | 846,55, | 846,56, | 846,57, | 846,58, | 846,59, | 846,60, | 846,61, | 846,62, | 846,63, | 846,64, | 846,65, | 846,66, | 846,67, | 846,68, | 846,69, | 846,70, | 846,71, | 846,72, | 846,73, | 846,74, | 846,75, | 846,76, | 846,77, | 846,78, | 846,79, | 846,80, | 846,81, | 846,82, | 846,83, | 846,84, | 846,85, | 847,1, | 847,2, | 847,3, | 847,4, | 847,5, | 847,6, | 847,7, | 847,8, | 847,9, | 847,10, | 847,11, | 847,12, | 847,13, | 847,14, | 847,15, | 847,16, | 847,17, | 847,18, | 847,19, | 847,20, | 847,21, | 847,22, | 847,23, | 847,24, | 847,25, | 847,26, | 847,27, | 847,28, | 847,29, | 847,30, | 847,31, | 847,32, | 847,33, | 847,34, | 847,35, | 847,36, | 847,37, | 847,38, | 847,39, | 847,40, | 847,41, | 847,42, | 847,43, | 847,44, | 847,45, | 847,46, | 847,47, | 847,48, | 847,49, | 847,50, | 847,51, | 847,52, | 847,53, | 847,54, | 847,55, | 847,56, | 847,57, | 847,58, | 847,59, | 847,60, | 847,61, | 847,62, | 847,63, | 847,64, | 847,65, | 847,66, | 847,67, | 847,68, | 847,69, | 847,70, | 847,71, | 847,72, | 847,73, | 847,74, | 847,75, | 847,76, | 847,77, | 847,78, | 847,79, | 847,80, | 847,81, | 847,82, | 847,83, | 847,84, | 847,85, | 848,1, | 848,2, | 848,3, | 848,4, | 848,5, | 848,6, | 848,7, | 848,8, | 848,9, | 848,10, | 848,11, | 848,12, | 848,13, | 848,14, | 848,15, | 848,16, | 848,17, | 848,18, | 848,19, | 848,20, | 848,21, | 848,22, | 848,23, | 848,24, | 848,25, | 848,26, | 848,27, | 848,28, | 848,29, | 848,30, | 848,31, | 848,32, | 848,33, | 848,34, | 848,35, | 848,36, | 848,37, | 848,38, | 848,39, | 848,40, | 848,41, | 848,42, | 848,43, | 848,44, | 848,45, | 848,46, | 848,47, | 848,48, | 848,49, | 848,50, | 848,51, | 848,52, | 848,53, | 848,54, | 848,55, | 848,56, | 848,57, | 848,58, | 848,59, | 848,60, | 848,61, | 848,62, | 848,63, | 848,64, | 848,65, | 848,66, | 848,67, | 848,68, | 848,69, | 848,70, | 848,71, | 848,72, | 848,73, | 848,74, | 848,75, | 848,76, | 848,77, | 848,78, | 848,79, | 848,80, | 848,81, | 848,82, | 848,83, | 848,84, | 848,85, | 849,1, | 849,2, | 849,3, | 849,4, | 849,5, | 849,6, | 849,7, | 849,8, | 849,9, | 849,10, | 849,11, | 849,12, | 849,13, | 849,14, | 849,15, | 849,16, | 849,17, | 849,18, | 849,19, | 849,20, | 849,21, | 849,22, | 849,23, | 849,24, | 849,25, | 849,26, | 849,27, | 849,28, | 849,29, | 849,30, | 849,31, | 849,32, | 849,33, | 849,34, | 849,35, | 849,36, | 849,37, | 849,38, | 849,39, | 849,40, | 849,41, | 849,42, | 849,43, | 849,44, | 849,45, | 849,46, | 849,47, | 849,48, | 849,49, | 849,50, | 849,51, | 849,52, | 849,53, | 849,54, | 849,55, | 849,56, | 849,57, | 849,58, | 849,59, | 849,60, | 849,61, | 849,62, | 849,63, | 849,64, | 849,65, | 849,66, | 849,67, | 849,68, | 849,69, | 849,70, | 849,71, | 849,72, | 849,73, | 849,74, | 849,75, | 849,76, | 849,77, | 849,78, | 849,79, | 849,80, | 849,81, | 849,82, | 849,83, | 849,84, | 849,85, | 850,1, | 850,2, | 850,3, | 850,4, | 850,5, | 850,6, | 850,7, | 850,8, | 850,9, | 850,10, | 850,11, | 850,12, | 850,13, | 850,14, | 850,15, | 850,16, | 850,17, | 850,18, | 850,19, | 850,20, | 850,21, | 850,22, | 850,23, | 850,24, | 850,25, | 850,26, | 850,27, | 850,28, | 850,29, | 850,30, | 850,31, | 850,32, | 850,33, | 850,34, | 850,35, | 850,36, | 850,37, | 850,38, | 850,39, | 850,40, | 850,41, | 850,42, | 850,43, | 850,44, | 850,45, | 850,46, | 850,47, | 850,48, | 850,49, | 850,50, | 850,51, | 850,52, | 850,53, | 850,54, | 850,55, | 850,56, | 850,57, | 850,58, | 850,59, | 850,60, | 850,61, | 850,62, | 850,63, | 850,64, | 850,65, | 850,66, | 850,67, | 850,68, | 850,69, | 850,70, | 850,71, | 850,72, | 850,73, | 850,74, | 850,75, | 850,76, | 850,77, | 850,78, | 850,79, | 850,80, | 850,81, | 850,82, | 850,83, | 850,84, | 850,85, | 851,1, | 851,2, | 851,3, | 851,4, | 851,5, | 851,6, | 851,7, | 851,8, | 851,9, | 851,10, | 851,11, | 851,12, | 851,13, | 851,14, | 851,15, | 851,16, | 851,17, | 851,18, | 851,19, | 851,20, | 851,21, | 851,22, | 851,23, | 851,24, | 851,25, | 851,26, | 851,27, | 851,28, | 851,29, | 851,30, | 851,31, | 851,32, | 851,33, | 851,34, | 851,35, | 851,36, | 851,37, | 851,38, | 851,39, | 851,40, | 851,41, | 851,42, | 851,43, | 851,44, | 851,45, | 851,46, | 851,47, | 851,48, | 851,49, | 851,50, | 851,51, | 851,52, | 851,53, | 851,54, | 851,55, | 851,56, | 851,57, | 851,58, | 851,59, | 851,60, | 851,61, | 851,62, | 851,63, | 851,64, | 851,65, | 851,66, | 851,67, | 851,68, | 851,69, | 851,70, | 851,71, | 851,72, | 851,73, | 851,74, | 851,75, | 851,76, | 851,77, | 851,78, | 851,79, | 851,80, | 851,81, | 851,82, | 851,83, | 851,84, | 851,85, | 852,1, | 852,2, | 852,3, | 852,4, | 852,5, | 852,6, | 852,7, | 852,8, | 852,9, | 852,10, | 852,11, | 852,12, | 852,13, | 852,14, | 852,15, | 852,16, | 852,17, | 852,18, | 852,19, | 852,20, | 852,21, | 852,22, | 852,23, | 852,24, | 852,25, | 852,26, | 852,27, | 852,28, | 852,29, | 852,30, | 852,31, | 852,32, | 852,33, | 852,34, | 852,35, | 852,36, | 852,37, | 852,38, | 852,39, | 852,40, | 852,41, | 852,42, | 852,43, | 852,44, | 852,45, | 852,46, | 852,47, | 852,48, | 852,49, | 852,50, | 852,51, | 852,52, | 852,53, | 852,54, | 852,55, | 852,56, | 852,57, | 852,58, | 852,59, | 852,60, | 852,61, | 852,62, | 852,63, | 852,64, | 852,65, | 852,66, | 852,67, | 852,68, | 852,69, | 852,70, | 852,71, | 852,72, | 852,73, | 852,74, | 852,75, | 852,76, | 852,77, | 852,78, | 852,79, | 852,80, | 852,81, | 852,82, | 852,83, | 852,84, | 852,85, | 853,1, | 853,2, | 853,3, | 853,4, | 853,5, | 853,6, | 853,7, | 853,8, | 853,9, | 853,10, | 853,11, | 853,12, | 853,13, | 853,14, | 853,15, | 853,16, | 853,17, | 853,18, | 853,19, | 853,20, | 853,21, | 853,22, | 853,23, | 853,24, | 853,25, | 853,26, | 853,27, | 853,28, | 853,29, | 853,30, | 853,31, | 853,32, | 853,33, | 853,34, | 853,35, | 853,36, | 853,37, | 853,38, | 853,39, | 853,40, | 853,41, | 853,42, | 853,43, | 853,44, | 853,45, | 853,46, | 853,47, | 853,48, | 853,49, | 853,50, | 853,51, | 853,52, | 853,53, | 853,54, | 853,55, | 853,56, | 853,57, | 853,58, | 853,59, | 853,60, | 853,61, | 853,62, | 853,63, | 853,64, | 853,65, | 853,66, | 853,67, | 853,68, | 853,69, | 853,70, | 853,71, | 853,72, | 853,73, | 853,74, | 853,75, | 853,76, | 853,77, | 853,78, | 853,79, | 853,80, | 853,81, | 853,82, | 853,83, | 853,84, | 853,85, | 854,1, | 854,2, | 854,3, | 854,4, | 854,5, | 854,6, | 854,7, | 854,8, | 854,9, | 854,10, | 854,11, | 854,12, | 854,13, | 854,14, | 854,15, | 854,16, | 854,17, | 854,18, | 854,19, | 854,20, | 854,21, | 854,22, | 854,23, | 854,24, | 854,25, | 854,26, | 854,27, | 854,28, | 854,29, | 854,30, | 854,31, | 854,32, | 854,33, | 854,34, | 854,35, | 854,36, | 854,37, | 854,38, | 854,39, | 854,40, | 854,41, | 854,42, | 854,43, | 854,44, | 854,45, | 854,46, | 854,47, | 854,48, | 854,49, | 854,50, | 854,51, | 854,52, | 854,53, | 854,54, | 854,55, | 854,56, | 854,57, | 854,58, | 854,59, | 854,60, | 854,61, | 854,62, | 854,63, | 854,64, | 854,65, | 854,66, | 854,67, | 854,68, | 854,69, | 854,70, | 854,71, | 854,72, | 854,73, | 854,74, | 854,75, | 854,76, | 854,77, | 854,78, | 854,79, | 854,80, | 854,81, | 854,82, | 854,83, | 854,84, | 854,85, | 855,1, | 855,2, | 855,3, | 855,4, | 855,5, | 855,6, | 855,7, | 855,8, | 855,9, | 855,10, | 855,11, | 855,12, | 855,13, | 855,14, | 855,15, | 855,16, | 855,17, | 855,18, | 855,19, | 855,20, | 855,21, | 855,22, | 855,23, | 855,24, | 855,25, | 855,26, | 855,27, | 855,28, | 855,29, | 855,30, | 855,31, | 855,32, | 855,33, | 855,34, | 855,35, | 855,36, | 855,37, | 855,38, | 855,39, | 855,40, | 855,41, | 855,42, | 855,43, | 855,44, | 855,45, | 855,46, | 855,47, | 855,48, | 855,49, | 855,50, | 855,51, | 855,52, | 855,53, | 855,54, | 855,55, | 855,56, | 855,57, | 855,58, | 855,59, | 855,60, | 855,61, | 855,62, | 855,63, | 855,64, | 855,65, | 855,66, | 855,67, | 855,68, | 855,69, | 855,70, | 855,71, | 855,72, | 855,73, | 855,74, | 855,75, | 855,76, | 855,77, | 855,78, | 855,79, | 855,80, | 855,81, | 855,82, | 855,83, | 855,84, | 855,85, | 856,1, | 856,2, | 856,3, | 856,4, | 856,5, | 856,6, | 856,7, | 856,8, | 856,9, | 856,10, | 856,11, | 856,12, | 856,13, | 856,14, | 856,15, | 856,16, | 856,17, | 856,18, | 856,19, | 856,20, | 856,21, | 856,22, | 856,23, | 856,24, | 856,25, | 856,26, | 856,27, | 856,28, | 856,29, | 856,30, | 856,31, | 856,32, | 856,33, | 856,34, | 856,35, | 856,36, | 856,37, | 856,38, | 856,39, | 856,40, | 856,41, | 856,42, | 856,43, | 856,44, | 856,45, | 856,46, | 856,47, | 856,48, | 856,49, | 856,50, | 856,51, | 856,52, | 856,53, | 856,54, | 856,55, | 856,56, | 856,57, | 856,58, | 856,59, | 856,60, | 856,61, | 856,62, | 856,63, | 856,64, | 856,65, | 856,66, | 856,67, | 856,68, | 856,69, | 856,70, | 856,71, | 856,72, | 856,73, | 856,74, | 856,75, | 856,76, | 856,77, | 856,78, | 856,79, | 856,80, | 856,81, | 856,82, | 856,83, | 856,84, | 856,85, | 857,1, | 857,2, | 857,3, | 857,4, | 857,5, | 857,6, | 857,7, | 857,8, | 857,9, | 857,10, | 857,11, | 857,12, | 857,13, | 857,14, | 857,15, | 857,16, | 857,17, | 857,18, | 857,19, | 857,20, | 857,21, | 857,22, | 857,23, | 857,24, | 857,25, | 857,26, | 857,27, | 857,28, | 857,29, | 857,30, | 857,31, | 857,32, | 857,33, | 857,34, | 857,35, | 857,36, | 857,37, | 857,38, | 857,39, | 857,40, | 857,41, | 857,42, | 857,43, | 857,44, | 857,45, | 857,46, | 857,47, | 857,48, | 857,49, | 857,50, | 857,51, | 857,52, | 857,53, | 857,54, | 857,55, | 857,56, | 857,57, | 857,58, | 857,59, | 857,60, | 857,61, | 857,62, | 857,63, | 857,64, | 857,65, | 857,66, | 857,67, | 857,68, | 857,69, | 857,70, | 857,71, | 857,72, | 857,73, | 857,74, | 857,75, | 857,76, | 857,77, | 857,78, | 857,79, | 857,80, | 857,81, | 857,82, | 857,83, | 857,84, | 857,85, | 858,1, | 858,2, | 858,3, | 858,4, | 858,5, | 858,6, | 858,7, | 858,8, | 858,9, | 858,10, | 858,11, | 858,12, | 858,13, | 858,14, | 858,15, | 858,16, | 858,17, | 858,18, | 858,19, | 858,20, | 858,21, | 858,22, | 858,23, | 858,24, | 858,25, | 858,26, | 858,27, | 858,28, | 858,29, | 858,30, | 858,31, | 858,32, | 858,33, | 858,34, | 858,35, | 858,36, | 858,37, | 858,38, | 858,39, | 858,40, | 858,41, | 858,42, | 858,43, | 858,44, | 858,45, | 858,46, | 858,47, | 858,48, | 858,49, | 858,50, | 858,51, | 858,52, | 858,53, | 858,54, | 858,55, | 858,56, | 858,57, | 858,58, | 858,59, | 858,60, | 858,61, | 858,62, | 858,63, | 858,64, | 858,65, | 858,66, | 858,67, | 858,68, | 858,69, | 858,70, | 858,71, | 858,72, | 858,73, | 858,74, | 858,75, | 858,76, | 858,77, | 858,78, | 858,79, | 858,80, | 858,81, | 858,82, | 858,83, | 858,84, | 858,85, | 859,1, | 859,2, | 859,3, | 859,4, | 859,5, | 859,6, | 859,7, | 859,8, | 859,9, | 859,10, | 859,11, | 859,12, | 859,13, | 859,14, | 859,15, | 859,16, | 859,17, | 859,18, | 859,19, | 859,20, | 859,21, | 859,22, | 859,23, | 859,24, | 859,25, | 859,26, | 859,27, | 859,28, | 859,29, | 859,30, | 859,31, | 859,32, | 859,33, | 859,34, | 859,35, | 859,36, | 859,37, | 859,38, | 859,39, | 859,40, | 859,41, | 859,42, | 859,43, | 859,44, | 859,45, | 859,46, | 859,47, | 859,48, | 859,49, | 859,50, | 859,51, | 859,52, | 859,53, | 859,54, | 859,55, | 859,56, | 859,57, | 859,58, | 859,59, | 859,60, | 859,61, | 859,62, | 859,63, | 859,64, | 859,65, | 859,66, | 859,67, | 859,68, | 859,69, | 859,70, | 859,71, | 859,72, | 859,73, | 859,74, | 859,75, | 859,76, | 859,77, | 859,78, | 859,79, | 859,80, | 859,81, | 859,82, | 859,83, | 859,84, | 859,85, | 860,1, | 860,2, | 860,3, | 860,4, | 860,5, | 860,6, | 860,7, | 860,8, | 860,9, | 860,10, | 860,11, | 860,12, | 860,13, | 860,14, | 860,15, | 860,16, | 860,17, | 860,18, | 860,19, | 860,20, | 860,21, | 860,22, | 860,23, | 860,24, | 860,25, | 860,26, | 860,27, | 860,28, | 860,29, | 860,30, | 860,31, | 860,32, | 860,33, | 860,34, | 860,35, | 860,36, | 860,37, | 860,38, | 860,39, | 860,40, | 860,41, | 860,42, | 860,43, | 860,44, | 860,45, | 860,46, | 860,47, | 860,48, | 860,49, | 860,50, | 860,51, | 860,52, | 860,53, | 860,54, | 860,55, | 860,56, | 860,57, | 860,58, | 860,59, | 860,60, | 860,61, | 860,62, | 860,63, | 860,64, | 860,65, | 860,66, | 860,67, | 860,68, | 860,69, | 860,70, | 860,71, | 860,72, | 860,73, | 860,74, | 860,75, | 860,76, | 860,77, | 860,78, | 860,79, | 860,80, | 860,81, | 860,82, | 860,83, | 860,84, | 860,85, | 861,1, | 861,2, | 861,3, | 861,4, | 861,5, | 861,6, | 861,7, | 861,8, | 861,9, | 861,10, | 861,11, | 861,12, | 861,13, | 861,14, | 861,15, | 861,16, | 861,17, | 861,18, | 861,19, | 861,20, | 861,21, | 861,22, | 861,23, | 861,24, | 861,25, | 861,26, | 861,27, | 861,28, | 861,29, | 861,30, | 861,31, | 861,32, | 861,33, | 861,34, | 861,35, | 861,36, | 861,37, | 861,38, | 861,39, | 861,40, | 861,41, | 861,42, | 861,43, | 861,44, | 861,45, | 861,46, | 861,47, | 861,48, | 861,49, | 861,50, | 861,51, | 861,52, | 861,53, | 861,54, | 861,55, | 861,56, | 861,57, | 861,58, | 861,59, | 861,60, | 861,61, | 861,62, | 861,63, | 861,64, | 861,65, | 861,66, | 861,67, | 861,68, | 861,69, | 861,70, | 861,71, | 861,72, | 861,73, | 861,74, | 861,75, | 861,76, | 861,77, | 861,78, | 861,79, | 861,80, | 861,81, | 861,82, | 861,83, | 861,84, | 861,85, | 862,1, | 862,2, | 862,3, | 862,4, | 862,5, | 862,6, | 862,7, | 862,8, | 862,9, | 862,10, | 862,11, | 862,12, | 862,13, | 862,14, | 862,15, | 862,16, | 862,17, | 862,18, | 862,19, | 862,20, | 862,21, | 862,22, | 862,23, | 862,24, | 862,25, | 862,26, | 862,27, | 862,28, | 862,29, | 862,30, | 862,31, | 862,32, | 862,33, | 862,34, | 862,35, | 862,36, | 862,37, | 862,38, | 862,39, | 862,40, | 862,41, | 862,42, | 862,43, | 862,44, | 862,45, | 862,46, | 862,47, | 862,48, | 862,49, | 862,50, | 862,51, | 862,52, | 862,53, | 862,54, | 862,55, | 862,56, | 862,57, | 862,58, | 862,59, | 862,60, | 862,61, | 862,62, | 862,63, | 862,64, | 862,65, | 862,66, | 862,67, | 862,68, | 862,69, | 862,70, | 862,71, | 862,72, | 862,73, | 862,74, | 862,75, | 862,76, | 862,77, | 862,78, | 862,79, | 862,80, | 862,81, | 862,82, | 862,83, | 862,84, | 862,85, | 863,1, | 863,2, | 863,3, | 863,4, | 863,5, | 863,6, | 863,7, | 863,8, | 863,9, | 863,10, | 863,11, | 863,12, | 863,13, | 863,14, | 863,15, | 863,16, | 863,17, | 863,18, | 863,19, | 863,20, | 863,21, | 863,22, | 863,23, | 863,24, | 863,25, | 863,26, | 863,27, | 863,28, | 863,29, | 863,30, | 863,31, | 863,32, | 863,33, | 863,34, | 863,35, | 863,36, | 863,37, | 863,38, | 863,39, | 863,40, | 863,41, | 863,42, | 863,43, | 863,44, | 863,45, | 863,46, | 863,47, | 863,48, | 863,49, | 863,50, | 863,51, | 863,52, | 863,53, | 863,54, | 863,55, | 863,56, | 863,57, | 863,58, | 863,59, | 863,60, | 863,61, | 863,62, | 863,63, | 863,64, | 863,65, | 863,66, | 863,67, | 863,68, | 863,69, | 863,70, | 863,71, | 863,72, | 863,73, | 863,74, | 863,75, | 863,76, | 863,77, | 863,78, | 863,79, | 863,80, | 863,81, | 863,82, | 863,83, | 863,84, | 863,85, | 864,1, | 864,2, | 864,3, | 864,4, | 864,5, | 864,6, | 864,7, | 864,8, | 864,9, | 864,10, | 864,11, | 864,12, | 864,13, | 864,14, | 864,15, | 864,16, | 864,17, | 864,18, | 864,19, | 864,20, | 864,21, | 864,22, | 864,23, | 864,24, | 864,25, | 864,26, | 864,27, | 864,28, | 864,29, | 864,30, | 864,31, | 864,32, | 864,33, | 864,34, | 864,35, | 864,36, | 864,37, | 864,38, | 864,39, | 864,40, | 864,41, | 864,42, | 864,43, | 864,44, | 864,45, | 864,46, | 864,47, | 864,48, | 864,49, | 864,50, | 864,51, | 864,52, | 864,53, | 864,54, | 864,55, | 864,56, | 864,57, | 864,58, | 864,59, | 864,60, | 864,61, | 864,62, | 864,63, | 864,64, | 864,65, | 864,66, | 864,67, | 864,68, | 864,69, | 864,70, | 864,71, | 864,72, | 864,73, | 864,74, | 864,75, | 864,76, | 864,77, | 864,78, | 864,79, | 864,80, | 864,81, | 864,82, | 864,83, | 864,84, | 864,85, | 865,1, | 865,2, | 865,3, | 865,4, | 865,5, | 865,6, | 865,7, | 865,8, | 865,9, | 865,10, | 865,11, | 865,12, | 865,13, | 865,14, | 865,15, | 865,16, | 865,17, | 865,18, | 865,19, | 865,20, | 865,21, | 865,22, | 865,23, | 865,24, | 865,25, | 865,26, | 865,27, | 865,28, | 865,29, | 865,30, | 865,31, | 865,32, | 865,33, | 865,34, | 865,35, | 865,36, | 865,37, | 865,38, | 865,39, | 865,40, | 865,41, | 865,42, | 865,43, | 865,44, | 865,45, | 865,46, | 865,47, | 865,48, | 865,49, | 865,50, | 865,51, | 865,52, | 865,53, | 865,54, | 865,55, | 865,56, | 865,57, | 865,58, | 865,59, | 865,60, | 865,61, | 865,62, | 865,63, | 865,64, | 865,65, | 865,66, | 865,67, | 865,68, | 865,69, | 865,70, | 865,71, | 865,72, | 865,73, | 865,74, | 865,75, | 865,76, | 865,77, | 865,78, | 865,79, | 865,80, | 865,81, | 865,82, | 865,83, | 865,84, | 865,85, | 866,1, | 866,2, | 866,3, | 866,4, | 866,5, | 866,6, | 866,7, | 866,8, | 866,9, | 866,10, | 866,11, | 866,12, | 866,13, | 866,14, | 866,15, | 866,16, | 866,17, | 866,18, | 866,19, | 866,20, | 866,21, | 866,22, | 866,23, | 866,24, | 866,25, | 866,26, | 866,27, | 866,28, | 866,29, | 866,30, | 866,31, | 866,32, | 866,33, | 866,34, | 866,35, | 866,36, | 866,37, | 866,38, | 866,39, | 866,40, | 866,41, | 866,42, | 866,43, | 866,44, | 866,45, | 866,46, | 866,47, | 866,48, | 866,49, | 866,50, | 866,51, | 866,52, | 866,53, | 866,54, | 866,55, | 866,56, | 866,57, | 866,58, | 866,59, | 866,60, | 866,61, | 866,62, | 866,63, | 866,64, | 866,65, | 866,66, | 866,67, | 866,68, | 866,69, | 866,70, | 866,71, | 866,72, | 866,73, | 866,74, | 866,75, | 866,76, | 866,77, | 866,78, | 866,79, | 866,80, | 866,81, | 866,82, | 866,83, | 866,84, | 866,85, | 867,1, | 867,2, | 867,3, | 867,4, | 867,5, | 867,6, | 867,7, | 867,8, | 867,9, | 867,10, | 867,11, | 867,12, | 867,13, | 867,14, | 867,15, | 867,16, | 867,17, | 867,18, | 867,19, | 867,20, | 867,21, | 867,22, | 867,23, | 867,24, | 867,25, | 867,26, | 867,27, | 867,28, | 867,29, | 867,30, | 867,31, | 867,32, | 867,33, | 867,34, | 867,35, | 867,36, | 867,37, | 867,38, | 867,39, | 867,40, | 867,41, | 867,42, | 867,43, | 867,44, | 867,45, | 867,46, | 867,47, | 867,48, | 867,49, | 867,50, | 867,51, | 867,52, | 867,53, | 867,54, | 867,55, | 867,56, | 867,57, | 867,58, | 867,59, | 867,60, | 867,61, | 867,62, | 867,63, | 867,64, | 867,65, | 867,66, | 867,67, | 867,68, | 867,69, | 867,70, | 867,71, | 867,72, | 867,73, | 867,74, | 867,75, | 867,76, | 867,77, | 867,78, | 867,79, | 867,80, | 867,81, | 867,82, | 867,83, | 867,84, | 867,85, | 868,1, | 868,2, | 868,3, | 868,4, | 868,5, | 868,6, | 868,7, | 868,8, | 868,9, | 868,10, | 868,11, | 868,12, | 868,13, | 868,14, | 868,15, | 868,16, | 868,17, | 868,18, | 868,19, | 868,20, | 868,21, | 868,22, | 868,23, | 868,24, | 868,25, | 868,26, | 868,27, | 868,28, | 868,29, | 868,30, | 868,31, | 868,32, | 868,33, | 868,34, | 868,35, | 868,36, | 868,37, | 868,38, | 868,39, | 868,40, | 868,41, | 868,42, | 868,43, | 868,44, | 868,45, | 868,46, | 868,47, | 868,48, | 868,49, | 868,50, | 868,51, | 868,52, | 868,53, | 868,54, | 868,55, | 868,56, | 868,57, | 868,58, | 868,59, | 868,60, | 868,61, | 868,62, | 868,63, | 868,64, | 868,65, | 868,66, | 868,67, | 868,68, | 868,69, | 868,70, | 868,71, | 868,72, | 868,73, | 868,74, | 868,75, | 868,76, | 868,77, | 868,78, | 868,79, | 868,80, | 868,81, | 868,82, | 868,83, | 868,84, | 868,85, | 869,1, | 869,2, | 869,3, | 869,4, | 869,5, | 869,6, | 869,7, | 869,8, | 869,9, | 869,10, | 869,11, | 869,12, | 869,13, | 869,14, | 869,15, | 869,16, | 869,17, | 869,18, | 869,19, | 869,20, | 869,21, | 869,22, | 869,23, | 869,24, | 869,25, | 869,26, | 869,27, | 869,28, | 869,29, | 869,30, | 869,31, | 869,32, | 869,33, | 869,34, | 869,35, | 869,36, | 869,37, | 869,38, | 869,39, | 869,40, | 869,41, | 869,42, | 869,43, | 869,44, | 869,45, | 869,46, | 869,47, | 869,48, | 869,49, | 869,50, | 869,51, | 869,52, | 869,53, | 869,54, | 869,55, | 869,56, | 869,57, | 869,58, | 869,59, | 869,60, | 869,61, | 869,62, | 869,63, | 869,64, | 869,65, | 869,66, | 869,67, | 869,68, | 869,69, | 869,70, | 869,71, | 869,72, | 869,73, | 869,74, | 869,75, | 869,76, | 869,77, | 869,78, | 869,79, | 869,80, | 869,81, | 869,82, | 869,83, | 869,84, | 869,85, | 870,1, | 870,2, | 870,3, | 870,4, | 870,5, | 870,6, | 870,7, | 870,8, | 870,9, | 870,10, | 870,11, | 870,12, | 870,13, | 870,14, | 870,15, | 870,16, | 870,17, | 870,18, | 870,19, | 870,20, | 870,21, | 870,22, | 870,23, | 870,24, | 870,25, | 870,26, | 870,27, | 870,28, | 870,29, | 870,30, | 870,31, | 870,32, | 870,33, | 870,34, | 870,35, | 870,36, | 870,37, | 870,38, | 870,39, | 870,40, | 870,41, | 870,42, | 870,43, | 870,44, | 870,45, | 870,46, | 870,47, | 870,48, | 870,49, | 870,50, | 870,51, | 870,52, | 870,53, | 870,54, | 870,55, | 870,56, | 870,57, | 870,58, | 870,59, | 870,60, | 870,61, | 870,62, | 870,63, | 870,64, | 870,65, | 870,66, | 870,67, | 870,68, | 870,69, | 870,70, | 870,71, | 870,72, | 870,73, | 870,74, | 870,75, | 870,76, | 870,77, | 870,78, | 870,79, | 870,80, | 870,81, | 870,82, | 870,83, | 870,84, | 870,85, | 871,1, | 871,2, | 871,3, | 871,4, | 871,5, | 871,6, | 871,7, | 871,8, | 871,9, | 871,10, | 871,11, | 871,12, | 871,13, | 871,14, | 871,15, | 871,16, | 871,17, | 871,18, | 871,19, | 871,20, | 871,21, | 871,22, | 871,23, | 871,24, | 871,25, | 871,26, | 871,27, | 871,28, | 871,29, | 871,30, | 871,31, | 871,32, | 871,33, | 871,34, | 871,35, | 871,36, | 871,37, | 871,38, | 871,39, | 871,40, | 871,41, | 871,42, | 871,43, | 871,44, | 871,45, | 871,46, | 871,47, | 871,48, | 871,49, | 871,50, | 871,51, | 871,52, | 871,53, | 871,54, | 871,55, | 871,56, | 871,57, | 871,58, | 871,59, | 871,60, | 871,61, | 871,62, | 871,63, | 871,64, | 871,65, | 871,66, | 871,67, | 871,68, | 871,69, | 871,70, | 871,71, | 871,72, | 871,73, | 871,74, | 871,75, | 871,76, | 871,77, | 871,78, | 871,79, | 871,80, | 871,81, | 871,82, | 871,83, | 871,84, | 871,85, | 872,1, | 872,2, | 872,3, | 872,4, | 872,5, | 872,6, | 872,7, | 872,8, | 872,9, | 872,10, | 872,11, | 872,12, | 872,13, | 872,14, | 872,15, | 872,16, | 872,17, | 872,18, | 872,19, | 872,20, | 872,21, | 872,22, | 872,23, | 872,24, | 872,25, | 872,26, | 872,27, | 872,28, | 872,29, | 872,30, | 872,31, | 872,32, | 872,33, | 872,34, | 872,35, | 872,36, | 872,37, | 872,38, | 872,39, | 872,40, | 872,41, | 872,42, | 872,43, | 872,44, | 872,45, | 872,46, | 872,47, | 872,48, | 872,49, | 872,50, | 872,51, | 872,52, | 872,53, | 872,54, | 872,55, | 872,56, | 872,57, | 872,58, | 872,59, | 872,60, | 872,61, | 872,62, | 872,63, | 872,64, | 872,65, | 872,66, | 872,67, | 872,68, | 872,69, | 872,70, | 872,71, | 872,72, | 872,73, | 872,74, | 872,75, | 872,76, | 872,77, | 872,78, | 872,79, | 872,80, | 872,81, | 872,82, | 872,83, | 872,84, | 872,85, | 873,1, | 873,2, | 873,3, | 873,4, | 873,5, | 873,6, | 873,7, | 873,8, | 873,9, | 873,10, | 873,11, | 873,12, | 873,13, | 873,14, | 873,15, | 873,16, | 873,17, | 873,18, | 873,19, | 873,20, | 873,21, | 873,22, | 873,23, | 873,24, | 873,25, | 873,26, | 873,27, | 873,28, | 873,29, | 873,30, | 873,31, | 873,32, | 873,33, | 873,34, | 873,35, | 873,36, | 873,37, | 873,38, | 873,39, | 873,40, | 873,41, | 873,42, | 873,43, | 873,44, | 873,45, | 873,46, | 873,47, | 873,48, | 873,49, | 873,50, | 873,51, | 873,52, | 873,53, | 873,54, | 873,55, | 873,56, | 873,57, | 873,58, | 873,59, | 873,60, | 873,61, | 873,62, | 873,63, | 873,64, | 873,65, | 873,66, | 873,67, | 873,68, | 873,69, | 873,70, | 873,71, | 873,72, | 873,73, | 873,74, | 873,75, | 873,76, | 873,77, | 873,78, | 873,79, | 873,80, | 873,81, | 873,82, | 873,83, | 873,84, | 873,85, | 874,1, | 874,2, | 874,3, | 874,4, | 874,5, | 874,6, | 874,7, | 874,8, | 874,9, | 874,10, | 874,11, | 874,12, | 874,13, | 874,14, | 874,15, | 874,16, | 874,17, | 874,18, | 874,19, | 874,20, | 874,21, | 874,22, | 874,23, | 874,24, | 874,25, | 874,26, | 874,27, | 874,28, | 874,29, | 874,30, | 874,31, | 874,32, | 874,33, | 874,34, | 874,35, | 874,36, | 874,37, | 874,38, | 874,39, | 874,40, | 874,41, | 874,42, | 874,43, | 874,44, | 874,45, | 874,46, | 874,47, | 874,48, | 874,49, | 874,50, | 874,51, | 874,52, | 874,53, | 874,54, | 874,55, | 874,56, | 874,57, | 874,58, | 874,59, | 874,60, | 874,61, | 874,62, | 874,63, | 874,64, | 874,65, | 874,66, | 874,67, | 874,68, | 874,69, | 874,70, | 874,71, | 874,72, | 874,73, | 874,74, | 874,75, | 874,76, | 874,77, | 874,78, | 874,79, | 874,80, | 874,81, | 874,82, | 874,83, | 874,84, | 874,85, | 875,1, | 875,2, | 875,3, | 875,4, | 875,5, | 875,6, | 875,7, | 875,8, | 875,9, | 875,10, | 875,11, | 875,12, | 875,13, | 875,14, | 875,15, | 875,16, | 875,17, | 875,18, | 875,19, | 875,20, | 875,21, | 875,22, | 875,23, | 875,24, | 875,25, | 875,26, | 875,27, | 875,28, | 875,29, | 875,30, | 875,31, | 875,32, | 875,33, | 875,34, | 875,35, | 875,36, | 875,37, | 875,38, | 875,39, | 875,40, | 875,41, | 875,42, | 875,43, | 875,44, | 875,45, | 875,46, | 875,47, | 875,48, | 875,49, | 875,50, | 875,51, | 875,52, | 875,53, | 875,54, | 875,55, | 875,56, | 875,57, | 875,58, | 875,59, | 875,60, | 875,61, | 875,62, | 875,63, | 875,64, | 875,65, | 875,66, | 875,67, | 875,68, | 875,69, | 875,70, | 875,71, | 875,72, | 875,73, | 875,74, | 875,75, | 875,76, | 875,77, | 875,78, | 875,79, | 875,80, | 875,81, | 875,82, | 875,83, | 875,84, | 875,85, | 876,1, | 876,2, | 876,3, | 876,4, | 876,5, | 876,6, | 876,7, | 876,8, | 876,9, | 876,10, | 876,11, | 876,12, | 876,13, | 876,14, | 876,15, | 876,16, | 876,17, | 876,18, | 876,19, | 876,20, | 876,21, | 876,22, | 876,23, | 876,24, | 876,25, | 876,26, | 876,27, | 876,28, | 876,29, | 876,30, | 876,31, | 876,32, | 876,33, | 876,34, | 876,35, | 876,36, | 876,37, | 876,38, | 876,39, | 876,40, | 876,41, | 876,42, | 876,43, | 876,44, | 876,45, | 876,46, | 876,47, | 876,48, | 876,49, | 876,50, | 876,51, | 876,52, | 876,53, | 876,54, | 876,55, | 876,56, | 876,57, | 876,58, | 876,59, | 876,60, | 876,61, | 876,62, | 876,63, | 876,64, | 876,65, | 876,66, | 876,67, | 876,68, | 876,69, | 876,70, | 876,71, | 876,72, | 876,73, | 876,74, | 876,75, | 876,76, | 876,77, | 876,78, | 876,79, | 876,80, | 876,81, | 876,82, | 876,83, | 876,84, | 876,85, | 877,1, | 877,2, | 877,3, | 877,4, | 877,5, | 877,6, | 877,7, | 877,8, | 877,9, | 877,10, | 877,11, | 877,12, | 877,13, | 877,14, | 877,15, | 877,16, | 877,17, | 877,18, | 877,19, | 877,20, | 877,21, | 877,22, | 877,23, | 877,24, | 877,25, | 877,26, | 877,27, | 877,28, | 877,29, | 877,30, | 877,31, | 877,32, | 877,33, | 877,34, | 877,35, | 877,36, | 877,37, | 877,38, | 877,39, | 877,40, | 877,41, | 877,42, | 877,43, | 877,44, | 877,45, | 877,46, | 877,47, | 877,48, | 877,49, | 877,50, | 877,51, | 877,52, | 877,53, | 877,54, | 877,55, | 877,56, | 877,57, | 877,58, | 877,59, | 877,60, | 877,61, | 877,62, | 877,63, | 877,64, | 877,65, | 877,66, | 877,67, | 877,68, | 877,69, | 877,70, | 877,71, | 877,72, | 877,73, | 877,74, | 877,75, | 877,76, | 877,77, | 877,78, | 877,79, | 877,80, | 877,81, | 877,82, | 877,83, | 877,84, | 877,85, | 878,1, | 878,2, | 878,3, | 878,4, | 878,5, | 878,6, | 878,7, | 878,8, | 878,9, | 878,10, | 878,11, | 878,12, | 878,13, | 878,14, | 878,15, | 878,16, | 878,17, | 878,18, | 878,19, | 878,20, | 878,21, | 878,22, | 878,23, | 878,24, | 878,25, | 878,26, | 878,27, | 878,28, | 878,29, | 878,30, | 878,31, | 878,32, | 878,33, | 878,34, | 878,35, | 878,36, | 878,37, | 878,38, | 878,39, | 878,40, | 878,41, | 878,42, | 878,43, | 878,44, | 878,45, | 878,46, | 878,47, | 878,48, | 878,49, | 878,50, | 878,51, | 878,52, | 878,53, | 878,54, | 878,55, | 878,56, | 878,57, | 878,58, | 878,59, | 878,60, | 878,61, | 878,62, | 878,63, | 878,64, | 878,65, | 878,66, | 878,67, | 878,68, | 878,69, | 878,70, | 878,71, | 878,72, | 878,73, | 878,74, | 878,75, | 878,76, | 878,77, | 878,78, | 878,79, | 878,80, | 878,81, | 878,82, | 878,83, | 878,84, | 878,85, | 879,1, | 879,2, | 879,3, | 879,4, | 879,5, | 879,6, | 879,7, | 879,8, | 879,9, | 879,10, | 879,11, | 879,12, | 879,13, | 879,14, | 879,15, | 879,16, | 879,17, | 879,18, | 879,19, | 879,20, | 879,21, | 879,22, | 879,23, | 879,24, | 879,25, | 879,26, | 879,27, | 879,28, | 879,29, | 879,30, | 879,31, | 879,32, | 879,33, | 879,34, | 879,35, | 879,36, | 879,37, | 879,38, | 879,39, | 879,40, | 879,41, | 879,42, | 879,43, | 879,44, | 879,45, | 879,46, | 879,47, | 879,48, | 879,49, | 879,50, | 879,51, | 879,52, | 879,53, | 879,54, | 879,55, | 879,56, | 879,57, | 879,58, | 879,59, | 879,60, | 879,61, | 879,62, | 879,63, | 879,64, | 879,65, | 879,66, | 879,67, | 879,68, | 879,69, | 879,70, | 879,71, | 879,72, | 879,73, | 879,74, | 879,75, | 879,76, | 879,77, | 879,78, | 879,79, | 879,80, | 879,81, | 879,82, | 879,83, | 879,84, | 879,85, | 880,1, | 880,2, | 880,3, | 880,4, | 880,5, | 880,6, | 880,7, | 880,8, | 880,9, | 880,10, | 880,11, | 880,12, | 880,13, | 880,14, | 880,15, | 880,16, | 880,17, | 880,18, | 880,19, | 880,20, | 880,21, | 880,22, | 880,23, | 880,24, | 880,25, | 880,26, | 880,27, | 880,28, | 880,29, | 880,30, | 880,31, | 880,32, | 880,33, | 880,34, | 880,35, | 880,36, | 880,37, | 880,38, | 880,39, | 880,40, | 880,41, | 880,42, | 880,43, | 880,44, | 880,45, | 880,46, | 880,47, | 880,48, | 880,49, | 880,50, | 880,51, | 880,52, | 880,53, | 880,54, | 880,55, | 880,56, | 880,57, | 880,58, | 880,59, | 880,60, | 880,61, | 880,62, | 880,63, | 880,64, | 880,65, | 880,66, | 880,67, | 880,68, | 880,69, | 880,70, | 880,71, | 880,72, | 880,73, | 880,74, | 880,75, | 880,76, | 880,77, | 880,78, | 880,79, | 880,80, | 880,81, | 880,82, | 880,83, | 880,84, | 880,85, | 881,1, | 881,2, | 881,3, | 881,4, | 881,5, | 881,6, | 881,7, | 881,8, | 881,9, | 881,10, | 881,11, | 881,12, | 881,13, | 881,14, | 881,15, | 881,16, | 881,17, | 881,18, | 881,19, | 881,20, | 881,21, | 881,22, | 881,23, | 881,24, | 881,25, | 881,26, | 881,27, | 881,28, | 881,29, | 881,30, | 881,31, | 881,32, | 881,33, | 881,34, | 881,35, | 881,36, | 881,37, | 881,38, | 881,39, | 881,40, | 881,41, | 881,42, | 881,43, | 881,44, | 881,45, | 881,46, | 881,47, | 881,48, | 881,49, | 881,50, | 881,51, | 881,52, | 881,53, | 881,54, | 881,55, | 881,56, | 881,57, | 881,58, | 881,59, | 881,60, | 881,61, | 881,62, | 881,63, | 881,64, | 881,65, | 881,66, | 881,67, | 881,68, | 881,69, | 881,70, | 881,71, | 881,72, | 881,73, | 881,74, | 881,75, | 881,76, | 881,77, | 881,78, | 881,79, | 881,80, | 881,81, | 881,82, | 881,83, | 881,84, | 881,85, | 882,1, | 882,2, | 882,3, | 882,4, | 882,5, | 882,6, | 882,7, | 882,8, | 882,9, | 882,10, | 882,11, | 882,12, | 882,13, | 882,14, | 882,15, | 882,16, | 882,17, | 882,18, | 882,19, | 882,20, | 882,21, | 882,22, | 882,23, | 882,24, | 882,25, | 882,26, | 882,27, | 882,28, | 882,29, | 882,30, | 882,31, | 882,32, | 882,33, | 882,34, | 882,35, | 882,36, | 882,37, | 882,38, | 882,39, | 882,40, | 882,41, | 882,42, | 882,43, | 882,44, | 882,45, | 882,46, | 882,47, | 882,48, | 882,49, | 882,50, | 882,51, | 882,52, | 882,53, | 882,54, | 882,55, | 882,56, | 882,57, | 882,58, | 882,59, | 882,60, | 882,61, | 882,62, | 882,63, | 882,64, | 882,65, | 882,66, | 882,67, | 882,68, | 882,69, | 882,70, | 882,71, | 882,72, | 882,73, | 882,74, | 882,75, | 882,76, | 882,77, | 882,78, | 882,79, | 882,80, | 882,81, | 882,82, | 882,83, | 882,84, | 882,85, | 883,1, | 883,2, | 883,3, | 883,4, | 883,5, | 883,6, | 883,7, | 883,8, | 883,9, | 883,10, | 883,11, | 883,12, | 883,13, | 883,14, | 883,15, | 883,16, | 883,17, | 883,18, | 883,19, | 883,20, | 883,21, | 883,22, | 883,23, | 883,24, | 883,25, | 883,26, | 883,27, | 883,28, | 883,29, | 883,30, | 883,31, | 883,32, | 883,33, | 883,34, | 883,35, | 883,36, | 883,37, | 883,38, | 883,39, | 883,40, | 883,41, | 883,42, | 883,43, | 883,44, | 883,45, | 883,46, | 883,47, | 883,48, | 883,49, | 883,50, | 883,51, | 883,52, | 883,53, | 883,54, | 883,55, | 883,56, | 883,57, | 883,58, | 883,59, | 883,60, | 883,61, | 883,62, | 883,63, | 883,64, | 883,65, | 883,66, | 883,67, | 883,68, | 883,69, | 883,70, | 883,71, | 883,72, | 883,73, | 883,74, | 883,75, | 883,76, | 883,77, | 883,78, | 883,79, | 883,80, | 883,81, | 883,82, | 883,83, | 883,84, | 883,85, | 884,1, | 884,2, | 884,3, | 884,4, | 884,5, | 884,6, | 884,7, | 884,8, | 884,9, | 884,10, | 884,11, | 884,12, | 884,13, | 884,14, | 884,15, | 884,16, | 884,17, | 884,18, | 884,19, | 884,20, | 884,21, | 884,22, | 884,23, | 884,24, | 884,25, | 884,26, | 884,27, | 884,28, | 884,29, | 884,30, | 884,31, | 884,32, | 884,33, | 884,34, | 884,35, | 884,36, | 884,37, | 884,38, | 884,39, | 884,40, | 884,41, | 884,42, | 884,43, | 884,44, | 884,45, | 884,46, | 884,47, | 884,48, | 884,49, | 884,50, | 884,51, | 884,52, | 884,53, | 884,54, | 884,55, | 884,56, | 884,57, | 884,58, | 884,59, | 884,60, | 884,61, | 884,62, | 884,63, | 884,64, | 884,65, | 884,66, | 884,67, | 884,68, | 884,69, | 884,70, | 884,71, | 884,72, | 884,73, | 884,74, | 884,75, | 884,76, | 884,77, | 884,78, | 884,79, | 884,80, | 884,81, | 884,82, | 884,83, | 884,84, | 884,85, | 885,1, | 885,2, | 885,3, | 885,4, | 885,5, | 885,6, | 885,7, | 885,8, | 885,9, | 885,10, | 885,11, | 885,12, | 885,13, | 885,14, | 885,15, | 885,16, | 885,17, | 885,18, | 885,19, | 885,20, | 885,21, | 885,22, | 885,23, | 885,24, | 885,25, | 885,26, | 885,27, | 885,28, | 885,29, | 885,30, | 885,31, | 885,32, | 885,33, | 885,34, | 885,35, | 885,36, | 885,37, | 885,38, | 885,39, | 885,40, | 885,41, | 885,42, | 885,43, | 885,44, | 885,45, | 885,46, | 885,47, | 885,48, | 885,49, | 885,50, | 885,51, | 885,52, | 885,53, | 885,54, | 885,55, | 885,56, | 885,57, | 885,58, | 885,59, | 885,60, | 885,61, | 885,62, | 885,63, | 885,64, | 885,65, | 885,66, | 885,67, | 885,68, | 885,69, | 885,70, | 885,71, | 885,72, | 885,73, | 885,74, | 885,75, | 885,76, | 885,77, | 885,78, | 885,79, | 885,80, | 885,81, | 885,82, | 885,83, | 885,84, | 885,85, | 886,1, | 886,2, | 886,3, | 886,4, | 886,5, | 886,6, | 886,7, | 886,8, | 886,9, | 886,10, | 886,11, | 886,12, | 886,13, | 886,14, | 886,15, | 886,16, | 886,17, | 886,18, | 886,19, | 886,20, | 886,21, | 886,22, | 886,23, | 886,24, | 886,25, | 886,26, | 886,27, | 886,28, | 886,29, | 886,30, | 886,31, | 886,32, | 886,33, | 886,34, | 886,35, | 886,36, | 886,37, | 886,38, | 886,39, | 886,40, | 886,41, | 886,42, | 886,43, | 886,44, | 886,45, | 886,46, | 886,47, | 886,48, | 886,49, | 886,50, | 886,51, | 886,52, | 886,53, | 886,54, | 886,55, | 886,56, | 886,57, | 886,58, | 886,59, | 886,60, | 886,61, | 886,62, | 886,63, | 886,64, | 886,65, | 886,66, | 886,67, | 886,68, | 886,69, | 886,70, | 886,71, | 886,72, | 886,73, | 886,74, | 886,75, | 886,76, | 886,77, | 886,78, | 886,79, | 886,80, | 886,81, | 886,82, | 886,83, | 886,84, | 886,85, | 887,1, | 887,2, | 887,3, | 887,4, | 887,5, | 887,6, | 887,7, | 887,8, | 887,9, | 887,10, | 887,11, | 887,12, | 887,13, | 887,14, | 887,15, | 887,16, | 887,17, | 887,18, | 887,19, | 887,20, | 887,21, | 887,22, | 887,23, | 887,24, | 887,25, | 887,26, | 887,27, | 887,28, | 887,29, | 887,30, | 887,31, | 887,32, | 887,33, | 887,34, | 887,35, | 887,36, | 887,37, | 887,38, | 887,39, | 887,40, | 887,41, | 887,42, | 887,43, | 887,44, | 887,45, | 887,46, | 887,47, | 887,48, | 887,49, | 887,50, | 887,51, | 887,52, | 887,53, | 887,54, | 887,55, | 887,56, | 887,57, | 887,58, | 887,59, | 887,60, | 887,61, | 887,62, | 887,63, | 887,64, | 887,65, | 887,66, | 887,67, | 887,68, | 887,69, | 887,70, | 887,71, | 887,72, | 887,73, | 887,74, | 887,75, | 887,76, | 887,77, | 887,78, | 887,79, | 887,80, | 887,81, | 887,82, | 887,83, | 887,84, | 887,85, | 888,1, | 888,2, | 888,3, | 888,4, | 888,5, | 888,6, | 888,7, | 888,8, | 888,9, | 888,10, | 888,11, | 888,12, | 888,13, | 888,14, | 888,15, | 888,16, | 888,17, | 888,18, | 888,19, | 888,20, | 888,21, | 888,22, | 888,23, | 888,24, | 888,25, | 888,26, | 888,27, | 888,28, | 888,29, | 888,30, | 888,31, | 888,32, | 888,33, | 888,34, | 888,35, | 888,36, | 888,37, | 888,38, | 888,39, | 888,40, | 888,41, | 888,42, | 888,43, | 888,44, | 888,45, | 888,46, | 888,47, | 888,48, | 888,49, | 888,50, | 888,51, | 888,52, | 888,53, | 888,54, | 888,55, | 888,56, | 888,57, | 888,58, | 888,59, | 888,60, | 888,61, | 888,62, | 888,63, | 888,64, | 888,65, | 888,66, | 888,67, | 888,68, | 888,69, | 888,70, | 888,71, | 888,72, | 888,73, | 888,74, | 888,75, | 888,76, | 888,77, | 888,78, | 888,79, | 888,80, | 888,81, | 888,82, | 888,83, | 888,84, | 888,85, | 889,1, | 889,2, | 889,3, | 889,4, | 889,5, | 889,6, | 889,7, | 889,8, | 889,9, | 889,10, | 889,11, | 889,12, | 889,13, | 889,14, | 889,15, | 889,16, | 889,17, | 889,18, | 889,19, | 889,20, | 889,21, | 889,22, | 889,23, | 889,24, | 889,25, | 889,26, | 889,27, | 889,28, | 889,29, | 889,30, | 889,31, | 889,32, | 889,33, | 889,34, | 889,35, | 889,36, | 889,37, | 889,38, | 889,39, | 889,40, | 889,41, | 889,42, | 889,43, | 889,44, | 889,45, | 889,46, | 889,47, | 889,48, | 889,49, | 889,50, | 889,51, | 889,52, | 889,53, | 889,54, | 889,55, | 889,56, | 889,57, | 889,58, | 889,59, | 889,60, | 889,61, | 889,62, | 889,63, | 889,64, | 889,65, | 889,66, | 889,67, | 889,68, | 889,69, | 889,70, | 889,71, | 889,72, | 889,73, | 889,74, | 889,75, | 889,76, | 889,77, | 889,78, | 889,79, | 889,80, | 889,81, | 889,82, | 889,83, | 889,84, | 889,85, | 890,1, | 890,2, | 890,3, | 890,4, | 890,5, | 890,6, | 890,7, | 890,8, | 890,9, | 890,10, | 890,11, | 890,12, | 890,13, | 890,14, | 890,15, | 890,16, | 890,17, | 890,18, | 890,19, | 890,20, | 890,21, | 890,22, | 890,23, | 890,24, | 890,25, | 890,26, | 890,27, | 890,28, | 890,29, | 890,30, | 890,31, | 890,32, | 890,33, | 890,34, | 890,35, | 890,36, | 890,37, | 890,38, | 890,39, | 890,40, | 890,41, | 890,42, | 890,43, | 890,44, | 890,45, | 890,46, | 890,47, | 890,48, | 890,49, | 890,50, | 890,51, | 890,52, | 890,53, | 890,54, | 890,55, | 890,56, | 890,57, | 890,58, | 890,59, | 890,60, | 890,61, | 890,62, | 890,63, | 890,64, | 890,65, | 890,66, | 890,67, | 890,68, | 890,69, | 890,70, | 890,71, | 890,72, | 890,73, | 890,74, | 890,75, | 890,76, | 890,77, | 890,78, | 890,79, | 890,80, | 890,81, | 890,82, | 890,83, | 890,84, | 890,85, | 891,1, | 891,2, | 891,3, | 891,4, | 891,5, | 891,6, | 891,7, | 891,8, | 891,9, | 891,10, | 891,11, | 891,12, | 891,13, | 891,14, | 891,15, | 891,16, | 891,17, | 891,18, | 891,19, | 891,20, | 891,21, | 891,22, | 891,23, | 891,24, | 891,25, | 891,26, | 891,27, | 891,28, | 891,29, | 891,30, | 891,31, | 891,32, | 891,33, | 891,34, | 891,35, | 891,36, | 891,37, | 891,38, | 891,39, | 891,40, | 891,41, | 891,42, | 891,43, | 891,44, | 891,45, | 891,46, | 891,47, | 891,48, | 891,49, | 891,50, | 891,51, | 891,52, | 891,53, | 891,54, | 891,55, | 891,56, | 891,57, | 891,58, | 891,59, | 891,60, | 891,61, | 891,62, | 891,63, | 891,64, | 891,65, | 891,66, | 891,67, | 891,68, | 891,69, | 891,70, | 891,71, | 891,72, | 891,73, | 891,74, | 891,75, | 891,76, | 891,77, | 891,78, | 891,79, | 891,80, | 891,81, | 891,82, | 891,83, | 891,84, | 891,85, | 892,1, | 892,2, | 892,3, | 892,4, | 892,5, | 892,6, | 892,7, | 892,8, | 892,9, | 892,10, | 892,11, | 892,12, | 892,13, | 892,14, | 892,15, | 892,16, | 892,17, | 892,18, | 892,19, | 892,20, | 892,21, | 892,22, | 892,23, | 892,24, | 892,25, | 892,26, | 892,27, | 892,28, | 892,29, | 892,30, | 892,31, | 892,32, | 892,33, | 892,34, | 892,35, | 892,36, | 892,37, | 892,38, | 892,39, | 892,40, | 892,41, | 892,42, | 892,43, | 892,44, | 892,45, | 892,46, | 892,47, | 892,48, | 892,49, | 892,50, | 892,51, | 892,52, | 892,53, | 892,54, | 892,55, | 892,56, | 892,57, | 892,58, | 892,59, | 892,60, | 892,61, | 892,62, | 892,63, | 892,64, | 892,65, | 892,66, | 892,67, | 892,68, | 892,69, | 892,70, | 892,71, | 892,72, | 892,73, | 892,74, | 892,75, | 892,76, | 892,77, | 892,78, | 892,79, | 892,80, | 892,81, | 892,82, | 892,83, | 892,84, | 892,85, | 893,1, | 893,2, | 893,3, | 893,4, | 893,5, | 893,6, | 893,7, | 893,8, | 893,9, | 893,10, | 893,11, | 893,12, | 893,13, | 893,14, | 893,15, | 893,16, | 893,17, | 893,18, | 893,19, | 893,20, | 893,21, | 893,22, | 893,23, | 893,24, | 893,25, | 893,26, | 893,27, | 893,28, | 893,29, | 893,30, | 893,31, | 893,32, | 893,33, | 893,34, | 893,35, | 893,36, | 893,37, | 893,38, | 893,39, | 893,40, | 893,41, | 893,42, | 893,43, | 893,44, | 893,45, | 893,46, | 893,47, | 893,48, | 893,49, | 893,50, | 893,51, | 893,52, | 893,53, | 893,54, | 893,55, | 893,56, | 893,57, | 893,58, | 893,59, | 893,60, | 893,61, | 893,62, | 893,63, | 893,64, | 893,65, | 893,66, | 893,67, | 893,68, | 893,69, | 893,70, | 893,71, | 893,72, | 893,73, | 893,74, | 893,75, | 893,76, | 893,77, | 893,78, | 893,79, | 893,80, | 893,81, | 893,82, | 893,83, | 893,84, | 893,85, | 894,1, | 894,2, | 894,3, | 894,4, | 894,5, | 894,6, | 894,7, | 894,8, | 894,9, | 894,10, | 894,11, | 894,12, | 894,13, | 894,14, | 894,15, | 894,16, | 894,17, | 894,18, | 894,19, | 894,20, | 894,21, | 894,22, | 894,23, | 894,24, | 894,25, | 894,26, | 894,27, | 894,28, | 894,29, | 894,30, | 894,31, | 894,32, | 894,33, | 894,34, | 894,35, | 894,36, | 894,37, | 894,38, | 894,39, | 894,40, | 894,41, | 894,42, | 894,43, | 894,44, | 894,45, | 894,46, | 894,47, | 894,48, | 894,49, | 894,50, | 894,51, | 894,52, | 894,53, | 894,54, | 894,55, | 894,56, | 894,57, | 894,58, | 894,59, | 894,60, | 894,61, | 894,62, | 894,63, | 894,64, | 894,65, | 894,66, | 894,67, | 894,68, | 894,69, | 894,70, | 894,71, | 894,72, | 894,73, | 894,74, | 894,75, | 894,76, | 894,77, | 894,78, | 894,79, | 894,80, | 894,81, | 894,82, | 894,83, | 894,84, | 894,85, | 895,1, | 895,2, | 895,3, | 895,4, | 895,5, | 895,6, | 895,7, | 895,8, | 895,9, | 895,10, | 895,11, | 895,12, | 895,13, | 895,14, | 895,15, | 895,16, | 895,17, | 895,18, | 895,19, | 895,20, | 895,21, | 895,22, | 895,23, | 895,24, | 895,25, | 895,26, | 895,27, | 895,28, | 895,29, | 895,30, | 895,31, | 895,32, | 895,33, | 895,34, | 895,35, | 895,36, | 895,37, | 895,38, | 895,39, | 895,40, | 895,41, | 895,42, | 895,43, | 895,44, | 895,45, | 895,46, | 895,47, | 895,48, | 895,49, | 895,50, | 895,51, | 895,52, | 895,53, | 895,54, | 895,55, | 895,56, | 895,57, | 895,58, | 895,59, | 895,60, | 895,61, | 895,62, | 895,63, | 895,64, | 895,65, | 895,66, | 895,67, | 895,68, | 895,69, | 895,70, | 895,71, | 895,72, | 895,73, | 895,74, | 895,75, | 895,76, | 895,77, | 895,78, | 895,79, | 895,80, | 895,81, | 895,82, | 895,83, | 895,84, | 895,85, | 896,1, | 896,2, | 896,3, | 896,4, | 896,5, | 896,6, | 896,7, | 896,8, | 896,9, | 896,10, | 896,11, | 896,12, | 896,13, | 896,14, | 896,15, | 896,16, | 896,17, | 896,18, | 896,19, | 896,20, | 896,21, | 896,22, | 896,23, | 896,24, | 896,25, | 896,26, | 896,27, | 896,28, | 896,29, | 896,30, | 896,31, | 896,32, | 896,33, | 896,34, | 896,35, | 896,36, | 896,37, | 896,38, | 896,39, | 896,40, | 896,41, | 896,42, | 896,43, | 896,44, | 896,45, | 896,46, | 896,47, | 896,48, | 896,49, | 896,50, | 896,51, | 896,52, | 896,53, | 896,54, | 896,55, | 896,56, | 896,57, | 896,58, | 896,59, | 896,60, | 896,61, | 896,62, | 896,63, | 896,64, | 896,65, | 896,66, | 896,67, | 896,68, | 896,69, | 896,70, | 896,71, | 896,72, | 896,73, | 896,74, | 896,75, | 896,76, | 896,77, | 896,78, | 896,79, | 896,80, | 896,81, | 896,82, | 896,83, | 896,84, | 896,85, | 897,1, | 897,2, | 897,3, | 897,4, | 897,5, | 897,6, | 897,7, | 897,8, | 897,9, | 897,10, | 897,11, | 897,12, | 897,13, | 897,14, | 897,15, | 897,16, | 897,17, | 897,18, | 897,19, | 897,20, | 897,21, | 897,22, | 897,23, | 897,24, | 897,25, | 897,26, | 897,27, | 897,28, | 897,29, | 897,30, | 897,31, | 897,32, | 897,33, | 897,34, | 897,35, | 897,36, | 897,37, | 897,38, | 897,39, | 897,40, | 897,41, | 897,42, | 897,43, | 897,44, | 897,45, | 897,46, | 897,47, | 897,48, | 897,49, | 897,50, | 897,51, | 897,52, | 897,53, | 897,54, | 897,55, | 897,56, | 897,57, | 897,58, | 897,59, | 897,60, | 897,61, | 897,62, | 897,63, | 897,64, | 897,65, | 897,66, | 897,67, | 897,68, | 897,69, | 897,70, | 897,71, | 897,72, | 897,73, | 897,74, | 897,75, | 897,76, | 897,77, | 897,78, | 897,79, | 897,80, | 897,81, | 897,82, | 897,83, | 897,84, | 897,85, | 898,1, | 898,2, | 898,3, | 898,4, | 898,5, | 898,6, | 898,7, | 898,8, | 898,9, | 898,10, | 898,11, | 898,12, | 898,13, | 898,14, | 898,15, | 898,16, | 898,17, | 898,18, | 898,19, | 898,20, | 898,21, | 898,22, | 898,23, | 898,24, | 898,25, | 898,26, | 898,27, | 898,28, | 898,29, | 898,30, | 898,31, | 898,32, | 898,33, | 898,34, | 898,35, | 898,36, | 898,37, | 898,38, | 898,39, | 898,40, | 898,41, | 898,42, | 898,43, | 898,44, | 898,45, | 898,46, | 898,47, | 898,48, | 898,49, | 898,50, | 898,51, | 898,52, | 898,53, | 898,54, | 898,55, | 898,56, | 898,57, | 898,58, | 898,59, | 898,60, | 898,61, | 898,62, | 898,63, | 898,64, | 898,65, | 898,66, | 898,67, | 898,68, | 898,69, | 898,70, | 898,71, | 898,72, | 898,73, | 898,74, | 898,75, | 898,76, | 898,77, | 898,78, | 898,79, | 898,80, | 898,81, | 898,82, | 898,83, | 898,84, | 898,85, | 899,1, | 899,2, | 899,3, | 899,4, | 899,5, | 899,6, | 899,7, | 899,8, | 899,9, | 899,10, | 899,11, | 899,12, | 899,13, | 899,14, | 899,15, | 899,16, | 899,17, | 899,18, | 899,19, | 899,20, | 899,21, | 899,22, | 899,23, | 899,24, | 899,25, | 899,26, | 899,27, | 899,28, | 899,29, | 899,30, | 899,31, | 899,32, | 899,33, | 899,34, | 899,35, | 899,36, | 899,37, | 899,38, | 899,39, | 899,40, | 899,41, | 899,42, | 899,43, | 899,44, | 899,45, | 899,46, | 899,47, | 899,48, | 899,49, | 899,50, | 899,51, | 899,52, | 899,53, | 899,54, | 899,55, | 899,56, | 899,57, | 899,58, | 899,59, | 899,60, | 899,61, | 899,62, | 899,63, | 899,64, | 899,65, | 899,66, | 899,67, | 899,68, | 899,69, | 899,70, | 899,71, | 899,72, | 899,73, | 899,74, | 899,75, | 899,76, | 899,77, | 899,78, | 899,79, | 899,80, | 899,81, | 899,82, | 899,83, | 899,84, | 899,85, | 900,1, | 900,2, | 900,3, | 900,4, | 900,5, | 900,6, | 900,7, | 900,8, | 900,9, | 900,10, | 900,11, | 900,12, | 900,13, | 900,14, | 900,15, | 900,16, | 900,17, | 900,18, | 900,19, | 900,20, | 900,21, | 900,22, | 900,23, | 900,24, | 900,25, | 900,26, | 900,27, | 900,28, | 900,29, | 900,30, | 900,31, | 900,32, | 900,33, | 900,34, | 900,35, | 900,36, | 900,37, | 900,38, | 900,39, | 900,40, | 900,41, | 900,42, | 900,43, | 900,44, | 900,45, | 900,46, | 900,47, | 900,48, | 900,49, | 900,50, | 900,51, | 900,52, | 900,53, | 900,54, | 900,55, | 900,56, | 900,57, | 900,58, | 900,59, | 900,60, | 900,61, | 900,62, | 900,63, | 900,64, | 900,65, | 900,66, | 900,67, | 900,68, | 900,69, | 900,70, | 900,71, | 900,72, | 900,73, | 900,74, | 900,75, | 900,76, | 900,77, | 900,78, | 900,79, | 900,80, | 900,81, | 900,82, | 900,83, | 900,84, | 900,85, | 901,1, | 901,2, | 901,3, | 901,4, | 901,5, | 901,6, | 901,7, | 901,8, | 901,9, | 901,10, | 901,11, | 901,12, | 901,13, | 901,14, | 901,15, | 901,16, | 901,17, | 901,18, | 901,19, | 901,20, | 901,21, | 901,22, | 901,23, | 901,24, | 901,25, | 901,26, | 901,27, | 901,28, | 901,29, | 901,30, | 901,31, | 901,32, | 901,33, | 901,34, | 901,35, | 901,36, | 901,37, | 901,38, | 901,39, | 901,40, | 901,41, | 901,42, | 901,43, | 901,44, | 901,45, | 901,46, | 901,47, | 901,48, | 901,49, | 901,50, | 901,51, | 901,52, | 901,53, | 901,54, | 901,55, | 901,56, | 901,57, | 901,58, | 901,59, | 901,60, | 901,61, | 901,62, | 901,63, | 901,64, | 901,65, | 901,66, | 901,67, | 901,68, | 901,69, | 901,70, | 901,71, | 901,72, | 901,73, | 901,74, | 901,75, | 901,76, | 901,77, | 901,78, | 901,79, | 901,80, | 901,81, | 901,82, | 901,83, | 901,84, | 901,85, | 902,1, | 902,2, | 902,3, | 902,4, | 902,5, | 902,6, | 902,7, | 902,8, | 902,9, | 902,10, | 902,11, | 902,12, | 902,13, | 902,14, | 902,15, | 902,16, | 902,17, | 902,18, | 902,19, | 902,20, | 902,21, | 902,22, | 902,23, | 902,24, | 902,25, | 902,26, | 902,27, | 902,28, | 902,29, | 902,30, | 902,31, | 902,32, | 902,33, | 902,34, | 902,35, | 902,36, | 902,37, | 902,38, | 902,39, | 902,40, | 902,41, | 902,42, | 902,43, | 902,44, | 902,45, | 902,46, | 902,47, | 902,48, | 902,49, | 902,50, | 902,51, | 902,52, | 902,53, | 902,54, | 902,55, | 902,56, | 902,57, | 902,58, | 902,59, | 902,60, | 902,61, | 902,62, | 902,63, | 902,64, | 902,65, | 902,66, | 902,67, | 902,68, | 902,69, | 902,70, | 902,71, | 902,72, | 902,73, | 902,74, | 902,75, | 902,76, | 902,77, | 902,78, | 902,79, | 902,80, | 902,81, | 902,82, | 902,83, | 902,84, | 902,85, | 903,1, | 903,2, | 903,3, | 903,4, | 903,5, | 903,6, | 903,7, | 903,8, | 903,9, | 903,10, | 903,11, | 903,12, | 903,13, | 903,14, | 903,15, | 903,16, | 903,17, | 903,18, | 903,19, | 903,20, | 903,21, | 903,22, | 903,23, | 903,24, | 903,25, | 903,26, | 903,27, | 903,28, | 903,29, | 903,30, | 903,31, | 903,32, | 903,33, | 903,34, | 903,35, | 903,36, | 903,37, | 903,38, | 903,39, | 903,40, | 903,41, | 903,42, | 903,43, | 903,44, | 903,45, | 903,46, | 903,47, | 903,48, | 903,49, | 903,50, | 903,51, | 903,52, | 903,53, | 903,54, | 903,55, | 903,56, | 903,57, | 903,58, | 903,59, | 903,60, | 903,61, | 903,62, | 903,63, | 903,64, | 903,65, | 903,66, | 903,67, | 903,68, | 903,69, | 903,70, | 903,71, | 903,72, | 903,73, | 903,74, | 903,75, | 903,76, | 903,77, | 903,78, | 903,79, | 903,80, | 903,81, | 903,82, | 903,83, | 903,84, | 903,85, | 904,1, | 904,2, | 904,3, | 904,4, | 904,5, | 904,6, | 904,7, | 904,8, | 904,9, | 904,10, | 904,11, | 904,12, | 904,13, | 904,14, | 904,15, | 904,16, | 904,17, | 904,18, | 904,19, | 904,20, | 904,21, | 904,22, | 904,23, | 904,24, | 904,25, | 904,26, | 904,27, | 904,28, | 904,29, | 904,30, | 904,31, | 904,32, | 904,33, | 904,34, | 904,35, | 904,36, | 904,37, | 904,38, | 904,39, | 904,40, | 904,41, | 904,42, | 904,43, | 904,44, | 904,45, | 904,46, | 904,47, | 904,48, | 904,49, | 904,50, | 904,51, | 904,52, | 904,53, | 904,54, | 904,55, | 904,56, | 904,57, | 904,58, | 904,59, | 904,60, | 904,61, | 904,62, | 904,63, | 904,64, | 904,65, | 904,66, | 904,67, | 904,68, | 904,69, | 904,70, | 904,71, | 904,72, | 904,73, | 904,74, | 904,75, | 904,76, | 904,77, | 904,78, | 904,79, | 904,80, | 904,81, | 904,82, | 904,83, | 904,84, | 904,85, | 905,1, | 905,2, | 905,3, | 905,4, | 905,5, | 905,6, | 905,7, | 905,8, | 905,9, | 905,10, | 905,11, | 905,12, | 905,13, | 905,14, | 905,15, | 905,16, | 905,17, | 905,18, | 905,19, | 905,20, | 905,21, | 905,22, | 905,23, | 905,24, | 905,25, | 905,26, | 905,27, | 905,28, | 905,29, | 905,30, | 905,31, | 905,32, | 905,33, | 905,34, | 905,35, | 905,36, | 905,37, | 905,38, | 905,39, | 905,40, | 905,41, | 905,42, | 905,43, | 905,44, | 905,45, | 905,46, | 905,47, | 905,48, | 905,49, | 905,50, | 905,51, | 905,52, | 905,53, | 905,54, | 905,55, | 905,56, | 905,57, | 905,58, | 905,59, | 905,60, | 905,61, | 905,62, | 905,63, | 905,64, | 905,65, | 905,66, | 905,67, | 905,68, | 905,69, | 905,70, | 905,71, | 905,72, | 905,73, | 905,74, | 905,75, | 905,76, | 905,77, | 905,78, | 905,79, | 905,80, | 905,81, | 905,82, | 905,83, | 905,84, | 905,85, | 906,1, | 906,2, | 906,3, | 906,4, | 906,5, | 906,6, | 906,7, | 906,8, | 906,9, | 906,10, | 906,11, | 906,12, | 906,13, | 906,14, | 906,15, | 906,16, | 906,17, | 906,18, | 906,19, | 906,20, | 906,21, | 906,22, | 906,23, | 906,24, | 906,25, | 906,26, | 906,27, | 906,28, | 906,29, | 906,30, | 906,31, | 906,32, | 906,33, | 906,34, | 906,35, | 906,36, | 906,37, | 906,38, | 906,39, | 906,40, | 906,41, | 906,42, | 906,43, | 906,44, | 906,45, | 906,46, | 906,47, | 906,48, | 906,49, | 906,50, | 906,51, | 906,52, | 906,53, | 906,54, | 906,55, | 906,56, | 906,57, | 906,58, | 906,59, | 906,60, | 906,61, | 906,62, | 906,63, | 906,64, | 906,65, | 906,66, | 906,67, | 906,68, | 906,69, | 906,70, | 906,71, | 906,72, | 906,73, | 906,74, | 906,75, | 906,76, | 906,77, | 906,78, | 906,79, | 906,80, | 906,81, | 906,82, | 906,83, | 906,84, | 906,85, | 907,1, | 907,2, | 907,3, | 907,4, | 907,5, | 907,6, | 907,7, | 907,8, | 907,9, | 907,10, | 907,11, | 907,12, | 907,13, | 907,14, | 907,15, | 907,16, | 907,17, | 907,18, | 907,19, | 907,20, | 907,21, | 907,22, | 907,23, | 907,24, | 907,25, | 907,26, | 907,27, | 907,28, | 907,29, | 907,30, | 907,31, | 907,32, | 907,33, | 907,34, | 907,35, | 907,36, | 907,37, | 907,38, | 907,39, | 907,40, | 907,41, | 907,42, | 907,43, | 907,44, | 907,45, | 907,46, | 907,47, | 907,48, | 907,49, | 907,50, | 907,51, | 907,52, | 907,53, | 907,54, | 907,55, | 907,56, | 907,57, | 907,58, | 907,59, | 907,60, | 907,61, | 907,62, | 907,63, | 907,64, | 907,65, | 907,66, | 907,67, | 907,68, | 907,69, | 907,70, | 907,71, | 907,72, | 907,73, | 907,74, | 907,75, | 907,76, | 907,77, | 907,78, | 907,79, | 907,80, | 907,81, | 907,82, | 907,83, | 907,84, | 907,85, | 908,1, | 908,2, | 908,3, | 908,4, | 908,5, | 908,6, | 908,7, | 908,8, | 908,9, | 908,10, | 908,11, | 908,12, | 908,13, | 908,14, | 908,15, | 908,16, | 908,17, | 908,18, | 908,19, | 908,20, | 908,21, | 908,22, | 908,23, | 908,24, | 908,25, | 908,26, | 908,27, | 908,28, | 908,29, | 908,30, | 908,31, | 908,32, | 908,33, | 908,34, | 908,35, | 908,36, | 908,37, | 908,38, | 908,39, | 908,40, | 908,41, | 908,42, | 908,43, | 908,44, | 908,45, | 908,46, | 908,47, | 908,48, | 908,49, | 908,50, | 908,51, | 908,52, | 908,53, | 908,54, | 908,55, | 908,56, | 908,57, | 908,58, | 908,59, | 908,60, | 908,61, | 908,62, | 908,63, | 908,64, | 908,65, | 908,66, | 908,67, | 908,68, | 908,69, | 908,70, | 908,71, | 908,72, | 908,73, | 908,74, | 908,75, | 908,76, | 908,77, | 908,78, | 908,79, | 908,80, | 908,81, | 908,82, | 908,83, | 908,84, | 908,85, | 909,1, | 909,2, | 909,3, | 909,4, | 909,5, | 909,6, | 909,7, | 909,8, | 909,9, | 909,10, | 909,11, | 909,12, | 909,13, | 909,14, | 909,15, | 909,16, | 909,17, | 909,18, | 909,19, | 909,20, | 909,21, | 909,22, | 909,23, | 909,24, | 909,25, | 909,26, | 909,27, | 909,28, | 909,29, | 909,30, | 909,31, | 909,32, | 909,33, | 909,34, | 909,35, | 909,36, | 909,37, | 909,38, | 909,39, | 909,40, | 909,41, | 909,42, | 909,43, | 909,44, | 909,45, | 909,46, | 909,47, | 909,48, | 909,49, | 909,50, | 909,51, | 909,52, | 909,53, | 909,54, | 909,55, | 909,56, | 909,57, | 909,58, | 909,59, | 909,60, | 909,61, | 909,62, | 909,63, | 909,64, | 909,65, | 909,66, | 909,67, | 909,68, | 909,69, | 909,70, | 909,71, | 909,72, | 909,73, | 909,74, | 909,75, | 909,76, | 909,77, | 909,78, | 909,79, | 909,80, | 909,81, | 909,82, | 909,83, | 909,84, | 909,85, | 910,1, | 910,2, | 910,3, | 910,4, | 910,5, | 910,6, | 910,7, | 910,8, | 910,9, | 910,10, | 910,11, | 910,12, | 910,13, | 910,14, | 910,15, | 910,16, | 910,17, | 910,18, | 910,19, | 910,20, | 910,21, | 910,22, | 910,23, | 910,24, | 910,25, | 910,26, | 910,27, | 910,28, | 910,29, | 910,30, | 910,31, | 910,32, | 910,33, | 910,34, | 910,35, | 910,36, | 910,37, | 910,38, | 910,39, | 910,40, | 910,41, | 910,42, | 910,43, | 910,44, | 910,45, | 910,46, | 910,47, | 910,48, | 910,49, | 910,50, | 910,51, | 910,52, | 910,53, | 910,54, | 910,55, | 910,56, | 910,57, | 910,58, | 910,59, | 910,60, | 910,61, | 910,62, | 910,63, | 910,64, | 910,65, | 910,66, | 910,67, | 910,68, | 910,69, | 910,70, | 910,71, | 910,72, | 910,73, | 910,74, | 910,75, | 910,76, | 910,77, | 910,78, | 910,79, | 910,80, | 910,81, | 910,82, | 910,83, | 910,84, | 910,85, | 911,1, | 911,2, | 911,3, | 911,4, | 911,5, | 911,6, | 911,7, | 911,8, | 911,9, | 911,10, | 911,11, | 911,12, | 911,13, | 911,14, | 911,15, | 911,16, | 911,17, | 911,18, | 911,19, | 911,20, | 911,21, | 911,22, | 911,23, | 911,24, | 911,25, | 911,26, | 911,27, | 911,28, | 911,29, | 911,30, | 911,31, | 911,32, | 911,33, | 911,34, | 911,35, | 911,36, | 911,37, | 911,38, | 911,39, | 911,40, | 911,41, | 911,42, | 911,43, | 911,44, | 911,45, | 911,46, | 911,47, | 911,48, | 911,49, | 911,50, | 911,51, | 911,52, | 911,53, | 911,54, | 911,55, | 911,56, | 911,57, | 911,58, | 911,59, | 911,60, | 911,61, | 911,62, | 911,63, | 911,64, | 911,65, | 911,66, | 911,67, | 911,68, | 911,69, | 911,70, | 911,71, | 911,72, | 911,73, | 911,74, | 911,75, | 911,76, | 911,77, | 911,78, | 911,79, | 911,80, | 911,81, | 911,82, | 911,83, | 911,84, | 911,85, | 912,1, | 912,2, | 912,3, | 912,4, | 912,5, | 912,6, | 912,7, | 912,8, | 912,9, | 912,10, | 912,11, | 912,12, | 912,13, | 912,14, | 912,15, | 912,16, | 912,17, | 912,18, | 912,19, | 912,20, | 912,21, | 912,22, | 912,23, | 912,24, | 912,25, | 912,26, | 912,27, | 912,28, | 912,29, | 912,30, | 912,31, | 912,32, | 912,33, | 912,34, | 912,35, | 912,36, | 912,37, | 912,38, | 912,39, | 912,40, | 912,41, | 912,42, | 912,43, | 912,44, | 912,45, | 912,46, | 912,47, | 912,48, | 912,49, | 912,50, | 912,51, | 912,52, | 912,53, | 912,54, | 912,55, | 912,56, | 912,57, | 912,58, | 912,59, | 912,60, | 912,61, | 912,62, | 912,63, | 912,64, | 912,65, | 912,66, | 912,67, | 912,68, | 912,69, | 912,70, | 912,71, | 912,72, | 912,73, | 912,74, | 912,75, | 912,76, | 912,77, | 912,78, | 912,79, | 912,80, | 912,81, | 912,82, | 912,83, | 912,84, | 912,85, | 913,1, | 913,2, | 913,3, | 913,4, | 913,5, | 913,6, | 913,7, | 913,8, | 913,9, | 913,10, | 913,11, | 913,12, | 913,13, | 913,14, | 913,15, | 913,16, | 913,17, | 913,18, | 913,19, | 913,20, | 913,21, | 913,22, | 913,23, | 913,24, | 913,25, | 913,26, | 913,27, | 913,28, | 913,29, | 913,30, | 913,31, | 913,32, | 913,33, | 913,34, | 913,35, | 913,36, | 913,37, | 913,38, | 913,39, | 913,40, | 913,41, | 913,42, | 913,43, | 913,44, | 913,45, | 913,46, | 913,47, | 913,48, | 913,49, | 913,50, | 913,51, | 913,52, | 913,53, | 913,54, | 913,55, | 913,56, | 913,57, | 913,58, | 913,59, | 913,60, | 913,61, | 913,62, | 913,63, | 913,64, | 913,65, | 913,66, | 913,67, | 913,68, | 913,69, | 913,70, | 913,71, | 913,72, | 913,73, | 913,74, | 913,75, | 913,76, | 913,77, | 913,78, | 913,79, | 913,80, | 913,81, | 913,82, | 913,83, | 913,84, | 913,85, | 914,1, | 914,2, | 914,3, | 914,4, | 914,5, | 914,6, | 914,7, | 914,8, | 914,9, | 914,10, | 914,11, | 914,12, | 914,13, | 914,14, | 914,15, | 914,16, | 914,17, | 914,18, | 914,19, | 914,20, | 914,21, | 914,22, | 914,23, | 914,24, | 914,25, | 914,26, | 914,27, | 914,28, | 914,29, | 914,30, | 914,31, | 914,32, | 914,33, | 914,34, | 914,35, | 914,36, | 914,37, | 914,38, | 914,39, | 914,40, | 914,41, | 914,42, | 914,43, | 914,44, | 914,45, | 914,46, | 914,47, | 914,48, | 914,49, | 914,50, | 914,51, | 914,52, | 914,53, | 914,54, | 914,55, | 914,56, | 914,57, | 914,58, | 914,59, | 914,60, | 914,61, | 914,62, | 914,63, | 914,64, | 914,65, | 914,66, | 914,67, | 914,68, | 914,69, | 914,70, | 914,71, | 914,72, | 914,73, | 914,74, | 914,75, | 914,76, | 914,77, | 914,78, | 914,79, | 914,80, | 914,81, | 914,82, | 914,83, | 914,84, | 914,85, | 915,1, | 915,2, | 915,3, | 915,4, | 915,5, | 915,6, | 915,7, | 915,8, | 915,9, | 915,10, | 915,11, | 915,12, | 915,13, | 915,14, | 915,15, | 915,16, | 915,17, | 915,18, | 915,19, | 915,20, | 915,21, | 915,22, | 915,23, | 915,24, | 915,25, | 915,26, | 915,27, | 915,28, | 915,29, | 915,30, | 915,31, | 915,32, | 915,33, | 915,34, | 915,35, | 915,36, | 915,37, | 915,38, | 915,39, | 915,40, | 915,41, | 915,42, | 915,43, | 915,44, | 915,45, | 915,46, | 915,47, | 915,48, | 915,49, | 915,50, | 915,51, | 915,52, | 915,53, | 915,54, | 915,55, | 915,56, | 915,57, | 915,58, | 915,59, | 915,60, | 915,61, | 915,62, | 915,63, | 915,64, | 915,65, | 915,66, | 915,67, | 915,68, | 915,69, | 915,70, | 915,71, | 915,72, | 915,73, | 915,74, | 915,75, | 915,76, | 915,77, | 915,78, | 915,79, | 915,80, | 915,81, | 915,82, | 915,83, | 915,84, | 915,85, | 916,1, | 916,2, | 916,3, | 916,4, | 916,5, | 916,6, | 916,7, | 916,8, | 916,9, | 916,10, | 916,11, | 916,12, | 916,13, | 916,14, | 916,15, | 916,16, | 916,17, | 916,18, | 916,19, | 916,20, | 916,21, | 916,22, | 916,23, | 916,24, | 916,25, | 916,26, | 916,27, | 916,28, | 916,29, | 916,30, | 916,31, | 916,32, | 916,33, | 916,34, | 916,35, | 916,36, | 916,37, | 916,38, | 916,39, | 916,40, | 916,41, | 916,42, | 916,43, | 916,44, | 916,45, | 916,46, | 916,47, | 916,48, | 916,49, | 916,50, | 916,51, | 916,52, | 916,53, | 916,54, | 916,55, | 916,56, | 916,57, | 916,58, | 916,59, | 916,60, | 916,61, | 916,62, | 916,63, | 916,64, | 916,65, | 916,66, | 916,67, | 916,68, | 916,69, | 916,70, | 916,71, | 916,72, | 916,73, | 916,74, | 916,75, | 916,76, | 916,77, | 916,78, | 916,79, | 916,80, | 916,81, | 916,82, | 916,83, | 916,84, | 916,85, | 917,1, | 917,2, | 917,3, | 917,4, | 917,5, | 917,6, | 917,7, | 917,8, | 917,9, | 917,10, | 917,11, | 917,12, | 917,13, | 917,14, | 917,15, | 917,16, | 917,17, | 917,18, | 917,19, | 917,20, | 917,21, | 917,22, | 917,23, | 917,24, | 917,25, | 917,26, | 917,27, | 917,28, | 917,29, | 917,30, | 917,31, | 917,32, | 917,33, | 917,34, | 917,35, | 917,36, | 917,37, | 917,38, | 917,39, | 917,40, | 917,41, | 917,42, | 917,43, | 917,44, | 917,45, | 917,46, | 917,47, | 917,48, | 917,49, | 917,50, | 917,51, | 917,52, | 917,53, | 917,54, | 917,55, | 917,56, | 917,57, | 917,58, | 917,59, | 917,60, | 917,61, | 917,62, | 917,63, | 917,64, | 917,65, | 917,66, | 917,67, | 917,68, | 917,69, | 917,70, | 917,71, | 917,72, | 917,73, | 917,74, | 917,75, | 917,76, | 917,77, | 917,78, | 917,79, | 917,80, | 917,81, | 917,82, | 917,83, | 917,84, | 917,85, | 918,1, | 918,2, | 918,3, | 918,4, | 918,5, | 918,6, | 918,7, | 918,8, | 918,9, | 918,10, | 918,11, | 918,12, | 918,13, | 918,14, | 918,15, | 918,16, | 918,17, | 918,18, | 918,19, | 918,20, | 918,21, | 918,22, | 918,23, | 918,24, | 918,25, | 918,26, | 918,27, | 918,28, | 918,29, | 918,30, | 918,31, | 918,32, | 918,33, | 918,34, | 918,35, | 918,36, | 918,37, | 918,38, | 918,39, | 918,40, | 918,41, | 918,42, | 918,43, | 918,44, | 918,45, | 918,46, | 918,47, | 918,48, | 918,49, | 918,50, | 918,51, | 918,52, | 918,53, | 918,54, | 918,55, | 918,56, | 918,57, | 918,58, | 918,59, | 918,60, | 918,61, | 918,62, | 918,63, | 918,64, | 918,65, | 918,66, | 918,67, | 918,68, | 918,69, | 918,70, | 918,71, | 918,72, | 918,73, | 918,74, | 918,75, | 918,76, | 918,77, | 918,78, | 918,79, | 918,80, | 918,81, | 918,82, | 918,83, | 918,84, | 918,85, | 919,1, | 919,2, | 919,3, | 919,4, | 919,5, | 919,6, | 919,7, | 919,8, | 919,9, | 919,10, | 919,11, | 919,12, | 919,13, | 919,14, | 919,15, | 919,16, | 919,17, | 919,18, | 919,19, | 919,20, | 919,21, | 919,22, | 919,23, | 919,24, | 919,25, | 919,26, | 919,27, | 919,28, | 919,29, | 919,30, | 919,31, | 919,32, | 919,33, | 919,34, | 919,35, | 919,36, | 919,37, | 919,38, | 919,39, | 919,40, | 919,41, | 919,42, | 919,43, | 919,44, | 919,45, | 919,46, | 919,47, | 919,48, | 919,49, | 919,50, | 919,51, | 919,52, | 919,53, | 919,54, | 919,55, | 919,56, | 919,57, | 919,58, | 919,59, | 919,60, | 919,61, | 919,62, | 919,63, | 919,64, | 919,65, | 919,66, | 919,67, | 919,68, | 919,69, | 919,70, | 919,71, | 919,72, | 919,73, | 919,74, | 919,75, | 919,76, | 919,77, | 919,78, | 919,79, | 919,80, | 919,81, | 919,82, | 919,83, | 919,84, | 919,85, | 920,1, | 920,2, | 920,3, | 920,4, | 920,5, | 920,6, | 920,7, | 920,8, | 920,9, | 920,10, | 920,11, | 920,12, | 920,13, | 920,14, | 920,15, | 920,16, | 920,17, | 920,18, | 920,19, | 920,20, | 920,21, | 920,22, | 920,23, | 920,24, | 920,25, | 920,26, | 920,27, | 920,28, | 920,29, | 920,30, | 920,31, | 920,32, | 920,33, | 920,34, | 920,35, | 920,36, | 920,37, | 920,38, | 920,39, | 920,40, | 920,41, | 920,42, | 920,43, | 920,44, | 920,45, | 920,46, | 920,47, | 920,48, | 920,49, | 920,50, | 920,51, | 920,52, | 920,53, | 920,54, | 920,55, | 920,56, | 920,57, | 920,58, | 920,59, | 920,60, | 920,61, | 920,62, | 920,63, | 920,64, | 920,65, | 920,66, | 920,67, | 920,68, | 920,69, | 920,70, | 920,71, | 920,72, | 920,73, | 920,74, | 920,75, | 920,76, | 920,77, | 920,78, | 920,79, | 920,80, | 920,81, | 920,82, | 920,83, | 920,84, | 920,85, | 921,1, | 921,2, | 921,3, | 921,4, | 921,5, | 921,6, | 921,7, | 921,8, | 921,9, | 921,10, | 921,11, | 921,12, | 921,13, | 921,14, | 921,15, | 921,16, | 921,17, | 921,18, | 921,19, | 921,20, | 921,21, | 921,22, | 921,23, | 921,24, | 921,25, | 921,26, | 921,27, | 921,28, | 921,29, | 921,30, | 921,31, | 921,32, | 921,33, | 921,34, | 921,35, | 921,36, | 921,37, | 921,38, | 921,39, | 921,40, | 921,41, | 921,42, | 921,43, | 921,44, | 921,45, | 921,46, | 921,47, | 921,48, | 921,49, | 921,50, | 921,51, | 921,52, | 921,53, | 921,54, | 921,55, | 921,56, | 921,57, | 921,58, | 921,59, | 921,60, | 921,61, | 921,62, | 921,63, | 921,64, | 921,65, | 921,66, | 921,67, | 921,68, | 921,69, | 921,70, | 921,71, | 921,72, | 921,73, | 921,74, | 921,75, | 921,76, | 921,77, | 921,78, | 921,79, | 921,80, | 921,81, | 921,82, | 921,83, | 921,84, | 921,85, | 922,1, | 922,2, | 922,3, | 922,4, | 922,5, | 922,6, | 922,7, | 922,8, | 922,9, | 922,10, | 922,11, | 922,12, | 922,13, | 922,14, | 922,15, | 922,16, | 922,17, | 922,18, | 922,19, | 922,20, | 922,21, | 922,22, | 922,23, | 922,24, | 922,25, | 922,26, | 922,27, | 922,28, | 922,29, | 922,30, | 922,31, | 922,32, | 922,33, | 922,34, | 922,35, | 922,36, | 922,37, | 922,38, | 922,39, | 922,40, | 922,41, | 922,42, | 922,43, | 922,44, | 922,45, | 922,46, | 922,47, | 922,48, | 922,49, | 922,50, | 922,51, | 922,52, | 922,53, | 922,54, | 922,55, | 922,56, | 922,57, | 922,58, | 922,59, | 922,60, | 922,61, | 922,62, | 922,63, | 922,64, | 922,65, | 922,66, | 922,67, | 922,68, | 922,69, | 922,70, | 922,71, | 922,72, | 922,73, | 922,74, | 922,75, | 922,76, | 922,77, | 922,78, | 922,79, | 922,80, | 922,81, | 922,82, | 922,83, | 922,84, | 922,85, | 923,1, | 923,2, | 923,3, | 923,4, | 923,5, | 923,6, | 923,7, | 923,8, | 923,9, | 923,10, | 923,11, | 923,12, | 923,13, | 923,14, | 923,15, | 923,16, | 923,17, | 923,18, | 923,19, | 923,20, | 923,21, | 923,22, | 923,23, | 923,24, | 923,25, | 923,26, | 923,27, | 923,28, | 923,29, | 923,30, | 923,31, | 923,32, | 923,33, | 923,34, | 923,35, | 923,36, | 923,37, | 923,38, | 923,39, | 923,40, | 923,41, | 923,42, | 923,43, | 923,44, | 923,45, | 923,46, | 923,47, | 923,48, | 923,49, | 923,50, | 923,51, | 923,52, | 923,53, | 923,54, | 923,55, | 923,56, | 923,57, | 923,58, | 923,59, | 923,60, | 923,61, | 923,62, | 923,63, | 923,64, | 923,65, | 923,66, | 923,67, | 923,68, | 923,69, | 923,70, | 923,71, | 923,72, | 923,73, | 923,74, | 923,75, | 923,76, | 923,77, | 923,78, | 923,79, | 923,80, | 923,81, | 923,82, | 923,83, | 923,84, | 923,85, | 924,1, | 924,2, | 924,3, | 924,4, | 924,5, | 924,6, | 924,7, | 924,8, | 924,9, | 924,10, | 924,11, | 924,12, | 924,13, | 924,14, | 924,15, | 924,16, | 924,17, | 924,18, | 924,19, | 924,20, | 924,21, | 924,22, | 924,23, | 924,24, | 924,25, | 924,26, | 924,27, | 924,28, | 924,29, | 924,30, | 924,31, | 924,32, | 924,33, | 924,34, | 924,35, | 924,36, | 924,37, | 924,38, | 924,39, | 924,40, | 924,41, | 924,42, | 924,43, | 924,44, | 924,45, | 924,46, | 924,47, | 924,48, | 924,49, | 924,50, | 924,51, | 924,52, | 924,53, | 924,54, | 924,55, | 924,56, | 924,57, | 924,58, | 924,59, | 924,60, | 924,61, | 924,62, | 924,63, | 924,64, | 924,65, | 924,66, | 924,67, | 924,68, | 924,69, | 924,70, | 924,71, | 924,72, | 924,73, | 924,74, | 924,75, | 924,76, | 924,77, | 924,78, | 924,79, | 924,80, | 924,81, | 924,82, | 924,83, | 924,84, | 924,85, | 925,1, | 925,2, | 925,3, | 925,4, | 925,5, | 925,6, | 925,7, | 925,8, | 925,9, | 925,10, | 925,11, | 925,12, | 925,13, | 925,14, | 925,15, | 925,16, | 925,17, | 925,18, | 925,19, | 925,20, | 925,21, | 925,22, | 925,23, | 925,24, | 925,25, | 925,26, | 925,27, | 925,28, | 925,29, | 925,30, | 925,31, | 925,32, | 925,33, | 925,34, | 925,35, | 925,36, | 925,37, | 925,38, | 925,39, | 925,40, | 925,41, | 925,42, | 925,43, | 925,44, | 925,45, | 925,46, | 925,47, | 925,48, | 925,49, | 925,50, | 925,51, | 925,52, | 925,53, | 925,54, | 925,55, | 925,56, | 925,57, | 925,58, | 925,59, | 925,60, | 925,61, | 925,62, | 925,63, | 925,64, | 925,65, | 925,66, | 925,67, | 925,68, | 925,69, | 925,70, | 925,71, | 925,72, | 925,73, | 925,74, | 925,75, | 925,76, | 925,77, | 925,78, | 925,79, | 925,80, | 925,81, | 925,82, | 925,83, | 925,84, | 925,85, | 926,1, | 926,2, | 926,3, | 926,4, | 926,5, | 926,6, | 926,7, | 926,8, | 926,9, | 926,10, | 926,11, | 926,12, | 926,13, | 926,14, | 926,15, | 926,16, | 926,17, | 926,18, | 926,19, | 926,20, | 926,21, | 926,22, | 926,23, | 926,24, | 926,25, | 926,26, | 926,27, | 926,28, | 926,29, | 926,30, | 926,31, | 926,32, | 926,33, | 926,34, | 926,35, | 926,36, | 926,37, | 926,38, | 926,39, | 926,40, | 926,41, | 926,42, | 926,43, | 926,44, | 926,45, | 926,46, | 926,47, | 926,48, | 926,49, | 926,50, | 926,51, | 926,52, | 926,53, | 926,54, | 926,55, | 926,56, | 926,57, | 926,58, | 926,59, | 926,60, | 926,61, | 926,62, | 926,63, | 926,64, | 926,65, | 926,66, | 926,67, | 926,68, | 926,69, | 926,70, | 926,71, | 926,72, | 926,73, | 926,74, | 926,75, | 926,76, | 926,77, | 926,78, | 926,79, | 926,80, | 926,81, | 926,82, | 926,83, | 926,84, | 926,85, | 927,1, | 927,2, | 927,3, | 927,4, | 927,5, | 927,6, | 927,7, | 927,8, | 927,9, | 927,10, | 927,11, | 927,12, | 927,13, | 927,14, | 927,15, | 927,16, | 927,17, | 927,18, | 927,19, | 927,20, | 927,21, | 927,22, | 927,23, | 927,24, | 927,25, | 927,26, | 927,27, | 927,28, | 927,29, | 927,30, | 927,31, | 927,32, | 927,33, | 927,34, | 927,35, | 927,36, | 927,37, | 927,38, | 927,39, | 927,40, | 927,41, | 927,42, | 927,43, | 927,44, | 927,45, | 927,46, | 927,47, | 927,48, | 927,49, | 927,50, | 927,51, | 927,52, | 927,53, | 927,54, | 927,55, | 927,56, | 927,57, | 927,58, | 927,59, | 927,60, | 927,61, | 927,62, | 927,63, | 927,64, | 927,65, | 927,66, | 927,67, | 927,68, | 927,69, | 927,70, | 927,71, | 927,72, | 927,73, | 927,74, | 927,75, | 927,76, | 927,77, | 927,78, | 927,79, | 927,80, | 927,81, | 927,82, | 927,83, | 927,84, | 927,85, | 928,1, | 928,2, | 928,3, | 928,4, | 928,5, | 928,6, | 928,7, | 928,8, | 928,9, | 928,10, | 928,11, | 928,12, | 928,13, | 928,14, | 928,15, | 928,16, | 928,17, | 928,18, | 928,19, | 928,20, | 928,21, | 928,22, | 928,23, | 928,24, | 928,25, | 928,26, | 928,27, | 928,28, | 928,29, | 928,30, | 928,31, | 928,32, | 928,33, | 928,34, | 928,35, | 928,36, | 928,37, | 928,38, | 928,39, | 928,40, | 928,41, | 928,42, | 928,43, | 928,44, | 928,45, | 928,46, | 928,47, | 928,48, | 928,49, | 928,50, | 928,51, | 928,52, | 928,53, | 928,54, | 928,55, | 928,56, | 928,57, | 928,58, | 928,59, | 928,60, | 928,61, | 928,62, | 928,63, | 928,64, | 928,65, | 928,66, | 928,67, | 928,68, | 928,69, | 928,70, | 928,71, | 928,72, | 928,73, | 928,74, | 928,75, | 928,76, | 928,77, | 928,78, | 928,79, | 928,80, | 928,81, | 928,82, | 928,83, | 928,84, | 928,85, | 929,1, | 929,2, | 929,3, | 929,4, | 929,5, | 929,6, | 929,7, | 929,8, | 929,9, | 929,10, | 929,11, | 929,12, | 929,13, | 929,14, | 929,15, | 929,16, | 929,17, | 929,18, | 929,19, | 929,20, | 929,21, | 929,22, | 929,23, | 929,24, | 929,25, | 929,26, | 929,27, | 929,28, | 929,29, | 929,30, | 929,31, | 929,32, | 929,33, | 929,34, | 929,35, | 929,36, | 929,37, | 929,38, | 929,39, | 929,40, | 929,41, | 929,42, | 929,43, | 929,44, | 929,45, | 929,46, | 929,47, | 929,48, | 929,49, | 929,50, | 929,51, | 929,52, | 929,53, | 929,54, | 929,55, | 929,56, | 929,57, | 929,58, | 929,59, | 929,60, | 929,61, | 929,62, | 929,63, | 929,64, | 929,65, | 929,66, | 929,67, | 929,68, | 929,69, | 929,70, | 929,71, | 929,72, | 929,73, | 929,74, | 929,75, | 929,76, | 929,77, | 929,78, | 929,79, | 929,80, | 929,81, | 929,82, | 929,83, | 929,84, | 929,85, | 930,1, | 930,2, | 930,3, | 930,4, | 930,5, | 930,6, | 930,7, | 930,8, | 930,9, | 930,10, | 930,11, | 930,12, | 930,13, | 930,14, | 930,15, | 930,16, | 930,17, | 930,18, | 930,19, | 930,20, | 930,21, | 930,22, | 930,23, | 930,24, | 930,25, | 930,26, | 930,27, | 930,28, | 930,29, | 930,30, | 930,31, | 930,32, | 930,33, | 930,34, | 930,35, | 930,36, | 930,37, | 930,38, | 930,39, | 930,40, | 930,41, | 930,42, | 930,43, | 930,44, | 930,45, | 930,46, | 930,47, | 930,48, | 930,49, | 930,50, | 930,51, | 930,52, | 930,53, | 930,54, | 930,55, | 930,56, | 930,57, | 930,58, | 930,59, | 930,60, | 930,61, | 930,62, | 930,63, | 930,64, | 930,65, | 930,66, | 930,67, | 930,68, | 930,69, | 930,70, | 930,71, | 930,72, | 930,73, | 930,74, | 930,75, | 930,76, | 930,77, | 930,78, | 930,79, | 930,80, | 930,81, | 930,82, | 930,83, | 930,84, | 930,85, | 931,1, | 931,2, | 931,3, | 931,4, | 931,5, | 931,6, | 931,7, | 931,8, | 931,9, | 931,10, | 931,11, | 931,12, | 931,13, | 931,14, | 931,15, | 931,16, | 931,17, | 931,18, | 931,19, | 931,20, | 931,21, | 931,22, | 931,23, | 931,24, | 931,25, | 931,26, | 931,27, | 931,28, | 931,29, | 931,30, | 931,31, | 931,32, | 931,33, | 931,34, | 931,35, | 931,36, | 931,37, | 931,38, | 931,39, | 931,40, | 931,41, | 931,42, | 931,43, | 931,44, | 931,45, | 931,46, | 931,47, | 931,48, | 931,49, | 931,50, | 931,51, | 931,52, | 931,53, | 931,54, | 931,55, | 931,56, | 931,57, | 931,58, | 931,59, | 931,60, | 931,61, | 931,62, | 931,63, | 931,64, | 931,65, | 931,66, | 931,67, | 931,68, | 931,69, | 931,70, | 931,71, | 931,72, | 931,73, | 931,74, | 931,75, | 931,76, | 931,77, | 931,78, | 931,79, | 931,80, | 931,81, | 931,82, | 931,83, | 931,84, | 931,85, | 932,1, | 932,2, | 932,3, | 932,4, | 932,5, | 932,6, | 932,7, | 932,8, | 932,9, | 932,10, | 932,11, | 932,12, | 932,13, | 932,14, | 932,15, | 932,16, | 932,17, | 932,18, | 932,19, | 932,20, | 932,21, | 932,22, | 932,23, | 932,24, | 932,25, | 932,26, | 932,27, | 932,28, | 932,29, | 932,30, | 932,31, | 932,32, | 932,33, | 932,34, | 932,35, | 932,36, | 932,37, | 932,38, | 932,39, | 932,40, | 932,41, | 932,42, | 932,43, | 932,44, | 932,45, | 932,46, | 932,47, | 932,48, | 932,49, | 932,50, | 932,51, | 932,52, | 932,53, | 932,54, | 932,55, | 932,56, | 932,57, | 932,58, | 932,59, | 932,60, | 932,61, | 932,62, | 932,63, | 932,64, | 932,65, | 932,66, | 932,67, | 932,68, | 932,69, | 932,70, | 932,71, | 932,72, | 932,73, | 932,74, | 932,75, | 932,76, | 932,77, | 932,78, | 932,79, | 932,80, | 932,81, | 932,82, | 932,83, | 932,84, | 932,85, | 933,1, | 933,2, | 933,3, | 933,4, | 933,5, | 933,6, | 933,7, | 933,8, | 933,9, | 933,10, | 933,11, | 933,12, | 933,13, | 933,14, | 933,15, | 933,16, | 933,17, | 933,18, | 933,19, | 933,20, | 933,21, | 933,22, | 933,23, | 933,24, | 933,25, | 933,26, | 933,27, | 933,28, | 933,29, | 933,30, | 933,31, | 933,32, | 933,33, | 933,34, | 933,35, | 933,36, | 933,37, | 933,38, | 933,39, | 933,40, | 933,41, | 933,42, | 933,43, | 933,44, | 933,45, | 933,46, | 933,47, | 933,48, | 933,49, | 933,50, | 933,51, | 933,52, | 933,53, | 933,54, | 933,55, | 933,56, | 933,57, | 933,58, | 933,59, | 933,60, | 933,61, | 933,62, | 933,63, | 933,64, | 933,65, | 933,66, | 933,67, | 933,68, | 933,69, | 933,70, | 933,71, | 933,72, | 933,73, | 933,74, | 933,75, | 933,76, | 933,77, | 933,78, | 933,79, | 933,80, | 933,81, | 933,82, | 933,83, | 933,84, | 933,85, | 934,1, | 934,2, | 934,3, | 934,4, | 934,5, | 934,6, | 934,7, | 934,8, | 934,9, | 934,10, | 934,11, | 934,12, | 934,13, | 934,14, | 934,15, | 934,16, | 934,17, | 934,18, | 934,19, | 934,20, | 934,21, | 934,22, | 934,23, | 934,24, | 934,25, | 934,26, | 934,27, | 934,28, | 934,29, | 934,30, | 934,31, | 934,32, | 934,33, | 934,34, | 934,35, | 934,36, | 934,37, | 934,38, | 934,39, | 934,40, | 934,41, | 934,42, | 934,43, | 934,44, | 934,45, | 934,46, | 934,47, | 934,48, | 934,49, | 934,50, | 934,51, | 934,52, | 934,53, | 934,54, | 934,55, | 934,56, | 934,57, | 934,58, | 934,59, | 934,60, | 934,61, | 934,62, | 934,63, | 934,64, | 934,65, | 934,66, | 934,67, | 934,68, | 934,69, | 934,70, | 934,71, | 934,72, | 934,73, | 934,74, | 934,75, | 934,76, | 934,77, | 934,78, | 934,79, | 934,80, | 934,81, | 934,82, | 934,83, | 934,84, | 934,85, | 935,1, | 935,2, | 935,3, | 935,4, | 935,5, | 935,6, | 935,7, | 935,8, | 935,9, | 935,10, | 935,11, | 935,12, | 935,13, | 935,14, | 935,15, | 935,16, | 935,17, | 935,18, | 935,19, | 935,20, | 935,21, | 935,22, | 935,23, | 935,24, | 935,25, | 935,26, | 935,27, | 935,28, | 935,29, | 935,30, | 935,31, | 935,32, | 935,33, | 935,34, | 935,35, | 935,36, | 935,37, | 935,38, | 935,39, | 935,40, | 935,41, | 935,42, | 935,43, | 935,44, | 935,45, | 935,46, | 935,47, | 935,48, | 935,49, | 935,50, | 935,51, | 935,52, | 935,53, | 935,54, | 935,55, | 935,56, | 935,57, | 935,58, | 935,59, | 935,60, | 935,61, | 935,62, | 935,63, | 935,64, | 935,65, | 935,66, | 935,67, | 935,68, | 935,69, | 935,70, | 935,71, | 935,72, | 935,73, | 935,74, | 935,75, | 935,76, | 935,77, | 935,78, | 935,79, | 935,80, | 935,81, | 935,82, | 935,83, | 935,84, | 935,85, | 936,1, | 936,2, | 936,3, | 936,4, | 936,5, | 936,6, | 936,7, | 936,8, | 936,9, | 936,10, | 936,11, | 936,12, | 936,13, | 936,14, | 936,15, | 936,16, | 936,17, | 936,18, | 936,19, | 936,20, | 936,21, | 936,22, | 936,23, | 936,24, | 936,25, | 936,26, | 936,27, | 936,28, | 936,29, | 936,30, | 936,31, | 936,32, | 936,33, | 936,34, | 936,35, | 936,36, | 936,37, | 936,38, | 936,39, | 936,40, | 936,41, | 936,42, | 936,43, | 936,44, | 936,45, | 936,46, | 936,47, | 936,48, | 936,49, | 936,50, | 936,51, | 936,52, | 936,53, | 936,54, | 936,55, | 936,56, | 936,57, | 936,58, | 936,59, | 936,60, | 936,61, | 936,62, | 936,63, | 936,64, | 936,65, | 936,66, | 936,67, | 936,68, | 936,69, | 936,70, | 936,71, | 936,72, | 936,73, | 936,74, | 936,75, | 936,76, | 936,77, | 936,78, | 936,79, | 936,80, | 936,81, | 936,82, | 936,83, | 936,84, | 936,85, | 937,1, | 937,2, | 937,3, | 937,4, | 937,5, | 937,6, | 937,7, | 937,8, | 937,9, | 937,10, | 937,11, | 937,12, | 937,13, | 937,14, | 937,15, | 937,16, | 937,17, | 937,18, | 937,19, | 937,20, | 937,21, | 937,22, | 937,23, | 937,24, | 937,25, | 937,26, | 937,27, | 937,28, | 937,29, | 937,30, | 937,31, | 937,32, | 937,33, | 937,34, | 937,35, | 937,36, | 937,37, | 937,38, | 937,39, | 937,40, | 937,41, | 937,42, | 937,43, | 937,44, | 937,45, | 937,46, | 937,47, | 937,48, | 937,49, | 937,50, | 937,51, | 937,52, | 937,53, | 937,54, | 937,55, | 937,56, | 937,57, | 937,58, | 937,59, | 937,60, | 937,61, | 937,62, | 937,63, | 937,64, | 937,65, | 937,66, | 937,67, | 937,68, | 937,69, | 937,70, | 937,71, | 937,72, | 937,73, | 937,74, | 937,75, | 937,76, | 937,77, | 937,78, | 937,79, | 937,80, | 937,81, | 937,82, | 937,83, | 937,84, | 937,85, | 938,1, | 938,2, | 938,3, | 938,4, | 938,5, | 938,6, | 938,7, | 938,8, | 938,9, | 938,10, | 938,11, | 938,12, | 938,13, | 938,14, | 938,15, | 938,16, | 938,17, | 938,18, | 938,19, | 938,20, | 938,21, | 938,22, | 938,23, | 938,24, | 938,25, | 938,26, | 938,27, | 938,28, | 938,29, | 938,30, | 938,31, | 938,32, | 938,33, | 938,34, | 938,35, | 938,36, | 938,37, | 938,38, | 938,39, | 938,40, | 938,41, | 938,42, | 938,43, | 938,44, | 938,45, | 938,46, | 938,47, | 938,48, | 938,49, | 938,50, | 938,51, | 938,52, | 938,53, | 938,54, | 938,55, | 938,56, | 938,57, | 938,58, | 938,59, | 938,60, | 938,61, | 938,62, | 938,63, | 938,64, | 938,65, | 938,66, | 938,67, | 938,68, | 938,69, | 938,70, | 938,71, | 938,72, | 938,73, | 938,74, | 938,75, | 938,76, | 938,77, | 938,78, | 938,79, | 938,80, | 938,81, | 938,82, | 938,83, | 938,84, | 938,85, | 939,1, | 939,2, | 939,3, | 939,4, | 939,5, | 939,6, | 939,7, | 939,8, | 939,9, | 939,10, | 939,11, | 939,12, | 939,13, | 939,14, | 939,15, | 939,16, | 939,17, | 939,18, | 939,19, | 939,20, | 939,21, | 939,22, | 939,23, | 939,24, | 939,25, | 939,26, | 939,27, | 939,28, | 939,29, | 939,30, | 939,31, | 939,32, | 939,33, | 939,34, | 939,35, | 939,36, | 939,37, | 939,38, | 939,39, | 939,40, | 939,41, | 939,42, | 939,43, | 939,44, | 939,45, | 939,46, | 939,47, | 939,48, | 939,49, | 939,50, | 939,51, | 939,52, | 939,53, | 939,54, | 939,55, | 939,56, | 939,57, | 939,58, | 939,59, | 939,60, | 939,61, | 939,62, | 939,63, | 939,64, | 939,65, | 939,66, | 939,67, | 939,68, | 939,69, | 939,70, | 939,71, | 939,72, | 939,73, | 939,74, | 939,75, | 939,76, | 939,77, | 939,78, | 939,79, | 939,80, | 939,81, | 939,82, | 939,83, | 939,84, | 939,85, | 940,1, | 940,2, | 940,3, | 940,4, | 940,5, | 940,6, | 940,7, | 940,8, | 940,9, | 940,10, | 940,11, | 940,12, | 940,13, | 940,14, | 940,15, | 940,16, | 940,17, | 940,18, | 940,19, | 940,20, | 940,21, | 940,22, | 940,23, | 940,24, | 940,25, | 940,26, | 940,27, | 940,28, | 940,29, | 940,30, | 940,31, | 940,32, | 940,33, | 940,34, | 940,35, | 940,36, | 940,37, | 940,38, | 940,39, | 940,40, | 940,41, | 940,42, | 940,43, | 940,44, | 940,45, | 940,46, | 940,47, | 940,48, | 940,49, | 940,50, | 940,51, | 940,52, | 940,53, | 940,54, | 940,55, | 940,56, | 940,57, | 940,58, | 940,59, | 940,60, | 940,61, | 940,62, | 940,63, | 940,64, | 940,65, | 940,66, | 940,67, | 940,68, | 940,69, | 940,70, | 940,71, | 940,72, | 940,73, | 940,74, | 940,75, | 940,76, | 940,77, | 940,78, | 940,79, | 940,80, | 940,81, | 940,82, | 940,83, | 940,84, | 940,85, | 941,1, | 941,2, | 941,3, | 941,4, | 941,5, | 941,6, | 941,7, | 941,8, | 941,9, | 941,10, | 941,11, | 941,12, | 941,13, | 941,14, | 941,15, | 941,16, | 941,17, | 941,18, | 941,19, | 941,20, | 941,21, | 941,22, | 941,23, | 941,24, | 941,25, | 941,26, | 941,27, | 941,28, | 941,29, | 941,30, | 941,31, | 941,32, | 941,33, | 941,34, | 941,35, | 941,36, | 941,37, | 941,38, | 941,39, | 941,40, | 941,41, | 941,42, | 941,43, | 941,44, | 941,45, | 941,46, | 941,47, | 941,48, | 941,49, | 941,50, | 941,51, | 941,52, | 941,53, | 941,54, | 941,55, | 941,56, | 941,57, | 941,58, | 941,59, | 941,60, | 941,61, | 941,62, | 941,63, | 941,64, | 941,65, | 941,66, | 941,67, | 941,68, | 941,69, | 941,70, | 941,71, | 941,72, | 941,73, | 941,74, | 941,75, | 941,76, | 941,77, | 941,78, | 941,79, | 941,80, | 941,81, | 941,82, | 941,83, | 941,84, | 941,85, | 942,1, | 942,2, | 942,3, | 942,4, | 942,5, | 942,6, | 942,7, | 942,8, | 942,9, | 942,10, | 942,11, | 942,12, | 942,13, | 942,14, | 942,15, | 942,16, | 942,17, | 942,18, | 942,19, | 942,20, | 942,21, | 942,22, | 942,23, | 942,24, | 942,25, | 942,26, | 942,27, | 942,28, | 942,29, | 942,30, | 942,31, | 942,32, | 942,33, | 942,34, | 942,35, | 942,36, | 942,37, | 942,38, | 942,39, | 942,40, | 942,41, | 942,42, | 942,43, | 942,44, | 942,45, | 942,46, | 942,47, | 942,48, | 942,49, | 942,50, | 942,51, | 942,52, | 942,53, | 942,54, | 942,55, | 942,56, | 942,57, | 942,58, | 942,59, | 942,60, | 942,61, | 942,62, | 942,63, | 942,64, | 942,65, | 942,66, | 942,67, | 942,68, | 942,69, | 942,70, | 942,71, | 942,72, | 942,73, | 942,74, | 942,75, | 942,76, | 942,77, | 942,78, | 942,79, | 942,80, | 942,81, | 942,82, | 942,83, | 942,84, | 942,85, | 943,1, | 943,2, | 943,3, | 943,4, | 943,5, | 943,6, | 943,7, | 943,8, | 943,9, | 943,10, | 943,11, | 943,12, | 943,13, | 943,14, | 943,15, | 943,16, | 943,17, | 943,18, | 943,19, | 943,20, | 943,21, | 943,22, | 943,23, | 943,24, | 943,25, | 943,26, | 943,27, | 943,28, | 943,29, | 943,30, | 943,31, | 943,32, | 943,33, | 943,34, | 943,35, | 943,36, | 943,37, | 943,38, | 943,39, | 943,40, | 943,41, | 943,42, | 943,43, | 943,44, | 943,45, | 943,46, | 943,47, | 943,48, | 943,49, | 943,50, | 943,51, | 943,52, | 943,53, | 943,54, | 943,55, | 943,56, | 943,57, | 943,58, | 943,59, | 943,60, | 943,61, | 943,62, | 943,63, | 943,64, | 943,65, | 943,66, | 943,67, | 943,68, | 943,69, | 943,70, | 943,71, | 943,72, | 943,73, | 943,74, | 943,75, | 943,76, | 943,77, | 943,78, | 943,79, | 943,80, | 943,81, | 943,82, | 943,83, | 943,84, | 943,85, | 944,1, | 944,2, | 944,3, | 944,4, | 944,5, | 944,6, | 944,7, | 944,8, | 944,9, | 944,10, | 944,11, | 944,12, | 944,13, | 944,14, | 944,15, | 944,16, | 944,17, | 944,18, | 944,19, | 944,20, | 944,21, | 944,22, | 944,23, | 944,24, | 944,25, | 944,26, | 944,27, | 944,28, | 944,29, | 944,30, | 944,31, | 944,32, | 944,33, | 944,34, | 944,35, | 944,36, | 944,37, | 944,38, | 944,39, | 944,40, | 944,41, | 944,42, | 944,43, | 944,44, | 944,45, | 944,46, | 944,47, | 944,48, | 944,49, | 944,50, | 944,51, | 944,52, | 944,53, | 944,54, | 944,55, | 944,56, | 944,57, | 944,58, | 944,59, | 944,60, | 944,61, | 944,62, | 944,63, | 944,64, | 944,65, | 944,66, | 944,67, | 944,68, | 944,69, | 944,70, | 944,71, | 944,72, | 944,73, | 944,74, | 944,75, | 944,76, | 944,77, | 944,78, | 944,79, | 944,80, | 944,81, | 944,82, | 944,83, | 944,84, | 944,85, | 945,1, | 945,2, | 945,3, | 945,4, | 945,5, | 945,6, | 945,7, | 945,8, | 945,9, | 945,10, | 945,11, | 945,12, | 945,13, | 945,14, | 945,15, | 945,16, | 945,17, | 945,18, | 945,19, | 945,20, | 945,21, | 945,22, | 945,23, | 945,24, | 945,25, | 945,26, | 945,27, | 945,28, | 945,29, | 945,30, | 945,31, | 945,32, | 945,33, | 945,34, | 945,35, | 945,36, | 945,37, | 945,38, | 945,39, | 945,40, | 945,41, | 945,42, | 945,43, | 945,44, | 945,45, | 945,46, | 945,47, | 945,48, | 945,49, | 945,50, | 945,51, | 945,52, | 945,53, | 945,54, | 945,55, | 945,56, | 945,57, | 945,58, | 945,59, | 945,60, | 945,61, | 945,62, | 945,63, | 945,64, | 945,65, | 945,66, | 945,67, | 945,68, | 945,69, | 945,70, | 945,71, | 945,72, | 945,73, | 945,74, | 945,75, | 945,76, | 945,77, | 945,78, | 945,79, | 945,80, | 945,81, | 945,82, | 945,83, | 945,84, | 945,85, | 946,1, | 946,2, | 946,3, | 946,4, | 946,5, | 946,6, | 946,7, | 946,8, | 946,9, | 946,10, | 946,11, | 946,12, | 946,13, | 946,14, | 946,15, | 946,16, | 946,17, | 946,18, | 946,19, | 946,20, | 946,21, | 946,22, | 946,23, | 946,24, | 946,25, | 946,26, | 946,27, | 946,28, | 946,29, | 946,30, | 946,31, | 946,32, | 946,33, | 946,34, | 946,35, | 946,36, | 946,37, | 946,38, | 946,39, | 946,40, | 946,41, | 946,42, | 946,43, | 946,44, | 946,45, | 946,46, | 946,47, | 946,48, | 946,49, | 946,50, | 946,51, | 946,52, | 946,53, | 946,54, | 946,55, | 946,56, | 946,57, | 946,58, | 946,59, | 946,60, | 946,61, | 946,62, | 946,63, | 946,64, | 946,65, | 946,66, | 946,67, | 946,68, | 946,69, | 946,70, | 946,71, | 946,72, | 946,73, | 946,74, | 946,75, | 946,76, | 946,77, | 946,78, | 946,79, | 946,80, | 946,81, | 946,82, | 946,83, | 946,84, | 946,85, | 947,1, | 947,2, | 947,3, | 947,4, | 947,5, | 947,6, | 947,7, | 947,8, | 947,9, | 947,10, | 947,11, | 947,12, | 947,13, | 947,14, | 947,15, | 947,16, | 947,17, | 947,18, | 947,19, | 947,20, | 947,21, | 947,22, | 947,23, | 947,24, | 947,25, | 947,26, | 947,27, | 947,28, | 947,29, | 947,30, | 947,31, | 947,32, | 947,33, | 947,34, | 947,35, | 947,36, | 947,37, | 947,38, | 947,39, | 947,40, | 947,41, | 947,42, | 947,43, | 947,44, | 947,45, | 947,46, | 947,47, | 947,48, | 947,49, | 947,50, | 947,51, | 947,52, | 947,53, | 947,54, | 947,55, | 947,56, | 947,57, | 947,58, | 947,59, | 947,60, | 947,61, | 947,62, | 947,63, | 947,64, | 947,65, | 947,66, | 947,67, | 947,68, | 947,69, | 947,70, | 947,71, | 947,72, | 947,73, | 947,74, | 947,75, | 947,76, | 947,77, | 947,78, | 947,79, | 947,80, | 947,81, | 947,82, | 947,83, | 947,84, | 947,85, | 948,1, | 948,2, | 948,3, | 948,4, | 948,5, | 948,6, | 948,7, | 948,8, | 948,9, | 948,10, | 948,11, | 948,12, | 948,13, | 948,14, | 948,15, | 948,16, | 948,17, | 948,18, | 948,19, | 948,20, | 948,21, | 948,22, | 948,23, | 948,24, | 948,25, | 948,26, | 948,27, | 948,28, | 948,29, | 948,30, | 948,31, | 948,32, | 948,33, | 948,34, | 948,35, | 948,36, | 948,37, | 948,38, | 948,39, | 948,40, | 948,41, | 948,42, | 948,43, | 948,44, | 948,45, | 948,46, | 948,47, | 948,48, | 948,49, | 948,50, | 948,51, | 948,52, | 948,53, | 948,54, | 948,55, | 948,56, | 948,57, | 948,58, | 948,59, | 948,60, | 948,61, | 948,62, | 948,63, | 948,64, | 948,65, | 948,66, | 948,67, | 948,68, | 948,69, | 948,70, | 948,71, | 948,72, | 948,73, | 948,74, | 948,75, | 948,76, | 948,77, | 948,78, | 948,79, | 948,80, | 948,81, | 948,82, | 948,83, | 948,84, | 948,85, | 949,1, | 949,2, | 949,3, | 949,4, | 949,5, | 949,6, | 949,7, | 949,8, | 949,9, | 949,10, | 949,11, | 949,12, | 949,13, | 949,14, | 949,15, | 949,16, | 949,17, | 949,18, | 949,19, | 949,20, | 949,21, | 949,22, | 949,23, | 949,24, | 949,25, | 949,26, | 949,27, | 949,28, | 949,29, | 949,30, | 949,31, | 949,32, | 949,33, | 949,34, | 949,35, | 949,36, | 949,37, | 949,38, | 949,39, | 949,40, | 949,41, | 949,42, | 949,43, | 949,44, | 949,45, | 949,46, | 949,47, | 949,48, | 949,49, | 949,50, | 949,51, | 949,52, | 949,53, | 949,54, | 949,55, | 949,56, | 949,57, | 949,58, | 949,59, | 949,60, | 949,61, | 949,62, | 949,63, | 949,64, | 949,65, | 949,66, | 949,67, | 949,68, | 949,69, | 949,70, | 949,71, | 949,72, | 949,73, | 949,74, | 949,75, | 949,76, | 949,77, | 949,78, | 949,79, | 949,80, | 949,81, | 949,82, | 949,83, | 949,84, | 949,85, | 950,1, | 950,2, | 950,3, | 950,4, | 950,5, | 950,6, | 950,7, | 950,8, | 950,9, | 950,10, | 950,11, | 950,12, | 950,13, | 950,14, | 950,15, | 950,16, | 950,17, | 950,18, | 950,19, | 950,20, | 950,21, | 950,22, | 950,23, | 950,24, | 950,25, | 950,26, | 950,27, | 950,28, | 950,29, | 950,30, | 950,31, | 950,32, | 950,33, | 950,34, | 950,35, | 950,36, | 950,37, | 950,38, | 950,39, | 950,40, | 950,41, | 950,42, | 950,43, | 950,44, | 950,45, | 950,46, | 950,47, | 950,48, | 950,49, | 950,50, | 950,51, | 950,52, | 950,53, | 950,54, | 950,55, | 950,56, | 950,57, | 950,58, | 950,59, | 950,60, | 950,61, | 950,62, | 950,63, | 950,64, | 950,65, | 950,66, | 950,67, | 950,68, | 950,69, | 950,70, | 950,71, | 950,72, | 950,73, | 950,74, | 950,75, | 950,76, | 950,77, | 950,78, | 950,79, | 950,80, | 950,81, | 950,82, | 950,83, | 950,84, | 950,85, | 951,1, | 951,2, | 951,3, | 951,4, | 951,5, | 951,6, | 951,7, | 951,8, | 951,9, | 951,10, | 951,11, | 951,12, | 951,13, | 951,14, | 951,15, | 951,16, | 951,17, | 951,18, | 951,19, | 951,20, | 951,21, | 951,22, | 951,23, | 951,24, | 951,25, | 951,26, | 951,27, | 951,28, | 951,29, | 951,30, | 951,31, | 951,32, | 951,33, | 951,34, | 951,35, | 951,36, | 951,37, | 951,38, | 951,39, | 951,40, | 951,41, | 951,42, | 951,43, | 951,44, | 951,45, | 951,46, | 951,47, | 951,48, | 951,49, | 951,50, | 951,51, | 951,52, | 951,53, | 951,54, | 951,55, | 951,56, | 951,57, | 951,58, | 951,59, | 951,60, | 951,61, | 951,62, | 951,63, | 951,64, | 951,65, | 951,66, | 951,67, | 951,68, | 951,69, | 951,70, | 951,71, | 951,72, | 951,73, | 951,74, | 951,75, | 951,76, | 951,77, | 951,78, | 951,79, | 951,80, | 951,81, | 951,82, | 951,83, | 951,84, | 951,85, | 952,1, | 952,2, | 952,3, | 952,4, | 952,5, | 952,6, | 952,7, | 952,8, | 952,9, | 952,10, | 952,11, | 952,12, | 952,13, | 952,14, | 952,15, | 952,16, | 952,17, | 952,18, | 952,19, | 952,20, | 952,21, | 952,22, | 952,23, | 952,24, | 952,25, | 952,26, | 952,27, | 952,28, | 952,29, | 952,30, | 952,31, | 952,32, | 952,33, | 952,34, | 952,35, | 952,36, | 952,37, | 952,38, | 952,39, | 952,40, | 952,41, | 952,42, | 952,43, | 952,44, | 952,45, | 952,46, | 952,47, | 952,48, | 952,49, | 952,50, | 952,51, | 952,52, | 952,53, | 952,54, | 952,55, | 952,56, | 952,57, | 952,58, | 952,59, | 952,60, | 952,61, | 952,62, | 952,63, | 952,64, | 952,65, | 952,66, | 952,67, | 952,68, | 952,69, | 952,70, | 952,71, | 952,72, | 952,73, | 952,74, | 952,75, | 952,76, | 952,77, | 952,78, | 952,79, | 952,80, | 952,81, | 952,82, | 952,83, | 952,84, | 952,85, | 953,1, | 953,2, | 953,3, | 953,4, | 953,5, | 953,6, | 953,7, | 953,8, | 953,9, | 953,10, | 953,11, | 953,12, | 953,13, | 953,14, | 953,15, | 953,16, | 953,17, | 953,18, | 953,19, | 953,20, | 953,21, | 953,22, | 953,23, | 953,24, | 953,25, | 953,26, | 953,27, | 953,28, | 953,29, | 953,30, | 953,31, | 953,32, | 953,33, | 953,34, | 953,35, | 953,36, | 953,37, | 953,38, | 953,39, | 953,40, | 953,41, | 953,42, | 953,43, | 953,44, | 953,45, | 953,46, | 953,47, | 953,48, | 953,49, | 953,50, | 953,51, | 953,52, | 953,53, | 953,54, | 953,55, | 953,56, | 953,57, | 953,58, | 953,59, | 953,60, | 953,61, | 953,62, | 953,63, | 953,64, | 953,65, | 953,66, | 953,67, | 953,68, | 953,69, | 953,70, | 953,71, | 953,72, | 953,73, | 953,74, | 953,75, | 953,76, | 953,77, | 953,78, | 953,79, | 953,80, | 953,81, | 953,82, | 953,83, | 953,84, | 953,85, | 954,1, | 954,2, | 954,3, | 954,4, | 954,5, | 954,6, | 954,7, | 954,8, | 954,9, | 954,10, | 954,11, | 954,12, | 954,13, | 954,14, | 954,15, | 954,16, | 954,17, | 954,18, | 954,19, | 954,20, | 954,21, | 954,22, | 954,23, | 954,24, | 954,25, | 954,26, | 954,27, | 954,28, | 954,29, | 954,30, | 954,31, | 954,32, | 954,33, | 954,34, | 954,35, | 954,36, | 954,37, | 954,38, | 954,39, | 954,40, | 954,41, | 954,42, | 954,43, | 954,44, | 954,45, | 954,46, | 954,47, | 954,48, | 954,49, | 954,50, | 954,51, | 954,52, | 954,53, | 954,54, | 954,55, | 954,56, | 954,57, | 954,58, | 954,59, | 954,60, | 954,61, | 954,62, | 954,63, | 954,64, | 954,65, | 954,66, | 954,67, | 954,68, | 954,69, | 954,70, | 954,71, | 954,72, | 954,73, | 954,74, | 954,75, | 954,76, | 954,77, | 954,78, | 954,79, | 954,80, | 954,81, | 954,82, | 954,83, | 954,84, | 954,85, | 955,1, | 955,2, | 955,3, | 955,4, | 955,5, | 955,6, | 955,7, | 955,8, | 955,9, | 955,10, | 955,11, | 955,12, | 955,13, | 955,14, | 955,15, | 955,16, | 955,17, | 955,18, | 955,19, | 955,20, | 955,21, | 955,22, | 955,23, | 955,24, | 955,25, | 955,26, | 955,27, | 955,28, | 955,29, | 955,30, | 955,31, | 955,32, | 955,33, | 955,34, | 955,35, | 955,36, | 955,37, | 955,38, | 955,39, | 955,40, | 955,41, | 955,42, | 955,43, | 955,44, | 955,45, | 955,46, | 955,47, | 955,48, | 955,49, | 955,50, | 955,51, | 955,52, | 955,53, | 955,54, | 955,55, | 955,56, | 955,57, | 955,58, | 955,59, | 955,60, | 955,61, | 955,62, | 955,63, | 955,64, | 955,65, | 955,66, | 955,67, | 955,68, | 955,69, | 955,70, | 955,71, | 955,72, | 955,73, | 955,74, | 955,75, | 955,76, | 955,77, | 955,78, | 955,79, | 955,80, | 955,81, | 955,82, | 955,83, | 955,84, | 955,85, | 956,1, | 956,2, | 956,3, | 956,4, | 956,5, | 956,6, | 956,7, | 956,8, | 956,9, | 956,10, | 956,11, | 956,12, | 956,13, | 956,14, | 956,15, | 956,16, | 956,17, | 956,18, | 956,19, | 956,20, | 956,21, | 956,22, | 956,23, | 956,24, | 956,25, | 956,26, | 956,27, | 956,28, | 956,29, | 956,30, | 956,31, | 956,32, | 956,33, | 956,34, | 956,35, | 956,36, | 956,37, | 956,38, | 956,39, | 956,40, | 956,41, | 956,42, | 956,43, | 956,44, | 956,45, | 956,46, | 956,47, | 956,48, | 956,49, | 956,50, | 956,51, | 956,52, | 956,53, | 956,54, | 956,55, | 956,56, | 956,57, | 956,58, | 956,59, | 956,60, | 956,61, | 956,62, | 956,63, | 956,64, | 956,65, | 956,66, | 956,67, | 956,68, | 956,69, | 956,70, | 956,71, | 956,72, | 956,73, | 956,74, | 956,75, | 956,76, | 956,77, | 956,78, | 956,79, | 956,80, | 956,81, | 956,82, | 956,83, | 956,84, | 956,85, | 957,1, | 957,2, | 957,3, | 957,4, | 957,5, | 957,6, | 957,7, | 957,8, | 957,9, | 957,10, | 957,11, | 957,12, | 957,13, | 957,14, | 957,15, | 957,16, | 957,17, | 957,18, | 957,19, | 957,20, | 957,21, | 957,22, | 957,23, | 957,24, | 957,25, | 957,26, | 957,27, | 957,28, | 957,29, | 957,30, | 957,31, | 957,32, | 957,33, | 957,34, | 957,35, | 957,36, | 957,37, | 957,38, | 957,39, | 957,40, | 957,41, | 957,42, | 957,43, | 957,44, | 957,45, | 957,46, | 957,47, | 957,48, | 957,49, | 957,50, | 957,51, | 957,52, | 957,53, | 957,54, | 957,55, | 957,56, | 957,57, | 957,58, | 957,59, | 957,60, | 957,61, | 957,62, | 957,63, | 957,64, | 957,65, | 957,66, | 957,67, | 957,68, | 957,69, | 957,70, | 957,71, | 957,72, | 957,73, | 957,74, | 957,75, | 957,76, | 957,77, | 957,78, | 957,79, | 957,80, | 957,81, | 957,82, | 957,83, | 957,84, | 957,85, | 958,1, | 958,2, | 958,3, | 958,4, | 958,5, | 958,6, | 958,7, | 958,8, | 958,9, | 958,10, | 958,11, | 958,12, | 958,13, | 958,14, | 958,15, | 958,16, | 958,17, | 958,18, | 958,19, | 958,20, | 958,21, | 958,22, | 958,23, | 958,24, | 958,25, | 958,26, | 958,27, | 958,28, | 958,29, | 958,30, | 958,31, | 958,32, | 958,33, | 958,34, | 958,35, | 958,36, | 958,37, | 958,38, | 958,39, | 958,40, | 958,41, | 958,42, | 958,43, | 958,44, | 958,45, | 958,46, | 958,47, | 958,48, | 958,49, | 958,50, | 958,51, | 958,52, | 958,53, | 958,54, | 958,55, | 958,56, | 958,57, | 958,58, | 958,59, | 958,60, | 958,61, | 958,62, | 958,63, | 958,64, | 958,65, | 958,66, | 958,67, | 958,68, | 958,69, | 958,70, | 958,71, | 958,72, | 958,73, | 958,74, | 958,75, | 958,76, | 958,77, | 958,78, | 958,79, | 958,80, | 958,81, | 958,82, | 958,83, | 958,84, | 958,85, | 959,1, | 959,2, | 959,3, | 959,4, | 959,5, | 959,6, | 959,7, | 959,8, | 959,9, | 959,10, | 959,11, | 959,12, | 959,13, | 959,14, | 959,15, | 959,16, | 959,17, | 959,18, | 959,19, | 959,20, | 959,21, | 959,22, | 959,23, | 959,24, | 959,25, | 959,26, | 959,27, | 959,28, | 959,29, | 959,30, | 959,31, | 959,32, | 959,33, | 959,34, | 959,35, | 959,36, | 959,37, | 959,38, | 959,39, | 959,40, | 959,41, | 959,42, | 959,43, | 959,44, | 959,45, | 959,46, | 959,47, | 959,48, | 959,49, | 959,50, | 959,51, | 959,52, | 959,53, | 959,54, | 959,55, | 959,56, | 959,57, | 959,58, | 959,59, | 959,60, | 959,61, | 959,62, | 959,63, | 959,64, | 959,65, | 959,66, | 959,67, | 959,68, | 959,69, | 959,70, | 959,71, | 959,72, | 959,73, | 959,74, | 959,75, | 959,76, | 959,77, | 959,78, | 959,79, | 959,80, | 959,81, | 959,82, | 959,83, | 959,84, | 959,85, | 960,1, | 960,2, | 960,3, | 960,4, | 960,5, | 960,6, | 960,7, | 960,8, | 960,9, | 960,10, | 960,11, | 960,12, | 960,13, | 960,14, | 960,15, | 960,16, | 960,17, | 960,18, | 960,19, | 960,20, | 960,21, | 960,22, | 960,23, | 960,24, | 960,25, | 960,26, | 960,27, | 960,28, | 960,29, | 960,30, | 960,31, | 960,32, | 960,33, | 960,34, | 960,35, | 960,36, | 960,37, | 960,38, | 960,39, | 960,40, | 960,41, | 960,42, | 960,43, | 960,44, | 960,45, | 960,46, | 960,47, | 960,48, | 960,49, | 960,50, | 960,51, | 960,52, | 960,53, | 960,54, | 960,55, | 960,56, | 960,57, | 960,58, | 960,59, | 960,60, | 960,61, | 960,62, | 960,63, | 960,64, | 960,65, | 960,66, | 960,67, | 960,68, | 960,69, | 960,70, | 960,71, | 960,72, | 960,73, | 960,74, | 960,75, | 960,76, | 960,77, | 960,78, | 960,79, | 960,80, | 960,81, | 960,82, | 960,83, | 960,84, | 960,85, | 961,1, | 961,2, | 961,3, | 961,4, | 961,5, | 961,6, | 961,7, | 961,8, | 961,9, | 961,10, | 961,11, | 961,12, | 961,13, | 961,14, | 961,15, | 961,16, | 961,17, | 961,18, | 961,19, | 961,20, | 961,21, | 961,22, | 961,23, | 961,24, | 961,25, | 961,26, | 961,27, | 961,28, | 961,29, | 961,30, | 961,31, | 961,32, | 961,33, | 961,34, | 961,35, | 961,36, | 961,37, | 961,38, | 961,39, | 961,40, | 961,41, | 961,42, | 961,43, | 961,44, | 961,45, | 961,46, | 961,47, | 961,48, | 961,49, | 961,50, | 961,51, | 961,52, | 961,53, | 961,54, | 961,55, | 961,56, | 961,57, | 961,58, | 961,59, | 961,60, | 961,61, | 961,62, | 961,63, | 961,64, | 961,65, | 961,66, | 961,67, | 961,68, | 961,69, | 961,70, | 961,71, | 961,72, | 961,73, | 961,74, | 961,75, | 961,76, | 961,77, | 961,78, | 961,79, | 961,80, | 961,81, | 961,82, | 961,83, | 961,84, | 961,85, | 962,1, | 962,2, | 962,3, | 962,4, | 962,5, | 962,6, | 962,7, | 962,8, | 962,9, | 962,10, | 962,11, | 962,12, | 962,13, | 962,14, | 962,15, | 962,16, | 962,17, | 962,18, | 962,19, | 962,20, | 962,21, | 962,22, | 962,23, | 962,24, | 962,25, | 962,26, | 962,27, | 962,28, | 962,29, | 962,30, | 962,31, | 962,32, | 962,33, | 962,34, | 962,35, | 962,36, | 962,37, | 962,38, | 962,39, | 962,40, | 962,41, | 962,42, | 962,43, | 962,44, | 962,45, | 962,46, | 962,47, | 962,48, | 962,49, | 962,50, | 962,51, | 962,52, | 962,53, | 962,54, | 962,55, | 962,56, | 962,57, | 962,58, | 962,59, | 962,60, | 962,61, | 962,62, | 962,63, | 962,64, | 962,65, | 962,66, | 962,67, | 962,68, | 962,69, | 962,70, | 962,71, | 962,72, | 962,73, | 962,74, | 962,75, | 962,76, | 962,77, | 962,78, | 962,79, | 962,80, | 962,81, | 962,82, | 962,83, | 962,84, | 962,85, | 963,1, | 963,2, | 963,3, | 963,4, | 963,5, | 963,6, | 963,7, | 963,8, | 963,9, | 963,10, | 963,11, | 963,12, | 963,13, | 963,14, | 963,15, | 963,16, | 963,17, | 963,18, | 963,19, | 963,20, | 963,21, | 963,22, | 963,23, | 963,24, | 963,25, | 963,26, | 963,27, | 963,28, | 963,29, | 963,30, | 963,31, | 963,32, | 963,33, | 963,34, | 963,35, | 963,36, | 963,37, | 963,38, | 963,39, | 963,40, | 963,41, | 963,42, | 963,43, | 963,44, | 963,45, | 963,46, | 963,47, | 963,48, | 963,49, | 963,50, | 963,51, | 963,52, | 963,53, | 963,54, | 963,55, | 963,56, | 963,57, | 963,58, | 963,59, | 963,60, | 963,61, | 963,62, | 963,63, | 963,64, | 963,65, | 963,66, | 963,67, | 963,68, | 963,69, | 963,70, | 963,71, | 963,72, | 963,73, | 963,74, | 963,75, | 963,76, | 963,77, | 963,78, | 963,79, | 963,80, | 963,81, | 963,82, | 963,83, | 963,84, | 963,85, | 964,1, | 964,2, | 964,3, | 964,4, | 964,5, | 964,6, | 964,7, | 964,8, | 964,9, | 964,10, | 964,11, | 964,12, | 964,13, | 964,14, | 964,15, | 964,16, | 964,17, | 964,18, | 964,19, | 964,20, | 964,21, | 964,22, | 964,23, | 964,24, | 964,25, | 964,26, | 964,27, | 964,28, | 964,29, | 964,30, | 964,31, | 964,32, | 964,33, | 964,34, | 964,35, | 964,36, | 964,37, | 964,38, | 964,39, | 964,40, | 964,41, | 964,42, | 964,43, | 964,44, | 964,45, | 964,46, | 964,47, | 964,48, | 964,49, | 964,50, | 964,51, | 964,52, | 964,53, | 964,54, | 964,55, | 964,56, | 964,57, | 964,58, | 964,59, | 964,60, | 964,61, | 964,62, | 964,63, | 964,64, | 964,65, | 964,66, | 964,67, | 964,68, | 964,69, | 964,70, | 964,71, | 964,72, | 964,73, | 964,74, | 964,75, | 964,76, | 964,77, | 964,78, | 964,79, | 964,80, | 964,81, | 964,82, | 964,83, | 964,84, | 964,85, | 965,1, | 965,2, | 965,3, | 965,4, | 965,5, | 965,6, | 965,7, | 965,8, | 965,9, | 965,10, | 965,11, | 965,12, | 965,13, | 965,14, | 965,15, | 965,16, | 965,17, | 965,18, | 965,19, | 965,20, | 965,21, | 965,22, | 965,23, | 965,24, | 965,25, | 965,26, | 965,27, | 965,28, | 965,29, | 965,30, | 965,31, | 965,32, | 965,33, | 965,34, | 965,35, | 965,36, | 965,37, | 965,38, | 965,39, | 965,40, | 965,41, | 965,42, | 965,43, | 965,44, | 965,45, | 965,46, | 965,47, | 965,48, | 965,49, | 965,50, | 965,51, | 965,52, | 965,53, | 965,54, | 965,55, | 965,56, | 965,57, | 965,58, | 965,59, | 965,60, | 965,61, | 965,62, | 965,63, | 965,64, | 965,65, | 965,66, | 965,67, | 965,68, | 965,69, | 965,70, | 965,71, | 965,72, | 965,73, | 965,74, | 965,75, | 965,76, | 965,77, | 965,78, | 965,79, | 965,80, | 965,81, | 965,82, | 965,83, | 965,84, | 965,85, | 966,1, | 966,2, | 966,3, | 966,4, | 966,5, | 966,6, | 966,7, | 966,8, | 966,9, | 966,10, | 966,11, | 966,12, | 966,13, | 966,14, | 966,15, | 966,16, | 966,17, | 966,18, | 966,19, | 966,20, | 966,21, | 966,22, | 966,23, | 966,24, | 966,25, | 966,26, | 966,27, | 966,28, | 966,29, | 966,30, | 966,31, | 966,32, | 966,33, | 966,34, | 966,35, | 966,36, | 966,37, | 966,38, | 966,39, | 966,40, | 966,41, | 966,42, | 966,43, | 966,44, | 966,45, | 966,46, | 966,47, | 966,48, | 966,49, | 966,50, | 966,51, | 966,52, | 966,53, | 966,54, | 966,55, | 966,56, | 966,57, | 966,58, | 966,59, | 966,60, | 966,61, | 966,62, | 966,63, | 966,64, | 966,65, | 966,66, | 966,67, | 966,68, | 966,69, | 966,70, | 966,71, | 966,72, | 966,73, | 966,74, | 966,75, | 966,76, | 966,77, | 966,78, | 966,79, | 966,80, | 966,81, | 966,82, | 966,83, | 966,84, | 966,85, | 967,1, | 967,2, | 967,3, | 967,4, | 967,5, | 967,6, | 967,7, | 967,8, | 967,9, | 967,10, | 967,11, | 967,12, | 967,13, | 967,14, | 967,15, | 967,16, | 967,17, | 967,18, | 967,19, | 967,20, | 967,21, | 967,22, | 967,23, | 967,24, | 967,25, | 967,26, | 967,27, | 967,28, | 967,29, | 967,30, | 967,31, | 967,32, | 967,33, | 967,34, | 967,35, | 967,36, | 967,37, | 967,38, | 967,39, | 967,40, | 967,41, | 967,42, | 967,43, | 967,44, | 967,45, | 967,46, | 967,47, | 967,48, | 967,49, | 967,50, | 967,51, | 967,52, | 967,53, | 967,54, | 967,55, | 967,56, | 967,57, | 967,58, | 967,59, | 967,60, | 967,61, | 967,62, | 967,63, | 967,64, | 967,65, | 967,66, | 967,67, | 967,68, | 967,69, | 967,70, | 967,71, | 967,72, | 967,73, | 967,74, | 967,75, | 967,76, | 967,77, | 967,78, | 967,79, | 967,80, | 967,81, | 967,82, | 967,83, | 967,84, | 967,85, | 968,1, | 968,2, | 968,3, | 968,4, | 968,5, | 968,6, | 968,7, | 968,8, | 968,9, | 968,10, | 968,11, | 968,12, | 968,13, | 968,14, | 968,15, | 968,16, | 968,17, | 968,18, | 968,19, | 968,20, | 968,21, | 968,22, | 968,23, | 968,24, | 968,25, | 968,26, | 968,27, | 968,28, | 968,29, | 968,30, | 968,31, | 968,32, | 968,33, | 968,34, | 968,35, | 968,36, | 968,37, | 968,38, | 968,39, | 968,40, | 968,41, | 968,42, | 968,43, | 968,44, | 968,45, | 968,46, | 968,47, | 968,48, | 968,49, | 968,50, | 968,51, | 968,52, | 968,53, | 968,54, | 968,55, | 968,56, | 968,57, | 968,58, | 968,59, | 968,60, | 968,61, | 968,62, | 968,63, | 968,64, | 968,65, | 968,66, | 968,67, | 968,68, | 968,69, | 968,70, | 968,71, | 968,72, | 968,73, | 968,74, | 968,75, | 968,76, | 968,77, | 968,78, | 968,79, | 968,80, | 968,81, | 968,82, | 968,83, | 968,84, | 968,85, | 969,1, | 969,2, | 969,3, | 969,4, | 969,5, | 969,6, | 969,7, | 969,8, | 969,9, | 969,10, | 969,11, | 969,12, | 969,13, | 969,14, | 969,15, | 969,16, | 969,17, | 969,18, | 969,19, | 969,20, | 969,21, | 969,22, | 969,23, | 969,24, | 969,25, | 969,26, | 969,27, | 969,28, | 969,29, | 969,30, | 969,31, | 969,32, | 969,33, | 969,34, | 969,35, | 969,36, | 969,37, | 969,38, | 969,39, | 969,40, | 969,41, | 969,42, | 969,43, | 969,44, | 969,45, | 969,46, | 969,47, | 969,48, | 969,49, | 969,50, | 969,51, | 969,52, | 969,53, | 969,54, | 969,55, | 969,56, | 969,57, | 969,58, | 969,59, | 969,60, | 969,61, | 969,62, | 969,63, | 969,64, | 969,65, | 969,66, | 969,67, | 969,68, | 969,69, | 969,70, | 969,71, | 969,72, | 969,73, | 969,74, | 969,75, | 969,76, | 969,77, | 969,78, | 969,79, | 969,80, | 969,81, | 969,82, | 969,83, | 969,84, | 969,85, | 970,1, | 970,2, | 970,3, | 970,4, | 970,5, | 970,6, | 970,7, | 970,8, | 970,9, | 970,10, | 970,11, | 970,12, | 970,13, | 970,14, | 970,15, | 970,16, | 970,17, | 970,18, | 970,19, | 970,20, | 970,21, | 970,22, | 970,23, | 970,24, | 970,25, | 970,26, | 970,27, | 970,28, | 970,29, | 970,30, | 970,31, | 970,32, | 970,33, | 970,34, | 970,35, | 970,36, | 970,37, | 970,38, | 970,39, | 970,40, | 970,41, | 970,42, | 970,43, | 970,44, | 970,45, | 970,46, | 970,47, | 970,48, | 970,49, | 970,50, | 970,51, | 970,52, | 970,53, | 970,54, | 970,55, | 970,56, | 970,57, | 970,58, | 970,59, | 970,60, | 970,61, | 970,62, | 970,63, | 970,64, | 970,65, | 970,66, | 970,67, | 970,68, | 970,69, | 970,70, | 970,71, | 970,72, | 970,73, | 970,74, | 970,75, | 970,76, | 970,77, | 970,78, | 970,79, | 970,80, | 970,81, | 970,82, | 970,83, | 970,84, | 970,85, | 971,1, | 971,2, | 971,3, | 971,4, | 971,5, | 971,6, | 971,7, | 971,8, | 971,9, | 971,10, | 971,11, | 971,12, | 971,13, | 971,14, | 971,15, | 971,16, | 971,17, | 971,18, | 971,19, | 971,20, | 971,21, | 971,22, | 971,23, | 971,24, | 971,25, | 971,26, | 971,27, | 971,28, | 971,29, | 971,30, | 971,31, | 971,32, | 971,33, | 971,34, | 971,35, | 971,36, | 971,37, | 971,38, | 971,39, | 971,40, | 971,41, | 971,42, | 971,43, | 971,44, | 971,45, | 971,46, | 971,47, | 971,48, | 971,49, | 971,50, | 971,51, | 971,52, | 971,53, | 971,54, | 971,55, | 971,56, | 971,57, | 971,58, | 971,59, | 971,60, | 971,61, | 971,62, | 971,63, | 971,64, | 971,65, | 971,66, | 971,67, | 971,68, | 971,69, | 971,70, | 971,71, | 971,72, | 971,73, | 971,74, | 971,75, | 971,76, | 971,77, | 971,78, | 971,79, | 971,80, | 971,81, | 971,82, | 971,83, | 971,84, | 971,85, | 972,1, | 972,2, | 972,3, | 972,4, | 972,5, | 972,6, | 972,7, | 972,8, | 972,9, | 972,10, | 972,11, | 972,12, | 972,13, | 972,14, | 972,15, | 972,16, | 972,17, | 972,18, | 972,19, | 972,20, | 972,21, | 972,22, | 972,23, | 972,24, | 972,25, | 972,26, | 972,27, | 972,28, | 972,29, | 972,30, | 972,31, | 972,32, | 972,33, | 972,34, | 972,35, | 972,36, | 972,37, | 972,38, | 972,39, | 972,40, | 972,41, | 972,42, | 972,43, | 972,44, | 972,45, | 972,46, | 972,47, | 972,48, | 972,49, | 972,50, | 972,51, | 972,52, | 972,53, | 972,54, | 972,55, | 972,56, | 972,57, | 972,58, | 972,59, | 972,60, | 972,61, | 972,62, | 972,63, | 972,64, | 972,65, | 972,66, | 972,67, | 972,68, | 972,69, | 972,70, | 972,71, | 972,72, | 972,73, | 972,74, | 972,75, | 972,76, | 972,77, | 972,78, | 972,79, | 972,80, | 972,81, | 972,82, | 972,83, | 972,84, | 972,85, | 973,1, | 973,2, | 973,3, | 973,4, | 973,5, | 973,6, | 973,7, | 973,8, | 973,9, | 973,10, | 973,11, | 973,12, | 973,13, | 973,14, | 973,15, | 973,16, | 973,17, | 973,18, | 973,19, | 973,20, | 973,21, | 973,22, | 973,23, | 973,24, | 973,25, | 973,26, | 973,27, | 973,28, | 973,29, | 973,30, | 973,31, | 973,32, | 973,33, | 973,34, | 973,35, | 973,36, | 973,37, | 973,38, | 973,39, | 973,40, | 973,41, | 973,42, | 973,43, | 973,44, | 973,45, | 973,46, | 973,47, | 973,48, | 973,49, | 973,50, | 973,51, | 973,52, | 973,53, | 973,54, | 973,55, | 973,56, | 973,57, | 973,58, | 973,59, | 973,60, | 973,61, | 973,62, | 973,63, | 973,64, | 973,65, | 973,66, | 973,67, | 973,68, | 973,69, | 973,70, | 973,71, | 973,72, | 973,73, | 973,74, | 973,75, | 973,76, | 973,77, | 973,78, | 973,79, | 973,80, | 973,81, | 973,82, | 973,83, | 973,84, | 973,85, | 974,1, | 974,2, | 974,3, | 974,4, | 974,5, | 974,6, | 974,7, | 974,8, | 974,9, | 974,10, | 974,11, | 974,12, | 974,13, | 974,14, | 974,15, | 974,16, | 974,17, | 974,18, | 974,19, | 974,20, | 974,21, | 974,22, | 974,23, | 974,24, | 974,25, | 974,26, | 974,27, | 974,28, | 974,29, | 974,30, | 974,31, | 974,32, | 974,33, | 974,34, | 974,35, | 974,36, | 974,37, | 974,38, | 974,39, | 974,40, | 974,41, | 974,42, | 974,43, | 974,44, | 974,45, | 974,46, | 974,47, | 974,48, | 974,49, | 974,50, | 974,51, | 974,52, | 974,53, | 974,54, | 974,55, | 974,56, | 974,57, | 974,58, | 974,59, | 974,60, | 974,61, | 974,62, | 974,63, | 974,64, | 974,65, | 974,66, | 974,67, | 974,68, | 974,69, | 974,70, | 974,71, | 974,72, | 974,73, | 974,74, | 974,75, | 974,76, | 974,77, | 974,78, | 974,79, | 974,80, | 974,81, | 974,82, | 974,83, | 974,84, | 974,85, | 975,1, | 975,2, | 975,3, | 975,4, | 975,5, | 975,6, | 975,7, | 975,8, | 975,9, | 975,10, | 975,11, | 975,12, | 975,13, | 975,14, | 975,15, | 975,16, | 975,17, | 975,18, | 975,19, | 975,20, | 975,21, | 975,22, | 975,23, | 975,24, | 975,25, | 975,26, | 975,27, | 975,28, | 975,29, | 975,30, | 975,31, | 975,32, | 975,33, | 975,34, | 975,35, | 975,36, | 975,37, | 975,38, | 975,39, | 975,40, | 975,41, | 975,42, | 975,43, | 975,44, | 975,45, | 975,46, | 975,47, | 975,48, | 975,49, | 975,50, | 975,51, | 975,52, | 975,53, | 975,54, | 975,55, | 975,56, | 975,57, | 975,58, | 975,59, | 975,60, | 975,61, | 975,62, | 975,63, | 975,64, | 975,65, | 975,66, | 975,67, | 975,68, | 975,69, | 975,70, | 975,71, | 975,72, | 975,73, | 975,74, | 975,75, | 975,76, | 975,77, | 975,78, | 975,79, | 975,80, | 975,81, | 975,82, | 975,83, | 975,84, | 975,85, | 976,1, | 976,2, | 976,3, | 976,4, | 976,5, | 976,6, | 976,7, | 976,8, | 976,9, | 976,10, | 976,11, | 976,12, | 976,13, | 976,14, | 976,15, | 976,16, | 976,17, | 976,18, | 976,19, | 976,20, | 976,21, | 976,22, | 976,23, | 976,24, | 976,25, | 976,26, | 976,27, | 976,28, | 976,29, | 976,30, | 976,31, | 976,32, | 976,33, | 976,34, | 976,35, | 976,36, | 976,37, | 976,38, | 976,39, | 976,40, | 976,41, | 976,42, | 976,43, | 976,44, | 976,45, | 976,46, | 976,47, | 976,48, | 976,49, | 976,50, | 976,51, | 976,52, | 976,53, | 976,54, | 976,55, | 976,56, | 976,57, | 976,58, | 976,59, | 976,60, | 976,61, | 976,62, | 976,63, | 976,64, | 976,65, | 976,66, | 976,67, | 976,68, | 976,69, | 976,70, | 976,71, | 976,72, | 976,73, | 976,74, | 976,75, | 976,76, | 976,77, | 976,78, | 976,79, | 976,80, | 976,81, | 976,82, | 976,83, | 976,84, | 976,85, | 977,1, | 977,2, | 977,3, | 977,4, | 977,5, | 977,6, | 977,7, | 977,8, | 977,9, | 977,10, | 977,11, | 977,12, | 977,13, | 977,14, | 977,15, | 977,16, | 977,17, | 977,18, | 977,19, | 977,20, | 977,21, | 977,22, | 977,23, | 977,24, | 977,25, | 977,26, | 977,27, | 977,28, | 977,29, | 977,30, | 977,31, | 977,32, | 977,33, | 977,34, | 977,35, | 977,36, | 977,37, | 977,38, | 977,39, | 977,40, | 977,41, | 977,42, | 977,43, | 977,44, | 977,45, | 977,46, | 977,47, | 977,48, | 977,49, | 977,50, | 977,51, | 977,52, | 977,53, | 977,54, | 977,55, | 977,56, | 977,57, | 977,58, | 977,59, | 977,60, | 977,61, | 977,62, | 977,63, | 977,64, | 977,65, | 977,66, | 977,67, | 977,68, | 977,69, | 977,70, | 977,71, | 977,72, | 977,73, | 977,74, | 977,75, | 977,76, | 977,77, | 977,78, | 977,79, | 977,80, | 977,81, | 977,82, | 977,83, | 977,84, | 977,85, | 978,1, | 978,2, | 978,3, | 978,4, | 978,5, | 978,6, | 978,7, | 978,8, | 978,9, | 978,10, | 978,11, | 978,12, | 978,13, | 978,14, | 978,15, | 978,16, | 978,17, | 978,18, | 978,19, | 978,20, | 978,21, | 978,22, | 978,23, | 978,24, | 978,25, | 978,26, | 978,27, | 978,28, | 978,29, | 978,30, | 978,31, | 978,32, | 978,33, | 978,34, | 978,35, | 978,36, | 978,37, | 978,38, | 978,39, | 978,40, | 978,41, | 978,42, | 978,43, | 978,44, | 978,45, | 978,46, | 978,47, | 978,48, | 978,49, | 978,50, | 978,51, | 978,52, | 978,53, | 978,54, | 978,55, | 978,56, | 978,57, | 978,58, | 978,59, | 978,60, | 978,61, | 978,62, | 978,63, | 978,64, | 978,65, | 978,66, | 978,67, | 978,68, | 978,69, | 978,70, | 978,71, | 978,72, | 978,73, | 978,74, | 978,75, | 978,76, | 978,77, | 978,78, | 978,79, | 978,80, | 978,81, | 978,82, | 978,83, | 978,84, | 978,85, | 979,1, | 979,2, | 979,3, | 979,4, | 979,5, | 979,6, | 979,7, | 979,8, | 979,9, | 979,10, | 979,11, | 979,12, | 979,13, | 979,14, | 979,15, | 979,16, | 979,17, | 979,18, | 979,19, | 979,20, | 979,21, | 979,22, | 979,23, | 979,24, | 979,25, | 979,26, | 979,27, | 979,28, | 979,29, | 979,30, | 979,31, | 979,32, | 979,33, | 979,34, | 979,35, | 979,36, | 979,37, | 979,38, | 979,39, | 979,40, | 979,41, | 979,42, | 979,43, | 979,44, | 979,45, | 979,46, | 979,47, | 979,48, | 979,49, | 979,50, | 979,51, | 979,52, | 979,53, | 979,54, | 979,55, | 979,56, | 979,57, | 979,58, | 979,59, | 979,60, | 979,61, | 979,62, | 979,63, | 979,64, | 979,65, | 979,66, | 979,67, | 979,68, | 979,69, | 979,70, | 979,71, | 979,72, | 979,73, | 979,74, | 979,75, | 979,76, | 979,77, | 979,78, | 979,79, | 979,80, | 979,81, | 979,82, | 979,83, | 979,84, | 979,85, | 980,1, | 980,2, | 980,3, | 980,4, | 980,5, | 980,6, | 980,7, | 980,8, | 980,9, | 980,10, | 980,11, | 980,12, | 980,13, | 980,14, | 980,15, | 980,16, | 980,17, | 980,18, | 980,19, | 980,20, | 980,21, | 980,22, | 980,23, | 980,24, | 980,25, | 980,26, | 980,27, | 980,28, | 980,29, | 980,30, | 980,31, | 980,32, | 980,33, | 980,34, | 980,35, | 980,36, | 980,37, | 980,38, | 980,39, | 980,40, | 980,41, | 980,42, | 980,43, | 980,44, | 980,45, | 980,46, | 980,47, | 980,48, | 980,49, | 980,50, | 980,51, | 980,52, | 980,53, | 980,54, | 980,55, | 980,56, | 980,57, | 980,58, | 980,59, | 980,60, | 980,61, | 980,62, | 980,63, | 980,64, | 980,65, | 980,66, | 980,67, | 980,68, | 980,69, | 980,70, | 980,71, | 980,72, | 980,73, | 980,74, | 980,75, | 980,76, | 980,77, | 980,78, | 980,79, | 980,80, | 980,81, | 980,82, | 980,83, | 980,84, | 980,85, | 981,1, | 981,2, | 981,3, | 981,4, | 981,5, | 981,6, | 981,7, | 981,8, | 981,9, | 981,10, | 981,11, | 981,12, | 981,13, | 981,14, | 981,15, | 981,16, | 981,17, | 981,18, | 981,19, | 981,20, | 981,21, | 981,22, | 981,23, | 981,24, | 981,25, | 981,26, | 981,27, | 981,28, | 981,29, | 981,30, | 981,31, | 981,32, | 981,33, | 981,34, | 981,35, | 981,36, | 981,37, | 981,38, | 981,39, | 981,40, | 981,41, | 981,42, | 981,43, | 981,44, | 981,45, | 981,46, | 981,47, | 981,48, | 981,49, | 981,50, | 981,51, | 981,52, | 981,53, | 981,54, | 981,55, | 981,56, | 981,57, | 981,58, | 981,59, | 981,60, | 981,61, | 981,62, | 981,63, | 981,64, | 981,65, | 981,66, | 981,67, | 981,68, | 981,69, | 981,70, | 981,71, | 981,72, | 981,73, | 981,74, | 981,75, | 981,76, | 981,77, | 981,78, | 981,79, | 981,80, | 981,81, | 981,82, | 981,83, | 981,84, | 981,85, | 982,1, | 982,2, | 982,3, | 982,4, | 982,5, | 982,6, | 982,7, | 982,8, | 982,9, | 982,10, | 982,11, | 982,12, | 982,13, | 982,14, | 982,15, | 982,16, | 982,17, | 982,18, | 982,19, | 982,20, | 982,21, | 982,22, | 982,23, | 982,24, | 982,25, | 982,26, | 982,27, | 982,28, | 982,29, | 982,30, | 982,31, | 982,32, | 982,33, | 982,34, | 982,35, | 982,36, | 982,37, | 982,38, | 982,39, | 982,40, | 982,41, | 982,42, | 982,43, | 982,44, | 982,45, | 982,46, | 982,47, | 982,48, | 982,49, | 982,50, | 982,51, | 982,52, | 982,53, | 982,54, | 982,55, | 982,56, | 982,57, | 982,58, | 982,59, | 982,60, | 982,61, | 982,62, | 982,63, | 982,64, | 982,65, | 982,66, | 982,67, | 982,68, | 982,69, | 982,70, | 982,71, | 982,72, | 982,73, | 982,74, | 982,75, | 982,76, | 982,77, | 982,78, | 982,79, | 982,80, | 982,81, | 982,82, | 982,83, | 982,84, | 982,85, | 983,1, | 983,2, | 983,3, | 983,4, | 983,5, | 983,6, | 983,7, | 983,8, | 983,9, | 983,10, | 983,11, | 983,12, | 983,13, | 983,14, | 983,15, | 983,16, | 983,17, | 983,18, | 983,19, | 983,20, | 983,21, | 983,22, | 983,23, | 983,24, | 983,25, | 983,26, | 983,27, | 983,28, | 983,29, | 983,30, | 983,31, | 983,32, | 983,33, | 983,34, | 983,35, | 983,36, | 983,37, | 983,38, | 983,39, | 983,40, | 983,41, | 983,42, | 983,43, | 983,44, | 983,45, | 983,46, | 983,47, | 983,48, | 983,49, | 983,50, | 983,51, | 983,52, | 983,53, | 983,54, | 983,55, | 983,56, | 983,57, | 983,58, | 983,59, | 983,60, | 983,61, | 983,62, | 983,63, | 983,64, | 983,65, | 983,66, | 983,67, | 983,68, | 983,69, | 983,70, | 983,71, | 983,72, | 983,73, | 983,74, | 983,75, | 983,76, | 983,77, | 983,78, | 983,79, | 983,80, | 983,81, | 983,82, | 983,83, | 983,84, | 983,85, | 984,1, | 984,2, | 984,3, | 984,4, | 984,5, | 984,6, | 984,7, | 984,8, | 984,9, | 984,10, | 984,11, | 984,12, | 984,13, | 984,14, | 984,15, | 984,16, | 984,17, | 984,18, | 984,19, | 984,20, | 984,21, | 984,22, | 984,23, | 984,24, | 984,25, | 984,26, | 984,27, | 984,28, | 984,29, | 984,30, | 984,31, | 984,32, | 984,33, | 984,34, | 984,35, | 984,36, | 984,37, | 984,38, | 984,39, | 984,40, | 984,41, | 984,42, | 984,43, | 984,44, | 984,45, | 984,46, | 984,47, | 984,48, | 984,49, | 984,50, | 984,51, | 984,52, | 984,53, | 984,54, | 984,55, | 984,56, | 984,57, | 984,58, | 984,59, | 984,60, | 984,61, | 984,62, | 984,63, | 984,64, | 984,65, | 984,66, | 984,67, | 984,68, | 984,69, | 984,70, | 984,71, | 984,72, | 984,73, | 984,74, | 984,75, | 984,76, | 984,77, | 984,78, | 984,79, | 984,80, | 984,81, | 984,82, | 984,83, | 984,84, | 984,85, | 985,1, | 985,2, | 985,3, | 985,4, | 985,5, | 985,6, | 985,7, | 985,8, | 985,9, | 985,10, | 985,11, | 985,12, | 985,13, | 985,14, | 985,15, | 985,16, | 985,17, | 985,18, | 985,19, | 985,20, | 985,21, | 985,22, | 985,23, | 985,24, | 985,25, | 985,26, | 985,27, | 985,28, | 985,29, | 985,30, | 985,31, | 985,32, | 985,33, | 985,34, | 985,35, | 985,36, | 985,37, | 985,38, | 985,39, | 985,40, | 985,41, | 985,42, | 985,43, | 985,44, | 985,45, | 985,46, | 985,47, | 985,48, | 985,49, | 985,50, | 985,51, | 985,52, | 985,53, | 985,54, | 985,55, | 985,56, | 985,57, | 985,58, | 985,59, | 985,60, | 985,61, | 985,62, | 985,63, | 985,64, | 985,65, | 985,66, | 985,67, | 985,68, | 985,69, | 985,70, | 985,71, | 985,72, | 985,73, | 985,74, | 985,75, | 985,76, | 985,77, | 985,78, | 985,79, | 985,80, | 985,81, | 985,82, | 985,83, | 985,84, | 985,85, | 986,1, | 986,2, | 986,3, | 986,4, | 986,5, | 986,6, | 986,7, | 986,8, | 986,9, | 986,10, | 986,11, | 986,12, | 986,13, | 986,14, | 986,15, | 986,16, | 986,17, | 986,18, | 986,19, | 986,20, | 986,21, | 986,22, | 986,23, | 986,24, | 986,25, | 986,26, | 986,27, | 986,28, | 986,29, | 986,30, | 986,31, | 986,32, | 986,33, | 986,34, | 986,35, | 986,36, | 986,37, | 986,38, | 986,39, | 986,40, | 986,41, | 986,42, | 986,43, | 986,44, | 986,45, | 986,46, | 986,47, | 986,48, | 986,49, | 986,50, | 986,51, | 986,52, | 986,53, | 986,54, | 986,55, | 986,56, | 986,57, | 986,58, | 986,59, | 986,60, | 986,61, | 986,62, | 986,63, | 986,64, | 986,65, | 986,66, | 986,67, | 986,68, | 986,69, | 986,70, | 986,71, | 986,72, | 986,73, | 986,74, | 986,75, | 986,76, | 986,77, | 986,78, | 986,79, | 986,80, | 986,81, | 986,82, | 986,83, | 986,84, | 986,85, | 987,1, | 987,2, | 987,3, | 987,4, | 987,5, | 987,6, | 987,7, | 987,8, | 987,9, | 987,10, | 987,11, | 987,12, | 987,13, | 987,14, | 987,15, | 987,16, | 987,17, | 987,18, | 987,19, | 987,20, | 987,21, | 987,22, | 987,23, | 987,24, | 987,25, | 987,26, | 987,27, | 987,28, | 987,29, | 987,30, | 987,31, | 987,32, | 987,33, | 987,34, | 987,35, | 987,36, | 987,37, | 987,38, | 987,39, | 987,40, | 987,41, | 987,42, | 987,43, | 987,44, | 987,45, | 987,46, | 987,47, | 987,48, | 987,49, | 987,50, | 987,51, | 987,52, | 987,53, | 987,54, | 987,55, | 987,56, | 987,57, | 987,58, | 987,59, | 987,60, | 987,61, | 987,62, | 987,63, | 987,64, | 987,65, | 987,66, | 987,67, | 987,68, | 987,69, | 987,70, | 987,71, | 987,72, | 987,73, | 987,74, | 987,75, | 987,76, | 987,77, | 987,78, | 987,79, | 987,80, | 987,81, | 987,82, | 987,83, | 987,84, | 987,85, | 988,1, | 988,2, | 988,3, | 988,4, | 988,5, | 988,6, | 988,7, | 988,8, | 988,9, | 988,10, | 988,11, | 988,12, | 988,13, | 988,14, | 988,15, | 988,16, | 988,17, | 988,18, | 988,19, | 988,20, | 988,21, | 988,22, | 988,23, | 988,24, | 988,25, | 988,26, | 988,27, | 988,28, | 988,29, | 988,30, | 988,31, | 988,32, | 988,33, | 988,34, | 988,35, | 988,36, | 988,37, | 988,38, | 988,39, | 988,40, | 988,41, | 988,42, | 988,43, | 988,44, | 988,45, | 988,46, | 988,47, | 988,48, | 988,49, | 988,50, | 988,51, | 988,52, | 988,53, | 988,54, | 988,55, | 988,56, | 988,57, | 988,58, | 988,59, | 988,60, | 988,61, | 988,62, | 988,63, | 988,64, | 988,65, | 988,66, | 988,67, | 988,68, | 988,69, | 988,70, | 988,71, | 988,72, | 988,73, | 988,74, | 988,75, | 988,76, | 988,77, | 988,78, | 988,79, | 988,80, | 988,81, | 988,82, | 988,83, | 988,84, | 988,85, | 989,1, | 989,2, | 989,3, | 989,4, | 989,5, | 989,6, | 989,7, | 989,8, | 989,9, | 989,10, | 989,11, | 989,12, | 989,13, | 989,14, | 989,15, | 989,16, | 989,17, | 989,18, | 989,19, | 989,20, | 989,21, | 989,22, | 989,23, | 989,24, | 989,25, | 989,26, | 989,27, | 989,28, | 989,29, | 989,30, | 989,31, | 989,32, | 989,33, | 989,34, | 989,35, | 989,36, | 989,37, | 989,38, | 989,39, | 989,40, | 989,41, | 989,42, | 989,43, | 989,44, | 989,45, | 989,46, | 989,47, | 989,48, | 989,49, | 989,50, | 989,51, | 989,52, | 989,53, | 989,54, | 989,55, | 989,56, | 989,57, | 989,58, | 989,59, | 989,60, | 989,61, | 989,62, | 989,63, | 989,64, | 989,65, | 989,66, | 989,67, | 989,68, | 989,69, | 989,70, | 989,71, | 989,72, | 989,73, | 989,74, | 989,75, | 989,76, | 989,77, | 989,78, | 989,79, | 989,80, | 989,81, | 989,82, | 989,83, | 989,84, | 989,85, | 990,1, | 990,2, | 990,3, | 990,4, | 990,5, | 990,6, | 990,7, | 990,8, | 990,9, | 990,10, | 990,11, | 990,12, | 990,13, | 990,14, | 990,15, | 990,16, | 990,17, | 990,18, | 990,19, | 990,20, | 990,21, | 990,22, | 990,23, | 990,24, | 990,25, | 990,26, | 990,27, | 990,28, | 990,29, | 990,30, | 990,31, | 990,32, | 990,33, | 990,34, | 990,35, | 990,36, | 990,37, | 990,38, | 990,39, | 990,40, | 990,41, | 990,42, | 990,43, | 990,44, | 990,45, | 990,46, | 990,47, | 990,48, | 990,49, | 990,50, | 990,51, | 990,52, | 990,53, | 990,54, | 990,55, | 990,56, | 990,57, | 990,58, | 990,59, | 990,60, | 990,61, | 990,62, | 990,63, | 990,64, | 990,65, | 990,66, | 990,67, | 990,68, | 990,69, | 990,70, | 990,71, | 990,72, | 990,73, | 990,74, | 990,75, | 990,76, | 990,77, | 990,78, | 990,79, | 990,80, | 990,81, | 990,82, | 990,83, | 990,84, | 990,85, | 991,1, | 991,2, | 991,3, | 991,4, | 991,5, | 991,6, | 991,7, | 991,8, | 991,9, | 991,10, | 991,11, | 991,12, | 991,13, | 991,14, | 991,15, | 991,16, | 991,17, | 991,18, | 991,19, | 991,20, | 991,21, | 991,22, | 991,23, | 991,24, | 991,25, | 991,26, | 991,27, | 991,28, | 991,29, | 991,30, | 991,31, | 991,32, | 991,33, | 991,34, | 991,35, | 991,36, | 991,37, | 991,38, | 991,39, | 991,40, | 991,41, | 991,42, | 991,43, | 991,44, | 991,45, | 991,46, | 991,47, | 991,48, | 991,49, | 991,50, | 991,51, | 991,52, | 991,53, | 991,54, | 991,55, | 991,56, | 991,57, | 991,58, | 991,59, | 991,60, | 991,61, | 991,62, | 991,63, | 991,64, | 991,65, | 991,66, | 991,67, | 991,68, | 991,69, | 991,70, | 991,71, | 991,72, | 991,73, | 991,74, | 991,75, | 991,76, | 991,77, | 991,78, | 991,79, | 991,80, | 991,81, | 991,82, | 991,83, | 991,84, | 991,85, | 992,1, | 992,2, | 992,3, | 992,4, | 992,5, | 992,6, | 992,7, | 992,8, | 992,9, | 992,10, | 992,11, | 992,12, | 992,13, | 992,14, | 992,15, | 992,16, | 992,17, | 992,18, | 992,19, | 992,20, | 992,21, | 992,22, | 992,23, | 992,24, | 992,25, | 992,26, | 992,27, | 992,28, | 992,29, | 992,30, | 992,31, | 992,32, | 992,33, | 992,34, | 992,35, | 992,36, | 992,37, | 992,38, | 992,39, | 992,40, | 992,41, | 992,42, | 992,43, | 992,44, | 992,45, | 992,46, | 992,47, | 992,48, | 992,49, | 992,50, | 992,51, | 992,52, | 992,53, | 992,54, | 992,55, | 992,56, | 992,57, | 992,58, | 992,59, | 992,60, | 992,61, | 992,62, | 992,63, | 992,64, | 992,65, | 992,66, | 992,67, | 992,68, | 992,69, | 992,70, | 992,71, | 992,72, | 992,73, | 992,74, | 992,75, | 992,76, | 992,77, | 992,78, | 992,79, | 992,80, | 992,81, | 992,82, | 992,83, | 992,84, | 992,85, | 993,1, | 993,2, | 993,3, | 993,4, | 993,5, | 993,6, | 993,7, | 993,8, | 993,9, | 993,10, | 993,11, | 993,12, | 993,13, | 993,14, | 993,15, | 993,16, | 993,17, | 993,18, | 993,19, | 993,20, | 993,21, | 993,22, | 993,23, | 993,24, | 993,25, | 993,26, | 993,27, | 993,28, | 993,29, | 993,30, | 993,31, | 993,32, | 993,33, | 993,34, | 993,35, | 993,36, | 993,37, | 993,38, | 993,39, | 993,40, | 993,41, | 993,42, | 993,43, | 993,44, | 993,45, | 993,46, | 993,47, | 993,48, | 993,49, | 993,50, | 993,51, | 993,52, | 993,53, | 993,54, | 993,55, | 993,56, | 993,57, | 993,58, | 993,59, | 993,60, | 993,61, | 993,62, | 993,63, | 993,64, | 993,65, | 993,66, | 993,67, | 993,68, | 993,69, | 993,70, | 993,71, | 993,72, | 993,73, | 993,74, | 993,75, | 993,76, | 993,77, | 993,78, | 993,79, | 993,80, | 993,81, | 993,82, | 993,83, | 993,84, | 993,85, | 994,1, | 994,2, | 994,3, | 994,4, | 994,5, | 994,6, | 994,7, | 994,8, | 994,9, | 994,10, | 994,11, | 994,12, | 994,13, | 994,14, | 994,15, | 994,16, | 994,17, | 994,18, | 994,19, | 994,20, | 994,21, | 994,22, | 994,23, | 994,24, | 994,25, | 994,26, | 994,27, | 994,28, | 994,29, | 994,30, | 994,31, | 994,32, | 994,33, | 994,34, | 994,35, | 994,36, | 994,37, | 994,38, | 994,39, | 994,40, | 994,41, | 994,42, | 994,43, | 994,44, | 994,45, | 994,46, | 994,47, | 994,48, | 994,49, | 994,50, | 994,51, | 994,52, | 994,53, | 994,54, | 994,55, | 994,56, | 994,57, | 994,58, | 994,59, | 994,60, | 994,61, | 994,62, | 994,63, | 994,64, | 994,65, | 994,66, | 994,67, | 994,68, | 994,69, | 994,70, | 994,71, | 994,72, | 994,73, | 994,74, | 994,75, | 994,76, | 994,77, | 994,78, | 994,79, | 994,80, | 994,81, | 994,82, | 994,83, | 994,84, | 994,85, | 995,1, | 995,2, | 995,3, | 995,4, | 995,5, | 995,6, | 995,7, | 995,8, | 995,9, | 995,10, | 995,11, | 995,12, | 995,13, | 995,14, | 995,15, | 995,16, | 995,17, | 995,18, | 995,19, | 995,20, | 995,21, | 995,22, | 995,23, | 995,24, | 995,25, | 995,26, | 995,27, | 995,28, | 995,29, | 995,30, | 995,31, | 995,32, | 995,33, | 995,34, | 995,35, | 995,36, | 995,37, | 995,38, | 995,39, | 995,40, | 995,41, | 995,42, | 995,43, | 995,44, | 995,45, | 995,46, | 995,47, | 995,48, | 995,49, | 995,50, | 995,51, | 995,52, | 995,53, | 995,54, | 995,55, | 995,56, | 995,57, | 995,58, | 995,59, | 995,60, | 995,61, | 995,62, | 995,63, | 995,64, | 995,65, | 995,66, | 995,67, | 995,68, | 995,69, | 995,70, | 995,71, | 995,72, | 995,73, | 995,74, | 995,75, | 995,76, | 995,77, | 995,78, | 995,79, | 995,80, | 995,81, | 995,82, | 995,83, | 995,84, | 995,85, | 996,1, | 996,2, | 996,3, | 996,4, | 996,5, | 996,6, | 996,7, | 996,8, | 996,9, | 996,10, | 996,11, | 996,12, | 996,13, | 996,14, | 996,15, | 996,16, | 996,17, | 996,18, | 996,19, | 996,20, | 996,21, | 996,22, | 996,23, | 996,24, | 996,25, | 996,26, | 996,27, | 996,28, | 996,29, | 996,30, | 996,31, | 996,32, | 996,33, | 996,34, | 996,35, | 996,36, | 996,37, | 996,38, | 996,39, | 996,40, | 996,41, | 996,42, | 996,43, | 996,44, | 996,45, | 996,46, | 996,47, | 996,48, | 996,49, | 996,50, | 996,51, | 996,52, | 996,53, | 996,54, | 996,55, | 996,56, | 996,57, | 996,58, | 996,59, | 996,60, | 996,61, | 996,62, | 996,63, | 996,64, | 996,65, | 996,66, | 996,67, | 996,68, | 996,69, | 996,70, | 996,71, | 996,72, | 996,73, | 996,74, | 996,75, | 996,76, | 996,77, | 996,78, | 996,79, | 996,80, | 996,81, | 996,82, | 996,83, | 996,84, | 996,85, | 997,1, | 997,2, | 997,3, | 997,4, | 997,5, | 997,6, | 997,7, | 997,8, | 997,9, | 997,10, | 997,11, | 997,12, | 997,13, | 997,14, | 997,15, | 997,16, | 997,17, | 997,18, | 997,19, | 997,20, | 997,21, | 997,22, | 997,23, | 997,24, | 997,25, | 997,26, | 997,27, | 997,28, | 997,29, | 997,30, | 997,31, | 997,32, | 997,33, | 997,34, | 997,35, | 997,36, | 997,37, | 997,38, | 997,39, | 997,40, | 997,41, | 997,42, | 997,43, | 997,44, | 997,45, | 997,46, | 997,47, | 997,48, | 997,49, | 997,50, | 997,51, | 997,52, | 997,53, | 997,54, | 997,55, | 997,56, | 997,57, | 997,58, | 997,59, | 997,60, | 997,61, | 997,62, | 997,63, | 997,64, | 997,65, | 997,66, | 997,67, | 997,68, | 997,69, | 997,70, | 997,71, | 997,72, | 997,73, | 997,74, | 997,75, | 997,76, | 997,77, | 997,78, | 997,79, | 997,80, | 997,81, | 997,82, | 997,83, | 997,84, | 997,85, | 998,1, | 998,2, | 998,3, | 998,4, | 998,5, | 998,6, | 998,7, | 998,8, | 998,9, | 998,10, | 998,11, | 998,12, | 998,13, | 998,14, | 998,15, | 998,16, | 998,17, | 998,18, | 998,19, | 998,20, | 998,21, | 998,22, | 998,23, | 998,24, | 998,25, | 998,26, | 998,27, | 998,28, | 998,29, | 998,30, | 998,31, | 998,32, | 998,33, | 998,34, | 998,35, | 998,36, | 998,37, | 998,38, | 998,39, | 998,40, | 998,41, | 998,42, | 998,43, | 998,44, | 998,45, | 998,46, | 998,47, | 998,48, | 998,49, | 998,50, | 998,51, | 998,52, | 998,53, | 998,54, | 998,55, | 998,56, | 998,57, | 998,58, | 998,59, | 998,60, | 998,61, | 998,62, | 998,63, | 998,64, | 998,65, | 998,66, | 998,67, | 998,68, | 998,69, | 998,70, | 998,71, | 998,72, | 998,73, | 998,74, | 998,75, | 998,76, | 998,77, | 998,78, | 998,79, | 998,80, | 998,81, | 998,82, | 998,83, | 998,84, | 998,85, | 999,1, | 999,2, | 999,3, | 999,4, | 999,5, | 999,6, | 999,7, | 999,8, | 999,9, | 999,10, | 999,11, | 999,12, | 999,13, | 999,14, | 999,15, | 999,16, | 999,17, | 999,18, | 999,19, | 999,20, | 999,21, | 999,22, | 999,23, | 999,24, | 999,25, | 999,26, | 999,27, | 999,28, | 999,29, | 999,30, | 999,31, | 999,32, | 999,33, | 999,34, | 999,35, | 999,36, | 999,37, | 999,38, | 999,39, | 999,40, | 999,41, | 999,42, | 999,43, | 999,44, | 999,45, | 999,46, | 999,47, | 999,48, | 999,49, | 999,50, | 999,51, | 999,52, | 999,53, | 999,54, | 999,55, | 999,56, | 999,57, | 999,58, | 999,59, | 999,60, | 999,61, | 999,62, | 999,63, | 999,64, | 999,65, | 999,66, | 999,67, | 999,68, | 999,69, | 999,70, | 999,71, | 999,72, | 999,73, | 999,74, | 999,75, | 999,76, | 999,77, | 999,78, | 999,79, | 999,80, | 999,81, | 999,82, | 999,83, | 999,84, | 999,85, | 1000,1, | 1000,2, | 1000,3, | 1000,4, | 1000,5, | 1000,6, | 1000,7, | 1000,8, | 1000,9, | 1000,10, | 1000,11, | 1000,12, | 1000,13, | 1000,14, | 1000,15, | 1000,16, | 1000,17, | 1000,18, | 1000,19, | 1000,20, | 1000,21, | 1000,22, | 1000,23, | 1000,24, | 1000,25, | 1000,26, | 1000,27, | 1000,28, | 1000,29, | 1000,30, | 1000,31, | 1000,32, | 1000,33, | 1000,34, | 1000,35, | 1000,36, | 1000,37, | 1000,38, | 1000,39, | 1000,40, | 1000,41, | 1000,42, | 1000,43, | 1000,44, | 1000,45, | 1000,46, | 1000,47, | 1000,48, | 1000,49, | 1000,50, | 1000,51, | 1000,52, | 1000,53, | 1000,54, | 1000,55, | 1000,56, | 1000,57, | 1000,58, | 1000,59, | 1000,60, | 1000,61, | 1000,62, | 1000,63, | 1000,64, | 1000,65, | 1000,66, | 1000,67, | 1000,68, | 1000,69, | 1000,70, | 1000,71, | 1000,72, | 1000,73, | 1000,74, | 1000,75, | 1000,76, | 1000,77, | 1000,78, | 1000,79, | 1000,80, | 1000,81, | 1000,82, | 1000,83, | 1000,84, | 1000,85, | 1001,1, | 1001,2, | 1001,3, | 1001,4, | 1001,5, | 1001,6, | 1001,7, | 1001,8, | 1001,9, | 1001,10, | 1001,11, | 1001,12, | 1001,13, | 1001,14, | 1001,15, | 1001,16, | 1001,17, | 1001,18, | 1001,19, | 1001,20, | 1001,21, | 1001,22, | 1001,23, | 1001,24, | 1001,25, | 1001,26, | 1001,27, | 1001,28, | 1001,29, | 1001,30, | 1001,31, | 1001,32, | 1001,33, | 1001,34, | 1001,35, | 1001,36, | 1001,37, | 1001,38, | 1001,39, | 1001,40, | 1001,41, | 1001,42, | 1001,43, | 1001,44, | 1001,45, | 1001,46, | 1001,47, | 1001,48, | 1001,49, | 1001,50, | 1001,51, | 1001,52, | 1001,53, | 1001,54, | 1001,55, | 1001,56, | 1001,57, | 1001,58, | 1001,59, | 1001,60, | 1001,61, | 1001,62, | 1001,63, | 1001,64, | 1001,65, | 1001,66, | 1001,67, | 1001,68, | 1001,69, | 1001,70, | 1001,71, | 1001,72, | 1001,73, | 1001,74, | 1001,75, | 1001,76, | 1001,77, | 1001,78, | 1001,79, | 1001,80, | 1001,81, | 1001,82, | 1001,83, | 1001,84, | 1001,85, | 1002,1, | 1002,2, | 1002,3, | 1002,4, | 1002,5, | 1002,6, | 1002,7, | 1002,8, | 1002,9, | 1002,10, | 1002,11, | 1002,12, | 1002,13, | 1002,14, | 1002,15, | 1002,16, | 1002,17, | 1002,18, | 1002,19, | 1002,20, | 1002,21, | 1002,22, | 1002,23, | 1002,24, | 1002,25, | 1002,26, | 1002,27, | 1002,28, | 1002,29, | 1002,30, | 1002,31, | 1002,32, | 1002,33, | 1002,34, | 1002,35, | 1002,36, | 1002,37, | 1002,38, | 1002,39, | 1002,40, | 1002,41, | 1002,42, | 1002,43, | 1002,44, | 1002,45, | 1002,46, | 1002,47, | 1002,48, | 1002,49, | 1002,50, | 1002,51, | 1002,52, | 1002,53, | 1002,54, | 1002,55, | 1002,56, | 1002,57, | 1002,58, | 1002,59, | 1002,60, | 1002,61, | 1002,62, | 1002,63, | 1002,64, | 1002,65, | 1002,66, | 1002,67, | 1002,68, | 1002,69, | 1002,70, | 1002,71, | 1002,72, | 1002,73, | 1002,74, | 1002,75, | 1002,76, | 1002,77, | 1002,78, | 1002,79, | 1002,80, | 1002,81, | 1002,82, | 1002,83, | 1002,84, | 1002,85, | 1003,1, | 1003,2, | 1003,3, | 1003,4, | 1003,5, | 1003,6, | 1003,7, | 1003,8, | 1003,9, | 1003,10, | 1003,11, | 1003,12, | 1003,13, | 1003,14, | 1003,15, | 1003,16, | 1003,17, | 1003,18, | 1003,19, | 1003,20, | 1003,21, | 1003,22, | 1003,23, | 1003,24, | 1003,25, | 1003,26, | 1003,27, | 1003,28, | 1003,29, | 1003,30, | 1003,31, | 1003,32, | 1003,33, | 1003,34, | 1003,35, | 1003,36, | 1003,37, | 1003,38, | 1003,39, | 1003,40, | 1003,41, | 1003,42, | 1003,43, | 1003,44, | 1003,45, | 1003,46, | 1003,47, | 1003,48, | 1003,49, | 1003,50, | 1003,51, | 1003,52, | 1003,53, | 1003,54, | 1003,55, | 1003,56, | 1003,57, | 1003,58, | 1003,59, | 1003,60, | 1003,61, | 1003,62, | 1003,63, | 1003,64, | 1003,65, | 1003,66, | 1003,67, | 1003,68, | 1003,69, | 1003,70, | 1003,71, | 1003,72, | 1003,73, | 1003,74, | 1003,75, | 1003,76, | 1003,77, | 1003,78, | 1003,79, | 1003,80, | 1003,81, | 1003,82, | 1003,83, | 1003,84, | 1003,85, | 1004,1, | 1004,2, | 1004,3, | 1004,4, | 1004,5, | 1004,6, | 1004,7, | 1004,8, | 1004,9, | 1004,10, | 1004,11, | 1004,12, | 1004,13, | 1004,14, | 1004,15, | 1004,16, | 1004,17, | 1004,18, | 1004,19, | 1004,20, | 1004,21, | 1004,22, | 1004,23, | 1004,24, | 1004,25, | 1004,26, | 1004,27, | 1004,28, | 1004,29, | 1004,30, | 1004,31, | 1004,32, | 1004,33, | 1004,34, | 1004,35, | 1004,36, | 1004,37, | 1004,38, | 1004,39, | 1004,40, | 1004,41, | 1004,42, | 1004,43, | 1004,44, | 1004,45, | 1004,46, | 1004,47, | 1004,48, | 1004,49, | 1004,50, | 1004,51, | 1004,52, | 1004,53, | 1004,54, | 1004,55, | 1004,56, | 1004,57, | 1004,58, | 1004,59, | 1004,60, | 1004,61, | 1004,62, | 1004,63, | 1004,64, | 1004,65, | 1004,66, | 1004,67, | 1004,68, | 1004,69, | 1004,70, | 1004,71, | 1004,72, | 1004,73, | 1004,74, | 1004,75, | 1004,76, | 1004,77, | 1004,78, | 1004,79, | 1004,80, | 1004,81, | 1004,82, | 1004,83, | 1004,84, | 1004,85, | 1005,1, | 1005,2, | 1005,3, | 1005,4, | 1005,5, | 1005,6, | 1005,7, | 1005,8, | 1005,9, | 1005,10, | 1005,11, | 1005,12, | 1005,13, | 1005,14, | 1005,15, | 1005,16, | 1005,17, | 1005,18, | 1005,19, | 1005,20, | 1005,21, | 1005,22, | 1005,23, | 1005,24, | 1005,25, | 1005,26, | 1005,27, | 1005,28, | 1005,29, | 1005,30, | 1005,31, | 1005,32, | 1005,33, | 1005,34, | 1005,35, | 1005,36, | 1005,37, | 1005,38, | 1005,39, | 1005,40, | 1005,41, | 1005,42, | 1005,43, | 1005,44, | 1005,45, | 1005,46, | 1005,47, | 1005,48, | 1005,49, | 1005,50, | 1005,51, | 1005,52, | 1005,53, | 1005,54, | 1005,55, | 1005,56, | 1005,57, | 1005,58, | 1005,59, | 1005,60, | 1005,61, | 1005,62, | 1005,63, | 1005,64, | 1005,65, | 1005,66, | 1005,67, | 1005,68, | 1005,69, | 1005,70, | 1005,71, | 1005,72, | 1005,73, | 1005,74, | 1005,75, | 1005,76, | 1005,77, | 1005,78, | 1005,79, | 1005,80, | 1005,81, | 1005,82, | 1005,83, | 1005,84, | 1005,85, | 1006,1, | 1006,2, | 1006,3, | 1006,4, | 1006,5, | 1006,6, | 1006,7, | 1006,8, | 1006,9, | 1006,10, | 1006,11, | 1006,12, | 1006,13, | 1006,14, | 1006,15, | 1006,16, | 1006,17, | 1006,18, | 1006,19, | 1006,20, | 1006,21, | 1006,22, | 1006,23, | 1006,24, | 1006,25, | 1006,26, | 1006,27, | 1006,28, | 1006,29, | 1006,30, | 1006,31, | 1006,32, | 1006,33, | 1006,34, | 1006,35, | 1006,36, | 1006,37, | 1006,38, | 1006,39, | 1006,40, | 1006,41, | 1006,42, | 1006,43, | 1006,44, | 1006,45, | 1006,46, | 1006,47, | 1006,48, | 1006,49, | 1006,50, | 1006,51, | 1006,52, | 1006,53, | 1006,54, | 1006,55, | 1006,56, | 1006,57, | 1006,58, | 1006,59, | 1006,60, | 1006,61, | 1006,62, | 1006,63, | 1006,64, | 1006,65, | 1006,66, | 1006,67, | 1006,68, | 1006,69, | 1006,70, | 1006,71, | 1006,72, | 1006,73, | 1006,74, | 1006,75, | 1006,76, | 1006,77, | 1006,78, | 1006,79, | 1006,80, | 1006,81, | 1006,82, | 1006,83, | 1006,84, | 1006,85, | 1007,1, | 1007,2, | 1007,3, | 1007,4, | 1007,5, | 1007,6, | 1007,7, | 1007,8, | 1007,9, | 1007,10, | 1007,11, | 1007,12, | 1007,13, | 1007,14, | 1007,15, | 1007,16, | 1007,17, | 1007,18, | 1007,19, | 1007,20, | 1007,21, | 1007,22, | 1007,23, | 1007,24, | 1007,25, | 1007,26, | 1007,27, | 1007,28, | 1007,29, | 1007,30, | 1007,31, | 1007,32, | 1007,33, | 1007,34, | 1007,35, | 1007,36, | 1007,37, | 1007,38, | 1007,39, | 1007,40, | 1007,41, | 1007,42, | 1007,43, | 1007,44, | 1007,45, | 1007,46, | 1007,47, | 1007,48, | 1007,49, | 1007,50, | 1007,51, | 1007,52, | 1007,53, | 1007,54, | 1007,55, | 1007,56, | 1007,57, | 1007,58, | 1007,59, | 1007,60, | 1007,61, | 1007,62, | 1007,63, | 1007,64, | 1007,65, | 1007,66, | 1007,67, | 1007,68, | 1007,69, | 1007,70, | 1007,71, | 1007,72, | 1007,73, | 1007,74, | 1007,75, | 1007,76, | 1007,77, | 1007,78, | 1007,79, | 1007,80, | 1007,81, | 1007,82, | 1007,83, | 1007,84, | 1007,85, | 1008,1, | 1008,2, | 1008,3, | 1008,4, | 1008,5, | 1008,6, | 1008,7, | 1008,8, | 1008,9, | 1008,10, | 1008,11, | 1008,12, | 1008,13, | 1008,14, | 1008,15, | 1008,16, | 1008,17, | 1008,18, | 1008,19, | 1008,20, | 1008,21, | 1008,22, | 1008,23, | 1008,24, | 1008,25, | 1008,26, | 1008,27, | 1008,28, | 1008,29, | 1008,30, | 1008,31, | 1008,32, | 1008,33, | 1008,34, | 1008,35, | 1008,36, | 1008,37, | 1008,38, | 1008,39, | 1008,40, | 1008,41, | 1008,42, | 1008,43, | 1008,44, | 1008,45, | 1008,46, | 1008,47, | 1008,48, | 1008,49, | 1008,50, | 1008,51, | 1008,52, | 1008,53, | 1008,54, | 1008,55, | 1008,56, | 1008,57, | 1008,58, | 1008,59, | 1008,60, | 1008,61, | 1008,62, | 1008,63, | 1008,64, | 1008,65, | 1008,66, | 1008,67, | 1008,68, | 1008,69, | 1008,70, | 1008,71, | 1008,72, | 1008,73, | 1008,74, | 1008,75, | 1008,76, | 1008,77, | 1008,78, | 1008,79, | 1008,80, | 1008,81, | 1008,82, | 1008,83, | 1008,84, | 1008,85, | 1009,1, | 1009,2, | 1009,3, | 1009,4, | 1009,5, | 1009,6, | 1009,7, | 1009,8, | 1009,9, | 1009,10, | 1009,11, | 1009,12, | 1009,13, | 1009,14, | 1009,15, | 1009,16, | 1009,17, | 1009,18, | 1009,19, | 1009,20, | 1009,21, | 1009,22, | 1009,23, | 1009,24, | 1009,25, | 1009,26, | 1009,27, | 1009,28, | 1009,29, | 1009,30, | 1009,31, | 1009,32, | 1009,33, | 1009,34, | 1009,35, | 1009,36, | 1009,37, | 1009,38, | 1009,39, | 1009,40, | 1009,41, | 1009,42, | 1009,43, | 1009,44, | 1009,45, | 1009,46, | 1009,47, | 1009,48, | 1009,49, | 1009,50, | 1009,51, | 1009,52, | 1009,53, | 1009,54, | 1009,55, | 1009,56, | 1009,57, | 1009,58, | 1009,59, | 1009,60, | 1009,61, | 1009,62, | 1009,63, | 1009,64, | 1009,65, | 1009,66, | 1009,67, | 1009,68, | 1009,69, | 1009,70, | 1009,71, | 1009,72, | 1009,73, | 1009,74, | 1009,75, | 1009,76, | 1009,77, | 1009,78, | 1009,79, | 1009,80, | 1009,81, | 1009,82, | 1009,83, | 1009,84, | 1009,85, | 1010,1, | 1010,2, | 1010,3, | 1010,4, | 1010,5, | 1010,6, | 1010,7, | 1010,8, | 1010,9, | 1010,10, | 1010,11, | 1010,12, | 1010,13, | 1010,14, | 1010,15, | 1010,16, | 1010,17, | 1010,18, | 1010,19, | 1010,20, | 1010,21, | 1010,22, | 1010,23, | 1010,24, | 1010,25, | 1010,26, | 1010,27, | 1010,28, | 1010,29, | 1010,30, | 1010,31, | 1010,32, | 1010,33, | 1010,34, | 1010,35, | 1010,36, | 1010,37, | 1010,38, | 1010,39, | 1010,40, | 1010,41, | 1010,42, | 1010,43, | 1010,44, | 1010,45, | 1010,46, | 1010,47, | 1010,48, | 1010,49, | 1010,50, | 1010,51, | 1010,52, | 1010,53, | 1010,54, | 1010,55, | 1010,56, | 1010,57, | 1010,58, | 1010,59, | 1010,60, | 1010,61, | 1010,62, | 1010,63, | 1010,64, | 1010,65, | 1010,66, | 1010,67, | 1010,68, | 1010,69, | 1010,70, | 1010,71, | 1010,72, | 1010,73, | 1010,74, | 1010,75, | 1010,76, | 1010,77, | 1010,78, | 1010,79, | 1010,80, | 1010,81, | 1010,82, | 1010,83, | 1010,84, | 1010,85, | 1011,1, | 1011,2, | 1011,3, | 1011,4, | 1011,5, | 1011,6, | 1011,7, | 1011,8, | 1011,9, | 1011,10, | 1011,11, | 1011,12, | 1011,13, | 1011,14, | 1011,15, | 1011,16, | 1011,17, | 1011,18, | 1011,19, | 1011,20, | 1011,21, | 1011,22, | 1011,23, | 1011,24, | 1011,25, | 1011,26, | 1011,27, | 1011,28, | 1011,29, | 1011,30, | 1011,31, | 1011,32, | 1011,33, | 1011,34, | 1011,35, | 1011,36, | 1011,37, | 1011,38, | 1011,39, | 1011,40, | 1011,41, | 1011,42, | 1011,43, | 1011,44, | 1011,45, | 1011,46, | 1011,47, | 1011,48, | 1011,49, | 1011,50, | 1011,51, | 1011,52, | 1011,53, | 1011,54, | 1011,55, | 1011,56, | 1011,57, | 1011,58, | 1011,59, | 1011,60, | 1011,61, | 1011,62, | 1011,63, | 1011,64, | 1011,65, | 1011,66, | 1011,67, | 1011,68, | 1011,69, | 1011,70, | 1011,71, | 1011,72, | 1011,73, | 1011,74, | 1011,75, | 1011,76, | 1011,77, | 1011,78, | 1011,79, | 1011,80, | 1011,81, | 1011,82, | 1011,83, | 1011,84, | 1011,85, | 1012,1, | 1012,2, | 1012,3, | 1012,4, | 1012,5, | 1012,6, | 1012,7, | 1012,8, | 1012,9, | 1012,10, | 1012,11, | 1012,12, | 1012,13, | 1012,14, | 1012,15, | 1012,16, | 1012,17, | 1012,18, | 1012,19, | 1012,20, | 1012,21, | 1012,22, | 1012,23, | 1012,24, | 1012,25, | 1012,26, | 1012,27, | 1012,28, | 1012,29, | 1012,30, | 1012,31, | 1012,32, | 1012,33, | 1012,34, | 1012,35, | 1012,36, | 1012,37, | 1012,38, | 1012,39, | 1012,40, | 1012,41, | 1012,42, | 1012,43, | 1012,44, | 1012,45, | 1012,46, | 1012,47, | 1012,48, | 1012,49, | 1012,50, | 1012,51, | 1012,52, | 1012,53, | 1012,54, | 1012,55, | 1012,56, | 1012,57, | 1012,58, | 1012,59, | 1012,60, | 1012,61, | 1012,62, | 1012,63, | 1012,64, | 1012,65, | 1012,66, | 1012,67, | 1012,68, | 1012,69, | 1012,70, | 1012,71, | 1012,72, | 1012,73, | 1012,74, | 1012,75, | 1012,76, | 1012,77, | 1012,78, | 1012,79, | 1012,80, | 1012,81, | 1012,82, | 1012,83, | 1012,84, | 1012,85, | 1013,1, | 1013,2, | 1013,3, | 1013,4, | 1013,5, | 1013,6, | 1013,7, | 1013,8, | 1013,9, | 1013,10, | 1013,11, | 1013,12, | 1013,13, | 1013,14, | 1013,15, | 1013,16, | 1013,17, | 1013,18, | 1013,19, | 1013,20, | 1013,21, | 1013,22, | 1013,23, | 1013,24, | 1013,25, | 1013,26, | 1013,27, | 1013,28, | 1013,29, | 1013,30, | 1013,31, | 1013,32, | 1013,33, | 1013,34, | 1013,35, | 1013,36, | 1013,37, | 1013,38, | 1013,39, | 1013,40, | 1013,41, | 1013,42, | 1013,43, | 1013,44, | 1013,45, | 1013,46, | 1013,47, | 1013,48, | 1013,49, | 1013,50, | 1013,51, | 1013,52, | 1013,53, | 1013,54, | 1013,55, | 1013,56, | 1013,57, | 1013,58, | 1013,59, | 1013,60, | 1013,61, | 1013,62, | 1013,63, | 1013,64, | 1013,65, | 1013,66, | 1013,67, | 1013,68, | 1013,69, | 1013,70, | 1013,71, | 1013,72, | 1013,73, | 1013,74, | 1013,75, | 1013,76, | 1013,77, | 1013,78, | 1013,79, | 1013,80, | 1013,81, | 1013,82, | 1013,83, | 1013,84, | 1013,85, | 1014,1, | 1014,2, | 1014,3, | 1014,4, | 1014,5, | 1014,6, | 1014,7, | 1014,8, | 1014,9, | 1014,10, | 1014,11, | 1014,12, | 1014,13, | 1014,14, | 1014,15, | 1014,16, | 1014,17, | 1014,18, | 1014,19, | 1014,20, | 1014,21, | 1014,22, | 1014,23, | 1014,24, | 1014,25, | 1014,26, | 1014,27, | 1014,28, | 1014,29, | 1014,30, | 1014,31, | 1014,32, | 1014,33, | 1014,34, | 1014,35, | 1014,36, | 1014,37, | 1014,38, | 1014,39, | 1014,40, | 1014,41, | 1014,42, | 1014,43, | 1014,44, | 1014,45, | 1014,46, | 1014,47, | 1014,48, | 1014,49, | 1014,50, | 1014,51, | 1014,52, | 1014,53, | 1014,54, | 1014,55, | 1014,56, | 1014,57, | 1014,58, | 1014,59, | 1014,60, | 1014,61, | 1014,62, | 1014,63, | 1014,64, | 1014,65, | 1014,66, | 1014,67, | 1014,68, | 1014,69, | 1014,70, | 1014,71, | 1014,72, | 1014,73, | 1014,74, | 1014,75, | 1014,76, | 1014,77, | 1014,78, | 1014,79, | 1014,80, | 1014,81, | 1014,82, | 1014,83, | 1014,84, | 1014,85, | 1015,1, | 1015,2, | 1015,3, | 1015,4, | 1015,5, | 1015,6, | 1015,7, | 1015,8, | 1015,9, | 1015,10, | 1015,11, | 1015,12, | 1015,13, | 1015,14, | 1015,15, | 1015,16, | 1015,17, | 1015,18, | 1015,19, | 1015,20, | 1015,21, | 1015,22, | 1015,23, | 1015,24, | 1015,25, | 1015,26, | 1015,27, | 1015,28, | 1015,29, | 1015,30, | 1015,31, | 1015,32, | 1015,33, | 1015,34, | 1015,35, | 1015,36, | 1015,37, | 1015,38, | 1015,39, | 1015,40, | 1015,41, | 1015,42, | 1015,43, | 1015,44, | 1015,45, | 1015,46, | 1015,47, | 1015,48, | 1015,49, | 1015,50, | 1015,51, | 1015,52, | 1015,53, | 1015,54, | 1015,55, | 1015,56, | 1015,57, | 1015,58, | 1015,59, | 1015,60, | 1015,61, | 1015,62, | 1015,63, | 1015,64, | 1015,65, | 1015,66, | 1015,67, | 1015,68, | 1015,69, | 1015,70, | 1015,71, | 1015,72, | 1015,73, | 1015,74, | 1015,75, | 1015,76, | 1015,77, | 1015,78, | 1015,79, | 1015,80, | 1015,81, | 1015,82, | 1015,83, | 1015,84, | 1015,85, | 1016,1, | 1016,2, | 1016,3, | 1016,4, | 1016,5, | 1016,6, | 1016,7, | 1016,8, | 1016,9, | 1016,10, | 1016,11, | 1016,12, | 1016,13, | 1016,14, | 1016,15, | 1016,16, | 1016,17, | 1016,18, | 1016,19, | 1016,20, | 1016,21, | 1016,22, | 1016,23, | 1016,24, | 1016,25, | 1016,26, | 1016,27, | 1016,28, | 1016,29, | 1016,30, | 1016,31, | 1016,32, | 1016,33, | 1016,34, | 1016,35, | 1016,36, | 1016,37, | 1016,38, | 1016,39, | 1016,40, | 1016,41, | 1016,42, | 1016,43, | 1016,44, | 1016,45, | 1016,46, | 1016,47, | 1016,48, | 1016,49, | 1016,50, | 1016,51, | 1016,52, | 1016,53, | 1016,54, | 1016,55, | 1016,56, | 1016,57, | 1016,58, | 1016,59, | 1016,60, | 1016,61, | 1016,62, | 1016,63, | 1016,64, | 1016,65, | 1016,66, | 1016,67, | 1016,68, | 1016,69, | 1016,70, | 1016,71, | 1016,72, | 1016,73, | 1016,74, | 1016,75, | 1016,76, | 1016,77, | 1016,78, | 1016,79, | 1016,80, | 1016,81, | 1016,82, | 1016,83, | 1016,84, | 1016,85, | 1017,1, | 1017,2, | 1017,3, | 1017,4, | 1017,5, | 1017,6, | 1017,7, | 1017,8, | 1017,9, | 1017,10, | 1017,11, | 1017,12, | 1017,13, | 1017,14, | 1017,15, | 1017,16, | 1017,17, | 1017,18, | 1017,19, | 1017,20, | 1017,21, | 1017,22, | 1017,23, | 1017,24, | 1017,25, | 1017,26, | 1017,27, | 1017,28, | 1017,29, | 1017,30, | 1017,31, | 1017,32, | 1017,33, | 1017,34, | 1017,35, | 1017,36, | 1017,37, | 1017,38, | 1017,39, | 1017,40, | 1017,41, | 1017,42, | 1017,43, | 1017,44, | 1017,45, | 1017,46, | 1017,47, | 1017,48, | 1017,49, | 1017,50, | 1017,51, | 1017,52, | 1017,53, | 1017,54, | 1017,55, | 1017,56, | 1017,57, | 1017,58, | 1017,59, | 1017,60, | 1017,61, | 1017,62, | 1017,63, | 1017,64, | 1017,65, | 1017,66, | 1017,67, | 1017,68, | 1017,69, | 1017,70, | 1017,71, | 1017,72, | 1017,73, | 1017,74, | 1017,75, | 1017,76, | 1017,77, | 1017,78, | 1017,79, | 1017,80, | 1017,81, | 1017,82, | 1017,83, | 1017,84, | 1017,85, | 1018,1, | 1018,2, | 1018,3, | 1018,4, | 1018,5, | 1018,6, | 1018,7, | 1018,8, | 1018,9, | 1018,10, | 1018,11, | 1018,12, | 1018,13, | 1018,14, | 1018,15, | 1018,16, | 1018,17, | 1018,18, | 1018,19, | 1018,20, | 1018,21, | 1018,22, | 1018,23, | 1018,24, | 1018,25, | 1018,26, | 1018,27, | 1018,28, | 1018,29, | 1018,30, | 1018,31, | 1018,32, | 1018,33, | 1018,34, | 1018,35, | 1018,36, | 1018,37, | 1018,38, | 1018,39, | 1018,40, | 1018,41, | 1018,42, | 1018,43, | 1018,44, | 1018,45, | 1018,46, | 1018,47, | 1018,48, | 1018,49, | 1018,50, | 1018,51, | 1018,52, | 1018,53, | 1018,54, | 1018,55, | 1018,56, | 1018,57, | 1018,58, | 1018,59, | 1018,60, | 1018,61, | 1018,62, | 1018,63, | 1018,64, | 1018,65, | 1018,66, | 1018,67, | 1018,68, | 1018,69, | 1018,70, | 1018,71, | 1018,72, | 1018,73, | 1018,74, | 1018,75, | 1018,76, | 1018,77, | 1018,78, | 1018,79, | 1018,80, | 1018,81, | 1018,82, | 1018,83, | 1018,84, | 1018,85, | 1019,1, | 1019,2, | 1019,3, | 1019,4, | 1019,5, | 1019,6, | 1019,7, | 1019,8, | 1019,9, | 1019,10, | 1019,11, | 1019,12, | 1019,13, | 1019,14, | 1019,15, | 1019,16, | 1019,17, | 1019,18, | 1019,19, | 1019,20, | 1019,21, | 1019,22, | 1019,23, | 1019,24, | 1019,25, | 1019,26, | 1019,27, | 1019,28, | 1019,29, | 1019,30, | 1019,31, | 1019,32, | 1019,33, | 1019,34, | 1019,35, | 1019,36, | 1019,37, | 1019,38, | 1019,39, | 1019,40, | 1019,41, | 1019,42, | 1019,43, | 1019,44, | 1019,45, | 1019,46, | 1019,47, | 1019,48, | 1019,49, | 1019,50, | 1019,51, | 1019,52, | 1019,53, | 1019,54, | 1019,55, | 1019,56, | 1019,57, | 1019,58, | 1019,59, | 1019,60, | 1019,61, | 1019,62, | 1019,63, | 1019,64, | 1019,65, | 1019,66, | 1019,67, | 1019,68, | 1019,69, | 1019,70, | 1019,71, | 1019,72, | 1019,73, | 1019,74, | 1019,75, | 1019,76, | 1019,77, | 1019,78, | 1019,79, | 1019,80, | 1019,81, | 1019,82, | 1019,83, | 1019,84, | 1019,85, | 1020,1, | 1020,2, | 1020,3, | 1020,4, | 1020,5, | 1020,6, | 1020,7, | 1020,8, | 1020,9, | 1020,10, | 1020,11, | 1020,12, | 1020,13, | 1020,14, | 1020,15, | 1020,16, | 1020,17, | 1020,18, | 1020,19, | 1020,20, | 1020,21, | 1020,22, | 1020,23, | 1020,24, | 1020,25, | 1020,26, | 1020,27, | 1020,28, | 1020,29, | 1020,30, | 1020,31, | 1020,32, | 1020,33, | 1020,34, | 1020,35, | 1020,36, | 1020,37, | 1020,38, | 1020,39, | 1020,40, | 1020,41, | 1020,42, | 1020,43, | 1020,44, | 1020,45, | 1020,46, | 1020,47, | 1020,48, | 1020,49, | 1020,50, | 1020,51, | 1020,52, | 1020,53, | 1020,54, | 1020,55, | 1020,56, | 1020,57, | 1020,58, | 1020,59, | 1020,60, | 1020,61, | 1020,62, | 1020,63, | 1020,64, | 1020,65, | 1020,66, | 1020,67, | 1020,68, | 1020,69, | 1020,70, | 1020,71, | 1020,72, | 1020,73, | 1020,74, | 1020,75, | 1020,76, | 1020,77, | 1020,78, | 1020,79, | 1020,80, | 1020,81, | 1020,82, | 1020,83, | 1020,84, | 1020,85, | 1021,1, | 1021,2, | 1021,3, | 1021,4, | 1021,5, | 1021,6, | 1021,7, | 1021,8, | 1021,9, | 1021,10, | 1021,11, | 1021,12, | 1021,13, | 1021,14, | 1021,15, | 1021,16, | 1021,17, | 1021,18, | 1021,19, | 1021,20, | 1021,21, | 1021,22, | 1021,23, | 1021,24, | 1021,25, | 1021,26, | 1021,27, | 1021,28, | 1021,29, | 1021,30, | 1021,31, | 1021,32, | 1021,33, | 1021,34, | 1021,35, | 1021,36, | 1021,37, | 1021,38, | 1021,39, | 1021,40, | 1021,41, | 1021,42, | 1021,43, | 1021,44, | 1021,45, | 1021,46, | 1021,47, | 1021,48, | 1021,49, | 1021,50, | 1021,51, | 1021,52, | 1021,53, | 1021,54, | 1021,55, | 1021,56, | 1021,57, | 1021,58, | 1021,59, | 1021,60, | 1021,61, | 1021,62, | 1021,63, | 1021,64, | 1021,65, | 1021,66, | 1021,67, | 1021,68, | 1021,69, | 1021,70, | 1021,71, | 1021,72, | 1021,73, | 1021,74, | 1021,75, | 1021,76, | 1021,77, | 1021,78, | 1021,79, | 1021,80, | 1021,81, | 1021,82, | 1021,83, | 1021,84, | 1021,85, | 1022,1, | 1022,2, | 1022,3, | 1022,4, | 1022,5, | 1022,6, | 1022,7, | 1022,8, | 1022,9, | 1022,10, | 1022,11, | 1022,12, | 1022,13, | 1022,14, | 1022,15, | 1022,16, | 1022,17, | 1022,18, | 1022,19, | 1022,20, | 1022,21, | 1022,22, | 1022,23, | 1022,24, | 1022,25, | 1022,26, | 1022,27, | 1022,28, | 1022,29, | 1022,30, | 1022,31, | 1022,32, | 1022,33, | 1022,34, | 1022,35, | 1022,36, | 1022,37, | 1022,38, | 1022,39, | 1022,40, | 1022,41, | 1022,42, | 1022,43, | 1022,44, | 1022,45, | 1022,46, | 1022,47, | 1022,48, | 1022,49, | 1022,50, | 1022,51, | 1022,52, | 1022,53, | 1022,54, | 1022,55, | 1022,56, | 1022,57, | 1022,58, | 1022,59, | 1022,60, | 1022,61, | 1022,62, | 1022,63, | 1022,64, | 1022,65, | 1022,66, | 1022,67, | 1022,68, | 1022,69, | 1022,70, | 1022,71, | 1022,72, | 1022,73, | 1022,74, | 1022,75, | 1022,76, | 1022,77, | 1022,78, | 1022,79, | 1022,80, | 1022,81, | 1022,82, | 1022,83, | 1022,84, | 1022,85, | 1023,1, | 1023,2, | 1023,3, | 1023,4, | 1023,5, | 1023,6, | 1023,7, | 1023,8, | 1023,9, | 1023,10, | 1023,11, | 1023,12, | 1023,13, | 1023,14, | 1023,15, | 1023,16, | 1023,17, | 1023,18, | 1023,19, | 1023,20, | 1023,21, | 1023,22, | 1023,23, | 1023,24, | 1023,25, | 1023,26, | 1023,27, | 1023,28, | 1023,29, | 1023,30, | 1023,31, | 1023,32, | 1023,33, | 1023,34, | 1023,35, | 1023,36, | 1023,37, | 1023,38, | 1023,39, | 1023,40, | 1023,41, | 1023,42, | 1023,43, | 1023,44, | 1023,45, | 1023,46, | 1023,47, | 1023,48, | 1023,49, | 1023,50, | 1023,51, | 1023,52, | 1023,53, | 1023,54, | 1023,55, | 1023,56, | 1023,57, | 1023,58, | 1023,59, | 1023,60, | 1023,61, | 1023,62, | 1023,63, | 1023,64, | 1023,65, | 1023,66, | 1023,67, | 1023,68, | 1023,69, | 1023,70, | 1023,71, | 1023,72, | 1023,73, | 1023,74, | 1023,75, | 1023,76, | 1023,77, | 1023,78, | 1023,79, | 1023,80, | 1023,81, | 1023,82, | 1023,83, | 1023,84, | 1023,85, | 1024,1, | 1024,2, | 1024,3, | 1024,4, | 1024,5, | 1024,6, | 1024,7, | 1024,8, | 1024,9, | 1024,10, | 1024,11, | 1024,12, | 1024,13, | 1024,14, | 1024,15, | 1024,16, | 1024,17, | 1024,18, | 1024,19, | 1024,20, | 1024,21, | 1024,22, | 1024,23, | 1024,24, | 1024,25, | 1024,26, | 1024,27, | 1024,28, | 1024,29, | 1024,30, | 1024,31, | 1024,32, | 1024,33, | 1024,34, | 1024,35, | 1024,36, | 1024,37, | 1024,38, | 1024,39, | 1024,40, | 1024,41, | 1024,42, | 1024,43, | 1024,44, | 1024,45, | 1024,46, | 1024,47, | 1024,48, | 1024,49, | 1024,50, | 1024,51, | 1024,52, | 1024,53, | 1024,54, | 1024,55, | 1024,56, | 1024,57, | 1024,58, | 1024,59, | 1024,60, | 1024,61, | 1024,62, | 1024,63, | 1024,64, | 1024,65, | 1024,66, | 1024,67, | 1024,68, | 1024,69, | 1024,70, | 1024,71, | 1024,72, | 1024,73, | 1024,74, | 1024,75, | 1024,76, | 1024,77, | 1024,78, | 1024,79, | 1024,80, | 1024,81, | 1024,82, | 1024,83, | 1024,84, | 1024,85, | 1025,1, | 1025,2, | 1025,3, | 1025,4, | 1025,5, | 1025,6, | 1025,7, | 1025,8, | 1025,9, | 1025,10, | 1025,11, | 1025,12, | 1025,13, | 1025,14, | 1025,15, | 1025,16, | 1025,17, | 1025,18, | 1025,19, | 1025,20, | 1025,21, | 1025,22, | 1025,23, | 1025,24, | 1025,25, | 1025,26, | 1025,27, | 1025,28, | 1025,29, | 1025,30, | 1025,31, | 1025,32, | 1025,33, | 1025,34, | 1025,35, | 1025,36, | 1025,37, | 1025,38, | 1025,39, | 1025,40, | 1025,41, | 1025,42, | 1025,43, | 1025,44, | 1025,45, | 1025,46, | 1025,47, | 1025,48, | 1025,49, | 1025,50, | 1025,51, | 1025,52, | 1025,53, | 1025,54, | 1025,55, | 1025,56, | 1025,57, | 1025,58, | 1025,59, | 1025,60, | 1025,61, | 1025,62, | 1025,63, | 1025,64, | 1025,65, | 1025,66, | 1025,67, | 1025,68, | 1025,69, | 1025,70, | 1025,71, | 1025,72, | 1025,73, | 1025,74, | 1025,75, | 1025,76, | 1025,77, | 1025,78, | 1025,79, | 1025,80, | 1025,81, | 1025,82, | 1025,83, | 1025,84, | 1025,85, | 1026,1, | 1026,2, | 1026,3, | 1026,4, | 1026,5, | 1026,6, | 1026,7, | 1026,8, | 1026,9, | 1026,10, | 1026,11, | 1026,12, | 1026,13, | 1026,14, | 1026,15, | 1026,16, | 1026,17, | 1026,18, | 1026,19, | 1026,20, | 1026,21, | 1026,22, | 1026,23, | 1026,24, | 1026,25, | 1026,26, | 1026,27, | 1026,28, | 1026,29, | 1026,30, | 1026,31, | 1026,32, | 1026,33, | 1026,34, | 1026,35, | 1026,36, | 1026,37, | 1026,38, | 1026,39, | 1026,40, | 1026,41, | 1026,42, | 1026,43, | 1026,44, | 1026,45, | 1026,46, | 1026,47, | 1026,48, | 1026,49, | 1026,50, | 1026,51, | 1026,52, | 1026,53, | 1026,54, | 1026,55, | 1026,56, | 1026,57, | 1026,58, | 1026,59, | 1026,60, | 1026,61, | 1026,62, | 1026,63, | 1026,64, | 1026,65, | 1026,66, | 1026,67, | 1026,68, | 1026,69, | 1026,70, | 1026,71, | 1026,72, | 1026,73, | 1026,74, | 1026,75, | 1026,76, | 1026,77, | 1026,78, | 1026,79, | 1026,80, | 1026,81, | 1026,82, | 1026,83, | 1026,84, | 1026,85, | 1027,1, | 1027,2, | 1027,3, | 1027,4, | 1027,5, | 1027,6, | 1027,7, | 1027,8, | 1027,9, | 1027,10, | 1027,11, | 1027,12, | 1027,13, | 1027,14, | 1027,15, | 1027,16, | 1027,17, | 1027,18, | 1027,19, | 1027,20, | 1027,21, | 1027,22, | 1027,23, | 1027,24, | 1027,25, | 1027,26, | 1027,27, | 1027,28, | 1027,29, | 1027,30, | 1027,31, | 1027,32, | 1027,33, | 1027,34, | 1027,35, | 1027,36, | 1027,37, | 1027,38, | 1027,39, | 1027,40, | 1027,41, | 1027,42, | 1027,43, | 1027,44, | 1027,45, | 1027,46, | 1027,47, | 1027,48, | 1027,49, | 1027,50, | 1027,51, | 1027,52, | 1027,53, | 1027,54, | 1027,55, | 1027,56, | 1027,57, | 1027,58, | 1027,59, | 1027,60, | 1027,61, | 1027,62, | 1027,63, | 1027,64, | 1027,65, | 1027,66, | 1027,67, | 1027,68, | 1027,69, | 1027,70, | 1027,71, | 1027,72, | 1027,73, | 1027,74, | 1027,75, | 1027,76, | 1027,77, | 1027,78, | 1027,79, | 1027,80, | 1027,81, | 1027,82, | 1027,83, | 1027,84, | 1027,85, | 1028,1, | 1028,2, | 1028,3, | 1028,4, | 1028,5, | 1028,6, | 1028,7, | 1028,8, | 1028,9, | 1028,10, | 1028,11, | 1028,12, | 1028,13, | 1028,14, | 1028,15, | 1028,16, | 1028,17, | 1028,18, | 1028,19, | 1028,20, | 1028,21, | 1028,22, | 1028,23, | 1028,24, | 1028,25, | 1028,26, | 1028,27, | 1028,28, | 1028,29, | 1028,30, | 1028,31, | 1028,32, | 1028,33, | 1028,34, | 1028,35, | 1028,36, | 1028,37, | 1028,38, | 1028,39, | 1028,40, | 1028,41, | 1028,42, | 1028,43, | 1028,44, | 1028,45, | 1028,46, | 1028,47, | 1028,48, | 1028,49, | 1028,50, | 1028,51, | 1028,52, | 1028,53, | 1028,54, | 1028,55, | 1028,56, | 1028,57, | 1028,58, | 1028,59, | 1028,60, | 1028,61, | 1028,62, | 1028,63, | 1028,64, | 1028,65, | 1028,66, | 1028,67, | 1028,68, | 1028,69, | 1028,70, | 1028,71, | 1028,72, | 1028,73, | 1028,74, | 1028,75, | 1028,76, | 1028,77, | 1028,78, | 1028,79, | 1028,80, | 1028,81, | 1028,82, | 1028,83, | 1028,84, | 1028,85, | 1029,1, | 1029,2, | 1029,3, | 1029,4, | 1029,5, | 1029,6, | 1029,7, | 1029,8, | 1029,9, | 1029,10, | 1029,11, | 1029,12, | 1029,13, | 1029,14, | 1029,15, | 1029,16, | 1029,17, | 1029,18, | 1029,19, | 1029,20, | 1029,21, | 1029,22, | 1029,23, | 1029,24, | 1029,25, | 1029,26, | 1029,27, | 1029,28, | 1029,29, | 1029,30, | 1029,31, | 1029,32, | 1029,33, | 1029,34, | 1029,35, | 1029,36, | 1029,37, | 1029,38, | 1029,39, | 1029,40, | 1029,41, | 1029,42, | 1029,43, | 1029,44, | 1029,45, | 1029,46, | 1029,47, | 1029,48, | 1029,49, | 1029,50, | 1029,51, | 1029,52, | 1029,53, | 1029,54, | 1029,55, | 1029,56, | 1029,57, | 1029,58, | 1029,59, | 1029,60, | 1029,61, | 1029,62, | 1029,63, | 1029,64, | 1029,65, | 1029,66, | 1029,67, | 1029,68, | 1029,69, | 1029,70, | 1029,71, | 1029,72, | 1029,73, | 1029,74, | 1029,75, | 1029,76, | 1029,77, | 1029,78, | 1029,79, | 1029,80, | 1029,81, | 1029,82, | 1029,83, | 1029,84, | 1029,85, | 1030,1, | 1030,2, | 1030,3, | 1030,4, | 1030,5, | 1030,6, | 1030,7, | 1030,8, | 1030,9, | 1030,10, | 1030,11, | 1030,12, | 1030,13, | 1030,14, | 1030,15, | 1030,16, | 1030,17, | 1030,18, | 1030,19, | 1030,20, | 1030,21, | 1030,22, | 1030,23, | 1030,24, | 1030,25, | 1030,26, | 1030,27, | 1030,28, | 1030,29, | 1030,30, | 1030,31, | 1030,32, | 1030,33, | 1030,34, | 1030,35, | 1030,36, | 1030,37, | 1030,38, | 1030,39, | 1030,40, | 1030,41, | 1030,42, | 1030,43, | 1030,44, | 1030,45, | 1030,46, | 1030,47, | 1030,48, | 1030,49, | 1030,50, | 1030,51, | 1030,52, | 1030,53, | 1030,54, | 1030,55, | 1030,56, | 1030,57, | 1030,58, | 1030,59, | 1030,60, | 1030,61, | 1030,62, | 1030,63, | 1030,64, | 1030,65, | 1030,66, | 1030,67, | 1030,68, | 1030,69, | 1030,70, | 1030,71, | 1030,72, | 1030,73, | 1030,74, | 1030,75, | 1030,76, | 1030,77, | 1030,78, | 1030,79, | 1030,80, | 1030,81, | 1030,82, | 1030,83, | 1030,84, | 1030,85, | 1031,1, | 1031,2, | 1031,3, | 1031,4, | 1031,5, | 1031,6, | 1031,7, | 1031,8, | 1031,9, | 1031,10, | 1031,11, | 1031,12, | 1031,13, | 1031,14, | 1031,15, | 1031,16, | 1031,17, | 1031,18, | 1031,19, | 1031,20, | 1031,21, | 1031,22, | 1031,23, | 1031,24, | 1031,25, | 1031,26, | 1031,27, | 1031,28, | 1031,29, | 1031,30, | 1031,31, | 1031,32, | 1031,33, | 1031,34, | 1031,35, | 1031,36, | 1031,37, | 1031,38, | 1031,39, | 1031,40, | 1031,41, | 1031,42, | 1031,43, | 1031,44, | 1031,45, | 1031,46, | 1031,47, | 1031,48, | 1031,49, | 1031,50, | 1031,51, | 1031,52, | 1031,53, | 1031,54, | 1031,55, | 1031,56, | 1031,57, | 1031,58, | 1031,59, | 1031,60, | 1031,61, | 1031,62, | 1031,63, | 1031,64, | 1031,65, | 1031,66, | 1031,67, | 1031,68, | 1031,69, | 1031,70, | 1031,71, | 1031,72, | 1031,73, | 1031,74, | 1031,75, | 1031,76, | 1031,77, | 1031,78, | 1031,79, | 1031,80, | 1031,81, | 1031,82, | 1031,83, | 1031,84, | 1031,85, | 1032,1, | 1032,2, | 1032,3, | 1032,4, | 1032,5, | 1032,6, | 1032,7, | 1032,8, | 1032,9, | 1032,10, | 1032,11, | 1032,12, | 1032,13, | 1032,14, | 1032,15, | 1032,16, | 1032,17, | 1032,18, | 1032,19, | 1032,20, | 1032,21, | 1032,22, | 1032,23, | 1032,24, | 1032,25, | 1032,26, | 1032,27, | 1032,28, | 1032,29, | 1032,30, | 1032,31, | 1032,32, | 1032,33, | 1032,34, | 1032,35, | 1032,36, | 1032,37, | 1032,38, | 1032,39, | 1032,40, | 1032,41, | 1032,42, | 1032,43, | 1032,44, | 1032,45, | 1032,46, | 1032,47, | 1032,48, | 1032,49, | 1032,50, | 1032,51, | 1032,52, | 1032,53, | 1032,54, | 1032,55, | 1032,56, | 1032,57, | 1032,58, | 1032,59, | 1032,60, | 1032,61, | 1032,62, | 1032,63, | 1032,64, | 1032,65, | 1032,66, | 1032,67, | 1032,68, | 1032,69, | 1032,70, | 1032,71, | 1032,72, | 1032,73, | 1032,74, | 1032,75, | 1032,76, | 1032,77, | 1032,78, | 1032,79, | 1032,80, | 1032,81, | 1032,82, | 1032,83, | 1032,84, | 1032,85, | 1033,1, | 1033,2, | 1033,3, | 1033,4, | 1033,5, | 1033,6, | 1033,7, | 1033,8, | 1033,9, | 1033,10, | 1033,11, | 1033,12, | 1033,13, | 1033,14, | 1033,15, | 1033,16, | 1033,17, | 1033,18, | 1033,19, | 1033,20, | 1033,21, | 1033,22, | 1033,23, | 1033,24, | 1033,25, | 1033,26, | 1033,27, | 1033,28, | 1033,29, | 1033,30, | 1033,31, | 1033,32, | 1033,33, | 1033,34, | 1033,35, | 1033,36, | 1033,37, | 1033,38, | 1033,39, | 1033,40, | 1033,41, | 1033,42, | 1033,43, | 1033,44, | 1033,45, | 1033,46, | 1033,47, | 1033,48, | 1033,49, | 1033,50, | 1033,51, | 1033,52, | 1033,53, | 1033,54, | 1033,55, | 1033,56, | 1033,57, | 1033,58, | 1033,59, | 1033,60, | 1033,61, | 1033,62, | 1033,63, | 1033,64, | 1033,65, | 1033,66, | 1033,67, | 1033,68, | 1033,69, | 1033,70, | 1033,71, | 1033,72, | 1033,73, | 1033,74, | 1033,75, | 1033,76, | 1033,77, | 1033,78, | 1033,79, | 1033,80, | 1033,81, | 1033,82, | 1033,83, | 1033,84, | 1033,85, | 1034,1, | 1034,2, | 1034,3, | 1034,4, | 1034,5, | 1034,6, | 1034,7, | 1034,8, | 1034,9, | 1034,10, | 1034,11, | 1034,12, | 1034,13, | 1034,14, | 1034,15, | 1034,16, | 1034,17, | 1034,18, | 1034,19, | 1034,20, | 1034,21, | 1034,22, | 1034,23, | 1034,24, | 1034,25, | 1034,26, | 1034,27, | 1034,28, | 1034,29, | 1034,30, | 1034,31, | 1034,32, | 1034,33, | 1034,34, | 1034,35, | 1034,36, | 1034,37, | 1034,38, | 1034,39, | 1034,40, | 1034,41, | 1034,42, | 1034,43, | 1034,44, | 1034,45, | 1034,46, | 1034,47, | 1034,48, | 1034,49, | 1034,50, | 1034,51, | 1034,52, | 1034,53, | 1034,54, | 1034,55, | 1034,56, | 1034,57, | 1034,58, | 1034,59, | 1034,60, | 1034,61, | 1034,62, | 1034,63, | 1034,64, | 1034,65, | 1034,66, | 1034,67, | 1034,68, | 1034,69, | 1034,70, | 1034,71, | 1034,72, | 1034,73, | 1034,74, | 1034,75, | 1034,76, | 1034,77, | 1034,78, | 1034,79, | 1034,80, | 1034,81, | 1034,82, | 1034,83, | 1034,84, | 1034,85, | 1035,1, | 1035,2, | 1035,3, | 1035,4, | 1035,5, | 1035,6, | 1035,7, | 1035,8, | 1035,9, | 1035,10, | 1035,11, | 1035,12, | 1035,13, | 1035,14, | 1035,15, | 1035,16, | 1035,17, | 1035,18, | 1035,19, | 1035,20, | 1035,21, | 1035,22, | 1035,23, | 1035,24, | 1035,25, | 1035,26, | 1035,27, | 1035,28, | 1035,29, | 1035,30, | 1035,31, | 1035,32, | 1035,33, | 1035,34, | 1035,35, | 1035,36, | 1035,37, | 1035,38, | 1035,39, | 1035,40, | 1035,41, | 1035,42, | 1035,43, | 1035,44, | 1035,45, | 1035,46, | 1035,47, | 1035,48, | 1035,49, | 1035,50, | 1035,51, | 1035,52, | 1035,53, | 1035,54, | 1035,55, | 1035,56, | 1035,57, | 1035,58, | 1035,59, | 1035,60, | 1035,61, | 1035,62, | 1035,63, | 1035,64, | 1035,65, | 1035,66, | 1035,67, | 1035,68, | 1035,69, | 1035,70, | 1035,71, | 1035,72, | 1035,73, | 1035,74, | 1035,75, | 1035,76, | 1035,77, | 1035,78, | 1035,79, | 1035,80, | 1035,81, | 1035,82, | 1035,83, | 1035,84, | 1035,85, | 1036,1, | 1036,2, | 1036,3, | 1036,4, | 1036,5, | 1036,6, | 1036,7, | 1036,8, | 1036,9, | 1036,10, | 1036,11, | 1036,12, | 1036,13, | 1036,14, | 1036,15, | 1036,16, | 1036,17, | 1036,18, | 1036,19, | 1036,20, | 1036,21, | 1036,22, | 1036,23, | 1036,24, | 1036,25, | 1036,26, | 1036,27, | 1036,28, | 1036,29, | 1036,30, | 1036,31, | 1036,32, | 1036,33, | 1036,34, | 1036,35, | 1036,36, | 1036,37, | 1036,38, | 1036,39, | 1036,40, | 1036,41, | 1036,42, | 1036,43, | 1036,44, | 1036,45, | 1036,46, | 1036,47, | 1036,48, | 1036,49, | 1036,50, | 1036,51, | 1036,52, | 1036,53, | 1036,54, | 1036,55, | 1036,56, | 1036,57, | 1036,58, | 1036,59, | 1036,60, | 1036,61, | 1036,62, | 1036,63, | 1036,64, | 1036,65, | 1036,66, | 1036,67, | 1036,68, | 1036,69, | 1036,70, | 1036,71, | 1036,72, | 1036,73, | 1036,74, | 1036,75, | 1036,76, | 1036,77, | 1036,78, | 1036,79, | 1036,80, | 1036,81, | 1036,82, | 1036,83, | 1036,84, | 1036,85, | 1037,1, | 1037,2, | 1037,3, | 1037,4, | 1037,5, | 1037,6, | 1037,7, | 1037,8, | 1037,9, | 1037,10, | 1037,11, | 1037,12, | 1037,13, | 1037,14, | 1037,15, | 1037,16, | 1037,17, | 1037,18, | 1037,19, | 1037,20, | 1037,21, | 1037,22, | 1037,23, | 1037,24, | 1037,25, | 1037,26, | 1037,27, | 1037,28, | 1037,29, | 1037,30, | 1037,31, | 1037,32, | 1037,33, | 1037,34, | 1037,35, | 1037,36, | 1037,37, | 1037,38, | 1037,39, | 1037,40, | 1037,41, | 1037,42, | 1037,43, | 1037,44, | 1037,45, | 1037,46, | 1037,47, | 1037,48, | 1037,49, | 1037,50, | 1037,51, | 1037,52, | 1037,53, | 1037,54, | 1037,55, | 1037,56, | 1037,57, | 1037,58, | 1037,59, | 1037,60, | 1037,61, | 1037,62, | 1037,63, | 1037,64, | 1037,65, | 1037,66, | 1037,67, | 1037,68, | 1037,69, | 1037,70, | 1037,71, | 1037,72, | 1037,73, | 1037,74, | 1037,75, | 1037,76, | 1037,77, | 1037,78, | 1037,79, | 1037,80, | 1037,81, | 1037,82, | 1037,83, | 1037,84, | 1037,85, | 1038,1, | 1038,2, | 1038,3, | 1038,4, | 1038,5, | 1038,6, | 1038,7, | 1038,8, | 1038,9, | 1038,10, | 1038,11, | 1038,12, | 1038,13, | 1038,14, | 1038,15, | 1038,16, | 1038,17, | 1038,18, | 1038,19, | 1038,20, | 1038,21, | 1038,22, | 1038,23, | 1038,24, | 1038,25, | 1038,26, | 1038,27, | 1038,28, | 1038,29, | 1038,30, | 1038,31, | 1038,32, | 1038,33, | 1038,34, | 1038,35, | 1038,36, | 1038,37, | 1038,38, | 1038,39, | 1038,40, | 1038,41, | 1038,42, | 1038,43, | 1038,44, | 1038,45, | 1038,46, | 1038,47, | 1038,48, | 1038,49, | 1038,50, | 1038,51, | 1038,52, | 1038,53, | 1038,54, | 1038,55, | 1038,56, | 1038,57, | 1038,58, | 1038,59, | 1038,60, | 1038,61, | 1038,62, | 1038,63, | 1038,64, | 1038,65, | 1038,66, | 1038,67, | 1038,68, | 1038,69, | 1038,70, | 1038,71, | 1038,72, | 1038,73, | 1038,74, | 1038,75, | 1038,76, | 1038,77, | 1038,78, | 1038,79, | 1038,80, | 1038,81, | 1038,82, | 1038,83, | 1038,84, | 1038,85, | 1039,1, | 1039,2, | 1039,3, | 1039,4, | 1039,5, | 1039,6, | 1039,7, | 1039,8, | 1039,9, | 1039,10, | 1039,11, | 1039,12, | 1039,13, | 1039,14, | 1039,15, | 1039,16, | 1039,17, | 1039,18, | 1039,19, | 1039,20, | 1039,21, | 1039,22, | 1039,23, | 1039,24, | 1039,25, | 1039,26, | 1039,27, | 1039,28, | 1039,29, | 1039,30, | 1039,31, | 1039,32, | 1039,33, | 1039,34, | 1039,35, | 1039,36, | 1039,37, | 1039,38, | 1039,39, | 1039,40, | 1039,41, | 1039,42, | 1039,43, | 1039,44, | 1039,45, | 1039,46, | 1039,47, | 1039,48, | 1039,49, | 1039,50, | 1039,51, | 1039,52, | 1039,53, | 1039,54, | 1039,55, | 1039,56, | 1039,57, | 1039,58, | 1039,59, | 1039,60, | 1039,61, | 1039,62, | 1039,63, | 1039,64, | 1039,65, | 1039,66, | 1039,67, | 1039,68, | 1039,69, | 1039,70, | 1039,71, | 1039,72, | 1039,73, | 1039,74, | 1039,75, | 1039,76, | 1039,77, | 1039,78, | 1039,79, | 1039,80, | 1039,81, | 1039,82, | 1039,83, | 1039,84, | 1039,85, | 1040,1, | 1040,2, | 1040,3, | 1040,4, | 1040,5, | 1040,6, | 1040,7, | 1040,8, | 1040,9, | 1040,10, | 1040,11, | 1040,12, | 1040,13, | 1040,14, | 1040,15, | 1040,16, | 1040,17, | 1040,18, | 1040,19, | 1040,20, | 1040,21, | 1040,22, | 1040,23, | 1040,24, | 1040,25, | 1040,26, | 1040,27, | 1040,28, | 1040,29, | 1040,30, | 1040,31, | 1040,32, | 1040,33, | 1040,34, | 1040,35, | 1040,36, | 1040,37, | 1040,38, | 1040,39, | 1040,40, | 1040,41, | 1040,42, | 1040,43, | 1040,44, | 1040,45, | 1040,46, | 1040,47, | 1040,48, | 1040,49, | 1040,50, | 1040,51, | 1040,52, | 1040,53, | 1040,54, | 1040,55, | 1040,56, | 1040,57, | 1040,58, | 1040,59, | 1040,60, | 1040,61, | 1040,62, | 1040,63, | 1040,64, | 1040,65, | 1040,66, | 1040,67, | 1040,68, | 1040,69, | 1040,70, | 1040,71, | 1040,72, | 1040,73, | 1040,74, | 1040,75, | 1040,76, | 1040,77, | 1040,78, | 1040,79, | 1040,80, | 1040,81, | 1040,82, | 1040,83, | 1040,84, | 1040,85, | 1041,1, | 1041,2, | 1041,3, | 1041,4, | 1041,5, | 1041,6, | 1041,7, | 1041,8, | 1041,9, | 1041,10, | 1041,11, | 1041,12, | 1041,13, | 1041,14, | 1041,15, | 1041,16, | 1041,17, | 1041,18, | 1041,19, | 1041,20, | 1041,21, | 1041,22, | 1041,23, | 1041,24, | 1041,25, | 1041,26, | 1041,27, | 1041,28, | 1041,29, | 1041,30, | 1041,31, | 1041,32, | 1041,33, | 1041,34, | 1041,35, | 1041,36, | 1041,37, | 1041,38, | 1041,39, | 1041,40, | 1041,41, | 1041,42, | 1041,43, | 1041,44, | 1041,45, | 1041,46, | 1041,47, | 1041,48, | 1041,49, | 1041,50, | 1041,51, | 1041,52, | 1041,53, | 1041,54, | 1041,55, | 1041,56, | 1041,57, | 1041,58, | 1041,59, | 1041,60, | 1041,61, | 1041,62, | 1041,63, | 1041,64, | 1041,65, | 1041,66, | 1041,67, | 1041,68, | 1041,69, | 1041,70, | 1041,71, | 1041,72, | 1041,73, | 1041,74, | 1041,75, | 1041,76, | 1041,77, | 1041,78, | 1041,79, | 1041,80, | 1041,81, | 1041,82, | 1041,83, | 1041,84, | 1041,85, | 1042,1, | 1042,2, | 1042,3, | 1042,4, | 1042,5, | 1042,6, | 1042,7, | 1042,8, | 1042,9, | 1042,10, | 1042,11, | 1042,12, | 1042,13, | 1042,14, | 1042,15, | 1042,16, | 1042,17, | 1042,18, | 1042,19, | 1042,20, | 1042,21, | 1042,22, | 1042,23, | 1042,24, | 1042,25, | 1042,26, | 1042,27, | 1042,28, | 1042,29, | 1042,30, | 1042,31, | 1042,32, | 1042,33, | 1042,34, | 1042,35, | 1042,36, | 1042,37, | 1042,38, | 1042,39, | 1042,40, | 1042,41, | 1042,42, | 1042,43, | 1042,44, | 1042,45, | 1042,46, | 1042,47, | 1042,48, | 1042,49, | 1042,50, | 1042,51, | 1042,52, | 1042,53, | 1042,54, | 1042,55, | 1042,56, | 1042,57, | 1042,58, | 1042,59, | 1042,60, | 1042,61, | 1042,62, | 1042,63, | 1042,64, | 1042,65, | 1042,66, | 1042,67, | 1042,68, | 1042,69, | 1042,70, | 1042,71, | 1042,72, | 1042,73, | 1042,74, | 1042,75, | 1042,76, | 1042,77, | 1042,78, | 1042,79, | 1042,80, | 1042,81, | 1042,82, | 1042,83, | 1042,84, | 1042,85, | 1043,1, | 1043,2, | 1043,3, | 1043,4, | 1043,5, | 1043,6, | 1043,7, | 1043,8, | 1043,9, | 1043,10, | 1043,11, | 1043,12, | 1043,13, | 1043,14, | 1043,15, | 1043,16, | 1043,17, | 1043,18, | 1043,19, | 1043,20, | 1043,21, | 1043,22, | 1043,23, | 1043,24, | 1043,25, | 1043,26, | 1043,27, | 1043,28, | 1043,29, | 1043,30, | 1043,31, | 1043,32, | 1043,33, | 1043,34, | 1043,35, | 1043,36, | 1043,37, | 1043,38, | 1043,39, | 1043,40, | 1043,41, | 1043,42, | 1043,43, | 1043,44, | 1043,45, | 1043,46, | 1043,47, | 1043,48, | 1043,49, | 1043,50, | 1043,51, | 1043,52, | 1043,53, | 1043,54, | 1043,55, | 1043,56, | 1043,57, | 1043,58, | 1043,59, | 1043,60, | 1043,61, | 1043,62, | 1043,63, | 1043,64, | 1043,65, | 1043,66, | 1043,67, | 1043,68, | 1043,69, | 1043,70, | 1043,71, | 1043,72, | 1043,73, | 1043,74, | 1043,75, | 1043,76, | 1043,77, | 1043,78, | 1043,79, | 1043,80, | 1043,81, | 1043,82, | 1043,83, | 1043,84, | 1043,85, | 1044,1, | 1044,2, | 1044,3, | 1044,4, | 1044,5, | 1044,6, | 1044,7, | 1044,8, | 1044,9, | 1044,10, | 1044,11, | 1044,12, | 1044,13, | 1044,14, | 1044,15, | 1044,16, | 1044,17, | 1044,18, | 1044,19, | 1044,20, | 1044,21, | 1044,22, | 1044,23, | 1044,24, | 1044,25, | 1044,26, | 1044,27, | 1044,28, | 1044,29, | 1044,30, | 1044,31, | 1044,32, | 1044,33, | 1044,34, | 1044,35, | 1044,36, | 1044,37, | 1044,38, | 1044,39, | 1044,40, | 1044,41, | 1044,42, | 1044,43, | 1044,44, | 1044,45, | 1044,46, | 1044,47, | 1044,48, | 1044,49, | 1044,50, | 1044,51, | 1044,52, | 1044,53, | 1044,54, | 1044,55, | 1044,56, | 1044,57, | 1044,58, | 1044,59, | 1044,60, | 1044,61, | 1044,62, | 1044,63, | 1044,64, | 1044,65, | 1044,66, | 1044,67, | 1044,68, | 1044,69, | 1044,70, | 1044,71, | 1044,72, | 1044,73, | 1044,74, | 1044,75, | 1044,76, | 1044,77, | 1044,78, | 1044,79, | 1044,80, | 1044,81, | 1044,82, | 1044,83, | 1044,84, | 1044,85, | 1045,1, | 1045,2, | 1045,3, | 1045,4, | 1045,5, | 1045,6, | 1045,7, | 1045,8, | 1045,9, | 1045,10, | 1045,11, | 1045,12, | 1045,13, | 1045,14, | 1045,15, | 1045,16, | 1045,17, | 1045,18, | 1045,19, | 1045,20, | 1045,21, | 1045,22, | 1045,23, | 1045,24, | 1045,25, | 1045,26, | 1045,27, | 1045,28, | 1045,29, | 1045,30, | 1045,31, | 1045,32, | 1045,33, | 1045,34, | 1045,35, | 1045,36, | 1045,37, | 1045,38, | 1045,39, | 1045,40, | 1045,41, | 1045,42, | 1045,43, | 1045,44, | 1045,45, | 1045,46, | 1045,47, | 1045,48, | 1045,49, | 1045,50, | 1045,51, | 1045,52, | 1045,53, | 1045,54, | 1045,55, | 1045,56, | 1045,57, | 1045,58, | 1045,59, | 1045,60, | 1045,61, | 1045,62, | 1045,63, | 1045,64, | 1045,65, | 1045,66, | 1045,67, | 1045,68, | 1045,69, | 1045,70, | 1045,71, | 1045,72, | 1045,73, | 1045,74, | 1045,75, | 1045,76, | 1045,77, | 1045,78, | 1045,79, | 1045,80, | 1045,81, | 1045,82, | 1045,83, | 1045,84, | 1045,85, | 1046,1, | 1046,2, | 1046,3, | 1046,4, | 1046,5, | 1046,6, | 1046,7, | 1046,8, | 1046,9, | 1046,10, | 1046,11, | 1046,12, | 1046,13, | 1046,14, | 1046,15, | 1046,16, | 1046,17, | 1046,18, | 1046,19, | 1046,20, | 1046,21, | 1046,22, | 1046,23, | 1046,24, | 1046,25, | 1046,26, | 1046,27, | 1046,28, | 1046,29, | 1046,30, | 1046,31, | 1046,32, | 1046,33, | 1046,34, | 1046,35, | 1046,36, | 1046,37, | 1046,38, | 1046,39, | 1046,40, | 1046,41, | 1046,42, | 1046,43, | 1046,44, | 1046,45, | 1046,46, | 1046,47, | 1046,48, | 1046,49, | 1046,50, | 1046,51, | 1046,52, | 1046,53, | 1046,54, | 1046,55, | 1046,56, | 1046,57, | 1046,58, | 1046,59, | 1046,60, | 1046,61, | 1046,62, | 1046,63, | 1046,64, | 1046,65, | 1046,66, | 1046,67, | 1046,68, | 1046,69, | 1046,70, | 1046,71, | 1046,72, | 1046,73, | 1046,74, | 1046,75, | 1046,76, | 1046,77, | 1046,78, | 1046,79, | 1046,80, | 1046,81, | 1046,82, | 1046,83, | 1046,84, | 1046,85, | 1047,1, | 1047,2, | 1047,3, | 1047,4, | 1047,5, | 1047,6, | 1047,7, | 1047,8, | 1047,9, | 1047,10, | 1047,11, | 1047,12, | 1047,13, | 1047,14, | 1047,15, | 1047,16, | 1047,17, | 1047,18, | 1047,19, | 1047,20, | 1047,21, | 1047,22, | 1047,23, | 1047,24, | 1047,25, | 1047,26, | 1047,27, | 1047,28, | 1047,29, | 1047,30, | 1047,31, | 1047,32, | 1047,33, | 1047,34, | 1047,35, | 1047,36, | 1047,37, | 1047,38, | 1047,39, | 1047,40, | 1047,41, | 1047,42, | 1047,43, | 1047,44, | 1047,45, | 1047,46, | 1047,47, | 1047,48, | 1047,49, | 1047,50, | 1047,51, | 1047,52, | 1047,53, | 1047,54, | 1047,55, | 1047,56, | 1047,57, | 1047,58, | 1047,59, | 1047,60, | 1047,61, | 1047,62, | 1047,63, | 1047,64, | 1047,65, | 1047,66, | 1047,67, | 1047,68, | 1047,69, | 1047,70, | 1047,71, | 1047,72, | 1047,73, | 1047,74, | 1047,75, | 1047,76, | 1047,77, | 1047,78, | 1047,79, | 1047,80, | 1047,81, | 1047,82, | 1047,83, | 1047,84, | 1047,85, | 1048,1, | 1048,2, | 1048,3, | 1048,4, | 1048,5, | 1048,6, | 1048,7, | 1048,8, | 1048,9, | 1048,10, | 1048,11, | 1048,12, | 1048,13, | 1048,14, | 1048,15, | 1048,16, | 1048,17, | 1048,18, | 1048,19, | 1048,20, | 1048,21, | 1048,22, | 1048,23, | 1048,24, | 1048,25, | 1048,26, | 1048,27, | 1048,28, | 1048,29, | 1048,30, | 1048,31, | 1048,32, | 1048,33, | 1048,34, | 1048,35, | 1048,36, | 1048,37, | 1048,38, | 1048,39, | 1048,40, | 1048,41, | 1048,42, | 1048,43, | 1048,44, | 1048,45, | 1048,46, | 1048,47, | 1048,48, | 1048,49, | 1048,50, | 1048,51, | 1048,52, | 1048,53, | 1048,54, | 1048,55, | 1048,56, | 1048,57, | 1048,58, | 1048,59, | 1048,60, | 1048,61, | 1048,62, | 1048,63, | 1048,64, | 1048,65, | 1048,66, | 1048,67, | 1048,68, | 1048,69, | 1048,70, | 1048,71, | 1048,72, | 1048,73, | 1048,74, | 1048,75, | 1048,76, | 1048,77, | 1048,78, | 1048,79, | 1048,80, | 1048,81, | 1048,82, | 1048,83, | 1048,84, | 1048,85, | 1049,1, | 1049,2, | 1049,3, | 1049,4, | 1049,5, | 1049,6, | 1049,7, | 1049,8, | 1049,9, | 1049,10, | 1049,11, | 1049,12, | 1049,13, | 1049,14, | 1049,15, | 1049,16, | 1049,17, | 1049,18, | 1049,19, | 1049,20, | 1049,21, | 1049,22, | 1049,23, | 1049,24, | 1049,25, | 1049,26, | 1049,27, | 1049,28, | 1049,29, | 1049,30, | 1049,31, | 1049,32, | 1049,33, | 1049,34, | 1049,35, | 1049,36, | 1049,37, | 1049,38, | 1049,39, | 1049,40, | 1049,41, | 1049,42, | 1049,43, | 1049,44, | 1049,45, | 1049,46, | 1049,47, | 1049,48, | 1049,49, | 1049,50, | 1049,51, | 1049,52, | 1049,53, | 1049,54, | 1049,55, | 1049,56, | 1049,57, | 1049,58, | 1049,59, | 1049,60, | 1049,61, | 1049,62, | 1049,63, | 1049,64, | 1049,65, | 1049,66, | 1049,67, | 1049,68, | 1049,69, | 1049,70, | 1049,71, | 1049,72, | 1049,73, | 1049,74, | 1049,75, | 1049,76, | 1049,77, | 1049,78, | 1049,79, | 1049,80, | 1049,81, | 1049,82, | 1049,83, | 1049,84, | 1049,85, | 1050,1, | 1050,2, | 1050,3, | 1050,4, | 1050,5, | 1050,6, | 1050,7, | 1050,8, | 1050,9, | 1050,10, | 1050,11, | 1050,12, | 1050,13, | 1050,14, | 1050,15, | 1050,16, | 1050,17, | 1050,18, | 1050,19, | 1050,20, | 1050,21, | 1050,22, | 1050,23, | 1050,24, | 1050,25, | 1050,26, | 1050,27, | 1050,28, | 1050,29, | 1050,30, | 1050,31, | 1050,32, | 1050,33, | 1050,34, | 1050,35, | 1050,36, | 1050,37, | 1050,38, | 1050,39, | 1050,40, | 1050,41, | 1050,42, | 1050,43, | 1050,44, | 1050,45, | 1050,46, | 1050,47, | 1050,48, | 1050,49, | 1050,50, | 1050,51, | 1050,52, | 1050,53, | 1050,54, | 1050,55, | 1050,56, | 1050,57, | 1050,58, | 1050,59, | 1050,60, | 1050,61, | 1050,62, | 1050,63, | 1050,64, | 1050,65, | 1050,66, | 1050,67, | 1050,68, | 1050,69, | 1050,70, | 1050,71, | 1050,72, | 1050,73, | 1050,74, | 1050,75, | 1050,76, | 1050,77, | 1050,78, | 1050,79, | 1050,80, | 1050,81, | 1050,82, | 1050,83, | 1050,84, | 1050,85, | 1051,1, | 1051,2, | 1051,3, | 1051,4, | 1051,5, | 1051,6, | 1051,7, | 1051,8, | 1051,9, | 1051,10, | 1051,11, | 1051,12, | 1051,13, | 1051,14, | 1051,15, | 1051,16, | 1051,17, | 1051,18, | 1051,19, | 1051,20, | 1051,21, | 1051,22, | 1051,23, | 1051,24, | 1051,25, | 1051,26, | 1051,27, | 1051,28, | 1051,29, | 1051,30, | 1051,31, | 1051,32, | 1051,33, | 1051,34, | 1051,35, | 1051,36, | 1051,37, | 1051,38, | 1051,39, | 1051,40, | 1051,41, | 1051,42, | 1051,43, | 1051,44, | 1051,45, | 1051,46, | 1051,47, | 1051,48, | 1051,49, | 1051,50, | 1051,51, | 1051,52, | 1051,53, | 1051,54, | 1051,55, | 1051,56, | 1051,57, | 1051,58, | 1051,59, | 1051,60, | 1051,61, | 1051,62, | 1051,63, | 1051,64, | 1051,65, | 1051,66, | 1051,67, | 1051,68, | 1051,69, | 1051,70, | 1051,71, | 1051,72, | 1051,73, | 1051,74, | 1051,75, | 1051,76, | 1051,77, | 1051,78, | 1051,79, | 1051,80, | 1051,81, | 1051,82, | 1051,83, | 1051,84, | 1051,85, | 1052,1, | 1052,2, | 1052,3, | 1052,4, | 1052,5, | 1052,6, | 1052,7, | 1052,8, | 1052,9, | 1052,10, | 1052,11, | 1052,12, | 1052,13, | 1052,14, | 1052,15, | 1052,16, | 1052,17, | 1052,18, | 1052,19, | 1052,20, | 1052,21, | 1052,22, | 1052,23, | 1052,24, | 1052,25, | 1052,26, | 1052,27, | 1052,28, | 1052,29, | 1052,30, | 1052,31, | 1052,32, | 1052,33, | 1052,34, | 1052,35, | 1052,36, | 1052,37, | 1052,38, | 1052,39, | 1052,40, | 1052,41, | 1052,42, | 1052,43, | 1052,44, | 1052,45, | 1052,46, | 1052,47, | 1052,48, | 1052,49, | 1052,50, | 1052,51, | 1052,52, | 1052,53, | 1052,54, | 1052,55, | 1052,56, | 1052,57, | 1052,58, | 1052,59, | 1052,60, | 1052,61, | 1052,62, | 1052,63, | 1052,64, | 1052,65, | 1052,66, | 1052,67, | 1052,68, | 1052,69, | 1052,70, | 1052,71, | 1052,72, | 1052,73, | 1052,74, | 1052,75, | 1052,76, | 1052,77, | 1052,78, | 1052,79, | 1052,80, | 1052,81, | 1052,82, | 1052,83, | 1052,84, | 1052,85, | 1053,1, | 1053,2, | 1053,3, | 1053,4, | 1053,5, | 1053,6, | 1053,7, | 1053,8, | 1053,9, | 1053,10, | 1053,11, | 1053,12, | 1053,13, | 1053,14, | 1053,15, | 1053,16, | 1053,17, | 1053,18, | 1053,19, | 1053,20, | 1053,21, | 1053,22, | 1053,23, | 1053,24, | 1053,25, | 1053,26, | 1053,27, | 1053,28, | 1053,29, | 1053,30, | 1053,31, | 1053,32, | 1053,33, | 1053,34, | 1053,35, | 1053,36, | 1053,37, | 1053,38, | 1053,39, | 1053,40, | 1053,41, | 1053,42, | 1053,43, | 1053,44, | 1053,45, | 1053,46, | 1053,47, | 1053,48, | 1053,49, | 1053,50, | 1053,51, | 1053,52, | 1053,53, | 1053,54, | 1053,55, | 1053,56, | 1053,57, | 1053,58, | 1053,59, | 1053,60, | 1053,61, | 1053,62, | 1053,63, | 1053,64, | 1053,65, | 1053,66, | 1053,67, | 1053,68, | 1053,69, | 1053,70, | 1053,71, | 1053,72, | 1053,73, | 1053,74, | 1053,75, | 1053,76, | 1053,77, | 1053,78, | 1053,79, | 1053,80, | 1053,81, | 1053,82, | 1053,83, | 1053,84, | 1053,85, | 1054,1, | 1054,2, | 1054,3, | 1054,4, | 1054,5, | 1054,6, | 1054,7, | 1054,8, | 1054,9, | 1054,10, | 1054,11, | 1054,12, | 1054,13, | 1054,14, | 1054,15, | 1054,16, | 1054,17, | 1054,18, | 1054,19, | 1054,20, | 1054,21, | 1054,22, | 1054,23, | 1054,24, | 1054,25, | 1054,26, | 1054,27, | 1054,28, | 1054,29, | 1054,30, | 1054,31, | 1054,32, | 1054,33, | 1054,34, | 1054,35, | 1054,36, | 1054,37, | 1054,38, | 1054,39, | 1054,40, | 1054,41, | 1054,42, | 1054,43, | 1054,44, | 1054,45, | 1054,46, | 1054,47, | 1054,48, | 1054,49, | 1054,50, | 1054,51, | 1054,52, | 1054,53, | 1054,54, | 1054,55, | 1054,56, | 1054,57, | 1054,58, | 1054,59, | 1054,60, | 1054,61, | 1054,62, | 1054,63, | 1054,64, | 1054,65, | 1054,66, | 1054,67, | 1054,68, | 1054,69, | 1054,70, | 1054,71, | 1054,72, | 1054,73, | 1054,74, | 1054,75, | 1054,76, | 1054,77, | 1054,78, | 1054,79, | 1054,80, | 1054,81, | 1054,82, | 1054,83, | 1054,84, | 1054,85, | 1055,1, | 1055,2, | 1055,3, | 1055,4, | 1055,5, | 1055,6, | 1055,7, | 1055,8, | 1055,9, | 1055,10, | 1055,11, | 1055,12, | 1055,13, | 1055,14, | 1055,15, | 1055,16, | 1055,17, | 1055,18, | 1055,19, | 1055,20, | 1055,21, | 1055,22, | 1055,23, | 1055,24, | 1055,25, | 1055,26, | 1055,27, | 1055,28, | 1055,29, | 1055,30, | 1055,31, | 1055,32, | 1055,33, | 1055,34, | 1055,35, | 1055,36, | 1055,37, | 1055,38, | 1055,39, | 1055,40, | 1055,41, | 1055,42, | 1055,43, | 1055,44, | 1055,45, | 1055,46, | 1055,47, | 1055,48, | 1055,49, | 1055,50, | 1055,51, | 1055,52, | 1055,53, | 1055,54, | 1055,55, | 1055,56, | 1055,57, | 1055,58, | 1055,59, | 1055,60, | 1055,61, | 1055,62, | 1055,63, | 1055,64, | 1055,65, | 1055,66, | 1055,67, | 1055,68, | 1055,69, | 1055,70, | 1055,71, | 1055,72, | 1055,73, | 1055,74, | 1055,75, | 1055,76, | 1055,77, | 1055,78, | 1055,79, | 1055,80, | 1055,81, | 1055,82, | 1055,83, | 1055,84, | 1055,85, | 1056,1, | 1056,2, | 1056,3, | 1056,4, | 1056,5, | 1056,6, | 1056,7, | 1056,8, | 1056,9, | 1056,10, | 1056,11, | 1056,12, | 1056,13, | 1056,14, | 1056,15, | 1056,16, | 1056,17, | 1056,18, | 1056,19, | 1056,20, | 1056,21, | 1056,22, | 1056,23, | 1056,24, | 1056,25, | 1056,26, | 1056,27, | 1056,28, | 1056,29, | 1056,30, | 1056,31, | 1056,32, | 1056,33, | 1056,34, | 1056,35, | 1056,36, | 1056,37, | 1056,38, | 1056,39, | 1056,40, | 1056,41, | 1056,42, | 1056,43, | 1056,44, | 1056,45, | 1056,46, | 1056,47, | 1056,48, | 1056,49, | 1056,50, | 1056,51, | 1056,52, | 1056,53, | 1056,54, | 1056,55, | 1056,56, | 1056,57, | 1056,58, | 1056,59, | 1056,60, | 1056,61, | 1056,62, | 1056,63, | 1056,64, | 1056,65, | 1056,66, | 1056,67, | 1056,68, | 1056,69, | 1056,70, | 1056,71, | 1056,72, | 1056,73, | 1056,74, | 1056,75, | 1056,76, | 1056,77, | 1056,78, | 1056,79, | 1056,80, | 1056,81, | 1056,82, | 1056,83, | 1056,84, | 1056,85, | 1057,1, | 1057,2, | 1057,3, | 1057,4, | 1057,5, | 1057,6, | 1057,7, | 1057,8, | 1057,9, | 1057,10, | 1057,11, | 1057,12, | 1057,13, | 1057,14, | 1057,15, | 1057,16, | 1057,17, | 1057,18, | 1057,19, | 1057,20, | 1057,21, | 1057,22, | 1057,23, | 1057,24, | 1057,25, | 1057,26, | 1057,27, | 1057,28, | 1057,29, | 1057,30, | 1057,31, | 1057,32, | 1057,33, | 1057,34, | 1057,35, | 1057,36, | 1057,37, | 1057,38, | 1057,39, | 1057,40, | 1057,41, | 1057,42, | 1057,43, | 1057,44, | 1057,45, | 1057,46, | 1057,47, | 1057,48, | 1057,49, | 1057,50, | 1057,51, | 1057,52, | 1057,53, | 1057,54, | 1057,55, | 1057,56, | 1057,57, | 1057,58, | 1057,59, | 1057,60, | 1057,61, | 1057,62, | 1057,63, | 1057,64, | 1057,65, | 1057,66, | 1057,67, | 1057,68, | 1057,69, | 1057,70, | 1057,71, | 1057,72, | 1057,73, | 1057,74, | 1057,75, | 1057,76, | 1057,77, | 1057,78, | 1057,79, | 1057,80, | 1057,81, | 1057,82, | 1057,83, | 1057,84, | 1057,85, | 1058,1, | 1058,2, | 1058,3, | 1058,4, | 1058,5, | 1058,6, | 1058,7, | 1058,8, | 1058,9, | 1058,10, | 1058,11, | 1058,12, | 1058,13, | 1058,14, | 1058,15, | 1058,16, | 1058,17, | 1058,18, | 1058,19, | 1058,20, | 1058,21, | 1058,22, | 1058,23, | 1058,24, | 1058,25, | 1058,26, | 1058,27, | 1058,28, | 1058,29, | 1058,30, | 1058,31, | 1058,32, | 1058,33, | 1058,34, | 1058,35, | 1058,36, | 1058,37, | 1058,38, | 1058,39, | 1058,40, | 1058,41, | 1058,42, | 1058,43, | 1058,44, | 1058,45, | 1058,46, | 1058,47, | 1058,48, | 1058,49, | 1058,50, | 1058,51, | 1058,52, | 1058,53, | 1058,54, | 1058,55, | 1058,56, | 1058,57, | 1058,58, | 1058,59, | 1058,60, | 1058,61, | 1058,62, | 1058,63, | 1058,64, | 1058,65, | 1058,66, | 1058,67, | 1058,68, | 1058,69, | 1058,70, | 1058,71, | 1058,72, | 1058,73, | 1058,74, | 1058,75, | 1058,76, | 1058,77, | 1058,78, | 1058,79, | 1058,80, | 1058,81, | 1058,82, | 1058,83, | 1058,84, | 1058,85, | 1059,1, | 1059,2, | 1059,3, | 1059,4, | 1059,5, | 1059,6, | 1059,7, | 1059,8, | 1059,9, | 1059,10, | 1059,11, | 1059,12, | 1059,13, | 1059,14, | 1059,15, | 1059,16, | 1059,17, | 1059,18, | 1059,19, | 1059,20, | 1059,21, | 1059,22, | 1059,23, | 1059,24, | 1059,25, | 1059,26, | 1059,27, | 1059,28, | 1059,29, | 1059,30, | 1059,31, | 1059,32, | 1059,33, | 1059,34, | 1059,35, | 1059,36, | 1059,37, | 1059,38, | 1059,39, | 1059,40, | 1059,41, | 1059,42, | 1059,43, | 1059,44, | 1059,45, | 1059,46, | 1059,47, | 1059,48, | 1059,49, | 1059,50, | 1059,51, | 1059,52, | 1059,53, | 1059,54, | 1059,55, | 1059,56, | 1059,57, | 1059,58, | 1059,59, | 1059,60, | 1059,61, | 1059,62, | 1059,63, | 1059,64, | 1059,65, | 1059,66, | 1059,67, | 1059,68, | 1059,69, | 1059,70, | 1059,71, | 1059,72, | 1059,73, | 1059,74, | 1059,75, | 1059,76, | 1059,77, | 1059,78, | 1059,79, | 1059,80, | 1059,81, | 1059,82, | 1059,83, | 1059,84, | 1059,85, | 1060,1, | 1060,2, | 1060,3, | 1060,4, | 1060,5, | 1060,6, | 1060,7, | 1060,8, | 1060,9, | 1060,10, | 1060,11, | 1060,12, | 1060,13, | 1060,14, | 1060,15, | 1060,16, | 1060,17, | 1060,18, | 1060,19, | 1060,20, | 1060,21, | 1060,22, | 1060,23, | 1060,24, | 1060,25, | 1060,26, | 1060,27, | 1060,28, | 1060,29, | 1060,30, | 1060,31, | 1060,32, | 1060,33, | 1060,34, | 1060,35, | 1060,36, | 1060,37, | 1060,38, | 1060,39, | 1060,40, | 1060,41, | 1060,42, | 1060,43, | 1060,44, | 1060,45, | 1060,46, | 1060,47, | 1060,48, | 1060,49, | 1060,50, | 1060,51, | 1060,52, | 1060,53, | 1060,54, | 1060,55, | 1060,56, | 1060,57, | 1060,58, | 1060,59, | 1060,60, | 1060,61, | 1060,62, | 1060,63, | 1060,64, | 1060,65, | 1060,66, | 1060,67, | 1060,68, | 1060,69, | 1060,70, | 1060,71, | 1060,72, | 1060,73, | 1060,74, | 1060,75, | 1060,76, | 1060,77, | 1060,78, | 1060,79, | 1060,80, | 1060,81, | 1060,82, | 1060,83, | 1060,84, | 1060,85, | 1061,1, | 1061,2, | 1061,3, | 1061,4, | 1061,5, | 1061,6, | 1061,7, | 1061,8, | 1061,9, | 1061,10, | 1061,11, | 1061,12, | 1061,13, | 1061,14, | 1061,15, | 1061,16, | 1061,17, | 1061,18, | 1061,19, | 1061,20, | 1061,21, | 1061,22, | 1061,23, | 1061,24, | 1061,25, | 1061,26, | 1061,27, | 1061,28, | 1061,29, | 1061,30, | 1061,31, | 1061,32, | 1061,33, | 1061,34, | 1061,35, | 1061,36, | 1061,37, | 1061,38, | 1061,39, | 1061,40, | 1061,41, | 1061,42, | 1061,43, | 1061,44, | 1061,45, | 1061,46, | 1061,47, | 1061,48, | 1061,49, | 1061,50, | 1061,51, | 1061,52, | 1061,53, | 1061,54, | 1061,55, | 1061,56, | 1061,57, | 1061,58, | 1061,59, | 1061,60, | 1061,61, | 1061,62, | 1061,63, | 1061,64, | 1061,65, | 1061,66, | 1061,67, | 1061,68, | 1061,69, | 1061,70, | 1061,71, | 1061,72, | 1061,73, | 1061,74, | 1061,75, | 1061,76, | 1061,77, | 1061,78, | 1061,79, | 1061,80, | 1061,81, | 1061,82, | 1061,83, | 1061,84, | 1061,85, | 1062,1, | 1062,2, | 1062,3, | 1062,4, | 1062,5, | 1062,6, | 1062,7, | 1062,8, | 1062,9, | 1062,10, | 1062,11, | 1062,12, | 1062,13, | 1062,14, | 1062,15, | 1062,16, | 1062,17, | 1062,18, | 1062,19, | 1062,20, | 1062,21, | 1062,22, | 1062,23, | 1062,24, | 1062,25, | 1062,26, | 1062,27, | 1062,28, | 1062,29, | 1062,30, | 1062,31, | 1062,32, | 1062,33, | 1062,34, | 1062,35, | 1062,36, | 1062,37, | 1062,38, | 1062,39, | 1062,40, | 1062,41, | 1062,42, | 1062,43, | 1062,44, | 1062,45, | 1062,46, | 1062,47, | 1062,48, | 1062,49, | 1062,50, | 1062,51, | 1062,52, | 1062,53, | 1062,54, | 1062,55, | 1062,56, | 1062,57, | 1062,58, | 1062,59, | 1062,60, | 1062,61, | 1062,62, | 1062,63, | 1062,64, | 1062,65, | 1062,66, | 1062,67, | 1062,68, | 1062,69, | 1062,70, | 1062,71, | 1062,72, | 1062,73, | 1062,74, | 1062,75, | 1062,76, | 1062,77, | 1062,78, | 1062,79, | 1062,80, | 1062,81, | 1062,82, | 1062,83, | 1062,84, | 1062,85, | 1063,1, | 1063,2, | 1063,3, | 1063,4, | 1063,5, | 1063,6, | 1063,7, | 1063,8, | 1063,9, | 1063,10, | 1063,11, | 1063,12, | 1063,13, | 1063,14, | 1063,15, | 1063,16, | 1063,17, | 1063,18, | 1063,19, | 1063,20, | 1063,21, | 1063,22, | 1063,23, | 1063,24, | 1063,25, | 1063,26, | 1063,27, | 1063,28, | 1063,29, | 1063,30, | 1063,31, | 1063,32, | 1063,33, | 1063,34, | 1063,35, | 1063,36, | 1063,37, | 1063,38, | 1063,39, | 1063,40, | 1063,41, | 1063,42, | 1063,43, | 1063,44, | 1063,45, | 1063,46, | 1063,47, | 1063,48, | 1063,49, | 1063,50, | 1063,51, | 1063,52, | 1063,53, | 1063,54, | 1063,55, | 1063,56, | 1063,57, | 1063,58, | 1063,59, | 1063,60, | 1063,61, | 1063,62, | 1063,63, | 1063,64, | 1063,65, | 1063,66, | 1063,67, | 1063,68, | 1063,69, | 1063,70, | 1063,71, | 1063,72, | 1063,73, | 1063,74, | 1063,75, | 1063,76, | 1063,77, | 1063,78, | 1063,79, | 1063,80, | 1063,81, | 1063,82, | 1063,83, | 1063,84, | 1063,85, | 1064,1, | 1064,2, | 1064,3, | 1064,4, | 1064,5, | 1064,6, | 1064,7, | 1064,8, | 1064,9, | 1064,10, | 1064,11, | 1064,12, | 1064,13, | 1064,14, | 1064,15, | 1064,16, | 1064,17, | 1064,18, | 1064,19, | 1064,20, | 1064,21, | 1064,22, | 1064,23, | 1064,24, | 1064,25, | 1064,26, | 1064,27, | 1064,28, | 1064,29, | 1064,30, | 1064,31, | 1064,32, | 1064,33, | 1064,34, | 1064,35, | 1064,36, | 1064,37, | 1064,38, | 1064,39, | 1064,40, | 1064,41, | 1064,42, | 1064,43, | 1064,44, | 1064,45, | 1064,46, | 1064,47, | 1064,48, | 1064,49, | 1064,50, | 1064,51, | 1064,52, | 1064,53, | 1064,54, | 1064,55, | 1064,56, | 1064,57, | 1064,58, | 1064,59, | 1064,60, | 1064,61, | 1064,62, | 1064,63, | 1064,64, | 1064,65, | 1064,66, | 1064,67, | 1064,68, | 1064,69, | 1064,70, | 1064,71, | 1064,72, | 1064,73, | 1064,74, | 1064,75, | 1064,76, | 1064,77, | 1064,78, | 1064,79, | 1064,80, | 1064,81, | 1064,82, | 1064,83, | 1064,84, | 1064,85, | 1065,1, | 1065,2, | 1065,3, | 1065,4, | 1065,5, | 1065,6, | 1065,7, | 1065,8, | 1065,9, | 1065,10, | 1065,11, | 1065,12, | 1065,13, | 1065,14, | 1065,15, | 1065,16, | 1065,17, | 1065,18, | 1065,19, | 1065,20, | 1065,21, | 1065,22, | 1065,23, | 1065,24, | 1065,25, | 1065,26, | 1065,27, | 1065,28, | 1065,29, | 1065,30, | 1065,31, | 1065,32, | 1065,33, | 1065,34, | 1065,35, | 1065,36, | 1065,37, | 1065,38, | 1065,39, | 1065,40, | 1065,41, | 1065,42, | 1065,43, | 1065,44, | 1065,45, | 1065,46, | 1065,47, | 1065,48, | 1065,49, | 1065,50, | 1065,51, | 1065,52, | 1065,53, | 1065,54, | 1065,55, | 1065,56, | 1065,57, | 1065,58, | 1065,59, | 1065,60, | 1065,61, | 1065,62, | 1065,63, | 1065,64, | 1065,65, | 1065,66, | 1065,67, | 1065,68, | 1065,69, | 1065,70, | 1065,71, | 1065,72, | 1065,73, | 1065,74, | 1065,75, | 1065,76, | 1065,77, | 1065,78, | 1065,79, | 1065,80, | 1065,81, | 1065,82, | 1065,83, | 1065,84, | 1065,85, | 1066,1, | 1066,2, | 1066,3, | 1066,4, | 1066,5, | 1066,6, | 1066,7, | 1066,8, | 1066,9, | 1066,10, | 1066,11, | 1066,12, | 1066,13, | 1066,14, | 1066,15, | 1066,16, | 1066,17, | 1066,18, | 1066,19, | 1066,20, | 1066,21, | 1066,22, | 1066,23, | 1066,24, | 1066,25, | 1066,26, | 1066,27, | 1066,28, | 1066,29, | 1066,30, | 1066,31, | 1066,32, | 1066,33, | 1066,34, | 1066,35, | 1066,36, | 1066,37, | 1066,38, | 1066,39, | 1066,40, | 1066,41, | 1066,42, | 1066,43, | 1066,44, | 1066,45, | 1066,46, | 1066,47, | 1066,48, | 1066,49, | 1066,50, | 1066,51, | 1066,52, | 1066,53, | 1066,54, | 1066,55, | 1066,56, | 1066,57, | 1066,58, | 1066,59, | 1066,60, | 1066,61, | 1066,62, | 1066,63, | 1066,64, | 1066,65, | 1066,66, | 1066,67, | 1066,68, | 1066,69, | 1066,70, | 1066,71, | 1066,72, | 1066,73, | 1066,74, | 1066,75, | 1066,76, | 1066,77, | 1066,78, | 1066,79, | 1066,80, | 1066,81, | 1066,82, | 1066,83, | 1066,84, | 1066,85, | 1067,1, | 1067,2, | 1067,3, | 1067,4, | 1067,5, | 1067,6, | 1067,7, | 1067,8, | 1067,9, | 1067,10, | 1067,11, | 1067,12, | 1067,13, | 1067,14, | 1067,15, | 1067,16, | 1067,17, | 1067,18, | 1067,19, | 1067,20, | 1067,21, | 1067,22, | 1067,23, | 1067,24, | 1067,25, | 1067,26, | 1067,27, | 1067,28, | 1067,29, | 1067,30, | 1067,31, | 1067,32, | 1067,33, | 1067,34, | 1067,35, | 1067,36, | 1067,37, | 1067,38, | 1067,39, | 1067,40, | 1067,41, | 1067,42, | 1067,43, | 1067,44, | 1067,45, | 1067,46, | 1067,47, | 1067,48, | 1067,49, | 1067,50, | 1067,51, | 1067,52, | 1067,53, | 1067,54, | 1067,55, | 1067,56, | 1067,57, | 1067,58, | 1067,59, | 1067,60, | 1067,61, | 1067,62, | 1067,63, | 1067,64, | 1067,65, | 1067,66, | 1067,67, | 1067,68, | 1067,69, | 1067,70, | 1067,71, | 1067,72, | 1067,73, | 1067,74, | 1067,75, | 1067,76, | 1067,77, | 1067,78, | 1067,79, | 1067,80, | 1067,81, | 1067,82, | 1067,83, | 1067,84, | 1067,85, | 1068,1, | 1068,2, | 1068,3, | 1068,4, | 1068,5, | 1068,6, | 1068,7, | 1068,8, | 1068,9, | 1068,10, | 1068,11, | 1068,12, | 1068,13, | 1068,14, | 1068,15, | 1068,16, | 1068,17, | 1068,18, | 1068,19, | 1068,20, | 1068,21, | 1068,22, | 1068,23, | 1068,24, | 1068,25, | 1068,26, | 1068,27, | 1068,28, | 1068,29, | 1068,30, | 1068,31, | 1068,32, | 1068,33, | 1068,34, | 1068,35, | 1068,36, | 1068,37, | 1068,38, | 1068,39, | 1068,40, | 1068,41, | 1068,42, | 1068,43, | 1068,44, | 1068,45, | 1068,46, | 1068,47, | 1068,48, | 1068,49, | 1068,50, | 1068,51, | 1068,52, | 1068,53, | 1068,54, | 1068,55, | 1068,56, | 1068,57, | 1068,58, | 1068,59, | 1068,60, | 1068,61, | 1068,62, | 1068,63, | 1068,64, | 1068,65, | 1068,66, | 1068,67, | 1068,68, | 1068,69, | 1068,70, | 1068,71, | 1068,72, | 1068,73, | 1068,74, | 1068,75, | 1068,76, | 1068,77, | 1068,78, | 1068,79, | 1068,80, | 1068,81, | 1068,82, | 1068,83, | 1068,84, | 1068,85, | 1069,1, | 1069,2, | 1069,3, | 1069,4, | 1069,5, | 1069,6, | 1069,7, | 1069,8, | 1069,9, | 1069,10, | 1069,11, | 1069,12, | 1069,13, | 1069,14, | 1069,15, | 1069,16, | 1069,17, | 1069,18, | 1069,19, | 1069,20, | 1069,21, | 1069,22, | 1069,23, | 1069,24, | 1069,25, | 1069,26, | 1069,27, | 1069,28, | 1069,29, | 1069,30, | 1069,31, | 1069,32, | 1069,33, | 1069,34, | 1069,35, | 1069,36, | 1069,37, | 1069,38, | 1069,39, | 1069,40, | 1069,41, | 1069,42, | 1069,43, | 1069,44, | 1069,45, | 1069,46, | 1069,47, | 1069,48, | 1069,49, | 1069,50, | 1069,51, | 1069,52, | 1069,53, | 1069,54, | 1069,55, | 1069,56, | 1069,57, | 1069,58, | 1069,59, | 1069,60, | 1069,61, | 1069,62, | 1069,63, | 1069,64, | 1069,65, | 1069,66, | 1069,67, | 1069,68, | 1069,69, | 1069,70, | 1069,71, | 1069,72, | 1069,73, | 1069,74, | 1069,75, | 1069,76, | 1069,77, | 1069,78, | 1069,79, | 1069,80, | 1069,81, | 1069,82, | 1069,83, | 1069,84, | 1069,85, | 1070,1, | 1070,2, | 1070,3, | 1070,4, | 1070,5, | 1070,6, | 1070,7, | 1070,8, | 1070,9, | 1070,10, | 1070,11, | 1070,12, | 1070,13, | 1070,14, | 1070,15, | 1070,16, | 1070,17, | 1070,18, | 1070,19, | 1070,20, | 1070,21, | 1070,22, | 1070,23, | 1070,24, | 1070,25, | 1070,26, | 1070,27, | 1070,28, | 1070,29, | 1070,30, | 1070,31, | 1070,32, | 1070,33, | 1070,34, | 1070,35, | 1070,36, | 1070,37, | 1070,38, | 1070,39, | 1070,40, | 1070,41, | 1070,42, | 1070,43, | 1070,44, | 1070,45, | 1070,46, | 1070,47, | 1070,48, | 1070,49, | 1070,50, | 1070,51, | 1070,52, | 1070,53, | 1070,54, | 1070,55, | 1070,56, | 1070,57, | 1070,58, | 1070,59, | 1070,60, | 1070,61, | 1070,62, | 1070,63, | 1070,64, | 1070,65, | 1070,66, | 1070,67, | 1070,68, | 1070,69, | 1070,70, | 1070,71, | 1070,72, | 1070,73, | 1070,74, | 1070,75, | 1070,76, | 1070,77, | 1070,78, | 1070,79, | 1070,80, | 1070,81, | 1070,82, | 1070,83, | 1070,84, | 1070,85, | 1071,1, | 1071,2, | 1071,3, | 1071,4, | 1071,5, | 1071,6, | 1071,7, | 1071,8, | 1071,9, | 1071,10, | 1071,11, | 1071,12, | 1071,13, | 1071,14, | 1071,15, | 1071,16, | 1071,17, | 1071,18, | 1071,19, | 1071,20, | 1071,21, | 1071,22, | 1071,23, | 1071,24, | 1071,25, | 1071,26, | 1071,27, | 1071,28, | 1071,29, | 1071,30, | 1071,31, | 1071,32, | 1071,33, | 1071,34, | 1071,35, | 1071,36, | 1071,37, | 1071,38, | 1071,39, | 1071,40, | 1071,41, | 1071,42, | 1071,43, | 1071,44, | 1071,45, | 1071,46, | 1071,47, | 1071,48, | 1071,49, | 1071,50, | 1071,51, | 1071,52, | 1071,53, | 1071,54, | 1071,55, | 1071,56, | 1071,57, | 1071,58, | 1071,59, | 1071,60, | 1071,61, | 1071,62, | 1071,63, | 1071,64, | 1071,65, | 1071,66, | 1071,67, | 1071,68, | 1071,69, | 1071,70, | 1071,71, | 1071,72, | 1071,73, | 1071,74, | 1071,75, | 1071,76, | 1071,77, | 1071,78, | 1071,79, | 1071,80, | 1071,81, | 1071,82, | 1071,83, | 1071,84, | 1071,85, | 1072,1, | 1072,2, | 1072,3, | 1072,4, | 1072,5, | 1072,6, | 1072,7, | 1072,8, | 1072,9, | 1072,10, | 1072,11, | 1072,12, | 1072,13, | 1072,14, | 1072,15, | 1072,16, | 1072,17, | 1072,18, | 1072,19, | 1072,20, | 1072,21, | 1072,22, | 1072,23, | 1072,24, | 1072,25, | 1072,26, | 1072,27, | 1072,28, | 1072,29, | 1072,30, | 1072,31, | 1072,32, | 1072,33, | 1072,34, | 1072,35, | 1072,36, | 1072,37, | 1072,38, | 1072,39, | 1072,40, | 1072,41, | 1072,42, | 1072,43, | 1072,44, | 1072,45, | 1072,46, | 1072,47, | 1072,48, | 1072,49, | 1072,50, | 1072,51, | 1072,52, | 1072,53, | 1072,54, | 1072,55, | 1072,56, | 1072,57, | 1072,58, | 1072,59, | 1072,60, | 1072,61, | 1072,62, | 1072,63, | 1072,64, | 1072,65, | 1072,66, | 1072,67, | 1072,68, | 1072,69, | 1072,70, | 1072,71, | 1072,72, | 1072,73, | 1072,74, | 1072,75, | 1072,76, | 1072,77, | 1072,78, | 1072,79, | 1072,80, | 1072,81, | 1072,82, | 1072,83, | 1072,84, | 1072,85, | 1073,1, | 1073,2, | 1073,3, | 1073,4, | 1073,5, | 1073,6, | 1073,7, | 1073,8, | 1073,9, | 1073,10, | 1073,11, | 1073,12, | 1073,13, | 1073,14, | 1073,15, | 1073,16, | 1073,17, | 1073,18, | 1073,19, | 1073,20, | 1073,21, | 1073,22, | 1073,23, | 1073,24, | 1073,25, | 1073,26, | 1073,27, | 1073,28, | 1073,29, | 1073,30, | 1073,31, | 1073,32, | 1073,33, | 1073,34, | 1073,35, | 1073,36, | 1073,37, | 1073,38, | 1073,39, | 1073,40, | 1073,41, | 1073,42, | 1073,43, | 1073,44, | 1073,45, | 1073,46, | 1073,47, | 1073,48, | 1073,49, | 1073,50, | 1073,51, | 1073,52, | 1073,53, | 1073,54, | 1073,55, | 1073,56, | 1073,57, | 1073,58, | 1073,59, | 1073,60, | 1073,61, | 1073,62, | 1073,63, | 1073,64, | 1073,65, | 1073,66, | 1073,67, | 1073,68, | 1073,69, | 1073,70, | 1073,71, | 1073,72, | 1073,73, | 1073,74, | 1073,75, | 1073,76, | 1073,77, | 1073,78, | 1073,79, | 1073,80, | 1073,81, | 1073,82, | 1073,83, | 1073,84, | 1073,85, | 1074,1, | 1074,2, | 1074,3, | 1074,4, | 1074,5, | 1074,6, | 1074,7, | 1074,8, | 1074,9, | 1074,10, | 1074,11, | 1074,12, | 1074,13, | 1074,14, | 1074,15, | 1074,16, | 1074,17, | 1074,18, | 1074,19, | 1074,20, | 1074,21, | 1074,22, | 1074,23, | 1074,24, | 1074,25, | 1074,26, | 1074,27, | 1074,28, | 1074,29, | 1074,30, | 1074,31, | 1074,32, | 1074,33, | 1074,34, | 1074,35, | 1074,36, | 1074,37, | 1074,38, | 1074,39, | 1074,40, | 1074,41, | 1074,42, | 1074,43, | 1074,44, | 1074,45, | 1074,46, | 1074,47, | 1074,48, | 1074,49, | 1074,50, | 1074,51, | 1074,52, | 1074,53, | 1074,54, | 1074,55, | 1074,56, | 1074,57, | 1074,58, | 1074,59, | 1074,60, | 1074,61, | 1074,62, | 1074,63, | 1074,64, | 1074,65, | 1074,66, | 1074,67, | 1074,68, | 1074,69, | 1074,70, | 1074,71, | 1074,72, | 1074,73, | 1074,74, | 1074,75, | 1074,76, | 1074,77, | 1074,78, | 1074,79, | 1074,80, | 1074,81, | 1074,82, | 1074,83, | 1074,84, | 1074,85, | 1075,1, | 1075,2, | 1075,3, | 1075,4, | 1075,5, | 1075,6, | 1075,7, | 1075,8, | 1075,9, | 1075,10, | 1075,11, | 1075,12, | 1075,13, | 1075,14, | 1075,15, | 1075,16, | 1075,17, | 1075,18, | 1075,19, | 1075,20, | 1075,21, | 1075,22, | 1075,23, | 1075,24, | 1075,25, | 1075,26, | 1075,27, | 1075,28, | 1075,29, | 1075,30, | 1075,31, | 1075,32, | 1075,33, | 1075,34, | 1075,35, | 1075,36, | 1075,37, | 1075,38, | 1075,39, | 1075,40, | 1075,41, | 1075,42, | 1075,43, | 1075,44, | 1075,45, | 1075,46, | 1075,47, | 1075,48, | 1075,49, | 1075,50, | 1075,51, | 1075,52, | 1075,53, | 1075,54, | 1075,55, | 1075,56, | 1075,57, | 1075,58, | 1075,59, | 1075,60, | 1075,61, | 1075,62, | 1075,63, | 1075,64, | 1075,65, | 1075,66, | 1075,67, | 1075,68, | 1075,69, | 1075,70, | 1075,71, | 1075,72, | 1075,73, | 1075,74, | 1075,75, | 1075,76, | 1075,77, | 1075,78, | 1075,79, | 1075,80, | 1075,81, | 1075,82, | 1075,83, | 1075,84, | 1075,85, | 1076,1, | 1076,2, | 1076,3, | 1076,4, | 1076,5, | 1076,6, | 1076,7, | 1076,8, | 1076,9, | 1076,10, | 1076,11, | 1076,12, | 1076,13, | 1076,14, | 1076,15, | 1076,16, | 1076,17, | 1076,18, | 1076,19, | 1076,20, | 1076,21, | 1076,22, | 1076,23, | 1076,24, | 1076,25, | 1076,26, | 1076,27, | 1076,28, | 1076,29, | 1076,30, | 1076,31, | 1076,32, | 1076,33, | 1076,34, | 1076,35, | 1076,36, | 1076,37, | 1076,38, | 1076,39, | 1076,40, | 1076,41, | 1076,42, | 1076,43, | 1076,44, | 1076,45, | 1076,46, | 1076,47, | 1076,48, | 1076,49, | 1076,50, | 1076,51, | 1076,52, | 1076,53, | 1076,54, | 1076,55, | 1076,56, | 1076,57, | 1076,58, | 1076,59, | 1076,60, | 1076,61, | 1076,62, | 1076,63, | 1076,64, | 1076,65, | 1076,66, | 1076,67, | 1076,68, | 1076,69, | 1076,70, | 1076,71, | 1076,72, | 1076,73, | 1076,74, | 1076,75, | 1076,76, | 1076,77, | 1076,78, | 1076,79, | 1076,80, | 1076,81, | 1076,82, | 1076,83, | 1076,84, | 1076,85, | 1077,1, | 1077,2, | 1077,3, | 1077,4, | 1077,5, | 1077,6, | 1077,7, | 1077,8, | 1077,9, | 1077,10, | 1077,11, | 1077,12, | 1077,13, | 1077,14, | 1077,15, | 1077,16, | 1077,17, | 1077,18, | 1077,19, | 1077,20, | 1077,21, | 1077,22, | 1077,23, | 1077,24, | 1077,25, | 1077,26, | 1077,27, | 1077,28, | 1077,29, | 1077,30, | 1077,31, | 1077,32, | 1077,33, | 1077,34, | 1077,35, | 1077,36, | 1077,37, | 1077,38, | 1077,39, | 1077,40, | 1077,41, | 1077,42, | 1077,43, | 1077,44, | 1077,45, | 1077,46, | 1077,47, | 1077,48, | 1077,49, | 1077,50, | 1077,51, | 1077,52, | 1077,53, | 1077,54, | 1077,55, | 1077,56, | 1077,57, | 1077,58, | 1077,59, | 1077,60, | 1077,61, | 1077,62, | 1077,63, | 1077,64, | 1077,65, | 1077,66, | 1077,67, | 1077,68, | 1077,69, | 1077,70, | 1077,71, | 1077,72, | 1077,73, | 1077,74, | 1077,75, | 1077,76, | 1077,77, | 1077,78, | 1077,79, | 1077,80, | 1077,81, | 1077,82, | 1077,83, | 1077,84, | 1077,85, | 1078,1, | 1078,2, | 1078,3, | 1078,4, | 1078,5, | 1078,6, | 1078,7, | 1078,8, | 1078,9, | 1078,10, | 1078,11, | 1078,12, | 1078,13, | 1078,14, | 1078,15, | 1078,16, | 1078,17, | 1078,18, | 1078,19, | 1078,20, | 1078,21, | 1078,22, | 1078,23, | 1078,24, | 1078,25, | 1078,26, | 1078,27, | 1078,28, | 1078,29, | 1078,30, | 1078,31, | 1078,32, | 1078,33, | 1078,34, | 1078,35, | 1078,36, | 1078,37, | 1078,38, | 1078,39, | 1078,40, | 1078,41, | 1078,42, | 1078,43, | 1078,44, | 1078,45, | 1078,46, | 1078,47, | 1078,48, | 1078,49, | 1078,50, | 1078,51, | 1078,52, | 1078,53, | 1078,54, | 1078,55, | 1078,56, | 1078,57, | 1078,58, | 1078,59, | 1078,60, | 1078,61, | 1078,62, | 1078,63, | 1078,64, | 1078,65, | 1078,66, | 1078,67, | 1078,68, | 1078,69, | 1078,70, | 1078,71, | 1078,72, | 1078,73, | 1078,74, | 1078,75, | 1078,76, | 1078,77, | 1078,78, | 1078,79, | 1078,80, | 1078,81, | 1078,82, | 1078,83, | 1078,84, | 1078,85, | 1079,1, | 1079,2, | 1079,3, | 1079,4, | 1079,5, | 1079,6, | 1079,7, | 1079,8, | 1079,9, | 1079,10, | 1079,11, | 1079,12, | 1079,13, | 1079,14, | 1079,15, | 1079,16, | 1079,17, | 1079,18, | 1079,19, | 1079,20, | 1079,21, | 1079,22, | 1079,23, | 1079,24, | 1079,25, | 1079,26, | 1079,27, | 1079,28, | 1079,29, | 1079,30, | 1079,31, | 1079,32, | 1079,33, | 1079,34, | 1079,35, | 1079,36, | 1079,37, | 1079,38, | 1079,39, | 1079,40, | 1079,41, | 1079,42, | 1079,43, | 1079,44, | 1079,45, | 1079,46, | 1079,47, | 1079,48, | 1079,49, | 1079,50, | 1079,51, | 1079,52, | 1079,53, | 1079,54, | 1079,55, | 1079,56, | 1079,57, | 1079,58, | 1079,59, | 1079,60, | 1079,61, | 1079,62, | 1079,63, | 1079,64, | 1079,65, | 1079,66, | 1079,67, | 1079,68, | 1079,69, | 1079,70, | 1079,71, | 1079,72, | 1079,73, | 1079,74, | 1079,75, | 1079,76, | 1079,77, | 1079,78, | 1079,79, | 1079,80, | 1079,81, | 1079,82, | 1079,83, | 1079,84, | 1079,85, | 1080,1, | 1080,2, | 1080,3, | 1080,4, | 1080,5, | 1080,6, | 1080,7, | 1080,8, | 1080,9, | 1080,10, | 1080,11, | 1080,12, | 1080,13, | 1080,14, | 1080,15, | 1080,16, | 1080,17, | 1080,18, | 1080,19, | 1080,20, | 1080,21, | 1080,22, | 1080,23, | 1080,24, | 1080,25, | 1080,26, | 1080,27, | 1080,28, | 1080,29, | 1080,30, | 1080,31, | 1080,32, | 1080,33, | 1080,34, | 1080,35, | 1080,36, | 1080,37, | 1080,38, | 1080,39, | 1080,40, | 1080,41, | 1080,42, | 1080,43, | 1080,44, | 1080,45, | 1080,46, | 1080,47, | 1080,48, | 1080,49, | 1080,50, | 1080,51, | 1080,52, | 1080,53, | 1080,54, | 1080,55, | 1080,56, | 1080,57, | 1080,58, | 1080,59, | 1080,60, | 1080,61, | 1080,62, | 1080,63, | 1080,64, | 1080,65, | 1080,66, | 1080,67, | 1080,68, | 1080,69, | 1080,70, | 1080,71, | 1080,72, | 1080,73, | 1080,74, | 1080,75, | 1080,76, | 1080,77, | 1080,78, | 1080,79, | 1080,80, | 1080,81, | 1080,82, | 1080,83, | 1080,84, | 1080,85, | 1081,1, | 1081,2, | 1081,3, | 1081,4, | 1081,5, | 1081,6, | 1081,7, | 1081,8, | 1081,9, | 1081,10, | 1081,11, | 1081,12, | 1081,13, | 1081,14, | 1081,15, | 1081,16, | 1081,17, | 1081,18, | 1081,19, | 1081,20, | 1081,21, | 1081,22, | 1081,23, | 1081,24, | 1081,25, | 1081,26, | 1081,27, | 1081,28, | 1081,29, | 1081,30, | 1081,31, | 1081,32, | 1081,33, | 1081,34, | 1081,35, | 1081,36, | 1081,37, | 1081,38, | 1081,39, | 1081,40, | 1081,41, | 1081,42, | 1081,43, | 1081,44, | 1081,45, | 1081,46, | 1081,47, | 1081,48, | 1081,49, | 1081,50, | 1081,51, | 1081,52, | 1081,53, | 1081,54, | 1081,55, | 1081,56, | 1081,57, | 1081,58, | 1081,59, | 1081,60, | 1081,61, | 1081,62, | 1081,63, | 1081,64, | 1081,65, | 1081,66, | 1081,67, | 1081,68, | 1081,69, | 1081,70, | 1081,71, | 1081,72, | 1081,73, | 1081,74, | 1081,75, | 1081,76, | 1081,77, | 1081,78, | 1081,79, | 1081,80, | 1081,81, | 1081,82, | 1081,83, | 1081,84, | 1081,85, | 1082,1, | 1082,2, | 1082,3, | 1082,4, | 1082,5, | 1082,6, | 1082,7, | 1082,8, | 1082,9, | 1082,10, | 1082,11, | 1082,12, | 1082,13, | 1082,14, | 1082,15, | 1082,16, | 1082,17, | 1082,18, | 1082,19, | 1082,20, | 1082,21, | 1082,22, | 1082,23, | 1082,24, | 1082,25, | 1082,26, | 1082,27, | 1082,28, | 1082,29, | 1082,30, | 1082,31, | 1082,32, | 1082,33, | 1082,34, | 1082,35, | 1082,36, | 1082,37, | 1082,38, | 1082,39, | 1082,40, | 1082,41, | 1082,42, | 1082,43, | 1082,44, | 1082,45, | 1082,46, | 1082,47, | 1082,48, | 1082,49, | 1082,50, | 1082,51, | 1082,52, | 1082,53, | 1082,54, | 1082,55, | 1082,56, | 1082,57, | 1082,58, | 1082,59, | 1082,60, | 1082,61, | 1082,62, | 1082,63, | 1082,64, | 1082,65, | 1082,66, | 1082,67, | 1082,68, | 1082,69, | 1082,70, | 1082,71, | 1082,72, | 1082,73, | 1082,74, | 1082,75, | 1082,76, | 1082,77, | 1082,78, | 1082,79, | 1082,80, | 1082,81, | 1082,82, | 1082,83, | 1082,84, | 1082,85, | 1083,1, | 1083,2, | 1083,3, | 1083,4, | 1083,5, | 1083,6, | 1083,7, | 1083,8, | 1083,9, | 1083,10, | 1083,11, | 1083,12, | 1083,13, | 1083,14, | 1083,15, | 1083,16, | 1083,17, | 1083,18, | 1083,19, | 1083,20, | 1083,21, | 1083,22, | 1083,23, | 1083,24, | 1083,25, | 1083,26, | 1083,27, | 1083,28, | 1083,29, | 1083,30, | 1083,31, | 1083,32, | 1083,33, | 1083,34, | 1083,35, | 1083,36, | 1083,37, | 1083,38, | 1083,39, | 1083,40, | 1083,41, | 1083,42, | 1083,43, | 1083,44, | 1083,45, | 1083,46, | 1083,47, | 1083,48, | 1083,49, | 1083,50, | 1083,51, | 1083,52, | 1083,53, | 1083,54, | 1083,55, | 1083,56, | 1083,57, | 1083,58, | 1083,59, | 1083,60, | 1083,61, | 1083,62, | 1083,63, | 1083,64, | 1083,65, | 1083,66, | 1083,67, | 1083,68, | 1083,69, | 1083,70, | 1083,71, | 1083,72, | 1083,73, | 1083,74, | 1083,75, | 1083,76, | 1083,77, | 1083,78, | 1083,79, | 1083,80, | 1083,81, | 1083,82, | 1083,83, | 1083,84, | 1083,85, | 1084,1, | 1084,2, | 1084,3, | 1084,4, | 1084,5, | 1084,6, | 1084,7, | 1084,8, | 1084,9, | 1084,10, | 1084,11, | 1084,12, | 1084,13, | 1084,14, | 1084,15, | 1084,16, | 1084,17, | 1084,18, | 1084,19, | 1084,20, | 1084,21, | 1084,22, | 1084,23, | 1084,24, | 1084,25, | 1084,26, | 1084,27, | 1084,28, | 1084,29, | 1084,30, | 1084,31, | 1084,32, | 1084,33, | 1084,34, | 1084,35, | 1084,36, | 1084,37, | 1084,38, | 1084,39, | 1084,40, | 1084,41, | 1084,42, | 1084,43, | 1084,44, | 1084,45, | 1084,46, | 1084,47, | 1084,48, | 1084,49, | 1084,50, | 1084,51, | 1084,52, | 1084,53, | 1084,54, | 1084,55, | 1084,56, | 1084,57, | 1084,58, | 1084,59, | 1084,60, | 1084,61, | 1084,62, | 1084,63, | 1084,64, | 1084,65, | 1084,66, | 1084,67, | 1084,68, | 1084,69, | 1084,70, | 1084,71, | 1084,72, | 1084,73, | 1084,74, | 1084,75, | 1084,76, | 1084,77, | 1084,78, | 1084,79, | 1084,80, | 1084,81, | 1084,82, | 1084,83, | 1084,84, | 1084,85, | 1085,1, | 1085,2, | 1085,3, | 1085,4, | 1085,5, | 1085,6, | 1085,7, | 1085,8, | 1085,9, | 1085,10, | 1085,11, | 1085,12, | 1085,13, | 1085,14, | 1085,15, | 1085,16, | 1085,17, | 1085,18, | 1085,19, | 1085,20, | 1085,21, | 1085,22, | 1085,23, | 1085,24, | 1085,25, | 1085,26, | 1085,27, | 1085,28, | 1085,29, | 1085,30, | 1085,31, | 1085,32, | 1085,33, | 1085,34, | 1085,35, | 1085,36, | 1085,37, | 1085,38, | 1085,39, | 1085,40, | 1085,41, | 1085,42, | 1085,43, | 1085,44, | 1085,45, | 1085,46, | 1085,47, | 1085,48, | 1085,49, | 1085,50, | 1085,51, | 1085,52, | 1085,53, | 1085,54, | 1085,55, | 1085,56, | 1085,57, | 1085,58, | 1085,59, | 1085,60, | 1085,61, | 1085,62, | 1085,63, | 1085,64, | 1085,65, | 1085,66, | 1085,67, | 1085,68, | 1085,69, | 1085,70, | 1085,71, | 1085,72, | 1085,73, | 1085,74, | 1085,75, | 1085,76, | 1085,77, | 1085,78, | 1085,79, | 1085,80, | 1085,81, | 1085,82, | 1085,83, | 1085,84, | 1085,85, | 1086,1, | 1086,2, | 1086,3, | 1086,4, | 1086,5, | 1086,6, | 1086,7, | 1086,8, | 1086,9, | 1086,10, | 1086,11, | 1086,12, | 1086,13, | 1086,14, | 1086,15, | 1086,16, | 1086,17, | 1086,18, | 1086,19, | 1086,20, | 1086,21, | 1086,22, | 1086,23, | 1086,24, | 1086,25, | 1086,26, | 1086,27, | 1086,28, | 1086,29, | 1086,30, | 1086,31, | 1086,32, | 1086,33, | 1086,34, | 1086,35, | 1086,36, | 1086,37, | 1086,38, | 1086,39, | 1086,40, | 1086,41, | 1086,42, | 1086,43, | 1086,44, | 1086,45, | 1086,46, | 1086,47, | 1086,48, | 1086,49, | 1086,50, | 1086,51, | 1086,52, | 1086,53, | 1086,54, | 1086,55, | 1086,56, | 1086,57, | 1086,58, | 1086,59, | 1086,60, | 1086,61, | 1086,62, | 1086,63, | 1086,64, | 1086,65, | 1086,66, | 1086,67, | 1086,68, | 1086,69, | 1086,70, | 1086,71, | 1086,72, | 1086,73, | 1086,74, | 1086,75, | 1086,76, | 1086,77, | 1086,78, | 1086,79, | 1086,80, | 1086,81, | 1086,82, | 1086,83, | 1086,84, | 1086,85, | 1087,1, | 1087,2, | 1087,3, | 1087,4, | 1087,5, | 1087,6, | 1087,7, | 1087,8, | 1087,9, | 1087,10, | 1087,11, | 1087,12, | 1087,13, | 1087,14, | 1087,15, | 1087,16, | 1087,17, | 1087,18, | 1087,19, | 1087,20, | 1087,21, | 1087,22, | 1087,23, | 1087,24, | 1087,25, | 1087,26, | 1087,27, | 1087,28, | 1087,29, | 1087,30, | 1087,31, | 1087,32, | 1087,33, | 1087,34, | 1087,35, | 1087,36, | 1087,37, | 1087,38, | 1087,39, | 1087,40, | 1087,41, | 1087,42, | 1087,43, | 1087,44, | 1087,45, | 1087,46, | 1087,47, | 1087,48, | 1087,49, | 1087,50, | 1087,51, | 1087,52, | 1087,53, | 1087,54, | 1087,55, | 1087,56, | 1087,57, | 1087,58, | 1087,59, | 1087,60, | 1087,61, | 1087,62, | 1087,63, | 1087,64, | 1087,65, | 1087,66, | 1087,67, | 1087,68, | 1087,69, | 1087,70, | 1087,71, | 1087,72, | 1087,73, | 1087,74, | 1087,75, | 1087,76, | 1087,77, | 1087,78, | 1087,79, | 1087,80, | 1087,81, | 1087,82, | 1087,83, | 1087,84, | 1087,85, | 1088,1, | 1088,2, | 1088,3, | 1088,4, | 1088,5, | 1088,6, | 1088,7, | 1088,8, | 1088,9, | 1088,10, | 1088,11, | 1088,12, | 1088,13, | 1088,14, | 1088,15, | 1088,16, | 1088,17, | 1088,18, | 1088,19, | 1088,20, | 1088,21, | 1088,22, | 1088,23, | 1088,24, | 1088,25, | 1088,26, | 1088,27, | 1088,28, | 1088,29, | 1088,30, | 1088,31, | 1088,32, | 1088,33, | 1088,34, | 1088,35, | 1088,36, | 1088,37, | 1088,38, | 1088,39, | 1088,40, | 1088,41, | 1088,42, | 1088,43, | 1088,44, | 1088,45, | 1088,46, | 1088,47, | 1088,48, | 1088,49, | 1088,50, | 1088,51, | 1088,52, | 1088,53, | 1088,54, | 1088,55, | 1088,56, | 1088,57, | 1088,58, | 1088,59, | 1088,60, | 1088,61, | 1088,62, | 1088,63, | 1088,64, | 1088,65, | 1088,66, | 1088,67, | 1088,68, | 1088,69, | 1088,70, | 1088,71, | 1088,72, | 1088,73, | 1088,74, | 1088,75, | 1088,76, | 1088,77, | 1088,78, | 1088,79, | 1088,80, | 1088,81, | 1088,82, | 1088,83, | 1088,84, | 1088,85, | 1089,1, | 1089,2, | 1089,3, | 1089,4, | 1089,5, | 1089,6, | 1089,7, | 1089,8, | 1089,9, | 1089,10, | 1089,11, | 1089,12, | 1089,13, | 1089,14, | 1089,15, | 1089,16, | 1089,17, | 1089,18, | 1089,19, | 1089,20, | 1089,21, | 1089,22, | 1089,23, | 1089,24, | 1089,25, | 1089,26, | 1089,27, | 1089,28, | 1089,29, | 1089,30, | 1089,31, | 1089,32, | 1089,33, | 1089,34, | 1089,35, | 1089,36, | 1089,37, | 1089,38, | 1089,39, | 1089,40, | 1089,41, | 1089,42, | 1089,43, | 1089,44, | 1089,45, | 1089,46, | 1089,47, | 1089,48, | 1089,49, | 1089,50, | 1089,51, | 1089,52, | 1089,53, | 1089,54, | 1089,55, | 1089,56, | 1089,57, | 1089,58, | 1089,59, | 1089,60, | 1089,61, | 1089,62, | 1089,63, | 1089,64, | 1089,65, | 1089,66, | 1089,67, | 1089,68, | 1089,69, | 1089,70, | 1089,71, | 1089,72, | 1089,73, | 1089,74, | 1089,75, | 1089,76, | 1089,77, | 1089,78, | 1089,79, | 1089,80, | 1089,81, | 1089,82, | 1089,83, | 1089,84, | 1089,85, | 1090,1, | 1090,2, | 1090,3, | 1090,4, | 1090,5, | 1090,6, | 1090,7, | 1090,8, | 1090,9, | 1090,10, | 1090,11, | 1090,12, | 1090,13, | 1090,14, | 1090,15, | 1090,16, | 1090,17, | 1090,18, | 1090,19, | 1090,20, | 1090,21, | 1090,22, | 1090,23, | 1090,24, | 1090,25, | 1090,26, | 1090,27, | 1090,28, | 1090,29, | 1090,30, | 1090,31, | 1090,32, | 1090,33, | 1090,34, | 1090,35, | 1090,36, | 1090,37, | 1090,38, | 1090,39, | 1090,40, | 1090,41, | 1090,42, | 1090,43, | 1090,44, | 1090,45, | 1090,46, | 1090,47, | 1090,48, | 1090,49, | 1090,50, | 1090,51, | 1090,52, | 1090,53, | 1090,54, | 1090,55, | 1090,56, | 1090,57, | 1090,58, | 1090,59, | 1090,60, | 1090,61, | 1090,62, | 1090,63, | 1090,64, | 1090,65, | 1090,66, | 1090,67, | 1090,68, | 1090,69, | 1090,70, | 1090,71, | 1090,72, | 1090,73, | 1090,74, | 1090,75, | 1090,76, | 1090,77, | 1090,78, | 1090,79, | 1090,80, | 1090,81, | 1090,82, | 1090,83, | 1090,84, | 1090,85, | 1091,1, | 1091,2, | 1091,3, | 1091,4, | 1091,5, | 1091,6, | 1091,7, | 1091,8, | 1091,9, | 1091,10, | 1091,11, | 1091,12, | 1091,13, | 1091,14, | 1091,15, | 1091,16, | 1091,17, | 1091,18, | 1091,19, | 1091,20, | 1091,21, | 1091,22, | 1091,23, | 1091,24, | 1091,25, | 1091,26, | 1091,27, | 1091,28, | 1091,29, | 1091,30, | 1091,31, | 1091,32, | 1091,33, | 1091,34, | 1091,35, | 1091,36, | 1091,37, | 1091,38, | 1091,39, | 1091,40, | 1091,41, | 1091,42, | 1091,43, | 1091,44, | 1091,45, | 1091,46, | 1091,47, | 1091,48, | 1091,49, | 1091,50, | 1091,51, | 1091,52, | 1091,53, | 1091,54, | 1091,55, | 1091,56, | 1091,57, | 1091,58, | 1091,59, | 1091,60, | 1091,61, | 1091,62, | 1091,63, | 1091,64, | 1091,65, | 1091,66, | 1091,67, | 1091,68, | 1091,69, | 1091,70, | 1091,71, | 1091,72, | 1091,73, | 1091,74, | 1091,75, | 1091,76, | 1091,77, | 1091,78, | 1091,79, | 1091,80, | 1091,81, | 1091,82, | 1091,83, | 1091,84, | 1091,85, | 1092,1, | 1092,2, | 1092,3, | 1092,4, | 1092,5, | 1092,6, | 1092,7, | 1092,8, | 1092,9, | 1092,10, | 1092,11, | 1092,12, | 1092,13, | 1092,14, | 1092,15, | 1092,16, | 1092,17, | 1092,18, | 1092,19, | 1092,20, | 1092,21, | 1092,22, | 1092,23, | 1092,24, | 1092,25, | 1092,26, | 1092,27, | 1092,28, | 1092,29, | 1092,30, | 1092,31, | 1092,32, | 1092,33, | 1092,34, | 1092,35, | 1092,36, | 1092,37, | 1092,38, | 1092,39, | 1092,40, | 1092,41, | 1092,42, | 1092,43, | 1092,44, | 1092,45, | 1092,46, | 1092,47, | 1092,48, | 1092,49, | 1092,50, | 1092,51, | 1092,52, | 1092,53, | 1092,54, | 1092,55, | 1092,56, | 1092,57, | 1092,58, | 1092,59, | 1092,60, | 1092,61, | 1092,62, | 1092,63, | 1092,64, | 1092,65, | 1092,66, | 1092,67, | 1092,68, | 1092,69, | 1092,70, | 1092,71, | 1092,72, | 1092,73, | 1092,74, | 1092,75, | 1092,76, | 1092,77, | 1092,78, | 1092,79, | 1092,80, | 1092,81, | 1092,82, | 1092,83, | 1092,84, | 1092,85, | 1093,1, | 1093,2, | 1093,3, | 1093,4, | 1093,5, | 1093,6, | 1093,7, | 1093,8, | 1093,9, | 1093,10, | 1093,11, | 1093,12, | 1093,13, | 1093,14, | 1093,15, | 1093,16, | 1093,17, | 1093,18, | 1093,19, | 1093,20, | 1093,21, | 1093,22, | 1093,23, | 1093,24, | 1093,25, | 1093,26, | 1093,27, | 1093,28, | 1093,29, | 1093,30, | 1093,31, | 1093,32, | 1093,33, | 1093,34, | 1093,35, | 1093,36, | 1093,37, | 1093,38, | 1093,39, | 1093,40, | 1093,41, | 1093,42, | 1093,43, | 1093,44, | 1093,45, | 1093,46, | 1093,47, | 1093,48, | 1093,49, | 1093,50, | 1093,51, | 1093,52, | 1093,53, | 1093,54, | 1093,55, | 1093,56, | 1093,57, | 1093,58, | 1093,59, | 1093,60, | 1093,61, | 1093,62, | 1093,63, | 1093,64, | 1093,65, | 1093,66, | 1093,67, | 1093,68, | 1093,69, | 1093,70, | 1093,71, | 1093,72, | 1093,73, | 1093,74, | 1093,75, | 1093,76, | 1093,77, | 1093,78, | 1093,79, | 1093,80, | 1093,81, | 1093,82, | 1093,83, | 1093,84, | 1093,85, | 1094,1, | 1094,2, | 1094,3, | 1094,4, | 1094,5, | 1094,6, | 1094,7, | 1094,8, | 1094,9, | 1094,10, | 1094,11, | 1094,12, | 1094,13, | 1094,14, | 1094,15, | 1094,16, | 1094,17, | 1094,18, | 1094,19, | 1094,20, | 1094,21, | 1094,22, | 1094,23, | 1094,24, | 1094,25, | 1094,26, | 1094,27, | 1094,28, | 1094,29, | 1094,30, | 1094,31, | 1094,32, | 1094,33, | 1094,34, | 1094,35, | 1094,36, | 1094,37, | 1094,38, | 1094,39, | 1094,40, | 1094,41, | 1094,42, | 1094,43, | 1094,44, | 1094,45, | 1094,46, | 1094,47, | 1094,48, | 1094,49, | 1094,50, | 1094,51, | 1094,52, | 1094,53, | 1094,54, | 1094,55, | 1094,56, | 1094,57, | 1094,58, | 1094,59, | 1094,60, | 1094,61, | 1094,62, | 1094,63, | 1094,64, | 1094,65, | 1094,66, | 1094,67, | 1094,68, | 1094,69, | 1094,70, | 1094,71, | 1094,72, | 1094,73, | 1094,74, | 1094,75, | 1094,76, | 1094,77, | 1094,78, | 1094,79, | 1094,80, | 1094,81, | 1094,82, | 1094,83, | 1094,84, | 1094,85, | 1095,1, | 1095,2, | 1095,3, | 1095,4, | 1095,5, | 1095,6, | 1095,7, | 1095,8, | 1095,9, | 1095,10, | 1095,11, | 1095,12, | 1095,13, | 1095,14, | 1095,15, | 1095,16, | 1095,17, | 1095,18, | 1095,19, | 1095,20, | 1095,21, | 1095,22, | 1095,23, | 1095,24, | 1095,25, | 1095,26, | 1095,27, | 1095,28, | 1095,29, | 1095,30, | 1095,31, | 1095,32, | 1095,33, | 1095,34, | 1095,35, | 1095,36, | 1095,37, | 1095,38, | 1095,39, | 1095,40, | 1095,41, | 1095,42, | 1095,43, | 1095,44, | 1095,45, | 1095,46, | 1095,47, | 1095,48, | 1095,49, | 1095,50, | 1095,51, | 1095,52, | 1095,53, | 1095,54, | 1095,55, | 1095,56, | 1095,57, | 1095,58, | 1095,59, | 1095,60, | 1095,61, | 1095,62, | 1095,63, | 1095,64, | 1095,65, | 1095,66, | 1095,67, | 1095,68, | 1095,69, | 1095,70, | 1095,71, | 1095,72, | 1095,73, | 1095,74, | 1095,75, | 1095,76, | 1095,77, | 1095,78, | 1095,79, | 1095,80, | 1095,81, | 1095,82, | 1095,83, | 1095,84, | 1095,85, | 1096,1, | 1096,2, | 1096,3, | 1096,4, | 1096,5, | 1096,6, | 1096,7, | 1096,8, | 1096,9, | 1096,10, | 1096,11, | 1096,12, | 1096,13, | 1096,14, | 1096,15, | 1096,16, | 1096,17, | 1096,18, | 1096,19, | 1096,20, | 1096,21, | 1096,22, | 1096,23, | 1096,24, | 1096,25, | 1096,26, | 1096,27, | 1096,28, | 1096,29, | 1096,30, | 1096,31, | 1096,32, | 1096,33, | 1096,34, | 1096,35, | 1096,36, | 1096,37, | 1096,38, | 1096,39, | 1096,40, | 1096,41, | 1096,42, | 1096,43, | 1096,44, | 1096,45, | 1096,46, | 1096,47, | 1096,48, | 1096,49, | 1096,50, | 1096,51, | 1096,52, | 1096,53, | 1096,54, | 1096,55, | 1096,56, | 1096,57, | 1096,58, | 1096,59, | 1096,60, | 1096,61, | 1096,62, | 1096,63, | 1096,64, | 1096,65, | 1096,66, | 1096,67, | 1096,68, | 1096,69, | 1096,70, | 1096,71, | 1096,72, | 1096,73, | 1096,74, | 1096,75, | 1096,76, | 1096,77, | 1096,78, | 1096,79, | 1096,80, | 1096,81, | 1096,82, | 1096,83, | 1096,84, | 1096,85, | 1097,1, | 1097,2, | 1097,3, | 1097,4, | 1097,5, | 1097,6, | 1097,7, | 1097,8, | 1097,9, | 1097,10, | 1097,11, | 1097,12, | 1097,13, | 1097,14, | 1097,15, | 1097,16, | 1097,17, | 1097,18, | 1097,19, | 1097,20, | 1097,21, | 1097,22, | 1097,23, | 1097,24, | 1097,25, | 1097,26, | 1097,27, | 1097,28, | 1097,29, | 1097,30, | 1097,31, | 1097,32, | 1097,33, | 1097,34, | 1097,35, | 1097,36, | 1097,37, | 1097,38, | 1097,39, | 1097,40, | 1097,41, | 1097,42, | 1097,43, | 1097,44, | 1097,45, | 1097,46, | 1097,47, | 1097,48, | 1097,49, | 1097,50, | 1097,51, | 1097,52, | 1097,53, | 1097,54, | 1097,55, | 1097,56, | 1097,57, | 1097,58, | 1097,59, | 1097,60, | 1097,61, | 1097,62, | 1097,63, | 1097,64, | 1097,65, | 1097,66, | 1097,67, | 1097,68, | 1097,69, | 1097,70, | 1097,71, | 1097,72, | 1097,73, | 1097,74, | 1097,75, | 1097,76, | 1097,77, | 1097,78, | 1097,79, | 1097,80, | 1097,81, | 1097,82, | 1097,83, | 1097,84, | 1097,85, | 1098,1, | 1098,2, | 1098,3, | 1098,4, | 1098,5, | 1098,6, | 1098,7, | 1098,8, | 1098,9, | 1098,10, | 1098,11, | 1098,12, | 1098,13, | 1098,14, | 1098,15, | 1098,16, | 1098,17, | 1098,18, | 1098,19, | 1098,20, | 1098,21, | 1098,22, | 1098,23, | 1098,24, | 1098,25, | 1098,26, | 1098,27, | 1098,28, | 1098,29, | 1098,30, | 1098,31, | 1098,32, | 1098,33, | 1098,34, | 1098,35, | 1098,36, | 1098,37, | 1098,38, | 1098,39, | 1098,40, | 1098,41, | 1098,42, | 1098,43, | 1098,44, | 1098,45, | 1098,46, | 1098,47, | 1098,48, | 1098,49, | 1098,50, | 1098,51, | 1098,52, | 1098,53, | 1098,54, | 1098,55, | 1098,56, | 1098,57, | 1098,58, | 1098,59, | 1098,60, | 1098,61, | 1098,62, | 1098,63, | 1098,64, | 1098,65, | 1098,66, | 1098,67, | 1098,68, | 1098,69, | 1098,70, | 1098,71, | 1098,72, | 1098,73, | 1098,74, | 1098,75, | 1098,76, | 1098,77, | 1098,78, | 1098,79, | 1098,80, | 1098,81, | 1098,82, | 1098,83, | 1098,84, | 1098,85, | 1099,1, | 1099,2, | 1099,3, | 1099,4, | 1099,5, | 1099,6, | 1099,7, | 1099,8, | 1099,9, | 1099,10, | 1099,11, | 1099,12, | 1099,13, | 1099,14, | 1099,15, | 1099,16, | 1099,17, | 1099,18, | 1099,19, | 1099,20, | 1099,21, | 1099,22, | 1099,23, | 1099,24, | 1099,25, | 1099,26, | 1099,27, | 1099,28, | 1099,29, | 1099,30, | 1099,31, | 1099,32, | 1099,33, | 1099,34, | 1099,35, | 1099,36, | 1099,37, | 1099,38, | 1099,39, | 1099,40, | 1099,41, | 1099,42, | 1099,43, | 1099,44, | 1099,45, | 1099,46, | 1099,47, | 1099,48, | 1099,49, | 1099,50, | 1099,51, | 1099,52, | 1099,53, | 1099,54, | 1099,55, | 1099,56, | 1099,57, | 1099,58, | 1099,59, | 1099,60, | 1099,61, | 1099,62, | 1099,63, | 1099,64, | 1099,65, | 1099,66, | 1099,67, | 1099,68, | 1099,69, | 1099,70, | 1099,71, | 1099,72, | 1099,73, | 1099,74, | 1099,75, | 1099,76, | 1099,77, | 1099,78, | 1099,79, | 1099,80, | 1099,81, | 1099,82, | 1099,83, | 1099,84, | 1099,85, | 1100,1, | 1100,2, | 1100,3, | 1100,4, | 1100,5, | 1100,6, | 1100,7, | 1100,8, | 1100,9, | 1100,10, | 1100,11, | 1100,12, | 1100,13, | 1100,14, | 1100,15, | 1100,16, | 1100,17, | 1100,18, | 1100,19, | 1100,20, | 1100,21, | 1100,22, | 1100,23, | 1100,24, | 1100,25, | 1100,26, | 1100,27, | 1100,28, | 1100,29, | 1100,30, | 1100,31, | 1100,32, | 1100,33, | 1100,34, | 1100,35, | 1100,36, | 1100,37, | 1100,38, | 1100,39, | 1100,40, | 1100,41, | 1100,42, | 1100,43, | 1100,44, | 1100,45, | 1100,46, | 1100,47, | 1100,48, | 1100,49, | 1100,50, | 1100,51, | 1100,52, | 1100,53, | 1100,54, | 1100,55, | 1100,56, | 1100,57, | 1100,58, | 1100,59, | 1100,60, | 1100,61, | 1100,62, | 1100,63, | 1100,64, | 1100,65, | 1100,66, | 1100,67, | 1100,68, | 1100,69, | 1100,70, | 1100,71, | 1100,72, | 1100,73, | 1100,74, | 1100,75, | 1100,76, | 1100,77, | 1100,78, | 1100,79, | 1100,80, | 1100,81, | 1100,82, | 1100,83, | 1100,84, | 1100,85, | 1101,1, | 1101,2, | 1101,3, | 1101,4, | 1101,5, | 1101,6, | 1101,7, | 1101,8, | 1101,9, | 1101,10, | 1101,11, | 1101,12, | 1101,13, | 1101,14, | 1101,15, | 1101,16, | 1101,17, | 1101,18, | 1101,19, | 1101,20, | 1101,21, | 1101,22, | 1101,23, | 1101,24, | 1101,25, | 1101,26, | 1101,27, | 1101,28, | 1101,29, | 1101,30, | 1101,31, | 1101,32, | 1101,33, | 1101,34, | 1101,35, | 1101,36, | 1101,37, | 1101,38, | 1101,39, | 1101,40, | 1101,41, | 1101,42, | 1101,43, | 1101,44, | 1101,45, | 1101,46, | 1101,47, | 1101,48, | 1101,49, | 1101,50, | 1101,51, | 1101,52, | 1101,53, | 1101,54, | 1101,55, | 1101,56, | 1101,57, | 1101,58, | 1101,59, | 1101,60, | 1101,61, | 1101,62, | 1101,63, | 1101,64, | 1101,65, | 1101,66, | 1101,67, | 1101,68, | 1101,69, | 1101,70, | 1101,71, | 1101,72, | 1101,73, | 1101,74, | 1101,75, | 1101,76, | 1101,77, | 1101,78, | 1101,79, | 1101,80, | 1101,81, | 1101,82, | 1101,83, | 1101,84, | 1101,85, | 1102,1, | 1102,2, | 1102,3, | 1102,4, | 1102,5, | 1102,6, | 1102,7, | 1102,8, | 1102,9, | 1102,10, | 1102,11, | 1102,12, | 1102,13, | 1102,14, | 1102,15, | 1102,16, | 1102,17, | 1102,18, | 1102,19, | 1102,20, | 1102,21, | 1102,22, | 1102,23, | 1102,24, | 1102,25, | 1102,26, | 1102,27, | 1102,28, | 1102,29, | 1102,30, | 1102,31, | 1102,32, | 1102,33, | 1102,34, | 1102,35, | 1102,36, | 1102,37, | 1102,38, | 1102,39, | 1102,40, | 1102,41, | 1102,42, | 1102,43, | 1102,44, | 1102,45, | 1102,46, | 1102,47, | 1102,48, | 1102,49, | 1102,50, | 1102,51, | 1102,52, | 1102,53, | 1102,54, | 1102,55, | 1102,56, | 1102,57, | 1102,58, | 1102,59, | 1102,60, | 1102,61, | 1102,62, | 1102,63, | 1102,64, | 1102,65, | 1102,66, | 1102,67, | 1102,68, | 1102,69, | 1102,70, | 1102,71, | 1102,72, | 1102,73, | 1102,74, | 1102,75, | 1102,76, | 1102,77, | 1102,78, | 1102,79, | 1102,80, | 1102,81, | 1102,82, | 1102,83, | 1102,84, | 1102,85, | 1103,1, | 1103,2, | 1103,3, | 1103,4, | 1103,5, | 1103,6, | 1103,7, | 1103,8, | 1103,9, | 1103,10, | 1103,11, | 1103,12, | 1103,13, | 1103,14, | 1103,15, | 1103,16, | 1103,17, | 1103,18, | 1103,19, | 1103,20, | 1103,21, | 1103,22, | 1103,23, | 1103,24, | 1103,25, | 1103,26, | 1103,27, | 1103,28, | 1103,29, | 1103,30, | 1103,31, | 1103,32, | 1103,33, | 1103,34, | 1103,35, | 1103,36, | 1103,37, | 1103,38, | 1103,39, | 1103,40, | 1103,41, | 1103,42, | 1103,43, | 1103,44, | 1103,45, | 1103,46, | 1103,47, | 1103,48, | 1103,49, | 1103,50, | 1103,51, | 1103,52, | 1103,53, | 1103,54, | 1103,55, | 1103,56, | 1103,57, | 1103,58, | 1103,59, | 1103,60, | 1103,61, | 1103,62, | 1103,63, | 1103,64, | 1103,65, | 1103,66, | 1103,67, | 1103,68, | 1103,69, | 1103,70, | 1103,71, | 1103,72, | 1103,73, | 1103,74, | 1103,75, | 1103,76, | 1103,77, | 1103,78, | 1103,79, | 1103,80, | 1103,81, | 1103,82, | 1103,83, | 1103,84, | 1103,85, | 1104,1, | 1104,2, | 1104,3, | 1104,4, | 1104,5, | 1104,6, | 1104,7, | 1104,8, | 1104,9, | 1104,10, | 1104,11, | 1104,12, | 1104,13, | 1104,14, | 1104,15, | 1104,16, | 1104,17, | 1104,18, | 1104,19, | 1104,20, | 1104,21, | 1104,22, | 1104,23, | 1104,24, | 1104,25, | 1104,26, | 1104,27, | 1104,28, | 1104,29, | 1104,30, | 1104,31, | 1104,32, | 1104,33, | 1104,34, | 1104,35, | 1104,36, | 1104,37, | 1104,38, | 1104,39, | 1104,40, | 1104,41, | 1104,42, | 1104,43, | 1104,44, | 1104,45, | 1104,46, | 1104,47, | 1104,48, | 1104,49, | 1104,50, | 1104,51, | 1104,52, | 1104,53, | 1104,54, | 1104,55, | 1104,56, | 1104,57, | 1104,58, | 1104,59, | 1104,60, | 1104,61, | 1104,62, | 1104,63, | 1104,64, | 1104,65, | 1104,66, | 1104,67, | 1104,68, | 1104,69, | 1104,70, | 1104,71, | 1104,72, | 1104,73, | 1104,74, | 1104,75, | 1104,76, | 1104,77, | 1104,78, | 1104,79, | 1104,80, | 1104,81, | 1104,82, | 1104,83, | 1104,84, | 1104,85, | 1105,1, | 1105,2, | 1105,3, | 1105,4, | 1105,5, | 1105,6, | 1105,7, | 1105,8, | 1105,9, | 1105,10, | 1105,11, | 1105,12, | 1105,13, | 1105,14, | 1105,15, | 1105,16, | 1105,17, | 1105,18, | 1105,19, | 1105,20, | 1105,21, | 1105,22, | 1105,23, | 1105,24, | 1105,25, | 1105,26, | 1105,27, | 1105,28, | 1105,29, | 1105,30, | 1105,31, | 1105,32, | 1105,33, | 1105,34, | 1105,35, | 1105,36, | 1105,37, | 1105,38, | 1105,39, | 1105,40, | 1105,41, | 1105,42, | 1105,43, | 1105,44, | 1105,45, | 1105,46, | 1105,47, | 1105,48, | 1105,49, | 1105,50, | 1105,51, | 1105,52, | 1105,53, | 1105,54, | 1105,55, | 1105,56, | 1105,57, | 1105,58, | 1105,59, | 1105,60, | 1105,61, | 1105,62, | 1105,63, | 1105,64, | 1105,65, | 1105,66, | 1105,67, | 1105,68, | 1105,69, | 1105,70, | 1105,71, | 1105,72, | 1105,73, | 1105,74, | 1105,75, | 1105,76, | 1105,77, | 1105,78, | 1105,79, | 1105,80, | 1105,81, | 1105,82, | 1105,83, | 1105,84, | 1105,85, | 1106,1, | 1106,2, | 1106,3, | 1106,4, | 1106,5, | 1106,6, | 1106,7, | 1106,8, | 1106,9, | 1106,10, | 1106,11, | 1106,12, | 1106,13, | 1106,14, | 1106,15, | 1106,16, | 1106,17, | 1106,18, | 1106,19, | 1106,20, | 1106,21, | 1106,22, | 1106,23, | 1106,24, | 1106,25, | 1106,26, | 1106,27, | 1106,28, | 1106,29, | 1106,30, | 1106,31, | 1106,32, | 1106,33, | 1106,34, | 1106,35, | 1106,36, | 1106,37, | 1106,38, | 1106,39, | 1106,40, | 1106,41, | 1106,42, | 1106,43, | 1106,44, | 1106,45, | 1106,46, | 1106,47, | 1106,48, | 1106,49, | 1106,50, | 1106,51, | 1106,52, | 1106,53, | 1106,54, | 1106,55, | 1106,56, | 1106,57, | 1106,58, | 1106,59, | 1106,60, | 1106,61, | 1106,62, | 1106,63, | 1106,64, | 1106,65, | 1106,66, | 1106,67, | 1106,68, | 1106,69, | 1106,70, | 1106,71, | 1106,72, | 1106,73, | 1106,74, | 1106,75, | 1106,76, | 1106,77, | 1106,78, | 1106,79, | 1106,80, | 1106,81, | 1106,82, | 1106,83, | 1106,84, | 1106,85, | 1107,1, | 1107,2, | 1107,3, | 1107,4, | 1107,5, | 1107,6, | 1107,7, | 1107,8, | 1107,9, | 1107,10, | 1107,11, | 1107,12, | 1107,13, | 1107,14, | 1107,15, | 1107,16, | 1107,17, | 1107,18, | 1107,19, | 1107,20, | 1107,21, | 1107,22, | 1107,23, | 1107,24, | 1107,25, | 1107,26, | 1107,27, | 1107,28, | 1107,29, | 1107,30, | 1107,31, | 1107,32, | 1107,33, | 1107,34, | 1107,35, | 1107,36, | 1107,37, | 1107,38, | 1107,39, | 1107,40, | 1107,41, | 1107,42, | 1107,43, | 1107,44, | 1107,45, | 1107,46, | 1107,47, | 1107,48, | 1107,49, | 1107,50, | 1107,51, | 1107,52, | 1107,53, | 1107,54, | 1107,55, | 1107,56, | 1107,57, | 1107,58, | 1107,59, | 1107,60, | 1107,61, | 1107,62, | 1107,63, | 1107,64, | 1107,65, | 1107,66, | 1107,67, | 1107,68, | 1107,69, | 1107,70, | 1107,71, | 1107,72, | 1107,73, | 1107,74, | 1107,75, | 1107,76, | 1107,77, | 1107,78, | 1107,79, | 1107,80, | 1107,81, | 1107,82, | 1107,83, | 1107,84, | 1107,85, | 1108,1, | 1108,2, | 1108,3, | 1108,4, | 1108,5, | 1108,6, | 1108,7, | 1108,8, | 1108,9, | 1108,10, | 1108,11, | 1108,12, | 1108,13, | 1108,14, | 1108,15, | 1108,16, | 1108,17, | 1108,18, | 1108,19, | 1108,20, | 1108,21, | 1108,22, | 1108,23, | 1108,24, | 1108,25, | 1108,26, | 1108,27, | 1108,28, | 1108,29, | 1108,30, | 1108,31, | 1108,32, | 1108,33, | 1108,34, | 1108,35, | 1108,36, | 1108,37, | 1108,38, | 1108,39, | 1108,40, | 1108,41, | 1108,42, | 1108,43, | 1108,44, | 1108,45, | 1108,46, | 1108,47, | 1108,48, | 1108,49, | 1108,50, | 1108,51, | 1108,52, | 1108,53, | 1108,54, | 1108,55, | 1108,56, | 1108,57, | 1108,58, | 1108,59, | 1108,60, | 1108,61, | 1108,62, | 1108,63, | 1108,64, | 1108,65, | 1108,66, | 1108,67, | 1108,68, | 1108,69, | 1108,70, | 1108,71, | 1108,72, | 1108,73, | 1108,74, | 1108,75, | 1108,76, | 1108,77, | 1108,78, | 1108,79, | 1108,80, | 1108,81, | 1108,82, | 1108,83, | 1108,84, | 1108,85, | 1109,1, | 1109,2, | 1109,3, | 1109,4, | 1109,5, | 1109,6, | 1109,7, | 1109,8, | 1109,9, | 1109,10, | 1109,11, | 1109,12, | 1109,13, | 1109,14, | 1109,15, | 1109,16, | 1109,17, | 1109,18, | 1109,19, | 1109,20, | 1109,21, | 1109,22, | 1109,23, | 1109,24, | 1109,25, | 1109,26, | 1109,27, | 1109,28, | 1109,29, | 1109,30, | 1109,31, | 1109,32, | 1109,33, | 1109,34, | 1109,35, | 1109,36, | 1109,37, | 1109,38, | 1109,39, | 1109,40, | 1109,41, | 1109,42, | 1109,43, | 1109,44, | 1109,45, | 1109,46, | 1109,47, | 1109,48, | 1109,49, | 1109,50, | 1109,51, | 1109,52, | 1109,53, | 1109,54, | 1109,55, | 1109,56, | 1109,57, | 1109,58, | 1109,59, | 1109,60, | 1109,61, | 1109,62, | 1109,63, | 1109,64, | 1109,65, | 1109,66, | 1109,67, | 1109,68, | 1109,69, | 1109,70, | 1109,71, | 1109,72, | 1109,73, | 1109,74, | 1109,75, | 1109,76, | 1109,77, | 1109,78, | 1109,79, | 1109,80, | 1109,81, | 1109,82, | 1109,83, | 1109,84, | 1109,85, | 1110,1, | 1110,2, | 1110,3, | 1110,4, | 1110,5, | 1110,6, | 1110,7, | 1110,8, | 1110,9, | 1110,10, | 1110,11, | 1110,12, | 1110,13, | 1110,14, | 1110,15, | 1110,16, | 1110,17, | 1110,18, | 1110,19, | 1110,20, | 1110,21, | 1110,22, | 1110,23, | 1110,24, | 1110,25, | 1110,26, | 1110,27, | 1110,28, | 1110,29, | 1110,30, | 1110,31, | 1110,32, | 1110,33, | 1110,34, | 1110,35, | 1110,36, | 1110,37, | 1110,38, | 1110,39, | 1110,40, | 1110,41, | 1110,42, | 1110,43, | 1110,44, | 1110,45, | 1110,46, | 1110,47, | 1110,48, | 1110,49, | 1110,50, | 1110,51, | 1110,52, | 1110,53, | 1110,54, | 1110,55, | 1110,56, | 1110,57, | 1110,58, | 1110,59, | 1110,60, | 1110,61, | 1110,62, | 1110,63, | 1110,64, | 1110,65, | 1110,66, | 1110,67, | 1110,68, | 1110,69, | 1110,70, | 1110,71, | 1110,72, | 1110,73, | 1110,74, | 1110,75, | 1110,76, | 1110,77, | 1110,78, | 1110,79, | 1110,80, | 1110,81, | 1110,82, | 1110,83, | 1110,84, | 1110,85, | 1111,1, | 1111,2, | 1111,3, | 1111,4, | 1111,5, | 1111,6, | 1111,7, | 1111,8, | 1111,9, | 1111,10, | 1111,11, | 1111,12, | 1111,13, | 1111,14, | 1111,15, | 1111,16, | 1111,17, | 1111,18, | 1111,19, | 1111,20, | 1111,21, | 1111,22, | 1111,23, | 1111,24, | 1111,25, | 1111,26, | 1111,27, | 1111,28, | 1111,29, | 1111,30, | 1111,31, | 1111,32, | 1111,33, | 1111,34, | 1111,35, | 1111,36, | 1111,37, | 1111,38, | 1111,39, | 1111,40, | 1111,41, | 1111,42, | 1111,43, | 1111,44, | 1111,45, | 1111,46, | 1111,47, | 1111,48, | 1111,49, | 1111,50, | 1111,51, | 1111,52, | 1111,53, | 1111,54, | 1111,55, | 1111,56, | 1111,57, | 1111,58, | 1111,59, | 1111,60, | 1111,61, | 1111,62, | 1111,63, | 1111,64, | 1111,65, | 1111,66, | 1111,67, | 1111,68, | 1111,69, | 1111,70, | 1111,71, | 1111,72, | 1111,73, | 1111,74, | 1111,75, | 1111,76, | 1111,77, | 1111,78, | 1111,79, | 1111,80, | 1111,81, | 1111,82, | 1111,83, | 1111,84, | 1111,85, | 1112,1, | 1112,2, | 1112,3, | 1112,4, | 1112,5, | 1112,6, | 1112,7, | 1112,8, | 1112,9, | 1112,10, | 1112,11, | 1112,12, | 1112,13, | 1112,14, | 1112,15, | 1112,16, | 1112,17, | 1112,18, | 1112,19, | 1112,20, | 1112,21, | 1112,22, | 1112,23, | 1112,24, | 1112,25, | 1112,26, | 1112,27, | 1112,28, | 1112,29, | 1112,30, | 1112,31, | 1112,32, | 1112,33, | 1112,34, | 1112,35, | 1112,36, | 1112,37, | 1112,38, | 1112,39, | 1112,40, | 1112,41, | 1112,42, | 1112,43, | 1112,44, | 1112,45, | 1112,46, | 1112,47, | 1112,48, | 1112,49, | 1112,50, | 1112,51, | 1112,52, | 1112,53, | 1112,54, | 1112,55, | 1112,56, | 1112,57, | 1112,58, | 1112,59, | 1112,60, | 1112,61, | 1112,62, | 1112,63, | 1112,64, | 1112,65, | 1112,66, | 1112,67, | 1112,68, | 1112,69, | 1112,70, | 1112,71, | 1112,72, | 1112,73, | 1112,74, | 1112,75, | 1112,76, | 1112,77, | 1112,78, | 1112,79, | 1112,80, | 1112,81, | 1112,82, | 1112,83, | 1112,84, | 1112,85, | 1113,1, | 1113,2, | 1113,3, | 1113,4, | 1113,5, | 1113,6, | 1113,7, | 1113,8, | 1113,9, | 1113,10, | 1113,11, | 1113,12, | 1113,13, | 1113,14, | 1113,15, | 1113,16, | 1113,17, | 1113,18, | 1113,19, | 1113,20, | 1113,21, | 1113,22, | 1113,23, | 1113,24, | 1113,25, | 1113,26, | 1113,27, | 1113,28, | 1113,29, | 1113,30, | 1113,31, | 1113,32, | 1113,33, | 1113,34, | 1113,35, | 1113,36, | 1113,37, | 1113,38, | 1113,39, | 1113,40, | 1113,41, | 1113,42, | 1113,43, | 1113,44, | 1113,45, | 1113,46, | 1113,47, | 1113,48, | 1113,49, | 1113,50, | 1113,51, | 1113,52, | 1113,53, | 1113,54, | 1113,55, | 1113,56, | 1113,57, | 1113,58, | 1113,59, | 1113,60, | 1113,61, | 1113,62, | 1113,63, | 1113,64, | 1113,65, | 1113,66, | 1113,67, | 1113,68, | 1113,69, | 1113,70, | 1113,71, | 1113,72, | 1113,73, | 1113,74, | 1113,75, | 1113,76, | 1113,77, | 1113,78, | 1113,79, | 1113,80, | 1113,81, | 1113,82, | 1113,83, | 1113,84, | 1113,85, | 1114,1, | 1114,2, | 1114,3, | 1114,4, | 1114,5, | 1114,6, | 1114,7, | 1114,8, | 1114,9, | 1114,10, | 1114,11, | 1114,12, | 1114,13, | 1114,14, | 1114,15, | 1114,16, | 1114,17, | 1114,18, | 1114,19, | 1114,20, | 1114,21, | 1114,22, | 1114,23, | 1114,24, | 1114,25, | 1114,26, | 1114,27, | 1114,28, | 1114,29, | 1114,30, | 1114,31, | 1114,32, | 1114,33, | 1114,34, | 1114,35, | 1114,36, | 1114,37, | 1114,38, | 1114,39, | 1114,40, | 1114,41, | 1114,42, | 1114,43, | 1114,44, | 1114,45, | 1114,46, | 1114,47, | 1114,48, | 1114,49, | 1114,50, | 1114,51, | 1114,52, | 1114,53, | 1114,54, | 1114,55, | 1114,56, | 1114,57, | 1114,58, | 1114,59, | 1114,60, | 1114,61, | 1114,62, | 1114,63, | 1114,64, | 1114,65, | 1114,66, | 1114,67, | 1114,68, | 1114,69, | 1114,70, | 1114,71, | 1114,72, | 1114,73, | 1114,74, | 1114,75, | 1114,76, | 1114,77, | 1114,78, | 1114,79, | 1114,80, | 1114,81, | 1114,82, | 1114,83, | 1114,84, | 1114,85, | 1115,1, | 1115,2, | 1115,3, | 1115,4, | 1115,5, | 1115,6, | 1115,7, | 1115,8, | 1115,9, | 1115,10, | 1115,11, | 1115,12, | 1115,13, | 1115,14, | 1115,15, | 1115,16, | 1115,17, | 1115,18, | 1115,19, | 1115,20, | 1115,21, | 1115,22, | 1115,23, | 1115,24, | 1115,25, | 1115,26, | 1115,27, | 1115,28, | 1115,29, | 1115,30, | 1115,31, | 1115,32, | 1115,33, | 1115,34, | 1115,35, | 1115,36, | 1115,37, | 1115,38, | 1115,39, | 1115,40, | 1115,41, | 1115,42, | 1115,43, | 1115,44, | 1115,45, | 1115,46, | 1115,47, | 1115,48, | 1115,49, | 1115,50, | 1115,51, | 1115,52, | 1115,53, | 1115,54, | 1115,55, | 1115,56, | 1115,57, | 1115,58, | 1115,59, | 1115,60, | 1115,61, | 1115,62, | 1115,63, | 1115,64, | 1115,65, | 1115,66, | 1115,67, | 1115,68, | 1115,69, | 1115,70, | 1115,71, | 1115,72, | 1115,73, | 1115,74, | 1115,75, | 1115,76, | 1115,77, | 1115,78, | 1115,79, | 1115,80, | 1115,81, | 1115,82, | 1115,83, | 1115,84, | 1115,85, | 1116,1, | 1116,2, | 1116,3, | 1116,4, | 1116,5, | 1116,6, | 1116,7, | 1116,8, | 1116,9, | 1116,10, | 1116,11, | 1116,12, | 1116,13, | 1116,14, | 1116,15, | 1116,16, | 1116,17, | 1116,18, | 1116,19, | 1116,20, | 1116,21, | 1116,22, | 1116,23, | 1116,24, | 1116,25, | 1116,26, | 1116,27, | 1116,28, | 1116,29, | 1116,30, | 1116,31, | 1116,32, | 1116,33, | 1116,34, | 1116,35, | 1116,36, | 1116,37, | 1116,38, | 1116,39, | 1116,40, | 1116,41, | 1116,42, | 1116,43, | 1116,44, | 1116,45, | 1116,46, | 1116,47, | 1116,48, | 1116,49, | 1116,50, | 1116,51, | 1116,52, | 1116,53, | 1116,54, | 1116,55, | 1116,56, | 1116,57, | 1116,58, | 1116,59, | 1116,60, | 1116,61, | 1116,62, | 1116,63, | 1116,64, | 1116,65, | 1116,66, | 1116,67, | 1116,68, | 1116,69, | 1116,70, | 1116,71, | 1116,72, | 1116,73, | 1116,74, | 1116,75, | 1116,76, | 1116,77, | 1116,78, | 1116,79, | 1116,80, | 1116,81, | 1116,82, | 1116,83, | 1116,84, | 1116,85, | 1117,1, | 1117,2, | 1117,3, | 1117,4, | 1117,5, | 1117,6, | 1117,7, | 1117,8, | 1117,9, | 1117,10, | 1117,11, | 1117,12, | 1117,13, | 1117,14, | 1117,15, | 1117,16, | 1117,17, | 1117,18, | 1117,19, | 1117,20, | 1117,21, | 1117,22, | 1117,23, | 1117,24, | 1117,25, | 1117,26, | 1117,27, | 1117,28, | 1117,29, | 1117,30, | 1117,31, | 1117,32, | 1117,33, | 1117,34, | 1117,35, | 1117,36, | 1117,37, | 1117,38, | 1117,39, | 1117,40, | 1117,41, | 1117,42, | 1117,43, | 1117,44, | 1117,45, | 1117,46, | 1117,47, | 1117,48, | 1117,49, | 1117,50, | 1117,51, | 1117,52, | 1117,53, | 1117,54, | 1117,55, | 1117,56, | 1117,57, | 1117,58, | 1117,59, | 1117,60, | 1117,61, | 1117,62, | 1117,63, | 1117,64, | 1117,65, | 1117,66, | 1117,67, | 1117,68, | 1117,69, | 1117,70, | 1117,71, | 1117,72, | 1117,73, | 1117,74, | 1117,75, | 1117,76, | 1117,77, | 1117,78, | 1117,79, | 1117,80, | 1117,81, | 1117,82, | 1117,83, | 1117,84, | 1117,85, | 1118,1, | 1118,2, | 1118,3, | 1118,4, | 1118,5, | 1118,6, | 1118,7, | 1118,8, | 1118,9, | 1118,10, | 1118,11, | 1118,12, | 1118,13, | 1118,14, | 1118,15, | 1118,16, | 1118,17, | 1118,18, | 1118,19, | 1118,20, | 1118,21, | 1118,22, | 1118,23, | 1118,24, | 1118,25, | 1118,26, | 1118,27, | 1118,28, | 1118,29, | 1118,30, | 1118,31, | 1118,32, | 1118,33, | 1118,34, | 1118,35, | 1118,36, | 1118,37, | 1118,38, | 1118,39, | 1118,40, | 1118,41, | 1118,42, | 1118,43, | 1118,44, | 1118,45, | 1118,46, | 1118,47, | 1118,48, | 1118,49, | 1118,50, | 1118,51, | 1118,52, | 1118,53, | 1118,54, | 1118,55, | 1118,56, | 1118,57, | 1118,58, | 1118,59, | 1118,60, | 1118,61, | 1118,62, | 1118,63, | 1118,64, | 1118,65, | 1118,66, | 1118,67, | 1118,68, | 1118,69, | 1118,70, | 1118,71, | 1118,72, | 1118,73, | 1118,74, | 1118,75, | 1118,76, | 1118,77, | 1118,78, | 1118,79, | 1118,80, | 1118,81, | 1118,82, | 1118,83, | 1118,84, | 1118,85, | 1119,1, | 1119,2, | 1119,3, | 1119,4, | 1119,5, | 1119,6, | 1119,7, | 1119,8, | 1119,9, | 1119,10, | 1119,11, | 1119,12, | 1119,13, | 1119,14, | 1119,15, | 1119,16, | 1119,17, | 1119,18, | 1119,19, | 1119,20, | 1119,21, | 1119,22, | 1119,23, | 1119,24, | 1119,25, | 1119,26, | 1119,27, | 1119,28, | 1119,29, | 1119,30, | 1119,31, | 1119,32, | 1119,33, | 1119,34, | 1119,35, | 1119,36, | 1119,37, | 1119,38, | 1119,39, | 1119,40, | 1119,41, | 1119,42, | 1119,43, | 1119,44, | 1119,45, | 1119,46, | 1119,47, | 1119,48, | 1119,49, | 1119,50, | 1119,51, | 1119,52, | 1119,53, | 1119,54, | 1119,55, | 1119,56, | 1119,57, | 1119,58, | 1119,59, | 1119,60, | 1119,61, | 1119,62, | 1119,63, | 1119,64, | 1119,65, | 1119,66, | 1119,67, | 1119,68, | 1119,69, | 1119,70, | 1119,71, | 1119,72, | 1119,73, | 1119,74, | 1119,75, | 1119,76, | 1119,77, | 1119,78, | 1119,79, | 1119,80, | 1119,81, | 1119,82, | 1119,83, | 1119,84, | 1119,85, | 1120,1, | 1120,2, | 1120,3, | 1120,4, | 1120,5, | 1120,6, | 1120,7, | 1120,8, | 1120,9, | 1120,10, | 1120,11, | 1120,12, | 1120,13, | 1120,14, | 1120,15, | 1120,16, | 1120,17, | 1120,18, | 1120,19, | 1120,20, | 1120,21, | 1120,22, | 1120,23, | 1120,24, | 1120,25, | 1120,26, | 1120,27, | 1120,28, | 1120,29, | 1120,30, | 1120,31, | 1120,32, | 1120,33, | 1120,34, | 1120,35, | 1120,36, | 1120,37, | 1120,38, | 1120,39, | 1120,40, | 1120,41, | 1120,42, | 1120,43, | 1120,44, | 1120,45, | 1120,46, | 1120,47, | 1120,48, | 1120,49, | 1120,50, | 1120,51, | 1120,52, | 1120,53, | 1120,54, | 1120,55, | 1120,56, | 1120,57, | 1120,58, | 1120,59, | 1120,60, | 1120,61, | 1120,62, | 1120,63, | 1120,64, | 1120,65, | 1120,66, | 1120,67, | 1120,68, | 1120,69, | 1120,70, | 1120,71, | 1120,72, | 1120,73, | 1120,74, | 1120,75, | 1120,76, | 1120,77, | 1120,78, | 1120,79, | 1120,80, | 1120,81, | 1120,82, | 1120,83, | 1120,84, | 1120,85, | 1121,1, | 1121,2, | 1121,3, | 1121,4, | 1121,5, | 1121,6, | 1121,7, | 1121,8, | 1121,9, | 1121,10, | 1121,11, | 1121,12, | 1121,13, | 1121,14, | 1121,15, | 1121,16, | 1121,17, | 1121,18, | 1121,19, | 1121,20, | 1121,21, | 1121,22, | 1121,23, | 1121,24, | 1121,25, | 1121,26, | 1121,27, | 1121,28, | 1121,29, | 1121,30, | 1121,31, | 1121,32, | 1121,33, | 1121,34, | 1121,35, | 1121,36, | 1121,37, | 1121,38, | 1121,39, | 1121,40, | 1121,41, | 1121,42, | 1121,43, | 1121,44, | 1121,45, | 1121,46, | 1121,47, | 1121,48, | 1121,49, | 1121,50, | 1121,51, | 1121,52, | 1121,53, | 1121,54, | 1121,55, | 1121,56, | 1121,57, | 1121,58, | 1121,59, | 1121,60, | 1121,61, | 1121,62, | 1121,63, | 1121,64, | 1121,65, | 1121,66, | 1121,67, | 1121,68, | 1121,69, | 1121,70, | 1121,71, | 1121,72, | 1121,73, | 1121,74, | 1121,75, | 1121,76, | 1121,77, | 1121,78, | 1121,79, | 1121,80, | 1121,81, | 1121,82, | 1121,83, | 1121,84, | 1121,85, | 1122,1, | 1122,2, | 1122,3, | 1122,4, | 1122,5, | 1122,6, | 1122,7, | 1122,8, | 1122,9, | 1122,10, | 1122,11, | 1122,12, | 1122,13, | 1122,14, | 1122,15, | 1122,16, | 1122,17, | 1122,18, | 1122,19, | 1122,20, | 1122,21, | 1122,22, | 1122,23, | 1122,24, | 1122,25, | 1122,26, | 1122,27, | 1122,28, | 1122,29, | 1122,30, | 1122,31, | 1122,32, | 1122,33, | 1122,34, | 1122,35, | 1122,36, | 1122,37, | 1122,38, | 1122,39, | 1122,40, | 1122,41, | 1122,42, | 1122,43, | 1122,44, | 1122,45, | 1122,46, | 1122,47, | 1122,48, | 1122,49, | 1122,50, | 1122,51, | 1122,52, | 1122,53, | 1122,54, | 1122,55, | 1122,56, | 1122,57, | 1122,58, | 1122,59, | 1122,60, | 1122,61, | 1122,62, | 1122,63, | 1122,64, | 1122,65, | 1122,66, | 1122,67, | 1122,68, | 1122,69, | 1122,70, | 1122,71, | 1122,72, | 1122,73, | 1122,74, | 1122,75, | 1122,76, | 1122,77, | 1122,78, | 1122,79, | 1122,80, | 1122,81, | 1122,82, | 1122,83, | 1122,84, | 1122,85, | 1123,1, | 1123,2, | 1123,3, | 1123,4, | 1123,5, | 1123,6, | 1123,7, | 1123,8, | 1123,9, | 1123,10, | 1123,11, | 1123,12, | 1123,13, | 1123,14, | 1123,15, | 1123,16, | 1123,17, | 1123,18, | 1123,19, | 1123,20, | 1123,21, | 1123,22, | 1123,23, | 1123,24, | 1123,25, | 1123,26, | 1123,27, | 1123,28, | 1123,29, | 1123,30, | 1123,31, | 1123,32, | 1123,33, | 1123,34, | 1123,35, | 1123,36, | 1123,37, | 1123,38, | 1123,39, | 1123,40, | 1123,41, | 1123,42, | 1123,43, | 1123,44, | 1123,45, | 1123,46, | 1123,47, | 1123,48, | 1123,49, | 1123,50, | 1123,51, | 1123,52, | 1123,53, | 1123,54, | 1123,55, | 1123,56, | 1123,57, | 1123,58, | 1123,59, | 1123,60, | 1123,61, | 1123,62, | 1123,63, | 1123,64, | 1123,65, | 1123,66, | 1123,67, | 1123,68, | 1123,69, | 1123,70, | 1123,71, | 1123,72, | 1123,73, | 1123,74, | 1123,75, | 1123,76, | 1123,77, | 1123,78, | 1123,79, | 1123,80, | 1123,81, | 1123,82, | 1123,83, | 1123,84, | 1123,85, | 1124,1, | 1124,2, | 1124,3, | 1124,4, | 1124,5, | 1124,6, | 1124,7, | 1124,8, | 1124,9, | 1124,10, | 1124,11, | 1124,12, | 1124,13, | 1124,14, | 1124,15, | 1124,16, | 1124,17, | 1124,18, | 1124,19, | 1124,20, | 1124,21, | 1124,22, | 1124,23, | 1124,24, | 1124,25, | 1124,26, | 1124,27, | 1124,28, | 1124,29, | 1124,30, | 1124,31, | 1124,32, | 1124,33, | 1124,34, | 1124,35, | 1124,36, | 1124,37, | 1124,38, | 1124,39, | 1124,40, | 1124,41, | 1124,42, | 1124,43, | 1124,44, | 1124,45, | 1124,46, | 1124,47, | 1124,48, | 1124,49, | 1124,50, | 1124,51, | 1124,52, | 1124,53, | 1124,54, | 1124,55, | 1124,56, | 1124,57, | 1124,58, | 1124,59, | 1124,60, | 1124,61, | 1124,62, | 1124,63, | 1124,64, | 1124,65, | 1124,66, | 1124,67, | 1124,68, | 1124,69, | 1124,70, | 1124,71, | 1124,72, | 1124,73, | 1124,74, | 1124,75, | 1124,76, | 1124,77, | 1124,78, | 1124,79, | 1124,80, | 1124,81, | 1124,82, | 1124,83, | 1124,84, | 1124,85, | 1125,1, | 1125,2, | 1125,3, | 1125,4, | 1125,5, | 1125,6, | 1125,7, | 1125,8, | 1125,9, | 1125,10, | 1125,11, | 1125,12, | 1125,13, | 1125,14, | 1125,15, | 1125,16, | 1125,17, | 1125,18, | 1125,19, | 1125,20, | 1125,21, | 1125,22, | 1125,23, | 1125,24, | 1125,25, | 1125,26, | 1125,27, | 1125,28, | 1125,29, | 1125,30, | 1125,31, | 1125,32, | 1125,33, | 1125,34, | 1125,35, | 1125,36, | 1125,37, | 1125,38, | 1125,39, | 1125,40, | 1125,41, | 1125,42, | 1125,43, | 1125,44, | 1125,45, | 1125,46, | 1125,47, | 1125,48, | 1125,49, | 1125,50, | 1125,51, | 1125,52, | 1125,53, | 1125,54, | 1125,55, | 1125,56, | 1125,57, | 1125,58, | 1125,59, | 1125,60, | 1125,61, | 1125,62, | 1125,63, | 1125,64, | 1125,65, | 1125,66, | 1125,67, | 1125,68, | 1125,69, | 1125,70, | 1125,71, | 1125,72, | 1125,73, | 1125,74, | 1125,75, | 1125,76, | 1125,77, | 1125,78, | 1125,79, | 1125,80, | 1125,81, | 1125,82, | 1125,83, | 1125,84, | 1125,85, | 1126,1, | 1126,2, | 1126,3, | 1126,4, | 1126,5, | 1126,6, | 1126,7, | 1126,8, | 1126,9, | 1126,10, | 1126,11, | 1126,12, | 1126,13, | 1126,14, | 1126,15, | 1126,16, | 1126,17, | 1126,18, | 1126,19, | 1126,20, | 1126,21, | 1126,22, | 1126,23, | 1126,24, | 1126,25, | 1126,26, | 1126,27, | 1126,28, | 1126,29, | 1126,30, | 1126,31, | 1126,32, | 1126,33, | 1126,34, | 1126,35, | 1126,36, | 1126,37, | 1126,38, | 1126,39, | 1126,40, | 1126,41, | 1126,42, | 1126,43, | 1126,44, | 1126,45, | 1126,46, | 1126,47, | 1126,48, | 1126,49, | 1126,50, | 1126,51, | 1126,52, | 1126,53, | 1126,54, | 1126,55, | 1126,56, | 1126,57, | 1126,58, | 1126,59, | 1126,60, | 1126,61, | 1126,62, | 1126,63, | 1126,64, | 1126,65, | 1126,66, | 1126,67, | 1126,68, | 1126,69, | 1126,70, | 1126,71, | 1126,72, | 1126,73, | 1126,74, | 1126,75, | 1126,76, | 1126,77, | 1126,78, | 1126,79, | 1126,80, | 1126,81, | 1126,82, | 1126,83, | 1126,84, | 1126,85, | 1127,1, | 1127,2, | 1127,3, | 1127,4, | 1127,5, | 1127,6, | 1127,7, | 1127,8, | 1127,9, | 1127,10, | 1127,11, | 1127,12, | 1127,13, | 1127,14, | 1127,15, | 1127,16, | 1127,17, | 1127,18, | 1127,19, | 1127,20, | 1127,21, | 1127,22, | 1127,23, | 1127,24, | 1127,25, | 1127,26, | 1127,27, | 1127,28, | 1127,29, | 1127,30, | 1127,31, | 1127,32, | 1127,33, | 1127,34, | 1127,35, | 1127,36, | 1127,37, | 1127,38, | 1127,39, | 1127,40, | 1127,41, | 1127,42, | 1127,43, | 1127,44, | 1127,45, | 1127,46, | 1127,47, | 1127,48, | 1127,49, | 1127,50, | 1127,51, | 1127,52, | 1127,53, | 1127,54, | 1127,55, | 1127,56, | 1127,57, | 1127,58, | 1127,59, | 1127,60, | 1127,61, | 1127,62, | 1127,63, | 1127,64, | 1127,65, | 1127,66, | 1127,67, | 1127,68, | 1127,69, | 1127,70, | 1127,71, | 1127,72, | 1127,73, | 1127,74, | 1127,75, | 1127,76, | 1127,77, | 1127,78, | 1127,79, | 1127,80, | 1127,81, | 1127,82, | 1127,83, | 1127,84, | 1127,85, | 1128,1, | 1128,2, | 1128,3, | 1128,4, | 1128,5, | 1128,6, | 1128,7, | 1128,8, | 1128,9, | 1128,10, | 1128,11, | 1128,12, | 1128,13, | 1128,14, | 1128,15, | 1128,16, | 1128,17, | 1128,18, | 1128,19, | 1128,20, | 1128,21, | 1128,22, | 1128,23, | 1128,24, | 1128,25, | 1128,26, | 1128,27, | 1128,28, | 1128,29, | 1128,30, | 1128,31, | 1128,32, | 1128,33, | 1128,34, | 1128,35, | 1128,36, | 1128,37, | 1128,38, | 1128,39, | 1128,40, | 1128,41, | 1128,42, | 1128,43, | 1128,44, | 1128,45, | 1128,46, | 1128,47, | 1128,48, | 1128,49, | 1128,50, | 1128,51, | 1128,52, | 1128,53, | 1128,54, | 1128,55, | 1128,56, | 1128,57, | 1128,58, | 1128,59, | 1128,60, | 1128,61, | 1128,62, | 1128,63, | 1128,64, | 1128,65, | 1128,66, | 1128,67, | 1128,68, | 1128,69, | 1128,70, | 1128,71, | 1128,72, | 1128,73, | 1128,74, | 1128,75, | 1128,76, | 1128,77, | 1128,78, | 1128,79, | 1128,80, | 1128,81, | 1128,82, | 1128,83, | 1128,84, | 1128,85, | 1129,1, | 1129,2, | 1129,3, | 1129,4, | 1129,5, | 1129,6, | 1129,7, | 1129,8, | 1129,9, | 1129,10, | 1129,11, | 1129,12, | 1129,13, | 1129,14, | 1129,15, | 1129,16, | 1129,17, | 1129,18, | 1129,19, | 1129,20, | 1129,21, | 1129,22, | 1129,23, | 1129,24, | 1129,25, | 1129,26, | 1129,27, | 1129,28, | 1129,29, | 1129,30, | 1129,31, | 1129,32, | 1129,33, | 1129,34, | 1129,35, | 1129,36, | 1129,37, | 1129,38, | 1129,39, | 1129,40, | 1129,41, | 1129,42, | 1129,43, | 1129,44, | 1129,45, | 1129,46, | 1129,47, | 1129,48, | 1129,49, | 1129,50, | 1129,51, | 1129,52, | 1129,53, | 1129,54, | 1129,55, | 1129,56, | 1129,57, | 1129,58, | 1129,59, | 1129,60, | 1129,61, | 1129,62, | 1129,63, | 1129,64, | 1129,65, | 1129,66, | 1129,67, | 1129,68, | 1129,69, | 1129,70, | 1129,71, | 1129,72, | 1129,73, | 1129,74, | 1129,75, | 1129,76, | 1129,77, | 1129,78, | 1129,79, | 1129,80, | 1129,81, | 1129,82, | 1129,83, | 1129,84, | 1129,85, | 1130,1, | 1130,2, | 1130,3, | 1130,4, | 1130,5, | 1130,6, | 1130,7, | 1130,8, | 1130,9, | 1130,10, | 1130,11, | 1130,12, | 1130,13, | 1130,14, | 1130,15, | 1130,16, | 1130,17, | 1130,18, | 1130,19, | 1130,20, | 1130,21, | 1130,22, | 1130,23, | 1130,24, | 1130,25, | 1130,26, | 1130,27, | 1130,28, | 1130,29, | 1130,30, | 1130,31, | 1130,32, | 1130,33, | 1130,34, | 1130,35, | 1130,36, | 1130,37, | 1130,38, | 1130,39, | 1130,40, | 1130,41, | 1130,42, | 1130,43, | 1130,44, | 1130,45, | 1130,46, | 1130,47, | 1130,48, | 1130,49, | 1130,50, | 1130,51, | 1130,52, | 1130,53, | 1130,54, | 1130,55, | 1130,56, | 1130,57, | 1130,58, | 1130,59, | 1130,60, | 1130,61, | 1130,62, | 1130,63, | 1130,64, | 1130,65, | 1130,66, | 1130,67, | 1130,68, | 1130,69, | 1130,70, | 1130,71, | 1130,72, | 1130,73, | 1130,74, | 1130,75, | 1130,76, | 1130,77, | 1130,78, | 1130,79, | 1130,80, | 1130,81, | 1130,82, | 1130,83, | 1130,84, | 1130,85, | 1131,1, | 1131,2, | 1131,3, | 1131,4, | 1131,5, | 1131,6, | 1131,7, | 1131,8, | 1131,9, | 1131,10, | 1131,11, | 1131,12, | 1131,13, | 1131,14, | 1131,15, | 1131,16, | 1131,17, | 1131,18, | 1131,19, | 1131,20, | 1131,21, | 1131,22, | 1131,23, | 1131,24, | 1131,25, | 1131,26, | 1131,27, | 1131,28, | 1131,29, | 1131,30, | 1131,31, | 1131,32, | 1131,33, | 1131,34, | 1131,35, | 1131,36, | 1131,37, | 1131,38, | 1131,39, | 1131,40, | 1131,41, | 1131,42, | 1131,43, | 1131,44, | 1131,45, | 1131,46, | 1131,47, | 1131,48, | 1131,49, | 1131,50, | 1131,51, | 1131,52, | 1131,53, | 1131,54, | 1131,55, | 1131,56, | 1131,57, | 1131,58, | 1131,59, | 1131,60, | 1131,61, | 1131,62, | 1131,63, | 1131,64, | 1131,65, | 1131,66, | 1131,67, | 1131,68, | 1131,69, | 1131,70, | 1131,71, | 1131,72, | 1131,73, | 1131,74, | 1131,75, | 1131,76, | 1131,77, | 1131,78, | 1131,79, | 1131,80, | 1131,81, | 1131,82, | 1131,83, | 1131,84, | 1131,85, | 1132,1, | 1132,2, | 1132,3, | 1132,4, | 1132,5, | 1132,6, | 1132,7, | 1132,8, | 1132,9, | 1132,10, | 1132,11, | 1132,12, | 1132,13, | 1132,14, | 1132,15, | 1132,16, | 1132,17, | 1132,18, | 1132,19, | 1132,20, | 1132,21, | 1132,22, | 1132,23, | 1132,24, | 1132,25, | 1132,26, | 1132,27, | 1132,28, | 1132,29, | 1132,30, | 1132,31, | 1132,32, | 1132,33, | 1132,34, | 1132,35, | 1132,36, | 1132,37, | 1132,38, | 1132,39, | 1132,40, | 1132,41, | 1132,42, | 1132,43, | 1132,44, | 1132,45, | 1132,46, | 1132,47, | 1132,48, | 1132,49, | 1132,50, | 1132,51, | 1132,52, | 1132,53, | 1132,54, | 1132,55, | 1132,56, | 1132,57, | 1132,58, | 1132,59, | 1132,60, | 1132,61, | 1132,62, | 1132,63, | 1132,64, | 1132,65, | 1132,66, | 1132,67, | 1132,68, | 1132,69, | 1132,70, | 1132,71, | 1132,72, | 1132,73, | 1132,74, | 1132,75, | 1132,76, | 1132,77, | 1132,78, | 1132,79, | 1132,80, | 1132,81, | 1132,82, | 1132,83, | 1132,84, | 1132,85, | 1133,1, | 1133,2, | 1133,3, | 1133,4, | 1133,5, | 1133,6, | 1133,7, | 1133,8, | 1133,9, | 1133,10, | 1133,11, | 1133,12, | 1133,13, | 1133,14, | 1133,15, | 1133,16, | 1133,17, | 1133,18, | 1133,19, | 1133,20, | 1133,21, | 1133,22, | 1133,23, | 1133,24, | 1133,25, | 1133,26, | 1133,27, | 1133,28, | 1133,29, | 1133,30, | 1133,31, | 1133,32, | 1133,33, | 1133,34, | 1133,35, | 1133,36, | 1133,37, | 1133,38, | 1133,39, | 1133,40, | 1133,41, | 1133,42, | 1133,43, | 1133,44, | 1133,45, | 1133,46, | 1133,47, | 1133,48, | 1133,49, | 1133,50, | 1133,51, | 1133,52, | 1133,53, | 1133,54, | 1133,55, | 1133,56, | 1133,57, | 1133,58, | 1133,59, | 1133,60, | 1133,61, | 1133,62, | 1133,63, | 1133,64, | 1133,65, | 1133,66, | 1133,67, | 1133,68, | 1133,69, | 1133,70, | 1133,71, | 1133,72, | 1133,73, | 1133,74, | 1133,75, | 1133,76, | 1133,77, | 1133,78, | 1133,79, | 1133,80, | 1133,81, | 1133,82, | 1133,83, | 1133,84, | 1133,85, | 1134,1, | 1134,2, | 1134,3, | 1134,4, | 1134,5, | 1134,6, | 1134,7, | 1134,8, | 1134,9, | 1134,10, | 1134,11, | 1134,12, | 1134,13, | 1134,14, | 1134,15, | 1134,16, | 1134,17, | 1134,18, | 1134,19, | 1134,20, | 1134,21, | 1134,22, | 1134,23, | 1134,24, | 1134,25, | 1134,26, | 1134,27, | 1134,28, | 1134,29, | 1134,30, | 1134,31, | 1134,32, | 1134,33, | 1134,34, | 1134,35, | 1134,36, | 1134,37, | 1134,38, | 1134,39, | 1134,40, | 1134,41, | 1134,42, | 1134,43, | 1134,44, | 1134,45, | 1134,46, | 1134,47, | 1134,48, | 1134,49, | 1134,50, | 1134,51, | 1134,52, | 1134,53, | 1134,54, | 1134,55, | 1134,56, | 1134,57, | 1134,58, | 1134,59, | 1134,60, | 1134,61, | 1134,62, | 1134,63, | 1134,64, | 1134,65, | 1134,66, | 1134,67, | 1134,68, | 1134,69, | 1134,70, | 1134,71, | 1134,72, | 1134,73, | 1134,74, | 1134,75, | 1134,76, | 1134,77, | 1134,78, | 1134,79, | 1134,80, | 1134,81, | 1134,82, | 1134,83, | 1134,84, | 1134,85, | 1135,1, | 1135,2, | 1135,3, | 1135,4, | 1135,5, | 1135,6, | 1135,7, | 1135,8, | 1135,9, | 1135,10, | 1135,11, | 1135,12, | 1135,13, | 1135,14, | 1135,15, | 1135,16, | 1135,17, | 1135,18, | 1135,19, | 1135,20, | 1135,21, | 1135,22, | 1135,23, | 1135,24, | 1135,25, | 1135,26, | 1135,27, | 1135,28, | 1135,29, | 1135,30, | 1135,31, | 1135,32, | 1135,33, | 1135,34, | 1135,35, | 1135,36, | 1135,37, | 1135,38, | 1135,39, | 1135,40, | 1135,41, | 1135,42, | 1135,43, | 1135,44, | 1135,45, | 1135,46, | 1135,47, | 1135,48, | 1135,49, | 1135,50, | 1135,51, | 1135,52, | 1135,53, | 1135,54, | 1135,55, | 1135,56, | 1135,57, | 1135,58, | 1135,59, | 1135,60, | 1135,61, | 1135,62, | 1135,63, | 1135,64, | 1135,65, | 1135,66, | 1135,67, | 1135,68, | 1135,69, | 1135,70, | 1135,71, | 1135,72, | 1135,73, | 1135,74, | 1135,75, | 1135,76, | 1135,77, | 1135,78, | 1135,79, | 1135,80, | 1135,81, | 1135,82, | 1135,83, | 1135,84, | 1135,85, | 1136,1, | 1136,2, | 1136,3, | 1136,4, | 1136,5, | 1136,6, | 1136,7, | 1136,8, | 1136,9, | 1136,10, | 1136,11, | 1136,12, | 1136,13, | 1136,14, | 1136,15, | 1136,16, | 1136,17, | 1136,18, | 1136,19, | 1136,20, | 1136,21, | 1136,22, | 1136,23, | 1136,24, | 1136,25, | 1136,26, | 1136,27, | 1136,28, | 1136,29, | 1136,30, | 1136,31, | 1136,32, | 1136,33, | 1136,34, | 1136,35, | 1136,36, | 1136,37, | 1136,38, | 1136,39, | 1136,40, | 1136,41, | 1136,42, | 1136,43, | 1136,44, | 1136,45, | 1136,46, | 1136,47, | 1136,48, | 1136,49, | 1136,50, | 1136,51, | 1136,52, | 1136,53, | 1136,54, | 1136,55, | 1136,56, | 1136,57, | 1136,58, | 1136,59, | 1136,60, | 1136,61, | 1136,62, | 1136,63, | 1136,64, | 1136,65, | 1136,66, | 1136,67, | 1136,68, | 1136,69, | 1136,70, | 1136,71, | 1136,72, | 1136,73, | 1136,74, | 1136,75, | 1136,76, | 1136,77, | 1136,78, | 1136,79, | 1136,80, | 1136,81, | 1136,82, | 1136,83, | 1136,84, | 1136,85, | 1137,1, | 1137,2, | 1137,3, | 1137,4, | 1137,5, | 1137,6, | 1137,7, | 1137,8, | 1137,9, | 1137,10, | 1137,11, | 1137,12, | 1137,13, | 1137,14, | 1137,15, | 1137,16, | 1137,17, | 1137,18, | 1137,19, | 1137,20, | 1137,21, | 1137,22, | 1137,23, | 1137,24, | 1137,25, | 1137,26, | 1137,27, | 1137,28, | 1137,29, | 1137,30, | 1137,31, | 1137,32, | 1137,33, | 1137,34, | 1137,35, | 1137,36, | 1137,37, | 1137,38, | 1137,39, | 1137,40, | 1137,41, | 1137,42, | 1137,43, | 1137,44, | 1137,45, | 1137,46, | 1137,47, | 1137,48, | 1137,49, | 1137,50, | 1137,51, | 1137,52, | 1137,53, | 1137,54, | 1137,55, | 1137,56, | 1137,57, | 1137,58, | 1137,59, | 1137,60, | 1137,61, | 1137,62, | 1137,63, | 1137,64, | 1137,65, | 1137,66, | 1137,67, | 1137,68, | 1137,69, | 1137,70, | 1137,71, | 1137,72, | 1137,73, | 1137,74, | 1137,75, | 1137,76, | 1137,77, | 1137,78, | 1137,79, | 1137,80, | 1137,81, | 1137,82, | 1137,83, | 1137,84, | 1137,85, | 1138,1, | 1138,2, | 1138,3, | 1138,4, | 1138,5, | 1138,6, | 1138,7, | 1138,8, | 1138,9, | 1138,10, | 1138,11, | 1138,12, | 1138,13, | 1138,14, | 1138,15, | 1138,16, | 1138,17, | 1138,18, | 1138,19, | 1138,20, | 1138,21, | 1138,22, | 1138,23, | 1138,24, | 1138,25, | 1138,26, | 1138,27, | 1138,28, | 1138,29, | 1138,30, | 1138,31, | 1138,32, | 1138,33, | 1138,34, | 1138,35, | 1138,36, | 1138,37, | 1138,38, | 1138,39, | 1138,40, | 1138,41, | 1138,42, | 1138,43, | 1138,44, | 1138,45, | 1138,46, | 1138,47, | 1138,48, | 1138,49, | 1138,50, | 1138,51, | 1138,52, | 1138,53, | 1138,54, | 1138,55, | 1138,56, | 1138,57, | 1138,58, | 1138,59, | 1138,60, | 1138,61, | 1138,62, | 1138,63, | 1138,64, | 1138,65, | 1138,66, | 1138,67, | 1138,68, | 1138,69, | 1138,70, | 1138,71, | 1138,72, | 1138,73, | 1138,74, | 1138,75, | 1138,76, | 1138,77, | 1138,78, | 1138,79, | 1138,80, | 1138,81, | 1138,82, | 1138,83, | 1138,84, | 1138,85, | 1139,1, | 1139,2, | 1139,3, | 1139,4, | 1139,5, | 1139,6, | 1139,7, | 1139,8, | 1139,9, | 1139,10, | 1139,11, | 1139,12, | 1139,13, | 1139,14, | 1139,15, | 1139,16, | 1139,17, | 1139,18, | 1139,19, | 1139,20, | 1139,21, | 1139,22, | 1139,23, | 1139,24, | 1139,25, | 1139,26, | 1139,27, | 1139,28, | 1139,29, | 1139,30, | 1139,31, | 1139,32, | 1139,33, | 1139,34, | 1139,35, | 1139,36, | 1139,37, | 1139,38, | 1139,39, | 1139,40, | 1139,41, | 1139,42, | 1139,43, | 1139,44, | 1139,45, | 1139,46, | 1139,47, | 1139,48, | 1139,49, | 1139,50, | 1139,51, | 1139,52, | 1139,53, | 1139,54, | 1139,55, | 1139,56, | 1139,57, | 1139,58, | 1139,59, | 1139,60, | 1139,61, | 1139,62, | 1139,63, | 1139,64, | 1139,65, | 1139,66, | 1139,67, | 1139,68, | 1139,69, | 1139,70, | 1139,71, | 1139,72, | 1139,73, | 1139,74, | 1139,75, | 1139,76, | 1139,77, | 1139,78, | 1139,79, | 1139,80, | 1139,81, | 1139,82, | 1139,83, | 1139,84, | 1139,85, | 1140,1, | 1140,2, | 1140,3, | 1140,4, | 1140,5, | 1140,6, | 1140,7, | 1140,8, | 1140,9, | 1140,10, | 1140,11, | 1140,12, | 1140,13, | 1140,14, | 1140,15, | 1140,16, | 1140,17, | 1140,18, | 1140,19, | 1140,20, | 1140,21, | 1140,22, | 1140,23, | 1140,24, | 1140,25, | 1140,26, | 1140,27, | 1140,28, | 1140,29, | 1140,30, | 1140,31, | 1140,32, | 1140,33, | 1140,34, | 1140,35, | 1140,36, | 1140,37, | 1140,38, | 1140,39, | 1140,40, | 1140,41, | 1140,42, | 1140,43, | 1140,44, | 1140,45, | 1140,46, | 1140,47, | 1140,48, | 1140,49, | 1140,50, | 1140,51, | 1140,52, | 1140,53, | 1140,54, | 1140,55, | 1140,56, | 1140,57, | 1140,58, | 1140,59, | 1140,60, | 1140,61, | 1140,62, | 1140,63, | 1140,64, | 1140,65, | 1140,66, | 1140,67, | 1140,68, | 1140,69, | 1140,70, | 1140,71, | 1140,72, | 1140,73, | 1140,74, | 1140,75, | 1140,76, | 1140,77, | 1140,78, | 1140,79, | 1140,80, | 1140,81, | 1140,82, | 1140,83, | 1140,84, | 1140,85, | 1141,1, | 1141,2, | 1141,3, | 1141,4, | 1141,5, | 1141,6, | 1141,7, | 1141,8, | 1141,9, | 1141,10, | 1141,11, | 1141,12, | 1141,13, | 1141,14, | 1141,15, | 1141,16, | 1141,17, | 1141,18, | 1141,19, | 1141,20, | 1141,21, | 1141,22, | 1141,23, | 1141,24, | 1141,25, | 1141,26, | 1141,27, | 1141,28, | 1141,29, | 1141,30, | 1141,31, | 1141,32, | 1141,33, | 1141,34, | 1141,35, | 1141,36, | 1141,37, | 1141,38, | 1141,39, | 1141,40, | 1141,41, | 1141,42, | 1141,43, | 1141,44, | 1141,45, | 1141,46, | 1141,47, | 1141,48, | 1141,49, | 1141,50, | 1141,51, | 1141,52, | 1141,53, | 1141,54, | 1141,55, | 1141,56, | 1141,57, | 1141,58, | 1141,59, | 1141,60, | 1141,61, | 1141,62, | 1141,63, | 1141,64, | 1141,65, | 1141,66, | 1141,67, | 1141,68, | 1141,69, | 1141,70, | 1141,71, | 1141,72, | 1141,73, | 1141,74, | 1141,75, | 1141,76, | 1141,77, | 1141,78, | 1141,79, | 1141,80, | 1141,81, | 1141,82, | 1141,83, | 1141,84, | 1141,85, | 1142,1, | 1142,2, | 1142,3, | 1142,4, | 1142,5, | 1142,6, | 1142,7, | 1142,8, | 1142,9, | 1142,10, | 1142,11, | 1142,12, | 1142,13, | 1142,14, | 1142,15, | 1142,16, | 1142,17, | 1142,18, | 1142,19, | 1142,20, | 1142,21, | 1142,22, | 1142,23, | 1142,24, | 1142,25, | 1142,26, | 1142,27, | 1142,28, | 1142,29, | 1142,30, | 1142,31, | 1142,32, | 1142,33, | 1142,34, | 1142,35, | 1142,36, | 1142,37, | 1142,38, | 1142,39, | 1142,40, | 1142,41, | 1142,42, | 1142,43, | 1142,44, | 1142,45, | 1142,46, | 1142,47, | 1142,48, | 1142,49, | 1142,50, | 1142,51, | 1142,52, | 1142,53, | 1142,54, | 1142,55, | 1142,56, | 1142,57, | 1142,58, | 1142,59, | 1142,60, | 1142,61, | 1142,62, | 1142,63, | 1142,64, | 1142,65, | 1142,66, | 1142,67, | 1142,68, | 1142,69, | 1142,70, | 1142,71, | 1142,72, | 1142,73, | 1142,74, | 1142,75, | 1142,76, | 1142,77, | 1142,78, | 1142,79, | 1142,80, | 1142,81, | 1142,82, | 1142,83, | 1142,84, | 1142,85, | 1143,1, | 1143,2, | 1143,3, | 1143,4, | 1143,5, | 1143,6, | 1143,7, | 1143,8, | 1143,9, | 1143,10, | 1143,11, | 1143,12, | 1143,13, | 1143,14, | 1143,15, | 1143,16, | 1143,17, | 1143,18, | 1143,19, | 1143,20, | 1143,21, | 1143,22, | 1143,23, | 1143,24, | 1143,25, | 1143,26, | 1143,27, | 1143,28, | 1143,29, | 1143,30, | 1143,31, | 1143,32, | 1143,33, | 1143,34, | 1143,35, | 1143,36, | 1143,37, | 1143,38, | 1143,39, | 1143,40, | 1143,41, | 1143,42, | 1143,43, | 1143,44, | 1143,45, | 1143,46, | 1143,47, | 1143,48, | 1143,49, | 1143,50, | 1143,51, | 1143,52, | 1143,53, | 1143,54, | 1143,55, | 1143,56, | 1143,57, | 1143,58, | 1143,59, | 1143,60, | 1143,61, | 1143,62, | 1143,63, | 1143,64, | 1143,65, | 1143,66, | 1143,67, | 1143,68, | 1143,69, | 1143,70, | 1143,71, | 1143,72, | 1143,73, | 1143,74, | 1143,75, | 1143,76, | 1143,77, | 1143,78, | 1143,79, | 1143,80, | 1143,81, | 1143,82, | 1143,83, | 1143,84, | 1143,85, | 1144,1, | 1144,2, | 1144,3, | 1144,4, | 1144,5, | 1144,6, | 1144,7, | 1144,8, | 1144,9, | 1144,10, | 1144,11, | 1144,12, | 1144,13, | 1144,14, | 1144,15, | 1144,16, | 1144,17, | 1144,18, | 1144,19, | 1144,20, | 1144,21, | 1144,22, | 1144,23, | 1144,24, | 1144,25, | 1144,26, | 1144,27, | 1144,28, | 1144,29, | 1144,30, | 1144,31, | 1144,32, | 1144,33, | 1144,34, | 1144,35, | 1144,36, | 1144,37, | 1144,38, | 1144,39, | 1144,40, | 1144,41, | 1144,42, | 1144,43, | 1144,44, | 1144,45, | 1144,46, | 1144,47, | 1144,48, | 1144,49, | 1144,50, | 1144,51, | 1144,52, | 1144,53, | 1144,54, | 1144,55, | 1144,56, | 1144,57, | 1144,58, | 1144,59, | 1144,60, | 1144,61, | 1144,62, | 1144,63, | 1144,64, | 1144,65, | 1144,66, | 1144,67, | 1144,68, | 1144,69, | 1144,70, | 1144,71, | 1144,72, | 1144,73, | 1144,74, | 1144,75, | 1144,76, | 1144,77, | 1144,78, | 1144,79, | 1144,80, | 1144,81, | 1144,82, | 1144,83, | 1144,84, | 1144,85, | 1145,1, | 1145,2, | 1145,3, | 1145,4, | 1145,5, | 1145,6, | 1145,7, | 1145,8, | 1145,9, | 1145,10, | 1145,11, | 1145,12, | 1145,13, | 1145,14, | 1145,15, | 1145,16, | 1145,17, | 1145,18, | 1145,19, | 1145,20, | 1145,21, | 1145,22, | 1145,23, | 1145,24, | 1145,25, | 1145,26, | 1145,27, | 1145,28, | 1145,29, | 1145,30, | 1145,31, | 1145,32, | 1145,33, | 1145,34, | 1145,35, | 1145,36, | 1145,37, | 1145,38, | 1145,39, | 1145,40, | 1145,41, | 1145,42, | 1145,43, | 1145,44, | 1145,45, | 1145,46, | 1145,47, | 1145,48, | 1145,49, | 1145,50, | 1145,51, | 1145,52, | 1145,53, | 1145,54, | 1145,55, | 1145,56, | 1145,57, | 1145,58, | 1145,59, | 1145,60, | 1145,61, | 1145,62, | 1145,63, | 1145,64, | 1145,65, | 1145,66, | 1145,67, | 1145,68, | 1145,69, | 1145,70, | 1145,71, | 1145,72, | 1145,73, | 1145,74, | 1145,75, | 1145,76, | 1145,77, | 1145,78, | 1145,79, | 1145,80, | 1145,81, | 1145,82, | 1145,83, | 1145,84, | 1145,85, | 1146,1, | 1146,2, | 1146,3, | 1146,4, | 1146,5, | 1146,6, | 1146,7, | 1146,8, | 1146,9, | 1146,10, | 1146,11, | 1146,12, | 1146,13, | 1146,14, | 1146,15, | 1146,16, | 1146,17, | 1146,18, | 1146,19, | 1146,20, | 1146,21, | 1146,22, | 1146,23, | 1146,24, | 1146,25, | 1146,26, | 1146,27, | 1146,28, | 1146,29, | 1146,30, | 1146,31, | 1146,32, | 1146,33, | 1146,34, | 1146,35, | 1146,36, | 1146,37, | 1146,38, | 1146,39, | 1146,40, | 1146,41, | 1146,42, | 1146,43, | 1146,44, | 1146,45, | 1146,46, | 1146,47, | 1146,48, | 1146,49, | 1146,50, | 1146,51, | 1146,52, | 1146,53, | 1146,54, | 1146,55, | 1146,56, | 1146,57, | 1146,58, | 1146,59, | 1146,60, | 1146,61, | 1146,62, | 1146,63, | 1146,64, | 1146,65, | 1146,66, | 1146,67, | 1146,68, | 1146,69, | 1146,70, | 1146,71, | 1146,72, | 1146,73, | 1146,74, | 1146,75, | 1146,76, | 1146,77, | 1146,78, | 1146,79, | 1146,80, | 1146,81, | 1146,82, | 1146,83, | 1146,84, | 1146,85, | 1147,1, | 1147,2, | 1147,3, | 1147,4, | 1147,5, | 1147,6, | 1147,7, | 1147,8, | 1147,9, | 1147,10, | 1147,11, | 1147,12, | 1147,13, | 1147,14, | 1147,15, | 1147,16, | 1147,17, | 1147,18, | 1147,19, | 1147,20, | 1147,21, | 1147,22, | 1147,23, | 1147,24, | 1147,25, | 1147,26, | 1147,27, | 1147,28, | 1147,29, | 1147,30, | 1147,31, | 1147,32, | 1147,33, | 1147,34, | 1147,35, | 1147,36, | 1147,37, | 1147,38, | 1147,39, | 1147,40, | 1147,41, | 1147,42, | 1147,43, | 1147,44, | 1147,45, | 1147,46, | 1147,47, | 1147,48, | 1147,49, | 1147,50, | 1147,51, | 1147,52, | 1147,53, | 1147,54, | 1147,55, | 1147,56, | 1147,57, | 1147,58, | 1147,59, | 1147,60, | 1147,61, | 1147,62, | 1147,63, | 1147,64, | 1147,65, | 1147,66, | 1147,67, | 1147,68, | 1147,69, | 1147,70, | 1147,71, | 1147,72, | 1147,73, | 1147,74, | 1147,75, | 1147,76, | 1147,77, | 1147,78, | 1147,79, | 1147,80, | 1147,81, | 1147,82, | 1147,83, | 1147,84, | 1147,85, | 1148,1, | 1148,2, | 1148,3, | 1148,4, | 1148,5, | 1148,6, | 1148,7, | 1148,8, | 1148,9, | 1148,10, | 1148,11, | 1148,12, | 1148,13, | 1148,14, | 1148,15, | 1148,16, | 1148,17, | 1148,18, | 1148,19, | 1148,20, | 1148,21, | 1148,22, | 1148,23, | 1148,24, | 1148,25, | 1148,26, | 1148,27, | 1148,28, | 1148,29, | 1148,30, | 1148,31, | 1148,32, | 1148,33, | 1148,34, | 1148,35, | 1148,36, | 1148,37, | 1148,38, | 1148,39, | 1148,40, | 1148,41, | 1148,42, | 1148,43, | 1148,44, | 1148,45, | 1148,46, | 1148,47, | 1148,48, | 1148,49, | 1148,50, | 1148,51, | 1148,52, | 1148,53, | 1148,54, | 1148,55, | 1148,56, | 1148,57, | 1148,58, | 1148,59, | 1148,60, | 1148,61, | 1148,62, | 1148,63, | 1148,64, | 1148,65, | 1148,66, | 1148,67, | 1148,68, | 1148,69, | 1148,70, | 1148,71, | 1148,72, | 1148,73, | 1148,74, | 1148,75, | 1148,76, | 1148,77, | 1148,78, | 1148,79, | 1148,80, | 1148,81, | 1148,82, | 1148,83, | 1148,84, | 1148,85, | 1149,1, | 1149,2, | 1149,3, | 1149,4, | 1149,5, | 1149,6, | 1149,7, | 1149,8, | 1149,9, | 1149,10, | 1149,11, | 1149,12, | 1149,13, | 1149,14, | 1149,15, | 1149,16, | 1149,17, | 1149,18, | 1149,19, | 1149,20, | 1149,21, | 1149,22, | 1149,23, | 1149,24, | 1149,25, | 1149,26, | 1149,27, | 1149,28, | 1149,29, | 1149,30, | 1149,31, | 1149,32, | 1149,33, | 1149,34, | 1149,35, | 1149,36, | 1149,37, | 1149,38, | 1149,39, | 1149,40, | 1149,41, | 1149,42, | 1149,43, | 1149,44, | 1149,45, | 1149,46, | 1149,47, | 1149,48, | 1149,49, | 1149,50, | 1149,51, | 1149,52, | 1149,53, | 1149,54, | 1149,55, | 1149,56, | 1149,57, | 1149,58, | 1149,59, | 1149,60, | 1149,61, | 1149,62, | 1149,63, | 1149,64, | 1149,65, | 1149,66, | 1149,67, | 1149,68, | 1149,69, | 1149,70, | 1149,71, | 1149,72, | 1149,73, | 1149,74, | 1149,75, | 1149,76, | 1149,77, | 1149,78, | 1149,79, | 1149,80, | 1149,81, | 1149,82, | 1149,83, | 1149,84, | 1149,85, | 1150,1, | 1150,2, | 1150,3, | 1150,4, | 1150,5, | 1150,6, | 1150,7, | 1150,8, | 1150,9, | 1150,10, | 1150,11, | 1150,12, | 1150,13, | 1150,14, | 1150,15, | 1150,16, | 1150,17, | 1150,18, | 1150,19, | 1150,20, | 1150,21, | 1150,22, | 1150,23, | 1150,24, | 1150,25, | 1150,26, | 1150,27, | 1150,28, | 1150,29, | 1150,30, | 1150,31, | 1150,32, | 1150,33, | 1150,34, | 1150,35, | 1150,36, | 1150,37, | 1150,38, | 1150,39, | 1150,40, | 1150,41, | 1150,42, | 1150,43, | 1150,44, | 1150,45, | 1150,46, | 1150,47, | 1150,48, | 1150,49, | 1150,50, | 1150,51, | 1150,52, | 1150,53, | 1150,54, | 1150,55, | 1150,56, | 1150,57, | 1150,58, | 1150,59, | 1150,60, | 1150,61, | 1150,62, | 1150,63, | 1150,64, | 1150,65, | 1150,66, | 1150,67, | 1150,68, | 1150,69, | 1150,70, | 1150,71, | 1150,72, | 1150,73, | 1150,74, | 1150,75, | 1150,76, | 1150,77, | 1150,78, | 1150,79, | 1150,80, | 1150,81, | 1150,82, | 1150,83, | 1150,84, | 1150,85, | 1151,1, | 1151,2, | 1151,3, | 1151,4, | 1151,5, | 1151,6, | 1151,7, | 1151,8, | 1151,9, | 1151,10, | 1151,11, | 1151,12, | 1151,13, | 1151,14, | 1151,15, | 1151,16, | 1151,17, | 1151,18, | 1151,19, | 1151,20, | 1151,21, | 1151,22, | 1151,23, | 1151,24, | 1151,25, | 1151,26, | 1151,27, | 1151,28, | 1151,29, | 1151,30, | 1151,31, | 1151,32, | 1151,33, | 1151,34, | 1151,35, | 1151,36, | 1151,37, | 1151,38, | 1151,39, | 1151,40, | 1151,41, | 1151,42, | 1151,43, | 1151,44, | 1151,45, | 1151,46, | 1151,47, | 1151,48, | 1151,49, | 1151,50, | 1151,51, | 1151,52, | 1151,53, | 1151,54, | 1151,55, | 1151,56, | 1151,57, | 1151,58, | 1151,59, | 1151,60, | 1151,61, | 1151,62, | 1151,63, | 1151,64, | 1151,65, | 1151,66, | 1151,67, | 1151,68, | 1151,69, | 1151,70, | 1151,71, | 1151,72, | 1151,73, | 1151,74, | 1151,75, | 1151,76, | 1151,77, | 1151,78, | 1151,79, | 1151,80, | 1151,81, | 1151,82, | 1151,83, | 1151,84, | 1151,85, | 1152,1, | 1152,2, | 1152,3, | 1152,4, | 1152,5, | 1152,6, | 1152,7, | 1152,8, | 1152,9, | 1152,10, | 1152,11, | 1152,12, | 1152,13, | 1152,14, | 1152,15, | 1152,16, | 1152,17, | 1152,18, | 1152,19, | 1152,20, | 1152,21, | 1152,22, | 1152,23, | 1152,24, | 1152,25, | 1152,26, | 1152,27, | 1152,28, | 1152,29, | 1152,30, | 1152,31, | 1152,32, | 1152,33, | 1152,34, | 1152,35, | 1152,36, | 1152,37, | 1152,38, | 1152,39, | 1152,40, | 1152,41, | 1152,42, | 1152,43, | 1152,44, | 1152,45, | 1152,46, | 1152,47, | 1152,48, | 1152,49, | 1152,50, | 1152,51, | 1152,52, | 1152,53, | 1152,54, | 1152,55, | 1152,56, | 1152,57, | 1152,58, | 1152,59, | 1152,60, | 1152,61, | 1152,62, | 1152,63, | 1152,64, | 1152,65, | 1152,66, | 1152,67, | 1152,68, | 1152,69, | 1152,70, | 1152,71, | 1152,72, | 1152,73, | 1152,74, | 1152,75, | 1152,76, | 1152,77, | 1152,78, | 1152,79, | 1152,80, | 1152,81, | 1152,82, | 1152,83, | 1152,84, | 1152,85, | 1153,1, | 1153,2, | 1153,3, | 1153,4, | 1153,5, | 1153,6, | 1153,7, | 1153,8, | 1153,9, | 1153,10, | 1153,11, | 1153,12, | 1153,13, | 1153,14, | 1153,15, | 1153,16, | 1153,17, | 1153,18, | 1153,19, | 1153,20, | 1153,21, | 1153,22, | 1153,23, | 1153,24, | 1153,25, | 1153,26, | 1153,27, | 1153,28, | 1153,29, | 1153,30, | 1153,31, | 1153,32, | 1153,33, | 1153,34, | 1153,35, | 1153,36, | 1153,37, | 1153,38, | 1153,39, | 1153,40, | 1153,41, | 1153,42, | 1153,43, | 1153,44, | 1153,45, | 1153,46, | 1153,47, | 1153,48, | 1153,49, | 1153,50, | 1153,51, | 1153,52, | 1153,53, | 1153,54, | 1153,55, | 1153,56, | 1153,57, | 1153,58, | 1153,59, | 1153,60, | 1153,61, | 1153,62, | 1153,63, | 1153,64, | 1153,65, | 1153,66, | 1153,67, | 1153,68, | 1153,69, | 1153,70, | 1153,71, | 1153,72, | 1153,73, | 1153,74, | 1153,75, | 1153,76, | 1153,77, | 1153,78, | 1153,79, | 1153,80, | 1153,81, | 1153,82, | 1153,83, | 1153,84, | 1153,85, | 1154,1, | 1154,2, | 1154,3, | 1154,4, | 1154,5, | 1154,6, | 1154,7, | 1154,8, | 1154,9, | 1154,10, | 1154,11, | 1154,12, | 1154,13, | 1154,14, | 1154,15, | 1154,16, | 1154,17, | 1154,18, | 1154,19, | 1154,20, | 1154,21, | 1154,22, | 1154,23, | 1154,24, | 1154,25, | 1154,26, | 1154,27, | 1154,28, | 1154,29, | 1154,30, | 1154,31, | 1154,32, | 1154,33, | 1154,34, | 1154,35, | 1154,36, | 1154,37, | 1154,38, | 1154,39, | 1154,40, | 1154,41, | 1154,42, | 1154,43, | 1154,44, | 1154,45, | 1154,46, | 1154,47, | 1154,48, | 1154,49, | 1154,50, | 1154,51, | 1154,52, | 1154,53, | 1154,54, | 1154,55, | 1154,56, | 1154,57, | 1154,58, | 1154,59, | 1154,60, | 1154,61, | 1154,62, | 1154,63, | 1154,64, | 1154,65, | 1154,66, | 1154,67, | 1154,68, | 1154,69, | 1154,70, | 1154,71, | 1154,72, | 1154,73, | 1154,74, | 1154,75, | 1154,76, | 1154,77, | 1154,78, | 1154,79, | 1154,80, | 1154,81, | 1154,82, | 1154,83, | 1154,84, | 1154,85, | 1155,1, | 1155,2, | 1155,3, | 1155,4, | 1155,5, | 1155,6, | 1155,7, | 1155,8, | 1155,9, | 1155,10, | 1155,11, | 1155,12, | 1155,13, | 1155,14, | 1155,15, | 1155,16, | 1155,17, | 1155,18, | 1155,19, | 1155,20, | 1155,21, | 1155,22, | 1155,23, | 1155,24, | 1155,25, | 1155,26, | 1155,27, | 1155,28, | 1155,29, | 1155,30, | 1155,31, | 1155,32, | 1155,33, | 1155,34, | 1155,35, | 1155,36, | 1155,37, | 1155,38, | 1155,39, | 1155,40, | 1155,41, | 1155,42, | 1155,43, | 1155,44, | 1155,45, | 1155,46, | 1155,47, | 1155,48, | 1155,49, | 1155,50, | 1155,51, | 1155,52, | 1155,53, | 1155,54, | 1155,55, | 1155,56, | 1155,57, | 1155,58, | 1155,59, | 1155,60, | 1155,61, | 1155,62, | 1155,63, | 1155,64, | 1155,65, | 1155,66, | 1155,67, | 1155,68, | 1155,69, | 1155,70, | 1155,71, | 1155,72, | 1155,73, | 1155,74, | 1155,75, | 1155,76, | 1155,77, | 1155,78, | 1155,79, | 1155,80, | 1155,81, | 1155,82, | 1155,83, | 1155,84, | 1155,85, | 1156,1, | 1156,2, | 1156,3, | 1156,4, | 1156,5, | 1156,6, | 1156,7, | 1156,8, | 1156,9, | 1156,10, | 1156,11, | 1156,12, | 1156,13, | 1156,14, | 1156,15, | 1156,16, | 1156,17, | 1156,18, | 1156,19, | 1156,20, | 1156,21, | 1156,22, | 1156,23, | 1156,24, | 1156,25, | 1156,26, | 1156,27, | 1156,28, | 1156,29, | 1156,30, | 1156,31, | 1156,32, | 1156,33, | 1156,34, | 1156,35, | 1156,36, | 1156,37, | 1156,38, | 1156,39, | 1156,40, | 1156,41, | 1156,42, | 1156,43, | 1156,44, | 1156,45, | 1156,46, | 1156,47, | 1156,48, | 1156,49, | 1156,50, | 1156,51, | 1156,52, | 1156,53, | 1156,54, | 1156,55, | 1156,56, | 1156,57, | 1156,58, | 1156,59, | 1156,60, | 1156,61, | 1156,62, | 1156,63, | 1156,64, | 1156,65, | 1156,66, | 1156,67, | 1156,68, | 1156,69, | 1156,70, | 1156,71, | 1156,72, | 1156,73, | 1156,74, | 1156,75, | 1156,76, | 1156,77, | 1156,78, | 1156,79, | 1156,80, | 1156,81, | 1156,82, | 1156,83, | 1156,84, | 1156,85, | 1157,1, | 1157,2, | 1157,3, | 1157,4, | 1157,5, | 1157,6, | 1157,7, | 1157,8, | 1157,9, | 1157,10, | 1157,11, | 1157,12, | 1157,13, | 1157,14, | 1157,15, | 1157,16, | 1157,17, | 1157,18, | 1157,19, | 1157,20, | 1157,21, | 1157,22, | 1157,23, | 1157,24, | 1157,25, | 1157,26, | 1157,27, | 1157,28, | 1157,29, | 1157,30, | 1157,31, | 1157,32, | 1157,33, | 1157,34, | 1157,35, | 1157,36, | 1157,37, | 1157,38, | 1157,39, | 1157,40, | 1157,41, | 1157,42, | 1157,43, | 1157,44, | 1157,45, | 1157,46, | 1157,47, | 1157,48, | 1157,49, | 1157,50, | 1157,51, | 1157,52, | 1157,53, | 1157,54, | 1157,55, | 1157,56, | 1157,57, | 1157,58, | 1157,59, | 1157,60, | 1157,61, | 1157,62, | 1157,63, | 1157,64, | 1157,65, | 1157,66, | 1157,67, | 1157,68, | 1157,69, | 1157,70, | 1157,71, | 1157,72, | 1157,73, | 1157,74, | 1157,75, | 1157,76, | 1157,77, | 1157,78, | 1157,79, | 1157,80, | 1157,81, | 1157,82, | 1157,83, | 1157,84, | 1157,85, | 1158,1, | 1158,2, | 1158,3, | 1158,4, | 1158,5, | 1158,6, | 1158,7, | 1158,8, | 1158,9, | 1158,10, | 1158,11, | 1158,12, | 1158,13, | 1158,14, | 1158,15, | 1158,16, | 1158,17, | 1158,18, | 1158,19, | 1158,20, | 1158,21, | 1158,22, | 1158,23, | 1158,24, | 1158,25, | 1158,26, | 1158,27, | 1158,28, | 1158,29, | 1158,30, | 1158,31, | 1158,32, | 1158,33, | 1158,34, | 1158,35, | 1158,36, | 1158,37, | 1158,38, | 1158,39, | 1158,40, | 1158,41, | 1158,42, | 1158,43, | 1158,44, | 1158,45, | 1158,46, | 1158,47, | 1158,48, | 1158,49, | 1158,50, | 1158,51, | 1158,52, | 1158,53, | 1158,54, | 1158,55, | 1158,56, | 1158,57, | 1158,58, | 1158,59, | 1158,60, | 1158,61, | 1158,62, | 1158,63, | 1158,64, | 1158,65, | 1158,66, | 1158,67, | 1158,68, | 1158,69, | 1158,70, | 1158,71, | 1158,72, | 1158,73, | 1158,74, | 1158,75, | 1158,76, | 1158,77, | 1158,78, | 1158,79, | 1158,80, | 1158,81, | 1158,82, | 1158,83, | 1158,84, | 1158,85, | 1159,1, | 1159,2, | 1159,3, | 1159,4, | 1159,5, | 1159,6, | 1159,7, | 1159,8, | 1159,9, | 1159,10, | 1159,11, | 1159,12, | 1159,13, | 1159,14, | 1159,15, | 1159,16, | 1159,17, | 1159,18, | 1159,19, | 1159,20, | 1159,21, | 1159,22, | 1159,23, | 1159,24, | 1159,25, | 1159,26, | 1159,27, | 1159,28, | 1159,29, | 1159,30, | 1159,31, | 1159,32, | 1159,33, | 1159,34, | 1159,35, | 1159,36, | 1159,37, | 1159,38, | 1159,39, | 1159,40, | 1159,41, | 1159,42, | 1159,43, | 1159,44, | 1159,45, | 1159,46, | 1159,47, | 1159,48, | 1159,49, | 1159,50, | 1159,51, | 1159,52, | 1159,53, | 1159,54, | 1159,55, | 1159,56, | 1159,57, | 1159,58, | 1159,59, | 1159,60, | 1159,61, | 1159,62, | 1159,63, | 1159,64, | 1159,65, | 1159,66, | 1159,67, | 1159,68, | 1159,69, | 1159,70, | 1159,71, | 1159,72, | 1159,73, | 1159,74, | 1159,75, | 1159,76, | 1159,77, | 1159,78, | 1159,79, | 1159,80, | 1159,81, | 1159,82, | 1159,83, | 1159,84, | 1159,85, | 1160,1, | 1160,2, | 1160,3, | 1160,4, | 1160,5, | 1160,6, | 1160,7, | 1160,8, | 1160,9, | 1160,10, | 1160,11, | 1160,12, | 1160,13, | 1160,14, | 1160,15, | 1160,16, | 1160,17, | 1160,18, | 1160,19, | 1160,20, | 1160,21, | 1160,22, | 1160,23, | 1160,24, | 1160,25, | 1160,26, | 1160,27, | 1160,28, | 1160,29, | 1160,30, | 1160,31, | 1160,32, | 1160,33, | 1160,34, | 1160,35, | 1160,36, | 1160,37, | 1160,38, | 1160,39, | 1160,40, | 1160,41, | 1160,42, | 1160,43, | 1160,44, | 1160,45, | 1160,46, | 1160,47, | 1160,48, | 1160,49, | 1160,50, | 1160,51, | 1160,52, | 1160,53, | 1160,54, | 1160,55, | 1160,56, | 1160,57, | 1160,58, | 1160,59, | 1160,60, | 1160,61, | 1160,62, | 1160,63, | 1160,64, | 1160,65, | 1160,66, | 1160,67, | 1160,68, | 1160,69, | 1160,70, | 1160,71, | 1160,72, | 1160,73, | 1160,74, | 1160,75, | 1160,76, | 1160,77, | 1160,78, | 1160,79, | 1160,80, | 1160,81, | 1160,82, | 1160,83, | 1160,84, | 1160,85, | 1161,1, | 1161,2, | 1161,3, | 1161,4, | 1161,5, | 1161,6, | 1161,7, | 1161,8, | 1161,9, | 1161,10, | 1161,11, | 1161,12, | 1161,13, | 1161,14, | 1161,15, | 1161,16, | 1161,17, | 1161,18, | 1161,19, | 1161,20, | 1161,21, | 1161,22, | 1161,23, | 1161,24, | 1161,25, | 1161,26, | 1161,27, | 1161,28, | 1161,29, | 1161,30, | 1161,31, | 1161,32, | 1161,33, | 1161,34, | 1161,35, | 1161,36, | 1161,37, | 1161,38, | 1161,39, | 1161,40, | 1161,41, | 1161,42, | 1161,43, | 1161,44, | 1161,45, | 1161,46, | 1161,47, | 1161,48, | 1161,49, | 1161,50, | 1161,51, | 1161,52, | 1161,53, | 1161,54, | 1161,55, | 1161,56, | 1161,57, | 1161,58, | 1161,59, | 1161,60, | 1161,61, | 1161,62, | 1161,63, | 1161,64, | 1161,65, | 1161,66, | 1161,67, | 1161,68, | 1161,69, | 1161,70, | 1161,71, | 1161,72, | 1161,73, | 1161,74, | 1161,75, | 1161,76, | 1161,77, | 1161,78, | 1161,79, | 1161,80, | 1161,81, | 1161,82, | 1161,83, | 1161,84, | 1161,85, | 1162,1, | 1162,2, | 1162,3, | 1162,4, | 1162,5, | 1162,6, | 1162,7, | 1162,8, | 1162,9, | 1162,10, | 1162,11, | 1162,12, | 1162,13, | 1162,14, | 1162,15, | 1162,16, | 1162,17, | 1162,18, | 1162,19, | 1162,20, | 1162,21, | 1162,22, | 1162,23, | 1162,24, | 1162,25, | 1162,26, | 1162,27, | 1162,28, | 1162,29, | 1162,30, | 1162,31, | 1162,32, | 1162,33, | 1162,34, | 1162,35, | 1162,36, | 1162,37, | 1162,38, | 1162,39, | 1162,40, | 1162,41, | 1162,42, | 1162,43, | 1162,44, | 1162,45, | 1162,46, | 1162,47, | 1162,48, | 1162,49, | 1162,50, | 1162,51, | 1162,52, | 1162,53, | 1162,54, | 1162,55, | 1162,56, | 1162,57, | 1162,58, | 1162,59, | 1162,60, | 1162,61, | 1162,62, | 1162,63, | 1162,64, | 1162,65, | 1162,66, | 1162,67, | 1162,68, | 1162,69, | 1162,70, | 1162,71, | 1162,72, | 1162,73, | 1162,74, | 1162,75, | 1162,76, | 1162,77, | 1162,78, | 1162,79, | 1162,80, | 1162,81, | 1162,82, | 1162,83, | 1162,84, | 1162,85, | 1163,1, | 1163,2, | 1163,3, | 1163,4, | 1163,5, | 1163,6, | 1163,7, | 1163,8, | 1163,9, | 1163,10, | 1163,11, | 1163,12, | 1163,13, | 1163,14, | 1163,15, | 1163,16, | 1163,17, | 1163,18, | 1163,19, | 1163,20, | 1163,21, | 1163,22, | 1163,23, | 1163,24, | 1163,25, | 1163,26, | 1163,27, | 1163,28, | 1163,29, | 1163,30, | 1163,31, | 1163,32, | 1163,33, | 1163,34, | 1163,35, | 1163,36, | 1163,37, | 1163,38, | 1163,39, | 1163,40, | 1163,41, | 1163,42, | 1163,43, | 1163,44, | 1163,45, | 1163,46, | 1163,47, | 1163,48, | 1163,49, | 1163,50, | 1163,51, | 1163,52, | 1163,53, | 1163,54, | 1163,55, | 1163,56, | 1163,57, | 1163,58, | 1163,59, | 1163,60, | 1163,61, | 1163,62, | 1163,63, | 1163,64, | 1163,65, | 1163,66, | 1163,67, | 1163,68, | 1163,69, | 1163,70, | 1163,71, | 1163,72, | 1163,73, | 1163,74, | 1163,75, | 1163,76, | 1163,77, | 1163,78, | 1163,79, | 1163,80, | 1163,81, | 1163,82, | 1163,83, | 1163,84, | 1163,85, | 1164,1, | 1164,2, | 1164,3, | 1164,4, | 1164,5, | 1164,6, | 1164,7, | 1164,8, | 1164,9, | 1164,10, | 1164,11, | 1164,12, | 1164,13, | 1164,14, | 1164,15, | 1164,16, | 1164,17, | 1164,18, | 1164,19, | 1164,20, | 1164,21, | 1164,22, | 1164,23, | 1164,24, | 1164,25, | 1164,26, | 1164,27, | 1164,28, | 1164,29, | 1164,30, | 1164,31, | 1164,32, | 1164,33, | 1164,34, | 1164,35, | 1164,36, | 1164,37, | 1164,38, | 1164,39, | 1164,40, | 1164,41, | 1164,42, | 1164,43, | 1164,44, | 1164,45, | 1164,46, | 1164,47, | 1164,48, | 1164,49, | 1164,50, | 1164,51, | 1164,52, | 1164,53, | 1164,54, | 1164,55, | 1164,56, | 1164,57, | 1164,58, | 1164,59, | 1164,60, | 1164,61, | 1164,62, | 1164,63, | 1164,64, | 1164,65, | 1164,66, | 1164,67, | 1164,68, | 1164,69, | 1164,70, | 1164,71, | 1164,72, | 1164,73, | 1164,74, | 1164,75, | 1164,76, | 1164,77, | 1164,78, | 1164,79, | 1164,80, | 1164,81, | 1164,82, | 1164,83, | 1164,84, | 1164,85, | 1165,1, | 1165,2, | 1165,3, | 1165,4, | 1165,5, | 1165,6, | 1165,7, | 1165,8, | 1165,9, | 1165,10, | 1165,11, | 1165,12, | 1165,13, | 1165,14, | 1165,15, | 1165,16, | 1165,17, | 1165,18, | 1165,19, | 1165,20, | 1165,21, | 1165,22, | 1165,23, | 1165,24, | 1165,25, | 1165,26, | 1165,27, | 1165,28, | 1165,29, | 1165,30, | 1165,31, | 1165,32, | 1165,33, | 1165,34, | 1165,35, | 1165,36, | 1165,37, | 1165,38, | 1165,39, | 1165,40, | 1165,41, | 1165,42, | 1165,43, | 1165,44, | 1165,45, | 1165,46, | 1165,47, | 1165,48, | 1165,49, | 1165,50, | 1165,51, | 1165,52, | 1165,53, | 1165,54, | 1165,55, | 1165,56, | 1165,57, | 1165,58, | 1165,59, | 1165,60, | 1165,61, | 1165,62, | 1165,63, | 1165,64, | 1165,65, | 1165,66, | 1165,67, | 1165,68, | 1165,69, | 1165,70, | 1165,71, | 1165,72, | 1165,73, | 1165,74, | 1165,75, | 1165,76, | 1165,77, | 1165,78, | 1165,79, | 1165,80, | 1165,81, | 1165,82, | 1165,83, | 1165,84, | 1165,85, | 1166,1, | 1166,2, | 1166,3, | 1166,4, | 1166,5, | 1166,6, | 1166,7, | 1166,8, | 1166,9, | 1166,10, | 1166,11, | 1166,12, | 1166,13, | 1166,14, | 1166,15, | 1166,16, | 1166,17, | 1166,18, | 1166,19, | 1166,20, | 1166,21, | 1166,22, | 1166,23, | 1166,24, | 1166,25, | 1166,26, | 1166,27, | 1166,28, | 1166,29, | 1166,30, | 1166,31, | 1166,32, | 1166,33, | 1166,34, | 1166,35, | 1166,36, | 1166,37, | 1166,38, | 1166,39, | 1166,40, | 1166,41, | 1166,42, | 1166,43, | 1166,44, | 1166,45, | 1166,46, | 1166,47, | 1166,48, | 1166,49, | 1166,50, | 1166,51, | 1166,52, | 1166,53, | 1166,54, | 1166,55, | 1166,56, | 1166,57, | 1166,58, | 1166,59, | 1166,60, | 1166,61, | 1166,62, | 1166,63, | 1166,64, | 1166,65, | 1166,66, | 1166,67, | 1166,68, | 1166,69, | 1166,70, | 1166,71, | 1166,72, | 1166,73, | 1166,74, | 1166,75, | 1166,76, | 1166,77, | 1166,78, | 1166,79, | 1166,80, | 1166,81, | 1166,82, | 1166,83, | 1166,84, | 1166,85, | 1167,1, | 1167,2, | 1167,3, | 1167,4, | 1167,5, | 1167,6, | 1167,7, | 1167,8, | 1167,9, | 1167,10, | 1167,11, | 1167,12, | 1167,13, | 1167,14, | 1167,15, | 1167,16, | 1167,17, | 1167,18, | 1167,19, | 1167,20, | 1167,21, | 1167,22, | 1167,23, | 1167,24, | 1167,25, | 1167,26, | 1167,27, | 1167,28, | 1167,29, | 1167,30, | 1167,31, | 1167,32, | 1167,33, | 1167,34, | 1167,35, | 1167,36, | 1167,37, | 1167,38, | 1167,39, | 1167,40, | 1167,41, | 1167,42, | 1167,43, | 1167,44, | 1167,45, | 1167,46, | 1167,47, | 1167,48, | 1167,49, | 1167,50, | 1167,51, | 1167,52, | 1167,53, | 1167,54, | 1167,55, | 1167,56, | 1167,57, | 1167,58, | 1167,59, | 1167,60, | 1167,61, | 1167,62, | 1167,63, | 1167,64, | 1167,65, | 1167,66, | 1167,67, | 1167,68, | 1167,69, | 1167,70, | 1167,71, | 1167,72, | 1167,73, | 1167,74, | 1167,75, | 1167,76, | 1167,77, | 1167,78, | 1167,79, | 1167,80, | 1167,81, | 1167,82, | 1167,83, | 1167,84, | 1167,85, | 1168,1, | 1168,2, | 1168,3, | 1168,4, | 1168,5, | 1168,6, | 1168,7, | 1168,8, | 1168,9, | 1168,10, | 1168,11, | 1168,12, | 1168,13, | 1168,14, | 1168,15, | 1168,16, | 1168,17, | 1168,18, | 1168,19, | 1168,20, | 1168,21, | 1168,22, | 1168,23, | 1168,24, | 1168,25, | 1168,26, | 1168,27, | 1168,28, | 1168,29, | 1168,30, | 1168,31, | 1168,32, | 1168,33, | 1168,34, | 1168,35, | 1168,36, | 1168,37, | 1168,38, | 1168,39, | 1168,40, | 1168,41, | 1168,42, | 1168,43, | 1168,44, | 1168,45, | 1168,46, | 1168,47, | 1168,48, | 1168,49, | 1168,50, | 1168,51, | 1168,52, | 1168,53, | 1168,54, | 1168,55, | 1168,56, | 1168,57, | 1168,58, | 1168,59, | 1168,60, | 1168,61, | 1168,62, | 1168,63, | 1168,64, | 1168,65, | 1168,66, | 1168,67, | 1168,68, | 1168,69, | 1168,70, | 1168,71, | 1168,72, | 1168,73, | 1168,74, | 1168,75, | 1168,76, | 1168,77, | 1168,78, | 1168,79, | 1168,80, | 1168,81, | 1168,82, | 1168,83, | 1168,84, | 1168,85, | 1169,1, | 1169,2, | 1169,3, | 1169,4, | 1169,5, | 1169,6, | 1169,7, | 1169,8, | 1169,9, | 1169,10, | 1169,11, | 1169,12, | 1169,13, | 1169,14, | 1169,15, | 1169,16, | 1169,17, | 1169,18, | 1169,19, | 1169,20, | 1169,21, | 1169,22, | 1169,23, | 1169,24, | 1169,25, | 1169,26, | 1169,27, | 1169,28, | 1169,29, | 1169,30, | 1169,31, | 1169,32, | 1169,33, | 1169,34, | 1169,35, | 1169,36, | 1169,37, | 1169,38, | 1169,39, | 1169,40, | 1169,41, | 1169,42, | 1169,43, | 1169,44, | 1169,45, | 1169,46, | 1169,47, | 1169,48, | 1169,49, | 1169,50, | 1169,51, | 1169,52, | 1169,53, | 1169,54, | 1169,55, | 1169,56, | 1169,57, | 1169,58, | 1169,59, | 1169,60, | 1169,61, | 1169,62, | 1169,63, | 1169,64, | 1169,65, | 1169,66, | 1169,67, | 1169,68, | 1169,69, | 1169,70, | 1169,71, | 1169,72, | 1169,73, | 1169,74, | 1169,75, | 1169,76, | 1169,77, | 1169,78, | 1169,79, | 1169,80, | 1169,81, | 1169,82, | 1169,83, | 1169,84, | 1169,85, | 1170,1, | 1170,2, | 1170,3, | 1170,4, | 1170,5, | 1170,6, | 1170,7, | 1170,8, | 1170,9, | 1170,10, | 1170,11, | 1170,12, | 1170,13, | 1170,14, | 1170,15, | 1170,16, | 1170,17, | 1170,18, | 1170,19, | 1170,20, | 1170,21, | 1170,22, | 1170,23, | 1170,24, | 1170,25, | 1170,26, | 1170,27, | 1170,28, | 1170,29, | 1170,30, | 1170,31, | 1170,32, | 1170,33, | 1170,34, | 1170,35, | 1170,36, | 1170,37, | 1170,38, | 1170,39, | 1170,40, | 1170,41, | 1170,42, | 1170,43, | 1170,44, | 1170,45, | 1170,46, | 1170,47, | 1170,48, | 1170,49, | 1170,50, | 1170,51, | 1170,52, | 1170,53, | 1170,54, | 1170,55, | 1170,56, | 1170,57, | 1170,58, | 1170,59, | 1170,60, | 1170,61, | 1170,62, | 1170,63, | 1170,64, | 1170,65, | 1170,66, | 1170,67, | 1170,68, | 1170,69, | 1170,70, | 1170,71, | 1170,72, | 1170,73, | 1170,74, | 1170,75, | 1170,76, | 1170,77, | 1170,78, | 1170,79, | 1170,80, | 1170,81, | 1170,82, | 1170,83, | 1170,84, | 1170,85, | 1171,1, | 1171,2, | 1171,3, | 1171,4, | 1171,5, | 1171,6, | 1171,7, | 1171,8, | 1171,9, | 1171,10, | 1171,11, | 1171,12, | 1171,13, | 1171,14, | 1171,15, | 1171,16, | 1171,17, | 1171,18, | 1171,19, | 1171,20, | 1171,21, | 1171,22, | 1171,23, | 1171,24, | 1171,25, | 1171,26, | 1171,27, | 1171,28, | 1171,29, | 1171,30, | 1171,31, | 1171,32, | 1171,33, | 1171,34, | 1171,35, | 1171,36, | 1171,37, | 1171,38, | 1171,39, | 1171,40, | 1171,41, | 1171,42, | 1171,43, | 1171,44, | 1171,45, | 1171,46, | 1171,47, | 1171,48, | 1171,49, | 1171,50, | 1171,51, | 1171,52, | 1171,53, | 1171,54, | 1171,55, | 1171,56, | 1171,57, | 1171,58, | 1171,59, | 1171,60, | 1171,61, | 1171,62, | 1171,63, | 1171,64, | 1171,65, | 1171,66, | 1171,67, | 1171,68, | 1171,69, | 1171,70, | 1171,71, | 1171,72, | 1171,73, | 1171,74, | 1171,75, | 1171,76, | 1171,77, | 1171,78, | 1171,79, | 1171,80, | 1171,81, | 1171,82, | 1171,83, | 1171,84, | 1171,85, | 1172,1, | 1172,2, | 1172,3, | 1172,4, | 1172,5, | 1172,6, | 1172,7, | 1172,8, | 1172,9, | 1172,10, | 1172,11, | 1172,12, | 1172,13, | 1172,14, | 1172,15, | 1172,16, | 1172,17, | 1172,18, | 1172,19, | 1172,20, | 1172,21, | 1172,22, | 1172,23, | 1172,24, | 1172,25, | 1172,26, | 1172,27, | 1172,28, | 1172,29, | 1172,30, | 1172,31, | 1172,32, | 1172,33, | 1172,34, | 1172,35, | 1172,36, | 1172,37, | 1172,38, | 1172,39, | 1172,40, | 1172,41, | 1172,42, | 1172,43, | 1172,44, | 1172,45, | 1172,46, | 1172,47, | 1172,48, | 1172,49, | 1172,50, | 1172,51, | 1172,52, | 1172,53, | 1172,54, | 1172,55, | 1172,56, | 1172,57, | 1172,58, | 1172,59, | 1172,60, | 1172,61, | 1172,62, | 1172,63, | 1172,64, | 1172,65, | 1172,66, | 1172,67, | 1172,68, | 1172,69, | 1172,70, | 1172,71, | 1172,72, | 1172,73, | 1172,74, | 1172,75, | 1172,76, | 1172,77, | 1172,78, | 1172,79, | 1172,80, | 1172,81, | 1172,82, | 1172,83, | 1172,84, | 1172,85, | 1173,1, | 1173,2, | 1173,3, | 1173,4, | 1173,5, | 1173,6, | 1173,7, | 1173,8, | 1173,9, | 1173,10, | 1173,11, | 1173,12, | 1173,13, | 1173,14, | 1173,15, | 1173,16, | 1173,17, | 1173,18, | 1173,19, | 1173,20, | 1173,21, | 1173,22, | 1173,23, | 1173,24, | 1173,25, | 1173,26, | 1173,27, | 1173,28, | 1173,29, | 1173,30, | 1173,31, | 1173,32, | 1173,33, | 1173,34, | 1173,35, | 1173,36, | 1173,37, | 1173,38, | 1173,39, | 1173,40, | 1173,41, | 1173,42, | 1173,43, | 1173,44, | 1173,45, | 1173,46, | 1173,47, | 1173,48, | 1173,49, | 1173,50, | 1173,51, | 1173,52, | 1173,53, | 1173,54, | 1173,55, | 1173,56, | 1173,57, | 1173,58, | 1173,59, | 1173,60, | 1173,61, | 1173,62, | 1173,63, | 1173,64, | 1173,65, | 1173,66, | 1173,67, | 1173,68, | 1173,69, | 1173,70, | 1173,71, | 1173,72, | 1173,73, | 1173,74, | 1173,75, | 1173,76, | 1173,77, | 1173,78, | 1173,79, | 1173,80, | 1173,81, | 1173,82, | 1173,83, | 1173,84, | 1173,85, | 1174,1, | 1174,2, | 1174,3, | 1174,4, | 1174,5, | 1174,6, | 1174,7, | 1174,8, | 1174,9, | 1174,10, | 1174,11, | 1174,12, | 1174,13, | 1174,14, | 1174,15, | 1174,16, | 1174,17, | 1174,18, | 1174,19, | 1174,20, | 1174,21, | 1174,22, | 1174,23, | 1174,24, | 1174,25, | 1174,26, | 1174,27, | 1174,28, | 1174,29, | 1174,30, | 1174,31, | 1174,32, | 1174,33, | 1174,34, | 1174,35, | 1174,36, | 1174,37, | 1174,38, | 1174,39, | 1174,40, | 1174,41, | 1174,42, | 1174,43, | 1174,44, | 1174,45, | 1174,46, | 1174,47, | 1174,48, | 1174,49, | 1174,50, | 1174,51, | 1174,52, | 1174,53, | 1174,54, | 1174,55, | 1174,56, | 1174,57, | 1174,58, | 1174,59, | 1174,60, | 1174,61, | 1174,62, | 1174,63, | 1174,64, | 1174,65, | 1174,66, | 1174,67, | 1174,68, | 1174,69, | 1174,70, | 1174,71, | 1174,72, | 1174,73, | 1174,74, | 1174,75, | 1174,76, | 1174,77, | 1174,78, | 1174,79, | 1174,80, | 1174,81, | 1174,82, | 1174,83, | 1174,84, | 1174,85, | 1175,1, | 1175,2, | 1175,3, | 1175,4, | 1175,5, | 1175,6, | 1175,7, | 1175,8, | 1175,9, | 1175,10, | 1175,11, | 1175,12, | 1175,13, | 1175,14, | 1175,15, | 1175,16, | 1175,17, | 1175,18, | 1175,19, | 1175,20, | 1175,21, | 1175,22, | 1175,23, | 1175,24, | 1175,25, | 1175,26, | 1175,27, | 1175,28, | 1175,29, | 1175,30, | 1175,31, | 1175,32, | 1175,33, | 1175,34, | 1175,35, | 1175,36, | 1175,37, | 1175,38, | 1175,39, | 1175,40, | 1175,41, | 1175,42, | 1175,43, | 1175,44, | 1175,45, | 1175,46, | 1175,47, | 1175,48, | 1175,49, | 1175,50, | 1175,51, | 1175,52, | 1175,53, | 1175,54, | 1175,55, | 1175,56, | 1175,57, | 1175,58, | 1175,59, | 1175,60, | 1175,61, | 1175,62, | 1175,63, | 1175,64, | 1175,65, | 1175,66, | 1175,67, | 1175,68, | 1175,69, | 1175,70, | 1175,71, | 1175,72, | 1175,73, | 1175,74, | 1175,75, | 1175,76, | 1175,77, | 1175,78, | 1175,79, | 1175,80, | 1175,81, | 1175,82, | 1175,83, | 1175,84, | 1175,85, | 1176,1, | 1176,2, | 1176,3, | 1176,4, | 1176,5, | 1176,6, | 1176,7, | 1176,8, | 1176,9, | 1176,10, | 1176,11, | 1176,12, | 1176,13, | 1176,14, | 1176,15, | 1176,16, | 1176,17, | 1176,18, | 1176,19, | 1176,20, | 1176,21, | 1176,22, | 1176,23, | 1176,24, | 1176,25, | 1176,26, | 1176,27, | 1176,28, | 1176,29, | 1176,30, | 1176,31, | 1176,32, | 1176,33, | 1176,34, | 1176,35, | 1176,36, | 1176,37, | 1176,38, | 1176,39, | 1176,40, | 1176,41, | 1176,42, | 1176,43, | 1176,44, | 1176,45, | 1176,46, | 1176,47, | 1176,48, | 1176,49, | 1176,50, | 1176,51, | 1176,52, | 1176,53, | 1176,54, | 1176,55, | 1176,56, | 1176,57, | 1176,58, | 1176,59, | 1176,60, | 1176,61, | 1176,62, | 1176,63, | 1176,64, | 1176,65, | 1176,66, | 1176,67, | 1176,68, | 1176,69, | 1176,70, | 1176,71, | 1176,72, | 1176,73, | 1176,74, | 1176,75, | 1176,76, | 1176,77, | 1176,78, | 1176,79, | 1176,80, | 1176,81, | 1176,82, | 1176,83, | 1176,84, | 1176,85, | 1177,1, | 1177,2, | 1177,3, | 1177,4, | 1177,5, | 1177,6, | 1177,7, | 1177,8, | 1177,9, | 1177,10, | 1177,11, | 1177,12, | 1177,13, | 1177,14, | 1177,15, | 1177,16, | 1177,17, | 1177,18, | 1177,19, | 1177,20, | 1177,21, | 1177,22, | 1177,23, | 1177,24, | 1177,25, | 1177,26, | 1177,27, | 1177,28, | 1177,29, | 1177,30, | 1177,31, | 1177,32, | 1177,33, | 1177,34, | 1177,35, | 1177,36, | 1177,37, | 1177,38, | 1177,39, | 1177,40, | 1177,41, | 1177,42, | 1177,43, | 1177,44, | 1177,45, | 1177,46, | 1177,47, | 1177,48, | 1177,49, | 1177,50, | 1177,51, | 1177,52, | 1177,53, | 1177,54, | 1177,55, | 1177,56, | 1177,57, | 1177,58, | 1177,59, | 1177,60, | 1177,61, | 1177,62, | 1177,63, | 1177,64, | 1177,65, | 1177,66, | 1177,67, | 1177,68, | 1177,69, | 1177,70, | 1177,71, | 1177,72, | 1177,73, | 1177,74, | 1177,75, | 1177,76, | 1177,77, | 1177,78, | 1177,79, | 1177,80, | 1177,81, | 1177,82, | 1177,83, | 1177,84, | 1177,85, | 1178,1, | 1178,2, | 1178,3, | 1178,4, | 1178,5, | 1178,6, | 1178,7, | 1178,8, | 1178,9, | 1178,10, | 1178,11, | 1178,12, | 1178,13, | 1178,14, | 1178,15, | 1178,16, | 1178,17, | 1178,18, | 1178,19, | 1178,20, | 1178,21, | 1178,22, | 1178,23, | 1178,24, | 1178,25, | 1178,26, | 1178,27, | 1178,28, | 1178,29, | 1178,30, | 1178,31, | 1178,32, | 1178,33, | 1178,34, | 1178,35, | 1178,36, | 1178,37, | 1178,38, | 1178,39, | 1178,40, | 1178,41, | 1178,42, | 1178,43, | 1178,44, | 1178,45, | 1178,46, | 1178,47, | 1178,48, | 1178,49, | 1178,50, | 1178,51, | 1178,52, | 1178,53, | 1178,54, | 1178,55, | 1178,56, | 1178,57, | 1178,58, | 1178,59, | 1178,60, | 1178,61, | 1178,62, | 1178,63, | 1178,64, | 1178,65, | 1178,66, | 1178,67, | 1178,68, | 1178,69, | 1178,70, | 1178,71, | 1178,72, | 1178,73, | 1178,74, | 1178,75, | 1178,76, | 1178,77, | 1178,78, | 1178,79, | 1178,80, | 1178,81, | 1178,82, | 1178,83, | 1178,84, | 1178,85, | 1179,1, | 1179,2, | 1179,3, | 1179,4, | 1179,5, | 1179,6, | 1179,7, | 1179,8, | 1179,9, | 1179,10, | 1179,11, | 1179,12, | 1179,13, | 1179,14, | 1179,15, | 1179,16, | 1179,17, | 1179,18, | 1179,19, | 1179,20, | 1179,21, | 1179,22, | 1179,23, | 1179,24, | 1179,25, | 1179,26, | 1179,27, | 1179,28, | 1179,29, | 1179,30, | 1179,31, | 1179,32, | 1179,33, | 1179,34, | 1179,35, | 1179,36, | 1179,37, | 1179,38, | 1179,39, | 1179,40, | 1179,41, | 1179,42, | 1179,43, | 1179,44, | 1179,45, | 1179,46, | 1179,47, | 1179,48, | 1179,49, | 1179,50, | 1179,51, | 1179,52, | 1179,53, | 1179,54, | 1179,55, | 1179,56, | 1179,57, | 1179,58, | 1179,59, | 1179,60, | 1179,61, | 1179,62, | 1179,63, | 1179,64, | 1179,65, | 1179,66, | 1179,67, | 1179,68, | 1179,69, | 1179,70, | 1179,71, | 1179,72, | 1179,73, | 1179,74, | 1179,75, | 1179,76, | 1179,77, | 1179,78, | 1179,79, | 1179,80, | 1179,81, | 1179,82, | 1179,83, | 1179,84, | 1179,85, | 1180,1, | 1180,2, | 1180,3, | 1180,4, | 1180,5, | 1180,6, | 1180,7, | 1180,8, | 1180,9, | 1180,10, | 1180,11, | 1180,12, | 1180,13, | 1180,14, | 1180,15, | 1180,16, | 1180,17, | 1180,18, | 1180,19, | 1180,20, | 1180,21, | 1180,22, | 1180,23, | 1180,24, | 1180,25, | 1180,26, | 1180,27, | 1180,28, | 1180,29, | 1180,30, | 1180,31, | 1180,32, | 1180,33, | 1180,34, | 1180,35, | 1180,36, | 1180,37, | 1180,38, | 1180,39, | 1180,40, | 1180,41, | 1180,42, | 1180,43, | 1180,44, | 1180,45, | 1180,46, | 1180,47, | 1180,48, | 1180,49, | 1180,50, | 1180,51, | 1180,52, | 1180,53, | 1180,54, | 1180,55, | 1180,56, | 1180,57, | 1180,58, | 1180,59, | 1180,60, | 1180,61, | 1180,62, | 1180,63, | 1180,64, | 1180,65, | 1180,66, | 1180,67, | 1180,68, | 1180,69, | 1180,70, | 1180,71, | 1180,72, | 1180,73, | 1180,74, | 1180,75, | 1180,76, | 1180,77, | 1180,78, | 1180,79, | 1180,80, | 1180,81, | 1180,82, | 1180,83, | 1180,84, | 1180,85, | 1181,1, | 1181,2, | 1181,3, | 1181,4, | 1181,5, | 1181,6, | 1181,7, | 1181,8, | 1181,9, | 1181,10, | 1181,11, | 1181,12, | 1181,13, | 1181,14, | 1181,15, | 1181,16, | 1181,17, | 1181,18, | 1181,19, | 1181,20, | 1181,21, | 1181,22, | 1181,23, | 1181,24, | 1181,25, | 1181,26, | 1181,27, | 1181,28, | 1181,29, | 1181,30, | 1181,31, | 1181,32, | 1181,33, | 1181,34, | 1181,35, | 1181,36, | 1181,37, | 1181,38, | 1181,39, | 1181,40, | 1181,41, | 1181,42, | 1181,43, | 1181,44, | 1181,45, | 1181,46, | 1181,47, | 1181,48, | 1181,49, | 1181,50, | 1181,51, | 1181,52, | 1181,53, | 1181,54, | 1181,55, | 1181,56, | 1181,57, | 1181,58, | 1181,59, | 1181,60, | 1181,61, | 1181,62, | 1181,63, | 1181,64, | 1181,65, | 1181,66, | 1181,67, | 1181,68, | 1181,69, | 1181,70, | 1181,71, | 1181,72, | 1181,73, | 1181,74, | 1181,75, | 1181,76, | 1181,77, | 1181,78, | 1181,79, | 1181,80, | 1181,81, | 1181,82, | 1181,83, | 1181,84, | 1181,85, | 1182,1, | 1182,2, | 1182,3, | 1182,4, | 1182,5, | 1182,6, | 1182,7, | 1182,8, | 1182,9, | 1182,10, | 1182,11, | 1182,12, | 1182,13, | 1182,14, | 1182,15, | 1182,16, | 1182,17, | 1182,18, | 1182,19, | 1182,20, | 1182,21, | 1182,22, | 1182,23, | 1182,24, | 1182,25, | 1182,26, | 1182,27, | 1182,28, | 1182,29, | 1182,30, | 1182,31, | 1182,32, | 1182,33, | 1182,34, | 1182,35, | 1182,36, | 1182,37, | 1182,38, | 1182,39, | 1182,40, | 1182,41, | 1182,42, | 1182,43, | 1182,44, | 1182,45, | 1182,46, | 1182,47, | 1182,48, | 1182,49, | 1182,50, | 1182,51, | 1182,52, | 1182,53, | 1182,54, | 1182,55, | 1182,56, | 1182,57, | 1182,58, | 1182,59, | 1182,60, | 1182,61, | 1182,62, | 1182,63, | 1182,64, | 1182,65, | 1182,66, | 1182,67, | 1182,68, | 1182,69, | 1182,70, | 1182,71, | 1182,72, | 1182,73, | 1182,74, | 1182,75, | 1182,76, | 1182,77, | 1182,78, | 1182,79, | 1182,80, | 1182,81, | 1182,82, | 1182,83, | 1182,84, | 1182,85, | 1183,1, | 1183,2, | 1183,3, | 1183,4, | 1183,5, | 1183,6, | 1183,7, | 1183,8, | 1183,9, | 1183,10, | 1183,11, | 1183,12, | 1183,13, | 1183,14, | 1183,15, | 1183,16, | 1183,17, | 1183,18, | 1183,19, | 1183,20, | 1183,21, | 1183,22, | 1183,23, | 1183,24, | 1183,25, | 1183,26, | 1183,27, | 1183,28, | 1183,29, | 1183,30, | 1183,31, | 1183,32, | 1183,33, | 1183,34, | 1183,35, | 1183,36, | 1183,37, | 1183,38, | 1183,39, | 1183,40, | 1183,41, | 1183,42, | 1183,43, | 1183,44, | 1183,45, | 1183,46, | 1183,47, | 1183,48, | 1183,49, | 1183,50, | 1183,51, | 1183,52, | 1183,53, | 1183,54, | 1183,55, | 1183,56, | 1183,57, | 1183,58, | 1183,59, | 1183,60, | 1183,61, | 1183,62, | 1183,63, | 1183,64, | 1183,65, | 1183,66, | 1183,67, | 1183,68, | 1183,69, | 1183,70, | 1183,71, | 1183,72, | 1183,73, | 1183,74, | 1183,75, | 1183,76, | 1183,77, | 1183,78, | 1183,79, | 1183,80, | 1183,81, | 1183,82, | 1183,83, | 1183,84, | 1183,85, | 1184,1, | 1184,2, | 1184,3, | 1184,4, | 1184,5, | 1184,6, | 1184,7, | 1184,8, | 1184,9, | 1184,10, | 1184,11, | 1184,12, | 1184,13, | 1184,14, | 1184,15, | 1184,16, | 1184,17, | 1184,18, | 1184,19, | 1184,20, | 1184,21, | 1184,22, | 1184,23, | 1184,24, | 1184,25, | 1184,26, | 1184,27, | 1184,28, | 1184,29, | 1184,30, | 1184,31, | 1184,32, | 1184,33, | 1184,34, | 1184,35, | 1184,36, | 1184,37, | 1184,38, | 1184,39, | 1184,40, | 1184,41, | 1184,42, | 1184,43, | 1184,44, | 1184,45, | 1184,46, | 1184,47, | 1184,48, | 1184,49, | 1184,50, | 1184,51, | 1184,52, | 1184,53, | 1184,54, | 1184,55, | 1184,56, | 1184,57, | 1184,58, | 1184,59, | 1184,60, | 1184,61, | 1184,62, | 1184,63, | 1184,64, | 1184,65, | 1184,66, | 1184,67, | 1184,68, | 1184,69, | 1184,70, | 1184,71, | 1184,72, | 1184,73, | 1184,74, | 1184,75, | 1184,76, | 1184,77, | 1184,78, | 1184,79, | 1184,80, | 1184,81, | 1184,82, | 1184,83, | 1184,84, | 1184,85, | 1185,1, | 1185,2, | 1185,3, | 1185,4, | 1185,5, | 1185,6, | 1185,7, | 1185,8, | 1185,9, | 1185,10, | 1185,11, | 1185,12, | 1185,13, | 1185,14, | 1185,15, | 1185,16, | 1185,17, | 1185,18, | 1185,19, | 1185,20, | 1185,21, | 1185,22, | 1185,23, | 1185,24, | 1185,25, | 1185,26, | 1185,27, | 1185,28, | 1185,29, | 1185,30, | 1185,31, | 1185,32, | 1185,33, | 1185,34, | 1185,35, | 1185,36, | 1185,37, | 1185,38, | 1185,39, | 1185,40, | 1185,41, | 1185,42, | 1185,43, | 1185,44, | 1185,45, | 1185,46, | 1185,47, | 1185,48, | 1185,49, | 1185,50, | 1185,51, | 1185,52, | 1185,53, | 1185,54, | 1185,55, | 1185,56, | 1185,57, | 1185,58, | 1185,59, | 1185,60, | 1185,61, | 1185,62, | 1185,63, | 1185,64, | 1185,65, | 1185,66, | 1185,67, | 1185,68, | 1185,69, | 1185,70, | 1185,71, | 1185,72, | 1185,73, | 1185,74, | 1185,75, | 1185,76, | 1185,77, | 1185,78, | 1185,79, | 1185,80, | 1185,81, | 1185,82, | 1185,83, | 1185,84, | 1185,85, | 1186,1, | 1186,2, | 1186,3, | 1186,4, | 1186,5, | 1186,6, | 1186,7, | 1186,8, | 1186,9, | 1186,10, | 1186,11, | 1186,12, | 1186,13, | 1186,14, | 1186,15, | 1186,16, | 1186,17, | 1186,18, | 1186,19, | 1186,20, | 1186,21, | 1186,22, | 1186,23, | 1186,24, | 1186,25, | 1186,26, | 1186,27, | 1186,28, | 1186,29, | 1186,30, | 1186,31, | 1186,32, | 1186,33, | 1186,34, | 1186,35, | 1186,36, | 1186,37, | 1186,38, | 1186,39, | 1186,40, | 1186,41, | 1186,42, | 1186,43, | 1186,44, | 1186,45, | 1186,46, | 1186,47, | 1186,48, | 1186,49, | 1186,50, | 1186,51, | 1186,52, | 1186,53, | 1186,54, | 1186,55, | 1186,56, | 1186,57, | 1186,58, | 1186,59, | 1186,60, | 1186,61, | 1186,62, | 1186,63, | 1186,64, | 1186,65, | 1186,66, | 1186,67, | 1186,68, | 1186,69, | 1186,70, | 1186,71, | 1186,72, | 1186,73, | 1186,74, | 1186,75, | 1186,76, | 1186,77, | 1186,78, | 1186,79, | 1186,80, | 1186,81, | 1186,82, | 1186,83, | 1186,84, | 1186,85, | 1187,1, | 1187,2, | 1187,3, | 1187,4, | 1187,5, | 1187,6, | 1187,7, | 1187,8, | 1187,9, | 1187,10, | 1187,11, | 1187,12, | 1187,13, | 1187,14, | 1187,15, | 1187,16, | 1187,17, | 1187,18, | 1187,19, | 1187,20, | 1187,21, | 1187,22, | 1187,23, | 1187,24, | 1187,25, | 1187,26, | 1187,27, | 1187,28, | 1187,29, | 1187,30, | 1187,31, | 1187,32, | 1187,33, | 1187,34, | 1187,35, | 1187,36, | 1187,37, | 1187,38, | 1187,39, | 1187,40, | 1187,41, | 1187,42, | 1187,43, | 1187,44, | 1187,45, | 1187,46, | 1187,47, | 1187,48, | 1187,49, | 1187,50, | 1187,51, | 1187,52, | 1187,53, | 1187,54, | 1187,55, | 1187,56, | 1187,57, | 1187,58, | 1187,59, | 1187,60, | 1187,61, | 1187,62, | 1187,63, | 1187,64, | 1187,65, | 1187,66, | 1187,67, | 1187,68, | 1187,69, | 1187,70, | 1187,71, | 1187,72, | 1187,73, | 1187,74, | 1187,75, | 1187,76, | 1187,77, | 1187,78, | 1187,79, | 1187,80, | 1187,81, | 1187,82, | 1187,83, | 1187,84, | 1187,85, | 1188,1, | 1188,2, | 1188,3, | 1188,4, | 1188,5, | 1188,6, | 1188,7, | 1188,8, | 1188,9, | 1188,10, | 1188,11, | 1188,12, | 1188,13, | 1188,14, | 1188,15, | 1188,16, | 1188,17, | 1188,18, | 1188,19, | 1188,20, | 1188,21, | 1188,22, | 1188,23, | 1188,24, | 1188,25, | 1188,26, | 1188,27, | 1188,28, | 1188,29, | 1188,30, | 1188,31, | 1188,32, | 1188,33, | 1188,34, | 1188,35, | 1188,36, | 1188,37, | 1188,38, | 1188,39, | 1188,40, | 1188,41, | 1188,42, | 1188,43, | 1188,44, | 1188,45, | 1188,46, | 1188,47, | 1188,48, | 1188,49, | 1188,50, | 1188,51, | 1188,52, | 1188,53, | 1188,54, | 1188,55, | 1188,56, | 1188,57, | 1188,58, | 1188,59, | 1188,60, | 1188,61, | 1188,62, | 1188,63, | 1188,64, | 1188,65, | 1188,66, | 1188,67, | 1188,68, | 1188,69, | 1188,70, | 1188,71, | 1188,72, | 1188,73, | 1188,74, | 1188,75, | 1188,76, | 1188,77, | 1188,78, | 1188,79, | 1188,80, | 1188,81, | 1188,82, | 1188,83, | 1188,84, | 1188,85, | 1189,1, | 1189,2, | 1189,3, | 1189,4, | 1189,5, | 1189,6, | 1189,7, | 1189,8, | 1189,9, | 1189,10, | 1189,11, | 1189,12, | 1189,13, | 1189,14, | 1189,15, | 1189,16, | 1189,17, | 1189,18, | 1189,19, | 1189,20, | 1189,21, | 1189,22, | 1189,23, | 1189,24, | 1189,25, | 1189,26, | 1189,27, | 1189,28, | 1189,29, | 1189,30, | 1189,31, | 1189,32, | 1189,33, | 1189,34, | 1189,35, | 1189,36, | 1189,37, | 1189,38, | 1189,39, | 1189,40, | 1189,41, | 1189,42, | 1189,43, | 1189,44, | 1189,45, | 1189,46, | 1189,47, | 1189,48, | 1189,49, | 1189,50, | 1189,51, | 1189,52, | 1189,53, | 1189,54, | 1189,55, | 1189,56, | 1189,57, | 1189,58, | 1189,59, | 1189,60, | 1189,61, | 1189,62, | 1189,63, | 1189,64, | 1189,65, | 1189,66, | 1189,67, | 1189,68, | 1189,69, | 1189,70, | 1189,71, | 1189,72, | 1189,73, | 1189,74, | 1189,75, | 1189,76, | 1189,77, | 1189,78, | 1189,79, | 1189,80, | 1189,81, | 1189,82, | 1189,83, | 1189,84, | 1189,85, | 1190,1, | 1190,2, | 1190,3, | 1190,4, | 1190,5, | 1190,6, | 1190,7, | 1190,8, | 1190,9, | 1190,10, | 1190,11, | 1190,12, | 1190,13, | 1190,14, | 1190,15, | 1190,16, | 1190,17, | 1190,18, | 1190,19, | 1190,20, | 1190,21, | 1190,22, | 1190,23, | 1190,24, | 1190,25, | 1190,26, | 1190,27, | 1190,28, | 1190,29, | 1190,30, | 1190,31, | 1190,32, | 1190,33, | 1190,34, | 1190,35, | 1190,36, | 1190,37, | 1190,38, | 1190,39, | 1190,40, | 1190,41, | 1190,42, | 1190,43, | 1190,44, | 1190,45, | 1190,46, | 1190,47, | 1190,48, | 1190,49, | 1190,50, | 1190,51, | 1190,52, | 1190,53, | 1190,54, | 1190,55, | 1190,56, | 1190,57, | 1190,58, | 1190,59, | 1190,60, | 1190,61, | 1190,62, | 1190,63, | 1190,64, | 1190,65, | 1190,66, | 1190,67, | 1190,68, | 1190,69, | 1190,70, | 1190,71, | 1190,72, | 1190,73, | 1190,74, | 1190,75, | 1190,76, | 1190,77, | 1190,78, | 1190,79, | 1190,80, | 1190,81, | 1190,82, | 1190,83, | 1190,84, | 1190,85, | 1191,1, | 1191,2, | 1191,3, | 1191,4, | 1191,5, | 1191,6, | 1191,7, | 1191,8, | 1191,9, | 1191,10, | 1191,11, | 1191,12, | 1191,13, | 1191,14, | 1191,15, | 1191,16, | 1191,17, | 1191,18, | 1191,19, | 1191,20, | 1191,21, | 1191,22, | 1191,23, | 1191,24, | 1191,25, | 1191,26, | 1191,27, | 1191,28, | 1191,29, | 1191,30, | 1191,31, | 1191,32, | 1191,33, | 1191,34, | 1191,35, | 1191,36, | 1191,37, | 1191,38, | 1191,39, | 1191,40, | 1191,41, | 1191,42, | 1191,43, | 1191,44, | 1191,45, | 1191,46, | 1191,47, | 1191,48, | 1191,49, | 1191,50, | 1191,51, | 1191,52, | 1191,53, | 1191,54, | 1191,55, | 1191,56, | 1191,57, | 1191,58, | 1191,59, | 1191,60, | 1191,61, | 1191,62, | 1191,63, | 1191,64, | 1191,65, | 1191,66, | 1191,67, | 1191,68, | 1191,69, | 1191,70, | 1191,71, | 1191,72, | 1191,73, | 1191,74, | 1191,75, | 1191,76, | 1191,77, | 1191,78, | 1191,79, | 1191,80, | 1191,81, | 1191,82, | 1191,83, | 1191,84, | 1191,85, | 1192,1, | 1192,2, | 1192,3, | 1192,4, | 1192,5, | 1192,6, | 1192,7, | 1192,8, | 1192,9, | 1192,10, | 1192,11, | 1192,12, | 1192,13, | 1192,14, | 1192,15, | 1192,16, | 1192,17, | 1192,18, | 1192,19, | 1192,20, | 1192,21, | 1192,22, | 1192,23, | 1192,24, | 1192,25, | 1192,26, | 1192,27, | 1192,28, | 1192,29, | 1192,30, | 1192,31, | 1192,32, | 1192,33, | 1192,34, | 1192,35, | 1192,36, | 1192,37, | 1192,38, | 1192,39, | 1192,40, | 1192,41, | 1192,42, | 1192,43, | 1192,44, | 1192,45, | 1192,46, | 1192,47, | 1192,48, | 1192,49, | 1192,50, | 1192,51, | 1192,52, | 1192,53, | 1192,54, | 1192,55, | 1192,56, | 1192,57, | 1192,58, | 1192,59, | 1192,60, | 1192,61, | 1192,62, | 1192,63, | 1192,64, | 1192,65, | 1192,66, | 1192,67, | 1192,68, | 1192,69, | 1192,70, | 1192,71, | 1192,72, | 1192,73, | 1192,74, | 1192,75, | 1192,76, | 1192,77, | 1192,78, | 1192,79, | 1192,80, | 1192,81, | 1192,82, | 1192,83, | 1192,84, | 1192,85, | 1193,1, | 1193,2, | 1193,3, | 1193,4, | 1193,5, | 1193,6, | 1193,7, | 1193,8, | 1193,9, | 1193,10, | 1193,11, | 1193,12, | 1193,13, | 1193,14, | 1193,15, | 1193,16, | 1193,17, | 1193,18, | 1193,19, | 1193,20, | 1193,21, | 1193,22, | 1193,23, | 1193,24, | 1193,25, | 1193,26, | 1193,27, | 1193,28, | 1193,29, | 1193,30, | 1193,31, | 1193,32, | 1193,33, | 1193,34, | 1193,35, | 1193,36, | 1193,37, | 1193,38, | 1193,39, | 1193,40, | 1193,41, | 1193,42, | 1193,43, | 1193,44, | 1193,45, | 1193,46, | 1193,47, | 1193,48, | 1193,49, | 1193,50, | 1193,51, | 1193,52, | 1193,53, | 1193,54, | 1193,55, | 1193,56, | 1193,57, | 1193,58, | 1193,59, | 1193,60, | 1193,61, | 1193,62, | 1193,63, | 1193,64, | 1193,65, | 1193,66, | 1193,67, | 1193,68, | 1193,69, | 1193,70, | 1193,71, | 1193,72, | 1193,73, | 1193,74, | 1193,75, | 1193,76, | 1193,77, | 1193,78, | 1193,79, | 1193,80, | 1193,81, | 1193,82, | 1193,83, | 1193,84, | 1193,85, | 1194,1, | 1194,2, | 1194,3, | 1194,4, | 1194,5, | 1194,6, | 1194,7, | 1194,8, | 1194,9, | 1194,10, | 1194,11, | 1194,12, | 1194,13, | 1194,14, | 1194,15, | 1194,16, | 1194,17, | 1194,18, | 1194,19, | 1194,20, | 1194,21, | 1194,22, | 1194,23, | 1194,24, | 1194,25, | 1194,26, | 1194,27, | 1194,28, | 1194,29, | 1194,30, | 1194,31, | 1194,32, | 1194,33, | 1194,34, | 1194,35, | 1194,36, | 1194,37, | 1194,38, | 1194,39, | 1194,40, | 1194,41, | 1194,42, | 1194,43, | 1194,44, | 1194,45, | 1194,46, | 1194,47, | 1194,48, | 1194,49, | 1194,50, | 1194,51, | 1194,52, | 1194,53, | 1194,54, | 1194,55, | 1194,56, | 1194,57, | 1194,58, | 1194,59, | 1194,60, | 1194,61, | 1194,62, | 1194,63, | 1194,64, | 1194,65, | 1194,66, | 1194,67, | 1194,68, | 1194,69, | 1194,70, | 1194,71, | 1194,72, | 1194,73, | 1194,74, | 1194,75, | 1194,76, | 1194,77, | 1194,78, | 1194,79, | 1194,80, | 1194,81, | 1194,82, | 1194,83, | 1194,84, | 1194,85, | 1195,1, | 1195,2, | 1195,3, | 1195,4, | 1195,5, | 1195,6, | 1195,7, | 1195,8, | 1195,9, | 1195,10, | 1195,11, | 1195,12, | 1195,13, | 1195,14, | 1195,15, | 1195,16, | 1195,17, | 1195,18, | 1195,19, | 1195,20, | 1195,21, | 1195,22, | 1195,23, | 1195,24, | 1195,25, | 1195,26, | 1195,27, | 1195,28, | 1195,29, | 1195,30, | 1195,31, | 1195,32, | 1195,33, | 1195,34, | 1195,35, | 1195,36, | 1195,37, | 1195,38, | 1195,39, | 1195,40, | 1195,41, | 1195,42, | 1195,43, | 1195,44, | 1195,45, | 1195,46, | 1195,47, | 1195,48, | 1195,49, | 1195,50, | 1195,51, | 1195,52, | 1195,53, | 1195,54, | 1195,55, | 1195,56, | 1195,57, | 1195,58, | 1195,59, | 1195,60, | 1195,61, | 1195,62, | 1195,63, | 1195,64, | 1195,65, | 1195,66, | 1195,67, | 1195,68, | 1195,69, | 1195,70, | 1195,71, | 1195,72, | 1195,73, | 1195,74, | 1195,75, | 1195,76, | 1195,77, | 1195,78, | 1195,79, | 1195,80, | 1195,81, | 1195,82, | 1195,83, | 1195,84, | 1195,85, | 1196,1, | 1196,2, | 1196,3, | 1196,4, | 1196,5, | 1196,6, | 1196,7, | 1196,8, | 1196,9, | 1196,10, | 1196,11, | 1196,12, | 1196,13, | 1196,14, | 1196,15, | 1196,16, | 1196,17, | 1196,18, | 1196,19, | 1196,20, | 1196,21, | 1196,22, | 1196,23, | 1196,24, | 1196,25, | 1196,26, | 1196,27, | 1196,28, | 1196,29, | 1196,30, | 1196,31, | 1196,32, | 1196,33, | 1196,34, | 1196,35, | 1196,36, | 1196,37, | 1196,38, | 1196,39, | 1196,40, | 1196,41, | 1196,42, | 1196,43, | 1196,44, | 1196,45, | 1196,46, | 1196,47, | 1196,48, | 1196,49, | 1196,50, | 1196,51, | 1196,52, | 1196,53, | 1196,54, | 1196,55, | 1196,56, | 1196,57, | 1196,58, | 1196,59, | 1196,60, | 1196,61, | 1196,62, | 1196,63, | 1196,64, | 1196,65, | 1196,66, | 1196,67, | 1196,68, | 1196,69, | 1196,70, | 1196,71, | 1196,72, | 1196,73, | 1196,74, | 1196,75, | 1196,76, | 1196,77, | 1196,78, | 1196,79, | 1196,80, | 1196,81, | 1196,82, | 1196,83, | 1196,84, | 1196,85, | 1197,1, | 1197,2, | 1197,3, | 1197,4, | 1197,5, | 1197,6, | 1197,7, | 1197,8, | 1197,9, | 1197,10, | 1197,11, | 1197,12, | 1197,13, | 1197,14, | 1197,15, | 1197,16, | 1197,17, | 1197,18, | 1197,19, | 1197,20, | 1197,21, | 1197,22, | 1197,23, | 1197,24, | 1197,25, | 1197,26, | 1197,27, | 1197,28, | 1197,29, | 1197,30, | 1197,31, | 1197,32, | 1197,33, | 1197,34, | 1197,35, | 1197,36, | 1197,37, | 1197,38, | 1197,39, | 1197,40, | 1197,41, | 1197,42, | 1197,43, | 1197,44, | 1197,45, | 1197,46, | 1197,47, | 1197,48, | 1197,49, | 1197,50, | 1197,51, | 1197,52, | 1197,53, | 1197,54, | 1197,55, | 1197,56, | 1197,57, | 1197,58, | 1197,59, | 1197,60, | 1197,61, | 1197,62, | 1197,63, | 1197,64, | 1197,65, | 1197,66, | 1197,67, | 1197,68, | 1197,69, | 1197,70, | 1197,71, | 1197,72, | 1197,73, | 1197,74, | 1197,75, | 1197,76, | 1197,77, | 1197,78, | 1197,79, | 1197,80, | 1197,81, | 1197,82, | 1197,83, | 1197,84, | 1197,85, | 1198,1, | 1198,2, | 1198,3, | 1198,4, | 1198,5, | 1198,6, | 1198,7, | 1198,8, | 1198,9, | 1198,10, | 1198,11, | 1198,12, | 1198,13, | 1198,14, | 1198,15, | 1198,16, | 1198,17, | 1198,18, | 1198,19, | 1198,20, | 1198,21, | 1198,22, | 1198,23, | 1198,24, | 1198,25, | 1198,26, | 1198,27, | 1198,28, | 1198,29, | 1198,30, | 1198,31, | 1198,32, | 1198,33, | 1198,34, | 1198,35, | 1198,36, | 1198,37, | 1198,38, | 1198,39, | 1198,40, | 1198,41, | 1198,42, | 1198,43, | 1198,44, | 1198,45, | 1198,46, | 1198,47, | 1198,48, | 1198,49, | 1198,50, | 1198,51, | 1198,52, | 1198,53, | 1198,54, | 1198,55, | 1198,56, | 1198,57, | 1198,58, | 1198,59, | 1198,60, | 1198,61, | 1198,62, | 1198,63, | 1198,64, | 1198,65, | 1198,66, | 1198,67, | 1198,68, | 1198,69, | 1198,70, | 1198,71, | 1198,72, | 1198,73, | 1198,74, | 1198,75, | 1198,76, | 1198,77, | 1198,78, | 1198,79, | 1198,80, | 1198,81, | 1198,82, | 1198,83, | 1198,84, | 1198,85, | 1199,1, | 1199,2, | 1199,3, | 1199,4, | 1199,5, | 1199,6, | 1199,7, | 1199,8, | 1199,9, | 1199,10, | 1199,11, | 1199,12, | 1199,13, | 1199,14, | 1199,15, | 1199,16, | 1199,17, | 1199,18, | 1199,19, | 1199,20, | 1199,21, | 1199,22, | 1199,23, | 1199,24, | 1199,25, | 1199,26, | 1199,27, | 1199,28, | 1199,29, | 1199,30, | 1199,31, | 1199,32, | 1199,33, | 1199,34, | 1199,35, | 1199,36, | 1199,37, | 1199,38, | 1199,39, | 1199,40, | 1199,41, | 1199,42, | 1199,43, | 1199,44, | 1199,45, | 1199,46, | 1199,47, | 1199,48, | 1199,49, | 1199,50, | 1199,51, | 1199,52, | 1199,53, | 1199,54, | 1199,55, | 1199,56, | 1199,57, | 1199,58, | 1199,59, | 1199,60, | 1199,61, | 1199,62, | 1199,63, | 1199,64, | 1199,65, | 1199,66, | 1199,67, | 1199,68, | 1199,69, | 1199,70, | 1199,71, | 1199,72, | 1199,73, | 1199,74, | 1199,75, | 1199,76, | 1199,77, | 1199,78, | 1199,79, | 1199,80, | 1199,81, | 1199,82, | 1199,83, | 1199,84, | 1199,85, | 1200,1, | 1200,2, | 1200,3, | 1200,4, | 1200,5, | 1200,6, | 1200,7, | 1200,8, | 1200,9, | 1200,10, | 1200,11, | 1200,12, | 1200,13, | 1200,14, | 1200,15, | 1200,16, | 1200,17, | 1200,18, | 1200,19, | 1200,20, | 1200,21, | 1200,22, | 1200,23, | 1200,24, | 1200,25, | 1200,26, | 1200,27, | 1200,28, | 1200,29, | 1200,30, | 1200,31, | 1200,32, | 1200,33, | 1200,34, | 1200,35, | 1200,36, | 1200,37, | 1200,38, | 1200,39, | 1200,40, | 1200,41, | 1200,42, | 1200,43, | 1200,44, | 1200,45, | 1200,46, | 1200,47, | 1200,48, | 1200,49, | 1200,50, | 1200,51, | 1200,52, | 1200,53, | 1200,54, | 1200,55, | 1200,56, | 1200,57, | 1200,58, | 1200,59, | 1200,60, | 1200,61, | 1200,62, | 1200,63, | 1200,64, | 1200,65, | 1200,66, | 1200,67, | 1200,68, | 1200,69, | 1200,70, | 1200,71, | 1200,72, | 1200,73, | 1200,74, | 1200,75, | 1200,76, | 1200,77, | 1200,78, | 1200,79, | 1200,80, | 1200,81, | 1200,82, | 1200,83, | 1200,84, | 1200,85, | 1201,1, | 1201,2, | 1201,3, | 1201,4, | 1201,5, | 1201,6, | 1201,7, | 1201,8, | 1201,9, | 1201,10, | 1201,11, | 1201,12, | 1201,13, | 1201,14, | 1201,15, | 1201,16, | 1201,17, | 1201,18, | 1201,19, | 1201,20, | 1201,21, | 1201,22, | 1201,23, | 1201,24, | 1201,25, | 1201,26, | 1201,27, | 1201,28, | 1201,29, | 1201,30, | 1201,31, | 1201,32, | 1201,33, | 1201,34, | 1201,35, | 1201,36, | 1201,37, | 1201,38, | 1201,39, | 1201,40, | 1201,41, | 1201,42, | 1201,43, | 1201,44, | 1201,45, | 1201,46, | 1201,47, | 1201,48, | 1201,49, | 1201,50, | 1201,51, | 1201,52, | 1201,53, | 1201,54, | 1201,55, | 1201,56, | 1201,57, | 1201,58, | 1201,59, | 1201,60, | 1201,61, | 1201,62, | 1201,63, | 1201,64, | 1201,65, | 1201,66, | 1201,67, | 1201,68, | 1201,69, | 1201,70, | 1201,71, | 1201,72, | 1201,73, | 1201,74, | 1201,75, | 1201,76, | 1201,77, | 1201,78, | 1201,79, | 1201,80, | 1201,81, | 1201,82, | 1201,83, | 1201,84, | 1201,85, | 1202,1, | 1202,2, | 1202,3, | 1202,4, | 1202,5, | 1202,6, | 1202,7, | 1202,8, | 1202,9, | 1202,10, | 1202,11, | 1202,12, | 1202,13, | 1202,14, | 1202,15, | 1202,16, | 1202,17, | 1202,18, | 1202,19, | 1202,20, | 1202,21, | 1202,22, | 1202,23, | 1202,24, | 1202,25, | 1202,26, | 1202,27, | 1202,28, | 1202,29, | 1202,30, | 1202,31, | 1202,32, | 1202,33, | 1202,34, | 1202,35, | 1202,36, | 1202,37, | 1202,38, | 1202,39, | 1202,40, | 1202,41, | 1202,42, | 1202,43, | 1202,44, | 1202,45, | 1202,46, | 1202,47, | 1202,48, | 1202,49, | 1202,50, | 1202,51, | 1202,52, | 1202,53, | 1202,54, | 1202,55, | 1202,56, | 1202,57, | 1202,58, | 1202,59, | 1202,60, | 1202,61, | 1202,62, | 1202,63, | 1202,64, | 1202,65, | 1202,66, | 1202,67, | 1202,68, | 1202,69, | 1202,70, | 1202,71, | 1202,72, | 1202,73, | 1202,74, | 1202,75, | 1202,76, | 1202,77, | 1202,78, | 1202,79, | 1202,80, | 1202,81, | 1202,82, | 1202,83, | 1202,84, | 1202,85, | 1203,1, | 1203,2, | 1203,3, | 1203,4, | 1203,5, | 1203,6, | 1203,7, | 1203,8, | 1203,9, | 1203,10, | 1203,11, | 1203,12, | 1203,13, | 1203,14, | 1203,15, | 1203,16, | 1203,17, | 1203,18, | 1203,19, | 1203,20, | 1203,21, | 1203,22, | 1203,23, | 1203,24, | 1203,25, | 1203,26, | 1203,27, | 1203,28, | 1203,29, | 1203,30, | 1203,31, | 1203,32, | 1203,33, | 1203,34, | 1203,35, | 1203,36, | 1203,37, | 1203,38, | 1203,39, | 1203,40, | 1203,41, | 1203,42, | 1203,43, | 1203,44, | 1203,45, | 1203,46, | 1203,47, | 1203,48, | 1203,49, | 1203,50, | 1203,51, | 1203,52, | 1203,53, | 1203,54, | 1203,55, | 1203,56, | 1203,57, | 1203,58, | 1203,59, | 1203,60, | 1203,61, | 1203,62, | 1203,63, | 1203,64, | 1203,65, | 1203,66, | 1203,67, | 1203,68, | 1203,69, | 1203,70, | 1203,71, | 1203,72, | 1203,73, | 1203,74, | 1203,75, | 1203,76, | 1203,77, | 1203,78, | 1203,79, | 1203,80, | 1203,81, | 1203,82, | 1203,83, | 1203,84, | 1203,85, | 1204,1, | 1204,2, | 1204,3, | 1204,4, | 1204,5, | 1204,6, | 1204,7, | 1204,8, | 1204,9, | 1204,10, | 1204,11, | 1204,12, | 1204,13, | 1204,14, | 1204,15, | 1204,16, | 1204,17, | 1204,18, | 1204,19, | 1204,20, | 1204,21, | 1204,22, | 1204,23, | 1204,24, | 1204,25, | 1204,26, | 1204,27, | 1204,28, | 1204,29, | 1204,30, | 1204,31, | 1204,32, | 1204,33, | 1204,34, | 1204,35, | 1204,36, | 1204,37, | 1204,38, | 1204,39, | 1204,40, | 1204,41, | 1204,42, | 1204,43, | 1204,44, | 1204,45, | 1204,46, | 1204,47, | 1204,48, | 1204,49, | 1204,50, | 1204,51, | 1204,52, | 1204,53, | 1204,54, | 1204,55, | 1204,56, | 1204,57, | 1204,58, | 1204,59, | 1204,60, | 1204,61, | 1204,62, | 1204,63, | 1204,64, | 1204,65, | 1204,66, | 1204,67, | 1204,68, | 1204,69, | 1204,70, | 1204,71, | 1204,72, | 1204,73, | 1204,74, | 1204,75, | 1204,76, | 1204,77, | 1204,78, | 1204,79, | 1204,80, | 1204,81, | 1204,82, | 1204,83, | 1204,84, | 1204,85, | 1205,1, | 1205,2, | 1205,3, | 1205,4, | 1205,5, | 1205,6, | 1205,7, | 1205,8, | 1205,9, | 1205,10, | 1205,11, | 1205,12, | 1205,13, | 1205,14, | 1205,15, | 1205,16, | 1205,17, | 1205,18, | 1205,19, | 1205,20, | 1205,21, | 1205,22, | 1205,23, | 1205,24, | 1205,25, | 1205,26, | 1205,27, | 1205,28, | 1205,29, | 1205,30, | 1205,31, | 1205,32, | 1205,33, | 1205,34, | 1205,35, | 1205,36, | 1205,37, | 1205,38, | 1205,39, | 1205,40, | 1205,41, | 1205,42, | 1205,43, | 1205,44, | 1205,45, | 1205,46, | 1205,47, | 1205,48, | 1205,49, | 1205,50, | 1205,51, | 1205,52, | 1205,53, | 1205,54, | 1205,55, | 1205,56, | 1205,57, | 1205,58, | 1205,59, | 1205,60, | 1205,61, | 1205,62, | 1205,63, | 1205,64, | 1205,65, | 1205,66, | 1205,67, | 1205,68, | 1205,69, | 1205,70, | 1205,71, | 1205,72, | 1205,73, | 1205,74, | 1205,75, | 1205,76, | 1205,77, | 1205,78, | 1205,79, | 1205,80, | 1205,81, | 1205,82, | 1205,83, | 1205,84, | 1205,85, | 1206,1, | 1206,2, | 1206,3, | 1206,4, | 1206,5, | 1206,6, | 1206,7, | 1206,8, | 1206,9, | 1206,10, | 1206,11, | 1206,12, | 1206,13, | 1206,14, | 1206,15, | 1206,16, | 1206,17, | 1206,18, | 1206,19, | 1206,20, | 1206,21, | 1206,22, | 1206,23, | 1206,24, | 1206,25, | 1206,26, | 1206,27, | 1206,28, | 1206,29, | 1206,30, | 1206,31, | 1206,32, | 1206,33, | 1206,34, | 1206,35, | 1206,36, | 1206,37, | 1206,38, | 1206,39, | 1206,40, | 1206,41, | 1206,42, | 1206,43, | 1206,44, | 1206,45, | 1206,46, | 1206,47, | 1206,48, | 1206,49, | 1206,50, | 1206,51, | 1206,52, | 1206,53, | 1206,54, | 1206,55, | 1206,56, | 1206,57, | 1206,58, | 1206,59, | 1206,60, | 1206,61, | 1206,62, | 1206,63, | 1206,64, | 1206,65, | 1206,66, | 1206,67, | 1206,68, | 1206,69, | 1206,70, | 1206,71, | 1206,72, | 1206,73, | 1206,74, | 1206,75, | 1206,76, | 1206,77, | 1206,78, | 1206,79, | 1206,80, | 1206,81, | 1206,82, | 1206,83, | 1206,84, | 1206,85, | 1207,1, | 1207,2, | 1207,3, | 1207,4, | 1207,5, | 1207,6, | 1207,7, | 1207,8, | 1207,9, | 1207,10, | 1207,11, | 1207,12, | 1207,13, | 1207,14, | 1207,15, | 1207,16, | 1207,17, | 1207,18, | 1207,19, | 1207,20, | 1207,21, | 1207,22, | 1207,23, | 1207,24, | 1207,25, | 1207,26, | 1207,27, | 1207,28, | 1207,29, | 1207,30, | 1207,31, | 1207,32, | 1207,33, | 1207,34, | 1207,35, | 1207,36, | 1207,37, | 1207,38, | 1207,39, | 1207,40, | 1207,41, | 1207,42, | 1207,43, | 1207,44, | 1207,45, | 1207,46, | 1207,47, | 1207,48, | 1207,49, | 1207,50, | 1207,51, | 1207,52, | 1207,53, | 1207,54, | 1207,55, | 1207,56, | 1207,57, | 1207,58, | 1207,59, | 1207,60, | 1207,61, | 1207,62, | 1207,63, | 1207,64, | 1207,65, | 1207,66, | 1207,67, | 1207,68, | 1207,69, | 1207,70, | 1207,71, | 1207,72, | 1207,73, | 1207,74, | 1207,75, | 1207,76, | 1207,77, | 1207,78, | 1207,79, | 1207,80, | 1207,81, | 1207,82, | 1207,83, | 1207,84, | 1207,85, | 1208,1, | 1208,2, | 1208,3, | 1208,4, | 1208,5, | 1208,6, | 1208,7, | 1208,8, | 1208,9, | 1208,10, | 1208,11, | 1208,12, | 1208,13, | 1208,14, | 1208,15, | 1208,16, | 1208,17, | 1208,18, | 1208,19, | 1208,20, | 1208,21, | 1208,22, | 1208,23, | 1208,24, | 1208,25, | 1208,26, | 1208,27, | 1208,28, | 1208,29, | 1208,30, | 1208,31, | 1208,32, | 1208,33, | 1208,34, | 1208,35, | 1208,36, | 1208,37, | 1208,38, | 1208,39, | 1208,40, | 1208,41, | 1208,42, | 1208,43, | 1208,44, | 1208,45, | 1208,46, | 1208,47, | 1208,48, | 1208,49, | 1208,50, | 1208,51, | 1208,52, | 1208,53, | 1208,54, | 1208,55, | 1208,56, | 1208,57, | 1208,58, | 1208,59, | 1208,60, | 1208,61, | 1208,62, | 1208,63, | 1208,64, | 1208,65, | 1208,66, | 1208,67, | 1208,68, | 1208,69, | 1208,70, | 1208,71, | 1208,72, | 1208,73, | 1208,74, | 1208,75, | 1208,76, | 1208,77, | 1208,78, | 1208,79, | 1208,80, | 1208,81, | 1208,82, | 1208,83, | 1208,84, | 1208,85, | 1209,1, | 1209,2, | 1209,3, | 1209,4, | 1209,5, | 1209,6, | 1209,7, | 1209,8, | 1209,9, | 1209,10, | 1209,11, | 1209,12, | 1209,13, | 1209,14, | 1209,15, | 1209,16, | 1209,17, | 1209,18, | 1209,19, | 1209,20, | 1209,21, | 1209,22, | 1209,23, | 1209,24, | 1209,25, | 1209,26, | 1209,27, | 1209,28, | 1209,29, | 1209,30, | 1209,31, | 1209,32, | 1209,33, | 1209,34, | 1209,35, | 1209,36, | 1209,37, | 1209,38, | 1209,39, | 1209,40, | 1209,41, | 1209,42, | 1209,43, | 1209,44, | 1209,45, | 1209,46, | 1209,47, | 1209,48, | 1209,49, | 1209,50, | 1209,51, | 1209,52, | 1209,53, | 1209,54, | 1209,55, | 1209,56, | 1209,57, | 1209,58, | 1209,59, | 1209,60, | 1209,61, | 1209,62, | 1209,63, | 1209,64, | 1209,65, | 1209,66, | 1209,67, | 1209,68, | 1209,69, | 1209,70, | 1209,71, | 1209,72, | 1209,73, | 1209,74, | 1209,75, | 1209,76, | 1209,77, | 1209,78, | 1209,79, | 1209,80, | 1209,81, | 1209,82, | 1209,83, | 1209,84, | 1209,85, | 1210,1, | 1210,2, | 1210,3, | 1210,4, | 1210,5, | 1210,6, | 1210,7, | 1210,8, | 1210,9, | 1210,10, | 1210,11, | 1210,12, | 1210,13, | 1210,14, | 1210,15, | 1210,16, | 1210,17, | 1210,18, | 1210,19, | 1210,20, | 1210,21, | 1210,22, | 1210,23, | 1210,24, | 1210,25, | 1210,26, | 1210,27, | 1210,28, | 1210,29, | 1210,30, | 1210,31, | 1210,32, | 1210,33, | 1210,34, | 1210,35, | 1210,36, | 1210,37, | 1210,38, | 1210,39, | 1210,40, | 1210,41, | 1210,42, | 1210,43, | 1210,44, | 1210,45, | 1210,46, | 1210,47, | 1210,48, | 1210,49, | 1210,50, | 1210,51, | 1210,52, | 1210,53, | 1210,54, | 1210,55, | 1210,56, | 1210,57, | 1210,58, | 1210,59, | 1210,60, | 1210,61, | 1210,62, | 1210,63, | 1210,64, | 1210,65, | 1210,66, | 1210,67, | 1210,68, | 1210,69, | 1210,70, | 1210,71, | 1210,72, | 1210,73, | 1210,74, | 1210,75, | 1210,76, | 1210,77, | 1210,78, | 1210,79, | 1210,80, | 1210,81, | 1210,82, | 1210,83, | 1210,84, | 1210,85, | 1211,1, | 1211,2, | 1211,3, | 1211,4, | 1211,5, | 1211,6, | 1211,7, | 1211,8, | 1211,9, | 1211,10, | 1211,11, | 1211,12, | 1211,13, | 1211,14, | 1211,15, | 1211,16, | 1211,17, | 1211,18, | 1211,19, | 1211,20, | 1211,21, | 1211,22, | 1211,23, | 1211,24, | 1211,25, | 1211,26, | 1211,27, | 1211,28, | 1211,29, | 1211,30, | 1211,31, | 1211,32, | 1211,33, | 1211,34, | 1211,35, | 1211,36, | 1211,37, | 1211,38, | 1211,39, | 1211,40, | 1211,41, | 1211,42, | 1211,43, | 1211,44, | 1211,45, | 1211,46, | 1211,47, | 1211,48, | 1211,49, | 1211,50, | 1211,51, | 1211,52, | 1211,53, | 1211,54, | 1211,55, | 1211,56, | 1211,57, | 1211,58, | 1211,59, | 1211,60, | 1211,61, | 1211,62, | 1211,63, | 1211,64, | 1211,65, | 1211,66, | 1211,67, | 1211,68, | 1211,69, | 1211,70, | 1211,71, | 1211,72, | 1211,73, | 1211,74, | 1211,75, | 1211,76, | 1211,77, | 1211,78, | 1211,79, | 1211,80, | 1211,81, | 1211,82, | 1211,83, | 1211,84, | 1211,85, | 1212,1, | 1212,2, | 1212,3, | 1212,4, | 1212,5, | 1212,6, | 1212,7, | 1212,8, | 1212,9, | 1212,10, | 1212,11, | 1212,12, | 1212,13, | 1212,14, | 1212,15, | 1212,16, | 1212,17, | 1212,18, | 1212,19, | 1212,20, | 1212,21, | 1212,22, | 1212,23, | 1212,24, | 1212,25, | 1212,26, | 1212,27, | 1212,28, | 1212,29, | 1212,30, | 1212,31, | 1212,32, | 1212,33, | 1212,34, | 1212,35, | 1212,36, | 1212,37, | 1212,38, | 1212,39, | 1212,40, | 1212,41, | 1212,42, | 1212,43, | 1212,44, | 1212,45, | 1212,46, | 1212,47, | 1212,48, | 1212,49, | 1212,50, | 1212,51, | 1212,52, | 1212,53, | 1212,54, | 1212,55, | 1212,56, | 1212,57, | 1212,58, | 1212,59, | 1212,60, | 1212,61, | 1212,62, | 1212,63, | 1212,64, | 1212,65, | 1212,66, | 1212,67, | 1212,68, | 1212,69, | 1212,70, | 1212,71, | 1212,72, | 1212,73, | 1212,74, | 1212,75, | 1212,76, | 1212,77, | 1212,78, | 1212,79, | 1212,80, | 1212,81, | 1212,82, | 1212,83, | 1212,84, | 1212,85, | 1213,1, | 1213,2, | 1213,3, | 1213,4, | 1213,5, | 1213,6, | 1213,7, | 1213,8, | 1213,9, | 1213,10, | 1213,11, | 1213,12, | 1213,13, | 1213,14, | 1213,15, | 1213,16, | 1213,17, | 1213,18, | 1213,19, | 1213,20, | 1213,21, | 1213,22, | 1213,23, | 1213,24, | 1213,25, | 1213,26, | 1213,27, | 1213,28, | 1213,29, | 1213,30, | 1213,31, | 1213,32, | 1213,33, | 1213,34, | 1213,35, | 1213,36, | 1213,37, | 1213,38, | 1213,39, | 1213,40, | 1213,41, | 1213,42, | 1213,43, | 1213,44, | 1213,45, | 1213,46, | 1213,47, | 1213,48, | 1213,49, | 1213,50, | 1213,51, | 1213,52, | 1213,53, | 1213,54, | 1213,55, | 1213,56, | 1213,57, | 1213,58, | 1213,59, | 1213,60, | 1213,61, | 1213,62, | 1213,63, | 1213,64, | 1213,65, | 1213,66, | 1213,67, | 1213,68, | 1213,69, | 1213,70, | 1213,71, | 1213,72, | 1213,73, | 1213,74, | 1213,75, | 1213,76, | 1213,77, | 1213,78, | 1213,79, | 1213,80, | 1213,81, | 1213,82, | 1213,83, | 1213,84, | 1213,85, | 1214,1, | 1214,2, | 1214,3, | 1214,4, | 1214,5, | 1214,6, | 1214,7, | 1214,8, | 1214,9, | 1214,10, | 1214,11, | 1214,12, | 1214,13, | 1214,14, | 1214,15, | 1214,16, | 1214,17, | 1214,18, | 1214,19, | 1214,20, | 1214,21, | 1214,22, | 1214,23, | 1214,24, | 1214,25, | 1214,26, | 1214,27, | 1214,28, | 1214,29, | 1214,30, | 1214,31, | 1214,32, | 1214,33, | 1214,34, | 1214,35, | 1214,36, | 1214,37, | 1214,38, | 1214,39, | 1214,40, | 1214,41, | 1214,42, | 1214,43, | 1214,44, | 1214,45, | 1214,46, | 1214,47, | 1214,48, | 1214,49, | 1214,50, | 1214,51, | 1214,52, | 1214,53, | 1214,54, | 1214,55, | 1214,56, | 1214,57, | 1214,58, | 1214,59, | 1214,60, | 1214,61, | 1214,62, | 1214,63, | 1214,64, | 1214,65, | 1214,66, | 1214,67, | 1214,68, | 1214,69, | 1214,70, | 1214,71, | 1214,72, | 1214,73, | 1214,74, | 1214,75, | 1214,76, | 1214,77, | 1214,78, | 1214,79, | 1214,80, | 1214,81, | 1214,82, | 1214,83, | 1214,84, | 1214,85, | 1215,1, | 1215,2, | 1215,3, | 1215,4, | 1215,5, | 1215,6, | 1215,7, | 1215,8, | 1215,9, | 1215,10, | 1215,11, | 1215,12, | 1215,13, | 1215,14, | 1215,15, | 1215,16, | 1215,17, | 1215,18, | 1215,19, | 1215,20, | 1215,21, | 1215,22, | 1215,23, | 1215,24, | 1215,25, | 1215,26, | 1215,27, | 1215,28, | 1215,29, | 1215,30, | 1215,31, | 1215,32, | 1215,33, | 1215,34, | 1215,35, | 1215,36, | 1215,37, | 1215,38, | 1215,39, | 1215,40, | 1215,41, | 1215,42, | 1215,43, | 1215,44, | 1215,45, | 1215,46, | 1215,47, | 1215,48, | 1215,49, | 1215,50, | 1215,51, | 1215,52, | 1215,53, | 1215,54, | 1215,55, | 1215,56, | 1215,57, | 1215,58, | 1215,59, | 1215,60, | 1215,61, | 1215,62, | 1215,63, | 1215,64, | 1215,65, | 1215,66, | 1215,67, | 1215,68, | 1215,69, | 1215,70, | 1215,71, | 1215,72, | 1215,73, | 1215,74, | 1215,75, | 1215,76, | 1215,77, | 1215,78, | 1215,79, | 1215,80, | 1215,81, | 1215,82, | 1215,83, | 1215,84, | 1215,85, | 1216,1, | 1216,2, | 1216,3, | 1216,4, | 1216,5, | 1216,6, | 1216,7, | 1216,8, | 1216,9, | 1216,10, | 1216,11, | 1216,12, | 1216,13, | 1216,14, | 1216,15, | 1216,16, | 1216,17, | 1216,18, | 1216,19, | 1216,20, | 1216,21, | 1216,22, | 1216,23, | 1216,24, | 1216,25, | 1216,26, | 1216,27, | 1216,28, | 1216,29, | 1216,30, | 1216,31, | 1216,32, | 1216,33, | 1216,34, | 1216,35, | 1216,36, | 1216,37, | 1216,38, | 1216,39, | 1216,40, | 1216,41, | 1216,42, | 1216,43, | 1216,44, | 1216,45, | 1216,46, | 1216,47, | 1216,48, | 1216,49, | 1216,50, | 1216,51, | 1216,52, | 1216,53, | 1216,54, | 1216,55, | 1216,56, | 1216,57, | 1216,58, | 1216,59, | 1216,60, | 1216,61, | 1216,62, | 1216,63, | 1216,64, | 1216,65, | 1216,66, | 1216,67, | 1216,68, | 1216,69, | 1216,70, | 1216,71, | 1216,72, | 1216,73, | 1216,74, | 1216,75, | 1216,76, | 1216,77, | 1216,78, | 1216,79, | 1216,80, | 1216,81, | 1216,82, | 1216,83, | 1216,84, | 1216,85, | 1217,1, | 1217,2, | 1217,3, | 1217,4, | 1217,5, | 1217,6, | 1217,7, | 1217,8, | 1217,9, | 1217,10, | 1217,11, | 1217,12, | 1217,13, | 1217,14, | 1217,15, | 1217,16, | 1217,17, | 1217,18, | 1217,19, | 1217,20, | 1217,21, | 1217,22, | 1217,23, | 1217,24, | 1217,25, | 1217,26, | 1217,27, | 1217,28, | 1217,29, | 1217,30, | 1217,31, | 1217,32, | 1217,33, | 1217,34, | 1217,35, | 1217,36, | 1217,37, | 1217,38, | 1217,39, | 1217,40, | 1217,41, | 1217,42, | 1217,43, | 1217,44, | 1217,45, | 1217,46, | 1217,47, | 1217,48, | 1217,49, | 1217,50, | 1217,51, | 1217,52, | 1217,53, | 1217,54, | 1217,55, | 1217,56, | 1217,57, | 1217,58, | 1217,59, | 1217,60, | 1217,61, | 1217,62, | 1217,63, | 1217,64, | 1217,65, | 1217,66, | 1217,67, | 1217,68, | 1217,69, | 1217,70, | 1217,71, | 1217,72, | 1217,73, | 1217,74, | 1217,75, | 1217,76, | 1217,77, | 1217,78, | 1217,79, | 1217,80, | 1217,81, | 1217,82, | 1217,83, | 1217,84, | 1217,85, | 1218,1, | 1218,2, | 1218,3, | 1218,4, | 1218,5, | 1218,6, | 1218,7, | 1218,8, | 1218,9, | 1218,10, | 1218,11, | 1218,12, | 1218,13, | 1218,14, | 1218,15, | 1218,16, | 1218,17, | 1218,18, | 1218,19, | 1218,20, | 1218,21, | 1218,22, | 1218,23, | 1218,24, | 1218,25, | 1218,26, | 1218,27, | 1218,28, | 1218,29, | 1218,30, | 1218,31, | 1218,32, | 1218,33, | 1218,34, | 1218,35, | 1218,36, | 1218,37, | 1218,38, | 1218,39, | 1218,40, | 1218,41, | 1218,42, | 1218,43, | 1218,44, | 1218,45, | 1218,46, | 1218,47, | 1218,48, | 1218,49, | 1218,50, | 1218,51, | 1218,52, | 1218,53, | 1218,54, | 1218,55, | 1218,56, | 1218,57, | 1218,58, | 1218,59, | 1218,60, | 1218,61, | 1218,62, | 1218,63, | 1218,64, | 1218,65, | 1218,66, | 1218,67, | 1218,68, | 1218,69, | 1218,70, | 1218,71, | 1218,72, | 1218,73, | 1218,74, | 1218,75, | 1218,76, | 1218,77, | 1218,78, | 1218,79, | 1218,80, | 1218,81, | 1218,82, | 1218,83, | 1218,84, | 1218,85, | 1219,1, | 1219,2, | 1219,3, | 1219,4, | 1219,5, | 1219,6, | 1219,7, | 1219,8, | 1219,9, | 1219,10, | 1219,11, | 1219,12, | 1219,13, | 1219,14, | 1219,15, | 1219,16, | 1219,17, | 1219,18, | 1219,19, | 1219,20, | 1219,21, | 1219,22, | 1219,23, | 1219,24, | 1219,25, | 1219,26, | 1219,27, | 1219,28, | 1219,29, | 1219,30, | 1219,31, | 1219,32, | 1219,33, | 1219,34, | 1219,35, | 1219,36, | 1219,37, | 1219,38, | 1219,39, | 1219,40, | 1219,41, | 1219,42, | 1219,43, | 1219,44, | 1219,45, | 1219,46, | 1219,47, | 1219,48, | 1219,49, | 1219,50, | 1219,51, | 1219,52, | 1219,53, | 1219,54, | 1219,55, | 1219,56, | 1219,57, | 1219,58, | 1219,59, | 1219,60, | 1219,61, | 1219,62, | 1219,63, | 1219,64, | 1219,65, | 1219,66, | 1219,67, | 1219,68, | 1219,69, | 1219,70, | 1219,71, | 1219,72, | 1219,73, | 1219,74, | 1219,75, | 1219,76, | 1219,77, | 1219,78, | 1219,79, | 1219,80, | 1219,81, | 1219,82, | 1219,83, | 1219,84, | 1219,85, | 1220,1, | 1220,2, | 1220,3, | 1220,4, | 1220,5, | 1220,6, | 1220,7, | 1220,8, | 1220,9, | 1220,10, | 1220,11, | 1220,12, | 1220,13, | 1220,14, | 1220,15, | 1220,16, | 1220,17, | 1220,18, | 1220,19, | 1220,20, | 1220,21, | 1220,22, | 1220,23, | 1220,24, | 1220,25, | 1220,26, | 1220,27, | 1220,28, | 1220,29, | 1220,30, | 1220,31, | 1220,32, | 1220,33, | 1220,34, | 1220,35, | 1220,36, | 1220,37, | 1220,38, | 1220,39, | 1220,40, | 1220,41, | 1220,42, | 1220,43, | 1220,44, | 1220,45, | 1220,46, | 1220,47, | 1220,48, | 1220,49, | 1220,50, | 1220,51, | 1220,52, | 1220,53, | 1220,54, | 1220,55, | 1220,56, | 1220,57, | 1220,58, | 1220,59, | 1220,60, | 1220,61, | 1220,62, | 1220,63, | 1220,64, | 1220,65, | 1220,66, | 1220,67, | 1220,68, | 1220,69, | 1220,70, | 1220,71, | 1220,72, | 1220,73, | 1220,74, | 1220,75, | 1220,76, | 1220,77, | 1220,78, | 1220,79, | 1220,80, | 1220,81, | 1220,82, | 1220,83, | 1220,84, | 1220,85, | 1221,1, | 1221,2, | 1221,3, | 1221,4, | 1221,5, | 1221,6, | 1221,7, | 1221,8, | 1221,9, | 1221,10, | 1221,11, | 1221,12, | 1221,13, | 1221,14, | 1221,15, | 1221,16, | 1221,17, | 1221,18, | 1221,19, | 1221,20, | 1221,21, | 1221,22, | 1221,23, | 1221,24, | 1221,25, | 1221,26, | 1221,27, | 1221,28, | 1221,29, | 1221,30, | 1221,31, | 1221,32, | 1221,33, | 1221,34, | 1221,35, | 1221,36, | 1221,37, | 1221,38, | 1221,39, | 1221,40, | 1221,41, | 1221,42, | 1221,43, | 1221,44, | 1221,45, | 1221,46, | 1221,47, | 1221,48, | 1221,49, | 1221,50, | 1221,51, | 1221,52, | 1221,53, | 1221,54, | 1221,55, | 1221,56, | 1221,57, | 1221,58, | 1221,59, | 1221,60, | 1221,61, | 1221,62, | 1221,63, | 1221,64, | 1221,65, | 1221,66, | 1221,67, | 1221,68, | 1221,69, | 1221,70, | 1221,71, | 1221,72, | 1221,73, | 1221,74, | 1221,75, | 1221,76, | 1221,77, | 1221,78, | 1221,79, | 1221,80, | 1221,81, | 1221,82, | 1221,83, | 1221,84, | 1221,85, | 1222,1, | 1222,2, | 1222,3, | 1222,4, | 1222,5, | 1222,6, | 1222,7, | 1222,8, | 1222,9, | 1222,10, | 1222,11, | 1222,12, | 1222,13, | 1222,14, | 1222,15, | 1222,16, | 1222,17, | 1222,18, | 1222,19, | 1222,20, | 1222,21, | 1222,22, | 1222,23, | 1222,24, | 1222,25, | 1222,26, | 1222,27, | 1222,28, | 1222,29, | 1222,30, | 1222,31, | 1222,32, | 1222,33, | 1222,34, | 1222,35, | 1222,36, | 1222,37, | 1222,38, | 1222,39, | 1222,40, | 1222,41, | 1222,42, | 1222,43, | 1222,44, | 1222,45, | 1222,46, | 1222,47, | 1222,48, | 1222,49, | 1222,50, | 1222,51, | 1222,52, | 1222,53, | 1222,54, | 1222,55, | 1222,56, | 1222,57, | 1222,58, | 1222,59, | 1222,60, | 1222,61, | 1222,62, | 1222,63, | 1222,64, | 1222,65, | 1222,66, | 1222,67, | 1222,68, | 1222,69, | 1222,70, | 1222,71, | 1222,72, | 1222,73, | 1222,74, | 1222,75, | 1222,76, | 1222,77, | 1222,78, | 1222,79, | 1222,80, | 1222,81, | 1222,82, | 1222,83, | 1222,84, | 1222,85, | 1223,1, | 1223,2, | 1223,3, | 1223,4, | 1223,5, | 1223,6, | 1223,7, | 1223,8, | 1223,9, | 1223,10, | 1223,11, | 1223,12, | 1223,13, | 1223,14, | 1223,15, | 1223,16, | 1223,17, | 1223,18, | 1223,19, | 1223,20, | 1223,21, | 1223,22, | 1223,23, | 1223,24, | 1223,25, | 1223,26, | 1223,27, | 1223,28, | 1223,29, | 1223,30, | 1223,31, | 1223,32, | 1223,33, | 1223,34, | 1223,35, | 1223,36, | 1223,37, | 1223,38, | 1223,39, | 1223,40, | 1223,41, | 1223,42, | 1223,43, | 1223,44, | 1223,45, | 1223,46, | 1223,47, | 1223,48, | 1223,49, | 1223,50, | 1223,51, | 1223,52, | 1223,53, | 1223,54, | 1223,55, | 1223,56, | 1223,57, | 1223,58, | 1223,59, | 1223,60, | 1223,61, | 1223,62, | 1223,63, | 1223,64, | 1223,65, | 1223,66, | 1223,67, | 1223,68, | 1223,69, | 1223,70, | 1223,71, | 1223,72, | 1223,73, | 1223,74, | 1223,75, | 1223,76, | 1223,77, | 1223,78, | 1223,79, | 1223,80, | 1223,81, | 1223,82, | 1223,83, | 1223,84, | 1223,85, | 1224,1, | 1224,2, | 1224,3, | 1224,4, | 1224,5, | 1224,6, | 1224,7, | 1224,8, | 1224,9, | 1224,10, | 1224,11, | 1224,12, | 1224,13, | 1224,14, | 1224,15, | 1224,16, | 1224,17, | 1224,18, | 1224,19, | 1224,20, | 1224,21, | 1224,22, | 1224,23, | 1224,24, | 1224,25, | 1224,26, | 1224,27, | 1224,28, | 1224,29, | 1224,30, | 1224,31, | 1224,32, | 1224,33, | 1224,34, | 1224,35, | 1224,36, | 1224,37, | 1224,38, | 1224,39, | 1224,40, | 1224,41, | 1224,42, | 1224,43, | 1224,44, | 1224,45, | 1224,46, | 1224,47, | 1224,48, | 1224,49, | 1224,50, | 1224,51, | 1224,52, | 1224,53, | 1224,54, | 1224,55, | 1224,56, | 1224,57, | 1224,58, | 1224,59, | 1224,60, | 1224,61, | 1224,62, | 1224,63, | 1224,64, | 1224,65, | 1224,66, | 1224,67, | 1224,68, | 1224,69, | 1224,70, | 1224,71, | 1224,72, | 1224,73, | 1224,74, | 1224,75, | 1224,76, | 1224,77, | 1224,78, | 1224,79, | 1224,80, | 1224,81, | 1224,82, | 1224,83, | 1224,84, | 1224,85, | 1225,1, | 1225,2, | 1225,3, | 1225,4, | 1225,5, | 1225,6, | 1225,7, | 1225,8, | 1225,9, | 1225,10, | 1225,11, | 1225,12, | 1225,13, | 1225,14, | 1225,15, | 1225,16, | 1225,17, | 1225,18, | 1225,19, | 1225,20, | 1225,21, | 1225,22, | 1225,23, | 1225,24, | 1225,25, | 1225,26, | 1225,27, | 1225,28, | 1225,29, | 1225,30, | 1225,31, | 1225,32, | 1225,33, | 1225,34, | 1225,35, | 1225,36, | 1225,37, | 1225,38, | 1225,39, | 1225,40, | 1225,41, | 1225,42, | 1225,43, | 1225,44, | 1225,45, | 1225,46, | 1225,47, | 1225,48, | 1225,49, | 1225,50, | 1225,51, | 1225,52, | 1225,53, | 1225,54, | 1225,55, | 1225,56, | 1225,57, | 1225,58, | 1225,59, | 1225,60, | 1225,61, | 1225,62, | 1225,63, | 1225,64, | 1225,65, | 1225,66, | 1225,67, | 1225,68, | 1225,69, | 1225,70, | 1225,71, | 1225,72, | 1225,73, | 1225,74, | 1225,75, | 1225,76, | 1225,77, | 1225,78, | 1225,79, | 1225,80, | 1225,81, | 1225,82, | 1225,83, | 1225,84, | 1225,85, | 1226,1, | 1226,2, | 1226,3, | 1226,4, | 1226,5, | 1226,6, | 1226,7, | 1226,8, | 1226,9, | 1226,10, | 1226,11, | 1226,12, | 1226,13, | 1226,14, | 1226,15, | 1226,16, | 1226,17, | 1226,18, | 1226,19, | 1226,20, | 1226,21, | 1226,22, | 1226,23, | 1226,24, | 1226,25, | 1226,26, | 1226,27, | 1226,28, | 1226,29, | 1226,30, | 1226,31, | 1226,32, | 1226,33, | 1226,34, | 1226,35, | 1226,36, | 1226,37, | 1226,38, | 1226,39, | 1226,40, | 1226,41, | 1226,42, | 1226,43, | 1226,44, | 1226,45, | 1226,46, | 1226,47, | 1226,48, | 1226,49, | 1226,50, | 1226,51, | 1226,52, | 1226,53, | 1226,54, | 1226,55, | 1226,56, | 1226,57, | 1226,58, | 1226,59, | 1226,60, | 1226,61, | 1226,62, | 1226,63, | 1226,64, | 1226,65, | 1226,66, | 1226,67, | 1226,68, | 1226,69, | 1226,70, | 1226,71, | 1226,72, | 1226,73, | 1226,74, | 1226,75, | 1226,76, | 1226,77, | 1226,78, | 1226,79, | 1226,80, | 1226,81, | 1226,82, | 1226,83, | 1226,84, | 1226,85, | 1227,1, | 1227,2, | 1227,3, | 1227,4, | 1227,5, | 1227,6, | 1227,7, | 1227,8, | 1227,9, | 1227,10, | 1227,11, | 1227,12, | 1227,13, | 1227,14, | 1227,15, | 1227,16, | 1227,17, | 1227,18, | 1227,19, | 1227,20, | 1227,21, | 1227,22, | 1227,23, | 1227,24, | 1227,25, | 1227,26, | 1227,27, | 1227,28, | 1227,29, | 1227,30, | 1227,31, | 1227,32, | 1227,33, | 1227,34, | 1227,35, | 1227,36, | 1227,37, | 1227,38, | 1227,39, | 1227,40, | 1227,41, | 1227,42, | 1227,43, | 1227,44, | 1227,45, | 1227,46, | 1227,47, | 1227,48, | 1227,49, | 1227,50, | 1227,51, | 1227,52, | 1227,53, | 1227,54, | 1227,55, | 1227,56, | 1227,57, | 1227,58, | 1227,59, | 1227,60, | 1227,61, | 1227,62, | 1227,63, | 1227,64, | 1227,65, | 1227,66, | 1227,67, | 1227,68, | 1227,69, | 1227,70, | 1227,71, | 1227,72, | 1227,73, | 1227,74, | 1227,75, | 1227,76, | 1227,77, | 1227,78, | 1227,79, | 1227,80, | 1227,81, | 1227,82, | 1227,83, | 1227,84, | 1227,85, | 1228,1, | 1228,2, | 1228,3, | 1228,4, | 1228,5, | 1228,6, | 1228,7, | 1228,8, | 1228,9, | 1228,10, | 1228,11, | 1228,12, | 1228,13, | 1228,14, | 1228,15, | 1228,16, | 1228,17, | 1228,18, | 1228,19, | 1228,20, | 1228,21, | 1228,22, | 1228,23, | 1228,24, | 1228,25, | 1228,26, | 1228,27, | 1228,28, | 1228,29, | 1228,30, | 1228,31, | 1228,32, | 1228,33, | 1228,34, | 1228,35, | 1228,36, | 1228,37, | 1228,38, | 1228,39, | 1228,40, | 1228,41, | 1228,42, | 1228,43, | 1228,44, | 1228,45, | 1228,46, | 1228,47, | 1228,48, | 1228,49, | 1228,50, | 1228,51, | 1228,52, | 1228,53, | 1228,54, | 1228,55, | 1228,56, | 1228,57, | 1228,58, | 1228,59, | 1228,60, | 1228,61, | 1228,62, | 1228,63, | 1228,64, | 1228,65, | 1228,66, | 1228,67, | 1228,68, | 1228,69, | 1228,70, | 1228,71, | 1228,72, | 1228,73, | 1228,74, | 1228,75, | 1228,76, | 1228,77, | 1228,78, | 1228,79, | 1228,80, | 1228,81, | 1228,82, | 1228,83, | 1228,84, | 1228,85, | 1229,1, | 1229,2, | 1229,3, | 1229,4, | 1229,5, | 1229,6, | 1229,7, | 1229,8, | 1229,9, | 1229,10, | 1229,11, | 1229,12, | 1229,13, | 1229,14, | 1229,15, | 1229,16, | 1229,17, | 1229,18, | 1229,19, | 1229,20, | 1229,21, | 1229,22, | 1229,23, | 1229,24, | 1229,25, | 1229,26, | 1229,27, | 1229,28, | 1229,29, | 1229,30, | 1229,31, | 1229,32, | 1229,33, | 1229,34, | 1229,35, | 1229,36, | 1229,37, | 1229,38, | 1229,39, | 1229,40, | 1229,41, | 1229,42, | 1229,43, | 1229,44, | 1229,45, | 1229,46, | 1229,47, | 1229,48, | 1229,49, | 1229,50, | 1229,51, | 1229,52, | 1229,53, | 1229,54, | 1229,55, | 1229,56, | 1229,57, | 1229,58, | 1229,59, | 1229,60, | 1229,61, | 1229,62, | 1229,63, | 1229,64, | 1229,65, | 1229,66, | 1229,67, | 1229,68, | 1229,69, | 1229,70, | 1229,71, | 1229,72, | 1229,73, | 1229,74, | 1229,75, | 1229,76, | 1229,77, | 1229,78, | 1229,79, | 1229,80, | 1229,81, | 1229,82, | 1229,83, | 1229,84, | 1229,85, | 1230,1, | 1230,2, | 1230,3, | 1230,4, | 1230,5, | 1230,6, | 1230,7, | 1230,8, | 1230,9, | 1230,10, | 1230,11, | 1230,12, | 1230,13, | 1230,14, | 1230,15, | 1230,16, | 1230,17, | 1230,18, | 1230,19, | 1230,20, | 1230,21, | 1230,22, | 1230,23, | 1230,24, | 1230,25, | 1230,26, | 1230,27, | 1230,28, | 1230,29, | 1230,30, | 1230,31, | 1230,32, | 1230,33, | 1230,34, | 1230,35, | 1230,36, | 1230,37, | 1230,38, | 1230,39, | 1230,40, | 1230,41, | 1230,42, | 1230,43, | 1230,44, | 1230,45, | 1230,46, | 1230,47, | 1230,48, | 1230,49, | 1230,50, | 1230,51, | 1230,52, | 1230,53, | 1230,54, | 1230,55, | 1230,56, | 1230,57, | 1230,58, | 1230,59, | 1230,60, | 1230,61, | 1230,62, | 1230,63, | 1230,64, | 1230,65, | 1230,66, | 1230,67, | 1230,68, | 1230,69, | 1230,70, | 1230,71, | 1230,72, | 1230,73, | 1230,74, | 1230,75, | 1230,76, | 1230,77, | 1230,78, | 1230,79, | 1230,80, | 1230,81, | 1230,82, | 1230,83, | 1230,84, | 1230,85, | 1231,1, | 1231,2, | 1231,3, | 1231,4, | 1231,5, | 1231,6, | 1231,7, | 1231,8, | 1231,9, | 1231,10, | 1231,11, | 1231,12, | 1231,13, | 1231,14, | 1231,15, | 1231,16, | 1231,17, | 1231,18, | 1231,19, | 1231,20, | 1231,21, | 1231,22, | 1231,23, | 1231,24, | 1231,25, | 1231,26, | 1231,27, | 1231,28, | 1231,29, | 1231,30, | 1231,31, | 1231,32, | 1231,33, | 1231,34, | 1231,35, | 1231,36, | 1231,37, | 1231,38, | 1231,39, | 1231,40, | 1231,41, | 1231,42, | 1231,43, | 1231,44, | 1231,45, | 1231,46, | 1231,47, | 1231,48, | 1231,49, | 1231,50, | 1231,51, | 1231,52, | 1231,53, | 1231,54, | 1231,55, | 1231,56, | 1231,57, | 1231,58, | 1231,59, | 1231,60, | 1231,61, | 1231,62, | 1231,63, | 1231,64, | 1231,65, | 1231,66, | 1231,67, | 1231,68, | 1231,69, | 1231,70, | 1231,71, | 1231,72, | 1231,73, | 1231,74, | 1231,75, | 1231,76, | 1231,77, | 1231,78, | 1231,79, | 1231,80, | 1231,81, | 1231,82, | 1231,83, | 1231,84, | 1231,85, | 1232,1, | 1232,2, | 1232,3, | 1232,4, | 1232,5, | 1232,6, | 1232,7, | 1232,8, | 1232,9, | 1232,10, | 1232,11, | 1232,12, | 1232,13, | 1232,14, | 1232,15, | 1232,16, | 1232,17, | 1232,18, | 1232,19, | 1232,20, | 1232,21, | 1232,22, | 1232,23, | 1232,24, | 1232,25, | 1232,26, | 1232,27, | 1232,28, | 1232,29, | 1232,30, | 1232,31, | 1232,32, | 1232,33, | 1232,34, | 1232,35, | 1232,36, | 1232,37, | 1232,38, | 1232,39, | 1232,40, | 1232,41, | 1232,42, | 1232,43, | 1232,44, | 1232,45, | 1232,46, | 1232,47, | 1232,48, | 1232,49, | 1232,50, | 1232,51, | 1232,52, | 1232,53, | 1232,54, | 1232,55, | 1232,56, | 1232,57, | 1232,58, | 1232,59, | 1232,60, | 1232,61, | 1232,62, | 1232,63, | 1232,64, | 1232,65, | 1232,66, | 1232,67, | 1232,68, | 1232,69, | 1232,70, | 1232,71, | 1232,72, | 1232,73, | 1232,74, | 1232,75, | 1232,76, | 1232,77, | 1232,78, | 1232,79, | 1232,80, | 1232,81, | 1232,82, | 1232,83, | 1232,84, | 1232,85, | 1233,1, | 1233,2, | 1233,3, | 1233,4, | 1233,5, | 1233,6, | 1233,7, | 1233,8, | 1233,9, | 1233,10, | 1233,11, | 1233,12, | 1233,13, | 1233,14, | 1233,15, | 1233,16, | 1233,17, | 1233,18, | 1233,19, | 1233,20, | 1233,21, | 1233,22, | 1233,23, | 1233,24, | 1233,25, | 1233,26, | 1233,27, | 1233,28, | 1233,29, | 1233,30, | 1233,31, | 1233,32, | 1233,33, | 1233,34, | 1233,35, | 1233,36, | 1233,37, | 1233,38, | 1233,39, | 1233,40, | 1233,41, | 1233,42, | 1233,43, | 1233,44, | 1233,45, | 1233,46, | 1233,47, | 1233,48, | 1233,49, | 1233,50, | 1233,51, | 1233,52, | 1233,53, | 1233,54, | 1233,55, | 1233,56, | 1233,57, | 1233,58, | 1233,59, | 1233,60, | 1233,61, | 1233,62, | 1233,63, | 1233,64, | 1233,65, | 1233,66, | 1233,67, | 1233,68, | 1233,69, | 1233,70, | 1233,71, | 1233,72, | 1233,73, | 1233,74, | 1233,75, | 1233,76, | 1233,77, | 1233,78, | 1233,79, | 1233,80, | 1233,81, | 1233,82, | 1233,83, | 1233,84, | 1233,85, | 1234,1, | 1234,2, | 1234,3, | 1234,4, | 1234,5, | 1234,6, | 1234,7, | 1234,8, | 1234,9, | 1234,10, | 1234,11, | 1234,12, | 1234,13, | 1234,14, | 1234,15, | 1234,16, | 1234,17, | 1234,18, | 1234,19, | 1234,20, | 1234,21, | 1234,22, | 1234,23, | 1234,24, | 1234,25, | 1234,26, | 1234,27, | 1234,28, | 1234,29, | 1234,30, | 1234,31, | 1234,32, | 1234,33, | 1234,34, | 1234,35, | 1234,36, | 1234,37, | 1234,38, | 1234,39, | 1234,40, | 1234,41, | 1234,42, | 1234,43, | 1234,44, | 1234,45, | 1234,46, | 1234,47, | 1234,48, | 1234,49, | 1234,50, | 1234,51, | 1234,52, | 1234,53, | 1234,54, | 1234,55, | 1234,56, | 1234,57, | 1234,58, | 1234,59, | 1234,60, | 1234,61, | 1234,62, | 1234,63, | 1234,64, | 1234,65, | 1234,66, | 1234,67, | 1234,68, | 1234,69, | 1234,70, | 1234,71, | 1234,72, | 1234,73, | 1234,74, | 1234,75, | 1234,76, | 1234,77, | 1234,78, | 1234,79, | 1234,80, | 1234,81, | 1234,82, | 1234,83, | 1234,84, | 1234,85, | 1235,1, | 1235,2, | 1235,3, | 1235,4, | 1235,5, | 1235,6, | 1235,7, | 1235,8, | 1235,9, | 1235,10, | 1235,11, | 1235,12, | 1235,13, | 1235,14, | 1235,15, | 1235,16, | 1235,17, | 1235,18, | 1235,19, | 1235,20, | 1235,21, | 1235,22, | 1235,23, | 1235,24, | 1235,25, | 1235,26, | 1235,27, | 1235,28, | 1235,29, | 1235,30, | 1235,31, | 1235,32, | 1235,33, | 1235,34, | 1235,35, | 1235,36, | 1235,37, | 1235,38, | 1235,39, | 1235,40, | 1235,41, | 1235,42, | 1235,43, | 1235,44, | 1235,45, | 1235,46, | 1235,47, | 1235,48, | 1235,49, | 1235,50, | 1235,51, | 1235,52, | 1235,53, | 1235,54, | 1235,55, | 1235,56, | 1235,57, | 1235,58, | 1235,59, | 1235,60, | 1235,61, | 1235,62, | 1235,63, | 1235,64, | 1235,65, | 1235,66, | 1235,67, | 1235,68, | 1235,69, | 1235,70, | 1235,71, | 1235,72, | 1235,73, | 1235,74, | 1235,75, | 1235,76, | 1235,77, | 1235,78, | 1235,79, | 1235,80, | 1235,81, | 1235,82, | 1235,83, | 1235,84, | 1235,85, | 1236,1, | 1236,2, | 1236,3, | 1236,4, | 1236,5, | 1236,6, | 1236,7, | 1236,8, | 1236,9, | 1236,10, | 1236,11, | 1236,12, | 1236,13, | 1236,14, | 1236,15, | 1236,16, | 1236,17, | 1236,18, | 1236,19, | 1236,20, | 1236,21, | 1236,22, | 1236,23, | 1236,24, | 1236,25, | 1236,26, | 1236,27, | 1236,28, | 1236,29, | 1236,30, | 1236,31, | 1236,32, | 1236,33, | 1236,34, | 1236,35, | 1236,36, | 1236,37, | 1236,38, | 1236,39, | 1236,40, | 1236,41, | 1236,42, | 1236,43, | 1236,44, | 1236,45, | 1236,46, | 1236,47, | 1236,48, | 1236,49, | 1236,50, | 1236,51, | 1236,52, | 1236,53, | 1236,54, | 1236,55, | 1236,56, | 1236,57, | 1236,58, | 1236,59, | 1236,60, | 1236,61, | 1236,62, | 1236,63, | 1236,64, | 1236,65, | 1236,66, | 1236,67, | 1236,68, | 1236,69, | 1236,70, | 1236,71, | 1236,72, | 1236,73, | 1236,74, | 1236,75, | 1236,76, | 1236,77, | 1236,78, | 1236,79, | 1236,80, | 1236,81, | 1236,82, | 1236,83, | 1236,84, | 1236,85, | 1237,1, | 1237,2, | 1237,3, | 1237,4, | 1237,5, | 1237,6, | 1237,7, | 1237,8, | 1237,9, | 1237,10, | 1237,11, | 1237,12, | 1237,13, | 1237,14, | 1237,15, | 1237,16, | 1237,17, | 1237,18, | 1237,19, | 1237,20, | 1237,21, | 1237,22, | 1237,23, | 1237,24, | 1237,25, | 1237,26, | 1237,27, | 1237,28, | 1237,29, | 1237,30, | 1237,31, | 1237,32, | 1237,33, | 1237,34, | 1237,35, | 1237,36, | 1237,37, | 1237,38, | 1237,39, | 1237,40, | 1237,41, | 1237,42, | 1237,43, | 1237,44, | 1237,45, | 1237,46, | 1237,47, | 1237,48, | 1237,49, | 1237,50, | 1237,51, | 1237,52, | 1237,53, | 1237,54, | 1237,55, | 1237,56, | 1237,57, | 1237,58, | 1237,59, | 1237,60, | 1237,61, | 1237,62, | 1237,63, | 1237,64, | 1237,65, | 1237,66, | 1237,67, | 1237,68, | 1237,69, | 1237,70, | 1237,71, | 1237,72, | 1237,73, | 1237,74, | 1237,75, | 1237,76, | 1237,77, | 1237,78, | 1237,79, | 1237,80, | 1237,81, | 1237,82, | 1237,83, | 1237,84, | 1237,85, | 1238,1, | 1238,2, | 1238,3, | 1238,4, | 1238,5, | 1238,6, | 1238,7, | 1238,8, | 1238,9, | 1238,10, | 1238,11, | 1238,12, | 1238,13, | 1238,14, | 1238,15, | 1238,16, | 1238,17, | 1238,18, | 1238,19, | 1238,20, | 1238,21, | 1238,22, | 1238,23, | 1238,24, | 1238,25, | 1238,26, | 1238,27, | 1238,28, | 1238,29, | 1238,30, | 1238,31, | 1238,32, | 1238,33, | 1238,34, | 1238,35, | 1238,36, | 1238,37, | 1238,38, | 1238,39, | 1238,40, | 1238,41, | 1238,42, | 1238,43, | 1238,44, | 1238,45, | 1238,46, | 1238,47, | 1238,48, | 1238,49, | 1238,50, | 1238,51, | 1238,52, | 1238,53, | 1238,54, | 1238,55, | 1238,56, | 1238,57, | 1238,58, | 1238,59, | 1238,60, | 1238,61, | 1238,62, | 1238,63, | 1238,64, | 1238,65, | 1238,66, | 1238,67, | 1238,68, | 1238,69, | 1238,70, | 1238,71, | 1238,72, | 1238,73, | 1238,74, | 1238,75, | 1238,76, | 1238,77, | 1238,78, | 1238,79, | 1238,80, | 1238,81, | 1238,82, | 1238,83, | 1238,84, | 1238,85, | 1239,1, | 1239,2, | 1239,3, | 1239,4, | 1239,5, | 1239,6, | 1239,7, | 1239,8, | 1239,9, | 1239,10, | 1239,11, | 1239,12, | 1239,13, | 1239,14, | 1239,15, | 1239,16, | 1239,17, | 1239,18, | 1239,19, | 1239,20, | 1239,21, | 1239,22, | 1239,23, | 1239,24, | 1239,25, | 1239,26, | 1239,27, | 1239,28, | 1239,29, | 1239,30, | 1239,31, | 1239,32, | 1239,33, | 1239,34, | 1239,35, | 1239,36, | 1239,37, | 1239,38, | 1239,39, | 1239,40, | 1239,41, | 1239,42, | 1239,43, | 1239,44, | 1239,45, | 1239,46, | 1239,47, | 1239,48, | 1239,49, | 1239,50, | 1239,51, | 1239,52, | 1239,53, | 1239,54, | 1239,55, | 1239,56, | 1239,57, | 1239,58, | 1239,59, | 1239,60, | 1239,61, | 1239,62, | 1239,63, | 1239,64, | 1239,65, | 1239,66, | 1239,67, | 1239,68, | 1239,69, | 1239,70, | 1239,71, | 1239,72, | 1239,73, | 1239,74, | 1239,75, | 1239,76, | 1239,77, | 1239,78, | 1239,79, | 1239,80, | 1239,81, | 1239,82, | 1239,83, | 1239,84, | 1239,85, | 1240,1, | 1240,2, | 1240,3, | 1240,4, | 1240,5, | 1240,6, | 1240,7, | 1240,8, | 1240,9, | 1240,10, | 1240,11, | 1240,12, | 1240,13, | 1240,14, | 1240,15, | 1240,16, | 1240,17, | 1240,18, | 1240,19, | 1240,20, | 1240,21, | 1240,22, | 1240,23, | 1240,24, | 1240,25, | 1240,26, | 1240,27, | 1240,28, | 1240,29, | 1240,30, | 1240,31, | 1240,32, | 1240,33, | 1240,34, | 1240,35, | 1240,36, | 1240,37, | 1240,38, | 1240,39, | 1240,40, | 1240,41, | 1240,42, | 1240,43, | 1240,44, | 1240,45, | 1240,46, | 1240,47, | 1240,48, | 1240,49, | 1240,50, | 1240,51, | 1240,52, | 1240,53, | 1240,54, | 1240,55, | 1240,56, | 1240,57, | 1240,58, | 1240,59, | 1240,60, | 1240,61, | 1240,62, | 1240,63, | 1240,64, | 1240,65, | 1240,66, | 1240,67, | 1240,68, | 1240,69, | 1240,70, | 1240,71, | 1240,72, | 1240,73, | 1240,74, | 1240,75, | 1240,76, | 1240,77, | 1240,78, | 1240,79, | 1240,80, | 1240,81, | 1240,82, | 1240,83, | 1240,84, | 1240,85, | 1241,1, | 1241,2, | 1241,3, | 1241,4, | 1241,5, | 1241,6, | 1241,7, | 1241,8, | 1241,9, | 1241,10, | 1241,11, | 1241,12, | 1241,13, | 1241,14, | 1241,15, | 1241,16, | 1241,17, | 1241,18, | 1241,19, | 1241,20, | 1241,21, | 1241,22, | 1241,23, | 1241,24, | 1241,25, | 1241,26, | 1241,27, | 1241,28, | 1241,29, | 1241,30, | 1241,31, | 1241,32, | 1241,33, | 1241,34, | 1241,35, | 1241,36, | 1241,37, | 1241,38, | 1241,39, | 1241,40, | 1241,41, | 1241,42, | 1241,43, | 1241,44, | 1241,45, | 1241,46, | 1241,47, | 1241,48, | 1241,49, | 1241,50, | 1241,51, | 1241,52, | 1241,53, | 1241,54, | 1241,55, | 1241,56, | 1241,57, | 1241,58, | 1241,59, | 1241,60, | 1241,61, | 1241,62, | 1241,63, | 1241,64, | 1241,65, | 1241,66, | 1241,67, | 1241,68, | 1241,69, | 1241,70, | 1241,71, | 1241,72, | 1241,73, | 1241,74, | 1241,75, | 1241,76, | 1241,77, | 1241,78, | 1241,79, | 1241,80, | 1241,81, | 1241,82, | 1241,83, | 1241,84, | 1241,85, | 1242,1, | 1242,2, | 1242,3, | 1242,4, | 1242,5, | 1242,6, | 1242,7, | 1242,8, | 1242,9, | 1242,10, | 1242,11, | 1242,12, | 1242,13, | 1242,14, | 1242,15, | 1242,16, | 1242,17, | 1242,18, | 1242,19, | 1242,20, | 1242,21, | 1242,22, | 1242,23, | 1242,24, | 1242,25, | 1242,26, | 1242,27, | 1242,28, | 1242,29, | 1242,30, | 1242,31, | 1242,32, | 1242,33, | 1242,34, | 1242,35, | 1242,36, | 1242,37, | 1242,38, | 1242,39, | 1242,40, | 1242,41, | 1242,42, | 1242,43, | 1242,44, | 1242,45, | 1242,46, | 1242,47, | 1242,48, | 1242,49, | 1242,50, | 1242,51, | 1242,52, | 1242,53, | 1242,54, | 1242,55, | 1242,56, | 1242,57, | 1242,58, | 1242,59, | 1242,60, | 1242,61, | 1242,62, | 1242,63, | 1242,64, | 1242,65, | 1242,66, | 1242,67, | 1242,68, | 1242,69, | 1242,70, | 1242,71, | 1242,72, | 1242,73, | 1242,74, | 1242,75, | 1242,76, | 1242,77, | 1242,78, | 1242,79, | 1242,80, | 1242,81, | 1242,82, | 1242,83, | 1242,84, | 1242,85, | 1243,1, | 1243,2, | 1243,3, | 1243,4, | 1243,5, | 1243,6, | 1243,7, | 1243,8, | 1243,9, | 1243,10, | 1243,11, | 1243,12, | 1243,13, | 1243,14, | 1243,15, | 1243,16, | 1243,17, | 1243,18, | 1243,19, | 1243,20, | 1243,21, | 1243,22, | 1243,23, | 1243,24, | 1243,25, | 1243,26, | 1243,27, | 1243,28, | 1243,29, | 1243,30, | 1243,31, | 1243,32, | 1243,33, | 1243,34, | 1243,35, | 1243,36, | 1243,37, | 1243,38, | 1243,39, | 1243,40, | 1243,41, | 1243,42, | 1243,43, | 1243,44, | 1243,45, | 1243,46, | 1243,47, | 1243,48, | 1243,49, | 1243,50, | 1243,51, | 1243,52, | 1243,53, | 1243,54, | 1243,55, | 1243,56, | 1243,57, | 1243,58, | 1243,59, | 1243,60, | 1243,61, | 1243,62, | 1243,63, | 1243,64, | 1243,65, | 1243,66, | 1243,67, | 1243,68, | 1243,69, | 1243,70, | 1243,71, | 1243,72, | 1243,73, | 1243,74, | 1243,75, | 1243,76, | 1243,77, | 1243,78, | 1243,79, | 1243,80, | 1243,81, | 1243,82, | 1243,83, | 1243,84, | 1243,85, | 1244,1, | 1244,2, | 1244,3, | 1244,4, | 1244,5, | 1244,6, | 1244,7, | 1244,8, | 1244,9, | 1244,10, | 1244,11, | 1244,12, | 1244,13, | 1244,14, | 1244,15, | 1244,16, | 1244,17, | 1244,18, | 1244,19, | 1244,20, | 1244,21, | 1244,22, | 1244,23, | 1244,24, | 1244,25, | 1244,26, | 1244,27, | 1244,28, | 1244,29, | 1244,30, | 1244,31, | 1244,32, | 1244,33, | 1244,34, | 1244,35, | 1244,36, | 1244,37, | 1244,38, | 1244,39, | 1244,40, | 1244,41, | 1244,42, | 1244,43, | 1244,44, | 1244,45, | 1244,46, | 1244,47, | 1244,48, | 1244,49, | 1244,50, | 1244,51, | 1244,52, | 1244,53, | 1244,54, | 1244,55, | 1244,56, | 1244,57, | 1244,58, | 1244,59, | 1244,60, | 1244,61, | 1244,62, | 1244,63, | 1244,64, | 1244,65, | 1244,66, | 1244,67, | 1244,68, | 1244,69, | 1244,70, | 1244,71, | 1244,72, | 1244,73, | 1244,74, | 1244,75, | 1244,76, | 1244,77, | 1244,78, | 1244,79, | 1244,80, | 1244,81, | 1244,82, | 1244,83, | 1244,84, | 1244,85, | 1245,1, | 1245,2, | 1245,3, | 1245,4, | 1245,5, | 1245,6, | 1245,7, | 1245,8, | 1245,9, | 1245,10, | 1245,11, | 1245,12, | 1245,13, | 1245,14, | 1245,15, | 1245,16, | 1245,17, | 1245,18, | 1245,19, | 1245,20, | 1245,21, | 1245,22, | 1245,23, | 1245,24, | 1245,25, | 1245,26, | 1245,27, | 1245,28, | 1245,29, | 1245,30, | 1245,31, | 1245,32, | 1245,33, | 1245,34, | 1245,35, | 1245,36, | 1245,37, | 1245,38, | 1245,39, | 1245,40, | 1245,41, | 1245,42, | 1245,43, | 1245,44, | 1245,45, | 1245,46, | 1245,47, | 1245,48, | 1245,49, | 1245,50, | 1245,51, | 1245,52, | 1245,53, | 1245,54, | 1245,55, | 1245,56, | 1245,57, | 1245,58, | 1245,59, | 1245,60, | 1245,61, | 1245,62, | 1245,63, | 1245,64, | 1245,65, | 1245,66, | 1245,67, | 1245,68, | 1245,69, | 1245,70, | 1245,71, | 1245,72, | 1245,73, | 1245,74, | 1245,75, | 1245,76, | 1245,77, | 1245,78, | 1245,79, | 1245,80, | 1245,81, | 1245,82, | 1245,83, | 1245,84, | 1245,85, | 1246,1, | 1246,2, | 1246,3, | 1246,4, | 1246,5, | 1246,6, | 1246,7, | 1246,8, | 1246,9, | 1246,10, | 1246,11, | 1246,12, | 1246,13, | 1246,14, | 1246,15, | 1246,16, | 1246,17, | 1246,18, | 1246,19, | 1246,20, | 1246,21, | 1246,22, | 1246,23, | 1246,24, | 1246,25, | 1246,26, | 1246,27, | 1246,28, | 1246,29, | 1246,30, | 1246,31, | 1246,32, | 1246,33, | 1246,34, | 1246,35, | 1246,36, | 1246,37, | 1246,38, | 1246,39, | 1246,40, | 1246,41, | 1246,42, | 1246,43, | 1246,44, | 1246,45, | 1246,46, | 1246,47, | 1246,48, | 1246,49, | 1246,50, | 1246,51, | 1246,52, | 1246,53, | 1246,54, | 1246,55, | 1246,56, | 1246,57, | 1246,58, | 1246,59, | 1246,60, | 1246,61, | 1246,62, | 1246,63, | 1246,64, | 1246,65, | 1246,66, | 1246,67, | 1246,68, | 1246,69, | 1246,70, | 1246,71, | 1246,72, | 1246,73, | 1246,74, | 1246,75, | 1246,76, | 1246,77, | 1246,78, | 1246,79, | 1246,80, | 1246,81, | 1246,82, | 1246,83, | 1246,84, | 1246,85, | 1247,1, | 1247,2, | 1247,3, | 1247,4, | 1247,5, | 1247,6, | 1247,7, | 1247,8, | 1247,9, | 1247,10, | 1247,11, | 1247,12, | 1247,13, | 1247,14, | 1247,15, | 1247,16, | 1247,17, | 1247,18, | 1247,19, | 1247,20, | 1247,21, | 1247,22, | 1247,23, | 1247,24, | 1247,25, | 1247,26, | 1247,27, | 1247,28, | 1247,29, | 1247,30, | 1247,31, | 1247,32, | 1247,33, | 1247,34, | 1247,35, | 1247,36, | 1247,37, | 1247,38, | 1247,39, | 1247,40, | 1247,41, | 1247,42, | 1247,43, | 1247,44, | 1247,45, | 1247,46, | 1247,47, | 1247,48, | 1247,49, | 1247,50, | 1247,51, | 1247,52, | 1247,53, | 1247,54, | 1247,55, | 1247,56, | 1247,57, | 1247,58, | 1247,59, | 1247,60, | 1247,61, | 1247,62, | 1247,63, | 1247,64, | 1247,65, | 1247,66, | 1247,67, | 1247,68, | 1247,69, | 1247,70, | 1247,71, | 1247,72, | 1247,73, | 1247,74, | 1247,75, | 1247,76, | 1247,77, | 1247,78, | 1247,79, | 1247,80, | 1247,81, | 1247,82, | 1247,83, | 1247,84, | 1247,85, | 1248,1, | 1248,2, | 1248,3, | 1248,4, | 1248,5, | 1248,6, | 1248,7, | 1248,8, | 1248,9, | 1248,10, | 1248,11, | 1248,12, | 1248,13, | 1248,14, | 1248,15, | 1248,16, | 1248,17, | 1248,18, | 1248,19, | 1248,20, | 1248,21, | 1248,22, | 1248,23, | 1248,24, | 1248,25, | 1248,26, | 1248,27, | 1248,28, | 1248,29, | 1248,30, | 1248,31, | 1248,32, | 1248,33, | 1248,34, | 1248,35, | 1248,36, | 1248,37, | 1248,38, | 1248,39, | 1248,40, | 1248,41, | 1248,42, | 1248,43, | 1248,44, | 1248,45, | 1248,46, | 1248,47, | 1248,48, | 1248,49, | 1248,50, | 1248,51, | 1248,52, | 1248,53, | 1248,54, | 1248,55, | 1248,56, | 1248,57, | 1248,58, | 1248,59, | 1248,60, | 1248,61, | 1248,62, | 1248,63, | 1248,64, | 1248,65, | 1248,66, | 1248,67, | 1248,68, | 1248,69, | 1248,70, | 1248,71, | 1248,72, | 1248,73, | 1248,74, | 1248,75, | 1248,76, | 1248,77, | 1248,78, | 1248,79, | 1248,80, | 1248,81, | 1248,82, | 1248,83, | 1248,84, | 1248,85, | 1249,1, | 1249,2, | 1249,3, | 1249,4, | 1249,5, | 1249,6, | 1249,7, | 1249,8, | 1249,9, | 1249,10, | 1249,11, | 1249,12, | 1249,13, | 1249,14, | 1249,15, | 1249,16, | 1249,17, | 1249,18, | 1249,19, | 1249,20, | 1249,21, | 1249,22, | 1249,23, | 1249,24, | 1249,25, | 1249,26, | 1249,27, | 1249,28, | 1249,29, | 1249,30, | 1249,31, | 1249,32, | 1249,33, | 1249,34, | 1249,35, | 1249,36, | 1249,37, | 1249,38, | 1249,39, | 1249,40, | 1249,41, | 1249,42, | 1249,43, | 1249,44, | 1249,45, | 1249,46, | 1249,47, | 1249,48, | 1249,49, | 1249,50, | 1249,51, | 1249,52, | 1249,53, | 1249,54, | 1249,55, | 1249,56, | 1249,57, | 1249,58, | 1249,59, | 1249,60, | 1249,61, | 1249,62, | 1249,63, | 1249,64, | 1249,65, | 1249,66, | 1249,67, | 1249,68, | 1249,69, | 1249,70, | 1249,71, | 1249,72, | 1249,73, | 1249,74, | 1249,75, | 1249,76, | 1249,77, | 1249,78, | 1249,79, | 1249,80, | 1249,81, | 1249,82, | 1249,83, | 1249,84, | 1249,85, | 1250,1, | 1250,2, | 1250,3, | 1250,4, | 1250,5, | 1250,6, | 1250,7, | 1250,8, | 1250,9, | 1250,10, | 1250,11, | 1250,12, | 1250,13, | 1250,14, | 1250,15, | 1250,16, | 1250,17, | 1250,18, | 1250,19, | 1250,20, | 1250,21, | 1250,22, | 1250,23, | 1250,24, | 1250,25, | 1250,26, | 1250,27, | 1250,28, | 1250,29, | 1250,30, | 1250,31, | 1250,32, | 1250,33, | 1250,34, | 1250,35, | 1250,36, | 1250,37, | 1250,38, | 1250,39, | 1250,40, | 1250,41, | 1250,42, | 1250,43, | 1250,44, | 1250,45, | 1250,46, | 1250,47, | 1250,48, | 1250,49, | 1250,50, | 1250,51, | 1250,52, | 1250,53, | 1250,54, | 1250,55, | 1250,56, | 1250,57, | 1250,58, | 1250,59, | 1250,60, | 1250,61, | 1250,62, | 1250,63, | 1250,64, | 1250,65, | 1250,66, | 1250,67, | 1250,68, | 1250,69, | 1250,70, | 1250,71, | 1250,72, | 1250,73, | 1250,74, | 1250,75, | 1250,76, | 1250,77, | 1250,78, | 1250,79, | 1250,80, | 1250,81, | 1250,82, | 1250,83, | 1250,84, | 1250,85, | 1251,1, | 1251,2, | 1251,3, | 1251,4, | 1251,5, | 1251,6, | 1251,7, | 1251,8, | 1251,9, | 1251,10, | 1251,11, | 1251,12, | 1251,13, | 1251,14, | 1251,15, | 1251,16, | 1251,17, | 1251,18, | 1251,19, | 1251,20, | 1251,21, | 1251,22, | 1251,23, | 1251,24, | 1251,25, | 1251,26, | 1251,27, | 1251,28, | 1251,29, | 1251,30, | 1251,31, | 1251,32, | 1251,33, | 1251,34, | 1251,35, | 1251,36, | 1251,37, | 1251,38, | 1251,39, | 1251,40, | 1251,41, | 1251,42, | 1251,43, | 1251,44, | 1251,45, | 1251,46, | 1251,47, | 1251,48, | 1251,49, | 1251,50, | 1251,51, | 1251,52, | 1251,53, | 1251,54, | 1251,55, | 1251,56, | 1251,57, | 1251,58, | 1251,59, | 1251,60, | 1251,61, | 1251,62, | 1251,63, | 1251,64, | 1251,65, | 1251,66, | 1251,67, | 1251,68, | 1251,69, | 1251,70, | 1251,71, | 1251,72, | 1251,73, | 1251,74, | 1251,75, | 1251,76, | 1251,77, | 1251,78, | 1251,79, | 1251,80, | 1251,81, | 1251,82, | 1251,83, | 1251,84, | 1251,85, | 1252,1, | 1252,2, | 1252,3, | 1252,4, | 1252,5, | 1252,6, | 1252,7, | 1252,8, | 1252,9, | 1252,10, | 1252,11, | 1252,12, | 1252,13, | 1252,14, | 1252,15, | 1252,16, | 1252,17, | 1252,18, | 1252,19, | 1252,20, | 1252,21, | 1252,22, | 1252,23, | 1252,24, | 1252,25, | 1252,26, | 1252,27, | 1252,28, | 1252,29, | 1252,30, | 1252,31, | 1252,32, | 1252,33, | 1252,34, | 1252,35, | 1252,36, | 1252,37, | 1252,38, | 1252,39, | 1252,40, | 1252,41, | 1252,42, | 1252,43, | 1252,44, | 1252,45, | 1252,46, | 1252,47, | 1252,48, | 1252,49, | 1252,50, | 1252,51, | 1252,52, | 1252,53, | 1252,54, | 1252,55, | 1252,56, | 1252,57, | 1252,58, | 1252,59, | 1252,60, | 1252,61, | 1252,62, | 1252,63, | 1252,64, | 1252,65, | 1252,66, | 1252,67, | 1252,68, | 1252,69, | 1252,70, | 1252,71, | 1252,72, | 1252,73, | 1252,74, | 1252,75, | 1252,76, | 1252,77, | 1252,78, | 1252,79, | 1252,80, | 1252,81, | 1252,82, | 1252,83, | 1252,84, | 1252,85, | 1253,1, | 1253,2, | 1253,3, | 1253,4, | 1253,5, | 1253,6, | 1253,7, | 1253,8, | 1253,9, | 1253,10, | 1253,11, | 1253,12, | 1253,13, | 1253,14, | 1253,15, | 1253,16, | 1253,17, | 1253,18, | 1253,19, | 1253,20, | 1253,21, | 1253,22, | 1253,23, | 1253,24, | 1253,25, | 1253,26, | 1253,27, | 1253,28, | 1253,29, | 1253,30, | 1253,31, | 1253,32, | 1253,33, | 1253,34, | 1253,35, | 1253,36, | 1253,37, | 1253,38, | 1253,39, | 1253,40, | 1253,41, | 1253,42, | 1253,43, | 1253,44, | 1253,45, | 1253,46, | 1253,47, | 1253,48, | 1253,49, | 1253,50, | 1253,51, | 1253,52, | 1253,53, | 1253,54, | 1253,55, | 1253,56, | 1253,57, | 1253,58, | 1253,59, | 1253,60, | 1253,61, | 1253,62, | 1253,63, | 1253,64, | 1253,65, | 1253,66, | 1253,67, | 1253,68, | 1253,69, | 1253,70, | 1253,71, | 1253,72, | 1253,73, | 1253,74, | 1253,75, | 1253,76, | 1253,77, | 1253,78, | 1253,79, | 1253,80, | 1253,81, | 1253,82, | 1253,83, | 1253,84, | 1253,85, | 1254,1, | 1254,2, | 1254,3, | 1254,4, | 1254,5, | 1254,6, | 1254,7, | 1254,8, | 1254,9, | 1254,10, | 1254,11, | 1254,12, | 1254,13, | 1254,14, | 1254,15, | 1254,16, | 1254,17, | 1254,18, | 1254,19, | 1254,20, | 1254,21, | 1254,22, | 1254,23, | 1254,24, | 1254,25, | 1254,26, | 1254,27, | 1254,28, | 1254,29, | 1254,30, | 1254,31, | 1254,32, | 1254,33, | 1254,34, | 1254,35, | 1254,36, | 1254,37, | 1254,38, | 1254,39, | 1254,40, | 1254,41, | 1254,42, | 1254,43, | 1254,44, | 1254,45, | 1254,46, | 1254,47, | 1254,48, | 1254,49, | 1254,50, | 1254,51, | 1254,52, | 1254,53, | 1254,54, | 1254,55, | 1254,56, | 1254,57, | 1254,58, | 1254,59, | 1254,60, | 1254,61, | 1254,62, | 1254,63, | 1254,64, | 1254,65, | 1254,66, | 1254,67, | 1254,68, | 1254,69, | 1254,70, | 1254,71, | 1254,72, | 1254,73, | 1254,74, | 1254,75, | 1254,76, | 1254,77, | 1254,78, | 1254,79, | 1254,80, | 1254,81, | 1254,82, | 1254,83, | 1254,84, | 1254,85, | 1255,1, | 1255,2, | 1255,3, | 1255,4, | 1255,5, | 1255,6, | 1255,7, | 1255,8, | 1255,9, | 1255,10, | 1255,11, | 1255,12, | 1255,13, | 1255,14, | 1255,15, | 1255,16, | 1255,17, | 1255,18, | 1255,19, | 1255,20, | 1255,21, | 1255,22, | 1255,23, | 1255,24, | 1255,25, | 1255,26, | 1255,27, | 1255,28, | 1255,29, | 1255,30, | 1255,31, | 1255,32, | 1255,33, | 1255,34, | 1255,35, | 1255,36, | 1255,37, | 1255,38, | 1255,39, | 1255,40, | 1255,41, | 1255,42, | 1255,43, | 1255,44, | 1255,45, | 1255,46, | 1255,47, | 1255,48, | 1255,49, | 1255,50, | 1255,51, | 1255,52, | 1255,53, | 1255,54, | 1255,55, | 1255,56, | 1255,57, | 1255,58, | 1255,59, | 1255,60, | 1255,61, | 1255,62, | 1255,63, | 1255,64, | 1255,65, | 1255,66, | 1255,67, | 1255,68, | 1255,69, | 1255,70, | 1255,71, | 1255,72, | 1255,73, | 1255,74, | 1255,75, | 1255,76, | 1255,77, | 1255,78, | 1255,79, | 1255,80, | 1255,81, | 1255,82, | 1255,83, | 1255,84, | 1255,85, | 1256,1, | 1256,2, | 1256,3, | 1256,4, | 1256,5, | 1256,6, | 1256,7, | 1256,8, | 1256,9, | 1256,10, | 1256,11, | 1256,12, | 1256,13, | 1256,14, | 1256,15, | 1256,16, | 1256,17, | 1256,18, | 1256,19, | 1256,20, | 1256,21, | 1256,22, | 1256,23, | 1256,24, | 1256,25, | 1256,26, | 1256,27, | 1256,28, | 1256,29, | 1256,30, | 1256,31, | 1256,32, | 1256,33, | 1256,34, | 1256,35, | 1256,36, | 1256,37, | 1256,38, | 1256,39, | 1256,40, | 1256,41, | 1256,42, | 1256,43, | 1256,44, | 1256,45, | 1256,46, | 1256,47, | 1256,48, | 1256,49, | 1256,50, | 1256,51, | 1256,52, | 1256,53, | 1256,54, | 1256,55, | 1256,56, | 1256,57, | 1256,58, | 1256,59, | 1256,60, | 1256,61, | 1256,62, | 1256,63, | 1256,64, | 1256,65, | 1256,66, | 1256,67, | 1256,68, | 1256,69, | 1256,70, | 1256,71, | 1256,72, | 1256,73, | 1256,74, | 1256,75, | 1256,76, | 1256,77, | 1256,78, | 1256,79, | 1256,80, | 1256,81, | 1256,82, | 1256,83, | 1256,84, | 1256,85, | 1257,1, | 1257,2, | 1257,3, | 1257,4, | 1257,5, | 1257,6, | 1257,7, | 1257,8, | 1257,9, | 1257,10, | 1257,11, | 1257,12, | 1257,13, | 1257,14, | 1257,15, | 1257,16, | 1257,17, | 1257,18, | 1257,19, | 1257,20, | 1257,21, | 1257,22, | 1257,23, | 1257,24, | 1257,25, | 1257,26, | 1257,27, | 1257,28, | 1257,29, | 1257,30, | 1257,31, | 1257,32, | 1257,33, | 1257,34, | 1257,35, | 1257,36, | 1257,37, | 1257,38, | 1257,39, | 1257,40, | 1257,41, | 1257,42, | 1257,43, | 1257,44, | 1257,45, | 1257,46, | 1257,47, | 1257,48, | 1257,49, | 1257,50, | 1257,51, | 1257,52, | 1257,53, | 1257,54, | 1257,55, | 1257,56, | 1257,57, | 1257,58, | 1257,59, | 1257,60, | 1257,61, | 1257,62, | 1257,63, | 1257,64, | 1257,65, | 1257,66, | 1257,67, | 1257,68, | 1257,69, | 1257,70, | 1257,71, | 1257,72, | 1257,73, | 1257,74, | 1257,75, | 1257,76, | 1257,77, | 1257,78, | 1257,79, | 1257,80, | 1257,81, | 1257,82, | 1257,83, | 1257,84, | 1257,85, | 1258,1, | 1258,2, | 1258,3, | 1258,4, | 1258,5, | 1258,6, | 1258,7, | 1258,8, | 1258,9, | 1258,10, | 1258,11, | 1258,12, | 1258,13, | 1258,14, | 1258,15, | 1258,16, | 1258,17, | 1258,18, | 1258,19, | 1258,20, | 1258,21, | 1258,22, | 1258,23, | 1258,24, | 1258,25, | 1258,26, | 1258,27, | 1258,28, | 1258,29, | 1258,30, | 1258,31, | 1258,32, | 1258,33, | 1258,34, | 1258,35, | 1258,36, | 1258,37, | 1258,38, | 1258,39, | 1258,40, | 1258,41, | 1258,42, | 1258,43, | 1258,44, | 1258,45, | 1258,46, | 1258,47, | 1258,48, | 1258,49, | 1258,50, | 1258,51, | 1258,52, | 1258,53, | 1258,54, | 1258,55, | 1258,56, | 1258,57, | 1258,58, | 1258,59, | 1258,60, | 1258,61, | 1258,62, | 1258,63, | 1258,64, | 1258,65, | 1258,66, | 1258,67, | 1258,68, | 1258,69, | 1258,70, | 1258,71, | 1258,72, | 1258,73, | 1258,74, | 1258,75, | 1258,76, | 1258,77, | 1258,78, | 1258,79, | 1258,80, | 1258,81, | 1258,82, | 1258,83, | 1258,84, | 1258,85, | 1259,1, | 1259,2, | 1259,3, | 1259,4, | 1259,5, | 1259,6, | 1259,7, | 1259,8, | 1259,9, | 1259,10, | 1259,11, | 1259,12, | 1259,13, | 1259,14, | 1259,15, | 1259,16, | 1259,17, | 1259,18, | 1259,19, | 1259,20, | 1259,21, | 1259,22, | 1259,23, | 1259,24, | 1259,25, | 1259,26, | 1259,27, | 1259,28, | 1259,29, | 1259,30, | 1259,31, | 1259,32, | 1259,33, | 1259,34, | 1259,35, | 1259,36, | 1259,37, | 1259,38, | 1259,39, | 1259,40, | 1259,41, | 1259,42, | 1259,43, | 1259,44, | 1259,45, | 1259,46, | 1259,47, | 1259,48, | 1259,49, | 1259,50, | 1259,51, | 1259,52, | 1259,53, | 1259,54, | 1259,55, | 1259,56, | 1259,57, | 1259,58, | 1259,59, | 1259,60, | 1259,61, | 1259,62, | 1259,63, | 1259,64, | 1259,65, | 1259,66, | 1259,67, | 1259,68, | 1259,69, | 1259,70, | 1259,71, | 1259,72, | 1259,73, | 1259,74, | 1259,75, | 1259,76, | 1259,77, | 1259,78, | 1259,79, | 1259,80, | 1259,81, | 1259,82, | 1259,83, | 1259,84, | 1259,85, | 1260,1, | 1260,2, | 1260,3, | 1260,4, | 1260,5, | 1260,6, | 1260,7, | 1260,8, | 1260,9, | 1260,10, | 1260,11, | 1260,12, | 1260,13, | 1260,14, | 1260,15, | 1260,16, | 1260,17, | 1260,18, | 1260,19, | 1260,20, | 1260,21, | 1260,22, | 1260,23, | 1260,24, | 1260,25, | 1260,26, | 1260,27, | 1260,28, | 1260,29, | 1260,30, | 1260,31, | 1260,32, | 1260,33, | 1260,34, | 1260,35, | 1260,36, | 1260,37, | 1260,38, | 1260,39, | 1260,40, | 1260,41, | 1260,42, | 1260,43, | 1260,44, | 1260,45, | 1260,46, | 1260,47, | 1260,48, | 1260,49, | 1260,50, | 1260,51, | 1260,52, | 1260,53, | 1260,54, | 1260,55, | 1260,56, | 1260,57, | 1260,58, | 1260,59, | 1260,60, | 1260,61, | 1260,62, | 1260,63, | 1260,64, | 1260,65, | 1260,66, | 1260,67, | 1260,68, | 1260,69, | 1260,70, | 1260,71, | 1260,72, | 1260,73, | 1260,74, | 1260,75, | 1260,76, | 1260,77, | 1260,78, | 1260,79, | 1260,80, | 1260,81, | 1260,82, | 1260,83, | 1260,84, | 1260,85, | 1261,1, | 1261,2, | 1261,3, | 1261,4, | 1261,5, | 1261,6, | 1261,7, | 1261,8, | 1261,9, | 1261,10, | 1261,11, | 1261,12, | 1261,13, | 1261,14, | 1261,15, | 1261,16, | 1261,17, | 1261,18, | 1261,19, | 1261,20, | 1261,21, | 1261,22, | 1261,23, | 1261,24, | 1261,25, | 1261,26, | 1261,27, | 1261,28, | 1261,29, | 1261,30, | 1261,31, | 1261,32, | 1261,33, | 1261,34, | 1261,35, | 1261,36, | 1261,37, | 1261,38, | 1261,39, | 1261,40, | 1261,41, | 1261,42, | 1261,43, | 1261,44, | 1261,45, | 1261,46, | 1261,47, | 1261,48, | 1261,49, | 1261,50, | 1261,51, | 1261,52, | 1261,53, | 1261,54, | 1261,55, | 1261,56, | 1261,57, | 1261,58, | 1261,59, | 1261,60, | 1261,61, | 1261,62, | 1261,63, | 1261,64, | 1261,65, | 1261,66, | 1261,67, | 1261,68, | 1261,69, | 1261,70, | 1261,71, | 1261,72, | 1261,73, | 1261,74, | 1261,75, | 1261,76, | 1261,77, | 1261,78, | 1261,79, | 1261,80, | 1261,81, | 1261,82, | 1261,83, | 1261,84, | 1261,85, | 1262,1, | 1262,2, | 1262,3, | 1262,4, | 1262,5, | 1262,6, | 1262,7, | 1262,8, | 1262,9, | 1262,10, | 1262,11, | 1262,12, | 1262,13, | 1262,14, | 1262,15, | 1262,16, | 1262,17, | 1262,18, | 1262,19, | 1262,20, | 1262,21, | 1262,22, | 1262,23, | 1262,24, | 1262,25, | 1262,26, | 1262,27, | 1262,28, | 1262,29, | 1262,30, | 1262,31, | 1262,32, | 1262,33, | 1262,34, | 1262,35, | 1262,36, | 1262,37, | 1262,38, | 1262,39, | 1262,40, | 1262,41, | 1262,42, | 1262,43, | 1262,44, | 1262,45, | 1262,46, | 1262,47, | 1262,48, | 1262,49, | 1262,50, | 1262,51, | 1262,52, | 1262,53, | 1262,54, | 1262,55, | 1262,56, | 1262,57, | 1262,58, | 1262,59, | 1262,60, | 1262,61, | 1262,62, | 1262,63, | 1262,64, | 1262,65, | 1262,66, | 1262,67, | 1262,68, | 1262,69, | 1262,70, | 1262,71, | 1262,72, | 1262,73, | 1262,74, | 1262,75, | 1262,76, | 1262,77, | 1262,78, | 1262,79, | 1262,80, | 1262,81, | 1262,82, | 1262,83, | 1262,84, | 1262,85, | 1263,1, | 1263,2, | 1263,3, | 1263,4, | 1263,5, | 1263,6, | 1263,7, | 1263,8, | 1263,9, | 1263,10, | 1263,11, | 1263,12, | 1263,13, | 1263,14, | 1263,15, | 1263,16, | 1263,17, | 1263,18, | 1263,19, | 1263,20, | 1263,21, | 1263,22, | 1263,23, | 1263,24, | 1263,25, | 1263,26, | 1263,27, | 1263,28, | 1263,29, | 1263,30, | 1263,31, | 1263,32, | 1263,33, | 1263,34, | 1263,35, | 1263,36, | 1263,37, | 1263,38, | 1263,39, | 1263,40, | 1263,41, | 1263,42, | 1263,43, | 1263,44, | 1263,45, | 1263,46, | 1263,47, | 1263,48, | 1263,49, | 1263,50, | 1263,51, | 1263,52, | 1263,53, | 1263,54, | 1263,55, | 1263,56, | 1263,57, | 1263,58, | 1263,59, | 1263,60, | 1263,61, | 1263,62, | 1263,63, | 1263,64, | 1263,65, | 1263,66, | 1263,67, | 1263,68, | 1263,69, | 1263,70, | 1263,71, | 1263,72, | 1263,73, | 1263,74, | 1263,75, | 1263,76, | 1263,77, | 1263,78, | 1263,79, | 1263,80, | 1263,81, | 1263,82, | 1263,83, | 1263,84, | 1263,85, | 1264,1, | 1264,2, | 1264,3, | 1264,4, | 1264,5, | 1264,6, | 1264,7, | 1264,8, | 1264,9, | 1264,10, | 1264,11, | 1264,12, | 1264,13, | 1264,14, | 1264,15, | 1264,16, | 1264,17, | 1264,18, | 1264,19, | 1264,20, | 1264,21, | 1264,22, | 1264,23, | 1264,24, | 1264,25, | 1264,26, | 1264,27, | 1264,28, | 1264,29, | 1264,30, | 1264,31, | 1264,32, | 1264,33, | 1264,34, | 1264,35, | 1264,36, | 1264,37, | 1264,38, | 1264,39, | 1264,40, | 1264,41, | 1264,42, | 1264,43, | 1264,44, | 1264,45, | 1264,46, | 1264,47, | 1264,48, | 1264,49, | 1264,50, | 1264,51, | 1264,52, | 1264,53, | 1264,54, | 1264,55, | 1264,56, | 1264,57, | 1264,58, | 1264,59, | 1264,60, | 1264,61, | 1264,62, | 1264,63, | 1264,64, | 1264,65, | 1264,66, | 1264,67, | 1264,68, | 1264,69, | 1264,70, | 1264,71, | 1264,72, | 1264,73, | 1264,74, | 1264,75, | 1264,76, | 1264,77, | 1264,78, | 1264,79, | 1264,80, | 1264,81, | 1264,82, | 1264,83, | 1264,84, | 1264,85, | 1265,1, | 1265,2, | 1265,3, | 1265,4, | 1265,5, | 1265,6, | 1265,7, | 1265,8, | 1265,9, | 1265,10, | 1265,11, | 1265,12, | 1265,13, | 1265,14, | 1265,15, | 1265,16, | 1265,17, | 1265,18, | 1265,19, | 1265,20, | 1265,21, | 1265,22, | 1265,23, | 1265,24, | 1265,25, | 1265,26, | 1265,27, | 1265,28, | 1265,29, | 1265,30, | 1265,31, | 1265,32, | 1265,33, | 1265,34, | 1265,35, | 1265,36, | 1265,37, | 1265,38, | 1265,39, | 1265,40, | 1265,41, | 1265,42, | 1265,43, | 1265,44, | 1265,45, | 1265,46, | 1265,47, | 1265,48, | 1265,49, | 1265,50, | 1265,51, | 1265,52, | 1265,53, | 1265,54, | 1265,55, | 1265,56, | 1265,57, | 1265,58, | 1265,59, | 1265,60, | 1265,61, | 1265,62, | 1265,63, | 1265,64, | 1265,65, | 1265,66, | 1265,67, | 1265,68, | 1265,69, | 1265,70, | 1265,71, | 1265,72, | 1265,73, | 1265,74, | 1265,75, | 1265,76, | 1265,77, | 1265,78, | 1265,79, | 1265,80, | 1265,81, | 1265,82, | 1265,83, | 1265,84, | 1265,85, | 1266,1, | 1266,2, | 1266,3, | 1266,4, | 1266,5, | 1266,6, | 1266,7, | 1266,8, | 1266,9, | 1266,10, | 1266,11, | 1266,12, | 1266,13, | 1266,14, | 1266,15, | 1266,16, | 1266,17, | 1266,18, | 1266,19, | 1266,20, | 1266,21, | 1266,22, | 1266,23, | 1266,24, | 1266,25, | 1266,26, | 1266,27, | 1266,28, | 1266,29, | 1266,30, | 1266,31, | 1266,32, | 1266,33, | 1266,34, | 1266,35, | 1266,36, | 1266,37, | 1266,38, | 1266,39, | 1266,40, | 1266,41, | 1266,42, | 1266,43, | 1266,44, | 1266,45, | 1266,46, | 1266,47, | 1266,48, | 1266,49, | 1266,50, | 1266,51, | 1266,52, | 1266,53, | 1266,54, | 1266,55, | 1266,56, | 1266,57, | 1266,58, | 1266,59, | 1266,60, | 1266,61, | 1266,62, | 1266,63, | 1266,64, | 1266,65, | 1266,66, | 1266,67, | 1266,68, | 1266,69, | 1266,70, | 1266,71, | 1266,72, | 1266,73, | 1266,74, | 1266,75, | 1266,76, | 1266,77, | 1266,78, | 1266,79, | 1266,80, | 1266,81, | 1266,82, | 1266,83, | 1266,84, | 1266,85, | 1267,1, | 1267,2, | 1267,3, | 1267,4, | 1267,5, | 1267,6, | 1267,7, | 1267,8, | 1267,9, | 1267,10, | 1267,11, | 1267,12, | 1267,13, | 1267,14, | 1267,15, | 1267,16, | 1267,17, | 1267,18, | 1267,19, | 1267,20, | 1267,21, | 1267,22, | 1267,23, | 1267,24, | 1267,25, | 1267,26, | 1267,27, | 1267,28, | 1267,29, | 1267,30, | 1267,31, | 1267,32, | 1267,33, | 1267,34, | 1267,35, | 1267,36, | 1267,37, | 1267,38, | 1267,39, | 1267,40, | 1267,41, | 1267,42, | 1267,43, | 1267,44, | 1267,45, | 1267,46, | 1267,47, | 1267,48, | 1267,49, | 1267,50, | 1267,51, | 1267,52, | 1267,53, | 1267,54, | 1267,55, | 1267,56, | 1267,57, | 1267,58, | 1267,59, | 1267,60, | 1267,61, | 1267,62, | 1267,63, | 1267,64, | 1267,65, | 1267,66, | 1267,67, | 1267,68, | 1267,69, | 1267,70, | 1267,71, | 1267,72, | 1267,73, | 1267,74, | 1267,75, | 1267,76, | 1267,77, | 1267,78, | 1267,79, | 1267,80, | 1267,81, | 1267,82, | 1267,83, | 1267,84, | 1267,85, | 1268,1, | 1268,2, | 1268,3, | 1268,4, | 1268,5, | 1268,6, | 1268,7, | 1268,8, | 1268,9, | 1268,10, | 1268,11, | 1268,12, | 1268,13, | 1268,14, | 1268,15, | 1268,16, | 1268,17, | 1268,18, | 1268,19, | 1268,20, | 1268,21, | 1268,22, | 1268,23, | 1268,24, | 1268,25, | 1268,26, | 1268,27, | 1268,28, | 1268,29, | 1268,30, | 1268,31, | 1268,32, | 1268,33, | 1268,34, | 1268,35, | 1268,36, | 1268,37, | 1268,38, | 1268,39, | 1268,40, | 1268,41, | 1268,42, | 1268,43, | 1268,44, | 1268,45, | 1268,46, | 1268,47, | 1268,48, | 1268,49, | 1268,50, | 1268,51, | 1268,52, | 1268,53, | 1268,54, | 1268,55, | 1268,56, | 1268,57, | 1268,58, | 1268,59, | 1268,60, | 1268,61, | 1268,62, | 1268,63, | 1268,64, | 1268,65, | 1268,66, | 1268,67, | 1268,68, | 1268,69, | 1268,70, | 1268,71, | 1268,72, | 1268,73, | 1268,74, | 1268,75, | 1268,76, | 1268,77, | 1268,78, | 1268,79, | 1268,80, | 1268,81, | 1268,82, | 1268,83, | 1268,84, | 1268,85, | 1269,1, | 1269,2, | 1269,3, | 1269,4, | 1269,5, | 1269,6, | 1269,7, | 1269,8, | 1269,9, | 1269,10, | 1269,11, | 1269,12, | 1269,13, | 1269,14, | 1269,15, | 1269,16, | 1269,17, | 1269,18, | 1269,19, | 1269,20, | 1269,21, | 1269,22, | 1269,23, | 1269,24, | 1269,25, | 1269,26, | 1269,27, | 1269,28, | 1269,29, | 1269,30, | 1269,31, | 1269,32, | 1269,33, | 1269,34, | 1269,35, | 1269,36, | 1269,37, | 1269,38, | 1269,39, | 1269,40, | 1269,41, | 1269,42, | 1269,43, | 1269,44, | 1269,45, | 1269,46, | 1269,47, | 1269,48, | 1269,49, | 1269,50, | 1269,51, | 1269,52, | 1269,53, | 1269,54, | 1269,55, | 1269,56, | 1269,57, | 1269,58, | 1269,59, | 1269,60, | 1269,61, | 1269,62, | 1269,63, | 1269,64, | 1269,65, | 1269,66, | 1269,67, | 1269,68, | 1269,69, | 1269,70, | 1269,71, | 1269,72, | 1269,73, | 1269,74, | 1269,75, | 1269,76, | 1269,77, | 1269,78, | 1269,79, | 1269,80, | 1269,81, | 1269,82, | 1269,83, | 1269,84, | 1269,85, | 1270,1, | 1270,2, | 1270,3, | 1270,4, | 1270,5, | 1270,6, | 1270,7, | 1270,8, | 1270,9, | 1270,10, | 1270,11, | 1270,12, | 1270,13, | 1270,14, | 1270,15, | 1270,16, | 1270,17, | 1270,18, | 1270,19, | 1270,20, | 1270,21, | 1270,22, | 1270,23, | 1270,24, | 1270,25, | 1270,26, | 1270,27, | 1270,28, | 1270,29, | 1270,30, | 1270,31, | 1270,32, | 1270,33, | 1270,34, | 1270,35, | 1270,36, | 1270,37, | 1270,38, | 1270,39, | 1270,40, | 1270,41, | 1270,42, | 1270,43, | 1270,44, | 1270,45, | 1270,46, | 1270,47, | 1270,48, | 1270,49, | 1270,50, | 1270,51, | 1270,52, | 1270,53, | 1270,54, | 1270,55, | 1270,56, | 1270,57, | 1270,58, | 1270,59, | 1270,60, | 1270,61, | 1270,62, | 1270,63, | 1270,64, | 1270,65, | 1270,66, | 1270,67, | 1270,68, | 1270,69, | 1270,70, | 1270,71, | 1270,72, | 1270,73, | 1270,74, | 1270,75, | 1270,76, | 1270,77, | 1270,78, | 1270,79, | 1270,80, | 1270,81, | 1270,82, | 1270,83, | 1270,84, | 1270,85, | 1271,1, | 1271,2, | 1271,3, | 1271,4, | 1271,5, | 1271,6, | 1271,7, | 1271,8, | 1271,9, | 1271,10, | 1271,11, | 1271,12, | 1271,13, | 1271,14, | 1271,15, | 1271,16, | 1271,17, | 1271,18, | 1271,19, | 1271,20, | 1271,21, | 1271,22, | 1271,23, | 1271,24, | 1271,25, | 1271,26, | 1271,27, | 1271,28, | 1271,29, | 1271,30, | 1271,31, | 1271,32, | 1271,33, | 1271,34, | 1271,35, | 1271,36, | 1271,37, | 1271,38, | 1271,39, | 1271,40, | 1271,41, | 1271,42, | 1271,43, | 1271,44, | 1271,45, | 1271,46, | 1271,47, | 1271,48, | 1271,49, | 1271,50, | 1271,51, | 1271,52, | 1271,53, | 1271,54, | 1271,55, | 1271,56, | 1271,57, | 1271,58, | 1271,59, | 1271,60, | 1271,61, | 1271,62, | 1271,63, | 1271,64, | 1271,65, | 1271,66, | 1271,67, | 1271,68, | 1271,69, | 1271,70, | 1271,71, | 1271,72, | 1271,73, | 1271,74, | 1271,75, | 1271,76, | 1271,77, | 1271,78, | 1271,79, | 1271,80, | 1271,81, | 1271,82, | 1271,83, | 1271,84, | 1271,85, | 1272,1, | 1272,2, | 1272,3, | 1272,4, | 1272,5, | 1272,6, | 1272,7, | 1272,8, | 1272,9, | 1272,10, | 1272,11, | 1272,12, | 1272,13, | 1272,14, | 1272,15, | 1272,16, | 1272,17, | 1272,18, | 1272,19, | 1272,20, | 1272,21, | 1272,22, | 1272,23, | 1272,24, | 1272,25, | 1272,26, | 1272,27, | 1272,28, | 1272,29, | 1272,30, | 1272,31, | 1272,32, | 1272,33, | 1272,34, | 1272,35, | 1272,36, | 1272,37, | 1272,38, | 1272,39, | 1272,40, | 1272,41, | 1272,42, | 1272,43, | 1272,44, | 1272,45, | 1272,46, | 1272,47, | 1272,48, | 1272,49, | 1272,50, | 1272,51, | 1272,52, | 1272,53, | 1272,54, | 1272,55, | 1272,56, | 1272,57, | 1272,58, | 1272,59, | 1272,60, | 1272,61, | 1272,62, | 1272,63, | 1272,64, | 1272,65, | 1272,66, | 1272,67, | 1272,68, | 1272,69, | 1272,70, | 1272,71, | 1272,72, | 1272,73, | 1272,74, | 1272,75, | 1272,76, | 1272,77, | 1272,78, | 1272,79, | 1272,80, | 1272,81, | 1272,82, | 1272,83, | 1272,84, | 1272,85, | 1273,1, | 1273,2, | 1273,3, | 1273,4, | 1273,5, | 1273,6, | 1273,7, | 1273,8, | 1273,9, | 1273,10, | 1273,11, | 1273,12, | 1273,13, | 1273,14, | 1273,15, | 1273,16, | 1273,17, | 1273,18, | 1273,19, | 1273,20, | 1273,21, | 1273,22, | 1273,23, | 1273,24, | 1273,25, | 1273,26, | 1273,27, | 1273,28, | 1273,29, | 1273,30, | 1273,31, | 1273,32, | 1273,33, | 1273,34, | 1273,35, | 1273,36, | 1273,37, | 1273,38, | 1273,39, | 1273,40, | 1273,41, | 1273,42, | 1273,43, | 1273,44, | 1273,45, | 1273,46, | 1273,47, | 1273,48, | 1273,49, | 1273,50, | 1273,51, | 1273,52, | 1273,53, | 1273,54, | 1273,55, | 1273,56, | 1273,57, | 1273,58, | 1273,59, | 1273,60, | 1273,61, | 1273,62, | 1273,63, | 1273,64, | 1273,65, | 1273,66, | 1273,67, | 1273,68, | 1273,69, | 1273,70, | 1273,71, | 1273,72, | 1273,73, | 1273,74, | 1273,75, | 1273,76, | 1273,77, | 1273,78, | 1273,79, | 1273,80, | 1273,81, | 1273,82, | 1273,83, | 1273,84, | 1273,85, | 1274,1, | 1274,2, | 1274,3, | 1274,4, | 1274,5, | 1274,6, | 1274,7, | 1274,8, | 1274,9, | 1274,10, | 1274,11, | 1274,12, | 1274,13, | 1274,14, | 1274,15, | 1274,16, | 1274,17, | 1274,18, | 1274,19, | 1274,20, | 1274,21, | 1274,22, | 1274,23, | 1274,24, | 1274,25, | 1274,26, | 1274,27, | 1274,28, | 1274,29, | 1274,30, | 1274,31, | 1274,32, | 1274,33, | 1274,34, | 1274,35, | 1274,36, | 1274,37, | 1274,38, | 1274,39, | 1274,40, | 1274,41, | 1274,42, | 1274,43, | 1274,44, | 1274,45, | 1274,46, | 1274,47, | 1274,48, | 1274,49, | 1274,50, | 1274,51, | 1274,52, | 1274,53, | 1274,54, | 1274,55, | 1274,56, | 1274,57, | 1274,58, | 1274,59, | 1274,60, | 1274,61, | 1274,62, | 1274,63, | 1274,64, | 1274,65, | 1274,66, | 1274,67, | 1274,68, | 1274,69, | 1274,70, | 1274,71, | 1274,72, | 1274,73, | 1274,74, | 1274,75, | 1274,76, | 1274,77, | 1274,78, | 1274,79, | 1274,80, | 1274,81, | 1274,82, | 1274,83, | 1274,84, | 1274,85, | 1275,1, | 1275,2, | 1275,3, | 1275,4, | 1275,5, | 1275,6, | 1275,7, | 1275,8, | 1275,9, | 1275,10, | 1275,11, | 1275,12, | 1275,13, | 1275,14, | 1275,15, | 1275,16, | 1275,17, | 1275,18, | 1275,19, | 1275,20, | 1275,21, | 1275,22, | 1275,23, | 1275,24, | 1275,25, | 1275,26, | 1275,27, | 1275,28, | 1275,29, | 1275,30, | 1275,31, | 1275,32, | 1275,33, | 1275,34, | 1275,35, | 1275,36, | 1275,37, | 1275,38, | 1275,39, | 1275,40, | 1275,41, | 1275,42, | 1275,43, | 1275,44, | 1275,45, | 1275,46, | 1275,47, | 1275,48, | 1275,49, | 1275,50, | 1275,51, | 1275,52, | 1275,53, | 1275,54, | 1275,55, | 1275,56, | 1275,57, | 1275,58, | 1275,59, | 1275,60, | 1275,61, | 1275,62, | 1275,63, | 1275,64, | 1275,65, | 1275,66, | 1275,67, | 1275,68, | 1275,69, | 1275,70, | 1275,71, | 1275,72, | 1275,73, | 1275,74, | 1275,75, | 1275,76, | 1275,77, | 1275,78, | 1275,79, | 1275,80, | 1275,81, | 1275,82, | 1275,83, | 1275,84, | 1275,85, | 1276,1, | 1276,2, | 1276,3, | 1276,4, | 1276,5, | 1276,6, | 1276,7, | 1276,8, | 1276,9, | 1276,10, | 1276,11, | 1276,12, | 1276,13, | 1276,14, | 1276,15, | 1276,16, | 1276,17, | 1276,18, | 1276,19, | 1276,20, | 1276,21, | 1276,22, | 1276,23, | 1276,24, | 1276,25, | 1276,26, | 1276,27, | 1276,28, | 1276,29, | 1276,30, | 1276,31, | 1276,32, | 1276,33, | 1276,34, | 1276,35, | 1276,36, | 1276,37, | 1276,38, | 1276,39, | 1276,40, | 1276,41, | 1276,42, | 1276,43, | 1276,44, | 1276,45, | 1276,46, | 1276,47, | 1276,48, | 1276,49, | 1276,50, | 1276,51, | 1276,52, | 1276,53, | 1276,54, | 1276,55, | 1276,56, | 1276,57, | 1276,58, | 1276,59, | 1276,60, | 1276,61, | 1276,62, | 1276,63, | 1276,64, | 1276,65, | 1276,66, | 1276,67, | 1276,68, | 1276,69, | 1276,70, | 1276,71, | 1276,72, | 1276,73, | 1276,74, | 1276,75, | 1276,76, | 1276,77, | 1276,78, | 1276,79, | 1276,80, | 1276,81, | 1276,82, | 1276,83, | 1276,84, | 1276,85, | 1277,1, | 1277,2, | 1277,3, | 1277,4, | 1277,5, | 1277,6, | 1277,7, | 1277,8, | 1277,9, | 1277,10, | 1277,11, | 1277,12, | 1277,13, | 1277,14, | 1277,15, | 1277,16, | 1277,17, | 1277,18, | 1277,19, | 1277,20, | 1277,21, | 1277,22, | 1277,23, | 1277,24, | 1277,25, | 1277,26, | 1277,27, | 1277,28, | 1277,29, | 1277,30, | 1277,31, | 1277,32, | 1277,33, | 1277,34, | 1277,35, | 1277,36, | 1277,37, | 1277,38, | 1277,39, | 1277,40, | 1277,41, | 1277,42, | 1277,43, | 1277,44, | 1277,45, | 1277,46, | 1277,47, | 1277,48, | 1277,49, | 1277,50, | 1277,51, | 1277,52, | 1277,53, | 1277,54, | 1277,55, | 1277,56, | 1277,57, | 1277,58, | 1277,59, | 1277,60, | 1277,61, | 1277,62, | 1277,63, | 1277,64, | 1277,65, | 1277,66, | 1277,67, | 1277,68, | 1277,69, | 1277,70, | 1277,71, | 1277,72, | 1277,73, | 1277,74, | 1277,75, | 1277,76, | 1277,77, | 1277,78, | 1277,79, | 1277,80, | 1277,81, | 1277,82, | 1277,83, | 1277,84, | 1277,85, | 1278,1, | 1278,2, | 1278,3, | 1278,4, | 1278,5, | 1278,6, | 1278,7, | 1278,8, | 1278,9, | 1278,10, | 1278,11, | 1278,12, | 1278,13, | 1278,14, | 1278,15, | 1278,16, | 1278,17, | 1278,18, | 1278,19, | 1278,20, | 1278,21, | 1278,22, | 1278,23, | 1278,24, | 1278,25, | 1278,26, | 1278,27, | 1278,28, | 1278,29, | 1278,30, | 1278,31, | 1278,32, | 1278,33, | 1278,34, | 1278,35, | 1278,36, | 1278,37, | 1278,38, | 1278,39, | 1278,40, | 1278,41, | 1278,42, | 1278,43, | 1278,44, | 1278,45, | 1278,46, | 1278,47, | 1278,48, | 1278,49, | 1278,50, | 1278,51, | 1278,52, | 1278,53, | 1278,54, | 1278,55, | 1278,56, | 1278,57, | 1278,58, | 1278,59, | 1278,60, | 1278,61, | 1278,62, | 1278,63, | 1278,64, | 1278,65, | 1278,66, | 1278,67, | 1278,68, | 1278,69, | 1278,70, | 1278,71, | 1278,72, | 1278,73, | 1278,74, | 1278,75, | 1278,76, | 1278,77, | 1278,78, | 1278,79, | 1278,80, | 1278,81, | 1278,82, | 1278,83, | 1278,84, | 1278,85, | 1279,1, | 1279,2, | 1279,3, | 1279,4, | 1279,5, | 1279,6, | 1279,7, | 1279,8, | 1279,9, | 1279,10, | 1279,11, | 1279,12, | 1279,13, | 1279,14, | 1279,15, | 1279,16, | 1279,17, | 1279,18, | 1279,19, | 1279,20, | 1279,21, | 1279,22, | 1279,23, | 1279,24, | 1279,25, | 1279,26, | 1279,27, | 1279,28, | 1279,29, | 1279,30, | 1279,31, | 1279,32, | 1279,33, | 1279,34, | 1279,35, | 1279,36, | 1279,37, | 1279,38, | 1279,39, | 1279,40, | 1279,41, | 1279,42, | 1279,43, | 1279,44, | 1279,45, | 1279,46, | 1279,47, | 1279,48, | 1279,49, | 1279,50, | 1279,51, | 1279,52, | 1279,53, | 1279,54, | 1279,55, | 1279,56, | 1279,57, | 1279,58, | 1279,59, | 1279,60, | 1279,61, | 1279,62, | 1279,63, | 1279,64, | 1279,65, | 1279,66, | 1279,67, | 1279,68, | 1279,69, | 1279,70, | 1279,71, | 1279,72, | 1279,73, | 1279,74, | 1279,75, | 1279,76, | 1279,77, | 1279,78, | 1279,79, | 1279,80, | 1279,81, | 1279,82, | 1279,83, | 1279,84, | 1279,85, | 1280,1, | 1280,2, | 1280,3, | 1280,4, | 1280,5, | 1280,6, | 1280,7, | 1280,8, | 1280,9, | 1280,10, | 1280,11, | 1280,12, | 1280,13, | 1280,14, | 1280,15, | 1280,16, | 1280,17, | 1280,18, | 1280,19, | 1280,20, | 1280,21, | 1280,22, | 1280,23, | 1280,24, | 1280,25, | 1280,26, | 1280,27, | 1280,28, | 1280,29, | 1280,30, | 1280,31, | 1280,32, | 1280,33, | 1280,34, | 1280,35, | 1280,36, | 1280,37, | 1280,38, | 1280,39, | 1280,40, | 1280,41, | 1280,42, | 1280,43, | 1280,44, | 1280,45, | 1280,46, | 1280,47, | 1280,48, | 1280,49, | 1280,50, | 1280,51, | 1280,52, | 1280,53, | 1280,54, | 1280,55, | 1280,56, | 1280,57, | 1280,58, | 1280,59, | 1280,60, | 1280,61, | 1280,62, | 1280,63, | 1280,64, | 1280,65, | 1280,66, | 1280,67, | 1280,68, | 1280,69, | 1280,70, | 1280,71, | 1280,72, | 1280,73, | 1280,74, | 1280,75, | 1280,76, | 1280,77, | 1280,78, | 1280,79, | 1280,80, | 1280,81, | 1280,82, | 1280,83, | 1280,84, | 1280,85, | 1281,1, | 1281,2, | 1281,3, | 1281,4, | 1281,5, | 1281,6, | 1281,7, | 1281,8, | 1281,9, | 1281,10, | 1281,11, | 1281,12, | 1281,13, | 1281,14, | 1281,15, | 1281,16, | 1281,17, | 1281,18, | 1281,19, | 1281,20, | 1281,21, | 1281,22, | 1281,23, | 1281,24, | 1281,25, | 1281,26, | 1281,27, | 1281,28, | 1281,29, | 1281,30, | 1281,31, | 1281,32, | 1281,33, | 1281,34, | 1281,35, | 1281,36, | 1281,37, | 1281,38, | 1281,39, | 1281,40, | 1281,41, | 1281,42, | 1281,43, | 1281,44, | 1281,45, | 1281,46, | 1281,47, | 1281,48, | 1281,49, | 1281,50, | 1281,51, | 1281,52, | 1281,53, | 1281,54, | 1281,55, | 1281,56, | 1281,57, | 1281,58, | 1281,59, | 1281,60, | 1281,61, | 1281,62, | 1281,63, | 1281,64, | 1281,65, | 1281,66, | 1281,67, | 1281,68, | 1281,69, | 1281,70, | 1281,71, | 1281,72, | 1281,73, | 1281,74, | 1281,75, | 1281,76, | 1281,77, | 1281,78, | 1281,79, | 1281,80, | 1281,81, | 1281,82, | 1281,83, | 1281,84, | 1281,85, | 1282,1, | 1282,2, | 1282,3, | 1282,4, | 1282,5, | 1282,6, | 1282,7, | 1282,8, | 1282,9, | 1282,10, | 1282,11, | 1282,12, | 1282,13, | 1282,14, | 1282,15, | 1282,16, | 1282,17, | 1282,18, | 1282,19, | 1282,20, | 1282,21, | 1282,22, | 1282,23, | 1282,24, | 1282,25, | 1282,26, | 1282,27, | 1282,28, | 1282,29, | 1282,30, | 1282,31, | 1282,32, | 1282,33, | 1282,34, | 1282,35, | 1282,36, | 1282,37, | 1282,38, | 1282,39, | 1282,40, | 1282,41, | 1282,42, | 1282,43, | 1282,44, | 1282,45, | 1282,46, | 1282,47, | 1282,48, | 1282,49, | 1282,50, | 1282,51, | 1282,52, | 1282,53, | 1282,54, | 1282,55, | 1282,56, | 1282,57, | 1282,58, | 1282,59, | 1282,60, | 1282,61, | 1282,62, | 1282,63, | 1282,64, | 1282,65, | 1282,66, | 1282,67, | 1282,68, | 1282,69, | 1282,70, | 1282,71, | 1282,72, | 1282,73, | 1282,74, | 1282,75, | 1282,76, | 1282,77, | 1282,78, | 1282,79, | 1282,80, | 1282,81, | 1282,82, | 1282,83, | 1282,84, | 1282,85, | 1283,1, | 1283,2, | 1283,3, | 1283,4, | 1283,5, | 1283,6, | 1283,7, | 1283,8, | 1283,9, | 1283,10, | 1283,11, | 1283,12, | 1283,13, | 1283,14, | 1283,15, | 1283,16, | 1283,17, | 1283,18, | 1283,19, | 1283,20, | 1283,21, | 1283,22, | 1283,23, | 1283,24, | 1283,25, | 1283,26, | 1283,27, | 1283,28, | 1283,29, | 1283,30, | 1283,31, | 1283,32, | 1283,33, | 1283,34, | 1283,35, | 1283,36, | 1283,37, | 1283,38, | 1283,39, | 1283,40, | 1283,41, | 1283,42, | 1283,43, | 1283,44, | 1283,45, | 1283,46, | 1283,47, | 1283,48, | 1283,49, | 1283,50, | 1283,51, | 1283,52, | 1283,53, | 1283,54, | 1283,55, | 1283,56, | 1283,57, | 1283,58, | 1283,59, | 1283,60, | 1283,61, | 1283,62, | 1283,63, | 1283,64, | 1283,65, | 1283,66, | 1283,67, | 1283,68, | 1283,69, | 1283,70, | 1283,71, | 1283,72, | 1283,73, | 1283,74, | 1283,75, | 1283,76, | 1283,77, | 1283,78, | 1283,79, | 1283,80, | 1283,81, | 1283,82, | 1283,83, | 1283,84, | 1283,85, | 1284,1, | 1284,2, | 1284,3, | 1284,4, | 1284,5, | 1284,6, | 1284,7, | 1284,8, | 1284,9, | 1284,10, | 1284,11, | 1284,12, | 1284,13, | 1284,14, | 1284,15, | 1284,16, | 1284,17, | 1284,18, | 1284,19, | 1284,20, | 1284,21, | 1284,22, | 1284,23, | 1284,24, | 1284,25, | 1284,26, | 1284,27, | 1284,28, | 1284,29, | 1284,30, | 1284,31, | 1284,32, | 1284,33, | 1284,34, | 1284,35, | 1284,36, | 1284,37, | 1284,38, | 1284,39, | 1284,40, | 1284,41, | 1284,42, | 1284,43, | 1284,44, | 1284,45, | 1284,46, | 1284,47, | 1284,48, | 1284,49, | 1284,50, | 1284,51, | 1284,52, | 1284,53, | 1284,54, | 1284,55, | 1284,56, | 1284,57, | 1284,58, | 1284,59, | 1284,60, | 1284,61, | 1284,62, | 1284,63, | 1284,64, | 1284,65, | 1284,66, | 1284,67, | 1284,68, | 1284,69, | 1284,70, | 1284,71, | 1284,72, | 1284,73, | 1284,74, | 1284,75, | 1284,76, | 1284,77, | 1284,78, | 1284,79, | 1284,80, | 1284,81, | 1284,82, | 1284,83, | 1284,84, | 1284,85, | 1285,1, | 1285,2, | 1285,3, | 1285,4, | 1285,5, | 1285,6, | 1285,7, | 1285,8, | 1285,9, | 1285,10, | 1285,11, | 1285,12, | 1285,13, | 1285,14, | 1285,15, | 1285,16, | 1285,17, | 1285,18, | 1285,19, | 1285,20, | 1285,21, | 1285,22, | 1285,23, | 1285,24, | 1285,25, | 1285,26, | 1285,27, | 1285,28, | 1285,29, | 1285,30, | 1285,31, | 1285,32, | 1285,33, | 1285,34, | 1285,35, | 1285,36, | 1285,37, | 1285,38, | 1285,39, | 1285,40, | 1285,41, | 1285,42, | 1285,43, | 1285,44, | 1285,45, | 1285,46, | 1285,47, | 1285,48, | 1285,49, | 1285,50, | 1285,51, | 1285,52, | 1285,53, | 1285,54, | 1285,55, | 1285,56, | 1285,57, | 1285,58, | 1285,59, | 1285,60, | 1285,61, | 1285,62, | 1285,63, | 1285,64, | 1285,65, | 1285,66, | 1285,67, | 1285,68, | 1285,69, | 1285,70, | 1285,71, | 1285,72, | 1285,73, | 1285,74, | 1285,75, | 1285,76, | 1285,77, | 1285,78, | 1285,79, | 1285,80, | 1285,81, | 1285,82, | 1285,83, | 1285,84, | 1285,85, | 1286,1, | 1286,2, | 1286,3, | 1286,4, | 1286,5, | 1286,6, | 1286,7, | 1286,8, | 1286,9, | 1286,10, | 1286,11, | 1286,12, | 1286,13, | 1286,14, | 1286,15, | 1286,16, | 1286,17, | 1286,18, | 1286,19, | 1286,20, | 1286,21, | 1286,22, | 1286,23, | 1286,24, | 1286,25, | 1286,26, | 1286,27, | 1286,28, | 1286,29, | 1286,30, | 1286,31, | 1286,32, | 1286,33, | 1286,34, | 1286,35, | 1286,36, | 1286,37, | 1286,38, | 1286,39, | 1286,40, | 1286,41, | 1286,42, | 1286,43, | 1286,44, | 1286,45, | 1286,46, | 1286,47, | 1286,48, | 1286,49, | 1286,50, | 1286,51, | 1286,52, | 1286,53, | 1286,54, | 1286,55, | 1286,56, | 1286,57, | 1286,58, | 1286,59, | 1286,60, | 1286,61, | 1286,62, | 1286,63, | 1286,64, | 1286,65, | 1286,66, | 1286,67, | 1286,68, | 1286,69, | 1286,70, | 1286,71, | 1286,72, | 1286,73, | 1286,74, | 1286,75, | 1286,76, | 1286,77, | 1286,78, | 1286,79, | 1286,80, | 1286,81, | 1286,82, | 1286,83, | 1286,84, | 1286,85, | 1287,1, | 1287,2, | 1287,3, | 1287,4, | 1287,5, | 1287,6, | 1287,7, | 1287,8, | 1287,9, | 1287,10, | 1287,11, | 1287,12, | 1287,13, | 1287,14, | 1287,15, | 1287,16, | 1287,17, | 1287,18, | 1287,19, | 1287,20, | 1287,21, | 1287,22, | 1287,23, | 1287,24, | 1287,25, | 1287,26, | 1287,27, | 1287,28, | 1287,29, | 1287,30, | 1287,31, | 1287,32, | 1287,33, | 1287,34, | 1287,35, | 1287,36, | 1287,37, | 1287,38, | 1287,39, | 1287,40, | 1287,41, | 1287,42, | 1287,43, | 1287,44, | 1287,45, | 1287,46, | 1287,47, | 1287,48, | 1287,49, | 1287,50, | 1287,51, | 1287,52, | 1287,53, | 1287,54, | 1287,55, | 1287,56, | 1287,57, | 1287,58, | 1287,59, | 1287,60, | 1287,61, | 1287,62, | 1287,63, | 1287,64, | 1287,65, | 1287,66, | 1287,67, | 1287,68, | 1287,69, | 1287,70, | 1287,71, | 1287,72, | 1287,73, | 1287,74, | 1287,75, | 1287,76, | 1287,77, | 1287,78, | 1287,79, | 1287,80, | 1287,81, | 1287,82, | 1287,83, | 1287,84, | 1287,85, | 1288,1, | 1288,2, | 1288,3, | 1288,4, | 1288,5, | 1288,6, | 1288,7, | 1288,8, | 1288,9, | 1288,10, | 1288,11, | 1288,12, | 1288,13, | 1288,14, | 1288,15, | 1288,16, | 1288,17, | 1288,18, | 1288,19, | 1288,20, | 1288,21, | 1288,22, | 1288,23, | 1288,24, | 1288,25, | 1288,26, | 1288,27, | 1288,28, | 1288,29, | 1288,30, | 1288,31, | 1288,32, | 1288,33, | 1288,34, | 1288,35, | 1288,36, | 1288,37, | 1288,38, | 1288,39, | 1288,40, | 1288,41, | 1288,42, | 1288,43, | 1288,44, | 1288,45, | 1288,46, | 1288,47, | 1288,48, | 1288,49, | 1288,50, | 1288,51, | 1288,52, | 1288,53, | 1288,54, | 1288,55, | 1288,56, | 1288,57, | 1288,58, | 1288,59, | 1288,60, | 1288,61, | 1288,62, | 1288,63, | 1288,64, | 1288,65, | 1288,66, | 1288,67, | 1288,68, | 1288,69, | 1288,70, | 1288,71, | 1288,72, | 1288,73, | 1288,74, | 1288,75, | 1288,76, | 1288,77, | 1288,78, | 1288,79, | 1288,80, | 1288,81, | 1288,82, | 1288,83, | 1288,84, | 1288,85, | 1289,1, | 1289,2, | 1289,3, | 1289,4, | 1289,5, | 1289,6, | 1289,7, | 1289,8, | 1289,9, | 1289,10, | 1289,11, | 1289,12, | 1289,13, | 1289,14, | 1289,15, | 1289,16, | 1289,17, | 1289,18, | 1289,19, | 1289,20, | 1289,21, | 1289,22, | 1289,23, | 1289,24, | 1289,25, | 1289,26, | 1289,27, | 1289,28, | 1289,29, | 1289,30, | 1289,31, | 1289,32, | 1289,33, | 1289,34, | 1289,35, | 1289,36, | 1289,37, | 1289,38, | 1289,39, | 1289,40, | 1289,41, | 1289,42, | 1289,43, | 1289,44, | 1289,45, | 1289,46, | 1289,47, | 1289,48, | 1289,49, | 1289,50, | 1289,51, | 1289,52, | 1289,53, | 1289,54, | 1289,55, | 1289,56, | 1289,57, | 1289,58, | 1289,59, | 1289,60, | 1289,61, | 1289,62, | 1289,63, | 1289,64, | 1289,65, | 1289,66, | 1289,67, | 1289,68, | 1289,69, | 1289,70, | 1289,71, | 1289,72, | 1289,73, | 1289,74, | 1289,75, | 1289,76, | 1289,77, | 1289,78, | 1289,79, | 1289,80, | 1289,81, | 1289,82, | 1289,83, | 1289,84, | 1289,85, | 1290,1, | 1290,2, | 1290,3, | 1290,4, | 1290,5, | 1290,6, | 1290,7, | 1290,8, | 1290,9, | 1290,10, | 1290,11, | 1290,12, | 1290,13, | 1290,14, | 1290,15, | 1290,16, | 1290,17, | 1290,18, | 1290,19, | 1290,20, | 1290,21, | 1290,22, | 1290,23, | 1290,24, | 1290,25, | 1290,26, | 1290,27, | 1290,28, | 1290,29, | 1290,30, | 1290,31, | 1290,32, | 1290,33, | 1290,34, | 1290,35, | 1290,36, | 1290,37, | 1290,38, | 1290,39, | 1290,40, | 1290,41, | 1290,42, | 1290,43, | 1290,44, | 1290,45, | 1290,46, | 1290,47, | 1290,48, | 1290,49, | 1290,50, | 1290,51, | 1290,52, | 1290,53, | 1290,54, | 1290,55, | 1290,56, | 1290,57, | 1290,58, | 1290,59, | 1290,60, | 1290,61, | 1290,62, | 1290,63, | 1290,64, | 1290,65, | 1290,66, | 1290,67, | 1290,68, | 1290,69, | 1290,70, | 1290,71, | 1290,72, | 1290,73, | 1290,74, | 1290,75, | 1290,76, | 1290,77, | 1290,78, | 1290,79, | 1290,80, | 1290,81, | 1290,82, | 1290,83, | 1290,84, | 1290,85, | 1291,1, | 1291,2, | 1291,3, | 1291,4, | 1291,5, | 1291,6, | 1291,7, | 1291,8, | 1291,9, | 1291,10, | 1291,11, | 1291,12, | 1291,13, | 1291,14, | 1291,15, | 1291,16, | 1291,17, | 1291,18, | 1291,19, | 1291,20, | 1291,21, | 1291,22, | 1291,23, | 1291,24, | 1291,25, | 1291,26, | 1291,27, | 1291,28, | 1291,29, | 1291,30, | 1291,31, | 1291,32, | 1291,33, | 1291,34, | 1291,35, | 1291,36, | 1291,37, | 1291,38, | 1291,39, | 1291,40, | 1291,41, | 1291,42, | 1291,43, | 1291,44, | 1291,45, | 1291,46, | 1291,47, | 1291,48, | 1291,49, | 1291,50, | 1291,51, | 1291,52, | 1291,53, | 1291,54, | 1291,55, | 1291,56, | 1291,57, | 1291,58, | 1291,59, | 1291,60, | 1291,61, | 1291,62, | 1291,63, | 1291,64, | 1291,65, | 1291,66, | 1291,67, | 1291,68, | 1291,69, | 1291,70, | 1291,71, | 1291,72, | 1291,73, | 1291,74, | 1291,75, | 1291,76, | 1291,77, | 1291,78, | 1291,79, | 1291,80, | 1291,81, | 1291,82, | 1291,83, | 1291,84, | 1291,85, | 1292,1, | 1292,2, | 1292,3, | 1292,4, | 1292,5, | 1292,6, | 1292,7, | 1292,8, | 1292,9, | 1292,10, | 1292,11, | 1292,12, | 1292,13, | 1292,14, | 1292,15, | 1292,16, | 1292,17, | 1292,18, | 1292,19, | 1292,20, | 1292,21, | 1292,22, | 1292,23, | 1292,24, | 1292,25, | 1292,26, | 1292,27, | 1292,28, | 1292,29, | 1292,30, | 1292,31, | 1292,32, | 1292,33, | 1292,34, | 1292,35, | 1292,36, | 1292,37, | 1292,38, | 1292,39, | 1292,40, | 1292,41, | 1292,42, | 1292,43, | 1292,44, | 1292,45, | 1292,46, | 1292,47, | 1292,48, | 1292,49, | 1292,50, | 1292,51, | 1292,52, | 1292,53, | 1292,54, | 1292,55, | 1292,56, | 1292,57, | 1292,58, | 1292,59, | 1292,60, | 1292,61, | 1292,62, | 1292,63, | 1292,64, | 1292,65, | 1292,66, | 1292,67, | 1292,68, | 1292,69, | 1292,70, | 1292,71, | 1292,72, | 1292,73, | 1292,74, | 1292,75, | 1292,76, | 1292,77, | 1292,78, | 1292,79, | 1292,80, | 1292,81, | 1292,82, | 1292,83, | 1292,84, | 1292,85, | 1293,1, | 1293,2, | 1293,3, | 1293,4, | 1293,5, | 1293,6, | 1293,7, | 1293,8, | 1293,9, | 1293,10, | 1293,11, | 1293,12, | 1293,13, | 1293,14, | 1293,15, | 1293,16, | 1293,17, | 1293,18, | 1293,19, | 1293,20, | 1293,21, | 1293,22, | 1293,23, | 1293,24, | 1293,25, | 1293,26, | 1293,27, | 1293,28, | 1293,29, | 1293,30, | 1293,31, | 1293,32, | 1293,33, | 1293,34, | 1293,35, | 1293,36, | 1293,37, | 1293,38, | 1293,39, | 1293,40, | 1293,41, | 1293,42, | 1293,43, | 1293,44, | 1293,45, | 1293,46, | 1293,47, | 1293,48, | 1293,49, | 1293,50, | 1293,51, | 1293,52, | 1293,53, | 1293,54, | 1293,55, | 1293,56, | 1293,57, | 1293,58, | 1293,59, | 1293,60, | 1293,61, | 1293,62, | 1293,63, | 1293,64, | 1293,65, | 1293,66, | 1293,67, | 1293,68, | 1293,69, | 1293,70, | 1293,71, | 1293,72, | 1293,73, | 1293,74, | 1293,75, | 1293,76, | 1293,77, | 1293,78, | 1293,79, | 1293,80, | 1293,81, | 1293,82, | 1293,83, | 1293,84, | 1293,85, | 1294,1, | 1294,2, | 1294,3, | 1294,4, | 1294,5, | 1294,6, | 1294,7, | 1294,8, | 1294,9, | 1294,10, | 1294,11, | 1294,12, | 1294,13, | 1294,14, | 1294,15, | 1294,16, | 1294,17, | 1294,18, | 1294,19, | 1294,20, | 1294,21, | 1294,22, | 1294,23, | 1294,24, | 1294,25, | 1294,26, | 1294,27, | 1294,28, | 1294,29, | 1294,30, | 1294,31, | 1294,32, | 1294,33, | 1294,34, | 1294,35, | 1294,36, | 1294,37, | 1294,38, | 1294,39, | 1294,40, | 1294,41, | 1294,42, | 1294,43, | 1294,44, | 1294,45, | 1294,46, | 1294,47, | 1294,48, | 1294,49, | 1294,50, | 1294,51, | 1294,52, | 1294,53, | 1294,54, | 1294,55, | 1294,56, | 1294,57, | 1294,58, | 1294,59, | 1294,60, | 1294,61, | 1294,62, | 1294,63, | 1294,64, | 1294,65, | 1294,66, | 1294,67, | 1294,68, | 1294,69, | 1294,70, | 1294,71, | 1294,72, | 1294,73, | 1294,74, | 1294,75, | 1294,76, | 1294,77, | 1294,78, | 1294,79, | 1294,80, | 1294,81, | 1294,82, | 1294,83, | 1294,84, | 1294,85, | 1295,1, | 1295,2, | 1295,3, | 1295,4, | 1295,5, | 1295,6, | 1295,7, | 1295,8, | 1295,9, | 1295,10, | 1295,11, | 1295,12, | 1295,13, | 1295,14, | 1295,15, | 1295,16, | 1295,17, | 1295,18, | 1295,19, | 1295,20, | 1295,21, | 1295,22, | 1295,23, | 1295,24, | 1295,25, | 1295,26, | 1295,27, | 1295,28, | 1295,29, | 1295,30, | 1295,31, | 1295,32, | 1295,33, | 1295,34, | 1295,35, | 1295,36, | 1295,37, | 1295,38, | 1295,39, | 1295,40, | 1295,41, | 1295,42, | 1295,43, | 1295,44, | 1295,45, | 1295,46, | 1295,47, | 1295,48, | 1295,49, | 1295,50, | 1295,51, | 1295,52, | 1295,53, | 1295,54, | 1295,55, | 1295,56, | 1295,57, | 1295,58, | 1295,59, | 1295,60, | 1295,61, | 1295,62, | 1295,63, | 1295,64, | 1295,65, | 1295,66, | 1295,67, | 1295,68, | 1295,69, | 1295,70, | 1295,71, | 1295,72, | 1295,73, | 1295,74, | 1295,75, | 1295,76, | 1295,77, | 1295,78, | 1295,79, | 1295,80, | 1295,81, | 1295,82, | 1295,83, | 1295,84, | 1295,85, | 1296,1, | 1296,2, | 1296,3, | 1296,4, | 1296,5, | 1296,6, | 1296,7, | 1296,8, | 1296,9, | 1296,10, | 1296,11, | 1296,12, | 1296,13, | 1296,14, | 1296,15, | 1296,16, | 1296,17, | 1296,18, | 1296,19, | 1296,20, | 1296,21, | 1296,22, | 1296,23, | 1296,24, | 1296,25, | 1296,26, | 1296,27, | 1296,28, | 1296,29, | 1296,30, | 1296,31, | 1296,32, | 1296,33, | 1296,34, | 1296,35, | 1296,36, | 1296,37, | 1296,38, | 1296,39, | 1296,40, | 1296,41, | 1296,42, | 1296,43, | 1296,44, | 1296,45, | 1296,46, | 1296,47, | 1296,48, | 1296,49, | 1296,50, | 1296,51, | 1296,52, | 1296,53, | 1296,54, | 1296,55, | 1296,56, | 1296,57, | 1296,58, | 1296,59, | 1296,60, | 1296,61, | 1296,62, | 1296,63, | 1296,64, | 1296,65, | 1296,66, | 1296,67, | 1296,68, | 1296,69, | 1296,70, | 1296,71, | 1296,72, | 1296,73, | 1296,74, | 1296,75, | 1296,76, | 1296,77, | 1296,78, | 1296,79, | 1296,80, | 1296,81, | 1296,82, | 1296,83, | 1296,84, | 1296,85, | 1297,1, | 1297,2, | 1297,3, | 1297,4, | 1297,5, | 1297,6, | 1297,7, | 1297,8, | 1297,9, | 1297,10, | 1297,11, | 1297,12, | 1297,13, | 1297,14, | 1297,15, | 1297,16, | 1297,17, | 1297,18, | 1297,19, | 1297,20, | 1297,21, | 1297,22, | 1297,23, | 1297,24, | 1297,25, | 1297,26, | 1297,27, | 1297,28, | 1297,29, | 1297,30, | 1297,31, | 1297,32, | 1297,33, | 1297,34, | 1297,35, | 1297,36, | 1297,37, | 1297,38, | 1297,39, | 1297,40, | 1297,41, | 1297,42, | 1297,43, | 1297,44, | 1297,45, | 1297,46, | 1297,47, | 1297,48, | 1297,49, | 1297,50, | 1297,51, | 1297,52, | 1297,53, | 1297,54, | 1297,55, | 1297,56, | 1297,57, | 1297,58, | 1297,59, | 1297,60, | 1297,61, | 1297,62, | 1297,63, | 1297,64, | 1297,65, | 1297,66, | 1297,67, | 1297,68, | 1297,69, | 1297,70, | 1297,71, | 1297,72, | 1297,73, | 1297,74, | 1297,75, | 1297,76, | 1297,77, | 1297,78, | 1297,79, | 1297,80, | 1297,81, | 1297,82, | 1297,83, | 1297,84, | 1297,85, | 1298,1, | 1298,2, | 1298,3, | 1298,4, | 1298,5, | 1298,6, | 1298,7, | 1298,8, | 1298,9, | 1298,10, | 1298,11, | 1298,12, | 1298,13, | 1298,14, | 1298,15, | 1298,16, | 1298,17, | 1298,18, | 1298,19, | 1298,20, | 1298,21, | 1298,22, | 1298,23, | 1298,24, | 1298,25, | 1298,26, | 1298,27, | 1298,28, | 1298,29, | 1298,30, | 1298,31, | 1298,32, | 1298,33, | 1298,34, | 1298,35, | 1298,36, | 1298,37, | 1298,38, | 1298,39, | 1298,40, | 1298,41, | 1298,42, | 1298,43, | 1298,44, | 1298,45, | 1298,46, | 1298,47, | 1298,48, | 1298,49, | 1298,50, | 1298,51, | 1298,52, | 1298,53, | 1298,54, | 1298,55, | 1298,56, | 1298,57, | 1298,58, | 1298,59, | 1298,60, | 1298,61, | 1298,62, | 1298,63, | 1298,64, | 1298,65, | 1298,66, | 1298,67, | 1298,68, | 1298,69, | 1298,70, | 1298,71, | 1298,72, | 1298,73, | 1298,74, | 1298,75, | 1298,76, | 1298,77, | 1298,78, | 1298,79, | 1298,80, | 1298,81, | 1298,82, | 1298,83, | 1298,84, | 1298,85, | 1299,1, | 1299,2, | 1299,3, | 1299,4, | 1299,5, | 1299,6, | 1299,7, | 1299,8, | 1299,9, | 1299,10, | 1299,11, | 1299,12, | 1299,13, | 1299,14, | 1299,15, | 1299,16, | 1299,17, | 1299,18, | 1299,19, | 1299,20, | 1299,21, | 1299,22, | 1299,23, | 1299,24, | 1299,25, | 1299,26, | 1299,27, | 1299,28, | 1299,29, | 1299,30, | 1299,31, | 1299,32, | 1299,33, | 1299,34, | 1299,35, | 1299,36, | 1299,37, | 1299,38, | 1299,39, | 1299,40, | 1299,41, | 1299,42, | 1299,43, | 1299,44, | 1299,45, | 1299,46, | 1299,47, | 1299,48, | 1299,49, | 1299,50, | 1299,51, | 1299,52, | 1299,53, | 1299,54, | 1299,55, | 1299,56, | 1299,57, | 1299,58, | 1299,59, | 1299,60, | 1299,61, | 1299,62, | 1299,63, | 1299,64, | 1299,65, | 1299,66, | 1299,67, | 1299,68, | 1299,69, | 1299,70, | 1299,71, | 1299,72, | 1299,73, | 1299,74, | 1299,75, | 1299,76, | 1299,77, | 1299,78, | 1299,79, | 1299,80, | 1299,81, | 1299,82, | 1299,83, | 1299,84, | 1299,85, | 1300,1, | 1300,2, | 1300,3, | 1300,4, | 1300,5, | 1300,6, | 1300,7, | 1300,8, | 1300,9, | 1300,10, | 1300,11, | 1300,12, | 1300,13, | 1300,14, | 1300,15, | 1300,16, | 1300,17, | 1300,18, | 1300,19, | 1300,20, | 1300,21, | 1300,22, | 1300,23, | 1300,24, | 1300,25, | 1300,26, | 1300,27, | 1300,28, | 1300,29, | 1300,30, | 1300,31, | 1300,32, | 1300,33, | 1300,34, | 1300,35, | 1300,36, | 1300,37, | 1300,38, | 1300,39, | 1300,40, | 1300,41, | 1300,42, | 1300,43, | 1300,44, | 1300,45, | 1300,46, | 1300,47, | 1300,48, | 1300,49, | 1300,50, | 1300,51, | 1300,52, | 1300,53, | 1300,54, | 1300,55, | 1300,56, | 1300,57, | 1300,58, | 1300,59, | 1300,60, | 1300,61, | 1300,62, | 1300,63, | 1300,64, | 1300,65, | 1300,66, | 1300,67, | 1300,68, | 1300,69, | 1300,70, | 1300,71, | 1300,72, | 1300,73, | 1300,74, | 1300,75, | 1300,76, | 1300,77, | 1300,78, | 1300,79, | 1300,80, | 1300,81, | 1300,82, | 1300,83, | 1300,84, | 1300,85, | 1301,1, | 1301,2, | 1301,3, | 1301,4, | 1301,5, | 1301,6, | 1301,7, | 1301,8, | 1301,9, | 1301,10, | 1301,11, | 1301,12, | 1301,13, | 1301,14, | 1301,15, | 1301,16, | 1301,17, | 1301,18, | 1301,19, | 1301,20, | 1301,21, | 1301,22, | 1301,23, | 1301,24, | 1301,25, | 1301,26, | 1301,27, | 1301,28, | 1301,29, | 1301,30, | 1301,31, | 1301,32, | 1301,33, | 1301,34, | 1301,35, | 1301,36, | 1301,37, | 1301,38, | 1301,39, | 1301,40, | 1301,41, | 1301,42, | 1301,43, | 1301,44, | 1301,45, | 1301,46, | 1301,47, | 1301,48, | 1301,49, | 1301,50, | 1301,51, | 1301,52, | 1301,53, | 1301,54, | 1301,55, | 1301,56, | 1301,57, | 1301,58, | 1301,59, | 1301,60, | 1301,61, | 1301,62, | 1301,63, | 1301,64, | 1301,65, | 1301,66, | 1301,67, | 1301,68, | 1301,69, | 1301,70, | 1301,71, | 1301,72, | 1301,73, | 1301,74, | 1301,75, | 1301,76, | 1301,77, | 1301,78, | 1301,79, | 1301,80, | 1301,81, | 1301,82, | 1301,83, | 1301,84, | 1301,85, | 1302,1, | 1302,2, | 1302,3, | 1302,4, | 1302,5, | 1302,6, | 1302,7, | 1302,8, | 1302,9, | 1302,10, | 1302,11, | 1302,12, | 1302,13, | 1302,14, | 1302,15, | 1302,16, | 1302,17, | 1302,18, | 1302,19, | 1302,20, | 1302,21, | 1302,22, | 1302,23, | 1302,24, | 1302,25, | 1302,26, | 1302,27, | 1302,28, | 1302,29, | 1302,30, | 1302,31, | 1302,32, | 1302,33, | 1302,34, | 1302,35, | 1302,36, | 1302,37, | 1302,38, | 1302,39, | 1302,40, | 1302,41, | 1302,42, | 1302,43, | 1302,44, | 1302,45, | 1302,46, | 1302,47, | 1302,48, | 1302,49, | 1302,50, | 1302,51, | 1302,52, | 1302,53, | 1302,54, | 1302,55, | 1302,56, | 1302,57, | 1302,58, | 1302,59, | 1302,60, | 1302,61, | 1302,62, | 1302,63, | 1302,64, | 1302,65, | 1302,66, | 1302,67, | 1302,68, | 1302,69, | 1302,70, | 1302,71, | 1302,72, | 1302,73, | 1302,74, | 1302,75, | 1302,76, | 1302,77, | 1302,78, | 1302,79, | 1302,80, | 1302,81, | 1302,82, | 1302,83, | 1302,84, | 1302,85, | 1303,1, | 1303,2, | 1303,3, | 1303,4, | 1303,5, | 1303,6, | 1303,7, | 1303,8, | 1303,9, | 1303,10, | 1303,11, | 1303,12, | 1303,13, | 1303,14, | 1303,15, | 1303,16, | 1303,17, | 1303,18, | 1303,19, | 1303,20, | 1303,21, | 1303,22, | 1303,23, | 1303,24, | 1303,25, | 1303,26, | 1303,27, | 1303,28, | 1303,29, | 1303,30, | 1303,31, | 1303,32, | 1303,33, | 1303,34, | 1303,35, | 1303,36, | 1303,37, | 1303,38, | 1303,39, | 1303,40, | 1303,41, | 1303,42, | 1303,43, | 1303,44, | 1303,45, | 1303,46, | 1303,47, | 1303,48, | 1303,49, | 1303,50, | 1303,51, | 1303,52, | 1303,53, | 1303,54, | 1303,55, | 1303,56, | 1303,57, | 1303,58, | 1303,59, | 1303,60, | 1303,61, | 1303,62, | 1303,63, | 1303,64, | 1303,65, | 1303,66, | 1303,67, | 1303,68, | 1303,69, | 1303,70, | 1303,71, | 1303,72, | 1303,73, | 1303,74, | 1303,75, | 1303,76, | 1303,77, | 1303,78, | 1303,79, | 1303,80, | 1303,81, | 1303,82, | 1303,83, | 1303,84, | 1303,85, | 1304,1, | 1304,2, | 1304,3, | 1304,4, | 1304,5, | 1304,6, | 1304,7, | 1304,8, | 1304,9, | 1304,10, | 1304,11, | 1304,12, | 1304,13, | 1304,14, | 1304,15, | 1304,16, | 1304,17, | 1304,18, | 1304,19, | 1304,20, | 1304,21, | 1304,22, | 1304,23, | 1304,24, | 1304,25, | 1304,26, | 1304,27, | 1304,28, | 1304,29, | 1304,30, | 1304,31, | 1304,32, | 1304,33, | 1304,34, | 1304,35, | 1304,36, | 1304,37, | 1304,38, | 1304,39, | 1304,40, | 1304,41, | 1304,42, | 1304,43, | 1304,44, | 1304,45, | 1304,46, | 1304,47, | 1304,48, | 1304,49, | 1304,50, | 1304,51, | 1304,52, | 1304,53, | 1304,54, | 1304,55, | 1304,56, | 1304,57, | 1304,58, | 1304,59, | 1304,60, | 1304,61, | 1304,62, | 1304,63, | 1304,64, | 1304,65, | 1304,66, | 1304,67, | 1304,68, | 1304,69, | 1304,70, | 1304,71, | 1304,72, | 1304,73, | 1304,74, | 1304,75, | 1304,76, | 1304,77, | 1304,78, | 1304,79, | 1304,80, | 1304,81, | 1304,82, | 1304,83, | 1304,84, | 1304,85, | 1305,1, | 1305,2, | 1305,3, | 1305,4, | 1305,5, | 1305,6, | 1305,7, | 1305,8, | 1305,9, | 1305,10, | 1305,11, | 1305,12, | 1305,13, | 1305,14, | 1305,15, | 1305,16, | 1305,17, | 1305,18, | 1305,19, | 1305,20, | 1305,21, | 1305,22, | 1305,23, | 1305,24, | 1305,25, | 1305,26, | 1305,27, | 1305,28, | 1305,29, | 1305,30, | 1305,31, | 1305,32, | 1305,33, | 1305,34, | 1305,35, | 1305,36, | 1305,37, | 1305,38, | 1305,39, | 1305,40, | 1305,41, | 1305,42, | 1305,43, | 1305,44, | 1305,45, | 1305,46, | 1305,47, | 1305,48, | 1305,49, | 1305,50, | 1305,51, | 1305,52, | 1305,53, | 1305,54, | 1305,55, | 1305,56, | 1305,57, | 1305,58, | 1305,59, | 1305,60, | 1305,61, | 1305,62, | 1305,63, | 1305,64, | 1305,65, | 1305,66, | 1305,67, | 1305,68, | 1305,69, | 1305,70, | 1305,71, | 1305,72, | 1305,73, | 1305,74, | 1305,75, | 1305,76, | 1305,77, | 1305,78, | 1305,79, | 1305,80, | 1305,81, | 1305,82, | 1305,83, | 1305,84, | 1305,85, | 1306,1, | 1306,2, | 1306,3, | 1306,4, | 1306,5, | 1306,6, | 1306,7, | 1306,8, | 1306,9, | 1306,10, | 1306,11, | 1306,12, | 1306,13, | 1306,14, | 1306,15, | 1306,16, | 1306,17, | 1306,18, | 1306,19, | 1306,20, | 1306,21, | 1306,22, | 1306,23, | 1306,24, | 1306,25, | 1306,26, | 1306,27, | 1306,28, | 1306,29, | 1306,30, | 1306,31, | 1306,32, | 1306,33, | 1306,34, | 1306,35, | 1306,36, | 1306,37, | 1306,38, | 1306,39, | 1306,40, | 1306,41, | 1306,42, | 1306,43, | 1306,44, | 1306,45, | 1306,46, | 1306,47, | 1306,48, | 1306,49, | 1306,50, | 1306,51, | 1306,52, | 1306,53, | 1306,54, | 1306,55, | 1306,56, | 1306,57, | 1306,58, | 1306,59, | 1306,60, | 1306,61, | 1306,62, | 1306,63, | 1306,64, | 1306,65, | 1306,66, | 1306,67, | 1306,68, | 1306,69, | 1306,70, | 1306,71, | 1306,72, | 1306,73, | 1306,74, | 1306,75, | 1306,76, | 1306,77, | 1306,78, | 1306,79, | 1306,80, | 1306,81, | 1306,82, | 1306,83, | 1306,84, | 1306,85, | 1307,1, | 1307,2, | 1307,3, | 1307,4, | 1307,5, | 1307,6, | 1307,7, | 1307,8, | 1307,9, | 1307,10, | 1307,11, | 1307,12, | 1307,13, | 1307,14, | 1307,15, | 1307,16, | 1307,17, | 1307,18, | 1307,19, | 1307,20, | 1307,21, | 1307,22, | 1307,23, | 1307,24, | 1307,25, | 1307,26, | 1307,27, | 1307,28, | 1307,29, | 1307,30, | 1307,31, | 1307,32, | 1307,33, | 1307,34, | 1307,35, | 1307,36, | 1307,37, | 1307,38, | 1307,39, | 1307,40, | 1307,41, | 1307,42, | 1307,43, | 1307,44, | 1307,45, | 1307,46, | 1307,47, | 1307,48, | 1307,49, | 1307,50, | 1307,51, | 1307,52, | 1307,53, | 1307,54, | 1307,55, | 1307,56, | 1307,57, | 1307,58, | 1307,59, | 1307,60, | 1307,61, | 1307,62, | 1307,63, | 1307,64, | 1307,65, | 1307,66, | 1307,67, | 1307,68, | 1307,69, | 1307,70, | 1307,71, | 1307,72, | 1307,73, | 1307,74, | 1307,75, | 1307,76, | 1307,77, | 1307,78, | 1307,79, | 1307,80, | 1307,81, | 1307,82, | 1307,83, | 1307,84, | 1307,85, | 1308,1, | 1308,2, | 1308,3, | 1308,4, | 1308,5, | 1308,6, | 1308,7, | 1308,8, | 1308,9, | 1308,10, | 1308,11, | 1308,12, | 1308,13, | 1308,14, | 1308,15, | 1308,16, | 1308,17, | 1308,18, | 1308,19, | 1308,20, | 1308,21, | 1308,22, | 1308,23, | 1308,24, | 1308,25, | 1308,26, | 1308,27, | 1308,28, | 1308,29, | 1308,30, | 1308,31, | 1308,32, | 1308,33, | 1308,34, | 1308,35, | 1308,36, | 1308,37, | 1308,38, | 1308,39, | 1308,40, | 1308,41, | 1308,42, | 1308,43, | 1308,44, | 1308,45, | 1308,46, | 1308,47, | 1308,48, | 1308,49, | 1308,50, | 1308,51, | 1308,52, | 1308,53, | 1308,54, | 1308,55, | 1308,56, | 1308,57, | 1308,58, | 1308,59, | 1308,60, | 1308,61, | 1308,62, | 1308,63, | 1308,64, | 1308,65, | 1308,66, | 1308,67, | 1308,68, | 1308,69, | 1308,70, | 1308,71, | 1308,72, | 1308,73, | 1308,74, | 1308,75, | 1308,76, | 1308,77, | 1308,78, | 1308,79, | 1308,80, | 1308,81, | 1308,82, | 1308,83, | 1308,84, | 1308,85, | 1309,1, | 1309,2, | 1309,3, | 1309,4, | 1309,5, | 1309,6, | 1309,7, | 1309,8, | 1309,9, | 1309,10, | 1309,11, | 1309,12, | 1309,13, | 1309,14, | 1309,15, | 1309,16, | 1309,17, | 1309,18, | 1309,19, | 1309,20, | 1309,21, | 1309,22, | 1309,23, | 1309,24, | 1309,25, | 1309,26, | 1309,27, | 1309,28, | 1309,29, | 1309,30, | 1309,31, | 1309,32, | 1309,33, | 1309,34, | 1309,35, | 1309,36, | 1309,37, | 1309,38, | 1309,39, | 1309,40, | 1309,41, | 1309,42, | 1309,43, | 1309,44, | 1309,45, | 1309,46, | 1309,47, | 1309,48, | 1309,49, | 1309,50, | 1309,51, | 1309,52, | 1309,53, | 1309,54, | 1309,55, | 1309,56, | 1309,57, | 1309,58, | 1309,59, | 1309,60, | 1309,61, | 1309,62, | 1309,63, | 1309,64, | 1309,65, | 1309,66, | 1309,67, | 1309,68, | 1309,69, | 1309,70, | 1309,71, | 1309,72, | 1309,73, | 1309,74, | 1309,75, | 1309,76, | 1309,77, | 1309,78, | 1309,79, | 1309,80, | 1309,81, | 1309,82, | 1309,83, | 1309,84, | 1309,85, | 1310,1, | 1310,2, | 1310,3, | 1310,4, | 1310,5, | 1310,6, | 1310,7, | 1310,8, | 1310,9, | 1310,10, | 1310,11, | 1310,12, | 1310,13, | 1310,14, | 1310,15, | 1310,16, | 1310,17, | 1310,18, | 1310,19, | 1310,20, | 1310,21, | 1310,22, | 1310,23, | 1310,24, | 1310,25, | 1310,26, | 1310,27, | 1310,28, | 1310,29, | 1310,30, | 1310,31, | 1310,32, | 1310,33, | 1310,34, | 1310,35, | 1310,36, | 1310,37, | 1310,38, | 1310,39, | 1310,40, | 1310,41, | 1310,42, | 1310,43, | 1310,44, | 1310,45, | 1310,46, | 1310,47, | 1310,48, | 1310,49, | 1310,50, | 1310,51, | 1310,52, | 1310,53, | 1310,54, | 1310,55, | 1310,56, | 1310,57, | 1310,58, | 1310,59, | 1310,60, | 1310,61, | 1310,62, | 1310,63, | 1310,64, | 1310,65, | 1310,66, | 1310,67, | 1310,68, | 1310,69, | 1310,70, | 1310,71, | 1310,72, | 1310,73, | 1310,74, | 1310,75, | 1310,76, | 1310,77, | 1310,78, | 1310,79, | 1310,80, | 1310,81, | 1310,82, | 1310,83, | 1310,84, | 1310,85, | 1311,1, | 1311,2, | 1311,3, | 1311,4, | 1311,5, | 1311,6, | 1311,7, | 1311,8, | 1311,9, | 1311,10, | 1311,11, | 1311,12, | 1311,13, | 1311,14, | 1311,15, | 1311,16, | 1311,17, | 1311,18, | 1311,19, | 1311,20, | 1311,21, | 1311,22, | 1311,23, | 1311,24, | 1311,25, | 1311,26, | 1311,27, | 1311,28, | 1311,29, | 1311,30, | 1311,31, | 1311,32, | 1311,33, | 1311,34, | 1311,35, | 1311,36, | 1311,37, | 1311,38, | 1311,39, | 1311,40, | 1311,41, | 1311,42, | 1311,43, | 1311,44, | 1311,45, | 1311,46, | 1311,47, | 1311,48, | 1311,49, | 1311,50, | 1311,51, | 1311,52, | 1311,53, | 1311,54, | 1311,55, | 1311,56, | 1311,57, | 1311,58, | 1311,59, | 1311,60, | 1311,61, | 1311,62, | 1311,63, | 1311,64, | 1311,65, | 1311,66, | 1311,67, | 1311,68, | 1311,69, | 1311,70, | 1311,71, | 1311,72, | 1311,73, | 1311,74, | 1311,75, | 1311,76, | 1311,77, | 1311,78, | 1311,79, | 1311,80, | 1311,81, | 1311,82, | 1311,83, | 1311,84, | 1311,85, | 1312,1, | 1312,2, | 1312,3, | 1312,4, | 1312,5, | 1312,6, | 1312,7, | 1312,8, | 1312,9, | 1312,10, | 1312,11, | 1312,12, | 1312,13, | 1312,14, | 1312,15, | 1312,16, | 1312,17, | 1312,18, | 1312,19, | 1312,20, | 1312,21, | 1312,22, | 1312,23, | 1312,24, | 1312,25, | 1312,26, | 1312,27, | 1312,28, | 1312,29, | 1312,30, | 1312,31, | 1312,32, | 1312,33, | 1312,34, | 1312,35, | 1312,36, | 1312,37, | 1312,38, | 1312,39, | 1312,40, | 1312,41, | 1312,42, | 1312,43, | 1312,44, | 1312,45, | 1312,46, | 1312,47, | 1312,48, | 1312,49, | 1312,50, | 1312,51, | 1312,52, | 1312,53, | 1312,54, | 1312,55, | 1312,56, | 1312,57, | 1312,58, | 1312,59, | 1312,60, | 1312,61, | 1312,62, | 1312,63, | 1312,64, | 1312,65, | 1312,66, | 1312,67, | 1312,68, | 1312,69, | 1312,70, | 1312,71, | 1312,72, | 1312,73, | 1312,74, | 1312,75, | 1312,76, | 1312,77, | 1312,78, | 1312,79, | 1312,80, | 1312,81, | 1312,82, | 1312,83, | 1312,84, | 1312,85, | 1313,1, | 1313,2, | 1313,3, | 1313,4, | 1313,5, | 1313,6, | 1313,7, | 1313,8, | 1313,9, | 1313,10, | 1313,11, | 1313,12, | 1313,13, | 1313,14, | 1313,15, | 1313,16, | 1313,17, | 1313,18, | 1313,19, | 1313,20, | 1313,21, | 1313,22, | 1313,23, | 1313,24, | 1313,25, | 1313,26, | 1313,27, | 1313,28, | 1313,29, | 1313,30, | 1313,31, | 1313,32, | 1313,33, | 1313,34, | 1313,35, | 1313,36, | 1313,37, | 1313,38, | 1313,39, | 1313,40, | 1313,41, | 1313,42, | 1313,43, | 1313,44, | 1313,45, | 1313,46, | 1313,47, | 1313,48, | 1313,49, | 1313,50, | 1313,51, | 1313,52, | 1313,53, | 1313,54, | 1313,55, | 1313,56, | 1313,57, | 1313,58, | 1313,59, | 1313,60, | 1313,61, | 1313,62, | 1313,63, | 1313,64, | 1313,65, | 1313,66, | 1313,67, | 1313,68, | 1313,69, | 1313,70, | 1313,71, | 1313,72, | 1313,73, | 1313,74, | 1313,75, | 1313,76, | 1313,77, | 1313,78, | 1313,79, | 1313,80, | 1313,81, | 1313,82, | 1313,83, | 1313,84, | 1313,85, | 1314,1, | 1314,2, | 1314,3, | 1314,4, | 1314,5, | 1314,6, | 1314,7, | 1314,8, | 1314,9, | 1314,10, | 1314,11, | 1314,12, | 1314,13, | 1314,14, | 1314,15, | 1314,16, | 1314,17, | 1314,18, | 1314,19, | 1314,20, | 1314,21, | 1314,22, | 1314,23, | 1314,24, | 1314,25, | 1314,26, | 1314,27, | 1314,28, | 1314,29, | 1314,30, | 1314,31, | 1314,32, | 1314,33, | 1314,34, | 1314,35, | 1314,36, | 1314,37, | 1314,38, | 1314,39, | 1314,40, | 1314,41, | 1314,42, | 1314,43, | 1314,44, | 1314,45, | 1314,46, | 1314,47, | 1314,48, | 1314,49, | 1314,50, | 1314,51, | 1314,52, | 1314,53, | 1314,54, | 1314,55, | 1314,56, | 1314,57, | 1314,58, | 1314,59, | 1314,60, | 1314,61, | 1314,62, | 1314,63, | 1314,64, | 1314,65, | 1314,66, | 1314,67, | 1314,68, | 1314,69, | 1314,70, | 1314,71, | 1314,72, | 1314,73, | 1314,74, | 1314,75, | 1314,76, | 1314,77, | 1314,78, | 1314,79, | 1314,80, | 1314,81, | 1314,82, | 1314,83, | 1314,84, | 1314,85, | 1315,1, | 1315,2, | 1315,3, | 1315,4, | 1315,5, | 1315,6, | 1315,7, | 1315,8, | 1315,9, | 1315,10, | 1315,11, | 1315,12, | 1315,13, | 1315,14, | 1315,15, | 1315,16, | 1315,17, | 1315,18, | 1315,19, | 1315,20, | 1315,21, | 1315,22, | 1315,23, | 1315,24, | 1315,25, | 1315,26, | 1315,27, | 1315,28, | 1315,29, | 1315,30, | 1315,31, | 1315,32, | 1315,33, | 1315,34, | 1315,35, | 1315,36, | 1315,37, | 1315,38, | 1315,39, | 1315,40, | 1315,41, | 1315,42, | 1315,43, | 1315,44, | 1315,45, | 1315,46, | 1315,47, | 1315,48, | 1315,49, | 1315,50, | 1315,51, | 1315,52, | 1315,53, | 1315,54, | 1315,55, | 1315,56, | 1315,57, | 1315,58, | 1315,59, | 1315,60, | 1315,61, | 1315,62, | 1315,63, | 1315,64, | 1315,65, | 1315,66, | 1315,67, | 1315,68, | 1315,69, | 1315,70, | 1315,71, | 1315,72, | 1315,73, | 1315,74, | 1315,75, | 1315,76, | 1315,77, | 1315,78, | 1315,79, | 1315,80, | 1315,81, | 1315,82, | 1315,83, | 1315,84, | 1315,85, | 1316,1, | 1316,2, | 1316,3, | 1316,4, | 1316,5, | 1316,6, | 1316,7, | 1316,8, | 1316,9, | 1316,10, | 1316,11, | 1316,12, | 1316,13, | 1316,14, | 1316,15, | 1316,16, | 1316,17, | 1316,18, | 1316,19, | 1316,20, | 1316,21, | 1316,22, | 1316,23, | 1316,24, | 1316,25, | 1316,26, | 1316,27, | 1316,28, | 1316,29, | 1316,30, | 1316,31, | 1316,32, | 1316,33, | 1316,34, | 1316,35, | 1316,36, | 1316,37, | 1316,38, | 1316,39, | 1316,40, | 1316,41, | 1316,42, | 1316,43, | 1316,44, | 1316,45, | 1316,46, | 1316,47, | 1316,48, | 1316,49, | 1316,50, | 1316,51, | 1316,52, | 1316,53, | 1316,54, | 1316,55, | 1316,56, | 1316,57, | 1316,58, | 1316,59, | 1316,60, | 1316,61, | 1316,62, | 1316,63, | 1316,64, | 1316,65, | 1316,66, | 1316,67, | 1316,68, | 1316,69, | 1316,70, | 1316,71, | 1316,72, | 1316,73, | 1316,74, | 1316,75, | 1316,76, | 1316,77, | 1316,78, | 1316,79, | 1316,80, | 1316,81, | 1316,82, | 1316,83, | 1316,84, | 1316,85, | 1317,1, | 1317,2, | 1317,3, | 1317,4, | 1317,5, | 1317,6, | 1317,7, | 1317,8, | 1317,9, | 1317,10, | 1317,11, | 1317,12, | 1317,13, | 1317,14, | 1317,15, | 1317,16, | 1317,17, | 1317,18, | 1317,19, | 1317,20, | 1317,21, | 1317,22, | 1317,23, | 1317,24, | 1317,25, | 1317,26, | 1317,27, | 1317,28, | 1317,29, | 1317,30, | 1317,31, | 1317,32, | 1317,33, | 1317,34, | 1317,35, | 1317,36, | 1317,37, | 1317,38, | 1317,39, | 1317,40, | 1317,41, | 1317,42, | 1317,43, | 1317,44, | 1317,45, | 1317,46, | 1317,47, | 1317,48, | 1317,49, | 1317,50, | 1317,51, | 1317,52, | 1317,53, | 1317,54, | 1317,55, | 1317,56, | 1317,57, | 1317,58, | 1317,59, | 1317,60, | 1317,61, | 1317,62, | 1317,63, | 1317,64, | 1317,65, | 1317,66, | 1317,67, | 1317,68, | 1317,69, | 1317,70, | 1317,71, | 1317,72, | 1317,73, | 1317,74, | 1317,75, | 1317,76, | 1317,77, | 1317,78, | 1317,79, | 1317,80, | 1317,81, | 1317,82, | 1317,83, | 1317,84, | 1317,85, | 1318,1, | 1318,2, | 1318,3, | 1318,4, | 1318,5, | 1318,6, | 1318,7, | 1318,8, | 1318,9, | 1318,10, | 1318,11, | 1318,12, | 1318,13, | 1318,14, | 1318,15, | 1318,16, | 1318,17, | 1318,18, | 1318,19, | 1318,20, | 1318,21, | 1318,22, | 1318,23, | 1318,24, | 1318,25, | 1318,26, | 1318,27, | 1318,28, | 1318,29, | 1318,30, | 1318,31, | 1318,32, | 1318,33, | 1318,34, | 1318,35, | 1318,36, | 1318,37, | 1318,38, | 1318,39, | 1318,40, | 1318,41, | 1318,42, | 1318,43, | 1318,44, | 1318,45, | 1318,46, | 1318,47, | 1318,48, | 1318,49, | 1318,50, | 1318,51, | 1318,52, | 1318,53, | 1318,54, | 1318,55, | 1318,56, | 1318,57, | 1318,58, | 1318,59, | 1318,60, | 1318,61, | 1318,62, | 1318,63, | 1318,64, | 1318,65, | 1318,66, | 1318,67, | 1318,68, | 1318,69, | 1318,70, | 1318,71, | 1318,72, | 1318,73, | 1318,74, | 1318,75, | 1318,76, | 1318,77, | 1318,78, | 1318,79, | 1318,80, | 1318,81, | 1318,82, | 1318,83, | 1318,84, | 1318,85, | 1319,1, | 1319,2, | 1319,3, | 1319,4, | 1319,5, | 1319,6, | 1319,7, | 1319,8, | 1319,9, | 1319,10, | 1319,11, | 1319,12, | 1319,13, | 1319,14, | 1319,15, | 1319,16, | 1319,17, | 1319,18, | 1319,19, | 1319,20, | 1319,21, | 1319,22, | 1319,23, | 1319,24, | 1319,25, | 1319,26, | 1319,27, | 1319,28, | 1319,29, | 1319,30, | 1319,31, | 1319,32, | 1319,33, | 1319,34, | 1319,35, | 1319,36, | 1319,37, | 1319,38, | 1319,39, | 1319,40, | 1319,41, | 1319,42, | 1319,43, | 1319,44, | 1319,45, | 1319,46, | 1319,47, | 1319,48, | 1319,49, | 1319,50, | 1319,51, | 1319,52, | 1319,53, | 1319,54, | 1319,55, | 1319,56, | 1319,57, | 1319,58, | 1319,59, | 1319,60, | 1319,61, | 1319,62, | 1319,63, | 1319,64, | 1319,65, | 1319,66, | 1319,67, | 1319,68, | 1319,69, | 1319,70, | 1319,71, | 1319,72, | 1319,73, | 1319,74, | 1319,75, | 1319,76, | 1319,77, | 1319,78, | 1319,79, | 1319,80, | 1319,81, | 1319,82, | 1319,83, | 1319,84, | 1319,85, | 1320,1, | 1320,2, | 1320,3, | 1320,4, | 1320,5, | 1320,6, | 1320,7, | 1320,8, | 1320,9, | 1320,10, | 1320,11, | 1320,12, | 1320,13, | 1320,14, | 1320,15, | 1320,16, | 1320,17, | 1320,18, | 1320,19, | 1320,20, | 1320,21, | 1320,22, | 1320,23, | 1320,24, | 1320,25, | 1320,26, | 1320,27, | 1320,28, | 1320,29, | 1320,30, | 1320,31, | 1320,32, | 1320,33, | 1320,34, | 1320,35, | 1320,36, | 1320,37, | 1320,38, | 1320,39, | 1320,40, | 1320,41, | 1320,42, | 1320,43, | 1320,44, | 1320,45, | 1320,46, | 1320,47, | 1320,48, | 1320,49, | 1320,50, | 1320,51, | 1320,52, | 1320,53, | 1320,54, | 1320,55, | 1320,56, | 1320,57, | 1320,58, | 1320,59, | 1320,60, | 1320,61, | 1320,62, | 1320,63, | 1320,64, | 1320,65, | 1320,66, | 1320,67, | 1320,68, | 1320,69, | 1320,70, | 1320,71, | 1320,72, | 1320,73, | 1320,74, | 1320,75, | 1320,76, | 1320,77, | 1320,78, | 1320,79, | 1320,80, | 1320,81, | 1320,82, | 1320,83, | 1320,84, | 1320,85, | 1321,1, | 1321,2, | 1321,3, | 1321,4, | 1321,5, | 1321,6, | 1321,7, | 1321,8, | 1321,9, | 1321,10, | 1321,11, | 1321,12, | 1321,13, | 1321,14, | 1321,15, | 1321,16, | 1321,17, | 1321,18, | 1321,19, | 1321,20, | 1321,21, | 1321,22, | 1321,23, | 1321,24, | 1321,25, | 1321,26, | 1321,27, | 1321,28, | 1321,29, | 1321,30, | 1321,31, | 1321,32, | 1321,33, | 1321,34, | 1321,35, | 1321,36, | 1321,37, | 1321,38, | 1321,39, | 1321,40, | 1321,41, | 1321,42, | 1321,43, | 1321,44, | 1321,45, | 1321,46, | 1321,47, | 1321,48, | 1321,49, | 1321,50, | 1321,51, | 1321,52, | 1321,53, | 1321,54, | 1321,55, | 1321,56, | 1321,57, | 1321,58, | 1321,59, | 1321,60, | 1321,61, | 1321,62, | 1321,63, | 1321,64, | 1321,65, | 1321,66, | 1321,67, | 1321,68, | 1321,69, | 1321,70, | 1321,71, | 1321,72, | 1321,73, | 1321,74, | 1321,75, | 1321,76, | 1321,77, | 1321,78, | 1321,79, | 1321,80, | 1321,81, | 1321,82, | 1321,83, | 1321,84, | 1321,85, | 1322,1, | 1322,2, | 1322,3, | 1322,4, | 1322,5, | 1322,6, | 1322,7, | 1322,8, | 1322,9, | 1322,10, | 1322,11, | 1322,12, | 1322,13, | 1322,14, | 1322,15, | 1322,16, | 1322,17, | 1322,18, | 1322,19, | 1322,20, | 1322,21, | 1322,22, | 1322,23, | 1322,24, | 1322,25, | 1322,26, | 1322,27, | 1322,28, | 1322,29, | 1322,30, | 1322,31, | 1322,32, | 1322,33, | 1322,34, | 1322,35, | 1322,36, | 1322,37, | 1322,38, | 1322,39, | 1322,40, | 1322,41, | 1322,42, | 1322,43, | 1322,44, | 1322,45, | 1322,46, | 1322,47, | 1322,48, | 1322,49, | 1322,50, | 1322,51, | 1322,52, | 1322,53, | 1322,54, | 1322,55, | 1322,56, | 1322,57, | 1322,58, | 1322,59, | 1322,60, | 1322,61, | 1322,62, | 1322,63, | 1322,64, | 1322,65, | 1322,66, | 1322,67, | 1322,68, | 1322,69, | 1322,70, | 1322,71, | 1322,72, | 1322,73, | 1322,74, | 1322,75, | 1322,76, | 1322,77, | 1322,78, | 1322,79, | 1322,80, | 1322,81, | 1322,82, | 1322,83, | 1322,84, | 1322,85, | 1323,1, | 1323,2, | 1323,3, | 1323,4, | 1323,5, | 1323,6, | 1323,7, | 1323,8, | 1323,9, | 1323,10, | 1323,11, | 1323,12, | 1323,13, | 1323,14, | 1323,15, | 1323,16, | 1323,17, | 1323,18, | 1323,19, | 1323,20, | 1323,21, | 1323,22, | 1323,23, | 1323,24, | 1323,25, | 1323,26, | 1323,27, | 1323,28, | 1323,29, | 1323,30, | 1323,31, | 1323,32, | 1323,33, | 1323,34, | 1323,35, | 1323,36, | 1323,37, | 1323,38, | 1323,39, | 1323,40, | 1323,41, | 1323,42, | 1323,43, | 1323,44, | 1323,45, | 1323,46, | 1323,47, | 1323,48, | 1323,49, | 1323,50, | 1323,51, | 1323,52, | 1323,53, | 1323,54, | 1323,55, | 1323,56, | 1323,57, | 1323,58, | 1323,59, | 1323,60, | 1323,61, | 1323,62, | 1323,63, | 1323,64, | 1323,65, | 1323,66, | 1323,67, | 1323,68, | 1323,69, | 1323,70, | 1323,71, | 1323,72, | 1323,73, | 1323,74, | 1323,75, | 1323,76, | 1323,77, | 1323,78, | 1323,79, | 1323,80, | 1323,81, | 1323,82, | 1323,83, | 1323,84, | 1323,85, | 1324,1, | 1324,2, | 1324,3, | 1324,4, | 1324,5, | 1324,6, | 1324,7, | 1324,8, | 1324,9, | 1324,10, | 1324,11, | 1324,12, | 1324,13, | 1324,14, | 1324,15, | 1324,16, | 1324,17, | 1324,18, | 1324,19, | 1324,20, | 1324,21, | 1324,22, | 1324,23, | 1324,24, | 1324,25, | 1324,26, | 1324,27, | 1324,28, | 1324,29, | 1324,30, | 1324,31, | 1324,32, | 1324,33, | 1324,34, | 1324,35, | 1324,36, | 1324,37, | 1324,38, | 1324,39, | 1324,40, | 1324,41, | 1324,42, | 1324,43, | 1324,44, | 1324,45, | 1324,46, | 1324,47, | 1324,48, | 1324,49, | 1324,50, | 1324,51, | 1324,52, | 1324,53, | 1324,54, | 1324,55, | 1324,56, | 1324,57, | 1324,58, | 1324,59, | 1324,60, | 1324,61, | 1324,62, | 1324,63, | 1324,64, | 1324,65, | 1324,66, | 1324,67, | 1324,68, | 1324,69, | 1324,70, | 1324,71, | 1324,72, | 1324,73, | 1324,74, | 1324,75, | 1324,76, | 1324,77, | 1324,78, | 1324,79, | 1324,80, | 1324,81, | 1324,82, | 1324,83, | 1324,84, | 1324,85, | 1325,1, | 1325,2, | 1325,3, | 1325,4, | 1325,5, | 1325,6, | 1325,7, | 1325,8, | 1325,9, | 1325,10, | 1325,11, | 1325,12, | 1325,13, | 1325,14, | 1325,15, | 1325,16, | 1325,17, | 1325,18, | 1325,19, | 1325,20, | 1325,21, | 1325,22, | 1325,23, | 1325,24, | 1325,25, | 1325,26, | 1325,27, | 1325,28, | 1325,29, | 1325,30, | 1325,31, | 1325,32, | 1325,33, | 1325,34, | 1325,35, | 1325,36, | 1325,37, | 1325,38, | 1325,39, | 1325,40, | 1325,41, | 1325,42, | 1325,43, | 1325,44, | 1325,45, | 1325,46, | 1325,47, | 1325,48, | 1325,49, | 1325,50, | 1325,51, | 1325,52, | 1325,53, | 1325,54, | 1325,55, | 1325,56, | 1325,57, | 1325,58, | 1325,59, | 1325,60, | 1325,61, | 1325,62, | 1325,63, | 1325,64, | 1325,65, | 1325,66, | 1325,67, | 1325,68, | 1325,69, | 1325,70, | 1325,71, | 1325,72, | 1325,73, | 1325,74, | 1325,75, | 1325,76, | 1325,77, | 1325,78, | 1325,79, | 1325,80, | 1325,81, | 1325,82, | 1325,83, | 1325,84, | 1325,85, | 1326,1, | 1326,2, | 1326,3, | 1326,4, | 1326,5, | 1326,6, | 1326,7, | 1326,8, | 1326,9, | 1326,10, | 1326,11, | 1326,12, | 1326,13, | 1326,14, | 1326,15, | 1326,16, | 1326,17, | 1326,18, | 1326,19, | 1326,20, | 1326,21, | 1326,22, | 1326,23, | 1326,24, | 1326,25, | 1326,26, | 1326,27, | 1326,28, | 1326,29, | 1326,30, | 1326,31, | 1326,32, | 1326,33, | 1326,34, | 1326,35, | 1326,36, | 1326,37, | 1326,38, | 1326,39, | 1326,40, | 1326,41, | 1326,42, | 1326,43, | 1326,44, | 1326,45, | 1326,46, | 1326,47, | 1326,48, | 1326,49, | 1326,50, | 1326,51, | 1326,52, | 1326,53, | 1326,54, | 1326,55, | 1326,56, | 1326,57, | 1326,58, | 1326,59, | 1326,60, | 1326,61, | 1326,62, | 1326,63, | 1326,64, | 1326,65, | 1326,66, | 1326,67, | 1326,68, | 1326,69, | 1326,70, | 1326,71, | 1326,72, | 1326,73, | 1326,74, | 1326,75, | 1326,76, | 1326,77, | 1326,78, | 1326,79, | 1326,80, | 1326,81, | 1326,82, | 1326,83, | 1326,84, | 1326,85, | 1327,1, | 1327,2, | 1327,3, | 1327,4, | 1327,5, | 1327,6, | 1327,7, | 1327,8, | 1327,9, | 1327,10, | 1327,11, | 1327,12, | 1327,13, | 1327,14, | 1327,15, | 1327,16, | 1327,17, | 1327,18, | 1327,19, | 1327,20, | 1327,21, | 1327,22, | 1327,23, | 1327,24, | 1327,25, | 1327,26, | 1327,27, | 1327,28, | 1327,29, | 1327,30, | 1327,31, | 1327,32, | 1327,33, | 1327,34, | 1327,35, | 1327,36, | 1327,37, | 1327,38, | 1327,39, | 1327,40, | 1327,41, | 1327,42, | 1327,43, | 1327,44, | 1327,45, | 1327,46, | 1327,47, | 1327,48, | 1327,49, | 1327,50, | 1327,51, | 1327,52, | 1327,53, | 1327,54, | 1327,55, | 1327,56, | 1327,57, | 1327,58, | 1327,59, | 1327,60, | 1327,61, | 1327,62, | 1327,63, | 1327,64, | 1327,65, | 1327,66, | 1327,67, | 1327,68, | 1327,69, | 1327,70, | 1327,71, | 1327,72, | 1327,73, | 1327,74, | 1327,75, | 1327,76, | 1327,77, | 1327,78, | 1327,79, | 1327,80, | 1327,81, | 1327,82, | 1327,83, | 1327,84, | 1327,85, | 1328,1, | 1328,2, | 1328,3, | 1328,4, | 1328,5, | 1328,6, | 1328,7, | 1328,8, | 1328,9, | 1328,10, | 1328,11, | 1328,12, | 1328,13, | 1328,14, | 1328,15, | 1328,16, | 1328,17, | 1328,18, | 1328,19, | 1328,20, | 1328,21, | 1328,22, | 1328,23, | 1328,24, | 1328,25, | 1328,26, | 1328,27, | 1328,28, | 1328,29, | 1328,30, | 1328,31, | 1328,32, | 1328,33, | 1328,34, | 1328,35, | 1328,36, | 1328,37, | 1328,38, | 1328,39, | 1328,40, | 1328,41, | 1328,42, | 1328,43, | 1328,44, | 1328,45, | 1328,46, | 1328,47, | 1328,48, | 1328,49, | 1328,50, | 1328,51, | 1328,52, | 1328,53, | 1328,54, | 1328,55, | 1328,56, | 1328,57, | 1328,58, | 1328,59, | 1328,60, | 1328,61, | 1328,62, | 1328,63, | 1328,64, | 1328,65, | 1328,66, | 1328,67, | 1328,68, | 1328,69, | 1328,70, | 1328,71, | 1328,72, | 1328,73, | 1328,74, | 1328,75, | 1328,76, | 1328,77, | 1328,78, | 1328,79, | 1328,80, | 1328,81, | 1328,82, | 1328,83, | 1328,84, | 1328,85, | 1329,1, | 1329,2, | 1329,3, | 1329,4, | 1329,5, | 1329,6, | 1329,7, | 1329,8, | 1329,9, | 1329,10, | 1329,11, | 1329,12, | 1329,13, | 1329,14, | 1329,15, | 1329,16, | 1329,17, | 1329,18, | 1329,19, | 1329,20, | 1329,21, | 1329,22, | 1329,23, | 1329,24, | 1329,25, | 1329,26, | 1329,27, | 1329,28, | 1329,29, | 1329,30, | 1329,31, | 1329,32, | 1329,33, | 1329,34, | 1329,35, | 1329,36, | 1329,37, | 1329,38, | 1329,39, | 1329,40, | 1329,41, | 1329,42, | 1329,43, | 1329,44, | 1329,45, | 1329,46, | 1329,47, | 1329,48, | 1329,49, | 1329,50, | 1329,51, | 1329,52, | 1329,53, | 1329,54, | 1329,55, | 1329,56, | 1329,57, | 1329,58, | 1329,59, | 1329,60, | 1329,61, | 1329,62, | 1329,63, | 1329,64, | 1329,65, | 1329,66, | 1329,67, | 1329,68, | 1329,69, | 1329,70, | 1329,71, | 1329,72, | 1329,73, | 1329,74, | 1329,75, | 1329,76, | 1329,77, | 1329,78, | 1329,79, | 1329,80, | 1329,81, | 1329,82, | 1329,83, | 1329,84, | 1329,85, | 1330,1, | 1330,2, | 1330,3, | 1330,4, | 1330,5, | 1330,6, | 1330,7, | 1330,8, | 1330,9, | 1330,10, | 1330,11, | 1330,12, | 1330,13, | 1330,14, | 1330,15, | 1330,16, | 1330,17, | 1330,18, | 1330,19, | 1330,20, | 1330,21, | 1330,22, | 1330,23, | 1330,24, | 1330,25, | 1330,26, | 1330,27, | 1330,28, | 1330,29, | 1330,30, | 1330,31, | 1330,32, | 1330,33, | 1330,34, | 1330,35, | 1330,36, | 1330,37, | 1330,38, | 1330,39, | 1330,40, | 1330,41, | 1330,42, | 1330,43, | 1330,44, | 1330,45, | 1330,46, | 1330,47, | 1330,48, | 1330,49, | 1330,50, | 1330,51, | 1330,52, | 1330,53, | 1330,54, | 1330,55, | 1330,56, | 1330,57, | 1330,58, | 1330,59, | 1330,60, | 1330,61, | 1330,62, | 1330,63, | 1330,64, | 1330,65, | 1330,66, | 1330,67, | 1330,68, | 1330,69, | 1330,70, | 1330,71, | 1330,72, | 1330,73, | 1330,74, | 1330,75, | 1330,76, | 1330,77, | 1330,78, | 1330,79, | 1330,80, | 1330,81, | 1330,82, | 1330,83, | 1330,84, | 1330,85, | 1331,1, | 1331,2, | 1331,3, | 1331,4, | 1331,5, | 1331,6, | 1331,7, | 1331,8, | 1331,9, | 1331,10, | 1331,11, | 1331,12, | 1331,13, | 1331,14, | 1331,15, | 1331,16, | 1331,17, | 1331,18, | 1331,19, | 1331,20, | 1331,21, | 1331,22, | 1331,23, | 1331,24, | 1331,25, | 1331,26, | 1331,27, | 1331,28, | 1331,29, | 1331,30, | 1331,31, | 1331,32, | 1331,33, | 1331,34, | 1331,35, | 1331,36, | 1331,37, | 1331,38, | 1331,39, | 1331,40, | 1331,41, | 1331,42, | 1331,43, | 1331,44, | 1331,45, | 1331,46, | 1331,47, | 1331,48, | 1331,49, | 1331,50, | 1331,51, | 1331,52, | 1331,53, | 1331,54, | 1331,55, | 1331,56, | 1331,57, | 1331,58, | 1331,59, | 1331,60, | 1331,61, | 1331,62, | 1331,63, | 1331,64, | 1331,65, | 1331,66, | 1331,67, | 1331,68, | 1331,69, | 1331,70, | 1331,71, | 1331,72, | 1331,73, | 1331,74, | 1331,75, | 1331,76, | 1331,77, | 1331,78, | 1331,79, | 1331,80, | 1331,81, | 1331,82, | 1331,83, | 1331,84, | 1331,85, | 1332,1, | 1332,2, | 1332,3, | 1332,4, | 1332,5, | 1332,6, | 1332,7, | 1332,8, | 1332,9, | 1332,10, | 1332,11, | 1332,12, | 1332,13, | 1332,14, | 1332,15, | 1332,16, | 1332,17, | 1332,18, | 1332,19, | 1332,20, | 1332,21, | 1332,22, | 1332,23, | 1332,24, | 1332,25, | 1332,26, | 1332,27, | 1332,28, | 1332,29, | 1332,30, | 1332,31, | 1332,32, | 1332,33, | 1332,34, | 1332,35, | 1332,36, | 1332,37, | 1332,38, | 1332,39, | 1332,40, | 1332,41, | 1332,42, | 1332,43, | 1332,44, | 1332,45, | 1332,46, | 1332,47, | 1332,48, | 1332,49, | 1332,50, | 1332,51, | 1332,52, | 1332,53, | 1332,54, | 1332,55, | 1332,56, | 1332,57, | 1332,58, | 1332,59, | 1332,60, | 1332,61, | 1332,62, | 1332,63, | 1332,64, | 1332,65, | 1332,66, | 1332,67, | 1332,68, | 1332,69, | 1332,70, | 1332,71, | 1332,72, | 1332,73, | 1332,74, | 1332,75, | 1332,76, | 1332,77, | 1332,78, | 1332,79, | 1332,80, | 1332,81, | 1332,82, | 1332,83, | 1332,84, | 1332,85, | 1333,1, | 1333,2, | 1333,3, | 1333,4, | 1333,5, | 1333,6, | 1333,7, | 1333,8, | 1333,9, | 1333,10, | 1333,11, | 1333,12, | 1333,13, | 1333,14, | 1333,15, | 1333,16, | 1333,17, | 1333,18, | 1333,19, | 1333,20, | 1333,21, | 1333,22, | 1333,23, | 1333,24, | 1333,25, | 1333,26, | 1333,27, | 1333,28, | 1333,29, | 1333,30, | 1333,31, | 1333,32, | 1333,33, | 1333,34, | 1333,35, | 1333,36, | 1333,37, | 1333,38, | 1333,39, | 1333,40, | 1333,41, | 1333,42, | 1333,43, | 1333,44, | 1333,45, | 1333,46, | 1333,47, | 1333,48, | 1333,49, | 1333,50, | 1333,51, | 1333,52, | 1333,53, | 1333,54, | 1333,55, | 1333,56, | 1333,57, | 1333,58, | 1333,59, | 1333,60, | 1333,61, | 1333,62, | 1333,63, | 1333,64, | 1333,65, | 1333,66, | 1333,67, | 1333,68, | 1333,69, | 1333,70, | 1333,71, | 1333,72, | 1333,73, | 1333,74, | 1333,75, | 1333,76, | 1333,77, | 1333,78, | 1333,79, | 1333,80, | 1333,81, | 1333,82, | 1333,83, | 1333,84, | 1333,85, | 1334,1, | 1334,2, | 1334,3, | 1334,4, | 1334,5, | 1334,6, | 1334,7, | 1334,8, | 1334,9, | 1334,10, | 1334,11, | 1334,12, | 1334,13, | 1334,14, | 1334,15, | 1334,16, | 1334,17, | 1334,18, | 1334,19, | 1334,20, | 1334,21, | 1334,22, | 1334,23, | 1334,24, | 1334,25, | 1334,26, | 1334,27, | 1334,28, | 1334,29, | 1334,30, | 1334,31, | 1334,32, | 1334,33, | 1334,34, | 1334,35, | 1334,36, | 1334,37, | 1334,38, | 1334,39, | 1334,40, | 1334,41, | 1334,42, | 1334,43, | 1334,44, | 1334,45, | 1334,46, | 1334,47, | 1334,48, | 1334,49, | 1334,50, | 1334,51, | 1334,52, | 1334,53, | 1334,54, | 1334,55, | 1334,56, | 1334,57, | 1334,58, | 1334,59, | 1334,60, | 1334,61, | 1334,62, | 1334,63, | 1334,64, | 1334,65, | 1334,66, | 1334,67, | 1334,68, | 1334,69, | 1334,70, | 1334,71, | 1334,72, | 1334,73, | 1334,74, | 1334,75, | 1334,76, | 1334,77, | 1334,78, | 1334,79, | 1334,80, | 1334,81, | 1334,82, | 1334,83, | 1334,84, | 1334,85, | 1335,1, | 1335,2, | 1335,3, | 1335,4, | 1335,5, | 1335,6, | 1335,7, | 1335,8, | 1335,9, | 1335,10, | 1335,11, | 1335,12, | 1335,13, | 1335,14, | 1335,15, | 1335,16, | 1335,17, | 1335,18, | 1335,19, | 1335,20, | 1335,21, | 1335,22, | 1335,23, | 1335,24, | 1335,25, | 1335,26, | 1335,27, | 1335,28, | 1335,29, | 1335,30, | 1335,31, | 1335,32, | 1335,33, | 1335,34, | 1335,35, | 1335,36, | 1335,37, | 1335,38, | 1335,39, | 1335,40, | 1335,41, | 1335,42, | 1335,43, | 1335,44, | 1335,45, | 1335,46, | 1335,47, | 1335,48, | 1335,49, | 1335,50, | 1335,51, | 1335,52, | 1335,53, | 1335,54, | 1335,55, | 1335,56, | 1335,57, | 1335,58, | 1335,59, | 1335,60, | 1335,61, | 1335,62, | 1335,63, | 1335,64, | 1335,65, | 1335,66, | 1335,67, | 1335,68, | 1335,69, | 1335,70, | 1335,71, | 1335,72, | 1335,73, | 1335,74, | 1335,75, | 1335,76, | 1335,77, | 1335,78, | 1335,79, | 1335,80, | 1335,81, | 1335,82, | 1335,83, | 1335,84, | 1335,85, | 1336,1, | 1336,2, | 1336,3, | 1336,4, | 1336,5, | 1336,6, | 1336,7, | 1336,8, | 1336,9, | 1336,10, | 1336,11, | 1336,12, | 1336,13, | 1336,14, | 1336,15, | 1336,16, | 1336,17, | 1336,18, | 1336,19, | 1336,20, | 1336,21, | 1336,22, | 1336,23, | 1336,24, | 1336,25, | 1336,26, | 1336,27, | 1336,28, | 1336,29, | 1336,30, | 1336,31, | 1336,32, | 1336,33, | 1336,34, | 1336,35, | 1336,36, | 1336,37, | 1336,38, | 1336,39, | 1336,40, | 1336,41, | 1336,42, | 1336,43, | 1336,44, | 1336,45, | 1336,46, | 1336,47, | 1336,48, | 1336,49, | 1336,50, | 1336,51, | 1336,52, | 1336,53, | 1336,54, | 1336,55, | 1336,56, | 1336,57, | 1336,58, | 1336,59, | 1336,60, | 1336,61, | 1336,62, | 1336,63, | 1336,64, | 1336,65, | 1336,66, | 1336,67, | 1336,68, | 1336,69, | 1336,70, | 1336,71, | 1336,72, | 1336,73, | 1336,74, | 1336,75, | 1336,76, | 1336,77, | 1336,78, | 1336,79, | 1336,80, | 1336,81, | 1336,82, | 1336,83, | 1336,84, | 1336,85, | 1337,1, | 1337,2, | 1337,3, | 1337,4, | 1337,5, | 1337,6, | 1337,7, | 1337,8, | 1337,9, | 1337,10, | 1337,11, | 1337,12, | 1337,13, | 1337,14, | 1337,15, | 1337,16, | 1337,17, | 1337,18, | 1337,19, | 1337,20, | 1337,21, | 1337,22, | 1337,23, | 1337,24, | 1337,25, | 1337,26, | 1337,27, | 1337,28, | 1337,29, | 1337,30, | 1337,31, | 1337,32, | 1337,33, | 1337,34, | 1337,35, | 1337,36, | 1337,37, | 1337,38, | 1337,39, | 1337,40, | 1337,41, | 1337,42, | 1337,43, | 1337,44, | 1337,45, | 1337,46, | 1337,47, | 1337,48, | 1337,49, | 1337,50, | 1337,51, | 1337,52, | 1337,53, | 1337,54, | 1337,55, | 1337,56, | 1337,57, | 1337,58, | 1337,59, | 1337,60, | 1337,61, | 1337,62, | 1337,63, | 1337,64, | 1337,65, | 1337,66, | 1337,67, | 1337,68, | 1337,69, | 1337,70, | 1337,71, | 1337,72, | 1337,73, | 1337,74, | 1337,75, | 1337,76, | 1337,77, | 1337,78, | 1337,79, | 1337,80, | 1337,81, | 1337,82, | 1337,83, | 1337,84, | 1337,85, | 1338,1, | 1338,2, | 1338,3, | 1338,4, | 1338,5, | 1338,6, | 1338,7, | 1338,8, | 1338,9, | 1338,10, | 1338,11, | 1338,12, | 1338,13, | 1338,14, | 1338,15, | 1338,16, | 1338,17, | 1338,18, | 1338,19, | 1338,20, | 1338,21, | 1338,22, | 1338,23, | 1338,24, | 1338,25, | 1338,26, | 1338,27, | 1338,28, | 1338,29, | 1338,30, | 1338,31, | 1338,32, | 1338,33, | 1338,34, | 1338,35, | 1338,36, | 1338,37, | 1338,38, | 1338,39, | 1338,40, | 1338,41, | 1338,42, | 1338,43, | 1338,44, | 1338,45, | 1338,46, | 1338,47, | 1338,48, | 1338,49, | 1338,50, | 1338,51, | 1338,52, | 1338,53, | 1338,54, | 1338,55, | 1338,56, | 1338,57, | 1338,58, | 1338,59, | 1338,60, | 1338,61, | 1338,62, | 1338,63, | 1338,64, | 1338,65, | 1338,66, | 1338,67, | 1338,68, | 1338,69, | 1338,70, | 1338,71, | 1338,72, | 1338,73, | 1338,74, | 1338,75, | 1338,76, | 1338,77, | 1338,78, | 1338,79, | 1338,80, | 1338,81, | 1338,82, | 1338,83, | 1338,84, | 1338,85, | 1339,1, | 1339,2, | 1339,3, | 1339,4, | 1339,5, | 1339,6, | 1339,7, | 1339,8, | 1339,9, | 1339,10, | 1339,11, | 1339,12, | 1339,13, | 1339,14, | 1339,15, | 1339,16, | 1339,17, | 1339,18, | 1339,19, | 1339,20, | 1339,21, | 1339,22, | 1339,23, | 1339,24, | 1339,25, | 1339,26, | 1339,27, | 1339,28, | 1339,29, | 1339,30, | 1339,31, | 1339,32, | 1339,33, | 1339,34, | 1339,35, | 1339,36, | 1339,37, | 1339,38, | 1339,39, | 1339,40, | 1339,41, | 1339,42, | 1339,43, | 1339,44, | 1339,45, | 1339,46, | 1339,47, | 1339,48, | 1339,49, | 1339,50, | 1339,51, | 1339,52, | 1339,53, | 1339,54, | 1339,55, | 1339,56, | 1339,57, | 1339,58, | 1339,59, | 1339,60, | 1339,61, | 1339,62, | 1339,63, | 1339,64, | 1339,65, | 1339,66, | 1339,67, | 1339,68, | 1339,69, | 1339,70, | 1339,71, | 1339,72, | 1339,73, | 1339,74, | 1339,75, | 1339,76, | 1339,77, | 1339,78, | 1339,79, | 1339,80, | 1339,81, | 1339,82, | 1339,83, | 1339,84, | 1339,85, | 1340,1, | 1340,2, | 1340,3, | 1340,4, | 1340,5, | 1340,6, | 1340,7, | 1340,8, | 1340,9, | 1340,10, | 1340,11, | 1340,12, | 1340,13, | 1340,14, | 1340,15, | 1340,16, | 1340,17, | 1340,18, | 1340,19, | 1340,20, | 1340,21, | 1340,22, | 1340,23, | 1340,24, | 1340,25, | 1340,26, | 1340,27, | 1340,28, | 1340,29, | 1340,30, | 1340,31, | 1340,32, | 1340,33, | 1340,34, | 1340,35, | 1340,36, | 1340,37, | 1340,38, | 1340,39, | 1340,40, | 1340,41, | 1340,42, | 1340,43, | 1340,44, | 1340,45, | 1340,46, | 1340,47, | 1340,48, | 1340,49, | 1340,50, | 1340,51, | 1340,52, | 1340,53, | 1340,54, | 1340,55, | 1340,56, | 1340,57, | 1340,58, | 1340,59, | 1340,60, | 1340,61, | 1340,62, | 1340,63, | 1340,64, | 1340,65, | 1340,66, | 1340,67, | 1340,68, | 1340,69, | 1340,70, | 1340,71, | 1340,72, | 1340,73, | 1340,74, | 1340,75, | 1340,76, | 1340,77, | 1340,78, | 1340,79, | 1340,80, | 1340,81, | 1340,82, | 1340,83, | 1340,84, | 1340,85, | 1341,1, | 1341,2, | 1341,3, | 1341,4, | 1341,5, | 1341,6, | 1341,7, | 1341,8, | 1341,9, | 1341,10, | 1341,11, | 1341,12, | 1341,13, | 1341,14, | 1341,15, | 1341,16, | 1341,17, | 1341,18, | 1341,19, | 1341,20, | 1341,21, | 1341,22, | 1341,23, | 1341,24, | 1341,25, | 1341,26, | 1341,27, | 1341,28, | 1341,29, | 1341,30, | 1341,31, | 1341,32, | 1341,33, | 1341,34, | 1341,35, | 1341,36, | 1341,37, | 1341,38, | 1341,39, | 1341,40, | 1341,41, | 1341,42, | 1341,43, | 1341,44, | 1341,45, | 1341,46, | 1341,47, | 1341,48, | 1341,49, | 1341,50, | 1341,51, | 1341,52, | 1341,53, | 1341,54, | 1341,55, | 1341,56, | 1341,57, | 1341,58, | 1341,59, | 1341,60, | 1341,61, | 1341,62, | 1341,63, | 1341,64, | 1341,65, | 1341,66, | 1341,67, | 1341,68, | 1341,69, | 1341,70, | 1341,71, | 1341,72, | 1341,73, | 1341,74, | 1341,75, | 1341,76, | 1341,77, | 1341,78, | 1341,79, | 1341,80, | 1341,81, | 1341,82, | 1341,83, | 1341,84, | 1341,85, | 1342,1, | 1342,2, | 1342,3, | 1342,4, | 1342,5, | 1342,6, | 1342,7, | 1342,8, | 1342,9, | 1342,10, | 1342,11, | 1342,12, | 1342,13, | 1342,14, | 1342,15, | 1342,16, | 1342,17, | 1342,18, | 1342,19, | 1342,20, | 1342,21, | 1342,22, | 1342,23, | 1342,24, | 1342,25, | 1342,26, | 1342,27, | 1342,28, | 1342,29, | 1342,30, | 1342,31, | 1342,32, | 1342,33, | 1342,34, | 1342,35, | 1342,36, | 1342,37, | 1342,38, | 1342,39, | 1342,40, | 1342,41, | 1342,42, | 1342,43, | 1342,44, | 1342,45, | 1342,46, | 1342,47, | 1342,48, | 1342,49, | 1342,50, | 1342,51, | 1342,52, | 1342,53, | 1342,54, | 1342,55, | 1342,56, | 1342,57, | 1342,58, | 1342,59, | 1342,60, | 1342,61, | 1342,62, | 1342,63, | 1342,64, | 1342,65, | 1342,66, | 1342,67, | 1342,68, | 1342,69, | 1342,70, | 1342,71, | 1342,72, | 1342,73, | 1342,74, | 1342,75, | 1342,76, | 1342,77, | 1342,78, | 1342,79, | 1342,80, | 1342,81, | 1342,82, | 1342,83, | 1342,84, | 1342,85, | 1343,1, | 1343,2, | 1343,3, | 1343,4, | 1343,5, | 1343,6, | 1343,7, | 1343,8, | 1343,9, | 1343,10, | 1343,11, | 1343,12, | 1343,13, | 1343,14, | 1343,15, | 1343,16, | 1343,17, | 1343,18, | 1343,19, | 1343,20, | 1343,21, | 1343,22, | 1343,23, | 1343,24, | 1343,25, | 1343,26, | 1343,27, | 1343,28, | 1343,29, | 1343,30, | 1343,31, | 1343,32, | 1343,33, | 1343,34, | 1343,35, | 1343,36, | 1343,37, | 1343,38, | 1343,39, | 1343,40, | 1343,41, | 1343,42, | 1343,43, | 1343,44, | 1343,45, | 1343,46, | 1343,47, | 1343,48, | 1343,49, | 1343,50, | 1343,51, | 1343,52, | 1343,53, | 1343,54, | 1343,55, | 1343,56, | 1343,57, | 1343,58, | 1343,59, | 1343,60, | 1343,61, | 1343,62, | 1343,63, | 1343,64, | 1343,65, | 1343,66, | 1343,67, | 1343,68, | 1343,69, | 1343,70, | 1343,71, | 1343,72, | 1343,73, | 1343,74, | 1343,75, | 1343,76, | 1343,77, | 1343,78, | 1343,79, | 1343,80, | 1343,81, | 1343,82, | 1343,83, | 1343,84, | 1343,85, | 1344,1, | 1344,2, | 1344,3, | 1344,4, | 1344,5, | 1344,6, | 1344,7, | 1344,8, | 1344,9, | 1344,10, | 1344,11, | 1344,12, | 1344,13, | 1344,14, | 1344,15, | 1344,16, | 1344,17, | 1344,18, | 1344,19, | 1344,20, | 1344,21, | 1344,22, | 1344,23, | 1344,24, | 1344,25, | 1344,26, | 1344,27, | 1344,28, | 1344,29, | 1344,30, | 1344,31, | 1344,32, | 1344,33, | 1344,34, | 1344,35, | 1344,36, | 1344,37, | 1344,38, | 1344,39, | 1344,40, | 1344,41, | 1344,42, | 1344,43, | 1344,44, | 1344,45, | 1344,46, | 1344,47, | 1344,48, | 1344,49, | 1344,50, | 1344,51, | 1344,52, | 1344,53, | 1344,54, | 1344,55, | 1344,56, | 1344,57, | 1344,58, | 1344,59, | 1344,60, | 1344,61, | 1344,62, | 1344,63, | 1344,64, | 1344,65, | 1344,66, | 1344,67, | 1344,68, | 1344,69, | 1344,70, | 1344,71, | 1344,72, | 1344,73, | 1344,74, | 1344,75, | 1344,76, | 1344,77, | 1344,78, | 1344,79, | 1344,80, | 1344,81, | 1344,82, | 1344,83, | 1344,84, | 1344,85, | 1345,1, | 1345,2, | 1345,3, | 1345,4, | 1345,5, | 1345,6, | 1345,7, | 1345,8, | 1345,9, | 1345,10, | 1345,11, | 1345,12, | 1345,13, | 1345,14, | 1345,15, | 1345,16, | 1345,17, | 1345,18, | 1345,19, | 1345,20, | 1345,21, | 1345,22, | 1345,23, | 1345,24, | 1345,25, | 1345,26, | 1345,27, | 1345,28, | 1345,29, | 1345,30, | 1345,31, | 1345,32, | 1345,33, | 1345,34, | 1345,35, | 1345,36, | 1345,37, | 1345,38, | 1345,39, | 1345,40, | 1345,41, | 1345,42, | 1345,43, | 1345,44, | 1345,45, | 1345,46, | 1345,47, | 1345,48, | 1345,49, | 1345,50, | 1345,51, | 1345,52, | 1345,53, | 1345,54, | 1345,55, | 1345,56, | 1345,57, | 1345,58, | 1345,59, | 1345,60, | 1345,61, | 1345,62, | 1345,63, | 1345,64, | 1345,65, | 1345,66, | 1345,67, | 1345,68, | 1345,69, | 1345,70, | 1345,71, | 1345,72, | 1345,73, | 1345,74, | 1345,75, | 1345,76, | 1345,77, | 1345,78, | 1345,79, | 1345,80, | 1345,81, | 1345,82, | 1345,83, | 1345,84, | 1345,85, | 1346,1, | 1346,2, | 1346,3, | 1346,4, | 1346,5, | 1346,6, | 1346,7, | 1346,8, | 1346,9, | 1346,10, | 1346,11, | 1346,12, | 1346,13, | 1346,14, | 1346,15, | 1346,16, | 1346,17, | 1346,18, | 1346,19, | 1346,20, | 1346,21, | 1346,22, | 1346,23, | 1346,24, | 1346,25, | 1346,26, | 1346,27, | 1346,28, | 1346,29, | 1346,30, | 1346,31, | 1346,32, | 1346,33, | 1346,34, | 1346,35, | 1346,36, | 1346,37, | 1346,38, | 1346,39, | 1346,40, | 1346,41, | 1346,42, | 1346,43, | 1346,44, | 1346,45, | 1346,46, | 1346,47, | 1346,48, | 1346,49, | 1346,50, | 1346,51, | 1346,52, | 1346,53, | 1346,54, | 1346,55, | 1346,56, | 1346,57, | 1346,58, | 1346,59, | 1346,60, | 1346,61, | 1346,62, | 1346,63, | 1346,64, | 1346,65, | 1346,66, | 1346,67, | 1346,68, | 1346,69, | 1346,70, | 1346,71, | 1346,72, | 1346,73, | 1346,74, | 1346,75, | 1346,76, | 1346,77, | 1346,78, | 1346,79, | 1346,80, | 1346,81, | 1346,82, | 1346,83, | 1346,84, | 1346,85, | 1347,1, | 1347,2, | 1347,3, | 1347,4, | 1347,5, | 1347,6, | 1347,7, | 1347,8, | 1347,9, | 1347,10, | 1347,11, | 1347,12, | 1347,13, | 1347,14, | 1347,15, | 1347,16, | 1347,17, | 1347,18, | 1347,19, | 1347,20, | 1347,21, | 1347,22, | 1347,23, | 1347,24, | 1347,25, | 1347,26, | 1347,27, | 1347,28, | 1347,29, | 1347,30, | 1347,31, | 1347,32, | 1347,33, | 1347,34, | 1347,35, | 1347,36, | 1347,37, | 1347,38, | 1347,39, | 1347,40, | 1347,41, | 1347,42, | 1347,43, | 1347,44, | 1347,45, | 1347,46, | 1347,47, | 1347,48, | 1347,49, | 1347,50, | 1347,51, | 1347,52, | 1347,53, | 1347,54, | 1347,55, | 1347,56, | 1347,57, | 1347,58, | 1347,59, | 1347,60, | 1347,61, | 1347,62, | 1347,63, | 1347,64, | 1347,65, | 1347,66, | 1347,67, | 1347,68, | 1347,69, | 1347,70, | 1347,71, | 1347,72, | 1347,73, | 1347,74, | 1347,75, | 1347,76, | 1347,77, | 1347,78, | 1347,79, | 1347,80, | 1347,81, | 1347,82, | 1347,83, | 1347,84, | 1347,85, | 1348,1, | 1348,2, | 1348,3, | 1348,4, | 1348,5, | 1348,6, | 1348,7, | 1348,8, | 1348,9, | 1348,10, | 1348,11, | 1348,12, | 1348,13, | 1348,14, | 1348,15, | 1348,16, | 1348,17, | 1348,18, | 1348,19, | 1348,20, | 1348,21, | 1348,22, | 1348,23, | 1348,24, | 1348,25, | 1348,26, | 1348,27, | 1348,28, | 1348,29, | 1348,30, | 1348,31, | 1348,32, | 1348,33, | 1348,34, | 1348,35, | 1348,36, | 1348,37, | 1348,38, | 1348,39, | 1348,40, | 1348,41, | 1348,42, | 1348,43, | 1348,44, | 1348,45, | 1348,46, | 1348,47, | 1348,48, | 1348,49, | 1348,50, | 1348,51, | 1348,52, | 1348,53, | 1348,54, | 1348,55, | 1348,56, | 1348,57, | 1348,58, | 1348,59, | 1348,60, | 1348,61, | 1348,62, | 1348,63, | 1348,64, | 1348,65, | 1348,66, | 1348,67, | 1348,68, | 1348,69, | 1348,70, | 1348,71, | 1348,72, | 1348,73, | 1348,74, | 1348,75, | 1348,76, | 1348,77, | 1348,78, | 1348,79, | 1348,80, | 1348,81, | 1348,82, | 1348,83, | 1348,84, | 1348,85, | 1349,1, | 1349,2, | 1349,3, | 1349,4, | 1349,5, | 1349,6, | 1349,7, | 1349,8, | 1349,9, | 1349,10, | 1349,11, | 1349,12, | 1349,13, | 1349,14, | 1349,15, | 1349,16, | 1349,17, | 1349,18, | 1349,19, | 1349,20, | 1349,21, | 1349,22, | 1349,23, | 1349,24, | 1349,25, | 1349,26, | 1349,27, | 1349,28, | 1349,29, | 1349,30, | 1349,31, | 1349,32, | 1349,33, | 1349,34, | 1349,35, | 1349,36, | 1349,37, | 1349,38, | 1349,39, | 1349,40, | 1349,41, | 1349,42, | 1349,43, | 1349,44, | 1349,45, | 1349,46, | 1349,47, | 1349,48, | 1349,49, | 1349,50, | 1349,51, | 1349,52, | 1349,53, | 1349,54, | 1349,55, | 1349,56, | 1349,57, | 1349,58, | 1349,59, | 1349,60, | 1349,61, | 1349,62, | 1349,63, | 1349,64, | 1349,65, | 1349,66, | 1349,67, | 1349,68, | 1349,69, | 1349,70, | 1349,71, | 1349,72, | 1349,73, | 1349,74, | 1349,75, | 1349,76, | 1349,77, | 1349,78, | 1349,79, | 1349,80, | 1349,81, | 1349,82, | 1349,83, | 1349,84, | 1349,85, | 1350,1, | 1350,2, | 1350,3, | 1350,4, | 1350,5, | 1350,6, | 1350,7, | 1350,8, | 1350,9, | 1350,10, | 1350,11, | 1350,12, | 1350,13, | 1350,14, | 1350,15, | 1350,16, | 1350,17, | 1350,18, | 1350,19, | 1350,20, | 1350,21, | 1350,22, | 1350,23, | 1350,24, | 1350,25, | 1350,26, | 1350,27, | 1350,28, | 1350,29, | 1350,30, | 1350,31, | 1350,32, | 1350,33, | 1350,34, | 1350,35, | 1350,36, | 1350,37, | 1350,38, | 1350,39, | 1350,40, | 1350,41, | 1350,42, | 1350,43, | 1350,44, | 1350,45, | 1350,46, | 1350,47, | 1350,48, | 1350,49, | 1350,50, | 1350,51, | 1350,52, | 1350,53, | 1350,54, | 1350,55, | 1350,56, | 1350,57, | 1350,58, | 1350,59, | 1350,60, | 1350,61, | 1350,62, | 1350,63, | 1350,64, | 1350,65, | 1350,66, | 1350,67, | 1350,68, | 1350,69, | 1350,70, | 1350,71, | 1350,72, | 1350,73, | 1350,74, | 1350,75, | 1350,76, | 1350,77, | 1350,78, | 1350,79, | 1350,80, | 1350,81, | 1350,82, | 1350,83, | 1350,84, | 1350,85, | 1351,1, | 1351,2, | 1351,3, | 1351,4, | 1351,5, | 1351,6, | 1351,7, | 1351,8, | 1351,9, | 1351,10, | 1351,11, | 1351,12, | 1351,13, | 1351,14, | 1351,15, | 1351,16, | 1351,17, | 1351,18, | 1351,19, | 1351,20, | 1351,21, | 1351,22, | 1351,23, | 1351,24, | 1351,25, | 1351,26, | 1351,27, | 1351,28, | 1351,29, | 1351,30, | 1351,31, | 1351,32, | 1351,33, | 1351,34, | 1351,35, | 1351,36, | 1351,37, | 1351,38, | 1351,39, | 1351,40, | 1351,41, | 1351,42, | 1351,43, | 1351,44, | 1351,45, | 1351,46, | 1351,47, | 1351,48, | 1351,49, | 1351,50, | 1351,51, | 1351,52, | 1351,53, | 1351,54, | 1351,55, | 1351,56, | 1351,57, | 1351,58, | 1351,59, | 1351,60, | 1351,61, | 1351,62, | 1351,63, | 1351,64, | 1351,65, | 1351,66, | 1351,67, | 1351,68, | 1351,69, | 1351,70, | 1351,71, | 1351,72, | 1351,73, | 1351,74, | 1351,75, | 1351,76, | 1351,77, | 1351,78, | 1351,79, | 1351,80, | 1351,81, | 1351,82, | 1351,83, | 1351,84, | 1351,85, | 1352,1, | 1352,2, | 1352,3, | 1352,4, | 1352,5, | 1352,6, | 1352,7, | 1352,8, | 1352,9, | 1352,10, | 1352,11, | 1352,12, | 1352,13, | 1352,14, | 1352,15, | 1352,16, | 1352,17, | 1352,18, | 1352,19, | 1352,20, | 1352,21, | 1352,22, | 1352,23, | 1352,24, | 1352,25, | 1352,26, | 1352,27, | 1352,28, | 1352,29, | 1352,30, | 1352,31, | 1352,32, | 1352,33, | 1352,34, | 1352,35, | 1352,36, | 1352,37, | 1352,38, | 1352,39, | 1352,40, | 1352,41, | 1352,42, | 1352,43, | 1352,44, | 1352,45, | 1352,46, | 1352,47, | 1352,48, | 1352,49, | 1352,50, | 1352,51, | 1352,52, | 1352,53, | 1352,54, | 1352,55, | 1352,56, | 1352,57, | 1352,58, | 1352,59, | 1352,60, | 1352,61, | 1352,62, | 1352,63, | 1352,64, | 1352,65, | 1352,66, | 1352,67, | 1352,68, | 1352,69, | 1352,70, | 1352,71, | 1352,72, | 1352,73, | 1352,74, | 1352,75, | 1352,76, | 1352,77, | 1352,78, | 1352,79, | 1352,80, | 1352,81, | 1352,82, | 1352,83, | 1352,84, | 1352,85, | 1353,1, | 1353,2, | 1353,3, | 1353,4, | 1353,5, | 1353,6, | 1353,7, | 1353,8, | 1353,9, | 1353,10, | 1353,11, | 1353,12, | 1353,13, | 1353,14, | 1353,15, | 1353,16, | 1353,17, | 1353,18, | 1353,19, | 1353,20, | 1353,21, | 1353,22, | 1353,23, | 1353,24, | 1353,25, | 1353,26, | 1353,27, | 1353,28, | 1353,29, | 1353,30, | 1353,31, | 1353,32, | 1353,33, | 1353,34, | 1353,35, | 1353,36, | 1353,37, | 1353,38, | 1353,39, | 1353,40, | 1353,41, | 1353,42, | 1353,43, | 1353,44, | 1353,45, | 1353,46, | 1353,47, | 1353,48, | 1353,49, | 1353,50, | 1353,51, | 1353,52, | 1353,53, | 1353,54, | 1353,55, | 1353,56, | 1353,57, | 1353,58, | 1353,59, | 1353,60, | 1353,61, | 1353,62, | 1353,63, | 1353,64, | 1353,65, | 1353,66, | 1353,67, | 1353,68, | 1353,69, | 1353,70, | 1353,71, | 1353,72, | 1353,73, | 1353,74, | 1353,75, | 1353,76, | 1353,77, | 1353,78, | 1353,79, | 1353,80, | 1353,81, | 1353,82, | 1353,83, | 1353,84, | 1353,85, | 1354,1, | 1354,2, | 1354,3, | 1354,4, | 1354,5, | 1354,6, | 1354,7, | 1354,8, | 1354,9, | 1354,10, | 1354,11, | 1354,12, | 1354,13, | 1354,14, | 1354,15, | 1354,16, | 1354,17, | 1354,18, | 1354,19, | 1354,20, | 1354,21, | 1354,22, | 1354,23, | 1354,24, | 1354,25, | 1354,26, | 1354,27, | 1354,28, | 1354,29, | 1354,30, | 1354,31, | 1354,32, | 1354,33, | 1354,34, | 1354,35, | 1354,36, | 1354,37, | 1354,38, | 1354,39, | 1354,40, | 1354,41, | 1354,42, | 1354,43, | 1354,44, | 1354,45, | 1354,46, | 1354,47, | 1354,48, | 1354,49, | 1354,50, | 1354,51, | 1354,52, | 1354,53, | 1354,54, | 1354,55, | 1354,56, | 1354,57, | 1354,58, | 1354,59, | 1354,60, | 1354,61, | 1354,62, | 1354,63, | 1354,64, | 1354,65, | 1354,66, | 1354,67, | 1354,68, | 1354,69, | 1354,70, | 1354,71, | 1354,72, | 1354,73, | 1354,74, | 1354,75, | 1354,76, | 1354,77, | 1354,78, | 1354,79, | 1354,80, | 1354,81, | 1354,82, | 1354,83, | 1354,84, | 1354,85, | 1355,1, | 1355,2, | 1355,3, | 1355,4, | 1355,5, | 1355,6, | 1355,7, | 1355,8, | 1355,9, | 1355,10, | 1355,11, | 1355,12, | 1355,13, | 1355,14, | 1355,15, | 1355,16, | 1355,17, | 1355,18, | 1355,19, | 1355,20, | 1355,21, | 1355,22, | 1355,23, | 1355,24, | 1355,25, | 1355,26, | 1355,27, | 1355,28, | 1355,29, | 1355,30, | 1355,31, | 1355,32, | 1355,33, | 1355,34, | 1355,35, | 1355,36, | 1355,37, | 1355,38, | 1355,39, | 1355,40, | 1355,41, | 1355,42, | 1355,43, | 1355,44, | 1355,45, | 1355,46, | 1355,47, | 1355,48, | 1355,49, | 1355,50, | 1355,51, | 1355,52, | 1355,53, | 1355,54, | 1355,55, | 1355,56, | 1355,57, | 1355,58, | 1355,59, | 1355,60, | 1355,61, | 1355,62, | 1355,63, | 1355,64, | 1355,65, | 1355,66, | 1355,67, | 1355,68, | 1355,69, | 1355,70, | 1355,71, | 1355,72, | 1355,73, | 1355,74, | 1355,75, | 1355,76, | 1355,77, | 1355,78, | 1355,79, | 1355,80, | 1355,81, | 1355,82, | 1355,83, | 1355,84, | 1355,85, | 1356,1, | 1356,2, | 1356,3, | 1356,4, | 1356,5, | 1356,6, | 1356,7, | 1356,8, | 1356,9, | 1356,10, | 1356,11, | 1356,12, | 1356,13, | 1356,14, | 1356,15, | 1356,16, | 1356,17, | 1356,18, | 1356,19, | 1356,20, | 1356,21, | 1356,22, | 1356,23, | 1356,24, | 1356,25, | 1356,26, | 1356,27, | 1356,28, | 1356,29, | 1356,30, | 1356,31, | 1356,32, | 1356,33, | 1356,34, | 1356,35, | 1356,36, | 1356,37, | 1356,38, | 1356,39, | 1356,40, | 1356,41, | 1356,42, | 1356,43, | 1356,44, | 1356,45, | 1356,46, | 1356,47, | 1356,48, | 1356,49, | 1356,50, | 1356,51, | 1356,52, | 1356,53, | 1356,54, | 1356,55, | 1356,56, | 1356,57, | 1356,58, | 1356,59, | 1356,60, | 1356,61, | 1356,62, | 1356,63, | 1356,64, | 1356,65, | 1356,66, | 1356,67, | 1356,68, | 1356,69, | 1356,70, | 1356,71, | 1356,72, | 1356,73, | 1356,74, | 1356,75, | 1356,76, | 1356,77, | 1356,78, | 1356,79, | 1356,80, | 1356,81, | 1356,82, | 1356,83, | 1356,84, | 1356,85, | 1357,1, | 1357,2, | 1357,3, | 1357,4, | 1357,5, | 1357,6, | 1357,7, | 1357,8, | 1357,9, | 1357,10, | 1357,11, | 1357,12, | 1357,13, | 1357,14, | 1357,15, | 1357,16, | 1357,17, | 1357,18, | 1357,19, | 1357,20, | 1357,21, | 1357,22, | 1357,23, | 1357,24, | 1357,25, | 1357,26, | 1357,27, | 1357,28, | 1357,29, | 1357,30, | 1357,31, | 1357,32, | 1357,33, | 1357,34, | 1357,35, | 1357,36, | 1357,37, | 1357,38, | 1357,39, | 1357,40, | 1357,41, | 1357,42, | 1357,43, | 1357,44, | 1357,45, | 1357,46, | 1357,47, | 1357,48, | 1357,49, | 1357,50, | 1357,51, | 1357,52, | 1357,53, | 1357,54, | 1357,55, | 1357,56, | 1357,57, | 1357,58, | 1357,59, | 1357,60, | 1357,61, | 1357,62, | 1357,63, | 1357,64, | 1357,65, | 1357,66, | 1357,67, | 1357,68, | 1357,69, | 1357,70, | 1357,71, | 1357,72, | 1357,73, | 1357,74, | 1357,75, | 1357,76, | 1357,77, | 1357,78, | 1357,79, | 1357,80, | 1357,81, | 1357,82, | 1357,83, | 1357,84, | 1357,85, | 1358,1, | 1358,2, | 1358,3, | 1358,4, | 1358,5, | 1358,6, | 1358,7, | 1358,8, | 1358,9, | 1358,10, | 1358,11, | 1358,12, | 1358,13, | 1358,14, | 1358,15, | 1358,16, | 1358,17, | 1358,18, | 1358,19, | 1358,20, | 1358,21, | 1358,22, | 1358,23, | 1358,24, | 1358,25, | 1358,26, | 1358,27, | 1358,28, | 1358,29, | 1358,30, | 1358,31, | 1358,32, | 1358,33, | 1358,34, | 1358,35, | 1358,36, | 1358,37, | 1358,38, | 1358,39, | 1358,40, | 1358,41, | 1358,42, | 1358,43, | 1358,44, | 1358,45, | 1358,46, | 1358,47, | 1358,48, | 1358,49, | 1358,50, | 1358,51, | 1358,52, | 1358,53, | 1358,54, | 1358,55, | 1358,56, | 1358,57, | 1358,58, | 1358,59, | 1358,60, | 1358,61, | 1358,62, | 1358,63, | 1358,64, | 1358,65, | 1358,66, | 1358,67, | 1358,68, | 1358,69, | 1358,70, | 1358,71, | 1358,72, | 1358,73, | 1358,74, | 1358,75, | 1358,76, | 1358,77, | 1358,78, | 1358,79, | 1358,80, | 1358,81, | 1358,82, | 1358,83, | 1358,84, | 1358,85, | 1359,1, | 1359,2, | 1359,3, | 1359,4, | 1359,5, | 1359,6, | 1359,7, | 1359,8, | 1359,9, | 1359,10, | 1359,11, | 1359,12, | 1359,13, | 1359,14, | 1359,15, | 1359,16, | 1359,17, | 1359,18, | 1359,19, | 1359,20, | 1359,21, | 1359,22, | 1359,23, | 1359,24, | 1359,25, | 1359,26, | 1359,27, | 1359,28, | 1359,29, | 1359,30, | 1359,31, | 1359,32, | 1359,33, | 1359,34, | 1359,35, | 1359,36, | 1359,37, | 1359,38, | 1359,39, | 1359,40, | 1359,41, | 1359,42, | 1359,43, | 1359,44, | 1359,45, | 1359,46, | 1359,47, | 1359,48, | 1359,49, | 1359,50, | 1359,51, | 1359,52, | 1359,53, | 1359,54, | 1359,55, | 1359,56, | 1359,57, | 1359,58, | 1359,59, | 1359,60, | 1359,61, | 1359,62, | 1359,63, | 1359,64, | 1359,65, | 1359,66, | 1359,67, | 1359,68, | 1359,69, | 1359,70, | 1359,71, | 1359,72, | 1359,73, | 1359,74, | 1359,75, | 1359,76, | 1359,77, | 1359,78, | 1359,79, | 1359,80, | 1359,81, | 1359,82, | 1359,83, | 1359,84, | 1359,85, | 1360,1, | 1360,2, | 1360,3, | 1360,4, | 1360,5, | 1360,6, | 1360,7, | 1360,8, | 1360,9, | 1360,10, | 1360,11, | 1360,12, | 1360,13, | 1360,14, | 1360,15, | 1360,16, | 1360,17, | 1360,18, | 1360,19, | 1360,20, | 1360,21, | 1360,22, | 1360,23, | 1360,24, | 1360,25, | 1360,26, | 1360,27, | 1360,28, | 1360,29, | 1360,30, | 1360,31, | 1360,32, | 1360,33, | 1360,34, | 1360,35, | 1360,36, | 1360,37, | 1360,38, | 1360,39, | 1360,40, | 1360,41, | 1360,42, | 1360,43, | 1360,44, | 1360,45, | 1360,46, | 1360,47, | 1360,48, | 1360,49, | 1360,50, | 1360,51, | 1360,52, | 1360,53, | 1360,54, | 1360,55, | 1360,56, | 1360,57, | 1360,58, | 1360,59, | 1360,60, | 1360,61, | 1360,62, | 1360,63, | 1360,64, | 1360,65, | 1360,66, | 1360,67, | 1360,68, | 1360,69, | 1360,70, | 1360,71, | 1360,72, | 1360,73, | 1360,74, | 1360,75, | 1360,76, | 1360,77, | 1360,78, | 1360,79, | 1360,80, | 1360,81, | 1360,82, | 1360,83, | 1360,84, | 1360,85, | 1361,1, | 1361,2, | 1361,3, | 1361,4, | 1361,5, | 1361,6, | 1361,7, | 1361,8, | 1361,9, | 1361,10, | 1361,11, | 1361,12, | 1361,13, | 1361,14, | 1361,15, | 1361,16, | 1361,17, | 1361,18, | 1361,19, | 1361,20, | 1361,21, | 1361,22, | 1361,23, | 1361,24, | 1361,25, | 1361,26, | 1361,27, | 1361,28, | 1361,29, | 1361,30, | 1361,31, | 1361,32, | 1361,33, | 1361,34, | 1361,35, | 1361,36, | 1361,37, | 1361,38, | 1361,39, | 1361,40, | 1361,41, | 1361,42, | 1361,43, | 1361,44, | 1361,45, | 1361,46, | 1361,47, | 1361,48, | 1361,49, | 1361,50, | 1361,51, | 1361,52, | 1361,53, | 1361,54, | 1361,55, | 1361,56, | 1361,57, | 1361,58, | 1361,59, | 1361,60, | 1361,61, | 1361,62, | 1361,63, | 1361,64, | 1361,65, | 1361,66, | 1361,67, | 1361,68, | 1361,69, | 1361,70, | 1361,71, | 1361,72, | 1361,73, | 1361,74, | 1361,75, | 1361,76, | 1361,77, | 1361,78, | 1361,79, | 1361,80, | 1361,81, | 1361,82, | 1361,83, | 1361,84, | 1361,85, | 1362,1, | 1362,2, | 1362,3, | 1362,4, | 1362,5, | 1362,6, | 1362,7, | 1362,8, | 1362,9, | 1362,10, | 1362,11, | 1362,12, | 1362,13, | 1362,14, | 1362,15, | 1362,16, | 1362,17, | 1362,18, | 1362,19, | 1362,20, | 1362,21, | 1362,22, | 1362,23, | 1362,24, | 1362,25, | 1362,26, | 1362,27, | 1362,28, | 1362,29, | 1362,30, | 1362,31, | 1362,32, | 1362,33, | 1362,34, | 1362,35, | 1362,36, | 1362,37, | 1362,38, | 1362,39, | 1362,40, | 1362,41, | 1362,42, | 1362,43, | 1362,44, | 1362,45, | 1362,46, | 1362,47, | 1362,48, | 1362,49, | 1362,50, | 1362,51, | 1362,52, | 1362,53, | 1362,54, | 1362,55, | 1362,56, | 1362,57, | 1362,58, | 1362,59, | 1362,60, | 1362,61, | 1362,62, | 1362,63, | 1362,64, | 1362,65, | 1362,66, | 1362,67, | 1362,68, | 1362,69, | 1362,70, | 1362,71, | 1362,72, | 1362,73, | 1362,74, | 1362,75, | 1362,76, | 1362,77, | 1362,78, | 1362,79, | 1362,80, | 1362,81, | 1362,82, | 1362,83, | 1362,84, | 1362,85, | 1363,1, | 1363,2, | 1363,3, | 1363,4, | 1363,5, | 1363,6, | 1363,7, | 1363,8, | 1363,9, | 1363,10, | 1363,11, | 1363,12, | 1363,13, | 1363,14, | 1363,15, | 1363,16, | 1363,17, | 1363,18, | 1363,19, | 1363,20, | 1363,21, | 1363,22, | 1363,23, | 1363,24, | 1363,25, | 1363,26, | 1363,27, | 1363,28, | 1363,29, | 1363,30, | 1363,31, | 1363,32, | 1363,33, | 1363,34, | 1363,35, | 1363,36, | 1363,37, | 1363,38, | 1363,39, | 1363,40, | 1363,41, | 1363,42, | 1363,43, | 1363,44, | 1363,45, | 1363,46, | 1363,47, | 1363,48, | 1363,49, | 1363,50, | 1363,51, | 1363,52, | 1363,53, | 1363,54, | 1363,55, | 1363,56, | 1363,57, | 1363,58, | 1363,59, | 1363,60, | 1363,61, | 1363,62, | 1363,63, | 1363,64, | 1363,65, | 1363,66, | 1363,67, | 1363,68, | 1363,69, | 1363,70, | 1363,71, | 1363,72, | 1363,73, | 1363,74, | 1363,75, | 1363,76, | 1363,77, | 1363,78, | 1363,79, | 1363,80, | 1363,81, | 1363,82, | 1363,83, | 1363,84, | 1363,85, | 1364,1, | 1364,2, | 1364,3, | 1364,4, | 1364,5, | 1364,6, | 1364,7, | 1364,8, | 1364,9, | 1364,10, | 1364,11, | 1364,12, | 1364,13, | 1364,14, | 1364,15, | 1364,16, | 1364,17, | 1364,18, | 1364,19, | 1364,20, | 1364,21, | 1364,22, | 1364,23, | 1364,24, | 1364,25, | 1364,26, | 1364,27, | 1364,28, | 1364,29, | 1364,30, | 1364,31, | 1364,32, | 1364,33, | 1364,34, | 1364,35, | 1364,36, | 1364,37, | 1364,38, | 1364,39, | 1364,40, | 1364,41, | 1364,42, | 1364,43, | 1364,44, | 1364,45, | 1364,46, | 1364,47, | 1364,48, | 1364,49, | 1364,50, | 1364,51, | 1364,52, | 1364,53, | 1364,54, | 1364,55, | 1364,56, | 1364,57, | 1364,58, | 1364,59, | 1364,60, | 1364,61, | 1364,62, | 1364,63, | 1364,64, | 1364,65, | 1364,66, | 1364,67, | 1364,68, | 1364,69, | 1364,70, | 1364,71, | 1364,72, | 1364,73, | 1364,74, | 1364,75, | 1364,76, | 1364,77, | 1364,78, | 1364,79, | 1364,80, | 1364,81, | 1364,82, | 1364,83, | 1364,84, | 1364,85, | 1365,1, | 1365,2, | 1365,3, | 1365,4, | 1365,5, | 1365,6, | 1365,7, | 1365,8, | 1365,9, | 1365,10, | 1365,11, | 1365,12, | 1365,13, | 1365,14, | 1365,15, | 1365,16, | 1365,17, | 1365,18, | 1365,19, | 1365,20, | 1365,21, | 1365,22, | 1365,23, | 1365,24, | 1365,25, | 1365,26, | 1365,27, | 1365,28, | 1365,29, | 1365,30, | 1365,31, | 1365,32, | 1365,33, | 1365,34, | 1365,35, | 1365,36, | 1365,37, | 1365,38, | 1365,39, | 1365,40, | 1365,41, | 1365,42, | 1365,43, | 1365,44, | 1365,45, | 1365,46, | 1365,47, | 1365,48, | 1365,49, | 1365,50, | 1365,51, | 1365,52, | 1365,53, | 1365,54, | 1365,55, | 1365,56, | 1365,57, | 1365,58, | 1365,59, | 1365,60, | 1365,61, | 1365,62, | 1365,63, | 1365,64, | 1365,65, | 1365,66, | 1365,67, | 1365,68, | 1365,69, | 1365,70, | 1365,71, | 1365,72, | 1365,73, | 1365,74, | 1365,75, | 1365,76, | 1365,77, | 1365,78, | 1365,79, | 1365,80, | 1365,81, | 1365,82, | 1365,83, | 1365,84, | 1365,85, | 1366,1, | 1366,2, | 1366,3, | 1366,4, | 1366,5, | 1366,6, | 1366,7, | 1366,8, | 1366,9, | 1366,10, | 1366,11, | 1366,12, | 1366,13, | 1366,14, | 1366,15, | 1366,16, | 1366,17, | 1366,18, | 1366,19, | 1366,20, | 1366,21, | 1366,22, | 1366,23, | 1366,24, | 1366,25, | 1366,26, | 1366,27, | 1366,28, | 1366,29, | 1366,30, | 1366,31, | 1366,32, | 1366,33, | 1366,34, | 1366,35, | 1366,36, | 1366,37, | 1366,38, | 1366,39, | 1366,40, | 1366,41, | 1366,42, | 1366,43, | 1366,44, | 1366,45, | 1366,46, | 1366,47, | 1366,48, | 1366,49, | 1366,50, | 1366,51, | 1366,52, | 1366,53, | 1366,54, | 1366,55, | 1366,56, | 1366,57, | 1366,58, | 1366,59, | 1366,60, | 1366,61, | 1366,62, | 1366,63, | 1366,64, | 1366,65, | 1366,66, | 1366,67, | 1366,68, | 1366,69, | 1366,70, | 1366,71, | 1366,72, | 1366,73, | 1366,74, | 1366,75, | 1366,76, | 1366,77, | 1366,78, | 1366,79, | 1366,80, | 1366,81, | 1366,82, | 1366,83, | 1366,84, | 1366,85, | 1367,1, | 1367,2, | 1367,3, | 1367,4, | 1367,5, | 1367,6, | 1367,7, | 1367,8, | 1367,9, | 1367,10, | 1367,11, | 1367,12, | 1367,13, | 1367,14, | 1367,15, | 1367,16, | 1367,17, | 1367,18, | 1367,19, | 1367,20, | 1367,21, | 1367,22, | 1367,23, | 1367,24, | 1367,25, | 1367,26, | 1367,27, | 1367,28, | 1367,29, | 1367,30, | 1367,31, | 1367,32, | 1367,33, | 1367,34, | 1367,35, | 1367,36, | 1367,37, | 1367,38, | 1367,39, | 1367,40, | 1367,41, | 1367,42, | 1367,43, | 1367,44, | 1367,45, | 1367,46, | 1367,47, | 1367,48, | 1367,49, | 1367,50, | 1367,51, | 1367,52, | 1367,53, | 1367,54, | 1367,55, | 1367,56, | 1367,57, | 1367,58, | 1367,59, | 1367,60, | 1367,61, | 1367,62, | 1367,63, | 1367,64, | 1367,65, | 1367,66, | 1367,67, | 1367,68, | 1367,69, | 1367,70, | 1367,71, | 1367,72, | 1367,73, | 1367,74, | 1367,75, | 1367,76, | 1367,77, | 1367,78, | 1367,79, | 1367,80, | 1367,81, | 1367,82, | 1367,83, | 1367,84, | 1367,85, | 1368,1, | 1368,2, | 1368,3, | 1368,4, | 1368,5, | 1368,6, | 1368,7, | 1368,8, | 1368,9, | 1368,10, | 1368,11, | 1368,12, | 1368,13, | 1368,14, | 1368,15, | 1368,16, | 1368,17, | 1368,18, | 1368,19, | 1368,20, | 1368,21, | 1368,22, | 1368,23, | 1368,24, | 1368,25, | 1368,26, | 1368,27, | 1368,28, | 1368,29, | 1368,30, | 1368,31, | 1368,32, | 1368,33, | 1368,34, | 1368,35, | 1368,36, | 1368,37, | 1368,38, | 1368,39, | 1368,40, | 1368,41, | 1368,42, | 1368,43, | 1368,44, | 1368,45, | 1368,46, | 1368,47, | 1368,48, | 1368,49, | 1368,50, | 1368,51, | 1368,52, | 1368,53, | 1368,54, | 1368,55, | 1368,56, | 1368,57, | 1368,58, | 1368,59, | 1368,60, | 1368,61, | 1368,62, | 1368,63, | 1368,64, | 1368,65, | 1368,66, | 1368,67, | 1368,68, | 1368,69, | 1368,70, | 1368,71, | 1368,72, | 1368,73, | 1368,74, | 1368,75, | 1368,76, | 1368,77, | 1368,78, | 1368,79, | 1368,80, | 1368,81, | 1368,82, | 1368,83, | 1368,84, | 1368,85, | 1369,1, | 1369,2, | 1369,3, | 1369,4, | 1369,5, | 1369,6, | 1369,7, | 1369,8, | 1369,9, | 1369,10, | 1369,11, | 1369,12, | 1369,13, | 1369,14, | 1369,15, | 1369,16, | 1369,17, | 1369,18, | 1369,19, | 1369,20, | 1369,21, | 1369,22, | 1369,23, | 1369,24, | 1369,25, | 1369,26, | 1369,27, | 1369,28, | 1369,29, | 1369,30, | 1369,31, | 1369,32, | 1369,33, | 1369,34, | 1369,35, | 1369,36, | 1369,37, | 1369,38, | 1369,39, | 1369,40, | 1369,41, | 1369,42, | 1369,43, | 1369,44, | 1369,45, | 1369,46, | 1369,47, | 1369,48, | 1369,49, | 1369,50, | 1369,51, | 1369,52, | 1369,53, | 1369,54, | 1369,55, | 1369,56, | 1369,57, | 1369,58, | 1369,59, | 1369,60, | 1369,61, | 1369,62, | 1369,63, | 1369,64, | 1369,65, | 1369,66, | 1369,67, | 1369,68, | 1369,69, | 1369,70, | 1369,71, | 1369,72, | 1369,73, | 1369,74, | 1369,75, | 1369,76, | 1369,77, | 1369,78, | 1369,79, | 1369,80, | 1369,81, | 1369,82, | 1369,83, | 1369,84, | 1369,85, | 1370,1, | 1370,2, | 1370,3, | 1370,4, | 1370,5, | 1370,6, | 1370,7, | 1370,8, | 1370,9, | 1370,10, | 1370,11, | 1370,12, | 1370,13, | 1370,14, | 1370,15, | 1370,16, | 1370,17, | 1370,18, | 1370,19, | 1370,20, | 1370,21, | 1370,22, | 1370,23, | 1370,24, | 1370,25, | 1370,26, | 1370,27, | 1370,28, | 1370,29, | 1370,30, | 1370,31, | 1370,32, | 1370,33, | 1370,34, | 1370,35, | 1370,36, | 1370,37, | 1370,38, | 1370,39, | 1370,40, | 1370,41, | 1370,42, | 1370,43, | 1370,44, | 1370,45, | 1370,46, | 1370,47, | 1370,48, | 1370,49, | 1370,50, | 1370,51, | 1370,52, | 1370,53, | 1370,54, | 1370,55, | 1370,56, | 1370,57, | 1370,58, | 1370,59, | 1370,60, | 1370,61, | 1370,62, | 1370,63, | 1370,64, | 1370,65, | 1370,66, | 1370,67, | 1370,68, | 1370,69, | 1370,70, | 1370,71, | 1370,72, | 1370,73, | 1370,74, | 1370,75, | 1370,76, | 1370,77, | 1370,78, | 1370,79, | 1370,80, | 1370,81, | 1370,82, | 1370,83, | 1370,84, | 1370,85, | 1371,1, | 1371,2, | 1371,3, | 1371,4, | 1371,5, | 1371,6, | 1371,7, | 1371,8, | 1371,9, | 1371,10, | 1371,11, | 1371,12, | 1371,13, | 1371,14, | 1371,15, | 1371,16, | 1371,17, | 1371,18, | 1371,19, | 1371,20, | 1371,21, | 1371,22, | 1371,23, | 1371,24, | 1371,25, | 1371,26, | 1371,27, | 1371,28, | 1371,29, | 1371,30, | 1371,31, | 1371,32, | 1371,33, | 1371,34, | 1371,35, | 1371,36, | 1371,37, | 1371,38, | 1371,39, | 1371,40, | 1371,41, | 1371,42, | 1371,43, | 1371,44, | 1371,45, | 1371,46, | 1371,47, | 1371,48, | 1371,49, | 1371,50, | 1371,51, | 1371,52, | 1371,53, | 1371,54, | 1371,55, | 1371,56, | 1371,57, | 1371,58, | 1371,59, | 1371,60, | 1371,61, | 1371,62, | 1371,63, | 1371,64, | 1371,65, | 1371,66, | 1371,67, | 1371,68, | 1371,69, | 1371,70, | 1371,71, | 1371,72, | 1371,73, | 1371,74, | 1371,75, | 1371,76, | 1371,77, | 1371,78, | 1371,79, | 1371,80, | 1371,81, | 1371,82, | 1371,83, | 1371,84, | 1371,85, | 1372,1, | 1372,2, | 1372,3, | 1372,4, | 1372,5, | 1372,6, | 1372,7, | 1372,8, | 1372,9, | 1372,10, | 1372,11, | 1372,12, | 1372,13, | 1372,14, | 1372,15, | 1372,16, | 1372,17, | 1372,18, | 1372,19, | 1372,20, | 1372,21, | 1372,22, | 1372,23, | 1372,24, | 1372,25, | 1372,26, | 1372,27, | 1372,28, | 1372,29, | 1372,30, | 1372,31, | 1372,32, | 1372,33, | 1372,34, | 1372,35, | 1372,36, | 1372,37, | 1372,38, | 1372,39, | 1372,40, | 1372,41, | 1372,42, | 1372,43, | 1372,44, | 1372,45, | 1372,46, | 1372,47, | 1372,48, | 1372,49, | 1372,50, | 1372,51, | 1372,52, | 1372,53, | 1372,54, | 1372,55, | 1372,56, | 1372,57, | 1372,58, | 1372,59, | 1372,60, | 1372,61, | 1372,62, | 1372,63, | 1372,64, | 1372,65, | 1372,66, | 1372,67, | 1372,68, | 1372,69, | 1372,70, | 1372,71, | 1372,72, | 1372,73, | 1372,74, | 1372,75, | 1372,76, | 1372,77, | 1372,78, | 1372,79, | 1372,80, | 1372,81, | 1372,82, | 1372,83, | 1372,84, | 1372,85, | 1373,1, | 1373,2, | 1373,3, | 1373,4, | 1373,5, | 1373,6, | 1373,7, | 1373,8, | 1373,9, | 1373,10, | 1373,11, | 1373,12, | 1373,13, | 1373,14, | 1373,15, | 1373,16, | 1373,17, | 1373,18, | 1373,19, | 1373,20, | 1373,21, | 1373,22, | 1373,23, | 1373,24, | 1373,25, | 1373,26, | 1373,27, | 1373,28, | 1373,29, | 1373,30, | 1373,31, | 1373,32, | 1373,33, | 1373,34, | 1373,35, | 1373,36, | 1373,37, | 1373,38, | 1373,39, | 1373,40, | 1373,41, | 1373,42, | 1373,43, | 1373,44, | 1373,45, | 1373,46, | 1373,47, | 1373,48, | 1373,49, | 1373,50, | 1373,51, | 1373,52, | 1373,53, | 1373,54, | 1373,55, | 1373,56, | 1373,57, | 1373,58, | 1373,59, | 1373,60, | 1373,61, | 1373,62, | 1373,63, | 1373,64, | 1373,65, | 1373,66, | 1373,67, | 1373,68, | 1373,69, | 1373,70, | 1373,71, | 1373,72, | 1373,73, | 1373,74, | 1373,75, | 1373,76, | 1373,77, | 1373,78, | 1373,79, | 1373,80, | 1373,81, | 1373,82, | 1373,83, | 1373,84, | 1373,85, | 1374,1, | 1374,2, | 1374,3, | 1374,4, | 1374,5, | 1374,6, | 1374,7, | 1374,8, | 1374,9, | 1374,10, | 1374,11, | 1374,12, | 1374,13, | 1374,14, | 1374,15, | 1374,16, | 1374,17, | 1374,18, | 1374,19, | 1374,20, | 1374,21, | 1374,22, | 1374,23, | 1374,24, | 1374,25, | 1374,26, | 1374,27, | 1374,28, | 1374,29, | 1374,30, | 1374,31, | 1374,32, | 1374,33, | 1374,34, | 1374,35, | 1374,36, | 1374,37, | 1374,38, | 1374,39, | 1374,40, | 1374,41, | 1374,42, | 1374,43, | 1374,44, | 1374,45, | 1374,46, | 1374,47, | 1374,48, | 1374,49, | 1374,50, | 1374,51, | 1374,52, | 1374,53, | 1374,54, | 1374,55, | 1374,56, | 1374,57, | 1374,58, | 1374,59, | 1374,60, | 1374,61, | 1374,62, | 1374,63, | 1374,64, | 1374,65, | 1374,66, | 1374,67, | 1374,68, | 1374,69, | 1374,70, | 1374,71, | 1374,72, | 1374,73, | 1374,74, | 1374,75, | 1374,76, | 1374,77, | 1374,78, | 1374,79, | 1374,80, | 1374,81, | 1374,82, | 1374,83, | 1374,84, | 1374,85, | 1375,1, | 1375,2, | 1375,3, | 1375,4, | 1375,5, | 1375,6, | 1375,7, | 1375,8, | 1375,9, | 1375,10, | 1375,11, | 1375,12, | 1375,13, | 1375,14, | 1375,15, | 1375,16, | 1375,17, | 1375,18, | 1375,19, | 1375,20, | 1375,21, | 1375,22, | 1375,23, | 1375,24, | 1375,25, | 1375,26, | 1375,27, | 1375,28, | 1375,29, | 1375,30, | 1375,31, | 1375,32, | 1375,33, | 1375,34, | 1375,35, | 1375,36, | 1375,37, | 1375,38, | 1375,39, | 1375,40, | 1375,41, | 1375,42, | 1375,43, | 1375,44, | 1375,45, | 1375,46, | 1375,47, | 1375,48, | 1375,49, | 1375,50, | 1375,51, | 1375,52, | 1375,53, | 1375,54, | 1375,55, | 1375,56, | 1375,57, | 1375,58, | 1375,59, | 1375,60, | 1375,61, | 1375,62, | 1375,63, | 1375,64, | 1375,65, | 1375,66, | 1375,67, | 1375,68, | 1375,69, | 1375,70, | 1375,71, | 1375,72, | 1375,73, | 1375,74, | 1375,75, | 1375,76, | 1375,77, | 1375,78, | 1375,79, | 1375,80, | 1375,81, | 1375,82, | 1375,83, | 1375,84, | 1375,85, | 1376,1, | 1376,2, | 1376,3, | 1376,4, | 1376,5, | 1376,6, | 1376,7, | 1376,8, | 1376,9, | 1376,10, | 1376,11, | 1376,12, | 1376,13, | 1376,14, | 1376,15, | 1376,16, | 1376,17, | 1376,18, | 1376,19, | 1376,20, | 1376,21, | 1376,22, | 1376,23, | 1376,24, | 1376,25, | 1376,26, | 1376,27, | 1376,28, | 1376,29, | 1376,30, | 1376,31, | 1376,32, | 1376,33, | 1376,34, | 1376,35, | 1376,36, | 1376,37, | 1376,38, | 1376,39, | 1376,40, | 1376,41, | 1376,42, | 1376,43, | 1376,44, | 1376,45, | 1376,46, | 1376,47, | 1376,48, | 1376,49, | 1376,50, | 1376,51, | 1376,52, | 1376,53, | 1376,54, | 1376,55, | 1376,56, | 1376,57, | 1376,58, | 1376,59, | 1376,60, | 1376,61, | 1376,62, | 1376,63, | 1376,64, | 1376,65, | 1376,66, | 1376,67, | 1376,68, | 1376,69, | 1376,70, | 1376,71, | 1376,72, | 1376,73, | 1376,74, | 1376,75, | 1376,76, | 1376,77, | 1376,78, | 1376,79, | 1376,80, | 1376,81, | 1376,82, | 1376,83, | 1376,84, | 1376,85, | 1377,1, | 1377,2, | 1377,3, | 1377,4, | 1377,5, | 1377,6, | 1377,7, | 1377,8, | 1377,9, | 1377,10, | 1377,11, | 1377,12, | 1377,13, | 1377,14, | 1377,15, | 1377,16, | 1377,17, | 1377,18, | 1377,19, | 1377,20, | 1377,21, | 1377,22, | 1377,23, | 1377,24, | 1377,25, | 1377,26, | 1377,27, | 1377,28, | 1377,29, | 1377,30, | 1377,31, | 1377,32, | 1377,33, | 1377,34, | 1377,35, | 1377,36, | 1377,37, | 1377,38, | 1377,39, | 1377,40, | 1377,41, | 1377,42, | 1377,43, | 1377,44, | 1377,45, | 1377,46, | 1377,47, | 1377,48, | 1377,49, | 1377,50, | 1377,51, | 1377,52, | 1377,53, | 1377,54, | 1377,55, | 1377,56, | 1377,57, | 1377,58, | 1377,59, | 1377,60, | 1377,61, | 1377,62, | 1377,63, | 1377,64, | 1377,65, | 1377,66, | 1377,67, | 1377,68, | 1377,69, | 1377,70, | 1377,71, | 1377,72, | 1377,73, | 1377,74, | 1377,75, | 1377,76, | 1377,77, | 1377,78, | 1377,79, | 1377,80, | 1377,81, | 1377,82, | 1377,83, | 1377,84, | 1377,85, | 1378,1, | 1378,2, | 1378,3, | 1378,4, | 1378,5, | 1378,6, | 1378,7, | 1378,8, | 1378,9, | 1378,10, | 1378,11, | 1378,12, | 1378,13, | 1378,14, | 1378,15, | 1378,16, | 1378,17, | 1378,18, | 1378,19, | 1378,20, | 1378,21, | 1378,22, | 1378,23, | 1378,24, | 1378,25, | 1378,26, | 1378,27, | 1378,28, | 1378,29, | 1378,30, | 1378,31, | 1378,32, | 1378,33, | 1378,34, | 1378,35, | 1378,36, | 1378,37, | 1378,38, | 1378,39, | 1378,40, | 1378,41, | 1378,42, | 1378,43, | 1378,44, | 1378,45, | 1378,46, | 1378,47, | 1378,48, | 1378,49, | 1378,50, | 1378,51, | 1378,52, | 1378,53, | 1378,54, | 1378,55, | 1378,56, | 1378,57, | 1378,58, | 1378,59, | 1378,60, | 1378,61, | 1378,62, | 1378,63, | 1378,64, | 1378,65, | 1378,66, | 1378,67, | 1378,68, | 1378,69, | 1378,70, | 1378,71, | 1378,72, | 1378,73, | 1378,74, | 1378,75, | 1378,76, | 1378,77, | 1378,78, | 1378,79, | 1378,80, | 1378,81, | 1378,82, | 1378,83, | 1378,84, | 1378,85, | 1379,1, | 1379,2, | 1379,3, | 1379,4, | 1379,5, | 1379,6, | 1379,7, | 1379,8, | 1379,9, | 1379,10, | 1379,11, | 1379,12, | 1379,13, | 1379,14, | 1379,15, | 1379,16, | 1379,17, | 1379,18, | 1379,19, | 1379,20, | 1379,21, | 1379,22, | 1379,23, | 1379,24, | 1379,25, | 1379,26, | 1379,27, | 1379,28, | 1379,29, | 1379,30, | 1379,31, | 1379,32, | 1379,33, | 1379,34, | 1379,35, | 1379,36, | 1379,37, | 1379,38, | 1379,39, | 1379,40, | 1379,41, | 1379,42, | 1379,43, | 1379,44, | 1379,45, | 1379,46, | 1379,47, | 1379,48, | 1379,49, | 1379,50, | 1379,51, | 1379,52, | 1379,53, | 1379,54, | 1379,55, | 1379,56, | 1379,57, | 1379,58, | 1379,59, | 1379,60, | 1379,61, | 1379,62, | 1379,63, | 1379,64, | 1379,65, | 1379,66, | 1379,67, | 1379,68, | 1379,69, | 1379,70, | 1379,71, | 1379,72, | 1379,73, | 1379,74, | 1379,75, | 1379,76, | 1379,77, | 1379,78, | 1379,79, | 1379,80, | 1379,81, | 1379,82, | 1379,83, | 1379,84, | 1379,85, | 1380,1, | 1380,2, | 1380,3, | 1380,4, | 1380,5, | 1380,6, | 1380,7, | 1380,8, | 1380,9, | 1380,10, | 1380,11, | 1380,12, | 1380,13, | 1380,14, | 1380,15, | 1380,16, | 1380,17, | 1380,18, | 1380,19, | 1380,20, | 1380,21, | 1380,22, | 1380,23, | 1380,24, | 1380,25, | 1380,26, | 1380,27, | 1380,28, | 1380,29, | 1380,30, | 1380,31, | 1380,32, | 1380,33, | 1380,34, | 1380,35, | 1380,36, | 1380,37, | 1380,38, | 1380,39, | 1380,40, | 1380,41, | 1380,42, | 1380,43, | 1380,44, | 1380,45, | 1380,46, | 1380,47, | 1380,48, | 1380,49, | 1380,50, | 1380,51, | 1380,52, | 1380,53, | 1380,54, | 1380,55, | 1380,56, | 1380,57, | 1380,58, | 1380,59, | 1380,60, | 1380,61, | 1380,62, | 1380,63, | 1380,64, | 1380,65, | 1380,66, | 1380,67, | 1380,68, | 1380,69, | 1380,70, | 1380,71, | 1380,72, | 1380,73, | 1380,74, | 1380,75, | 1380,76, | 1380,77, | 1380,78, | 1380,79, | 1380,80, | 1380,81, | 1380,82, | 1380,83, | 1380,84, | 1380,85, | 1381,1, | 1381,2, | 1381,3, | 1381,4, | 1381,5, | 1381,6, | 1381,7, | 1381,8, | 1381,9, | 1381,10, | 1381,11, | 1381,12, | 1381,13, | 1381,14, | 1381,15, | 1381,16, | 1381,17, | 1381,18, | 1381,19, | 1381,20, | 1381,21, | 1381,22, | 1381,23, | 1381,24, | 1381,25, | 1381,26, | 1381,27, | 1381,28, | 1381,29, | 1381,30, | 1381,31, | 1381,32, | 1381,33, | 1381,34, | 1381,35, | 1381,36, | 1381,37, | 1381,38, | 1381,39, | 1381,40, | 1381,41, | 1381,42, | 1381,43, | 1381,44, | 1381,45, | 1381,46, | 1381,47, | 1381,48, | 1381,49, | 1381,50, | 1381,51, | 1381,52, | 1381,53, | 1381,54, | 1381,55, | 1381,56, | 1381,57, | 1381,58, | 1381,59, | 1381,60, | 1381,61, | 1381,62, | 1381,63, | 1381,64, | 1381,65, | 1381,66, | 1381,67, | 1381,68, | 1381,69, | 1381,70, | 1381,71, | 1381,72, | 1381,73, | 1381,74, | 1381,75, | 1381,76, | 1381,77, | 1381,78, | 1381,79, | 1381,80, | 1381,81, | 1381,82, | 1381,83, | 1381,84, | 1381,85, | 1382,1, | 1382,2, | 1382,3, | 1382,4, | 1382,5, | 1382,6, | 1382,7, | 1382,8, | 1382,9, | 1382,10, | 1382,11, | 1382,12, | 1382,13, | 1382,14, | 1382,15, | 1382,16, | 1382,17, | 1382,18, | 1382,19, | 1382,20, | 1382,21, | 1382,22, | 1382,23, | 1382,24, | 1382,25, | 1382,26, | 1382,27, | 1382,28, | 1382,29, | 1382,30, | 1382,31, | 1382,32, | 1382,33, | 1382,34, | 1382,35, | 1382,36, | 1382,37, | 1382,38, | 1382,39, | 1382,40, | 1382,41, | 1382,42, | 1382,43, | 1382,44, | 1382,45, | 1382,46, | 1382,47, | 1382,48, | 1382,49, | 1382,50, | 1382,51, | 1382,52, | 1382,53, | 1382,54, | 1382,55, | 1382,56, | 1382,57, | 1382,58, | 1382,59, | 1382,60, | 1382,61, | 1382,62, | 1382,63, | 1382,64, | 1382,65, | 1382,66, | 1382,67, | 1382,68, | 1382,69, | 1382,70, | 1382,71, | 1382,72, | 1382,73, | 1382,74, | 1382,75, | 1382,76, | 1382,77, | 1382,78, | 1382,79, | 1382,80, | 1382,81, | 1382,82, | 1382,83, | 1382,84, | 1382,85, | 1383,1, | 1383,2, | 1383,3, | 1383,4, | 1383,5, | 1383,6, | 1383,7, | 1383,8, | 1383,9, | 1383,10, | 1383,11, | 1383,12, | 1383,13, | 1383,14, | 1383,15, | 1383,16, | 1383,17, | 1383,18, | 1383,19, | 1383,20, | 1383,21, | 1383,22, | 1383,23, | 1383,24, | 1383,25, | 1383,26, | 1383,27, | 1383,28, | 1383,29, | 1383,30, | 1383,31, | 1383,32, | 1383,33, | 1383,34, | 1383,35, | 1383,36, | 1383,37, | 1383,38, | 1383,39, | 1383,40, | 1383,41, | 1383,42, | 1383,43, | 1383,44, | 1383,45, | 1383,46, | 1383,47, | 1383,48, | 1383,49, | 1383,50, | 1383,51, | 1383,52, | 1383,53, | 1383,54, | 1383,55, | 1383,56, | 1383,57, | 1383,58, | 1383,59, | 1383,60, | 1383,61, | 1383,62, | 1383,63, | 1383,64, | 1383,65, | 1383,66, | 1383,67, | 1383,68, | 1383,69, | 1383,70, | 1383,71, | 1383,72, | 1383,73, | 1383,74, | 1383,75, | 1383,76, | 1383,77, | 1383,78, | 1383,79, | 1383,80, | 1383,81, | 1383,82, | 1383,83, | 1383,84, | 1383,85, | 1384,1, | 1384,2, | 1384,3, | 1384,4, | 1384,5, | 1384,6, | 1384,7, | 1384,8, | 1384,9, | 1384,10, | 1384,11, | 1384,12, | 1384,13, | 1384,14, | 1384,15, | 1384,16, | 1384,17, | 1384,18, | 1384,19, | 1384,20, | 1384,21, | 1384,22, | 1384,23, | 1384,24, | 1384,25, | 1384,26, | 1384,27, | 1384,28, | 1384,29, | 1384,30, | 1384,31, | 1384,32, | 1384,33, | 1384,34, | 1384,35, | 1384,36, | 1384,37, | 1384,38, | 1384,39, | 1384,40, | 1384,41, | 1384,42, | 1384,43, | 1384,44, | 1384,45, | 1384,46, | 1384,47, | 1384,48, | 1384,49, | 1384,50, | 1384,51, | 1384,52, | 1384,53, | 1384,54, | 1384,55, | 1384,56, | 1384,57, | 1384,58, | 1384,59, | 1384,60, | 1384,61, | 1384,62, | 1384,63, | 1384,64, | 1384,65, | 1384,66, | 1384,67, | 1384,68, | 1384,69, | 1384,70, | 1384,71, | 1384,72, | 1384,73, | 1384,74, | 1384,75, | 1384,76, | 1384,77, | 1384,78, | 1384,79, | 1384,80, | 1384,81, | 1384,82, | 1384,83, | 1384,84, | 1384,85, | 1385,1, | 1385,2, | 1385,3, | 1385,4, | 1385,5, | 1385,6, | 1385,7, | 1385,8, | 1385,9, | 1385,10, | 1385,11, | 1385,12, | 1385,13, | 1385,14, | 1385,15, | 1385,16, | 1385,17, | 1385,18, | 1385,19, | 1385,20, | 1385,21, | 1385,22, | 1385,23, | 1385,24, | 1385,25, | 1385,26, | 1385,27, | 1385,28, | 1385,29, | 1385,30, | 1385,31, | 1385,32, | 1385,33, | 1385,34, | 1385,35, | 1385,36, | 1385,37, | 1385,38, | 1385,39, | 1385,40, | 1385,41, | 1385,42, | 1385,43, | 1385,44, | 1385,45, | 1385,46, | 1385,47, | 1385,48, | 1385,49, | 1385,50, | 1385,51, | 1385,52, | 1385,53, | 1385,54, | 1385,55, | 1385,56, | 1385,57, | 1385,58, | 1385,59, | 1385,60, | 1385,61, | 1385,62, | 1385,63, | 1385,64, | 1385,65, | 1385,66, | 1385,67, | 1385,68, | 1385,69, | 1385,70, | 1385,71, | 1385,72, | 1385,73, | 1385,74, | 1385,75, | 1385,76, | 1385,77, | 1385,78, | 1385,79, | 1385,80, | 1385,81, | 1385,82, | 1385,83, | 1385,84, | 1385,85, | 1386,1, | 1386,2, | 1386,3, | 1386,4, | 1386,5, | 1386,6, | 1386,7, | 1386,8, | 1386,9, | 1386,10, | 1386,11, | 1386,12, | 1386,13, | 1386,14, | 1386,15, | 1386,16, | 1386,17, | 1386,18, | 1386,19, | 1386,20, | 1386,21, | 1386,22, | 1386,23, | 1386,24, | 1386,25, | 1386,26, | 1386,27, | 1386,28, | 1386,29, | 1386,30, | 1386,31, | 1386,32, | 1386,33, | 1386,34, | 1386,35, | 1386,36, | 1386,37, | 1386,38, | 1386,39, | 1386,40, | 1386,41, | 1386,42, | 1386,43, | 1386,44, | 1386,45, | 1386,46, | 1386,47, | 1386,48, | 1386,49, | 1386,50, | 1386,51, | 1386,52, | 1386,53, | 1386,54, | 1386,55, | 1386,56, | 1386,57, | 1386,58, | 1386,59, | 1386,60, | 1386,61, | 1386,62, | 1386,63, | 1386,64, | 1386,65, | 1386,66, | 1386,67, | 1386,68, | 1386,69, | 1386,70, | 1386,71, | 1386,72, | 1386,73, | 1386,74, | 1386,75, | 1386,76, | 1386,77, | 1386,78, | 1386,79, | 1386,80, | 1386,81, | 1386,82, | 1386,83, | 1386,84, | 1386,85, | 1387,1, | 1387,2, | 1387,3, | 1387,4, | 1387,5, | 1387,6, | 1387,7, | 1387,8, | 1387,9, | 1387,10, | 1387,11, | 1387,12, | 1387,13, | 1387,14, | 1387,15, | 1387,16, | 1387,17, | 1387,18, | 1387,19, | 1387,20, | 1387,21, | 1387,22, | 1387,23, | 1387,24, | 1387,25, | 1387,26, | 1387,27, | 1387,28, | 1387,29, | 1387,30, | 1387,31, | 1387,32, | 1387,33, | 1387,34, | 1387,35, | 1387,36, | 1387,37, | 1387,38, | 1387,39, | 1387,40, | 1387,41, | 1387,42, | 1387,43, | 1387,44, | 1387,45, | 1387,46, | 1387,47, | 1387,48, | 1387,49, | 1387,50, | 1387,51, | 1387,52, | 1387,53, | 1387,54, | 1387,55, | 1387,56, | 1387,57, | 1387,58, | 1387,59, | 1387,60, | 1387,61, | 1387,62, | 1387,63, | 1387,64, | 1387,65, | 1387,66, | 1387,67, | 1387,68, | 1387,69, | 1387,70, | 1387,71, | 1387,72, | 1387,73, | 1387,74, | 1387,75, | 1387,76, | 1387,77, | 1387,78, | 1387,79, | 1387,80, | 1387,81, | 1387,82, | 1387,83, | 1387,84, | 1387,85, | 1388,1, | 1388,2, | 1388,3, | 1388,4, | 1388,5, | 1388,6, | 1388,7, | 1388,8, | 1388,9, | 1388,10, | 1388,11, | 1388,12, | 1388,13, | 1388,14, | 1388,15, | 1388,16, | 1388,17, | 1388,18, | 1388,19, | 1388,20, | 1388,21, | 1388,22, | 1388,23, | 1388,24, | 1388,25, | 1388,26, | 1388,27, | 1388,28, | 1388,29, | 1388,30, | 1388,31, | 1388,32, | 1388,33, | 1388,34, | 1388,35, | 1388,36, | 1388,37, | 1388,38, | 1388,39, | 1388,40, | 1388,41, | 1388,42, | 1388,43, | 1388,44, | 1388,45, | 1388,46, | 1388,47, | 1388,48, | 1388,49, | 1388,50, | 1388,51, | 1388,52, | 1388,53, | 1388,54, | 1388,55, | 1388,56, | 1388,57, | 1388,58, | 1388,59, | 1388,60, | 1388,61, | 1388,62, | 1388,63, | 1388,64, | 1388,65, | 1388,66, | 1388,67, | 1388,68, | 1388,69, | 1388,70, | 1388,71, | 1388,72, | 1388,73, | 1388,74, | 1388,75, | 1388,76, | 1388,77, | 1388,78, | 1388,79, | 1388,80, | 1388,81, | 1388,82, | 1388,83, | 1388,84, | 1388,85, | 1389,1, | 1389,2, | 1389,3, | 1389,4, | 1389,5, | 1389,6, | 1389,7, | 1389,8, | 1389,9, | 1389,10, | 1389,11, | 1389,12, | 1389,13, | 1389,14, | 1389,15, | 1389,16, | 1389,17, | 1389,18, | 1389,19, | 1389,20, | 1389,21, | 1389,22, | 1389,23, | 1389,24, | 1389,25, | 1389,26, | 1389,27, | 1389,28, | 1389,29, | 1389,30, | 1389,31, | 1389,32, | 1389,33, | 1389,34, | 1389,35, | 1389,36, | 1389,37, | 1389,38, | 1389,39, | 1389,40, | 1389,41, | 1389,42, | 1389,43, | 1389,44, | 1389,45, | 1389,46, | 1389,47, | 1389,48, | 1389,49, | 1389,50, | 1389,51, | 1389,52, | 1389,53, | 1389,54, | 1389,55, | 1389,56, | 1389,57, | 1389,58, | 1389,59, | 1389,60, | 1389,61, | 1389,62, | 1389,63, | 1389,64, | 1389,65, | 1389,66, | 1389,67, | 1389,68, | 1389,69, | 1389,70, | 1389,71, | 1389,72, | 1389,73, | 1389,74, | 1389,75, | 1389,76, | 1389,77, | 1389,78, | 1389,79, | 1389,80, | 1389,81, | 1389,82, | 1389,83, | 1389,84, | 1389,85, | 1390,1, | 1390,2, | 1390,3, | 1390,4, | 1390,5, | 1390,6, | 1390,7, | 1390,8, | 1390,9, | 1390,10, | 1390,11, | 1390,12, | 1390,13, | 1390,14, | 1390,15, | 1390,16, | 1390,17, | 1390,18, | 1390,19, | 1390,20, | 1390,21, | 1390,22, | 1390,23, | 1390,24, | 1390,25, | 1390,26, | 1390,27, | 1390,28, | 1390,29, | 1390,30, | 1390,31, | 1390,32, | 1390,33, | 1390,34, | 1390,35, | 1390,36, | 1390,37, | 1390,38, | 1390,39, | 1390,40, | 1390,41, | 1390,42, | 1390,43, | 1390,44, | 1390,45, | 1390,46, | 1390,47, | 1390,48, | 1390,49, | 1390,50, | 1390,51, | 1390,52, | 1390,53, | 1390,54, | 1390,55, | 1390,56, | 1390,57, | 1390,58, | 1390,59, | 1390,60, | 1390,61, | 1390,62, | 1390,63, | 1390,64, | 1390,65, | 1390,66, | 1390,67, | 1390,68, | 1390,69, | 1390,70, | 1390,71, | 1390,72, | 1390,73, | 1390,74, | 1390,75, | 1390,76, | 1390,77, | 1390,78, | 1390,79, | 1390,80, | 1390,81, | 1390,82, | 1390,83, | 1390,84, | 1390,85, | 1391,1, | 1391,2, | 1391,3, | 1391,4, | 1391,5, | 1391,6, | 1391,7, | 1391,8, | 1391,9, | 1391,10, | 1391,11, | 1391,12, | 1391,13, | 1391,14, | 1391,15, | 1391,16, | 1391,17, | 1391,18, | 1391,19, | 1391,20, | 1391,21, | 1391,22, | 1391,23, | 1391,24, | 1391,25, | 1391,26, | 1391,27, | 1391,28, | 1391,29, | 1391,30, | 1391,31, | 1391,32, | 1391,33, | 1391,34, | 1391,35, | 1391,36, | 1391,37, | 1391,38, | 1391,39, | 1391,40, | 1391,41, | 1391,42, | 1391,43, | 1391,44, | 1391,45, | 1391,46, | 1391,47, | 1391,48, | 1391,49, | 1391,50, | 1391,51, | 1391,52, | 1391,53, | 1391,54, | 1391,55, | 1391,56, | 1391,57, | 1391,58, | 1391,59, | 1391,60, | 1391,61, | 1391,62, | 1391,63, | 1391,64, | 1391,65, | 1391,66, | 1391,67, | 1391,68, | 1391,69, | 1391,70, | 1391,71, | 1391,72, | 1391,73, | 1391,74, | 1391,75, | 1391,76, | 1391,77, | 1391,78, | 1391,79, | 1391,80, | 1391,81, | 1391,82, | 1391,83, | 1391,84, | 1391,85, | 1392,1, | 1392,2, | 1392,3, | 1392,4, | 1392,5, | 1392,6, | 1392,7, | 1392,8, | 1392,9, | 1392,10, | 1392,11, | 1392,12, | 1392,13, | 1392,14, | 1392,15, | 1392,16, | 1392,17, | 1392,18, | 1392,19, | 1392,20, | 1392,21, | 1392,22, | 1392,23, | 1392,24, | 1392,25, | 1392,26, | 1392,27, | 1392,28, | 1392,29, | 1392,30, | 1392,31, | 1392,32, | 1392,33, | 1392,34, | 1392,35, | 1392,36, | 1392,37, | 1392,38, | 1392,39, | 1392,40, | 1392,41, | 1392,42, | 1392,43, | 1392,44, | 1392,45, | 1392,46, | 1392,47, | 1392,48, | 1392,49, | 1392,50, | 1392,51, | 1392,52, | 1392,53, | 1392,54, | 1392,55, | 1392,56, | 1392,57, | 1392,58, | 1392,59, | 1392,60, | 1392,61, | 1392,62, | 1392,63, | 1392,64, | 1392,65, | 1392,66, | 1392,67, | 1392,68, | 1392,69, | 1392,70, | 1392,71, | 1392,72, | 1392,73, | 1392,74, | 1392,75, | 1392,76, | 1392,77, | 1392,78, | 1392,79, | 1392,80, | 1392,81, | 1392,82, | 1392,83, | 1392,84, | 1392,85, | 1393,1, | 1393,2, | 1393,3, | 1393,4, | 1393,5, | 1393,6, | 1393,7, | 1393,8, | 1393,9, | 1393,10, | 1393,11, | 1393,12, | 1393,13, | 1393,14, | 1393,15, | 1393,16, | 1393,17, | 1393,18, | 1393,19, | 1393,20, | 1393,21, | 1393,22, | 1393,23, | 1393,24, | 1393,25, | 1393,26, | 1393,27, | 1393,28, | 1393,29, | 1393,30, | 1393,31, | 1393,32, | 1393,33, | 1393,34, | 1393,35, | 1393,36, | 1393,37, | 1393,38, | 1393,39, | 1393,40, | 1393,41, | 1393,42, | 1393,43, | 1393,44, | 1393,45, | 1393,46, | 1393,47, | 1393,48, | 1393,49, | 1393,50, | 1393,51, | 1393,52, | 1393,53, | 1393,54, | 1393,55, | 1393,56, | 1393,57, | 1393,58, | 1393,59, | 1393,60, | 1393,61, | 1393,62, | 1393,63, | 1393,64, | 1393,65, | 1393,66, | 1393,67, | 1393,68, | 1393,69, | 1393,70, | 1393,71, | 1393,72, | 1393,73, | 1393,74, | 1393,75, | 1393,76, | 1393,77, | 1393,78, | 1393,79, | 1393,80, | 1393,81, | 1393,82, | 1393,83, | 1393,84, | 1393,85, | 1394,1, | 1394,2, | 1394,3, | 1394,4, | 1394,5, | 1394,6, | 1394,7, | 1394,8, | 1394,9, | 1394,10, | 1394,11, | 1394,12, | 1394,13, | 1394,14, | 1394,15, | 1394,16, | 1394,17, | 1394,18, | 1394,19, | 1394,20, | 1394,21, | 1394,22, | 1394,23, | 1394,24, | 1394,25, | 1394,26, | 1394,27, | 1394,28, | 1394,29, | 1394,30, | 1394,31, | 1394,32, | 1394,33, | 1394,34, | 1394,35, | 1394,36, | 1394,37, | 1394,38, | 1394,39, | 1394,40, | 1394,41, | 1394,42, | 1394,43, | 1394,44, | 1394,45, | 1394,46, | 1394,47, | 1394,48, | 1394,49, | 1394,50, | 1394,51, | 1394,52, | 1394,53, | 1394,54, | 1394,55, | 1394,56, | 1394,57, | 1394,58, | 1394,59, | 1394,60, | 1394,61, | 1394,62, | 1394,63, | 1394,64, | 1394,65, | 1394,66, | 1394,67, | 1394,68, | 1394,69, | 1394,70, | 1394,71, | 1394,72, | 1394,73, | 1394,74, | 1394,75, | 1394,76, | 1394,77, | 1394,78, | 1394,79, | 1394,80, | 1394,81, | 1394,82, | 1394,83, | 1394,84, | 1394,85, | 1395,1, | 1395,2, | 1395,3, | 1395,4, | 1395,5, | 1395,6, | 1395,7, | 1395,8, | 1395,9, | 1395,10, | 1395,11, | 1395,12, | 1395,13, | 1395,14, | 1395,15, | 1395,16, | 1395,17, | 1395,18, | 1395,19, | 1395,20, | 1395,21, | 1395,22, | 1395,23, | 1395,24, | 1395,25, | 1395,26, | 1395,27, | 1395,28, | 1395,29, | 1395,30, | 1395,31, | 1395,32, | 1395,33, | 1395,34, | 1395,35, | 1395,36, | 1395,37, | 1395,38, | 1395,39, | 1395,40, | 1395,41, | 1395,42, | 1395,43, | 1395,44, | 1395,45, | 1395,46, | 1395,47, | 1395,48, | 1395,49, | 1395,50, | 1395,51, | 1395,52, | 1395,53, | 1395,54, | 1395,55, | 1395,56, | 1395,57, | 1395,58, | 1395,59, | 1395,60, | 1395,61, | 1395,62, | 1395,63, | 1395,64, | 1395,65, | 1395,66, | 1395,67, | 1395,68, | 1395,69, | 1395,70, | 1395,71, | 1395,72, | 1395,73, | 1395,74, | 1395,75, | 1395,76, | 1395,77, | 1395,78, | 1395,79, | 1395,80, | 1395,81, | 1395,82, | 1395,83, | 1395,84, | 1395,85, | 1396,1, | 1396,2, | 1396,3, | 1396,4, | 1396,5, | 1396,6, | 1396,7, | 1396,8, | 1396,9, | 1396,10, | 1396,11, | 1396,12, | 1396,13, | 1396,14, | 1396,15, | 1396,16, | 1396,17, | 1396,18, | 1396,19, | 1396,20, | 1396,21, | 1396,22, | 1396,23, | 1396,24, | 1396,25, | 1396,26, | 1396,27, | 1396,28, | 1396,29, | 1396,30, | 1396,31, | 1396,32, | 1396,33, | 1396,34, | 1396,35, | 1396,36, | 1396,37, | 1396,38, | 1396,39, | 1396,40, | 1396,41, | 1396,42, | 1396,43, | 1396,44, | 1396,45, | 1396,46, | 1396,47, | 1396,48, | 1396,49, | 1396,50, | 1396,51, | 1396,52, | 1396,53, | 1396,54, | 1396,55, | 1396,56, | 1396,57, | 1396,58, | 1396,59, | 1396,60, | 1396,61, | 1396,62, | 1396,63, | 1396,64, | 1396,65, | 1396,66, | 1396,67, | 1396,68, | 1396,69, | 1396,70, | 1396,71, | 1396,72, | 1396,73, | 1396,74, | 1396,75, | 1396,76, | 1396,77, | 1396,78, | 1396,79, | 1396,80, | 1396,81, | 1396,82, | 1396,83, | 1396,84, | 1396,85, | 1397,1, | 1397,2, | 1397,3, | 1397,4, | 1397,5, | 1397,6, | 1397,7, | 1397,8, | 1397,9, | 1397,10, | 1397,11, | 1397,12, | 1397,13, | 1397,14, | 1397,15, | 1397,16, | 1397,17, | 1397,18, | 1397,19, | 1397,20, | 1397,21, | 1397,22, | 1397,23, | 1397,24, | 1397,25, | 1397,26, | 1397,27, | 1397,28, | 1397,29, | 1397,30, | 1397,31, | 1397,32, | 1397,33, | 1397,34, | 1397,35, | 1397,36, | 1397,37, | 1397,38, | 1397,39, | 1397,40, | 1397,41, | 1397,42, | 1397,43, | 1397,44, | 1397,45, | 1397,46, | 1397,47, | 1397,48, | 1397,49, | 1397,50, | 1397,51, | 1397,52, | 1397,53, | 1397,54, | 1397,55, | 1397,56, | 1397,57, | 1397,58, | 1397,59, | 1397,60, | 1397,61, | 1397,62, | 1397,63, | 1397,64, | 1397,65, | 1397,66, | 1397,67, | 1397,68, | 1397,69, | 1397,70, | 1397,71, | 1397,72, | 1397,73, | 1397,74, | 1397,75, | 1397,76, | 1397,77, | 1397,78, | 1397,79, | 1397,80, | 1397,81, | 1397,82, | 1397,83, | 1397,84, | 1397,85, | 1398,1, | 1398,2, | 1398,3, | 1398,4, | 1398,5, | 1398,6, | 1398,7, | 1398,8, | 1398,9, | 1398,10, | 1398,11, | 1398,12, | 1398,13, | 1398,14, | 1398,15, | 1398,16, | 1398,17, | 1398,18, | 1398,19, | 1398,20, | 1398,21, | 1398,22, | 1398,23, | 1398,24, | 1398,25, | 1398,26, | 1398,27, | 1398,28, | 1398,29, | 1398,30, | 1398,31, | 1398,32, | 1398,33, | 1398,34, | 1398,35, | 1398,36, | 1398,37, | 1398,38, | 1398,39, | 1398,40, | 1398,41, | 1398,42, | 1398,43, | 1398,44, | 1398,45, | 1398,46, | 1398,47, | 1398,48, | 1398,49, | 1398,50, | 1398,51, | 1398,52, | 1398,53, | 1398,54, | 1398,55, | 1398,56, | 1398,57, | 1398,58, | 1398,59, | 1398,60, | 1398,61, | 1398,62, | 1398,63, | 1398,64, | 1398,65, | 1398,66, | 1398,67, | 1398,68, | 1398,69, | 1398,70, | 1398,71, | 1398,72, | 1398,73, | 1398,74, | 1398,75, | 1398,76, | 1398,77, | 1398,78, | 1398,79, | 1398,80, | 1398,81, | 1398,82, | 1398,83, | 1398,84, | 1398,85, | 1399,1, | 1399,2, | 1399,3, | 1399,4, | 1399,5, | 1399,6, | 1399,7, | 1399,8, | 1399,9, | 1399,10, | 1399,11, | 1399,12, | 1399,13, | 1399,14, | 1399,15, | 1399,16, | 1399,17, | 1399,18, | 1399,19, | 1399,20, | 1399,21, | 1399,22, | 1399,23, | 1399,24, | 1399,25, | 1399,26, | 1399,27, | 1399,28, | 1399,29, | 1399,30, | 1399,31, | 1399,32, | 1399,33, | 1399,34, | 1399,35, | 1399,36, | 1399,37, | 1399,38, | 1399,39, | 1399,40, | 1399,41, | 1399,42, | 1399,43, | 1399,44, | 1399,45, | 1399,46, | 1399,47, | 1399,48, | 1399,49, | 1399,50, | 1399,51, | 1399,52, | 1399,53, | 1399,54, | 1399,55, | 1399,56, | 1399,57, | 1399,58, | 1399,59, | 1399,60, | 1399,61, | 1399,62, | 1399,63, | 1399,64, | 1399,65, | 1399,66, | 1399,67, | 1399,68, | 1399,69, | 1399,70, | 1399,71, | 1399,72, | 1399,73, | 1399,74, | 1399,75, | 1399,76, | 1399,77, | 1399,78, | 1399,79, | 1399,80, | 1399,81, | 1399,82, | 1399,83, | 1399,84, | 1399,85, | 1400,1, | 1400,2, | 1400,3, | 1400,4, | 1400,5, | 1400,6, | 1400,7, | 1400,8, | 1400,9, | 1400,10, | 1400,11, | 1400,12, | 1400,13, | 1400,14, | 1400,15, | 1400,16, | 1400,17, | 1400,18, | 1400,19, | 1400,20, | 1400,21, | 1400,22, | 1400,23, | 1400,24, | 1400,25, | 1400,26, | 1400,27, | 1400,28, | 1400,29, | 1400,30, | 1400,31, | 1400,32, | 1400,33, | 1400,34, | 1400,35, | 1400,36, | 1400,37, | 1400,38, | 1400,39, | 1400,40, | 1400,41, | 1400,42, | 1400,43, | 1400,44, | 1400,45, | 1400,46, | 1400,47, | 1400,48, | 1400,49, | 1400,50, | 1400,51, | 1400,52, | 1400,53, | 1400,54, | 1400,55, | 1400,56, | 1400,57, | 1400,58, | 1400,59, | 1400,60, | 1400,61, | 1400,62, | 1400,63, | 1400,64, | 1400,65, | 1400,66, | 1400,67, | 1400,68, | 1400,69, | 1400,70, | 1400,71, | 1400,72, | 1400,73, | 1400,74, | 1400,75, | 1400,76, | 1400,77, | 1400,78, | 1400,79, | 1400,80, | 1400,81, | 1400,82, | 1400,83, | 1400,84, | 1400,85, | 1401,1, | 1401,2, | 1401,3, | 1401,4, | 1401,5, | 1401,6, | 1401,7, | 1401,8, | 1401,9, | 1401,10, | 1401,11, | 1401,12, | 1401,13, | 1401,14, | 1401,15, | 1401,16, | 1401,17, | 1401,18, | 1401,19, | 1401,20, | 1401,21, | 1401,22, | 1401,23, | 1401,24, | 1401,25, | 1401,26, | 1401,27, | 1401,28, | 1401,29, | 1401,30, | 1401,31, | 1401,32, | 1401,33, | 1401,34, | 1401,35, | 1401,36, | 1401,37, | 1401,38, | 1401,39, | 1401,40, | 1401,41, | 1401,42, | 1401,43, | 1401,44, | 1401,45, | 1401,46, | 1401,47, | 1401,48, | 1401,49, | 1401,50, | 1401,51, | 1401,52, | 1401,53, | 1401,54, | 1401,55, | 1401,56, | 1401,57, | 1401,58, | 1401,59, | 1401,60, | 1401,61, | 1401,62, | 1401,63, | 1401,64, | 1401,65, | 1401,66, | 1401,67, | 1401,68, | 1401,69, | 1401,70, | 1401,71, | 1401,72, | 1401,73, | 1401,74, | 1401,75, | 1401,76, | 1401,77, | 1401,78, | 1401,79, | 1401,80, | 1401,81, | 1401,82, | 1401,83, | 1401,84, | 1401,85, | 1402,1, | 1402,2, | 1402,3, | 1402,4, | 1402,5, | 1402,6, | 1402,7, | 1402,8, | 1402,9, | 1402,10, | 1402,11, | 1402,12, | 1402,13, | 1402,14, | 1402,15, | 1402,16, | 1402,17, | 1402,18, | 1402,19, | 1402,20, | 1402,21, | 1402,22, | 1402,23, | 1402,24, | 1402,25, | 1402,26, | 1402,27, | 1402,28, | 1402,29, | 1402,30, | 1402,31, | 1402,32, | 1402,33, | 1402,34, | 1402,35, | 1402,36, | 1402,37, | 1402,38, | 1402,39, | 1402,40, | 1402,41, | 1402,42, | 1402,43, | 1402,44, | 1402,45, | 1402,46, | 1402,47, | 1402,48, | 1402,49, | 1402,50, | 1402,51, | 1402,52, | 1402,53, | 1402,54, | 1402,55, | 1402,56, | 1402,57, | 1402,58, | 1402,59, | 1402,60, | 1402,61, | 1402,62, | 1402,63, | 1402,64, | 1402,65, | 1402,66, | 1402,67, | 1402,68, | 1402,69, | 1402,70, | 1402,71, | 1402,72, | 1402,73, | 1402,74, | 1402,75, | 1402,76, | 1402,77, | 1402,78, | 1402,79, | 1402,80, | 1402,81, | 1402,82, | 1402,83, | 1402,84, | 1402,85, | 1403,1, | 1403,2, | 1403,3, | 1403,4, | 1403,5, | 1403,6, | 1403,7, | 1403,8, | 1403,9, | 1403,10, | 1403,11, | 1403,12, | 1403,13, | 1403,14, | 1403,15, | 1403,16, | 1403,17, | 1403,18, | 1403,19, | 1403,20, | 1403,21, | 1403,22, | 1403,23, | 1403,24, | 1403,25, | 1403,26, | 1403,27, | 1403,28, | 1403,29, | 1403,30, | 1403,31, | 1403,32, | 1403,33, | 1403,34, | 1403,35, | 1403,36, | 1403,37, | 1403,38, | 1403,39, | 1403,40, | 1403,41, | 1403,42, | 1403,43, | 1403,44, | 1403,45, | 1403,46, | 1403,47, | 1403,48, | 1403,49, | 1403,50, | 1403,51, | 1403,52, | 1403,53, | 1403,54, | 1403,55, | 1403,56, | 1403,57, | 1403,58, | 1403,59, | 1403,60, | 1403,61, | 1403,62, | 1403,63, | 1403,64, | 1403,65, | 1403,66, | 1403,67, | 1403,68, | 1403,69, | 1403,70, | 1403,71, | 1403,72, | 1403,73, | 1403,74, | 1403,75, | 1403,76, | 1403,77, | 1403,78, | 1403,79, | 1403,80, | 1403,81, | 1403,82, | 1403,83, | 1403,84, | 1403,85, | 1404,1, | 1404,2, | 1404,3, | 1404,4, | 1404,5, | 1404,6, | 1404,7, | 1404,8, | 1404,9, | 1404,10, | 1404,11, | 1404,12, | 1404,13, | 1404,14, | 1404,15, | 1404,16, | 1404,17, | 1404,18, | 1404,19, | 1404,20, | 1404,21, | 1404,22, | 1404,23, | 1404,24, | 1404,25, | 1404,26, | 1404,27, | 1404,28, | 1404,29, | 1404,30, | 1404,31, | 1404,32, | 1404,33, | 1404,34, | 1404,35, | 1404,36, | 1404,37, | 1404,38, | 1404,39, | 1404,40, | 1404,41, | 1404,42, | 1404,43, | 1404,44, | 1404,45, | 1404,46, | 1404,47, | 1404,48, | 1404,49, | 1404,50, | 1404,51, | 1404,52, | 1404,53, | 1404,54, | 1404,55, | 1404,56, | 1404,57, | 1404,58, | 1404,59, | 1404,60, | 1404,61, | 1404,62, | 1404,63, | 1404,64, | 1404,65, | 1404,66, | 1404,67, | 1404,68, | 1404,69, | 1404,70, | 1404,71, | 1404,72, | 1404,73, | 1404,74, | 1404,75, | 1404,76, | 1404,77, | 1404,78, | 1404,79, | 1404,80, | 1404,81, | 1404,82, | 1404,83, | 1404,84, | 1404,85, | 1405,1, | 1405,2, | 1405,3, | 1405,4, | 1405,5, | 1405,6, | 1405,7, | 1405,8, | 1405,9, | 1405,10, | 1405,11, | 1405,12, | 1405,13, | 1405,14, | 1405,15, | 1405,16, | 1405,17, | 1405,18, | 1405,19, | 1405,20, | 1405,21, | 1405,22, | 1405,23, | 1405,24, | 1405,25, | 1405,26, | 1405,27, | 1405,28, | 1405,29, | 1405,30, | 1405,31, | 1405,32, | 1405,33, | 1405,34, | 1405,35, | 1405,36, | 1405,37, | 1405,38, | 1405,39, | 1405,40, | 1405,41, | 1405,42, | 1405,43, | 1405,44, | 1405,45, | 1405,46, | 1405,47, | 1405,48, | 1405,49, | 1405,50, | 1405,51, | 1405,52, | 1405,53, | 1405,54, | 1405,55, | 1405,56, | 1405,57, | 1405,58, | 1405,59, | 1405,60, | 1405,61, | 1405,62, | 1405,63, | 1405,64, | 1405,65, | 1405,66, | 1405,67, | 1405,68, | 1405,69, | 1405,70, | 1405,71, | 1405,72, | 1405,73, | 1405,74, | 1405,75, | 1405,76, | 1405,77, | 1405,78, | 1405,79, | 1405,80, | 1405,81, | 1405,82, | 1405,83, | 1405,84, | 1405,85, | 1406,1, | 1406,2, | 1406,3, | 1406,4, | 1406,5, | 1406,6, | 1406,7, | 1406,8, | 1406,9, | 1406,10, | 1406,11, | 1406,12, | 1406,13, | 1406,14, | 1406,15, | 1406,16, | 1406,17, | 1406,18, | 1406,19, | 1406,20, | 1406,21, | 1406,22, | 1406,23, | 1406,24, | 1406,25, | 1406,26, | 1406,27, | 1406,28, | 1406,29, | 1406,30, | 1406,31, | 1406,32, | 1406,33, | 1406,34, | 1406,35, | 1406,36, | 1406,37, | 1406,38, | 1406,39, | 1406,40, | 1406,41, | 1406,42, | 1406,43, | 1406,44, | 1406,45, | 1406,46, | 1406,47, | 1406,48, | 1406,49, | 1406,50, | 1406,51, | 1406,52, | 1406,53, | 1406,54, | 1406,55, | 1406,56, | 1406,57, | 1406,58, | 1406,59, | 1406,60, | 1406,61, | 1406,62, | 1406,63, | 1406,64, | 1406,65, | 1406,66, | 1406,67, | 1406,68, | 1406,69, | 1406,70, | 1406,71, | 1406,72, | 1406,73, | 1406,74, | 1406,75, | 1406,76, | 1406,77, | 1406,78, | 1406,79, | 1406,80, | 1406,81, | 1406,82, | 1406,83, | 1406,84, | 1406,85, | 1407,1, | 1407,2, | 1407,3, | 1407,4, | 1407,5, | 1407,6, | 1407,7, | 1407,8, | 1407,9, | 1407,10, | 1407,11, | 1407,12, | 1407,13, | 1407,14, | 1407,15, | 1407,16, | 1407,17, | 1407,18, | 1407,19, | 1407,20, | 1407,21, | 1407,22, | 1407,23, | 1407,24, | 1407,25, | 1407,26, | 1407,27, | 1407,28, | 1407,29, | 1407,30, | 1407,31, | 1407,32, | 1407,33, | 1407,34, | 1407,35, | 1407,36, | 1407,37, | 1407,38, | 1407,39, | 1407,40, | 1407,41, | 1407,42, | 1407,43, | 1407,44, | 1407,45, | 1407,46, | 1407,47, | 1407,48, | 1407,49, | 1407,50, | 1407,51, | 1407,52, | 1407,53, | 1407,54, | 1407,55, | 1407,56, | 1407,57, | 1407,58, | 1407,59, | 1407,60, | 1407,61, | 1407,62, | 1407,63, | 1407,64, | 1407,65, | 1407,66, | 1407,67, | 1407,68, | 1407,69, | 1407,70, | 1407,71, | 1407,72, | 1407,73, | 1407,74, | 1407,75, | 1407,76, | 1407,77, | 1407,78, | 1407,79, | 1407,80, | 1407,81, | 1407,82, | 1407,83, | 1407,84, | 1407,85, | 1408,1, | 1408,2, | 1408,3, | 1408,4, | 1408,5, | 1408,6, | 1408,7, | 1408,8, | 1408,9, | 1408,10, | 1408,11, | 1408,12, | 1408,13, | 1408,14, | 1408,15, | 1408,16, | 1408,17, | 1408,18, | 1408,19, | 1408,20, | 1408,21, | 1408,22, | 1408,23, | 1408,24, | 1408,25, | 1408,26, | 1408,27, | 1408,28, | 1408,29, | 1408,30, | 1408,31, | 1408,32, | 1408,33, | 1408,34, | 1408,35, | 1408,36, | 1408,37, | 1408,38, | 1408,39, | 1408,40, | 1408,41, | 1408,42, | 1408,43, | 1408,44, | 1408,45, | 1408,46, | 1408,47, | 1408,48, | 1408,49, | 1408,50, | 1408,51, | 1408,52, | 1408,53, | 1408,54, | 1408,55, | 1408,56, | 1408,57, | 1408,58, | 1408,59, | 1408,60, | 1408,61, | 1408,62, | 1408,63, | 1408,64, | 1408,65, | 1408,66, | 1408,67, | 1408,68, | 1408,69, | 1408,70, | 1408,71, | 1408,72, | 1408,73, | 1408,74, | 1408,75, | 1408,76, | 1408,77, | 1408,78, | 1408,79, | 1408,80, | 1408,81, | 1408,82, | 1408,83, | 1408,84, | 1408,85, | 1409,1, | 1409,2, | 1409,3, | 1409,4, | 1409,5, | 1409,6, | 1409,7, | 1409,8, | 1409,9, | 1409,10, | 1409,11, | 1409,12, | 1409,13, | 1409,14, | 1409,15, | 1409,16, | 1409,17, | 1409,18, | 1409,19, | 1409,20, | 1409,21, | 1409,22, | 1409,23, | 1409,24, | 1409,25, | 1409,26, | 1409,27, | 1409,28, | 1409,29, | 1409,30, | 1409,31, | 1409,32, | 1409,33, | 1409,34, | 1409,35, | 1409,36, | 1409,37, | 1409,38, | 1409,39, | 1409,40, | 1409,41, | 1409,42, | 1409,43, | 1409,44, | 1409,45, | 1409,46, | 1409,47, | 1409,48, | 1409,49, | 1409,50, | 1409,51, | 1409,52, | 1409,53, | 1409,54, | 1409,55, | 1409,56, | 1409,57, | 1409,58, | 1409,59, | 1409,60, | 1409,61, | 1409,62, | 1409,63, | 1409,64, | 1409,65, | 1409,66, | 1409,67, | 1409,68, | 1409,69, | 1409,70, | 1409,71, | 1409,72, | 1409,73, | 1409,74, | 1409,75, | 1409,76, | 1409,77, | 1409,78, | 1409,79, | 1409,80, | 1409,81, | 1409,82, | 1409,83, | 1409,84, | 1409,85, | 1410,1, | 1410,2, | 1410,3, | 1410,4, | 1410,5, | 1410,6, | 1410,7, | 1410,8, | 1410,9, | 1410,10, | 1410,11, | 1410,12, | 1410,13, | 1410,14, | 1410,15, | 1410,16, | 1410,17, | 1410,18, | 1410,19, | 1410,20, | 1410,21, | 1410,22, | 1410,23, | 1410,24, | 1410,25, | 1410,26, | 1410,27, | 1410,28, | 1410,29, | 1410,30, | 1410,31, | 1410,32, | 1410,33, | 1410,34, | 1410,35, | 1410,36, | 1410,37, | 1410,38, | 1410,39, | 1410,40, | 1410,41, | 1410,42, | 1410,43, | 1410,44, | 1410,45, | 1410,46, | 1410,47, | 1410,48, | 1410,49, | 1410,50, | 1410,51, | 1410,52, | 1410,53, | 1410,54, | 1410,55, | 1410,56, | 1410,57, | 1410,58, | 1410,59, | 1410,60, | 1410,61, | 1410,62, | 1410,63, | 1410,64, | 1410,65, | 1410,66, | 1410,67, | 1410,68, | 1410,69, | 1410,70, | 1410,71, | 1410,72, | 1410,73, | 1410,74, | 1410,75, | 1410,76, | 1410,77, | 1410,78, | 1410,79, | 1410,80, | 1410,81, | 1410,82, | 1410,83, | 1410,84, | 1410,85, | 1411,1, | 1411,2, | 1411,3, | 1411,4, | 1411,5, | 1411,6, | 1411,7, | 1411,8, | 1411,9, | 1411,10, | 1411,11, | 1411,12, | 1411,13, | 1411,14, | 1411,15, | 1411,16, | 1411,17, | 1411,18, | 1411,19, | 1411,20, | 1411,21, | 1411,22, | 1411,23, | 1411,24, | 1411,25, | 1411,26, | 1411,27, | 1411,28, | 1411,29, | 1411,30, | 1411,31, | 1411,32, | 1411,33, | 1411,34, | 1411,35, | 1411,36, | 1411,37, | 1411,38, | 1411,39, | 1411,40, | 1411,41, | 1411,42, | 1411,43, | 1411,44, | 1411,45, | 1411,46, | 1411,47, | 1411,48, | 1411,49, | 1411,50, | 1411,51, | 1411,52, | 1411,53, | 1411,54, | 1411,55, | 1411,56, | 1411,57, | 1411,58, | 1411,59, | 1411,60, | 1411,61, | 1411,62, | 1411,63, | 1411,64, | 1411,65, | 1411,66, | 1411,67, | 1411,68, | 1411,69, | 1411,70, | 1411,71, | 1411,72, | 1411,73, | 1411,74, | 1411,75, | 1411,76, | 1411,77, | 1411,78, | 1411,79, | 1411,80, | 1411,81, | 1411,82, | 1411,83, | 1411,84, | 1411,85, | 1412,1, | 1412,2, | 1412,3, | 1412,4, | 1412,5, | 1412,6, | 1412,7, | 1412,8, | 1412,9, | 1412,10, | 1412,11, | 1412,12, | 1412,13, | 1412,14, | 1412,15, | 1412,16, | 1412,17, | 1412,18, | 1412,19, | 1412,20, | 1412,21, | 1412,22, | 1412,23, | 1412,24, | 1412,25, | 1412,26, | 1412,27, | 1412,28, | 1412,29, | 1412,30, | 1412,31, | 1412,32, | 1412,33, | 1412,34, | 1412,35, | 1412,36, | 1412,37, | 1412,38, | 1412,39, | 1412,40, | 1412,41, | 1412,42, | 1412,43, | 1412,44, | 1412,45, | 1412,46, | 1412,47, | 1412,48, | 1412,49, | 1412,50, | 1412,51, | 1412,52, | 1412,53, | 1412,54, | 1412,55, | 1412,56, | 1412,57, | 1412,58, | 1412,59, | 1412,60, | 1412,61, | 1412,62, | 1412,63, | 1412,64, | 1412,65, | 1412,66, | 1412,67, | 1412,68, | 1412,69, | 1412,70, | 1412,71, | 1412,72, | 1412,73, | 1412,74, | 1412,75, | 1412,76, | 1412,77, | 1412,78, | 1412,79, | 1412,80, | 1412,81, | 1412,82, | 1412,83, | 1412,84, | 1412,85, | 1413,1, | 1413,2, | 1413,3, | 1413,4, | 1413,5, | 1413,6, | 1413,7, | 1413,8, | 1413,9, | 1413,10, | 1413,11, | 1413,12, | 1413,13, | 1413,14, | 1413,15, | 1413,16, | 1413,17, | 1413,18, | 1413,19, | 1413,20, | 1413,21, | 1413,22, | 1413,23, | 1413,24, | 1413,25, | 1413,26, | 1413,27, | 1413,28, | 1413,29, | 1413,30, | 1413,31, | 1413,32, | 1413,33, | 1413,34, | 1413,35, | 1413,36, | 1413,37, | 1413,38, | 1413,39, | 1413,40, | 1413,41, | 1413,42, | 1413,43, | 1413,44, | 1413,45, | 1413,46, | 1413,47, | 1413,48, | 1413,49, | 1413,50, | 1413,51, | 1413,52, | 1413,53, | 1413,54, | 1413,55, | 1413,56, | 1413,57, | 1413,58, | 1413,59, | 1413,60, | 1413,61, | 1413,62, | 1413,63, | 1413,64, | 1413,65, | 1413,66, | 1413,67, | 1413,68, | 1413,69, | 1413,70, | 1413,71, | 1413,72, | 1413,73, | 1413,74, | 1413,75, | 1413,76, | 1413,77, | 1413,78, | 1413,79, | 1413,80, | 1413,81, | 1413,82, | 1413,83, | 1413,84, | 1413,85, | 1414,1, | 1414,2, | 1414,3, | 1414,4, | 1414,5, | 1414,6, | 1414,7, | 1414,8, | 1414,9, | 1414,10, | 1414,11, | 1414,12, | 1414,13, | 1414,14, | 1414,15, | 1414,16, | 1414,17, | 1414,18, | 1414,19, | 1414,20, | 1414,21, | 1414,22, | 1414,23, | 1414,24, | 1414,25, | 1414,26, | 1414,27, | 1414,28, | 1414,29, | 1414,30, | 1414,31, | 1414,32, | 1414,33, | 1414,34, | 1414,35, | 1414,36, | 1414,37, | 1414,38, | 1414,39, | 1414,40, | 1414,41, | 1414,42, | 1414,43, | 1414,44, | 1414,45, | 1414,46, | 1414,47, | 1414,48, | 1414,49, | 1414,50, | 1414,51, | 1414,52, | 1414,53, | 1414,54, | 1414,55, | 1414,56, | 1414,57, | 1414,58, | 1414,59, | 1414,60, | 1414,61, | 1414,62, | 1414,63, | 1414,64, | 1414,65, | 1414,66, | 1414,67, | 1414,68, | 1414,69, | 1414,70, | 1414,71, | 1414,72, | 1414,73, | 1414,74, | 1414,75, | 1414,76, | 1414,77, | 1414,78, | 1414,79, | 1414,80, | 1414,81, | 1414,82, | 1414,83, | 1414,84, | 1414,85, | 1415,1, | 1415,2, | 1415,3, | 1415,4, | 1415,5, | 1415,6, | 1415,7, | 1415,8, | 1415,9, | 1415,10, | 1415,11, | 1415,12, | 1415,13, | 1415,14, | 1415,15, | 1415,16, | 1415,17, | 1415,18, | 1415,19, | 1415,20, | 1415,21, | 1415,22, | 1415,23, | 1415,24, | 1415,25, | 1415,26, | 1415,27, | 1415,28, | 1415,29, | 1415,30, | 1415,31, | 1415,32, | 1415,33, | 1415,34, | 1415,35, | 1415,36, | 1415,37, | 1415,38, | 1415,39, | 1415,40, | 1415,41, | 1415,42, | 1415,43, | 1415,44, | 1415,45, | 1415,46, | 1415,47, | 1415,48, | 1415,49, | 1415,50, | 1415,51, | 1415,52, | 1415,53, | 1415,54, | 1415,55, | 1415,56, | 1415,57, | 1415,58, | 1415,59, | 1415,60, | 1415,61, | 1415,62, | 1415,63, | 1415,64, | 1415,65, | 1415,66, | 1415,67, | 1415,68, | 1415,69, | 1415,70, | 1415,71, | 1415,72, | 1415,73, | 1415,74, | 1415,75, | 1415,76, | 1415,77, | 1415,78, | 1415,79, | 1415,80, | 1415,81, | 1415,82, | 1415,83, | 1415,84, | 1415,85, | 1416,1, | 1416,2, | 1416,3, | 1416,4, | 1416,5, | 1416,6, | 1416,7, | 1416,8, | 1416,9, | 1416,10, | 1416,11, | 1416,12, | 1416,13, | 1416,14, | 1416,15, | 1416,16, | 1416,17, | 1416,18, | 1416,19, | 1416,20, | 1416,21, | 1416,22, | 1416,23, | 1416,24, | 1416,25, | 1416,26, | 1416,27, | 1416,28, | 1416,29, | 1416,30, | 1416,31, | 1416,32, | 1416,33, | 1416,34, | 1416,35, | 1416,36, | 1416,37, | 1416,38, | 1416,39, | 1416,40, | 1416,41, | 1416,42, | 1416,43, | 1416,44, | 1416,45, | 1416,46, | 1416,47, | 1416,48, | 1416,49, | 1416,50, | 1416,51, | 1416,52, | 1416,53, | 1416,54, | 1416,55, | 1416,56, | 1416,57, | 1416,58, | 1416,59, | 1416,60, | 1416,61, | 1416,62, | 1416,63, | 1416,64, | 1416,65, | 1416,66, | 1416,67, | 1416,68, | 1416,69, | 1416,70, | 1416,71, | 1416,72, | 1416,73, | 1416,74, | 1416,75, | 1416,76, | 1416,77, | 1416,78, | 1416,79, | 1416,80, | 1416,81, | 1416,82, | 1416,83, | 1416,84, | 1416,85, | 1417,1, | 1417,2, | 1417,3, | 1417,4, | 1417,5, | 1417,6, | 1417,7, | 1417,8, | 1417,9, | 1417,10, | 1417,11, | 1417,12, | 1417,13, | 1417,14, | 1417,15, | 1417,16, | 1417,17, | 1417,18, | 1417,19, | 1417,20, | 1417,21, | 1417,22, | 1417,23, | 1417,24, | 1417,25, | 1417,26, | 1417,27, | 1417,28, | 1417,29, | 1417,30, | 1417,31, | 1417,32, | 1417,33, | 1417,34, | 1417,35, | 1417,36, | 1417,37, | 1417,38, | 1417,39, | 1417,40, | 1417,41, | 1417,42, | 1417,43, | 1417,44, | 1417,45, | 1417,46, | 1417,47, | 1417,48, | 1417,49, | 1417,50, | 1417,51, | 1417,52, | 1417,53, | 1417,54, | 1417,55, | 1417,56, | 1417,57, | 1417,58, | 1417,59, | 1417,60, | 1417,61, | 1417,62, | 1417,63, | 1417,64, | 1417,65, | 1417,66, | 1417,67, | 1417,68, | 1417,69, | 1417,70, | 1417,71, | 1417,72, | 1417,73, | 1417,74, | 1417,75, | 1417,76, | 1417,77, | 1417,78, | 1417,79, | 1417,80, | 1417,81, | 1417,82, | 1417,83, | 1417,84, | 1417,85, | 1418,1, | 1418,2, | 1418,3, | 1418,4, | 1418,5, | 1418,6, | 1418,7, | 1418,8, | 1418,9, | 1418,10, | 1418,11, | 1418,12, | 1418,13, | 1418,14, | 1418,15, | 1418,16, | 1418,17, | 1418,18, | 1418,19, | 1418,20, | 1418,21, | 1418,22, | 1418,23, | 1418,24, | 1418,25, | 1418,26, | 1418,27, | 1418,28, | 1418,29, | 1418,30, | 1418,31, | 1418,32, | 1418,33, | 1418,34, | 1418,35, | 1418,36, | 1418,37, | 1418,38, | 1418,39, | 1418,40, | 1418,41, | 1418,42, | 1418,43, | 1418,44, | 1418,45, | 1418,46, | 1418,47, | 1418,48, | 1418,49, | 1418,50, | 1418,51, | 1418,52, | 1418,53, | 1418,54, | 1418,55, | 1418,56, | 1418,57, | 1418,58, | 1418,59, | 1418,60, | 1418,61, | 1418,62, | 1418,63, | 1418,64, | 1418,65, | 1418,66, | 1418,67, | 1418,68, | 1418,69, | 1418,70, | 1418,71, | 1418,72, | 1418,73, | 1418,74, | 1418,75, | 1418,76, | 1418,77, | 1418,78, | 1418,79, | 1418,80, | 1418,81, | 1418,82, | 1418,83, | 1418,84, | 1418,85, | 1419,1, | 1419,2, | 1419,3, | 1419,4, | 1419,5, | 1419,6, | 1419,7, | 1419,8, | 1419,9, | 1419,10, | 1419,11, | 1419,12, | 1419,13, | 1419,14, | 1419,15, | 1419,16, | 1419,17, | 1419,18, | 1419,19, | 1419,20, | 1419,21, | 1419,22, | 1419,23, | 1419,24, | 1419,25, | 1419,26, | 1419,27, | 1419,28, | 1419,29, | 1419,30, | 1419,31, | 1419,32, | 1419,33, | 1419,34, | 1419,35, | 1419,36, | 1419,37, | 1419,38, | 1419,39, | 1419,40, | 1419,41, | 1419,42, | 1419,43, | 1419,44, | 1419,45, | 1419,46, | 1419,47, | 1419,48, | 1419,49, | 1419,50, | 1419,51, | 1419,52, | 1419,53, | 1419,54, | 1419,55, | 1419,56, | 1419,57, | 1419,58, | 1419,59, | 1419,60, | 1419,61, | 1419,62, | 1419,63, | 1419,64, | 1419,65, | 1419,66, | 1419,67, | 1419,68, | 1419,69, | 1419,70, | 1419,71, | 1419,72, | 1419,73, | 1419,74, | 1419,75, | 1419,76, | 1419,77, | 1419,78, | 1419,79, | 1419,80, | 1419,81, | 1419,82, | 1419,83, | 1419,84, | 1419,85, | 1420,1, | 1420,2, | 1420,3, | 1420,4, | 1420,5, | 1420,6, | 1420,7, | 1420,8, | 1420,9, | 1420,10, | 1420,11, | 1420,12, | 1420,13, | 1420,14, | 1420,15, | 1420,16, | 1420,17, | 1420,18, | 1420,19, | 1420,20, | 1420,21, | 1420,22, | 1420,23, | 1420,24, | 1420,25, | 1420,26, | 1420,27, | 1420,28, | 1420,29, | 1420,30, | 1420,31, | 1420,32, | 1420,33, | 1420,34, | 1420,35, | 1420,36, | 1420,37, | 1420,38, | 1420,39, | 1420,40, | 1420,41, | 1420,42, | 1420,43, | 1420,44, | 1420,45, | 1420,46, | 1420,47, | 1420,48, | 1420,49, | 1420,50, | 1420,51, | 1420,52, | 1420,53, | 1420,54, | 1420,55, | 1420,56, | 1420,57, | 1420,58, | 1420,59, | 1420,60, | 1420,61, | 1420,62, | 1420,63, | 1420,64, | 1420,65, | 1420,66, | 1420,67, | 1420,68, | 1420,69, | 1420,70, | 1420,71, | 1420,72, | 1420,73, | 1420,74, | 1420,75, | 1420,76, | 1420,77, | 1420,78, | 1420,79, | 1420,80, | 1420,81, | 1420,82, | 1420,83, | 1420,84, | 1420,85, | 1421,1, | 1421,2, | 1421,3, | 1421,4, | 1421,5, | 1421,6, | 1421,7, | 1421,8, | 1421,9, | 1421,10, | 1421,11, | 1421,12, | 1421,13, | 1421,14, | 1421,15, | 1421,16, | 1421,17, | 1421,18, | 1421,19, | 1421,20, | 1421,21, | 1421,22, | 1421,23, | 1421,24, | 1421,25, | 1421,26, | 1421,27, | 1421,28, | 1421,29, | 1421,30, | 1421,31, | 1421,32, | 1421,33, | 1421,34, | 1421,35, | 1421,36, | 1421,37, | 1421,38, | 1421,39, | 1421,40, | 1421,41, | 1421,42, | 1421,43, | 1421,44, | 1421,45, | 1421,46, | 1421,47, | 1421,48, | 1421,49, | 1421,50, | 1421,51, | 1421,52, | 1421,53, | 1421,54, | 1421,55, | 1421,56, | 1421,57, | 1421,58, | 1421,59, | 1421,60, | 1421,61, | 1421,62, | 1421,63, | 1421,64, | 1421,65, | 1421,66, | 1421,67, | 1421,68, | 1421,69, | 1421,70, | 1421,71, | 1421,72, | 1421,73, | 1421,74, | 1421,75, | 1421,76, | 1421,77, | 1421,78, | 1421,79, | 1421,80, | 1421,81, | 1421,82, | 1421,83, | 1421,84, | 1421,85, | 1422,1, | 1422,2, | 1422,3, | 1422,4, | 1422,5, | 1422,6, | 1422,7, | 1422,8, | 1422,9, | 1422,10, | 1422,11, | 1422,12, | 1422,13, | 1422,14, | 1422,15, | 1422,16, | 1422,17, | 1422,18, | 1422,19, | 1422,20, | 1422,21, | 1422,22, | 1422,23, | 1422,24, | 1422,25, | 1422,26, | 1422,27, | 1422,28, | 1422,29, | 1422,30, | 1422,31, | 1422,32, | 1422,33, | 1422,34, | 1422,35, | 1422,36, | 1422,37, | 1422,38, | 1422,39, | 1422,40, | 1422,41, | 1422,42, | 1422,43, | 1422,44, | 1422,45, | 1422,46, | 1422,47, | 1422,48, | 1422,49, | 1422,50, | 1422,51, | 1422,52, | 1422,53, | 1422,54, | 1422,55, | 1422,56, | 1422,57, | 1422,58, | 1422,59, | 1422,60, | 1422,61, | 1422,62, | 1422,63, | 1422,64, | 1422,65, | 1422,66, | 1422,67, | 1422,68, | 1422,69, | 1422,70, | 1422,71, | 1422,72, | 1422,73, | 1422,74, | 1422,75, | 1422,76, | 1422,77, | 1422,78, | 1422,79, | 1422,80, | 1422,81, | 1422,82, | 1422,83, | 1422,84, | 1422,85, | 1423,1, | 1423,2, | 1423,3, | 1423,4, | 1423,5, | 1423,6, | 1423,7, | 1423,8, | 1423,9, | 1423,10, | 1423,11, | 1423,12, | 1423,13, | 1423,14, | 1423,15, | 1423,16, | 1423,17, | 1423,18, | 1423,19, | 1423,20, | 1423,21, | 1423,22, | 1423,23, | 1423,24, | 1423,25, | 1423,26, | 1423,27, | 1423,28, | 1423,29, | 1423,30, | 1423,31, | 1423,32, | 1423,33, | 1423,34, | 1423,35, | 1423,36, | 1423,37, | 1423,38, | 1423,39, | 1423,40, | 1423,41, | 1423,42, | 1423,43, | 1423,44, | 1423,45, | 1423,46, | 1423,47, | 1423,48, | 1423,49, | 1423,50, | 1423,51, | 1423,52, | 1423,53, | 1423,54, | 1423,55, | 1423,56, | 1423,57, | 1423,58, | 1423,59, | 1423,60, | 1423,61, | 1423,62, | 1423,63, | 1423,64, | 1423,65, | 1423,66, | 1423,67, | 1423,68, | 1423,69, | 1423,70, | 1423,71, | 1423,72, | 1423,73, | 1423,74, | 1423,75, | 1423,76, | 1423,77, | 1423,78, | 1423,79, | 1423,80, | 1423,81, | 1423,82, | 1423,83, | 1423,84, | 1423,85, | 1424,1, | 1424,2, | 1424,3, | 1424,4, | 1424,5, | 1424,6, | 1424,7, | 1424,8, | 1424,9, | 1424,10, | 1424,11, | 1424,12, | 1424,13, | 1424,14, | 1424,15, | 1424,16, | 1424,17, | 1424,18, | 1424,19, | 1424,20, | 1424,21, | 1424,22, | 1424,23, | 1424,24, | 1424,25, | 1424,26, | 1424,27, | 1424,28, | 1424,29, | 1424,30, | 1424,31, | 1424,32, | 1424,33, | 1424,34, | 1424,35, | 1424,36, | 1424,37, | 1424,38, | 1424,39, | 1424,40, | 1424,41, | 1424,42, | 1424,43, | 1424,44, | 1424,45, | 1424,46, | 1424,47, | 1424,48, | 1424,49, | 1424,50, | 1424,51, | 1424,52, | 1424,53, | 1424,54, | 1424,55, | 1424,56, | 1424,57, | 1424,58, | 1424,59, | 1424,60, | 1424,61, | 1424,62, | 1424,63, | 1424,64, | 1424,65, | 1424,66, | 1424,67, | 1424,68, | 1424,69, | 1424,70, | 1424,71, | 1424,72, | 1424,73, | 1424,74, | 1424,75, | 1424,76, | 1424,77, | 1424,78, | 1424,79, | 1424,80, | 1424,81, | 1424,82, | 1424,83, | 1424,84, | 1424,85, | 1425,1, | 1425,2, | 1425,3, | 1425,4, | 1425,5, | 1425,6, | 1425,7, | 1425,8, | 1425,9, | 1425,10, | 1425,11, | 1425,12, | 1425,13, | 1425,14, | 1425,15, | 1425,16, | 1425,17, | 1425,18, | 1425,19, | 1425,20, | 1425,21, | 1425,22, | 1425,23, | 1425,24, | 1425,25, | 1425,26, | 1425,27, | 1425,28, | 1425,29, | 1425,30, | 1425,31, | 1425,32, | 1425,33, | 1425,34, | 1425,35, | 1425,36, | 1425,37, | 1425,38, | 1425,39, | 1425,40, | 1425,41, | 1425,42, | 1425,43, | 1425,44, | 1425,45, | 1425,46, | 1425,47, | 1425,48, | 1425,49, | 1425,50, | 1425,51, | 1425,52, | 1425,53, | 1425,54, | 1425,55, | 1425,56, | 1425,57, | 1425,58, | 1425,59, | 1425,60, | 1425,61, | 1425,62, | 1425,63, | 1425,64, | 1425,65, | 1425,66, | 1425,67, | 1425,68, | 1425,69, | 1425,70, | 1425,71, | 1425,72, | 1425,73, | 1425,74, | 1425,75, | 1425,76, | 1425,77, | 1425,78, | 1425,79, | 1425,80, | 1425,81, | 1425,82, | 1425,83, | 1425,84, | 1425,85, | 1426,1, | 1426,2, | 1426,3, | 1426,4, | 1426,5, | 1426,6, | 1426,7, | 1426,8, | 1426,9, | 1426,10, | 1426,11, | 1426,12, | 1426,13, | 1426,14, | 1426,15, | 1426,16, | 1426,17, | 1426,18, | 1426,19, | 1426,20, | 1426,21, | 1426,22, | 1426,23, | 1426,24, | 1426,25, | 1426,26, | 1426,27, | 1426,28, | 1426,29, | 1426,30, | 1426,31, | 1426,32, | 1426,33, | 1426,34, | 1426,35, | 1426,36, | 1426,37, | 1426,38, | 1426,39, | 1426,40, | 1426,41, | 1426,42, | 1426,43, | 1426,44, | 1426,45, | 1426,46, | 1426,47, | 1426,48, | 1426,49, | 1426,50, | 1426,51, | 1426,52, | 1426,53, | 1426,54, | 1426,55, | 1426,56, | 1426,57, | 1426,58, | 1426,59, | 1426,60, | 1426,61, | 1426,62, | 1426,63, | 1426,64, | 1426,65, | 1426,66, | 1426,67, | 1426,68, | 1426,69, | 1426,70, | 1426,71, | 1426,72, | 1426,73, | 1426,74, | 1426,75, | 1426,76, | 1426,77, | 1426,78, | 1426,79, | 1426,80, | 1426,81, | 1426,82, | 1426,83, | 1426,84, | 1426,85, | 1427,1, | 1427,2, | 1427,3, | 1427,4, | 1427,5, | 1427,6, | 1427,7, | 1427,8, | 1427,9, | 1427,10, | 1427,11, | 1427,12, | 1427,13, | 1427,14, | 1427,15, | 1427,16, | 1427,17, | 1427,18, | 1427,19, | 1427,20, | 1427,21, | 1427,22, | 1427,23, | 1427,24, | 1427,25, | 1427,26, | 1427,27, | 1427,28, | 1427,29, | 1427,30, | 1427,31, | 1427,32, | 1427,33, | 1427,34, | 1427,35, | 1427,36, | 1427,37, | 1427,38, | 1427,39, | 1427,40, | 1427,41, | 1427,42, | 1427,43, | 1427,44, | 1427,45, | 1427,46, | 1427,47, | 1427,48, | 1427,49, | 1427,50, | 1427,51, | 1427,52, | 1427,53, | 1427,54, | 1427,55, | 1427,56, | 1427,57, | 1427,58, | 1427,59, | 1427,60, | 1427,61, | 1427,62, | 1427,63, | 1427,64, | 1427,65, | 1427,66, | 1427,67, | 1427,68, | 1427,69, | 1427,70, | 1427,71, | 1427,72, | 1427,73, | 1427,74, | 1427,75, | 1427,76, | 1427,77, | 1427,78, | 1427,79, | 1427,80, | 1427,81, | 1427,82, | 1427,83, | 1427,84, | 1427,85, | 1428,1, | 1428,2, | 1428,3, | 1428,4, | 1428,5, | 1428,6, | 1428,7, | 1428,8, | 1428,9, | 1428,10, | 1428,11, | 1428,12, | 1428,13, | 1428,14, | 1428,15, | 1428,16, | 1428,17, | 1428,18, | 1428,19, | 1428,20, | 1428,21, | 1428,22, | 1428,23, | 1428,24, | 1428,25, | 1428,26, | 1428,27, | 1428,28, | 1428,29, | 1428,30, | 1428,31, | 1428,32, | 1428,33, | 1428,34, | 1428,35, | 1428,36, | 1428,37, | 1428,38, | 1428,39, | 1428,40, | 1428,41, | 1428,42, | 1428,43, | 1428,44, | 1428,45, | 1428,46, | 1428,47, | 1428,48, | 1428,49, | 1428,50, | 1428,51, | 1428,52, | 1428,53, | 1428,54, | 1428,55, | 1428,56, | 1428,57, | 1428,58, | 1428,59, | 1428,60, | 1428,61, | 1428,62, | 1428,63, | 1428,64, | 1428,65, | 1428,66, | 1428,67, | 1428,68, | 1428,69, | 1428,70, | 1428,71, | 1428,72, | 1428,73, | 1428,74, | 1428,75, | 1428,76, | 1428,77, | 1428,78, | 1428,79, | 1428,80, | 1428,81, | 1428,82, | 1428,83, | 1428,84, | 1428,85, | 1429,1, | 1429,2, | 1429,3, | 1429,4, | 1429,5, | 1429,6, | 1429,7, | 1429,8, | 1429,9, | 1429,10, | 1429,11, | 1429,12, | 1429,13, | 1429,14, | 1429,15, | 1429,16, | 1429,17, | 1429,18, | 1429,19, | 1429,20, | 1429,21, | 1429,22, | 1429,23, | 1429,24, | 1429,25, | 1429,26, | 1429,27, | 1429,28, | 1429,29, | 1429,30, | 1429,31, | 1429,32, | 1429,33, | 1429,34, | 1429,35, | 1429,36, | 1429,37, | 1429,38, | 1429,39, | 1429,40, | 1429,41, | 1429,42, | 1429,43, | 1429,44, | 1429,45, | 1429,46, | 1429,47, | 1429,48, | 1429,49, | 1429,50, | 1429,51, | 1429,52, | 1429,53, | 1429,54, | 1429,55, | 1429,56, | 1429,57, | 1429,58, | 1429,59, | 1429,60, | 1429,61, | 1429,62, | 1429,63, | 1429,64, | 1429,65, | 1429,66, | 1429,67, | 1429,68, | 1429,69, | 1429,70, | 1429,71, | 1429,72, | 1429,73, | 1429,74, | 1429,75, | 1429,76, | 1429,77, | 1429,78, | 1429,79, | 1429,80, | 1429,81, | 1429,82, | 1429,83, | 1429,84, | 1429,85, | 1430,1, | 1430,2, | 1430,3, | 1430,4, | 1430,5, | 1430,6, | 1430,7, | 1430,8, | 1430,9, | 1430,10, | 1430,11, | 1430,12, | 1430,13, | 1430,14, | 1430,15, | 1430,16, | 1430,17, | 1430,18, | 1430,19, | 1430,20, | 1430,21, | 1430,22, | 1430,23, | 1430,24, | 1430,25, | 1430,26, | 1430,27, | 1430,28, | 1430,29, | 1430,30, | 1430,31, | 1430,32, | 1430,33, | 1430,34, | 1430,35, | 1430,36, | 1430,37, | 1430,38, | 1430,39, | 1430,40, | 1430,41, | 1430,42, | 1430,43, | 1430,44, | 1430,45, | 1430,46, | 1430,47, | 1430,48, | 1430,49, | 1430,50, | 1430,51, | 1430,52, | 1430,53, | 1430,54, | 1430,55, | 1430,56, | 1430,57, | 1430,58, | 1430,59, | 1430,60, | 1430,61, | 1430,62, | 1430,63, | 1430,64, | 1430,65, | 1430,66, | 1430,67, | 1430,68, | 1430,69, | 1430,70, | 1430,71, | 1430,72, | 1430,73, | 1430,74, | 1430,75, | 1430,76, | 1430,77, | 1430,78, | 1430,79, | 1430,80, | 1430,81, | 1430,82, | 1430,83, | 1430,84, | 1430,85, | 1431,1, | 1431,2, | 1431,3, | 1431,4, | 1431,5, | 1431,6, | 1431,7, | 1431,8, | 1431,9, | 1431,10, | 1431,11, | 1431,12, | 1431,13, | 1431,14, | 1431,15, | 1431,16, | 1431,17, | 1431,18, | 1431,19, | 1431,20, | 1431,21, | 1431,22, | 1431,23, | 1431,24, | 1431,25, | 1431,26, | 1431,27, | 1431,28, | 1431,29, | 1431,30, | 1431,31, | 1431,32, | 1431,33, | 1431,34, | 1431,35, | 1431,36, | 1431,37, | 1431,38, | 1431,39, | 1431,40, | 1431,41, | 1431,42, | 1431,43, | 1431,44, | 1431,45, | 1431,46, | 1431,47, | 1431,48, | 1431,49, | 1431,50, | 1431,51, | 1431,52, | 1431,53, | 1431,54, | 1431,55, | 1431,56, | 1431,57, | 1431,58, | 1431,59, | 1431,60, | 1431,61, | 1431,62, | 1431,63, | 1431,64, | 1431,65, | 1431,66, | 1431,67, | 1431,68, | 1431,69, | 1431,70, | 1431,71, | 1431,72, | 1431,73, | 1431,74, | 1431,75, | 1431,76, | 1431,77, | 1431,78, | 1431,79, | 1431,80, | 1431,81, | 1431,82, | 1431,83, | 1431,84, | 1431,85, | 1432,1, | 1432,2, | 1432,3, | 1432,4, | 1432,5, | 1432,6, | 1432,7, | 1432,8, | 1432,9, | 1432,10, | 1432,11, | 1432,12, | 1432,13, | 1432,14, | 1432,15, | 1432,16, | 1432,17, | 1432,18, | 1432,19, | 1432,20, | 1432,21, | 1432,22, | 1432,23, | 1432,24, | 1432,25, | 1432,26, | 1432,27, | 1432,28, | 1432,29, | 1432,30, | 1432,31, | 1432,32, | 1432,33, | 1432,34, | 1432,35, | 1432,36, | 1432,37, | 1432,38, | 1432,39, | 1432,40, | 1432,41, | 1432,42, | 1432,43, | 1432,44, | 1432,45, | 1432,46, | 1432,47, | 1432,48, | 1432,49, | 1432,50, | 1432,51, | 1432,52, | 1432,53, | 1432,54, | 1432,55, | 1432,56, | 1432,57, | 1432,58, | 1432,59, | 1432,60, | 1432,61, | 1432,62, | 1432,63, | 1432,64, | 1432,65, | 1432,66, | 1432,67, | 1432,68, | 1432,69, | 1432,70, | 1432,71, | 1432,72, | 1432,73, | 1432,74, | 1432,75, | 1432,76, | 1432,77, | 1432,78, | 1432,79, | 1432,80, | 1432,81, | 1432,82, | 1432,83, | 1432,84, | 1432,85, | 1433,1, | 1433,2, | 1433,3, | 1433,4, | 1433,5, | 1433,6, | 1433,7, | 1433,8, | 1433,9, | 1433,10, | 1433,11, | 1433,12, | 1433,13, | 1433,14, | 1433,15, | 1433,16, | 1433,17, | 1433,18, | 1433,19, | 1433,20, | 1433,21, | 1433,22, | 1433,23, | 1433,24, | 1433,25, | 1433,26, | 1433,27, | 1433,28, | 1433,29, | 1433,30, | 1433,31, | 1433,32, | 1433,33, | 1433,34, | 1433,35, | 1433,36, | 1433,37, | 1433,38, | 1433,39, | 1433,40, | 1433,41, | 1433,42, | 1433,43, | 1433,44, | 1433,45, | 1433,46, | 1433,47, | 1433,48, | 1433,49, | 1433,50, | 1433,51, | 1433,52, | 1433,53, | 1433,54, | 1433,55, | 1433,56, | 1433,57, | 1433,58, | 1433,59, | 1433,60, | 1433,61, | 1433,62, | 1433,63, | 1433,64, | 1433,65, | 1433,66, | 1433,67, | 1433,68, | 1433,69, | 1433,70, | 1433,71, | 1433,72, | 1433,73, | 1433,74, | 1433,75, | 1433,76, | 1433,77, | 1433,78, | 1433,79, | 1433,80, | 1433,81, | 1433,82, | 1433,83, | 1433,84, | 1433,85, | 1434,1, | 1434,2, | 1434,3, | 1434,4, | 1434,5, | 1434,6, | 1434,7, | 1434,8, | 1434,9, | 1434,10, | 1434,11, | 1434,12, | 1434,13, | 1434,14, | 1434,15, | 1434,16, | 1434,17, | 1434,18, | 1434,19, | 1434,20, | 1434,21, | 1434,22, | 1434,23, | 1434,24, | 1434,25, | 1434,26, | 1434,27, | 1434,28, | 1434,29, | 1434,30, | 1434,31, | 1434,32, | 1434,33, | 1434,34, | 1434,35, | 1434,36, | 1434,37, | 1434,38, | 1434,39, | 1434,40, | 1434,41, | 1434,42, | 1434,43, | 1434,44, | 1434,45, | 1434,46, | 1434,47, | 1434,48, | 1434,49, | 1434,50, | 1434,51, | 1434,52, | 1434,53, | 1434,54, | 1434,55, | 1434,56, | 1434,57, | 1434,58, | 1434,59, | 1434,60, | 1434,61, | 1434,62, | 1434,63, | 1434,64, | 1434,65, | 1434,66, | 1434,67, | 1434,68, | 1434,69, | 1434,70, | 1434,71, | 1434,72, | 1434,73, | 1434,74, | 1434,75, | 1434,76, | 1434,77, | 1434,78, | 1434,79, | 1434,80, | 1434,81, | 1434,82, | 1434,83, | 1434,84, | 1434,85, | 1435,1, | 1435,2, | 1435,3, | 1435,4, | 1435,5, | 1435,6, | 1435,7, | 1435,8, | 1435,9, | 1435,10, | 1435,11, | 1435,12, | 1435,13, | 1435,14, | 1435,15, | 1435,16, | 1435,17, | 1435,18, | 1435,19, | 1435,20, | 1435,21, | 1435,22, | 1435,23, | 1435,24, | 1435,25, | 1435,26, | 1435,27, | 1435,28, | 1435,29, | 1435,30, | 1435,31, | 1435,32, | 1435,33, | 1435,34, | 1435,35, | 1435,36, | 1435,37, | 1435,38, | 1435,39, | 1435,40, | 1435,41, | 1435,42, | 1435,43, | 1435,44, | 1435,45, | 1435,46, | 1435,47, | 1435,48, | 1435,49, | 1435,50, | 1435,51, | 1435,52, | 1435,53, | 1435,54, | 1435,55, | 1435,56, | 1435,57, | 1435,58, | 1435,59, | 1435,60, | 1435,61, | 1435,62, | 1435,63, | 1435,64, | 1435,65, | 1435,66, | 1435,67, | 1435,68, | 1435,69, | 1435,70, | 1435,71, | 1435,72, | 1435,73, | 1435,74, | 1435,75, | 1435,76, | 1435,77, | 1435,78, | 1435,79, | 1435,80, | 1435,81, | 1435,82, | 1435,83, | 1435,84, | 1435,85, | 1436,1, | 1436,2, | 1436,3, | 1436,4, | 1436,5, | 1436,6, | 1436,7, | 1436,8, | 1436,9, | 1436,10, | 1436,11, | 1436,12, | 1436,13, | 1436,14, | 1436,15, | 1436,16, | 1436,17, | 1436,18, | 1436,19, | 1436,20, | 1436,21, | 1436,22, | 1436,23, | 1436,24, | 1436,25, | 1436,26, | 1436,27, | 1436,28, | 1436,29, | 1436,30, | 1436,31, | 1436,32, | 1436,33, | 1436,34, | 1436,35, | 1436,36, | 1436,37, | 1436,38, | 1436,39, | 1436,40, | 1436,41, | 1436,42, | 1436,43, | 1436,44, | 1436,45, | 1436,46, | 1436,47, | 1436,48, | 1436,49, | 1436,50, | 1436,51, | 1436,52, | 1436,53, | 1436,54, | 1436,55, | 1436,56, | 1436,57, | 1436,58, | 1436,59, | 1436,60, | 1436,61, | 1436,62, | 1436,63, | 1436,64, | 1436,65, | 1436,66, | 1436,67, | 1436,68, | 1436,69, | 1436,70, | 1436,71, | 1436,72, | 1436,73, | 1436,74, | 1436,75, | 1436,76, | 1436,77, | 1436,78, | 1436,79, | 1436,80, | 1436,81, | 1436,82, | 1436,83, | 1436,84, | 1436,85, | 1437,1, | 1437,2, | 1437,3, | 1437,4, | 1437,5, | 1437,6, | 1437,7, | 1437,8, | 1437,9, | 1437,10, | 1437,11, | 1437,12, | 1437,13, | 1437,14, | 1437,15, | 1437,16, | 1437,17, | 1437,18, | 1437,19, | 1437,20, | 1437,21, | 1437,22, | 1437,23, | 1437,24, | 1437,25, | 1437,26, | 1437,27, | 1437,28, | 1437,29, | 1437,30, | 1437,31, | 1437,32, | 1437,33, | 1437,34, | 1437,35, | 1437,36, | 1437,37, | 1437,38, | 1437,39, | 1437,40, | 1437,41, | 1437,42, | 1437,43, | 1437,44, | 1437,45, | 1437,46, | 1437,47, | 1437,48, | 1437,49, | 1437,50, | 1437,51, | 1437,52, | 1437,53, | 1437,54, | 1437,55, | 1437,56, | 1437,57, | 1437,58, | 1437,59, | 1437,60, | 1437,61, | 1437,62, | 1437,63, | 1437,64, | 1437,65, | 1437,66, | 1437,67, | 1437,68, | 1437,69, | 1437,70, | 1437,71, | 1437,72, | 1437,73, | 1437,74, | 1437,75, | 1437,76, | 1437,77, | 1437,78, | 1437,79, | 1437,80, | 1437,81, | 1437,82, | 1437,83, | 1437,84, | 1437,85, | 1438,1, | 1438,2, | 1438,3, | 1438,4, | 1438,5, | 1438,6, | 1438,7, | 1438,8, | 1438,9, | 1438,10, | 1438,11, | 1438,12, | 1438,13, | 1438,14, | 1438,15, | 1438,16, | 1438,17, | 1438,18, | 1438,19, | 1438,20, | 1438,21, | 1438,22, | 1438,23, | 1438,24, | 1438,25, | 1438,26, | 1438,27, | 1438,28, | 1438,29, | 1438,30, | 1438,31, | 1438,32, | 1438,33, | 1438,34, | 1438,35, | 1438,36, | 1438,37, | 1438,38, | 1438,39, | 1438,40, | 1438,41, | 1438,42, | 1438,43, | 1438,44, | 1438,45, | 1438,46, | 1438,47, | 1438,48, | 1438,49, | 1438,50, | 1438,51, | 1438,52, | 1438,53, | 1438,54, | 1438,55, | 1438,56, | 1438,57, | 1438,58, | 1438,59, | 1438,60, | 1438,61, | 1438,62, | 1438,63, | 1438,64, | 1438,65, | 1438,66, | 1438,67, | 1438,68, | 1438,69, | 1438,70, | 1438,71, | 1438,72, | 1438,73, | 1438,74, | 1438,75, | 1438,76, | 1438,77, | 1438,78, | 1438,79, | 1438,80, | 1438,81, | 1438,82, | 1438,83, | 1438,84, | 1438,85, | 1439,1, | 1439,2, | 1439,3, | 1439,4, | 1439,5, | 1439,6, | 1439,7, | 1439,8, | 1439,9, | 1439,10, | 1439,11, | 1439,12, | 1439,13, | 1439,14, | 1439,15, | 1439,16, | 1439,17, | 1439,18, | 1439,19, | 1439,20, | 1439,21, | 1439,22, | 1439,23, | 1439,24, | 1439,25, | 1439,26, | 1439,27, | 1439,28, | 1439,29, | 1439,30, | 1439,31, | 1439,32, | 1439,33, | 1439,34, | 1439,35, | 1439,36, | 1439,37, | 1439,38, | 1439,39, | 1439,40, | 1439,41, | 1439,42, | 1439,43, | 1439,44, | 1439,45, | 1439,46, | 1439,47, | 1439,48, | 1439,49, | 1439,50, | 1439,51, | 1439,52, | 1439,53, | 1439,54, | 1439,55, | 1439,56, | 1439,57, | 1439,58, | 1439,59, | 1439,60, | 1439,61, | 1439,62, | 1439,63, | 1439,64, | 1439,65, | 1439,66, | 1439,67, | 1439,68, | 1439,69, | 1439,70, | 1439,71, | 1439,72, | 1439,73, | 1439,74, | 1439,75, | 1439,76, | 1439,77, | 1439,78, | 1439,79, | 1439,80, | 1439,81, | 1439,82, | 1439,83, | 1439,84, | 1439,85, | 1440,1, | 1440,2, | 1440,3, | 1440,4, | 1440,5, | 1440,6, | 1440,7, | 1440,8, | 1440,9, | 1440,10, | 1440,11, | 1440,12, | 1440,13, | 1440,14, | 1440,15, | 1440,16, | 1440,17, | 1440,18, | 1440,19, | 1440,20, | 1440,21, | 1440,22, | 1440,23, | 1440,24, | 1440,25, | 1440,26, | 1440,27, | 1440,28, | 1440,29, | 1440,30, | 1440,31, | 1440,32, | 1440,33, | 1440,34, | 1440,35, | 1440,36, | 1440,37, | 1440,38, | 1440,39, | 1440,40, | 1440,41, | 1440,42, | 1440,43, | 1440,44, | 1440,45, | 1440,46, | 1440,47, | 1440,48, | 1440,49, | 1440,50, | 1440,51, | 1440,52, | 1440,53, | 1440,54, | 1440,55, | 1440,56, | 1440,57, | 1440,58, | 1440,59, | 1440,60, | 1440,61, | 1440,62, | 1440,63, | 1440,64, | 1440,65, | 1440,66, | 1440,67, | 1440,68, | 1440,69, | 1440,70, | 1440,71, | 1440,72, | 1440,73, | 1440,74, | 1440,75, | 1440,76, | 1440,77, | 1440,78, | 1440,79, | 1440,80, | 1440,81, | 1440,82, | 1440,83, | 1440,84, | 1440,85, | 1441,1, | 1441,2, | 1441,3, | 1441,4, | 1441,5, | 1441,6, | 1441,7, | 1441,8, | 1441,9, | 1441,10, | 1441,11, | 1441,12, | 1441,13, | 1441,14, | 1441,15, | 1441,16, | 1441,17, | 1441,18, | 1441,19, | 1441,20, | 1441,21, | 1441,22, | 1441,23, | 1441,24, | 1441,25, | 1441,26, | 1441,27, | 1441,28, | 1441,29, | 1441,30, | 1441,31, | 1441,32, | 1441,33, | 1441,34, | 1441,35, | 1441,36, | 1441,37, | 1441,38, | 1441,39, | 1441,40, | 1441,41, | 1441,42, | 1441,43, | 1441,44, | 1441,45, | 1441,46, | 1441,47, | 1441,48, | 1441,49, | 1441,50, | 1441,51, | 1441,52, | 1441,53, | 1441,54, | 1441,55, | 1441,56, | 1441,57, | 1441,58, | 1441,59, | 1441,60, | 1441,61, | 1441,62, | 1441,63, | 1441,64, | 1441,65, | 1441,66, | 1441,67, | 1441,68, | 1441,69, | 1441,70, | 1441,71, | 1441,72, | 1441,73, | 1441,74, | 1441,75, | 1441,76, | 1441,77, | 1441,78, | 1441,79, | 1441,80, | 1441,81, | 1441,82, | 1441,83, | 1441,84, | 1441,85, | 1442,1, | 1442,2, | 1442,3, | 1442,4, | 1442,5, | 1442,6, | 1442,7, | 1442,8, | 1442,9, | 1442,10, | 1442,11, | 1442,12, | 1442,13, | 1442,14, | 1442,15, | 1442,16, | 1442,17, | 1442,18, | 1442,19, | 1442,20, | 1442,21, | 1442,22, | 1442,23, | 1442,24, | 1442,25, | 1442,26, | 1442,27, | 1442,28, | 1442,29, | 1442,30, | 1442,31, | 1442,32, | 1442,33, | 1442,34, | 1442,35, | 1442,36, | 1442,37, | 1442,38, | 1442,39, | 1442,40, | 1442,41, | 1442,42, | 1442,43, | 1442,44, | 1442,45, | 1442,46, | 1442,47, | 1442,48, | 1442,49, | 1442,50, | 1442,51, | 1442,52, | 1442,53, | 1442,54, | 1442,55, | 1442,56, | 1442,57, | 1442,58, | 1442,59, | 1442,60, | 1442,61, | 1442,62, | 1442,63, | 1442,64, | 1442,65, | 1442,66, | 1442,67, | 1442,68, | 1442,69, | 1442,70, | 1442,71, | 1442,72, | 1442,73, | 1442,74, | 1442,75, | 1442,76, | 1442,77, | 1442,78, | 1442,79, | 1442,80, | 1442,81, | 1442,82, | 1442,83, | 1442,84, | 1442,85, | 1443,1, | 1443,2, | 1443,3, | 1443,4, | 1443,5, | 1443,6, | 1443,7, | 1443,8, | 1443,9, | 1443,10, | 1443,11, | 1443,12, | 1443,13, | 1443,14, | 1443,15, | 1443,16, | 1443,17, | 1443,18, | 1443,19, | 1443,20, | 1443,21, | 1443,22, | 1443,23, | 1443,24, | 1443,25, | 1443,26, | 1443,27, | 1443,28, | 1443,29, | 1443,30, | 1443,31, | 1443,32, | 1443,33, | 1443,34, | 1443,35, | 1443,36, | 1443,37, | 1443,38, | 1443,39, | 1443,40, | 1443,41, | 1443,42, | 1443,43, | 1443,44, | 1443,45, | 1443,46, | 1443,47, | 1443,48, | 1443,49, | 1443,50, | 1443,51, | 1443,52, | 1443,53, | 1443,54, | 1443,55, | 1443,56, | 1443,57, | 1443,58, | 1443,59, | 1443,60, | 1443,61, | 1443,62, | 1443,63, | 1443,64, | 1443,65, | 1443,66, | 1443,67, | 1443,68, | 1443,69, | 1443,70, | 1443,71, | 1443,72, | 1443,73, | 1443,74, | 1443,75, | 1443,76, | 1443,77, | 1443,78, | 1443,79, | 1443,80, | 1443,81, | 1443,82, | 1443,83, | 1443,84, | 1443,85, | 1444,1, | 1444,2, | 1444,3, | 1444,4, | 1444,5, | 1444,6, | 1444,7, | 1444,8, | 1444,9, | 1444,10, | 1444,11, | 1444,12, | 1444,13, | 1444,14, | 1444,15, | 1444,16, | 1444,17, | 1444,18, | 1444,19, | 1444,20, | 1444,21, | 1444,22, | 1444,23, | 1444,24, | 1444,25, | 1444,26, | 1444,27, | 1444,28, | 1444,29, | 1444,30, | 1444,31, | 1444,32, | 1444,33, | 1444,34, | 1444,35, | 1444,36, | 1444,37, | 1444,38, | 1444,39, | 1444,40, | 1444,41, | 1444,42, | 1444,43, | 1444,44, | 1444,45, | 1444,46, | 1444,47, | 1444,48, | 1444,49, | 1444,50, | 1444,51, | 1444,52, | 1444,53, | 1444,54, | 1444,55, | 1444,56, | 1444,57, | 1444,58, | 1444,59, | 1444,60, | 1444,61, | 1444,62, | 1444,63, | 1444,64, | 1444,65, | 1444,66, | 1444,67, | 1444,68, | 1444,69, | 1444,70, | 1444,71, | 1444,72, | 1444,73, | 1444,74, | 1444,75, | 1444,76, | 1444,77, | 1444,78, | 1444,79, | 1444,80, | 1444,81, | 1444,82, | 1444,83, | 1444,84, | 1444,85, | 1445,1, | 1445,2, | 1445,3, | 1445,4, | 1445,5, | 1445,6, | 1445,7, | 1445,8, | 1445,9, | 1445,10, | 1445,11, | 1445,12, | 1445,13, | 1445,14, | 1445,15, | 1445,16, | 1445,17, | 1445,18, | 1445,19, | 1445,20, | 1445,21, | 1445,22, | 1445,23, | 1445,24, | 1445,25, | 1445,26, | 1445,27, | 1445,28, | 1445,29, | 1445,30, | 1445,31, | 1445,32, | 1445,33, | 1445,34, | 1445,35, | 1445,36, | 1445,37, | 1445,38, | 1445,39, | 1445,40, | 1445,41, | 1445,42, | 1445,43, | 1445,44, | 1445,45, | 1445,46, | 1445,47, | 1445,48, | 1445,49, | 1445,50, | 1445,51, | 1445,52, | 1445,53, | 1445,54, | 1445,55, | 1445,56, | 1445,57, | 1445,58, | 1445,59, | 1445,60, | 1445,61, | 1445,62, | 1445,63, | 1445,64, | 1445,65, | 1445,66, | 1445,67, | 1445,68, | 1445,69, | 1445,70, | 1445,71, | 1445,72, | 1445,73, | 1445,74, | 1445,75, | 1445,76, | 1445,77, | 1445,78, | 1445,79, | 1445,80, | 1445,81, | 1445,82, | 1445,83, | 1445,84, | 1445,85, | 1446,1, | 1446,2, | 1446,3, | 1446,4, | 1446,5, | 1446,6, | 1446,7, | 1446,8, | 1446,9, | 1446,10, | 1446,11, | 1446,12, | 1446,13, | 1446,14, | 1446,15, | 1446,16, | 1446,17, | 1446,18, | 1446,19, | 1446,20, | 1446,21, | 1446,22, | 1446,23, | 1446,24, | 1446,25, | 1446,26, | 1446,27, | 1446,28, | 1446,29, | 1446,30, | 1446,31, | 1446,32, | 1446,33, | 1446,34, | 1446,35, | 1446,36, | 1446,37, | 1446,38, | 1446,39, | 1446,40, | 1446,41, | 1446,42, | 1446,43, | 1446,44, | 1446,45, | 1446,46, | 1446,47, | 1446,48, | 1446,49, | 1446,50, | 1446,51, | 1446,52, | 1446,53, | 1446,54, | 1446,55, | 1446,56, | 1446,57, | 1446,58, | 1446,59, | 1446,60, | 1446,61, | 1446,62, | 1446,63, | 1446,64, | 1446,65, | 1446,66, | 1446,67, | 1446,68, | 1446,69, | 1446,70, | 1446,71, | 1446,72, | 1446,73, | 1446,74, | 1446,75, | 1446,76, | 1446,77, | 1446,78, | 1446,79, | 1446,80, | 1446,81, | 1446,82, | 1446,83, | 1446,84, | 1446,85, | 1447,1, | 1447,2, | 1447,3, | 1447,4, | 1447,5, | 1447,6, | 1447,7, | 1447,8, | 1447,9, | 1447,10, | 1447,11, | 1447,12, | 1447,13, | 1447,14, | 1447,15, | 1447,16, | 1447,17, | 1447,18, | 1447,19, | 1447,20, | 1447,21, | 1447,22, | 1447,23, | 1447,24, | 1447,25, | 1447,26, | 1447,27, | 1447,28, | 1447,29, | 1447,30, | 1447,31, | 1447,32, | 1447,33, | 1447,34, | 1447,35, | 1447,36, | 1447,37, | 1447,38, | 1447,39, | 1447,40, | 1447,41, | 1447,42, | 1447,43, | 1447,44, | 1447,45, | 1447,46, | 1447,47, | 1447,48, | 1447,49, | 1447,50, | 1447,51, | 1447,52, | 1447,53, | 1447,54, | 1447,55, | 1447,56, | 1447,57, | 1447,58, | 1447,59, | 1447,60, | 1447,61, | 1447,62, | 1447,63, | 1447,64, | 1447,65, | 1447,66, | 1447,67, | 1447,68, | 1447,69, | 1447,70, | 1447,71, | 1447,72, | 1447,73, | 1447,74, | 1447,75, | 1447,76, | 1447,77, | 1447,78, | 1447,79, | 1447,80, | 1447,81, | 1447,82, | 1447,83, | 1447,84, | 1447,85, | 1448,1, | 1448,2, | 1448,3, | 1448,4, | 1448,5, | 1448,6, | 1448,7, | 1448,8, | 1448,9, | 1448,10, | 1448,11, | 1448,12, | 1448,13, | 1448,14, | 1448,15, | 1448,16, | 1448,17, | 1448,18, | 1448,19, | 1448,20, | 1448,21, | 1448,22, | 1448,23, | 1448,24, | 1448,25, | 1448,26, | 1448,27, | 1448,28, | 1448,29, | 1448,30, | 1448,31, | 1448,32, | 1448,33, | 1448,34, | 1448,35, | 1448,36, | 1448,37, | 1448,38, | 1448,39, | 1448,40, | 1448,41, | 1448,42, | 1448,43, | 1448,44, | 1448,45, | 1448,46, | 1448,47, | 1448,48, | 1448,49, | 1448,50, | 1448,51, | 1448,52, | 1448,53, | 1448,54, | 1448,55, | 1448,56, | 1448,57, | 1448,58, | 1448,59, | 1448,60, | 1448,61, | 1448,62, | 1448,63, | 1448,64, | 1448,65, | 1448,66, | 1448,67, | 1448,68, | 1448,69, | 1448,70, | 1448,71, | 1448,72, | 1448,73, | 1448,74, | 1448,75, | 1448,76, | 1448,77, | 1448,78, | 1448,79, | 1448,80, | 1448,81, | 1448,82, | 1448,83, | 1448,84, | 1448,85, | 1449,1, | 1449,2, | 1449,3, | 1449,4, | 1449,5, | 1449,6, | 1449,7, | 1449,8, | 1449,9, | 1449,10, | 1449,11, | 1449,12, | 1449,13, | 1449,14, | 1449,15, | 1449,16, | 1449,17, | 1449,18, | 1449,19, | 1449,20, | 1449,21, | 1449,22, | 1449,23, | 1449,24, | 1449,25, | 1449,26, | 1449,27, | 1449,28, | 1449,29, | 1449,30, | 1449,31, | 1449,32, | 1449,33, | 1449,34, | 1449,35, | 1449,36, | 1449,37, | 1449,38, | 1449,39, | 1449,40, | 1449,41, | 1449,42, | 1449,43, | 1449,44, | 1449,45, | 1449,46, | 1449,47, | 1449,48, | 1449,49, | 1449,50, | 1449,51, | 1449,52, | 1449,53, | 1449,54, | 1449,55, | 1449,56, | 1449,57, | 1449,58, | 1449,59, | 1449,60, | 1449,61, | 1449,62, | 1449,63, | 1449,64, | 1449,65, | 1449,66, | 1449,67, | 1449,68, | 1449,69, | 1449,70, | 1449,71, | 1449,72, | 1449,73, | 1449,74, | 1449,75, | 1449,76, | 1449,77, | 1449,78, | 1449,79, | 1449,80, | 1449,81, | 1449,82, | 1449,83, | 1449,84, | 1449,85, | 1450,1, | 1450,2, | 1450,3, | 1450,4, | 1450,5, | 1450,6, | 1450,7, | 1450,8, | 1450,9, | 1450,10, | 1450,11, | 1450,12, | 1450,13, | 1450,14, | 1450,15, | 1450,16, | 1450,17, | 1450,18, | 1450,19, | 1450,20, | 1450,21, | 1450,22, | 1450,23, | 1450,24, | 1450,25, | 1450,26, | 1450,27, | 1450,28, | 1450,29, | 1450,30, | 1450,31, | 1450,32, | 1450,33, | 1450,34, | 1450,35, | 1450,36, | 1450,37, | 1450,38, | 1450,39, | 1450,40, | 1450,41, | 1450,42, | 1450,43, | 1450,44, | 1450,45, | 1450,46, | 1450,47, | 1450,48, | 1450,49, | 1450,50, | 1450,51, | 1450,52, | 1450,53, | 1450,54, | 1450,55, | 1450,56, | 1450,57, | 1450,58, | 1450,59, | 1450,60, | 1450,61, | 1450,62, | 1450,63, | 1450,64, | 1450,65, | 1450,66, | 1450,67, | 1450,68, | 1450,69, | 1450,70, | 1450,71, | 1450,72, | 1450,73, | 1450,74, | 1450,75, | 1450,76, | 1450,77, | 1450,78, | 1450,79, | 1450,80, | 1450,81, | 1450,82, | 1450,83, | 1450,84, | 1450,85, | 1451,1, | 1451,2, | 1451,3, | 1451,4, | 1451,5, | 1451,6, | 1451,7, | 1451,8, | 1451,9, | 1451,10, | 1451,11, | 1451,12, | 1451,13, | 1451,14, | 1451,15, | 1451,16, | 1451,17, | 1451,18, | 1451,19, | 1451,20, | 1451,21, | 1451,22, | 1451,23, | 1451,24, | 1451,25, | 1451,26, | 1451,27, | 1451,28, | 1451,29, | 1451,30, | 1451,31, | 1451,32, | 1451,33, | 1451,34, | 1451,35, | 1451,36, | 1451,37, | 1451,38, | 1451,39, | 1451,40, | 1451,41, | 1451,42, | 1451,43, | 1451,44, | 1451,45, | 1451,46, | 1451,47, | 1451,48, | 1451,49, | 1451,50, | 1451,51, | 1451,52, | 1451,53, | 1451,54, | 1451,55, | 1451,56, | 1451,57, | 1451,58, | 1451,59, | 1451,60, | 1451,61, | 1451,62, | 1451,63, | 1451,64, | 1451,65, | 1451,66, | 1451,67, | 1451,68, | 1451,69, | 1451,70, | 1451,71, | 1451,72, | 1451,73, | 1451,74, | 1451,75, | 1451,76, | 1451,77, | 1451,78, | 1451,79, | 1451,80, | 1451,81, | 1451,82, | 1451,83, | 1451,84, | 1451,85, | 1452,1, | 1452,2, | 1452,3, | 1452,4, | 1452,5, | 1452,6, | 1452,7, | 1452,8, | 1452,9, | 1452,10, | 1452,11, | 1452,12, | 1452,13, | 1452,14, | 1452,15, | 1452,16, | 1452,17, | 1452,18, | 1452,19, | 1452,20, | 1452,21, | 1452,22, | 1452,23, | 1452,24, | 1452,25, | 1452,26, | 1452,27, | 1452,28, | 1452,29, | 1452,30, | 1452,31, | 1452,32, | 1452,33, | 1452,34, | 1452,35, | 1452,36, | 1452,37, | 1452,38, | 1452,39, | 1452,40, | 1452,41, | 1452,42, | 1452,43, | 1452,44, | 1452,45, | 1452,46, | 1452,47, | 1452,48, | 1452,49, | 1452,50, | 1452,51, | 1452,52, | 1452,53, | 1452,54, | 1452,55, | 1452,56, | 1452,57, | 1452,58, | 1452,59, | 1452,60, | 1452,61, | 1452,62, | 1452,63, | 1452,64, | 1452,65, | 1452,66, | 1452,67, | 1452,68, | 1452,69, | 1452,70, | 1452,71, | 1452,72, | 1452,73, | 1452,74, | 1452,75, | 1452,76, | 1452,77, | 1452,78, | 1452,79, | 1452,80, | 1452,81, | 1452,82, | 1452,83, | 1452,84, | 1452,85, | 1453,1, | 1453,2, | 1453,3, | 1453,4, | 1453,5, | 1453,6, | 1453,7, | 1453,8, | 1453,9, | 1453,10, | 1453,11, | 1453,12, | 1453,13, | 1453,14, | 1453,15, | 1453,16, | 1453,17, | 1453,18, | 1453,19, | 1453,20, | 1453,21, | 1453,22, | 1453,23, | 1453,24, | 1453,25, | 1453,26, | 1453,27, | 1453,28, | 1453,29, | 1453,30, | 1453,31, | 1453,32, | 1453,33, | 1453,34, | 1453,35, | 1453,36, | 1453,37, | 1453,38, | 1453,39, | 1453,40, | 1453,41, | 1453,42, | 1453,43, | 1453,44, | 1453,45, | 1453,46, | 1453,47, | 1453,48, | 1453,49, | 1453,50, | 1453,51, | 1453,52, | 1453,53, | 1453,54, | 1453,55, | 1453,56, | 1453,57, | 1453,58, | 1453,59, | 1453,60, | 1453,61, | 1453,62, | 1453,63, | 1453,64, | 1453,65, | 1453,66, | 1453,67, | 1453,68, | 1453,69, | 1453,70, | 1453,71, | 1453,72, | 1453,73, | 1453,74, | 1453,75, | 1453,76, | 1453,77, | 1453,78, | 1453,79, | 1453,80, | 1453,81, | 1453,82, | 1453,83, | 1453,84, | 1453,85, | 1454,1, | 1454,2, | 1454,3, | 1454,4, | 1454,5, | 1454,6, | 1454,7, | 1454,8, | 1454,9, | 1454,10, | 1454,11, | 1454,12, | 1454,13, | 1454,14, | 1454,15, | 1454,16, | 1454,17, | 1454,18, | 1454,19, | 1454,20, | 1454,21, | 1454,22, | 1454,23, | 1454,24, | 1454,25, | 1454,26, | 1454,27, | 1454,28, | 1454,29, | 1454,30, | 1454,31, | 1454,32, | 1454,33, | 1454,34, | 1454,35, | 1454,36, | 1454,37, | 1454,38, | 1454,39, | 1454,40, | 1454,41, | 1454,42, | 1454,43, | 1454,44, | 1454,45, | 1454,46, | 1454,47, | 1454,48, | 1454,49, | 1454,50, | 1454,51, | 1454,52, | 1454,53, | 1454,54, | 1454,55, | 1454,56, | 1454,57, | 1454,58, | 1454,59, | 1454,60, | 1454,61, | 1454,62, | 1454,63, | 1454,64, | 1454,65, | 1454,66, | 1454,67, | 1454,68, | 1454,69, | 1454,70, | 1454,71, | 1454,72, | 1454,73, | 1454,74, | 1454,75, | 1454,76, | 1454,77, | 1454,78, | 1454,79, | 1454,80, | 1454,81, | 1454,82, | 1454,83, | 1454,84, | 1454,85, | 1455,1, | 1455,2, | 1455,3, | 1455,4, | 1455,5, | 1455,6, | 1455,7, | 1455,8, | 1455,9, | 1455,10, | 1455,11, | 1455,12, | 1455,13, | 1455,14, | 1455,15, | 1455,16, | 1455,17, | 1455,18, | 1455,19, | 1455,20, | 1455,21, | 1455,22, | 1455,23, | 1455,24, | 1455,25, | 1455,26, | 1455,27, | 1455,28, | 1455,29, | 1455,30, | 1455,31, | 1455,32, | 1455,33, | 1455,34, | 1455,35, | 1455,36, | 1455,37, | 1455,38, | 1455,39, | 1455,40, | 1455,41, | 1455,42, | 1455,43, | 1455,44, | 1455,45, | 1455,46, | 1455,47, | 1455,48, | 1455,49, | 1455,50, | 1455,51, | 1455,52, | 1455,53, | 1455,54, | 1455,55, | 1455,56, | 1455,57, | 1455,58, | 1455,59, | 1455,60, | 1455,61, | 1455,62, | 1455,63, | 1455,64, | 1455,65, | 1455,66, | 1455,67, | 1455,68, | 1455,69, | 1455,70, | 1455,71, | 1455,72, | 1455,73, | 1455,74, | 1455,75, | 1455,76, | 1455,77, | 1455,78, | 1455,79, | 1455,80, | 1455,81, | 1455,82, | 1455,83, | 1455,84, | 1455,85, | 1456,1, | 1456,2, | 1456,3, | 1456,4, | 1456,5, | 1456,6, | 1456,7, | 1456,8, | 1456,9, | 1456,10, | 1456,11, | 1456,12, | 1456,13, | 1456,14, | 1456,15, | 1456,16, | 1456,17, | 1456,18, | 1456,19, | 1456,20, | 1456,21, | 1456,22, | 1456,23, | 1456,24, | 1456,25, | 1456,26, | 1456,27, | 1456,28, | 1456,29, | 1456,30, | 1456,31, | 1456,32, | 1456,33, | 1456,34, | 1456,35, | 1456,36, | 1456,37, | 1456,38, | 1456,39, | 1456,40, | 1456,41, | 1456,42, | 1456,43, | 1456,44, | 1456,45, | 1456,46, | 1456,47, | 1456,48, | 1456,49, | 1456,50, | 1456,51, | 1456,52, | 1456,53, | 1456,54, | 1456,55, | 1456,56, | 1456,57, | 1456,58, | 1456,59, | 1456,60, | 1456,61, | 1456,62, | 1456,63, | 1456,64, | 1456,65, | 1456,66, | 1456,67, | 1456,68, | 1456,69, | 1456,70, | 1456,71, | 1456,72, | 1456,73, | 1456,74, | 1456,75, | 1456,76, | 1456,77, | 1456,78, | 1456,79, | 1456,80, | 1456,81, | 1456,82, | 1456,83, | 1456,84, | 1456,85, | 1457,1, | 1457,2, | 1457,3, | 1457,4, | 1457,5, | 1457,6, | 1457,7, | 1457,8, | 1457,9, | 1457,10, | 1457,11, | 1457,12, | 1457,13, | 1457,14, | 1457,15, | 1457,16, | 1457,17, | 1457,18, | 1457,19, | 1457,20, | 1457,21, | 1457,22, | 1457,23, | 1457,24, | 1457,25, | 1457,26, | 1457,27, | 1457,28, | 1457,29, | 1457,30, | 1457,31, | 1457,32, | 1457,33, | 1457,34, | 1457,35, | 1457,36, | 1457,37, | 1457,38, | 1457,39, | 1457,40, | 1457,41, | 1457,42, | 1457,43, | 1457,44, | 1457,45, | 1457,46, | 1457,47, | 1457,48, | 1457,49, | 1457,50, | 1457,51, | 1457,52, | 1457,53, | 1457,54, | 1457,55, | 1457,56, | 1457,57, | 1457,58, | 1457,59, | 1457,60, | 1457,61, | 1457,62, | 1457,63, | 1457,64, | 1457,65, | 1457,66, | 1457,67, | 1457,68, | 1457,69, | 1457,70, | 1457,71, | 1457,72, | 1457,73, | 1457,74, | 1457,75, | 1457,76, | 1457,77, | 1457,78, | 1457,79, | 1457,80, | 1457,81, | 1457,82, | 1457,83, | 1457,84, | 1457,85, | 1458,1, | 1458,2, | 1458,3, | 1458,4, | 1458,5, | 1458,6, | 1458,7, | 1458,8, | 1458,9, | 1458,10, | 1458,11, | 1458,12, | 1458,13, | 1458,14, | 1458,15, | 1458,16, | 1458,17, | 1458,18, | 1458,19, | 1458,20, | 1458,21, | 1458,22, | 1458,23, | 1458,24, | 1458,25, | 1458,26, | 1458,27, | 1458,28, | 1458,29, | 1458,30, | 1458,31, | 1458,32, | 1458,33, | 1458,34, | 1458,35, | 1458,36, | 1458,37, | 1458,38, | 1458,39, | 1458,40, | 1458,41, | 1458,42, | 1458,43, | 1458,44, | 1458,45, | 1458,46, | 1458,47, | 1458,48, | 1458,49, | 1458,50, | 1458,51, | 1458,52, | 1458,53, | 1458,54, | 1458,55, | 1458,56, | 1458,57, | 1458,58, | 1458,59, | 1458,60, | 1458,61, | 1458,62, | 1458,63, | 1458,64, | 1458,65, | 1458,66, | 1458,67, | 1458,68, | 1458,69, | 1458,70, | 1458,71, | 1458,72, | 1458,73, | 1458,74, | 1458,75, | 1458,76, | 1458,77, | 1458,78, | 1458,79, | 1458,80, | 1458,81, | 1458,82, | 1458,83, | 1458,84, | 1458,85, | 1459,1, | 1459,2, | 1459,3, | 1459,4, | 1459,5, | 1459,6, | 1459,7, | 1459,8, | 1459,9, | 1459,10, | 1459,11, | 1459,12, | 1459,13, | 1459,14, | 1459,15, | 1459,16, | 1459,17, | 1459,18, | 1459,19, | 1459,20, | 1459,21, | 1459,22, | 1459,23, | 1459,24, | 1459,25, | 1459,26, | 1459,27, | 1459,28, | 1459,29, | 1459,30, | 1459,31, | 1459,32, | 1459,33, | 1459,34, | 1459,35, | 1459,36, | 1459,37, | 1459,38, | 1459,39, | 1459,40, | 1459,41, | 1459,42, | 1459,43, | 1459,44, | 1459,45, | 1459,46, | 1459,47, | 1459,48, | 1459,49, | 1459,50, | 1459,51, | 1459,52, | 1459,53, | 1459,54, | 1459,55, | 1459,56, | 1459,57, | 1459,58, | 1459,59, | 1459,60, | 1459,61, | 1459,62, | 1459,63, | 1459,64, | 1459,65, | 1459,66, | 1459,67, | 1459,68, | 1459,69, | 1459,70, | 1459,71, | 1459,72, | 1459,73, | 1459,74, | 1459,75, | 1459,76, | 1459,77, | 1459,78, | 1459,79, | 1459,80, | 1459,81, | 1459,82, | 1459,83, | 1459,84, | 1459,85, | 1460,1, | 1460,2, | 1460,3, | 1460,4, | 1460,5, | 1460,6, | 1460,7, | 1460,8, | 1460,9, | 1460,10, | 1460,11, | 1460,12, | 1460,13, | 1460,14, | 1460,15, | 1460,16, | 1460,17, | 1460,18, | 1460,19, | 1460,20, | 1460,21, | 1460,22, | 1460,23, | 1460,24, | 1460,25, | 1460,26, | 1460,27, | 1460,28, | 1460,29, | 1460,30, | 1460,31, | 1460,32, | 1460,33, | 1460,34, | 1460,35, | 1460,36, | 1460,37, | 1460,38, | 1460,39, | 1460,40, | 1460,41, | 1460,42, | 1460,43, | 1460,44, | 1460,45, | 1460,46, | 1460,47, | 1460,48, | 1460,49, | 1460,50, | 1460,51, | 1460,52, | 1460,53, | 1460,54, | 1460,55, | 1460,56, | 1460,57, | 1460,58, | 1460,59, | 1460,60, | 1460,61, | 1460,62, | 1460,63, | 1460,64, | 1460,65, | 1460,66, | 1460,67, | 1460,68, | 1460,69, | 1460,70, | 1460,71, | 1460,72, | 1460,73, | 1460,74, | 1460,75, | 1460,76, | 1460,77, | 1460,78, | 1460,79, | 1460,80, | 1460,81, | 1460,82, | 1460,83, | 1460,84, | 1460,85, | 1461,1, | 1461,2, | 1461,3, | 1461,4, | 1461,5, | 1461,6, | 1461,7, | 1461,8, | 1461,9, | 1461,10, | 1461,11, | 1461,12, | 1461,13, | 1461,14, | 1461,15, | 1461,16, | 1461,17, | 1461,18, | 1461,19, | 1461,20, | 1461,21, | 1461,22, | 1461,23, | 1461,24, | 1461,25, | 1461,26, | 1461,27, | 1461,28, | 1461,29, | 1461,30, | 1461,31, | 1461,32, | 1461,33, | 1461,34, | 1461,35, | 1461,36, | 1461,37, | 1461,38, | 1461,39, | 1461,40, | 1461,41, | 1461,42, | 1461,43, | 1461,44, | 1461,45, | 1461,46, | 1461,47, | 1461,48, | 1461,49, | 1461,50, | 1461,51, | 1461,52, | 1461,53, | 1461,54, | 1461,55, | 1461,56, | 1461,57, | 1461,58, | 1461,59, | 1461,60, | 1461,61, | 1461,62, | 1461,63, | 1461,64, | 1461,65, | 1461,66, | 1461,67, | 1461,68, | 1461,69, | 1461,70, | 1461,71, | 1461,72, | 1461,73, | 1461,74, | 1461,75, | 1461,76, | 1461,77, | 1461,78, | 1461,79, | 1461,80, | 1461,81, | 1461,82, | 1461,83, | 1461,84, | 1461,85, | 1462,1, | 1462,2, | 1462,3, | 1462,4, | 1462,5, | 1462,6, | 1462,7, | 1462,8, | 1462,9, | 1462,10, | 1462,11, | 1462,12, | 1462,13, | 1462,14, | 1462,15, | 1462,16, | 1462,17, | 1462,18, | 1462,19, | 1462,20, | 1462,21, | 1462,22, | 1462,23, | 1462,24, | 1462,25, | 1462,26, | 1462,27, | 1462,28, | 1462,29, | 1462,30, | 1462,31, | 1462,32, | 1462,33, | 1462,34, | 1462,35, | 1462,36, | 1462,37, | 1462,38, | 1462,39, | 1462,40, | 1462,41, | 1462,42, | 1462,43, | 1462,44, | 1462,45, | 1462,46, | 1462,47, | 1462,48, | 1462,49, | 1462,50, | 1462,51, | 1462,52, | 1462,53, | 1462,54, | 1462,55, | 1462,56, | 1462,57, | 1462,58, | 1462,59, | 1462,60, | 1462,61, | 1462,62, | 1462,63, | 1462,64, | 1462,65, | 1462,66, | 1462,67, | 1462,68, | 1462,69, | 1462,70, | 1462,71, | 1462,72, | 1462,73, | 1462,74, | 1462,75, | 1462,76, | 1462,77, | 1462,78, | 1462,79, | 1462,80, | 1462,81, | 1462,82, | 1462,83, | 1462,84, | 1462,85, | 1463,1, | 1463,2, | 1463,3, | 1463,4, | 1463,5, | 1463,6, | 1463,7, | 1463,8, | 1463,9, | 1463,10, | 1463,11, | 1463,12, | 1463,13, | 1463,14, | 1463,15, | 1463,16, | 1463,17, | 1463,18, | 1463,19, | 1463,20, | 1463,21, | 1463,22, | 1463,23, | 1463,24, | 1463,25, | 1463,26, | 1463,27, | 1463,28, | 1463,29, | 1463,30, | 1463,31, | 1463,32, | 1463,33, | 1463,34, | 1463,35, | 1463,36, | 1463,37, | 1463,38, | 1463,39, | 1463,40, | 1463,41, | 1463,42, | 1463,43, | 1463,44, | 1463,45, | 1463,46, | 1463,47, | 1463,48, | 1463,49, | 1463,50, | 1463,51, | 1463,52, | 1463,53, | 1463,54, | 1463,55, | 1463,56, | 1463,57, | 1463,58, | 1463,59, | 1463,60, | 1463,61, | 1463,62, | 1463,63, | 1463,64, | 1463,65, | 1463,66, | 1463,67, | 1463,68, | 1463,69, | 1463,70, | 1463,71, | 1463,72, | 1463,73, | 1463,74, | 1463,75, | 1463,76, | 1463,77, | 1463,78, | 1463,79, | 1463,80, | 1463,81, | 1463,82, | 1463,83, | 1463,84, | 1463,85, | 1464,1, | 1464,2, | 1464,3, | 1464,4, | 1464,5, | 1464,6, | 1464,7, | 1464,8, | 1464,9, | 1464,10, | 1464,11, | 1464,12, | 1464,13, | 1464,14, | 1464,15, | 1464,16, | 1464,17, | 1464,18, | 1464,19, | 1464,20, | 1464,21, | 1464,22, | 1464,23, | 1464,24, | 1464,25, | 1464,26, | 1464,27, | 1464,28, | 1464,29, | 1464,30, | 1464,31, | 1464,32, | 1464,33, | 1464,34, | 1464,35, | 1464,36, | 1464,37, | 1464,38, | 1464,39, | 1464,40, | 1464,41, | 1464,42, | 1464,43, | 1464,44, | 1464,45, | 1464,46, | 1464,47, | 1464,48, | 1464,49, | 1464,50, | 1464,51, | 1464,52, | 1464,53, | 1464,54, | 1464,55, | 1464,56, | 1464,57, | 1464,58, | 1464,59, | 1464,60, | 1464,61, | 1464,62, | 1464,63, | 1464,64, | 1464,65, | 1464,66, | 1464,67, | 1464,68, | 1464,69, | 1464,70, | 1464,71, | 1464,72, | 1464,73, | 1464,74, | 1464,75, | 1464,76, | 1464,77, | 1464,78, | 1464,79, | 1464,80, | 1464,81, | 1464,82, | 1464,83, | 1464,84, | 1464,85, | 1465,1, | 1465,2, | 1465,3, | 1465,4, | 1465,5, | 1465,6, | 1465,7, | 1465,8, | 1465,9, | 1465,10, | 1465,11, | 1465,12, | 1465,13, | 1465,14, | 1465,15, | 1465,16, | 1465,17, | 1465,18, | 1465,19, | 1465,20, | 1465,21, | 1465,22, | 1465,23, | 1465,24, | 1465,25, | 1465,26, | 1465,27, | 1465,28, | 1465,29, | 1465,30, | 1465,31, | 1465,32, | 1465,33, | 1465,34, | 1465,35, | 1465,36, | 1465,37, | 1465,38, | 1465,39, | 1465,40, | 1465,41, | 1465,42, | 1465,43, | 1465,44, | 1465,45, | 1465,46, | 1465,47, | 1465,48, | 1465,49, | 1465,50, | 1465,51, | 1465,52, | 1465,53, | 1465,54, | 1465,55, | 1465,56, | 1465,57, | 1465,58, | 1465,59, | 1465,60, | 1465,61, | 1465,62, | 1465,63, | 1465,64, | 1465,65, | 1465,66, | 1465,67, | 1465,68, | 1465,69, | 1465,70, | 1465,71, | 1465,72, | 1465,73, | 1465,74, | 1465,75, | 1465,76, | 1465,77, | 1465,78, | 1465,79, | 1465,80, | 1465,81, | 1465,82, | 1465,83, | 1465,84, | 1465,85, | 1466,1, | 1466,2, | 1466,3, | 1466,4, | 1466,5, | 1466,6, | 1466,7, | 1466,8, | 1466,9, | 1466,10, | 1466,11, | 1466,12, | 1466,13, | 1466,14, | 1466,15, | 1466,16, | 1466,17, | 1466,18, | 1466,19, | 1466,20, | 1466,21, | 1466,22, | 1466,23, | 1466,24, | 1466,25, | 1466,26, | 1466,27, | 1466,28, | 1466,29, | 1466,30, | 1466,31, | 1466,32, | 1466,33, | 1466,34, | 1466,35, | 1466,36, | 1466,37, | 1466,38, | 1466,39, | 1466,40, | 1466,41, | 1466,42, | 1466,43, | 1466,44, | 1466,45, | 1466,46, | 1466,47, | 1466,48, | 1466,49, | 1466,50, | 1466,51, | 1466,52, | 1466,53, | 1466,54, | 1466,55, | 1466,56, | 1466,57, | 1466,58, | 1466,59, | 1466,60, | 1466,61, | 1466,62, | 1466,63, | 1466,64, | 1466,65, | 1466,66, | 1466,67, | 1466,68, | 1466,69, | 1466,70, | 1466,71, | 1466,72, | 1466,73, | 1466,74, | 1466,75, | 1466,76, | 1466,77, | 1466,78, | 1466,79, | 1466,80, | 1466,81, | 1466,82, | 1466,83, | 1466,84, | 1466,85, | 1467,1, | 1467,2, | 1467,3, | 1467,4, | 1467,5, | 1467,6, | 1467,7, | 1467,8, | 1467,9, | 1467,10, | 1467,11, | 1467,12, | 1467,13, | 1467,14, | 1467,15, | 1467,16, | 1467,17, | 1467,18, | 1467,19, | 1467,20, | 1467,21, | 1467,22, | 1467,23, | 1467,24, | 1467,25, | 1467,26, | 1467,27, | 1467,28, | 1467,29, | 1467,30, | 1467,31, | 1467,32, | 1467,33, | 1467,34, | 1467,35, | 1467,36, | 1467,37, | 1467,38, | 1467,39, | 1467,40, | 1467,41, | 1467,42, | 1467,43, | 1467,44, | 1467,45, | 1467,46, | 1467,47, | 1467,48, | 1467,49, | 1467,50, | 1467,51, | 1467,52, | 1467,53, | 1467,54, | 1467,55, | 1467,56, | 1467,57, | 1467,58, | 1467,59, | 1467,60, | 1467,61, | 1467,62, | 1467,63, | 1467,64, | 1467,65, | 1467,66, | 1467,67, | 1467,68, | 1467,69, | 1467,70, | 1467,71, | 1467,72, | 1467,73, | 1467,74, | 1467,75, | 1467,76, | 1467,77, | 1467,78, | 1467,79, | 1467,80, | 1467,81, | 1467,82, | 1467,83, | 1467,84, | 1467,85, | 1468,1, | 1468,2, | 1468,3, | 1468,4, | 1468,5, | 1468,6, | 1468,7, | 1468,8, | 1468,9, | 1468,10, | 1468,11, | 1468,12, | 1468,13, | 1468,14, | 1468,15, | 1468,16, | 1468,17, | 1468,18, | 1468,19, | 1468,20, | 1468,21, | 1468,22, | 1468,23, | 1468,24, | 1468,25, | 1468,26, | 1468,27, | 1468,28, | 1468,29, | 1468,30, | 1468,31, | 1468,32, | 1468,33, | 1468,34, | 1468,35, | 1468,36, | 1468,37, | 1468,38, | 1468,39, | 1468,40, | 1468,41, | 1468,42, | 1468,43, | 1468,44, | 1468,45, | 1468,46, | 1468,47, | 1468,48, | 1468,49, | 1468,50, | 1468,51, | 1468,52, | 1468,53, | 1468,54, | 1468,55, | 1468,56, | 1468,57, | 1468,58, | 1468,59, | 1468,60, | 1468,61, | 1468,62, | 1468,63, | 1468,64, | 1468,65, | 1468,66, | 1468,67, | 1468,68, | 1468,69, | 1468,70, | 1468,71, | 1468,72, | 1468,73, | 1468,74, | 1468,75, | 1468,76, | 1468,77, | 1468,78, | 1468,79, | 1468,80, | 1468,81, | 1468,82, | 1468,83, | 1468,84, | 1468,85, | 1469,1, | 1469,2, | 1469,3, | 1469,4, | 1469,5, | 1469,6, | 1469,7, | 1469,8, | 1469,9, | 1469,10, | 1469,11, | 1469,12, | 1469,13, | 1469,14, | 1469,15, | 1469,16, | 1469,17, | 1469,18, | 1469,19, | 1469,20, | 1469,21, | 1469,22, | 1469,23, | 1469,24, | 1469,25, | 1469,26, | 1469,27, | 1469,28, | 1469,29, | 1469,30, | 1469,31, | 1469,32, | 1469,33, | 1469,34, | 1469,35, | 1469,36, | 1469,37, | 1469,38, | 1469,39, | 1469,40, | 1469,41, | 1469,42, | 1469,43, | 1469,44, | 1469,45, | 1469,46, | 1469,47, | 1469,48, | 1469,49, | 1469,50, | 1469,51, | 1469,52, | 1469,53, | 1469,54, | 1469,55, | 1469,56, | 1469,57, | 1469,58, | 1469,59, | 1469,60, | 1469,61, | 1469,62, | 1469,63, | 1469,64, | 1469,65, | 1469,66, | 1469,67, | 1469,68, | 1469,69, | 1469,70, | 1469,71, | 1469,72, | 1469,73, | 1469,74, | 1469,75, | 1469,76, | 1469,77, | 1469,78, | 1469,79, | 1469,80, | 1469,81, | 1469,82, | 1469,83, | 1469,84, | 1469,85, | 1470,1, | 1470,2, | 1470,3, | 1470,4, | 1470,5, | 1470,6, | 1470,7, | 1470,8, | 1470,9, | 1470,10, | 1470,11, | 1470,12, | 1470,13, | 1470,14, | 1470,15, | 1470,16, | 1470,17, | 1470,18, | 1470,19, | 1470,20, | 1470,21, | 1470,22, | 1470,23, | 1470,24, | 1470,25, | 1470,26, | 1470,27, | 1470,28, | 1470,29, | 1470,30, | 1470,31, | 1470,32, | 1470,33, | 1470,34, | 1470,35, | 1470,36, | 1470,37, | 1470,38, | 1470,39, | 1470,40, | 1470,41, | 1470,42, | 1470,43, | 1470,44, | 1470,45, | 1470,46, | 1470,47, | 1470,48, | 1470,49, | 1470,50, | 1470,51, | 1470,52, | 1470,53, | 1470,54, | 1470,55, | 1470,56, | 1470,57, | 1470,58, | 1470,59, | 1470,60, | 1470,61, | 1470,62, | 1470,63, | 1470,64, | 1470,65, | 1470,66, | 1470,67, | 1470,68, | 1470,69, | 1470,70, | 1470,71, | 1470,72, | 1470,73, | 1470,74, | 1470,75, | 1470,76, | 1470,77, | 1470,78, | 1470,79, | 1470,80, | 1470,81, | 1470,82, | 1470,83, | 1470,84, | 1470,85, | 1471,1, | 1471,2, | 1471,3, | 1471,4, | 1471,5, | 1471,6, | 1471,7, | 1471,8, | 1471,9, | 1471,10, | 1471,11, | 1471,12, | 1471,13, | 1471,14, | 1471,15, | 1471,16, | 1471,17, | 1471,18, | 1471,19, | 1471,20, | 1471,21, | 1471,22, | 1471,23, | 1471,24, | 1471,25, | 1471,26, | 1471,27, | 1471,28, | 1471,29, | 1471,30, | 1471,31, | 1471,32, | 1471,33, | 1471,34, | 1471,35, | 1471,36, | 1471,37, | 1471,38, | 1471,39, | 1471,40, | 1471,41, | 1471,42, | 1471,43, | 1471,44, | 1471,45, | 1471,46, | 1471,47, | 1471,48, | 1471,49, | 1471,50, | 1471,51, | 1471,52, | 1471,53, | 1471,54, | 1471,55, | 1471,56, | 1471,57, | 1471,58, | 1471,59, | 1471,60, | 1471,61, | 1471,62, | 1471,63, | 1471,64, | 1471,65, | 1471,66, | 1471,67, | 1471,68, | 1471,69, | 1471,70, | 1471,71, | 1471,72, | 1471,73, | 1471,74, | 1471,75, | 1471,76, | 1471,77, | 1471,78, | 1471,79, | 1471,80, | 1471,81, | 1471,82, | 1471,83, | 1471,84, | 1471,85, | 1472,1, | 1472,2, | 1472,3, | 1472,4, | 1472,5, | 1472,6, | 1472,7, | 1472,8, | 1472,9, | 1472,10, | 1472,11, | 1472,12, | 1472,13, | 1472,14, | 1472,15, | 1472,16, | 1472,17, | 1472,18, | 1472,19, | 1472,20, | 1472,21, | 1472,22, | 1472,23, | 1472,24, | 1472,25, | 1472,26, | 1472,27, | 1472,28, | 1472,29, | 1472,30, | 1472,31, | 1472,32, | 1472,33, | 1472,34, | 1472,35, | 1472,36, | 1472,37, | 1472,38, | 1472,39, | 1472,40, | 1472,41, | 1472,42, | 1472,43, | 1472,44, | 1472,45, | 1472,46, | 1472,47, | 1472,48, | 1472,49, | 1472,50, | 1472,51, | 1472,52, | 1472,53, | 1472,54, | 1472,55, | 1472,56, | 1472,57, | 1472,58, | 1472,59, | 1472,60, | 1472,61, | 1472,62, | 1472,63, | 1472,64, | 1472,65, | 1472,66, | 1472,67, | 1472,68, | 1472,69, | 1472,70, | 1472,71, | 1472,72, | 1472,73, | 1472,74, | 1472,75, | 1472,76, | 1472,77, | 1472,78, | 1472,79, | 1472,80, | 1472,81, | 1472,82, | 1472,83, | 1472,84, | 1472,85, | 1473,1, | 1473,2, | 1473,3, | 1473,4, | 1473,5, | 1473,6, | 1473,7, | 1473,8, | 1473,9, | 1473,10, | 1473,11, | 1473,12, | 1473,13, | 1473,14, | 1473,15, | 1473,16, | 1473,17, | 1473,18, | 1473,19, | 1473,20, | 1473,21, | 1473,22, | 1473,23, | 1473,24, | 1473,25, | 1473,26, | 1473,27, | 1473,28, | 1473,29, | 1473,30, | 1473,31, | 1473,32, | 1473,33, | 1473,34, | 1473,35, | 1473,36, | 1473,37, | 1473,38, | 1473,39, | 1473,40, | 1473,41, | 1473,42, | 1473,43, | 1473,44, | 1473,45, | 1473,46, | 1473,47, | 1473,48, | 1473,49, | 1473,50, | 1473,51, | 1473,52, | 1473,53, | 1473,54, | 1473,55, | 1473,56, | 1473,57, | 1473,58, | 1473,59, | 1473,60, | 1473,61, | 1473,62, | 1473,63, | 1473,64, | 1473,65, | 1473,66, | 1473,67, | 1473,68, | 1473,69, | 1473,70, | 1473,71, | 1473,72, | 1473,73, | 1473,74, | 1473,75, | 1473,76, | 1473,77, | 1473,78, | 1473,79, | 1473,80, | 1473,81, | 1473,82, | 1473,83, | 1473,84, | 1473,85, | 1474,1, | 1474,2, | 1474,3, | 1474,4, | 1474,5, | 1474,6, | 1474,7, | 1474,8, | 1474,9, | 1474,10, | 1474,11, | 1474,12, | 1474,13, | 1474,14, | 1474,15, | 1474,16, | 1474,17, | 1474,18, | 1474,19, | 1474,20, | 1474,21, | 1474,22, | 1474,23, | 1474,24, | 1474,25, | 1474,26, | 1474,27, | 1474,28, | 1474,29, | 1474,30, | 1474,31, | 1474,32, | 1474,33, | 1474,34, | 1474,35, | 1474,36, | 1474,37, | 1474,38, | 1474,39, | 1474,40, | 1474,41, | 1474,42, | 1474,43, | 1474,44, | 1474,45, | 1474,46, | 1474,47, | 1474,48, | 1474,49, | 1474,50, | 1474,51, | 1474,52, | 1474,53, | 1474,54, | 1474,55, | 1474,56, | 1474,57, | 1474,58, | 1474,59, | 1474,60, | 1474,61, | 1474,62, | 1474,63, | 1474,64, | 1474,65, | 1474,66, | 1474,67, | 1474,68, | 1474,69, | 1474,70, | 1474,71, | 1474,72, | 1474,73, | 1474,74, | 1474,75, | 1474,76, | 1474,77, | 1474,78, | 1474,79, | 1474,80, | 1474,81, | 1474,82, | 1474,83, | 1474,84, | 1474,85, | 1475,1, | 1475,2, | 1475,3, | 1475,4, | 1475,5, | 1475,6, | 1475,7, | 1475,8, | 1475,9, | 1475,10, | 1475,11, | 1475,12, | 1475,13, | 1475,14, | 1475,15, | 1475,16, | 1475,17, | 1475,18, | 1475,19, | 1475,20, | 1475,21, | 1475,22, | 1475,23, | 1475,24, | 1475,25, | 1475,26, | 1475,27, | 1475,28, | 1475,29, | 1475,30, | 1475,31, | 1475,32, | 1475,33, | 1475,34, | 1475,35, | 1475,36, | 1475,37, | 1475,38, | 1475,39, | 1475,40, | 1475,41, | 1475,42, | 1475,43, | 1475,44, | 1475,45, | 1475,46, | 1475,47, | 1475,48, | 1475,49, | 1475,50, | 1475,51, | 1475,52, | 1475,53, | 1475,54, | 1475,55, | 1475,56, | 1475,57, | 1475,58, | 1475,59, | 1475,60, | 1475,61, | 1475,62, | 1475,63, | 1475,64, | 1475,65, | 1475,66, | 1475,67, | 1475,68, | 1475,69, | 1475,70, | 1475,71, | 1475,72, | 1475,73, | 1475,74, | 1475,75, | 1475,76, | 1475,77, | 1475,78, | 1475,79, | 1475,80, | 1475,81, | 1475,82, | 1475,83, | 1475,84, | 1475,85, | 1476,1, | 1476,2, | 1476,3, | 1476,4, | 1476,5, | 1476,6, | 1476,7, | 1476,8, | 1476,9, | 1476,10, | 1476,11, | 1476,12, | 1476,13, | 1476,14, | 1476,15, | 1476,16, | 1476,17, | 1476,18, | 1476,19, | 1476,20, | 1476,21, | 1476,22, | 1476,23, | 1476,24, | 1476,25, | 1476,26, | 1476,27, | 1476,28, | 1476,29, | 1476,30, | 1476,31, | 1476,32, | 1476,33, | 1476,34, | 1476,35, | 1476,36, | 1476,37, | 1476,38, | 1476,39, | 1476,40, | 1476,41, | 1476,42, | 1476,43, | 1476,44, | 1476,45, | 1476,46, | 1476,47, | 1476,48, | 1476,49, | 1476,50, | 1476,51, | 1476,52, | 1476,53, | 1476,54, | 1476,55, | 1476,56, | 1476,57, | 1476,58, | 1476,59, | 1476,60, | 1476,61, | 1476,62, | 1476,63, | 1476,64, | 1476,65, | 1476,66, | 1476,67, | 1476,68, | 1476,69, | 1476,70, | 1476,71, | 1476,72, | 1476,73, | 1476,74, | 1476,75, | 1476,76, | 1476,77, | 1476,78, | 1476,79, | 1476,80, | 1476,81, | 1476,82, | 1476,83, | 1476,84, | 1476,85, | 1477,1, | 1477,2, | 1477,3, | 1477,4, | 1477,5, | 1477,6, | 1477,7, | 1477,8, | 1477,9, | 1477,10, | 1477,11, | 1477,12, | 1477,13, | 1477,14, | 1477,15, | 1477,16, | 1477,17, | 1477,18, | 1477,19, | 1477,20, | 1477,21, | 1477,22, | 1477,23, | 1477,24, | 1477,25, | 1477,26, | 1477,27, | 1477,28, | 1477,29, | 1477,30, | 1477,31, | 1477,32, | 1477,33, | 1477,34, | 1477,35, | 1477,36, | 1477,37, | 1477,38, | 1477,39, | 1477,40, | 1477,41, | 1477,42, | 1477,43, | 1477,44, | 1477,45, | 1477,46, | 1477,47, | 1477,48, | 1477,49, | 1477,50, | 1477,51, | 1477,52, | 1477,53, | 1477,54, | 1477,55, | 1477,56, | 1477,57, | 1477,58, | 1477,59, | 1477,60, | 1477,61, | 1477,62, | 1477,63, | 1477,64, | 1477,65, | 1477,66, | 1477,67, | 1477,68, | 1477,69, | 1477,70, | 1477,71, | 1477,72, | 1477,73, | 1477,74, | 1477,75, | 1477,76, | 1477,77, | 1477,78, | 1477,79, | 1477,80, | 1477,81, | 1477,82, | 1477,83, | 1477,84, | 1477,85, | 1478,1, | 1478,2, | 1478,3, | 1478,4, | 1478,5, | 1478,6, | 1478,7, | 1478,8, | 1478,9, | 1478,10, | 1478,11, | 1478,12, | 1478,13, | 1478,14, | 1478,15, | 1478,16, | 1478,17, | 1478,18, | 1478,19, | 1478,20, | 1478,21, | 1478,22, | 1478,23, | 1478,24, | 1478,25, | 1478,26, | 1478,27, | 1478,28, | 1478,29, | 1478,30, | 1478,31, | 1478,32, | 1478,33, | 1478,34, | 1478,35, | 1478,36, | 1478,37, | 1478,38, | 1478,39, | 1478,40, | 1478,41, | 1478,42, | 1478,43, | 1478,44, | 1478,45, | 1478,46, | 1478,47, | 1478,48, | 1478,49, | 1478,50, | 1478,51, | 1478,52, | 1478,53, | 1478,54, | 1478,55, | 1478,56, | 1478,57, | 1478,58, | 1478,59, | 1478,60, | 1478,61, | 1478,62, | 1478,63, | 1478,64, | 1478,65, | 1478,66, | 1478,67, | 1478,68, | 1478,69, | 1478,70, | 1478,71, | 1478,72, | 1478,73, | 1478,74, | 1478,75, | 1478,76, | 1478,77, | 1478,78, | 1478,79, | 1478,80, | 1478,81, | 1478,82, | 1478,83, | 1478,84, | 1478,85, | 1479,1, | 1479,2, | 1479,3, | 1479,4, | 1479,5, | 1479,6, | 1479,7, | 1479,8, | 1479,9, | 1479,10, | 1479,11, | 1479,12, | 1479,13, | 1479,14, | 1479,15, | 1479,16, | 1479,17, | 1479,18, | 1479,19, | 1479,20, | 1479,21, | 1479,22, | 1479,23, | 1479,24, | 1479,25, | 1479,26, | 1479,27, | 1479,28, | 1479,29, | 1479,30, | 1479,31, | 1479,32, | 1479,33, | 1479,34, | 1479,35, | 1479,36, | 1479,37, | 1479,38, | 1479,39, | 1479,40, | 1479,41, | 1479,42, | 1479,43, | 1479,44, | 1479,45, | 1479,46, | 1479,47, | 1479,48, | 1479,49, | 1479,50, | 1479,51, | 1479,52, | 1479,53, | 1479,54, | 1479,55, | 1479,56, | 1479,57, | 1479,58, | 1479,59, | 1479,60, | 1479,61, | 1479,62, | 1479,63, | 1479,64, | 1479,65, | 1479,66, | 1479,67, | 1479,68, | 1479,69, | 1479,70, | 1479,71, | 1479,72, | 1479,73, | 1479,74, | 1479,75, | 1479,76, | 1479,77, | 1479,78, | 1479,79, | 1479,80, | 1479,81, | 1479,82, | 1479,83, | 1479,84, | 1479,85, | 1480,1, | 1480,2, | 1480,3, | 1480,4, | 1480,5, | 1480,6, | 1480,7, | 1480,8, | 1480,9, | 1480,10, | 1480,11, | 1480,12, | 1480,13, | 1480,14, | 1480,15, | 1480,16, | 1480,17, | 1480,18, | 1480,19, | 1480,20, | 1480,21, | 1480,22, | 1480,23, | 1480,24, | 1480,25, | 1480,26, | 1480,27, | 1480,28, | 1480,29, | 1480,30, | 1480,31, | 1480,32, | 1480,33, | 1480,34, | 1480,35, | 1480,36, | 1480,37, | 1480,38, | 1480,39, | 1480,40, | 1480,41, | 1480,42, | 1480,43, | 1480,44, | 1480,45, | 1480,46, | 1480,47, | 1480,48, | 1480,49, | 1480,50, | 1480,51, | 1480,52, | 1480,53, | 1480,54, | 1480,55, | 1480,56, | 1480,57, | 1480,58, | 1480,59, | 1480,60, | 1480,61, | 1480,62, | 1480,63, | 1480,64, | 1480,65, | 1480,66, | 1480,67, | 1480,68, | 1480,69, | 1480,70, | 1480,71, | 1480,72, | 1480,73, | 1480,74, | 1480,75, | 1480,76, | 1480,77, | 1480,78, | 1480,79, | 1480,80, | 1480,81, | 1480,82, | 1480,83, | 1480,84, | 1480,85, | 1481,1, | 1481,2, | 1481,3, | 1481,4, | 1481,5, | 1481,6, | 1481,7, | 1481,8, | 1481,9, | 1481,10, | 1481,11, | 1481,12, | 1481,13, | 1481,14, | 1481,15, | 1481,16, | 1481,17, | 1481,18, | 1481,19, | 1481,20, | 1481,21, | 1481,22, | 1481,23, | 1481,24, | 1481,25, | 1481,26, | 1481,27, | 1481,28, | 1481,29, | 1481,30, | 1481,31, | 1481,32, | 1481,33, | 1481,34, | 1481,35, | 1481,36, | 1481,37, | 1481,38, | 1481,39, | 1481,40, | 1481,41, | 1481,42, | 1481,43, | 1481,44, | 1481,45, | 1481,46, | 1481,47, | 1481,48, | 1481,49, | 1481,50, | 1481,51, | 1481,52, | 1481,53, | 1481,54, | 1481,55, | 1481,56, | 1481,57, | 1481,58, | 1481,59, | 1481,60, | 1481,61, | 1481,62, | 1481,63, | 1481,64, | 1481,65, | 1481,66, | 1481,67, | 1481,68, | 1481,69, | 1481,70, | 1481,71, | 1481,72, | 1481,73, | 1481,74, | 1481,75, | 1481,76, | 1481,77, | 1481,78, | 1481,79, | 1481,80, | 1481,81, | 1481,82, | 1481,83, | 1481,84, | 1481,85, | 1482,1, | 1482,2, | 1482,3, | 1482,4, | 1482,5, | 1482,6, | 1482,7, | 1482,8, | 1482,9, | 1482,10, | 1482,11, | 1482,12, | 1482,13, | 1482,14, | 1482,15, | 1482,16, | 1482,17, | 1482,18, | 1482,19, | 1482,20, | 1482,21, | 1482,22, | 1482,23, | 1482,24, | 1482,25, | 1482,26, | 1482,27, | 1482,28, | 1482,29, | 1482,30, | 1482,31, | 1482,32, | 1482,33, | 1482,34, | 1482,35, | 1482,36, | 1482,37, | 1482,38, | 1482,39, | 1482,40, | 1482,41, | 1482,42, | 1482,43, | 1482,44, | 1482,45, | 1482,46, | 1482,47, | 1482,48, | 1482,49, | 1482,50, | 1482,51, | 1482,52, | 1482,53, | 1482,54, | 1482,55, | 1482,56, | 1482,57, | 1482,58, | 1482,59, | 1482,60, | 1482,61, | 1482,62, | 1482,63, | 1482,64, | 1482,65, | 1482,66, | 1482,67, | 1482,68, | 1482,69, | 1482,70, | 1482,71, | 1482,72, | 1482,73, | 1482,74, | 1482,75, | 1482,76, | 1482,77, | 1482,78, | 1482,79, | 1482,80, | 1482,81, | 1482,82, | 1482,83, | 1482,84, | 1482,85, | 1483,1, | 1483,2, | 1483,3, | 1483,4, | 1483,5, | 1483,6, | 1483,7, | 1483,8, | 1483,9, | 1483,10, | 1483,11, | 1483,12, | 1483,13, | 1483,14, | 1483,15, | 1483,16, | 1483,17, | 1483,18, | 1483,19, | 1483,20, | 1483,21, | 1483,22, | 1483,23, | 1483,24, | 1483,25, | 1483,26, | 1483,27, | 1483,28, | 1483,29, | 1483,30, | 1483,31, | 1483,32, | 1483,33, | 1483,34, | 1483,35, | 1483,36, | 1483,37, | 1483,38, | 1483,39, | 1483,40, | 1483,41, | 1483,42, | 1483,43, | 1483,44, | 1483,45, | 1483,46, | 1483,47, | 1483,48, | 1483,49, | 1483,50, | 1483,51, | 1483,52, | 1483,53, | 1483,54, | 1483,55, | 1483,56, | 1483,57, | 1483,58, | 1483,59, | 1483,60, | 1483,61, | 1483,62, | 1483,63, | 1483,64, | 1483,65, | 1483,66, | 1483,67, | 1483,68, | 1483,69, | 1483,70, | 1483,71, | 1483,72, | 1483,73, | 1483,74, | 1483,75, | 1483,76, | 1483,77, | 1483,78, | 1483,79, | 1483,80, | 1483,81, | 1483,82, | 1483,83, | 1483,84, | 1483,85, | 1484,1, | 1484,2, | 1484,3, | 1484,4, | 1484,5, | 1484,6, | 1484,7, | 1484,8, | 1484,9, | 1484,10, | 1484,11, | 1484,12, | 1484,13, | 1484,14, | 1484,15, | 1484,16, | 1484,17, | 1484,18, | 1484,19, | 1484,20, | 1484,21, | 1484,22, | 1484,23, | 1484,24, | 1484,25, | 1484,26, | 1484,27, | 1484,28, | 1484,29, | 1484,30, | 1484,31, | 1484,32, | 1484,33, | 1484,34, | 1484,35, | 1484,36, | 1484,37, | 1484,38, | 1484,39, | 1484,40, | 1484,41, | 1484,42, | 1484,43, | 1484,44, | 1484,45, | 1484,46, | 1484,47, | 1484,48, | 1484,49, | 1484,50, | 1484,51, | 1484,52, | 1484,53, | 1484,54, | 1484,55, | 1484,56, | 1484,57, | 1484,58, | 1484,59, | 1484,60, | 1484,61, | 1484,62, | 1484,63, | 1484,64, | 1484,65, | 1484,66, | 1484,67, | 1484,68, | 1484,69, | 1484,70, | 1484,71, | 1484,72, | 1484,73, | 1484,74, | 1484,75, | 1484,76, | 1484,77, | 1484,78, | 1484,79, | 1484,80, | 1484,81, | 1484,82, | 1484,83, | 1484,84, | 1484,85, | 1485,1, | 1485,2, | 1485,3, | 1485,4, | 1485,5, | 1485,6, | 1485,7, | 1485,8, | 1485,9, | 1485,10, | 1485,11, | 1485,12, | 1485,13, | 1485,14, | 1485,15, | 1485,16, | 1485,17, | 1485,18, | 1485,19, | 1485,20, | 1485,21, | 1485,22, | 1485,23, | 1485,24, | 1485,25, | 1485,26, | 1485,27, | 1485,28, | 1485,29, | 1485,30, | 1485,31, | 1485,32, | 1485,33, | 1485,34, | 1485,35, | 1485,36, | 1485,37, | 1485,38, | 1485,39, | 1485,40, | 1485,41, | 1485,42, | 1485,43, | 1485,44, | 1485,45, | 1485,46, | 1485,47, | 1485,48, | 1485,49, | 1485,50, | 1485,51, | 1485,52, | 1485,53, | 1485,54, | 1485,55, | 1485,56, | 1485,57, | 1485,58, | 1485,59, | 1485,60, | 1485,61, | 1485,62, | 1485,63, | 1485,64, | 1485,65, | 1485,66, | 1485,67, | 1485,68, | 1485,69, | 1485,70, | 1485,71, | 1485,72, | 1485,73, | 1485,74, | 1485,75, | 1485,76, | 1485,77, | 1485,78, | 1485,79, | 1485,80, | 1485,81, | 1485,82, | 1485,83, | 1485,84, | 1485,85, | 1486,1, | 1486,2, | 1486,3, | 1486,4, | 1486,5, | 1486,6, | 1486,7, | 1486,8, | 1486,9, | 1486,10, | 1486,11, | 1486,12, | 1486,13, | 1486,14, | 1486,15, | 1486,16, | 1486,17, | 1486,18, | 1486,19, | 1486,20, | 1486,21, | 1486,22, | 1486,23, | 1486,24, | 1486,25, | 1486,26, | 1486,27, | 1486,28, | 1486,29, | 1486,30, | 1486,31, | 1486,32, | 1486,33, | 1486,34, | 1486,35, | 1486,36, | 1486,37, | 1486,38, | 1486,39, | 1486,40, | 1486,41, | 1486,42, | 1486,43, | 1486,44, | 1486,45, | 1486,46, | 1486,47, | 1486,48, | 1486,49, | 1486,50, | 1486,51, | 1486,52, | 1486,53, | 1486,54, | 1486,55, | 1486,56, | 1486,57, | 1486,58, | 1486,59, | 1486,60, | 1486,61, | 1486,62, | 1486,63, | 1486,64, | 1486,65, | 1486,66, | 1486,67, | 1486,68, | 1486,69, | 1486,70, | 1486,71, | 1486,72, | 1486,73, | 1486,74, | 1486,75, | 1486,76, | 1486,77, | 1486,78, | 1486,79, | 1486,80, | 1486,81, | 1486,82, | 1486,83, | 1486,84, | 1486,85, | 1487,1, | 1487,2, | 1487,3, | 1487,4, | 1487,5, | 1487,6, | 1487,7, | 1487,8, | 1487,9, | 1487,10, | 1487,11, | 1487,12, | 1487,13, | 1487,14, | 1487,15, | 1487,16, | 1487,17, | 1487,18, | 1487,19, | 1487,20, | 1487,21, | 1487,22, | 1487,23, | 1487,24, | 1487,25, | 1487,26, | 1487,27, | 1487,28, | 1487,29, | 1487,30, | 1487,31, | 1487,32, | 1487,33, | 1487,34, | 1487,35, | 1487,36, | 1487,37, | 1487,38, | 1487,39, | 1487,40, | 1487,41, | 1487,42, | 1487,43, | 1487,44, | 1487,45, | 1487,46, | 1487,47, | 1487,48, | 1487,49, | 1487,50, | 1487,51, | 1487,52, | 1487,53, | 1487,54, | 1487,55, | 1487,56, | 1487,57, | 1487,58, | 1487,59, | 1487,60, | 1487,61, | 1487,62, | 1487,63, | 1487,64, | 1487,65, | 1487,66, | 1487,67, | 1487,68, | 1487,69, | 1487,70, | 1487,71, | 1487,72, | 1487,73, | 1487,74, | 1487,75, | 1487,76, | 1487,77, | 1487,78, | 1487,79, | 1487,80, | 1487,81, | 1487,82, | 1487,83, | 1487,84, | 1487,85, | 1488,1, | 1488,2, | 1488,3, | 1488,4, | 1488,5, | 1488,6, | 1488,7, | 1488,8, | 1488,9, | 1488,10, | 1488,11, | 1488,12, | 1488,13, | 1488,14, | 1488,15, | 1488,16, | 1488,17, | 1488,18, | 1488,19, | 1488,20, | 1488,21, | 1488,22, | 1488,23, | 1488,24, | 1488,25, | 1488,26, | 1488,27, | 1488,28, | 1488,29, | 1488,30, | 1488,31, | 1488,32, | 1488,33, | 1488,34, | 1488,35, | 1488,36, | 1488,37, | 1488,38, | 1488,39, | 1488,40, | 1488,41, | 1488,42, | 1488,43, | 1488,44, | 1488,45, | 1488,46, | 1488,47, | 1488,48, | 1488,49, | 1488,50, | 1488,51, | 1488,52, | 1488,53, | 1488,54, | 1488,55, | 1488,56, | 1488,57, | 1488,58, | 1488,59, | 1488,60, | 1488,61, | 1488,62, | 1488,63, | 1488,64, | 1488,65, | 1488,66, | 1488,67, | 1488,68, | 1488,69, | 1488,70, | 1488,71, | 1488,72, | 1488,73, | 1488,74, | 1488,75, | 1488,76, | 1488,77, | 1488,78, | 1488,79, | 1488,80, | 1488,81, | 1488,82, | 1488,83, | 1488,84, | 1488,85, | 1489,1, | 1489,2, | 1489,3, | 1489,4, | 1489,5, | 1489,6, | 1489,7, | 1489,8, | 1489,9, | 1489,10, | 1489,11, | 1489,12, | 1489,13, | 1489,14, | 1489,15, | 1489,16, | 1489,17, | 1489,18, | 1489,19, | 1489,20, | 1489,21, | 1489,22, | 1489,23, | 1489,24, | 1489,25, | 1489,26, | 1489,27, | 1489,28, | 1489,29, | 1489,30, | 1489,31, | 1489,32, | 1489,33, | 1489,34, | 1489,35, | 1489,36, | 1489,37, | 1489,38, | 1489,39, | 1489,40, | 1489,41, | 1489,42, | 1489,43, | 1489,44, | 1489,45, | 1489,46, | 1489,47, | 1489,48, | 1489,49, | 1489,50, | 1489,51, | 1489,52, | 1489,53, | 1489,54, | 1489,55, | 1489,56, | 1489,57, | 1489,58, | 1489,59, | 1489,60, | 1489,61, | 1489,62, | 1489,63, | 1489,64, | 1489,65, | 1489,66, | 1489,67, | 1489,68, | 1489,69, | 1489,70, | 1489,71, | 1489,72, | 1489,73, | 1489,74, | 1489,75, | 1489,76, | 1489,77, | 1489,78, | 1489,79, | 1489,80, | 1489,81, | 1489,82, | 1489,83, | 1489,84, | 1489,85, | 1490,1, | 1490,2, | 1490,3, | 1490,4, | 1490,5, | 1490,6, | 1490,7, | 1490,8, | 1490,9, | 1490,10, | 1490,11, | 1490,12, | 1490,13, | 1490,14, | 1490,15, | 1490,16, | 1490,17, | 1490,18, | 1490,19, | 1490,20, | 1490,21, | 1490,22, | 1490,23, | 1490,24, | 1490,25, | 1490,26, | 1490,27, | 1490,28, | 1490,29, | 1490,30, | 1490,31, | 1490,32, | 1490,33, | 1490,34, | 1490,35, | 1490,36, | 1490,37, | 1490,38, | 1490,39, | 1490,40, | 1490,41, | 1490,42, | 1490,43, | 1490,44, | 1490,45, | 1490,46, | 1490,47, | 1490,48, | 1490,49, | 1490,50, | 1490,51, | 1490,52, | 1490,53, | 1490,54, | 1490,55, | 1490,56, | 1490,57, | 1490,58, | 1490,59, | 1490,60, | 1490,61, | 1490,62, | 1490,63, | 1490,64, | 1490,65, | 1490,66, | 1490,67, | 1490,68, | 1490,69, | 1490,70, | 1490,71, | 1490,72, | 1490,73, | 1490,74, | 1490,75, | 1490,76, | 1490,77, | 1490,78, | 1490,79, | 1490,80, | 1490,81, | 1490,82, | 1490,83, | 1490,84, | 1490,85, | 1491,1, | 1491,2, | 1491,3, | 1491,4, | 1491,5, | 1491,6, | 1491,7, | 1491,8, | 1491,9, | 1491,10, | 1491,11, | 1491,12, | 1491,13, | 1491,14, | 1491,15, | 1491,16, | 1491,17, | 1491,18, | 1491,19, | 1491,20, | 1491,21, | 1491,22, | 1491,23, | 1491,24, | 1491,25, | 1491,26, | 1491,27, | 1491,28, | 1491,29, | 1491,30, | 1491,31, | 1491,32, | 1491,33, | 1491,34, | 1491,35, | 1491,36, | 1491,37, | 1491,38, | 1491,39, | 1491,40, | 1491,41, | 1491,42, | 1491,43, | 1491,44, | 1491,45, | 1491,46, | 1491,47, | 1491,48, | 1491,49, | 1491,50, | 1491,51, | 1491,52, | 1491,53, | 1491,54, | 1491,55, | 1491,56, | 1491,57, | 1491,58, | 1491,59, | 1491,60, | 1491,61, | 1491,62, | 1491,63, | 1491,64, | 1491,65, | 1491,66, | 1491,67, | 1491,68, | 1491,69, | 1491,70, | 1491,71, | 1491,72, | 1491,73, | 1491,74, | 1491,75, | 1491,76, | 1491,77, | 1491,78, | 1491,79, | 1491,80, | 1491,81, | 1491,82, | 1491,83, | 1491,84, | 1491,85, | 1492,1, | 1492,2, | 1492,3, | 1492,4, | 1492,5, | 1492,6, | 1492,7, | 1492,8, | 1492,9, | 1492,10, | 1492,11, | 1492,12, | 1492,13, | 1492,14, | 1492,15, | 1492,16, | 1492,17, | 1492,18, | 1492,19, | 1492,20, | 1492,21, | 1492,22, | 1492,23, | 1492,24, | 1492,25, | 1492,26, | 1492,27, | 1492,28, | 1492,29, | 1492,30, | 1492,31, | 1492,32, | 1492,33, | 1492,34, | 1492,35, | 1492,36, | 1492,37, | 1492,38, | 1492,39, | 1492,40, | 1492,41, | 1492,42, | 1492,43, | 1492,44, | 1492,45, | 1492,46, | 1492,47, | 1492,48, | 1492,49, | 1492,50, | 1492,51, | 1492,52, | 1492,53, | 1492,54, | 1492,55, | 1492,56, | 1492,57, | 1492,58, | 1492,59, | 1492,60, | 1492,61, | 1492,62, | 1492,63, | 1492,64, | 1492,65, | 1492,66, | 1492,67, | 1492,68, | 1492,69, | 1492,70, | 1492,71, | 1492,72, | 1492,73, | 1492,74, | 1492,75, | 1492,76, | 1492,77, | 1492,78, | 1492,79, | 1492,80, | 1492,81, | 1492,82, | 1492,83, | 1492,84, | 1492,85, | 1493,1, | 1493,2, | 1493,3, | 1493,4, | 1493,5, | 1493,6, | 1493,7, | 1493,8, | 1493,9, | 1493,10, | 1493,11, | 1493,12, | 1493,13, | 1493,14, | 1493,15, | 1493,16, | 1493,17, | 1493,18, | 1493,19, | 1493,20, | 1493,21, | 1493,22, | 1493,23, | 1493,24, | 1493,25, | 1493,26, | 1493,27, | 1493,28, | 1493,29, | 1493,30, | 1493,31, | 1493,32, | 1493,33, | 1493,34, | 1493,35, | 1493,36, | 1493,37, | 1493,38, | 1493,39, | 1493,40, | 1493,41, | 1493,42, | 1493,43, | 1493,44, | 1493,45, | 1493,46, | 1493,47, | 1493,48, | 1493,49, | 1493,50, | 1493,51, | 1493,52, | 1493,53, | 1493,54, | 1493,55, | 1493,56, | 1493,57, | 1493,58, | 1493,59, | 1493,60, | 1493,61, | 1493,62, | 1493,63, | 1493,64, | 1493,65, | 1493,66, | 1493,67, | 1493,68, | 1493,69, | 1493,70, | 1493,71, | 1493,72, | 1493,73, | 1493,74, | 1493,75, | 1493,76, | 1493,77, | 1493,78, | 1493,79, | 1493,80, | 1493,81, | 1493,82, | 1493,83, | 1493,84, | 1493,85, | 1494,1, | 1494,2, | 1494,3, | 1494,4, | 1494,5, | 1494,6, | 1494,7, | 1494,8, | 1494,9, | 1494,10, | 1494,11, | 1494,12, | 1494,13, | 1494,14, | 1494,15, | 1494,16, | 1494,17, | 1494,18, | 1494,19, | 1494,20, | 1494,21, | 1494,22, | 1494,23, | 1494,24, | 1494,25, | 1494,26, | 1494,27, | 1494,28, | 1494,29, | 1494,30, | 1494,31, | 1494,32, | 1494,33, | 1494,34, | 1494,35, | 1494,36, | 1494,37, | 1494,38, | 1494,39, | 1494,40, | 1494,41, | 1494,42, | 1494,43, | 1494,44, | 1494,45, | 1494,46, | 1494,47, | 1494,48, | 1494,49, | 1494,50, | 1494,51, | 1494,52, | 1494,53, | 1494,54, | 1494,55, | 1494,56, | 1494,57, | 1494,58, | 1494,59, | 1494,60, | 1494,61, | 1494,62, | 1494,63, | 1494,64, | 1494,65, | 1494,66, | 1494,67, | 1494,68, | 1494,69, | 1494,70, | 1494,71, | 1494,72, | 1494,73, | 1494,74, | 1494,75, | 1494,76, | 1494,77, | 1494,78, | 1494,79, | 1494,80, | 1494,81, | 1494,82, | 1494,83, | 1494,84, | 1494,85, | 1495,1, | 1495,2, | 1495,3, | 1495,4, | 1495,5, | 1495,6, | 1495,7, | 1495,8, | 1495,9, | 1495,10, | 1495,11, | 1495,12, | 1495,13, | 1495,14, | 1495,15, | 1495,16, | 1495,17, | 1495,18, | 1495,19, | 1495,20, | 1495,21, | 1495,22, | 1495,23, | 1495,24, | 1495,25, | 1495,26, | 1495,27, | 1495,28, | 1495,29, | 1495,30, | 1495,31, | 1495,32, | 1495,33, | 1495,34, | 1495,35, | 1495,36, | 1495,37, | 1495,38, | 1495,39, | 1495,40, | 1495,41, | 1495,42, | 1495,43, | 1495,44, | 1495,45, | 1495,46, | 1495,47, | 1495,48, | 1495,49, | 1495,50, | 1495,51, | 1495,52, | 1495,53, | 1495,54, | 1495,55, | 1495,56, | 1495,57, | 1495,58, | 1495,59, | 1495,60, | 1495,61, | 1495,62, | 1495,63, | 1495,64, | 1495,65, | 1495,66, | 1495,67, | 1495,68, | 1495,69, | 1495,70, | 1495,71, | 1495,72, | 1495,73, | 1495,74, | 1495,75, | 1495,76, | 1495,77, | 1495,78, | 1495,79, | 1495,80, | 1495,81, | 1495,82, | 1495,83, | 1495,84, | 1495,85, | 1496,1, | 1496,2, | 1496,3, | 1496,4, | 1496,5, | 1496,6, | 1496,7, | 1496,8, | 1496,9, | 1496,10, | 1496,11, | 1496,12, | 1496,13, | 1496,14, | 1496,15, | 1496,16, | 1496,17, | 1496,18, | 1496,19, | 1496,20, | 1496,21, | 1496,22, | 1496,23, | 1496,24, | 1496,25, | 1496,26, | 1496,27, | 1496,28, | 1496,29, | 1496,30, | 1496,31, | 1496,32, | 1496,33, | 1496,34, | 1496,35, | 1496,36, | 1496,37, | 1496,38, | 1496,39, | 1496,40, | 1496,41, | 1496,42, | 1496,43, | 1496,44, | 1496,45, | 1496,46, | 1496,47, | 1496,48, | 1496,49, | 1496,50, | 1496,51, | 1496,52, | 1496,53, | 1496,54, | 1496,55, | 1496,56, | 1496,57, | 1496,58, | 1496,59, | 1496,60, | 1496,61, | 1496,62, | 1496,63, | 1496,64, | 1496,65, | 1496,66, | 1496,67, | 1496,68, | 1496,69, | 1496,70, | 1496,71, | 1496,72, | 1496,73, | 1496,74, | 1496,75, | 1496,76, | 1496,77, | 1496,78, | 1496,79, | 1496,80, | 1496,81, | 1496,82, | 1496,83, | 1496,84, | 1496,85, | 1497,1, | 1497,2, | 1497,3, | 1497,4, | 1497,5, | 1497,6, | 1497,7, | 1497,8, | 1497,9, | 1497,10, | 1497,11, | 1497,12, | 1497,13, | 1497,14, | 1497,15, | 1497,16, | 1497,17, | 1497,18, | 1497,19, | 1497,20, | 1497,21, | 1497,22, | 1497,23, | 1497,24, | 1497,25, | 1497,26, | 1497,27, | 1497,28, | 1497,29, | 1497,30, | 1497,31, | 1497,32, | 1497,33, | 1497,34, | 1497,35, | 1497,36, | 1497,37, | 1497,38, | 1497,39, | 1497,40, | 1497,41, | 1497,42, | 1497,43, | 1497,44, | 1497,45, | 1497,46, | 1497,47, | 1497,48, | 1497,49, | 1497,50, | 1497,51, | 1497,52, | 1497,53, | 1497,54, | 1497,55, | 1497,56, | 1497,57, | 1497,58, | 1497,59, | 1497,60, | 1497,61, | 1497,62, | 1497,63, | 1497,64, | 1497,65, | 1497,66, | 1497,67, | 1497,68, | 1497,69, | 1497,70, | 1497,71, | 1497,72, | 1497,73, | 1497,74, | 1497,75, | 1497,76, | 1497,77, | 1497,78, | 1497,79, | 1497,80, | 1497,81, | 1497,82, | 1497,83, | 1497,84, | 1497,85, | 1498,1, | 1498,2, | 1498,3, | 1498,4, | 1498,5, | 1498,6, | 1498,7, | 1498,8, | 1498,9, | 1498,10, | 1498,11, | 1498,12, | 1498,13, | 1498,14, | 1498,15, | 1498,16, | 1498,17, | 1498,18, | 1498,19, | 1498,20, | 1498,21, | 1498,22, | 1498,23, | 1498,24, | 1498,25, | 1498,26, | 1498,27, | 1498,28, | 1498,29, | 1498,30, | 1498,31, | 1498,32, | 1498,33, | 1498,34, | 1498,35, | 1498,36, | 1498,37, | 1498,38, | 1498,39, | 1498,40, | 1498,41, | 1498,42, | 1498,43, | 1498,44, | 1498,45, | 1498,46, | 1498,47, | 1498,48, | 1498,49, | 1498,50, | 1498,51, | 1498,52, | 1498,53, | 1498,54, | 1498,55, | 1498,56, | 1498,57, | 1498,58, | 1498,59, | 1498,60, | 1498,61, | 1498,62, | 1498,63, | 1498,64, | 1498,65, | 1498,66, | 1498,67, | 1498,68, | 1498,69, | 1498,70, | 1498,71, | 1498,72, | 1498,73, | 1498,74, | 1498,75, | 1498,76, | 1498,77, | 1498,78, | 1498,79, | 1498,80, | 1498,81, | 1498,82, | 1498,83, | 1498,84, | 1498,85, | 1499,1, | 1499,2, | 1499,3, | 1499,4, | 1499,5, | 1499,6, | 1499,7, | 1499,8, | 1499,9, | 1499,10, | 1499,11, | 1499,12, | 1499,13, | 1499,14, | 1499,15, | 1499,16, | 1499,17, | 1499,18, | 1499,19, | 1499,20, | 1499,21, | 1499,22, | 1499,23, | 1499,24, | 1499,25, | 1499,26, | 1499,27, | 1499,28, | 1499,29, | 1499,30, | 1499,31, | 1499,32, | 1499,33, | 1499,34, | 1499,35, | 1499,36, | 1499,37, | 1499,38, | 1499,39, | 1499,40, | 1499,41, | 1499,42, | 1499,43, | 1499,44, | 1499,45, | 1499,46, | 1499,47, | 1499,48, | 1499,49, | 1499,50, | 1499,51, | 1499,52, | 1499,53, | 1499,54, | 1499,55, | 1499,56, | 1499,57, | 1499,58, | 1499,59, | 1499,60, | 1499,61, | 1499,62, | 1499,63, | 1499,64, | 1499,65, | 1499,66, | 1499,67, | 1499,68, | 1499,69, | 1499,70, | 1499,71, | 1499,72, | 1499,73, | 1499,74, | 1499,75, | 1499,76, | 1499,77, | 1499,78, | 1499,79, | 1499,80, | 1499,81, | 1499,82, | 1499,83, | 1499,84, | 1499,85, | 1500,1, | 1500,2, | 1500,3, | 1500,4, | 1500,5, | 1500,6, | 1500,7, | 1500,8, | 1500,9, | 1500,10, | 1500,11, | 1500,12, | 1500,13, | 1500,14, | 1500,15, | 1500,16, | 1500,17, | 1500,18, | 1500,19, | 1500,20, | 1500,21, | 1500,22, | 1500,23, | 1500,24, | 1500,25, | 1500,26, | 1500,27, | 1500,28, | 1500,29, | 1500,30, | 1500,31, | 1500,32, | 1500,33, | 1500,34, | 1500,35, | 1500,36, | 1500,37, | 1500,38, | 1500,39, | 1500,40, | 1500,41, | 1500,42, | 1500,43, | 1500,44, | 1500,45, | 1500,46, | 1500,47, | 1500,48, | 1500,49, | 1500,50, | 1500,51, | 1500,52, | 1500,53, | 1500,54, | 1500,55, | 1500,56, | 1500,57, | 1500,58, | 1500,59, | 1500,60, | 1500,61, | 1500,62, | 1500,63, | 1500,64, | 1500,65, | 1500,66, | 1500,67, | 1500,68, | 1500,69, | 1500,70, | 1500,71, | 1500,72, | 1500,73, | 1500,74, | 1500,75, | 1500,76, | 1500,77, | 1500,78, | 1500,79, | 1500,80, | 1500,81, | 1500,82, | 1500,83, | 1500,84, | 1500,85, | 1501,1, | 1501,2, | 1501,3, | 1501,4, | 1501,5, | 1501,6, | 1501,7, | 1501,8, | 1501,9, | 1501,10, | 1501,11, | 1501,12, | 1501,13, | 1501,14, | 1501,15, | 1501,16, | 1501,17, | 1501,18, | 1501,19, | 1501,20, | 1501,21, | 1501,22, | 1501,23, | 1501,24, | 1501,25, | 1501,26, | 1501,27, | 1501,28, | 1501,29, | 1501,30, | 1501,31, | 1501,32, | 1501,33, | 1501,34, | 1501,35, | 1501,36, | 1501,37, | 1501,38, | 1501,39, | 1501,40, | 1501,41, | 1501,42, | 1501,43, | 1501,44, | 1501,45, | 1501,46, | 1501,47, | 1501,48, | 1501,49, | 1501,50, | 1501,51, | 1501,52, | 1501,53, | 1501,54, | 1501,55, | 1501,56, | 1501,57, | 1501,58, | 1501,59, | 1501,60, | 1501,61, | 1501,62, | 1501,63, | 1501,64, | 1501,65, | 1501,66, | 1501,67, | 1501,68, | 1501,69, | 1501,70, | 1501,71, | 1501,72, | 1501,73, | 1501,74, | 1501,75, | 1501,76, | 1501,77, | 1501,78, | 1501,79, | 1501,80, | 1501,81, | 1501,82, | 1501,83, | 1501,84, | 1501,85, | 1502,1, | 1502,2, | 1502,3, | 1502,4, | 1502,5, | 1502,6, | 1502,7, | 1502,8, | 1502,9, | 1502,10, | 1502,11, | 1502,12, | 1502,13, | 1502,14, | 1502,15, | 1502,16, | 1502,17, | 1502,18, | 1502,19, | 1502,20, | 1502,21, | 1502,22, | 1502,23, | 1502,24, | 1502,25, | 1502,26, | 1502,27, | 1502,28, | 1502,29, | 1502,30, | 1502,31, | 1502,32, | 1502,33, | 1502,34, | 1502,35, | 1502,36, | 1502,37, | 1502,38, | 1502,39, | 1502,40, | 1502,41, | 1502,42, | 1502,43, | 1502,44, | 1502,45, | 1502,46, | 1502,47, | 1502,48, | 1502,49, | 1502,50, | 1502,51, | 1502,52, | 1502,53, | 1502,54, | 1502,55, | 1502,56, | 1502,57, | 1502,58, | 1502,59, | 1502,60, | 1502,61, | 1502,62, | 1502,63, | 1502,64, | 1502,65, | 1502,66, | 1502,67, | 1502,68, | 1502,69, | 1502,70, | 1502,71, | 1502,72, | 1502,73, | 1502,74, | 1502,75, | 1502,76, | 1502,77, | 1502,78, | 1502,79, | 1502,80, | 1502,81, | 1502,82, | 1502,83, | 1502,84, | 1502,85, | 1503,1, | 1503,2, | 1503,3, | 1503,4, | 1503,5, | 1503,6, | 1503,7, | 1503,8, | 1503,9, | 1503,10, | 1503,11, | 1503,12, | 1503,13, | 1503,14, | 1503,15, | 1503,16, | 1503,17, | 1503,18, | 1503,19, | 1503,20, | 1503,21, | 1503,22, | 1503,23, | 1503,24, | 1503,25, | 1503,26, | 1503,27, | 1503,28, | 1503,29, | 1503,30, | 1503,31, | 1503,32, | 1503,33, | 1503,34, | 1503,35, | 1503,36, | 1503,37, | 1503,38, | 1503,39, | 1503,40, | 1503,41, | 1503,42, | 1503,43, | 1503,44, | 1503,45, | 1503,46, | 1503,47, | 1503,48, | 1503,49, | 1503,50, | 1503,51, | 1503,52, | 1503,53, | 1503,54, | 1503,55, | 1503,56, | 1503,57, | 1503,58, | 1503,59, | 1503,60, | 1503,61, | 1503,62, | 1503,63, | 1503,64, | 1503,65, | 1503,66, | 1503,67, | 1503,68, | 1503,69, | 1503,70, | 1503,71, | 1503,72, | 1503,73, | 1503,74, | 1503,75, | 1503,76, | 1503,77, | 1503,78, | 1503,79, | 1503,80, | 1503,81, | 1503,82, | 1503,83, | 1503,84, | 1503,85, | 1504,1, | 1504,2, | 1504,3, | 1504,4, | 1504,5, | 1504,6, | 1504,7, | 1504,8, | 1504,9, | 1504,10, | 1504,11, | 1504,12, | 1504,13, | 1504,14, | 1504,15, | 1504,16, | 1504,17, | 1504,18, | 1504,19, | 1504,20, | 1504,21, | 1504,22, | 1504,23, | 1504,24, | 1504,25, | 1504,26, | 1504,27, | 1504,28, | 1504,29, | 1504,30, | 1504,31, | 1504,32, | 1504,33, | 1504,34, | 1504,35, | 1504,36, | 1504,37, | 1504,38, | 1504,39, | 1504,40, | 1504,41, | 1504,42, | 1504,43, | 1504,44, | 1504,45, | 1504,46, | 1504,47, | 1504,48, | 1504,49, | 1504,50, | 1504,51, | 1504,52, | 1504,53, | 1504,54, | 1504,55, | 1504,56, | 1504,57, | 1504,58, | 1504,59, | 1504,60, | 1504,61, | 1504,62, | 1504,63, | 1504,64, | 1504,65, | 1504,66, | 1504,67, | 1504,68, | 1504,69, | 1504,70, | 1504,71, | 1504,72, | 1504,73, | 1504,74, | 1504,75, | 1504,76, | 1504,77, | 1504,78, | 1504,79, | 1504,80, | 1504,81, | 1504,82, | 1504,83, | 1504,84, | 1504,85, | 1505,1, | 1505,2, | 1505,3, | 1505,4, | 1505,5, | 1505,6, | 1505,7, | 1505,8, | 1505,9, | 1505,10, | 1505,11, | 1505,12, | 1505,13, | 1505,14, | 1505,15, | 1505,16, | 1505,17, | 1505,18, | 1505,19, | 1505,20, | 1505,21, | 1505,22, | 1505,23, | 1505,24, | 1505,25, | 1505,26, | 1505,27, | 1505,28, | 1505,29, | 1505,30, | 1505,31, | 1505,32, | 1505,33, | 1505,34, | 1505,35, | 1505,36, | 1505,37, | 1505,38, | 1505,39, | 1505,40, | 1505,41, | 1505,42, | 1505,43, | 1505,44, | 1505,45, | 1505,46, | 1505,47, | 1505,48, | 1505,49, | 1505,50, | 1505,51, | 1505,52, | 1505,53, | 1505,54, | 1505,55, | 1505,56, | 1505,57, | 1505,58, | 1505,59, | 1505,60, | 1505,61, | 1505,62, | 1505,63, | 1505,64, | 1505,65, | 1505,66, | 1505,67, | 1505,68, | 1505,69, | 1505,70, | 1505,71, | 1505,72, | 1505,73, | 1505,74, | 1505,75, | 1505,76, | 1505,77, | 1505,78, | 1505,79, | 1505,80, | 1505,81, | 1505,82, | 1505,83, | 1505,84, | 1505,85, | 1506,1, | 1506,2, | 1506,3, | 1506,4, | 1506,5, | 1506,6, | 1506,7, | 1506,8, | 1506,9, | 1506,10, | 1506,11, | 1506,12, | 1506,13, | 1506,14, | 1506,15, | 1506,16, | 1506,17, | 1506,18, | 1506,19, | 1506,20, | 1506,21, | 1506,22, | 1506,23, | 1506,24, | 1506,25, | 1506,26, | 1506,27, | 1506,28, | 1506,29, | 1506,30, | 1506,31, | 1506,32, | 1506,33, | 1506,34, | 1506,35, | 1506,36, | 1506,37, | 1506,38, | 1506,39, | 1506,40, | 1506,41, | 1506,42, | 1506,43, | 1506,44, | 1506,45, | 1506,46, | 1506,47, | 1506,48, | 1506,49, | 1506,50, | 1506,51, | 1506,52, | 1506,53, | 1506,54, | 1506,55, | 1506,56, | 1506,57, | 1506,58, | 1506,59, | 1506,60, | 1506,61, | 1506,62, | 1506,63, | 1506,64, | 1506,65, | 1506,66, | 1506,67, | 1506,68, | 1506,69, | 1506,70, | 1506,71, | 1506,72, | 1506,73, | 1506,74, | 1506,75, | 1506,76, | 1506,77, | 1506,78, | 1506,79, | 1506,80, | 1506,81, | 1506,82, | 1506,83, | 1506,84, | 1506,85, | 1507,1, | 1507,2, | 1507,3, | 1507,4, | 1507,5, | 1507,6, | 1507,7, | 1507,8, | 1507,9, | 1507,10, | 1507,11, | 1507,12, | 1507,13, | 1507,14, | 1507,15, | 1507,16, | 1507,17, | 1507,18, | 1507,19, | 1507,20, | 1507,21, | 1507,22, | 1507,23, | 1507,24, | 1507,25, | 1507,26, | 1507,27, | 1507,28, | 1507,29, | 1507,30, | 1507,31, | 1507,32, | 1507,33, | 1507,34, | 1507,35, | 1507,36, | 1507,37, | 1507,38, | 1507,39, | 1507,40, | 1507,41, | 1507,42, | 1507,43, | 1507,44, | 1507,45, | 1507,46, | 1507,47, | 1507,48, | 1507,49, | 1507,50, | 1507,51, | 1507,52, | 1507,53, | 1507,54, | 1507,55, | 1507,56, | 1507,57, | 1507,58, | 1507,59, | 1507,60, | 1507,61, | 1507,62, | 1507,63, | 1507,64, | 1507,65, | 1507,66, | 1507,67, | 1507,68, | 1507,69, | 1507,70, | 1507,71, | 1507,72, | 1507,73, | 1507,74, | 1507,75, | 1507,76, | 1507,77, | 1507,78, | 1507,79, | 1507,80, | 1507,81, | 1507,82, | 1507,83, | 1507,84, | 1507,85, | 1508,1, | 1508,2, | 1508,3, | 1508,4, | 1508,5, | 1508,6, | 1508,7, | 1508,8, | 1508,9, | 1508,10, | 1508,11, | 1508,12, | 1508,13, | 1508,14, | 1508,15, | 1508,16, | 1508,17, | 1508,18, | 1508,19, | 1508,20, | 1508,21, | 1508,22, | 1508,23, | 1508,24, | 1508,25, | 1508,26, | 1508,27, | 1508,28, | 1508,29, | 1508,30, | 1508,31, | 1508,32, | 1508,33, | 1508,34, | 1508,35, | 1508,36, | 1508,37, | 1508,38, | 1508,39, | 1508,40, | 1508,41, | 1508,42, | 1508,43, | 1508,44, | 1508,45, | 1508,46, | 1508,47, | 1508,48, | 1508,49, | 1508,50, | 1508,51, | 1508,52, | 1508,53, | 1508,54, | 1508,55, | 1508,56, | 1508,57, | 1508,58, | 1508,59, | 1508,60, | 1508,61, | 1508,62, | 1508,63, | 1508,64, | 1508,65, | 1508,66, | 1508,67, | 1508,68, | 1508,69, | 1508,70, | 1508,71, | 1508,72, | 1508,73, | 1508,74, | 1508,75, | 1508,76, | 1508,77, | 1508,78, | 1508,79, | 1508,80, | 1508,81, | 1508,82, | 1508,83, | 1508,84, | 1508,85, | 1509,1, | 1509,2, | 1509,3, | 1509,4, | 1509,5, | 1509,6, | 1509,7, | 1509,8, | 1509,9, | 1509,10, | 1509,11, | 1509,12, | 1509,13, | 1509,14, | 1509,15, | 1509,16, | 1509,17, | 1509,18, | 1509,19, | 1509,20, | 1509,21, | 1509,22, | 1509,23, | 1509,24, | 1509,25, | 1509,26, | 1509,27, | 1509,28, | 1509,29, | 1509,30, | 1509,31, | 1509,32, | 1509,33, | 1509,34, | 1509,35, | 1509,36, | 1509,37, | 1509,38, | 1509,39, | 1509,40, | 1509,41, | 1509,42, | 1509,43, | 1509,44, | 1509,45, | 1509,46, | 1509,47, | 1509,48, | 1509,49, | 1509,50, | 1509,51, | 1509,52, | 1509,53, | 1509,54, | 1509,55, | 1509,56, | 1509,57, | 1509,58, | 1509,59, | 1509,60, | 1509,61, | 1509,62, | 1509,63, | 1509,64, | 1509,65, | 1509,66, | 1509,67, | 1509,68, | 1509,69, | 1509,70, | 1509,71, | 1509,72, | 1509,73, | 1509,74, | 1509,75, | 1509,76, | 1509,77, | 1509,78, | 1509,79, | 1509,80, | 1509,81, | 1509,82, | 1509,83, | 1509,84, | 1509,85, | 1510,1, | 1510,2, | 1510,3, | 1510,4, | 1510,5, | 1510,6, | 1510,7, | 1510,8, | 1510,9, | 1510,10, | 1510,11, | 1510,12, | 1510,13, | 1510,14, | 1510,15, | 1510,16, | 1510,17, | 1510,18, | 1510,19, | 1510,20, | 1510,21, | 1510,22, | 1510,23, | 1510,24, | 1510,25, | 1510,26, | 1510,27, | 1510,28, | 1510,29, | 1510,30, | 1510,31, | 1510,32, | 1510,33, | 1510,34, | 1510,35, | 1510,36, | 1510,37, | 1510,38, | 1510,39, | 1510,40, | 1510,41, | 1510,42, | 1510,43, | 1510,44, | 1510,45, | 1510,46, | 1510,47, | 1510,48, | 1510,49, | 1510,50, | 1510,51, | 1510,52, | 1510,53, | 1510,54, | 1510,55, | 1510,56, | 1510,57, | 1510,58, | 1510,59, | 1510,60, | 1510,61, | 1510,62, | 1510,63, | 1510,64, | 1510,65, | 1510,66, | 1510,67, | 1510,68, | 1510,69, | 1510,70, | 1510,71, | 1510,72, | 1510,73, | 1510,74, | 1510,75, | 1510,76, | 1510,77, | 1510,78, | 1510,79, | 1510,80, | 1510,81, | 1510,82, | 1510,83, | 1510,84, | 1510,85, | 1511,1, | 1511,2, | 1511,3, | 1511,4, | 1511,5, | 1511,6, | 1511,7, | 1511,8, | 1511,9, | 1511,10, | 1511,11, | 1511,12, | 1511,13, | 1511,14, | 1511,15, | 1511,16, | 1511,17, | 1511,18, | 1511,19, | 1511,20, | 1511,21, | 1511,22, | 1511,23, | 1511,24, | 1511,25, | 1511,26, | 1511,27, | 1511,28, | 1511,29, | 1511,30, | 1511,31, | 1511,32, | 1511,33, | 1511,34, | 1511,35, | 1511,36, | 1511,37, | 1511,38, | 1511,39, | 1511,40, | 1511,41, | 1511,42, | 1511,43, | 1511,44, | 1511,45, | 1511,46, | 1511,47, | 1511,48, | 1511,49, | 1511,50, | 1511,51, | 1511,52, | 1511,53, | 1511,54, | 1511,55, | 1511,56, | 1511,57, | 1511,58, | 1511,59, | 1511,60, | 1511,61, | 1511,62, | 1511,63, | 1511,64, | 1511,65, | 1511,66, | 1511,67, | 1511,68, | 1511,69, | 1511,70, | 1511,71, | 1511,72, | 1511,73, | 1511,74, | 1511,75, | 1511,76, | 1511,77, | 1511,78, | 1511,79, | 1511,80, | 1511,81, | 1511,82, | 1511,83, | 1511,84, | 1511,85, | 1512,1, | 1512,2, | 1512,3, | 1512,4, | 1512,5, | 1512,6, | 1512,7, | 1512,8, | 1512,9, | 1512,10, | 1512,11, | 1512,12, | 1512,13, | 1512,14, | 1512,15, | 1512,16, | 1512,17, | 1512,18, | 1512,19, | 1512,20, | 1512,21, | 1512,22, | 1512,23, | 1512,24, | 1512,25, | 1512,26, | 1512,27, | 1512,28, | 1512,29, | 1512,30, | 1512,31, | 1512,32, | 1512,33, | 1512,34, | 1512,35, | 1512,36, | 1512,37, | 1512,38, | 1512,39, | 1512,40, | 1512,41, | 1512,42, | 1512,43, | 1512,44, | 1512,45, | 1512,46, | 1512,47, | 1512,48, | 1512,49, | 1512,50, | 1512,51, | 1512,52, | 1512,53, | 1512,54, | 1512,55, | 1512,56, | 1512,57, | 1512,58, | 1512,59, | 1512,60, | 1512,61, | 1512,62, | 1512,63, | 1512,64, | 1512,65, | 1512,66, | 1512,67, | 1512,68, | 1512,69, | 1512,70, | 1512,71, | 1512,72, | 1512,73, | 1512,74, | 1512,75, | 1512,76, | 1512,77, | 1512,78, | 1512,79, | 1512,80, | 1512,81, | 1512,82, | 1512,83, | 1512,84, | 1512,85, | 1513,1, | 1513,2, | 1513,3, | 1513,4, | 1513,5, | 1513,6, | 1513,7, | 1513,8, | 1513,9, | 1513,10, | 1513,11, | 1513,12, | 1513,13, | 1513,14, | 1513,15, | 1513,16, | 1513,17, | 1513,18, | 1513,19, | 1513,20, | 1513,21, | 1513,22, | 1513,23, | 1513,24, | 1513,25, | 1513,26, | 1513,27, | 1513,28, | 1513,29, | 1513,30, | 1513,31, | 1513,32, | 1513,33, | 1513,34, | 1513,35, | 1513,36, | 1513,37, | 1513,38, | 1513,39, | 1513,40, | 1513,41, | 1513,42, | 1513,43, | 1513,44, | 1513,45, | 1513,46, | 1513,47, | 1513,48, | 1513,49, | 1513,50, | 1513,51, | 1513,52, | 1513,53, | 1513,54, | 1513,55, | 1513,56, | 1513,57, | 1513,58, | 1513,59, | 1513,60, | 1513,61, | 1513,62, | 1513,63, | 1513,64, | 1513,65, | 1513,66, | 1513,67, | 1513,68, | 1513,69, | 1513,70, | 1513,71, | 1513,72, | 1513,73, | 1513,74, | 1513,75, | 1513,76, | 1513,77, | 1513,78, | 1513,79, | 1513,80, | 1513,81, | 1513,82, | 1513,83, | 1513,84, | 1513,85, | 1514,1, | 1514,2, | 1514,3, | 1514,4, | 1514,5, | 1514,6, | 1514,7, | 1514,8, | 1514,9, | 1514,10, | 1514,11, | 1514,12, | 1514,13, | 1514,14, | 1514,15, | 1514,16, | 1514,17, | 1514,18, | 1514,19, | 1514,20, | 1514,21, | 1514,22, | 1514,23, | 1514,24, | 1514,25, | 1514,26, | 1514,27, | 1514,28, | 1514,29, | 1514,30, | 1514,31, | 1514,32, | 1514,33, | 1514,34, | 1514,35, | 1514,36, | 1514,37, | 1514,38, | 1514,39, | 1514,40, | 1514,41, | 1514,42, | 1514,43, | 1514,44, | 1514,45, | 1514,46, | 1514,47, | 1514,48, | 1514,49, | 1514,50, | 1514,51, | 1514,52, | 1514,53, | 1514,54, | 1514,55, | 1514,56, | 1514,57, | 1514,58, | 1514,59, | 1514,60, | 1514,61, | 1514,62, | 1514,63, | 1514,64, | 1514,65, | 1514,66, | 1514,67, | 1514,68, | 1514,69, | 1514,70, | 1514,71, | 1514,72, | 1514,73, | 1514,74, | 1514,75, | 1514,76, | 1514,77, | 1514,78, | 1514,79, | 1514,80, | 1514,81, | 1514,82, | 1514,83, | 1514,84, | 1514,85, | 1515,1, | 1515,2, | 1515,3, | 1515,4, | 1515,5, | 1515,6, | 1515,7, | 1515,8, | 1515,9, | 1515,10, | 1515,11, | 1515,12, | 1515,13, | 1515,14, | 1515,15, | 1515,16, | 1515,17, | 1515,18, | 1515,19, | 1515,20, | 1515,21, | 1515,22, | 1515,23, | 1515,24, | 1515,25, | 1515,26, | 1515,27, | 1515,28, | 1515,29, | 1515,30, | 1515,31, | 1515,32, | 1515,33, | 1515,34, | 1515,35, | 1515,36, | 1515,37, | 1515,38, | 1515,39, | 1515,40, | 1515,41, | 1515,42, | 1515,43, | 1515,44, | 1515,45, | 1515,46, | 1515,47, | 1515,48, | 1515,49, | 1515,50, | 1515,51, | 1515,52, | 1515,53, | 1515,54, | 1515,55, | 1515,56, | 1515,57, | 1515,58, | 1515,59, | 1515,60, | 1515,61, | 1515,62, | 1515,63, | 1515,64, | 1515,65, | 1515,66, | 1515,67, | 1515,68, | 1515,69, | 1515,70, | 1515,71, | 1515,72, | 1515,73, | 1515,74, | 1515,75, | 1515,76, | 1515,77, | 1515,78, | 1515,79, | 1515,80, | 1515,81, | 1515,82, | 1515,83, | 1515,84, | 1515,85, | 1516,1, | 1516,2, | 1516,3, | 1516,4, | 1516,5, | 1516,6, | 1516,7, | 1516,8, | 1516,9, | 1516,10, | 1516,11, | 1516,12, | 1516,13, | 1516,14, | 1516,15, | 1516,16, | 1516,17, | 1516,18, | 1516,19, | 1516,20, | 1516,21, | 1516,22, | 1516,23, | 1516,24, | 1516,25, | 1516,26, | 1516,27, | 1516,28, | 1516,29, | 1516,30, | 1516,31, | 1516,32, | 1516,33, | 1516,34, | 1516,35, | 1516,36, | 1516,37, | 1516,38, | 1516,39, | 1516,40, | 1516,41, | 1516,42, | 1516,43, | 1516,44, | 1516,45, | 1516,46, | 1516,47, | 1516,48, | 1516,49, | 1516,50, | 1516,51, | 1516,52, | 1516,53, | 1516,54, | 1516,55, | 1516,56, | 1516,57, | 1516,58, | 1516,59, | 1516,60, | 1516,61, | 1516,62, | 1516,63, | 1516,64, | 1516,65, | 1516,66, | 1516,67, | 1516,68, | 1516,69, | 1516,70, | 1516,71, | 1516,72, | 1516,73, | 1516,74, | 1516,75, | 1516,76, | 1516,77, | 1516,78, | 1516,79, | 1516,80, | 1516,81, | 1516,82, | 1516,83, | 1516,84, | 1516,85, | 1517,1, | 1517,2, | 1517,3, | 1517,4, | 1517,5, | 1517,6, | 1517,7, | 1517,8, | 1517,9, | 1517,10, | 1517,11, | 1517,12, | 1517,13, | 1517,14, | 1517,15, | 1517,16, | 1517,17, | 1517,18, | 1517,19, | 1517,20, | 1517,21, | 1517,22, | 1517,23, | 1517,24, | 1517,25, | 1517,26, | 1517,27, | 1517,28, | 1517,29, | 1517,30, | 1517,31, | 1517,32, | 1517,33, | 1517,34, | 1517,35, | 1517,36, | 1517,37, | 1517,38, | 1517,39, | 1517,40, | 1517,41, | 1517,42, | 1517,43, | 1517,44, | 1517,45, | 1517,46, | 1517,47, | 1517,48, | 1517,49, | 1517,50, | 1517,51, | 1517,52, | 1517,53, | 1517,54, | 1517,55, | 1517,56, | 1517,57, | 1517,58, | 1517,59, | 1517,60, | 1517,61, | 1517,62, | 1517,63, | 1517,64, | 1517,65, | 1517,66, | 1517,67, | 1517,68, | 1517,69, | 1517,70, | 1517,71, | 1517,72, | 1517,73, | 1517,74, | 1517,75, | 1517,76, | 1517,77, | 1517,78, | 1517,79, | 1517,80, | 1517,81, | 1517,82, | 1517,83, | 1517,84, | 1517,85, | 1518,1, | 1518,2, | 1518,3, | 1518,4, | 1518,5, | 1518,6, | 1518,7, | 1518,8, | 1518,9, | 1518,10, | 1518,11, | 1518,12, | 1518,13, | 1518,14, | 1518,15, | 1518,16, | 1518,17, | 1518,18, | 1518,19, | 1518,20, | 1518,21, | 1518,22, | 1518,23, | 1518,24, | 1518,25, | 1518,26, | 1518,27, | 1518,28, | 1518,29, | 1518,30, | 1518,31, | 1518,32, | 1518,33, | 1518,34, | 1518,35, | 1518,36, | 1518,37, | 1518,38, | 1518,39, | 1518,40, | 1518,41, | 1518,42, | 1518,43, | 1518,44, | 1518,45, | 1518,46, | 1518,47, | 1518,48, | 1518,49, | 1518,50, | 1518,51, | 1518,52, | 1518,53, | 1518,54, | 1518,55, | 1518,56, | 1518,57, | 1518,58, | 1518,59, | 1518,60, | 1518,61, | 1518,62, | 1518,63, | 1518,64, | 1518,65, | 1518,66, | 1518,67, | 1518,68, | 1518,69, | 1518,70, | 1518,71, | 1518,72, | 1518,73, | 1518,74, | 1518,75, | 1518,76, | 1518,77, | 1518,78, | 1518,79, | 1518,80, | 1518,81, | 1518,82, | 1518,83, | 1518,84, | 1518,85, | 1519,1, | 1519,2, | 1519,3, | 1519,4, | 1519,5, | 1519,6, | 1519,7, | 1519,8, | 1519,9, | 1519,10, | 1519,11, | 1519,12, | 1519,13, | 1519,14, | 1519,15, | 1519,16, | 1519,17, | 1519,18, | 1519,19, | 1519,20, | 1519,21, | 1519,22, | 1519,23, | 1519,24, | 1519,25, | 1519,26, | 1519,27, | 1519,28, | 1519,29, | 1519,30, | 1519,31, | 1519,32, | 1519,33, | 1519,34, | 1519,35, | 1519,36, | 1519,37, | 1519,38, | 1519,39, | 1519,40, | 1519,41, | 1519,42, | 1519,43, | 1519,44, | 1519,45, | 1519,46, | 1519,47, | 1519,48, | 1519,49, | 1519,50, | 1519,51, | 1519,52, | 1519,53, | 1519,54, | 1519,55, | 1519,56, | 1519,57, | 1519,58, | 1519,59, | 1519,60, | 1519,61, | 1519,62, | 1519,63, | 1519,64, | 1519,65, | 1519,66, | 1519,67, | 1519,68, | 1519,69, | 1519,70, | 1519,71, | 1519,72, | 1519,73, | 1519,74, | 1519,75, | 1519,76, | 1519,77, | 1519,78, | 1519,79, | 1519,80, | 1519,81, | 1519,82, | 1519,83, | 1519,84, | 1519,85, | 1520,1, | 1520,2, | 1520,3, | 1520,4, | 1520,5, | 1520,6, | 1520,7, | 1520,8, | 1520,9, | 1520,10, | 1520,11, | 1520,12, | 1520,13, | 1520,14, | 1520,15, | 1520,16, | 1520,17, | 1520,18, | 1520,19, | 1520,20, | 1520,21, | 1520,22, | 1520,23, | 1520,24, | 1520,25, | 1520,26, | 1520,27, | 1520,28, | 1520,29, | 1520,30, | 1520,31, | 1520,32, | 1520,33, | 1520,34, | 1520,35, | 1520,36, | 1520,37, | 1520,38, | 1520,39, | 1520,40, | 1520,41, | 1520,42, | 1520,43, | 1520,44, | 1520,45, | 1520,46, | 1520,47, | 1520,48, | 1520,49, | 1520,50, | 1520,51, | 1520,52, | 1520,53, | 1520,54, | 1520,55, | 1520,56, | 1520,57, | 1520,58, | 1520,59, | 1520,60, | 1520,61, | 1520,62, | 1520,63, | 1520,64, | 1520,65, | 1520,66, | 1520,67, | 1520,68, | 1520,69, | 1520,70, | 1520,71, | 1520,72, | 1520,73, | 1520,74, | 1520,75, | 1520,76, | 1520,77, | 1520,78, | 1520,79, | 1520,80, | 1520,81, | 1520,82, | 1520,83, | 1520,84, | 1520,85, | 1521,1, | 1521,2, | 1521,3, | 1521,4, | 1521,5, | 1521,6, | 1521,7, | 1521,8, | 1521,9, | 1521,10, | 1521,11, | 1521,12, | 1521,13, | 1521,14, | 1521,15, | 1521,16, | 1521,17, | 1521,18, | 1521,19, | 1521,20, | 1521,21, | 1521,22, | 1521,23, | 1521,24, | 1521,25, | 1521,26, | 1521,27, | 1521,28, | 1521,29, | 1521,30, | 1521,31, | 1521,32, | 1521,33, | 1521,34, | 1521,35, | 1521,36, | 1521,37, | 1521,38, | 1521,39, | 1521,40, | 1521,41, | 1521,42, | 1521,43, | 1521,44, | 1521,45, | 1521,46, | 1521,47, | 1521,48, | 1521,49, | 1521,50, | 1521,51, | 1521,52, | 1521,53, | 1521,54, | 1521,55, | 1521,56, | 1521,57, | 1521,58, | 1521,59, | 1521,60, | 1521,61, | 1521,62, | 1521,63, | 1521,64, | 1521,65, | 1521,66, | 1521,67, | 1521,68, | 1521,69, | 1521,70, | 1521,71, | 1521,72, | 1521,73, | 1521,74, | 1521,75, | 1521,76, | 1521,77, | 1521,78, | 1521,79, | 1521,80, | 1521,81, | 1521,82, | 1521,83, | 1521,84, | 1521,85, | 1522,1, | 1522,2, | 1522,3, | 1522,4, | 1522,5, | 1522,6, | 1522,7, | 1522,8, | 1522,9, | 1522,10, | 1522,11, | 1522,12, | 1522,13, | 1522,14, | 1522,15, | 1522,16, | 1522,17, | 1522,18, | 1522,19, | 1522,20, | 1522,21, | 1522,22, | 1522,23, | 1522,24, | 1522,25, | 1522,26, | 1522,27, | 1522,28, | 1522,29, | 1522,30, | 1522,31, | 1522,32, | 1522,33, | 1522,34, | 1522,35, | 1522,36, | 1522,37, | 1522,38, | 1522,39, | 1522,40, | 1522,41, | 1522,42, | 1522,43, | 1522,44, | 1522,45, | 1522,46, | 1522,47, | 1522,48, | 1522,49, | 1522,50, | 1522,51, | 1522,52, | 1522,53, | 1522,54, | 1522,55, | 1522,56, | 1522,57, | 1522,58, | 1522,59, | 1522,60, | 1522,61, | 1522,62, | 1522,63, | 1522,64, | 1522,65, | 1522,66, | 1522,67, | 1522,68, | 1522,69, | 1522,70, | 1522,71, | 1522,72, | 1522,73, | 1522,74, | 1522,75, | 1522,76, | 1522,77, | 1522,78, | 1522,79, | 1522,80, | 1522,81, | 1522,82, | 1522,83, | 1522,84, | 1522,85, | 1523,1, | 1523,2, | 1523,3, | 1523,4, | 1523,5, | 1523,6, | 1523,7, | 1523,8, | 1523,9, | 1523,10, | 1523,11, | 1523,12, | 1523,13, | 1523,14, | 1523,15, | 1523,16, | 1523,17, | 1523,18, | 1523,19, | 1523,20, | 1523,21, | 1523,22, | 1523,23, | 1523,24, | 1523,25, | 1523,26, | 1523,27, | 1523,28, | 1523,29, | 1523,30, | 1523,31, | 1523,32, | 1523,33, | 1523,34, | 1523,35, | 1523,36, | 1523,37, | 1523,38, | 1523,39, | 1523,40, | 1523,41, | 1523,42, | 1523,43, | 1523,44, | 1523,45, | 1523,46, | 1523,47, | 1523,48, | 1523,49, | 1523,50, | 1523,51, | 1523,52, | 1523,53, | 1523,54, | 1523,55, | 1523,56, | 1523,57, | 1523,58, | 1523,59, | 1523,60, | 1523,61, | 1523,62, | 1523,63, | 1523,64, | 1523,65, | 1523,66, | 1523,67, | 1523,68, | 1523,69, | 1523,70, | 1523,71, | 1523,72, | 1523,73, | 1523,74, | 1523,75, | 1523,76, | 1523,77, | 1523,78, | 1523,79, | 1523,80, | 1523,81, | 1523,82, | 1523,83, | 1523,84, | 1523,85, | 1524,1, | 1524,2, | 1524,3, | 1524,4, | 1524,5, | 1524,6, | 1524,7, | 1524,8, | 1524,9, | 1524,10, | 1524,11, | 1524,12, | 1524,13, | 1524,14, | 1524,15, | 1524,16, | 1524,17, | 1524,18, | 1524,19, | 1524,20, | 1524,21, | 1524,22, | 1524,23, | 1524,24, | 1524,25, | 1524,26, | 1524,27, | 1524,28, | 1524,29, | 1524,30, | 1524,31, | 1524,32, | 1524,33, | 1524,34, | 1524,35, | 1524,36, | 1524,37, | 1524,38, | 1524,39, | 1524,40, | 1524,41, | 1524,42, | 1524,43, | 1524,44, | 1524,45, | 1524,46, | 1524,47, | 1524,48, | 1524,49, | 1524,50, | 1524,51, | 1524,52, | 1524,53, | 1524,54, | 1524,55, | 1524,56, | 1524,57, | 1524,58, | 1524,59, | 1524,60, | 1524,61, | 1524,62, | 1524,63, | 1524,64, | 1524,65, | 1524,66, | 1524,67, | 1524,68, | 1524,69, | 1524,70, | 1524,71, | 1524,72, | 1524,73, | 1524,74, | 1524,75, | 1524,76, | 1524,77, | 1524,78, | 1524,79, | 1524,80, | 1524,81, | 1524,82, | 1524,83, | 1524,84, | 1524,85, | 1525,1, | 1525,2, | 1525,3, | 1525,4, | 1525,5, | 1525,6, | 1525,7, | 1525,8, | 1525,9, | 1525,10, | 1525,11, | 1525,12, | 1525,13, | 1525,14, | 1525,15, | 1525,16, | 1525,17, | 1525,18, | 1525,19, | 1525,20, | 1525,21, | 1525,22, | 1525,23, | 1525,24, | 1525,25, | 1525,26, | 1525,27, | 1525,28, | 1525,29, | 1525,30, | 1525,31, | 1525,32, | 1525,33, | 1525,34, | 1525,35, | 1525,36, | 1525,37, | 1525,38, | 1525,39, | 1525,40, | 1525,41, | 1525,42, | 1525,43, | 1525,44, | 1525,45, | 1525,46, | 1525,47, | 1525,48, | 1525,49, | 1525,50, | 1525,51, | 1525,52, | 1525,53, | 1525,54, | 1525,55, | 1525,56, | 1525,57, | 1525,58, | 1525,59, | 1525,60, | 1525,61, | 1525,62, | 1525,63, | 1525,64, | 1525,65, | 1525,66, | 1525,67, | 1525,68, | 1525,69, | 1525,70, | 1525,71, | 1525,72, | 1525,73, | 1525,74, | 1525,75, | 1525,76, | 1525,77, | 1525,78, | 1525,79, | 1525,80, | 1525,81, | 1525,82, | 1525,83, | 1525,84, | 1525,85, | 1526,1, | 1526,2, | 1526,3, | 1526,4, | 1526,5, | 1526,6, | 1526,7, | 1526,8, | 1526,9, | 1526,10, | 1526,11, | 1526,12, | 1526,13, | 1526,14, | 1526,15, | 1526,16, | 1526,17, | 1526,18, | 1526,19, | 1526,20, | 1526,21, | 1526,22, | 1526,23, | 1526,24, | 1526,25, | 1526,26, | 1526,27, | 1526,28, | 1526,29, | 1526,30, | 1526,31, | 1526,32, | 1526,33, | 1526,34, | 1526,35, | 1526,36, | 1526,37, | 1526,38, | 1526,39, | 1526,40, | 1526,41, | 1526,42, | 1526,43, | 1526,44, | 1526,45, | 1526,46, | 1526,47, | 1526,48, | 1526,49, | 1526,50, | 1526,51, | 1526,52, | 1526,53, | 1526,54, | 1526,55, | 1526,56, | 1526,57, | 1526,58, | 1526,59, | 1526,60, | 1526,61, | 1526,62, | 1526,63, | 1526,64, | 1526,65, | 1526,66, | 1526,67, | 1526,68, | 1526,69, | 1526,70, | 1526,71, | 1526,72, | 1526,73, | 1526,74, | 1526,75, | 1526,76, | 1526,77, | 1526,78, | 1526,79, | 1526,80, | 1526,81, | 1526,82, | 1526,83, | 1526,84, | 1526,85, | 1527,1, | 1527,2, | 1527,3, | 1527,4, | 1527,5, | 1527,6, | 1527,7, | 1527,8, | 1527,9, | 1527,10, | 1527,11, | 1527,12, | 1527,13, | 1527,14, | 1527,15, | 1527,16, | 1527,17, | 1527,18, | 1527,19, | 1527,20, | 1527,21, | 1527,22, | 1527,23, | 1527,24, | 1527,25, | 1527,26, | 1527,27, | 1527,28, | 1527,29, | 1527,30, | 1527,31, | 1527,32, | 1527,33, | 1527,34, | 1527,35, | 1527,36, | 1527,37, | 1527,38, | 1527,39, | 1527,40, | 1527,41, | 1527,42, | 1527,43, | 1527,44, | 1527,45, | 1527,46, | 1527,47, | 1527,48, | 1527,49, | 1527,50, | 1527,51, | 1527,52, | 1527,53, | 1527,54, | 1527,55, | 1527,56, | 1527,57, | 1527,58, | 1527,59, | 1527,60, | 1527,61, | 1527,62, | 1527,63, | 1527,64, | 1527,65, | 1527,66, | 1527,67, | 1527,68, | 1527,69, | 1527,70, | 1527,71, | 1527,72, | 1527,73, | 1527,74, | 1527,75, | 1527,76, | 1527,77, | 1527,78, | 1527,79, | 1527,80, | 1527,81, | 1527,82, | 1527,83, | 1527,84, | 1527,85, | 1528,1, | 1528,2, | 1528,3, | 1528,4, | 1528,5, | 1528,6, | 1528,7, | 1528,8, | 1528,9, | 1528,10, | 1528,11, | 1528,12, | 1528,13, | 1528,14, | 1528,15, | 1528,16, | 1528,17, | 1528,18, | 1528,19, | 1528,20, | 1528,21, | 1528,22, | 1528,23, | 1528,24, | 1528,25, | 1528,26, | 1528,27, | 1528,28, | 1528,29, | 1528,30, | 1528,31, | 1528,32, | 1528,33, | 1528,34, | 1528,35, | 1528,36, | 1528,37, | 1528,38, | 1528,39, | 1528,40, | 1528,41, | 1528,42, | 1528,43, | 1528,44, | 1528,45, | 1528,46, | 1528,47, | 1528,48, | 1528,49, | 1528,50, | 1528,51, | 1528,52, | 1528,53, | 1528,54, | 1528,55, | 1528,56, | 1528,57, | 1528,58, | 1528,59, | 1528,60, | 1528,61, | 1528,62, | 1528,63, | 1528,64, | 1528,65, | 1528,66, | 1528,67, | 1528,68, | 1528,69, | 1528,70, | 1528,71, | 1528,72, | 1528,73, | 1528,74, | 1528,75, | 1528,76, | 1528,77, | 1528,78, | 1528,79, | 1528,80, | 1528,81, | 1528,82, | 1528,83, | 1528,84, | 1528,85, | 1529,1, | 1529,2, | 1529,3, | 1529,4, | 1529,5, | 1529,6, | 1529,7, | 1529,8, | 1529,9, | 1529,10, | 1529,11, | 1529,12, | 1529,13, | 1529,14, | 1529,15, | 1529,16, | 1529,17, | 1529,18, | 1529,19, | 1529,20, | 1529,21, | 1529,22, | 1529,23, | 1529,24, | 1529,25, | 1529,26, | 1529,27, | 1529,28, | 1529,29, | 1529,30, | 1529,31, | 1529,32, | 1529,33, | 1529,34, | 1529,35, | 1529,36, | 1529,37, | 1529,38, | 1529,39, | 1529,40, | 1529,41, | 1529,42, | 1529,43, | 1529,44, | 1529,45, | 1529,46, | 1529,47, | 1529,48, | 1529,49, | 1529,50, | 1529,51, | 1529,52, | 1529,53, | 1529,54, | 1529,55, | 1529,56, | 1529,57, | 1529,58, | 1529,59, | 1529,60, | 1529,61, | 1529,62, | 1529,63, | 1529,64, | 1529,65, | 1529,66, | 1529,67, | 1529,68, | 1529,69, | 1529,70, | 1529,71, | 1529,72, | 1529,73, | 1529,74, | 1529,75, | 1529,76, | 1529,77, | 1529,78, | 1529,79, | 1529,80, | 1529,81, | 1529,82, | 1529,83, | 1529,84, | 1529,85, | 1530,1, | 1530,2, | 1530,3, | 1530,4, | 1530,5, | 1530,6, | 1530,7, | 1530,8, | 1530,9, | 1530,10, | 1530,11, | 1530,12, | 1530,13, | 1530,14, | 1530,15, | 1530,16, | 1530,17, | 1530,18, | 1530,19, | 1530,20, | 1530,21, | 1530,22, | 1530,23, | 1530,24, | 1530,25, | 1530,26, | 1530,27, | 1530,28, | 1530,29, | 1530,30, | 1530,31, | 1530,32, | 1530,33, | 1530,34, | 1530,35, | 1530,36, | 1530,37, | 1530,38, | 1530,39, | 1530,40, | 1530,41, | 1530,42, | 1530,43, | 1530,44, | 1530,45, | 1530,46, | 1530,47, | 1530,48, | 1530,49, | 1530,50, | 1530,51, | 1530,52, | 1530,53, | 1530,54, | 1530,55, | 1530,56, | 1530,57, | 1530,58, | 1530,59, | 1530,60, | 1530,61, | 1530,62, | 1530,63, | 1530,64, | 1530,65, | 1530,66, | 1530,67, | 1530,68, | 1530,69, | 1530,70, | 1530,71, | 1530,72, | 1530,73, | 1530,74, | 1530,75, | 1530,76, | 1530,77, | 1530,78, | 1530,79, | 1530,80, | 1530,81, | 1530,82, | 1530,83, | 1530,84, | 1530,85, | 1531,1, | 1531,2, | 1531,3, | 1531,4, | 1531,5, | 1531,6, | 1531,7, | 1531,8, | 1531,9, | 1531,10, | 1531,11, | 1531,12, | 1531,13, | 1531,14, | 1531,15, | 1531,16, | 1531,17, | 1531,18, | 1531,19, | 1531,20, | 1531,21, | 1531,22, | 1531,23, | 1531,24, | 1531,25, | 1531,26, | 1531,27, | 1531,28, | 1531,29, | 1531,30, | 1531,31, | 1531,32, | 1531,33, | 1531,34, | 1531,35, | 1531,36, | 1531,37, | 1531,38, | 1531,39, | 1531,40, | 1531,41, | 1531,42, | 1531,43, | 1531,44, | 1531,45, | 1531,46, | 1531,47, | 1531,48, | 1531,49, | 1531,50, | 1531,51, | 1531,52, | 1531,53, | 1531,54, | 1531,55, | 1531,56, | 1531,57, | 1531,58, | 1531,59, | 1531,60, | 1531,61, | 1531,62, | 1531,63, | 1531,64, | 1531,65, | 1531,66, | 1531,67, | 1531,68, | 1531,69, | 1531,70, | 1531,71, | 1531,72, | 1531,73, | 1531,74, | 1531,75, | 1531,76, | 1531,77, | 1531,78, | 1531,79, | 1531,80, | 1531,81, | 1531,82, | 1531,83, | 1531,84, | 1531,85, | 1532,1, | 1532,2, | 1532,3, | 1532,4, | 1532,5, | 1532,6, | 1532,7, | 1532,8, | 1532,9, | 1532,10, | 1532,11, | 1532,12, | 1532,13, | 1532,14, | 1532,15, | 1532,16, | 1532,17, | 1532,18, | 1532,19, | 1532,20, | 1532,21, | 1532,22, | 1532,23, | 1532,24, | 1532,25, | 1532,26, | 1532,27, | 1532,28, | 1532,29, | 1532,30, | 1532,31, | 1532,32, | 1532,33, | 1532,34, | 1532,35, | 1532,36, | 1532,37, | 1532,38, | 1532,39, | 1532,40, | 1532,41, | 1532,42, | 1532,43, | 1532,44, | 1532,45, | 1532,46, | 1532,47, | 1532,48, | 1532,49, | 1532,50, | 1532,51, | 1532,52, | 1532,53, | 1532,54, | 1532,55, | 1532,56, | 1532,57, | 1532,58, | 1532,59, | 1532,60, | 1532,61, | 1532,62, | 1532,63, | 1532,64, | 1532,65, | 1532,66, | 1532,67, | 1532,68, | 1532,69, | 1532,70, | 1532,71, | 1532,72, | 1532,73, | 1532,74, | 1532,75, | 1532,76, | 1532,77, | 1532,78, | 1532,79, | 1532,80, | 1532,81, | 1532,82, | 1532,83, | 1532,84, | 1532,85, | 1533,1, | 1533,2, | 1533,3, | 1533,4, | 1533,5, | 1533,6, | 1533,7, | 1533,8, | 1533,9, | 1533,10, | 1533,11, | 1533,12, | 1533,13, | 1533,14, | 1533,15, | 1533,16, | 1533,17, | 1533,18, | 1533,19, | 1533,20, | 1533,21, | 1533,22, | 1533,23, | 1533,24, | 1533,25, | 1533,26, | 1533,27, | 1533,28, | 1533,29, | 1533,30, | 1533,31, | 1533,32, | 1533,33, | 1533,34, | 1533,35, | 1533,36, | 1533,37, | 1533,38, | 1533,39, | 1533,40, | 1533,41, | 1533,42, | 1533,43, | 1533,44, | 1533,45, | 1533,46, | 1533,47, | 1533,48, | 1533,49, | 1533,50, | 1533,51, | 1533,52, | 1533,53, | 1533,54, | 1533,55, | 1533,56, | 1533,57, | 1533,58, | 1533,59, | 1533,60, | 1533,61, | 1533,62, | 1533,63, | 1533,64, | 1533,65, | 1533,66, | 1533,67, | 1533,68, | 1533,69, | 1533,70, | 1533,71, | 1533,72, | 1533,73, | 1533,74, | 1533,75, | 1533,76, | 1533,77, | 1533,78, | 1533,79, | 1533,80, | 1533,81, | 1533,82, | 1533,83, | 1533,84, | 1533,85, | 1534,1, | 1534,2, | 1534,3, | 1534,4, | 1534,5, | 1534,6, | 1534,7, | 1534,8, | 1534,9, | 1534,10, | 1534,11, | 1534,12, | 1534,13, | 1534,14, | 1534,15, | 1534,16, | 1534,17, | 1534,18, | 1534,19, | 1534,20, | 1534,21, | 1534,22, | 1534,23, | 1534,24, | 1534,25, | 1534,26, | 1534,27, | 1534,28, | 1534,29, | 1534,30, | 1534,31, | 1534,32, | 1534,33, | 1534,34, | 1534,35, | 1534,36, | 1534,37, | 1534,38, | 1534,39, | 1534,40, | 1534,41, | 1534,42, | 1534,43, | 1534,44, | 1534,45, | 1534,46, | 1534,47, | 1534,48, | 1534,49, | 1534,50, | 1534,51, | 1534,52, | 1534,53, | 1534,54, | 1534,55, | 1534,56, | 1534,57, | 1534,58, | 1534,59, | 1534,60, | 1534,61, | 1534,62, | 1534,63, | 1534,64, | 1534,65, | 1534,66, | 1534,67, | 1534,68, | 1534,69, | 1534,70, | 1534,71, | 1534,72, | 1534,73, | 1534,74, | 1534,75, | 1534,76, | 1534,77, | 1534,78, | 1534,79, | 1534,80, | 1534,81, | 1534,82, | 1534,83, | 1534,84, | 1534,85, | 1535,1, | 1535,2, | 1535,3, | 1535,4, | 1535,5, | 1535,6, | 1535,7, | 1535,8, | 1535,9, | 1535,10, | 1535,11, | 1535,12, | 1535,13, | 1535,14, | 1535,15, | 1535,16, | 1535,17, | 1535,18, | 1535,19, | 1535,20, | 1535,21, | 1535,22, | 1535,23, | 1535,24, | 1535,25, | 1535,26, | 1535,27, | 1535,28, | 1535,29, | 1535,30, | 1535,31, | 1535,32, | 1535,33, | 1535,34, | 1535,35, | 1535,36, | 1535,37, | 1535,38, | 1535,39, | 1535,40, | 1535,41, | 1535,42, | 1535,43, | 1535,44, | 1535,45, | 1535,46, | 1535,47, | 1535,48, | 1535,49, | 1535,50, | 1535,51, | 1535,52, | 1535,53, | 1535,54, | 1535,55, | 1535,56, | 1535,57, | 1535,58, | 1535,59, | 1535,60, | 1535,61, | 1535,62, | 1535,63, | 1535,64, | 1535,65, | 1535,66, | 1535,67, | 1535,68, | 1535,69, | 1535,70, | 1535,71, | 1535,72, | 1535,73, | 1535,74, | 1535,75, | 1535,76, | 1535,77, | 1535,78, | 1535,79, | 1535,80, | 1535,81, | 1535,82, | 1535,83, | 1535,84, | 1535,85, | 1536,1, | 1536,2, | 1536,3, | 1536,4, | 1536,5, | 1536,6, | 1536,7, | 1536,8, | 1536,9, | 1536,10, | 1536,11, | 1536,12, | 1536,13, | 1536,14, | 1536,15, | 1536,16, | 1536,17, | 1536,18, | 1536,19, | 1536,20, | 1536,21, | 1536,22, | 1536,23, | 1536,24, | 1536,25, | 1536,26, | 1536,27, | 1536,28, | 1536,29, | 1536,30, | 1536,31, | 1536,32, | 1536,33, | 1536,34, | 1536,35, | 1536,36, | 1536,37, | 1536,38, | 1536,39, | 1536,40, | 1536,41, | 1536,42, | 1536,43, | 1536,44, | 1536,45, | 1536,46, | 1536,47, | 1536,48, | 1536,49, | 1536,50, | 1536,51, | 1536,52, | 1536,53, | 1536,54, | 1536,55, | 1536,56, | 1536,57, | 1536,58, | 1536,59, | 1536,60, | 1536,61, | 1536,62, | 1536,63, | 1536,64, | 1536,65, | 1536,66, | 1536,67, | 1536,68, | 1536,69, | 1536,70, | 1536,71, | 1536,72, | 1536,73, | 1536,74, | 1536,75, | 1536,76, | 1536,77, | 1536,78, | 1536,79, | 1536,80, | 1536,81, | 1536,82, | 1536,83, | 1536,84, | 1536,85, | 1537,1, | 1537,2, | 1537,3, | 1537,4, | 1537,5, | 1537,6, | 1537,7, | 1537,8, | 1537,9, | 1537,10, | 1537,11, | 1537,12, | 1537,13, | 1537,14, | 1537,15, | 1537,16, | 1537,17, | 1537,18, | 1537,19, | 1537,20, | 1537,21, | 1537,22, | 1537,23, | 1537,24, | 1537,25, | 1537,26, | 1537,27, | 1537,28, | 1537,29, | 1537,30, | 1537,31, | 1537,32, | 1537,33, | 1537,34, | 1537,35, | 1537,36, | 1537,37, | 1537,38, | 1537,39, | 1537,40, | 1537,41, | 1537,42, | 1537,43, | 1537,44, | 1537,45, | 1537,46, | 1537,47, | 1537,48, | 1537,49, | 1537,50, | 1537,51, | 1537,52, | 1537,53, | 1537,54, | 1537,55, | 1537,56, | 1537,57, | 1537,58, | 1537,59, | 1537,60, | 1537,61, | 1537,62, | 1537,63, | 1537,64, | 1537,65, | 1537,66, | 1537,67, | 1537,68, | 1537,69, | 1537,70, | 1537,71, | 1537,72, | 1537,73, | 1537,74, | 1537,75, | 1537,76, | 1537,77, | 1537,78, | 1537,79, | 1537,80, | 1537,81, | 1537,82, | 1537,83, | 1537,84, | 1537,85, | 1538,1, | 1538,2, | 1538,3, | 1538,4, | 1538,5, | 1538,6, | 1538,7, | 1538,8, | 1538,9, | 1538,10, | 1538,11, | 1538,12, | 1538,13, | 1538,14, | 1538,15, | 1538,16, | 1538,17, | 1538,18, | 1538,19, | 1538,20, | 1538,21, | 1538,22, | 1538,23, | 1538,24, | 1538,25, | 1538,26, | 1538,27, | 1538,28, | 1538,29, | 1538,30, | 1538,31, | 1538,32, | 1538,33, | 1538,34, | 1538,35, | 1538,36, | 1538,37, | 1538,38, | 1538,39, | 1538,40, | 1538,41, | 1538,42, | 1538,43, | 1538,44, | 1538,45, | 1538,46, | 1538,47, | 1538,48, | 1538,49, | 1538,50, | 1538,51, | 1538,52, | 1538,53, | 1538,54, | 1538,55, | 1538,56, | 1538,57, | 1538,58, | 1538,59, | 1538,60, | 1538,61, | 1538,62, | 1538,63, | 1538,64, | 1538,65, | 1538,66, | 1538,67, | 1538,68, | 1538,69, | 1538,70, | 1538,71, | 1538,72, | 1538,73, | 1538,74, | 1538,75, | 1538,76, | 1538,77, | 1538,78, | 1538,79, | 1538,80, | 1538,81, | 1538,82, | 1538,83, | 1538,84, | 1538,85, | 1539,1, | 1539,2, | 1539,3, | 1539,4, | 1539,5, | 1539,6, | 1539,7, | 1539,8, | 1539,9, | 1539,10, | 1539,11, | 1539,12, | 1539,13, | 1539,14, | 1539,15, | 1539,16, | 1539,17, | 1539,18, | 1539,19, | 1539,20, | 1539,21, | 1539,22, | 1539,23, | 1539,24, | 1539,25, | 1539,26, | 1539,27, | 1539,28, | 1539,29, | 1539,30, | 1539,31, | 1539,32, | 1539,33, | 1539,34, | 1539,35, | 1539,36, | 1539,37, | 1539,38, | 1539,39, | 1539,40, | 1539,41, | 1539,42, | 1539,43, | 1539,44, | 1539,45, | 1539,46, | 1539,47, | 1539,48, | 1539,49, | 1539,50, | 1539,51, | 1539,52, | 1539,53, | 1539,54, | 1539,55, | 1539,56, | 1539,57, | 1539,58, | 1539,59, | 1539,60, | 1539,61, | 1539,62, | 1539,63, | 1539,64, | 1539,65, | 1539,66, | 1539,67, | 1539,68, | 1539,69, | 1539,70, | 1539,71, | 1539,72, | 1539,73, | 1539,74, | 1539,75, | 1539,76, | 1539,77, | 1539,78, | 1539,79, | 1539,80, | 1539,81, | 1539,82, | 1539,83, | 1539,84, | 1539,85, | 1540,1, | 1540,2, | 1540,3, | 1540,4, | 1540,5, | 1540,6, | 1540,7, | 1540,8, | 1540,9, | 1540,10, | 1540,11, | 1540,12, | 1540,13, | 1540,14, | 1540,15, | 1540,16, | 1540,17, | 1540,18, | 1540,19, | 1540,20, | 1540,21, | 1540,22, | 1540,23, | 1540,24, | 1540,25, | 1540,26, | 1540,27, | 1540,28, | 1540,29, | 1540,30, | 1540,31, | 1540,32, | 1540,33, | 1540,34, | 1540,35, | 1540,36, | 1540,37, | 1540,38, | 1540,39, | 1540,40, | 1540,41, | 1540,42, | 1540,43, | 1540,44, | 1540,45, | 1540,46, | 1540,47, | 1540,48, | 1540,49, | 1540,50, | 1540,51, | 1540,52, | 1540,53, | 1540,54, | 1540,55, | 1540,56, | 1540,57, | 1540,58, | 1540,59, | 1540,60, | 1540,61, | 1540,62, | 1540,63, | 1540,64, | 1540,65, | 1540,66, | 1540,67, | 1540,68, | 1540,69, | 1540,70, | 1540,71, | 1540,72, | 1540,73, | 1540,74, | 1540,75, | 1540,76, | 1540,77, | 1540,78, | 1540,79, | 1540,80, | 1540,81, | 1540,82, | 1540,83, | 1540,84, | 1540,85, | 1541,1, | 1541,2, | 1541,3, | 1541,4, | 1541,5, | 1541,6, | 1541,7, | 1541,8, | 1541,9, | 1541,10, | 1541,11, | 1541,12, | 1541,13, | 1541,14, | 1541,15, | 1541,16, | 1541,17, | 1541,18, | 1541,19, | 1541,20, | 1541,21, | 1541,22, | 1541,23, | 1541,24, | 1541,25, | 1541,26, | 1541,27, | 1541,28, | 1541,29, | 1541,30, | 1541,31, | 1541,32, | 1541,33, | 1541,34, | 1541,35, | 1541,36, | 1541,37, | 1541,38, | 1541,39, | 1541,40, | 1541,41, | 1541,42, | 1541,43, | 1541,44, | 1541,45, | 1541,46, | 1541,47, | 1541,48, | 1541,49, | 1541,50, | 1541,51, | 1541,52, | 1541,53, | 1541,54, | 1541,55, | 1541,56, | 1541,57, | 1541,58, | 1541,59, | 1541,60, | 1541,61, | 1541,62, | 1541,63, | 1541,64, | 1541,65, | 1541,66, | 1541,67, | 1541,68, | 1541,69, | 1541,70, | 1541,71, | 1541,72, | 1541,73, | 1541,74, | 1541,75, | 1541,76, | 1541,77, | 1541,78, | 1541,79, | 1541,80, | 1541,81, | 1541,82, | 1541,83, | 1541,84, | 1541,85, | 1542,1, | 1542,2, | 1542,3, | 1542,4, | 1542,5, | 1542,6, | 1542,7, | 1542,8, | 1542,9, | 1542,10, | 1542,11, | 1542,12, | 1542,13, | 1542,14, | 1542,15, | 1542,16, | 1542,17, | 1542,18, | 1542,19, | 1542,20, | 1542,21, | 1542,22, | 1542,23, | 1542,24, | 1542,25, | 1542,26, | 1542,27, | 1542,28, | 1542,29, | 1542,30, | 1542,31, | 1542,32, | 1542,33, | 1542,34, | 1542,35, | 1542,36, | 1542,37, | 1542,38, | 1542,39, | 1542,40, | 1542,41, | 1542,42, | 1542,43, | 1542,44, | 1542,45, | 1542,46, | 1542,47, | 1542,48, | 1542,49, | 1542,50, | 1542,51, | 1542,52, | 1542,53, | 1542,54, | 1542,55, | 1542,56, | 1542,57, | 1542,58, | 1542,59, | 1542,60, | 1542,61, | 1542,62, | 1542,63, | 1542,64, | 1542,65, | 1542,66, | 1542,67, | 1542,68, | 1542,69, | 1542,70, | 1542,71, | 1542,72, | 1542,73, | 1542,74, | 1542,75, | 1542,76, | 1542,77, | 1542,78, | 1542,79, | 1542,80, | 1542,81, | 1542,82, | 1542,83, | 1542,84, | 1542,85, | 1543,1, | 1543,2, | 1543,3, | 1543,4, | 1543,5, | 1543,6, | 1543,7, | 1543,8, | 1543,9, | 1543,10, | 1543,11, | 1543,12, | 1543,13, | 1543,14, | 1543,15, | 1543,16, | 1543,17, | 1543,18, | 1543,19, | 1543,20, | 1543,21, | 1543,22, | 1543,23, | 1543,24, | 1543,25, | 1543,26, | 1543,27, | 1543,28, | 1543,29, | 1543,30, | 1543,31, | 1543,32, | 1543,33, | 1543,34, | 1543,35, | 1543,36, | 1543,37, | 1543,38, | 1543,39, | 1543,40, | 1543,41, | 1543,42, | 1543,43, | 1543,44, | 1543,45, | 1543,46, | 1543,47, | 1543,48, | 1543,49, | 1543,50, | 1543,51, | 1543,52, | 1543,53, | 1543,54, | 1543,55, | 1543,56, | 1543,57, | 1543,58, | 1543,59, | 1543,60, | 1543,61, | 1543,62, | 1543,63, | 1543,64, | 1543,65, | 1543,66, | 1543,67, | 1543,68, | 1543,69, | 1543,70, | 1543,71, | 1543,72, | 1543,73, | 1543,74, | 1543,75, | 1543,76, | 1543,77, | 1543,78, | 1543,79, | 1543,80, | 1543,81, | 1543,82, | 1543,83, | 1543,84, | 1543,85, | 1544,1, | 1544,2, | 1544,3, | 1544,4, | 1544,5, | 1544,6, | 1544,7, | 1544,8, | 1544,9, | 1544,10, | 1544,11, | 1544,12, | 1544,13, | 1544,14, | 1544,15, | 1544,16, | 1544,17, | 1544,18, | 1544,19, | 1544,20, | 1544,21, | 1544,22, | 1544,23, | 1544,24, | 1544,25, | 1544,26, | 1544,27, | 1544,28, | 1544,29, | 1544,30, | 1544,31, | 1544,32, | 1544,33, | 1544,34, | 1544,35, | 1544,36, | 1544,37, | 1544,38, | 1544,39, | 1544,40, | 1544,41, | 1544,42, | 1544,43, | 1544,44, | 1544,45, | 1544,46, | 1544,47, | 1544,48, | 1544,49, | 1544,50, | 1544,51, | 1544,52, | 1544,53, | 1544,54, | 1544,55, | 1544,56, | 1544,57, | 1544,58, | 1544,59, | 1544,60, | 1544,61, | 1544,62, | 1544,63, | 1544,64, | 1544,65, | 1544,66, | 1544,67, | 1544,68, | 1544,69, | 1544,70, | 1544,71, | 1544,72, | 1544,73, | 1544,74, | 1544,75, | 1544,76, | 1544,77, | 1544,78, | 1544,79, | 1544,80, | 1544,81, | 1544,82, | 1544,83, | 1544,84, | 1544,85, | 1545,1, | 1545,2, | 1545,3, | 1545,4, | 1545,5, | 1545,6, | 1545,7, | 1545,8, | 1545,9, | 1545,10, | 1545,11, | 1545,12, | 1545,13, | 1545,14, | 1545,15, | 1545,16, | 1545,17, | 1545,18, | 1545,19, | 1545,20, | 1545,21, | 1545,22, | 1545,23, | 1545,24, | 1545,25, | 1545,26, | 1545,27, | 1545,28, | 1545,29, | 1545,30, | 1545,31, | 1545,32, | 1545,33, | 1545,34, | 1545,35, | 1545,36, | 1545,37, | 1545,38, | 1545,39, | 1545,40, | 1545,41, | 1545,42, | 1545,43, | 1545,44, | 1545,45, | 1545,46, | 1545,47, | 1545,48, | 1545,49, | 1545,50, | 1545,51, | 1545,52, | 1545,53, | 1545,54, | 1545,55, | 1545,56, | 1545,57, | 1545,58, | 1545,59, | 1545,60, | 1545,61, | 1545,62, | 1545,63, | 1545,64, | 1545,65, | 1545,66, | 1545,67, | 1545,68, | 1545,69, | 1545,70, | 1545,71, | 1545,72, | 1545,73, | 1545,74, | 1545,75, | 1545,76, | 1545,77, | 1545,78, | 1545,79, | 1545,80, | 1545,81, | 1545,82, | 1545,83, | 1545,84, | 1545,85, | 1546,1, | 1546,2, | 1546,3, | 1546,4, | 1546,5, | 1546,6, | 1546,7, | 1546,8, | 1546,9, | 1546,10, | 1546,11, | 1546,12, | 1546,13, | 1546,14, | 1546,15, | 1546,16, | 1546,17, | 1546,18, | 1546,19, | 1546,20, | 1546,21, | 1546,22, | 1546,23, | 1546,24, | 1546,25, | 1546,26, | 1546,27, | 1546,28, | 1546,29, | 1546,30, | 1546,31, | 1546,32, | 1546,33, | 1546,34, | 1546,35, | 1546,36, | 1546,37, | 1546,38, | 1546,39, | 1546,40, | 1546,41, | 1546,42, | 1546,43, | 1546,44, | 1546,45, | 1546,46, | 1546,47, | 1546,48, | 1546,49, | 1546,50, | 1546,51, | 1546,52, | 1546,53, | 1546,54, | 1546,55, | 1546,56, | 1546,57, | 1546,58, | 1546,59, | 1546,60, | 1546,61, | 1546,62, | 1546,63, | 1546,64, | 1546,65, | 1546,66, | 1546,67, | 1546,68, | 1546,69, | 1546,70, | 1546,71, | 1546,72, | 1546,73, | 1546,74, | 1546,75, | 1546,76, | 1546,77, | 1546,78, | 1546,79, | 1546,80, | 1546,81, | 1546,82, | 1546,83, | 1546,84, | 1546,85, | 1547,1, | 1547,2, | 1547,3, | 1547,4, | 1547,5, | 1547,6, | 1547,7, | 1547,8, | 1547,9, | 1547,10, | 1547,11, | 1547,12, | 1547,13, | 1547,14, | 1547,15, | 1547,16, | 1547,17, | 1547,18, | 1547,19, | 1547,20, | 1547,21, | 1547,22, | 1547,23, | 1547,24, | 1547,25, | 1547,26, | 1547,27, | 1547,28, | 1547,29, | 1547,30, | 1547,31, | 1547,32, | 1547,33, | 1547,34, | 1547,35, | 1547,36, | 1547,37, | 1547,38, | 1547,39, | 1547,40, | 1547,41, | 1547,42, | 1547,43, | 1547,44, | 1547,45, | 1547,46, | 1547,47, | 1547,48, | 1547,49, | 1547,50, | 1547,51, | 1547,52, | 1547,53, | 1547,54, | 1547,55, | 1547,56, | 1547,57, | 1547,58, | 1547,59, | 1547,60, | 1547,61, | 1547,62, | 1547,63, | 1547,64, | 1547,65, | 1547,66, | 1547,67, | 1547,68, | 1547,69, | 1547,70, | 1547,71, | 1547,72, | 1547,73, | 1547,74, | 1547,75, | 1547,76, | 1547,77, | 1547,78, | 1547,79, | 1547,80, | 1547,81, | 1547,82, | 1547,83, | 1547,84, | 1547,85, | 1548,1, | 1548,2, | 1548,3, | 1548,4, | 1548,5, | 1548,6, | 1548,7, | 1548,8, | 1548,9, | 1548,10, | 1548,11, | 1548,12, | 1548,13, | 1548,14, | 1548,15, | 1548,16, | 1548,17, | 1548,18, | 1548,19, | 1548,20, | 1548,21, | 1548,22, | 1548,23, | 1548,24, | 1548,25, | 1548,26, | 1548,27, | 1548,28, | 1548,29, | 1548,30, | 1548,31, | 1548,32, | 1548,33, | 1548,34, | 1548,35, | 1548,36, | 1548,37, | 1548,38, | 1548,39, | 1548,40, | 1548,41, | 1548,42, | 1548,43, | 1548,44, | 1548,45, | 1548,46, | 1548,47, | 1548,48, | 1548,49, | 1548,50, | 1548,51, | 1548,52, | 1548,53, | 1548,54, | 1548,55, | 1548,56, | 1548,57, | 1548,58, | 1548,59, | 1548,60, | 1548,61, | 1548,62, | 1548,63, | 1548,64, | 1548,65, | 1548,66, | 1548,67, | 1548,68, | 1548,69, | 1548,70, | 1548,71, | 1548,72, | 1548,73, | 1548,74, | 1548,75, | 1548,76, | 1548,77, | 1548,78, | 1548,79, | 1548,80, | 1548,81, | 1548,82, | 1548,83, | 1548,84, | 1548,85, | 1549,1, | 1549,2, | 1549,3, | 1549,4, | 1549,5, | 1549,6, | 1549,7, | 1549,8, | 1549,9, | 1549,10, | 1549,11, | 1549,12, | 1549,13, | 1549,14, | 1549,15, | 1549,16, | 1549,17, | 1549,18, | 1549,19, | 1549,20, | 1549,21, | 1549,22, | 1549,23, | 1549,24, | 1549,25, | 1549,26, | 1549,27, | 1549,28, | 1549,29, | 1549,30, | 1549,31, | 1549,32, | 1549,33, | 1549,34, | 1549,35, | 1549,36, | 1549,37, | 1549,38, | 1549,39, | 1549,40, | 1549,41, | 1549,42, | 1549,43, | 1549,44, | 1549,45, | 1549,46, | 1549,47, | 1549,48, | 1549,49, | 1549,50, | 1549,51, | 1549,52, | 1549,53, | 1549,54, | 1549,55, | 1549,56, | 1549,57, | 1549,58, | 1549,59, | 1549,60, | 1549,61, | 1549,62, | 1549,63, | 1549,64, | 1549,65, | 1549,66, | 1549,67, | 1549,68, | 1549,69, | 1549,70, | 1549,71, | 1549,72, | 1549,73, | 1549,74, | 1549,75, | 1549,76, | 1549,77, | 1549,78, | 1549,79, | 1549,80, | 1549,81, | 1549,82, | 1549,83, | 1549,84, | 1549,85, | 1550,1, | 1550,2, | 1550,3, | 1550,4, | 1550,5, | 1550,6, | 1550,7, | 1550,8, | 1550,9, | 1550,10, | 1550,11, | 1550,12, | 1550,13, | 1550,14, | 1550,15, | 1550,16, | 1550,17, | 1550,18, | 1550,19, | 1550,20, | 1550,21, | 1550,22, | 1550,23, | 1550,24, | 1550,25, | 1550,26, | 1550,27, | 1550,28, | 1550,29, | 1550,30, | 1550,31, | 1550,32, | 1550,33, | 1550,34, | 1550,35, | 1550,36, | 1550,37, | 1550,38, | 1550,39, | 1550,40, | 1550,41, | 1550,42, | 1550,43, | 1550,44, | 1550,45, | 1550,46, | 1550,47, | 1550,48, | 1550,49, | 1550,50, | 1550,51, | 1550,52, | 1550,53, | 1550,54, | 1550,55, | 1550,56, | 1550,57, | 1550,58, | 1550,59, | 1550,60, | 1550,61, | 1550,62, | 1550,63, | 1550,64, | 1550,65, | 1550,66, | 1550,67, | 1550,68, | 1550,69, | 1550,70, | 1550,71, | 1550,72, | 1550,73, | 1550,74, | 1550,75, | 1550,76, | 1550,77, | 1550,78, | 1550,79, | 1550,80, | 1550,81, | 1550,82, | 1550,83, | 1550,84, | 1550,85, | 1551,1, | 1551,2, | 1551,3, | 1551,4, | 1551,5, | 1551,6, | 1551,7, | 1551,8, | 1551,9, | 1551,10, | 1551,11, | 1551,12, | 1551,13, | 1551,14, | 1551,15, | 1551,16, | 1551,17, | 1551,18, | 1551,19, | 1551,20, | 1551,21, | 1551,22, | 1551,23, | 1551,24, | 1551,25, | 1551,26, | 1551,27, | 1551,28, | 1551,29, | 1551,30, | 1551,31, | 1551,32, | 1551,33, | 1551,34, | 1551,35, | 1551,36, | 1551,37, | 1551,38, | 1551,39, | 1551,40, | 1551,41, | 1551,42, | 1551,43, | 1551,44, | 1551,45, | 1551,46, | 1551,47, | 1551,48, | 1551,49, | 1551,50, | 1551,51, | 1551,52, | 1551,53, | 1551,54, | 1551,55, | 1551,56, | 1551,57, | 1551,58, | 1551,59, | 1551,60, | 1551,61, | 1551,62, | 1551,63, | 1551,64, | 1551,65, | 1551,66, | 1551,67, | 1551,68, | 1551,69, | 1551,70, | 1551,71, | 1551,72, | 1551,73, | 1551,74, | 1551,75, | 1551,76, | 1551,77, | 1551,78, | 1551,79, | 1551,80, | 1551,81, | 1551,82, | 1551,83, | 1551,84, | 1551,85, | 1552,1, | 1552,2, | 1552,3, | 1552,4, | 1552,5, | 1552,6, | 1552,7, | 1552,8, | 1552,9, | 1552,10, | 1552,11, | 1552,12, | 1552,13, | 1552,14, | 1552,15, | 1552,16, | 1552,17, | 1552,18, | 1552,19, | 1552,20, | 1552,21, | 1552,22, | 1552,23, | 1552,24, | 1552,25, | 1552,26, | 1552,27, | 1552,28, | 1552,29, | 1552,30, | 1552,31, | 1552,32, | 1552,33, | 1552,34, | 1552,35, | 1552,36, | 1552,37, | 1552,38, | 1552,39, | 1552,40, | 1552,41, | 1552,42, | 1552,43, | 1552,44, | 1552,45, | 1552,46, | 1552,47, | 1552,48, | 1552,49, | 1552,50, | 1552,51, | 1552,52, | 1552,53, | 1552,54, | 1552,55, | 1552,56, | 1552,57, | 1552,58, | 1552,59, | 1552,60, | 1552,61, | 1552,62, | 1552,63, | 1552,64, | 1552,65, | 1552,66, | 1552,67, | 1552,68, | 1552,69, | 1552,70, | 1552,71, | 1552,72, | 1552,73, | 1552,74, | 1552,75, | 1552,76, | 1552,77, | 1552,78, | 1552,79, | 1552,80, | 1552,81, | 1552,82, | 1552,83, | 1552,84, | 1552,85, | 1553,1, | 1553,2, | 1553,3, | 1553,4, | 1553,5, | 1553,6, | 1553,7, | 1553,8, | 1553,9, | 1553,10, | 1553,11, | 1553,12, | 1553,13, | 1553,14, | 1553,15, | 1553,16, | 1553,17, | 1553,18, | 1553,19, | 1553,20, | 1553,21, | 1553,22, | 1553,23, | 1553,24, | 1553,25, | 1553,26, | 1553,27, | 1553,28, | 1553,29, | 1553,30, | 1553,31, | 1553,32, | 1553,33, | 1553,34, | 1553,35, | 1553,36, | 1553,37, | 1553,38, | 1553,39, | 1553,40, | 1553,41, | 1553,42, | 1553,43, | 1553,44, | 1553,45, | 1553,46, | 1553,47, | 1553,48, | 1553,49, | 1553,50, | 1553,51, | 1553,52, | 1553,53, | 1553,54, | 1553,55, | 1553,56, | 1553,57, | 1553,58, | 1553,59, | 1553,60, | 1553,61, | 1553,62, | 1553,63, | 1553,64, | 1553,65, | 1553,66, | 1553,67, | 1553,68, | 1553,69, | 1553,70, | 1553,71, | 1553,72, | 1553,73, | 1553,74, | 1553,75, | 1553,76, | 1553,77, | 1553,78, | 1553,79, | 1553,80, | 1553,81, | 1553,82, | 1553,83, | 1553,84, | 1553,85, | 1554,1, | 1554,2, | 1554,3, | 1554,4, | 1554,5, | 1554,6, | 1554,7, | 1554,8, | 1554,9, | 1554,10, | 1554,11, | 1554,12, | 1554,13, | 1554,14, | 1554,15, | 1554,16, | 1554,17, | 1554,18, | 1554,19, | 1554,20, | 1554,21, | 1554,22, | 1554,23, | 1554,24, | 1554,25, | 1554,26, | 1554,27, | 1554,28, | 1554,29, | 1554,30, | 1554,31, | 1554,32, | 1554,33, | 1554,34, | 1554,35, | 1554,36, | 1554,37, | 1554,38, | 1554,39, | 1554,40, | 1554,41, | 1554,42, | 1554,43, | 1554,44, | 1554,45, | 1554,46, | 1554,47, | 1554,48, | 1554,49, | 1554,50, | 1554,51, | 1554,52, | 1554,53, | 1554,54, | 1554,55, | 1554,56, | 1554,57, | 1554,58, | 1554,59, | 1554,60, | 1554,61, | 1554,62, | 1554,63, | 1554,64, | 1554,65, | 1554,66, | 1554,67, | 1554,68, | 1554,69, | 1554,70, | 1554,71, | 1554,72, | 1554,73, | 1554,74, | 1554,75, | 1554,76, | 1554,77, | 1554,78, | 1554,79, | 1554,80, | 1554,81, | 1554,82, | 1554,83, | 1554,84, | 1554,85, | 1555,1, | 1555,2, | 1555,3, | 1555,4, | 1555,5, | 1555,6, | 1555,7, | 1555,8, | 1555,9, | 1555,10, | 1555,11, | 1555,12, | 1555,13, | 1555,14, | 1555,15, | 1555,16, | 1555,17, | 1555,18, | 1555,19, | 1555,20, | 1555,21, | 1555,22, | 1555,23, | 1555,24, | 1555,25, | 1555,26, | 1555,27, | 1555,28, | 1555,29, | 1555,30, | 1555,31, | 1555,32, | 1555,33, | 1555,34, | 1555,35, | 1555,36, | 1555,37, | 1555,38, | 1555,39, | 1555,40, | 1555,41, | 1555,42, | 1555,43, | 1555,44, | 1555,45, | 1555,46, | 1555,47, | 1555,48, | 1555,49, | 1555,50, | 1555,51, | 1555,52, | 1555,53, | 1555,54, | 1555,55, | 1555,56, | 1555,57, | 1555,58, | 1555,59, | 1555,60, | 1555,61, | 1555,62, | 1555,63, | 1555,64, | 1555,65, | 1555,66, | 1555,67, | 1555,68, | 1555,69, | 1555,70, | 1555,71, | 1555,72, | 1555,73, | 1555,74, | 1555,75, | 1555,76, | 1555,77, | 1555,78, | 1555,79, | 1555,80, | 1555,81, | 1555,82, | 1555,83, | 1555,84, | 1555,85, | 1556,1, | 1556,2, | 1556,3, | 1556,4, | 1556,5, | 1556,6, | 1556,7, | 1556,8, | 1556,9, | 1556,10, | 1556,11, | 1556,12, | 1556,13, | 1556,14, | 1556,15, | 1556,16, | 1556,17, | 1556,18, | 1556,19, | 1556,20, | 1556,21, | 1556,22, | 1556,23, | 1556,24, | 1556,25, | 1556,26, | 1556,27, | 1556,28, | 1556,29, | 1556,30, | 1556,31, | 1556,32, | 1556,33, | 1556,34, | 1556,35, | 1556,36, | 1556,37, | 1556,38, | 1556,39, | 1556,40, | 1556,41, | 1556,42, | 1556,43, | 1556,44, | 1556,45, | 1556,46, | 1556,47, | 1556,48, | 1556,49, | 1556,50, | 1556,51, | 1556,52, | 1556,53, | 1556,54, | 1556,55, | 1556,56, | 1556,57, | 1556,58, | 1556,59, | 1556,60, | 1556,61, | 1556,62, | 1556,63, | 1556,64, | 1556,65, | 1556,66, | 1556,67, | 1556,68, | 1556,69, | 1556,70, | 1556,71, | 1556,72, | 1556,73, | 1556,74, | 1556,75, | 1556,76, | 1556,77, | 1556,78, | 1556,79, | 1556,80, | 1556,81, | 1556,82, | 1556,83, | 1556,84, | 1556,85, | 1557,1, | 1557,2, | 1557,3, | 1557,4, | 1557,5, | 1557,6, | 1557,7, | 1557,8, | 1557,9, | 1557,10, | 1557,11, | 1557,12, | 1557,13, | 1557,14, | 1557,15, | 1557,16, | 1557,17, | 1557,18, | 1557,19, | 1557,20, | 1557,21, | 1557,22, | 1557,23, | 1557,24, | 1557,25, | 1557,26, | 1557,27, | 1557,28, | 1557,29, | 1557,30, | 1557,31, | 1557,32, | 1557,33, | 1557,34, | 1557,35, | 1557,36, | 1557,37, | 1557,38, | 1557,39, | 1557,40, | 1557,41, | 1557,42, | 1557,43, | 1557,44, | 1557,45, | 1557,46, | 1557,47, | 1557,48, | 1557,49, | 1557,50, | 1557,51, | 1557,52, | 1557,53, | 1557,54, | 1557,55, | 1557,56, | 1557,57, | 1557,58, | 1557,59, | 1557,60, | 1557,61, | 1557,62, | 1557,63, | 1557,64, | 1557,65, | 1557,66, | 1557,67, | 1557,68, | 1557,69, | 1557,70, | 1557,71, | 1557,72, | 1557,73, | 1557,74, | 1557,75, | 1557,76, | 1557,77, | 1557,78, | 1557,79, | 1557,80, | 1557,81, | 1557,82, | 1557,83, | 1557,84, | 1557,85, | 1558,1, | 1558,2, | 1558,3, | 1558,4, | 1558,5, | 1558,6, | 1558,7, | 1558,8, | 1558,9, | 1558,10, | 1558,11, | 1558,12, | 1558,13, | 1558,14, | 1558,15, | 1558,16, | 1558,17, | 1558,18, | 1558,19, | 1558,20, | 1558,21, | 1558,22, | 1558,23, | 1558,24, | 1558,25, | 1558,26, | 1558,27, | 1558,28, | 1558,29, | 1558,30, | 1558,31, | 1558,32, | 1558,33, | 1558,34, | 1558,35, | 1558,36, | 1558,37, | 1558,38, | 1558,39, | 1558,40, | 1558,41, | 1558,42, | 1558,43, | 1558,44, | 1558,45, | 1558,46, | 1558,47, | 1558,48, | 1558,49, | 1558,50, | 1558,51, | 1558,52, | 1558,53, | 1558,54, | 1558,55, | 1558,56, | 1558,57, | 1558,58, | 1558,59, | 1558,60, | 1558,61, | 1558,62, | 1558,63, | 1558,64, | 1558,65, | 1558,66, | 1558,67, | 1558,68, | 1558,69, | 1558,70, | 1558,71, | 1558,72, | 1558,73, | 1558,74, | 1558,75, | 1558,76, | 1558,77, | 1558,78, | 1558,79, | 1558,80, | 1558,81, | 1558,82, | 1558,83, | 1558,84, | 1558,85, | 1559,1, | 1559,2, | 1559,3, | 1559,4, | 1559,5, | 1559,6, | 1559,7, | 1559,8, | 1559,9, | 1559,10, | 1559,11, | 1559,12, | 1559,13, | 1559,14, | 1559,15, | 1559,16, | 1559,17, | 1559,18, | 1559,19, | 1559,20, | 1559,21, | 1559,22, | 1559,23, | 1559,24, | 1559,25, | 1559,26, | 1559,27, | 1559,28, | 1559,29, | 1559,30, | 1559,31, | 1559,32, | 1559,33, | 1559,34, | 1559,35, | 1559,36, | 1559,37, | 1559,38, | 1559,39, | 1559,40, | 1559,41, | 1559,42, | 1559,43, | 1559,44, | 1559,45, | 1559,46, | 1559,47, | 1559,48, | 1559,49, | 1559,50, | 1559,51, | 1559,52, | 1559,53, | 1559,54, | 1559,55, | 1559,56, | 1559,57, | 1559,58, | 1559,59, | 1559,60, | 1559,61, | 1559,62, | 1559,63, | 1559,64, | 1559,65, | 1559,66, | 1559,67, | 1559,68, | 1559,69, | 1559,70, | 1559,71, | 1559,72, | 1559,73, | 1559,74, | 1559,75, | 1559,76, | 1559,77, | 1559,78, | 1559,79, | 1559,80, | 1559,81, | 1559,82, | 1559,83, | 1559,84, | 1559,85, | 1560,1, | 1560,2, | 1560,3, | 1560,4, | 1560,5, | 1560,6, | 1560,7, | 1560,8, | 1560,9, | 1560,10, | 1560,11, | 1560,12, | 1560,13, | 1560,14, | 1560,15, | 1560,16, | 1560,17, | 1560,18, | 1560,19, | 1560,20, | 1560,21, | 1560,22, | 1560,23, | 1560,24, | 1560,25, | 1560,26, | 1560,27, | 1560,28, | 1560,29, | 1560,30, | 1560,31, | 1560,32, | 1560,33, | 1560,34, | 1560,35, | 1560,36, | 1560,37, | 1560,38, | 1560,39, | 1560,40, | 1560,41, | 1560,42, | 1560,43, | 1560,44, | 1560,45, | 1560,46, | 1560,47, | 1560,48, | 1560,49, | 1560,50, | 1560,51, | 1560,52, | 1560,53, | 1560,54, | 1560,55, | 1560,56, | 1560,57, | 1560,58, | 1560,59, | 1560,60, | 1560,61, | 1560,62, | 1560,63, | 1560,64, | 1560,65, | 1560,66, | 1560,67, | 1560,68, | 1560,69, | 1560,70, | 1560,71, | 1560,72, | 1560,73, | 1560,74, | 1560,75, | 1560,76, | 1560,77, | 1560,78, | 1560,79, | 1560,80, | 1560,81, | 1560,82, | 1560,83, | 1560,84, | 1560,85, | 1561,1, | 1561,2, | 1561,3, | 1561,4, | 1561,5, | 1561,6, | 1561,7, | 1561,8, | 1561,9, | 1561,10, | 1561,11, | 1561,12, | 1561,13, | 1561,14, | 1561,15, | 1561,16, | 1561,17, | 1561,18, | 1561,19, | 1561,20, | 1561,21, | 1561,22, | 1561,23, | 1561,24, | 1561,25, | 1561,26, | 1561,27, | 1561,28, | 1561,29, | 1561,30, | 1561,31, | 1561,32, | 1561,33, | 1561,34, | 1561,35, | 1561,36, | 1561,37, | 1561,38, | 1561,39, | 1561,40, | 1561,41, | 1561,42, | 1561,43, | 1561,44, | 1561,45, | 1561,46, | 1561,47, | 1561,48, | 1561,49, | 1561,50, | 1561,51, | 1561,52, | 1561,53, | 1561,54, | 1561,55, | 1561,56, | 1561,57, | 1561,58, | 1561,59, | 1561,60, | 1561,61, | 1561,62, | 1561,63, | 1561,64, | 1561,65, | 1561,66, | 1561,67, | 1561,68, | 1561,69, | 1561,70, | 1561,71, | 1561,72, | 1561,73, | 1561,74, | 1561,75, | 1561,76, | 1561,77, | 1561,78, | 1561,79, | 1561,80, | 1561,81, | 1561,82, | 1561,83, | 1561,84, | 1561,85, | 1562,1, | 1562,2, | 1562,3, | 1562,4, | 1562,5, | 1562,6, | 1562,7, | 1562,8, | 1562,9, | 1562,10, | 1562,11, | 1562,12, | 1562,13, | 1562,14, | 1562,15, | 1562,16, | 1562,17, | 1562,18, | 1562,19, | 1562,20, | 1562,21, | 1562,22, | 1562,23, | 1562,24, | 1562,25, | 1562,26, | 1562,27, | 1562,28, | 1562,29, | 1562,30, | 1562,31, | 1562,32, | 1562,33, | 1562,34, | 1562,35, | 1562,36, | 1562,37, | 1562,38, | 1562,39, | 1562,40, | 1562,41, | 1562,42, | 1562,43, | 1562,44, | 1562,45, | 1562,46, | 1562,47, | 1562,48, | 1562,49, | 1562,50, | 1562,51, | 1562,52, | 1562,53, | 1562,54, | 1562,55, | 1562,56, | 1562,57, | 1562,58, | 1562,59, | 1562,60, | 1562,61, | 1562,62, | 1562,63, | 1562,64, | 1562,65, | 1562,66, | 1562,67, | 1562,68, | 1562,69, | 1562,70, | 1562,71, | 1562,72, | 1562,73, | 1562,74, | 1562,75, | 1562,76, | 1562,77, | 1562,78, | 1562,79, | 1562,80, | 1562,81, | 1562,82, | 1562,83, | 1562,84, | 1562,85, | 1563,1, | 1563,2, | 1563,3, | 1563,4, | 1563,5, | 1563,6, | 1563,7, | 1563,8, | 1563,9, | 1563,10, | 1563,11, | 1563,12, | 1563,13, | 1563,14, | 1563,15, | 1563,16, | 1563,17, | 1563,18, | 1563,19, | 1563,20, | 1563,21, | 1563,22, | 1563,23, | 1563,24, | 1563,25, | 1563,26, | 1563,27, | 1563,28, | 1563,29, | 1563,30, | 1563,31, | 1563,32, | 1563,33, | 1563,34, | 1563,35, | 1563,36, | 1563,37, | 1563,38, | 1563,39, | 1563,40, | 1563,41, | 1563,42, | 1563,43, | 1563,44, | 1563,45, | 1563,46, | 1563,47, | 1563,48, | 1563,49, | 1563,50, | 1563,51, | 1563,52, | 1563,53, | 1563,54, | 1563,55, | 1563,56, | 1563,57, | 1563,58, | 1563,59, | 1563,60, | 1563,61, | 1563,62, | 1563,63, | 1563,64, | 1563,65, | 1563,66, | 1563,67, | 1563,68, | 1563,69, | 1563,70, | 1563,71, | 1563,72, | 1563,73, | 1563,74, | 1563,75, | 1563,76, | 1563,77, | 1563,78, | 1563,79, | 1563,80, | 1563,81, | 1563,82, | 1563,83, | 1563,84, | 1563,85, | 1564,1, | 1564,2, | 1564,3, | 1564,4, | 1564,5, | 1564,6, | 1564,7, | 1564,8, | 1564,9, | 1564,10, | 1564,11, | 1564,12, | 1564,13, | 1564,14, | 1564,15, | 1564,16, | 1564,17, | 1564,18, | 1564,19, | 1564,20, | 1564,21, | 1564,22, | 1564,23, | 1564,24, | 1564,25, | 1564,26, | 1564,27, | 1564,28, | 1564,29, | 1564,30, | 1564,31, | 1564,32, | 1564,33, | 1564,34, | 1564,35, | 1564,36, | 1564,37, | 1564,38, | 1564,39, | 1564,40, | 1564,41, | 1564,42, | 1564,43, | 1564,44, | 1564,45, | 1564,46, | 1564,47, | 1564,48, | 1564,49, | 1564,50, | 1564,51, | 1564,52, | 1564,53, | 1564,54, | 1564,55, | 1564,56, | 1564,57, | 1564,58, | 1564,59, | 1564,60, | 1564,61, | 1564,62, | 1564,63, | 1564,64, | 1564,65, | 1564,66, | 1564,67, | 1564,68, | 1564,69, | 1564,70, | 1564,71, | 1564,72, | 1564,73, | 1564,74, | 1564,75, | 1564,76, | 1564,77, | 1564,78, | 1564,79, | 1564,80, | 1564,81, | 1564,82, | 1564,83, | 1564,84, | 1564,85, | 1565,1, | 1565,2, | 1565,3, | 1565,4, | 1565,5, | 1565,6, | 1565,7, | 1565,8, | 1565,9, | 1565,10, | 1565,11, | 1565,12, | 1565,13, | 1565,14, | 1565,15, | 1565,16, | 1565,17, | 1565,18, | 1565,19, | 1565,20, | 1565,21, | 1565,22, | 1565,23, | 1565,24, | 1565,25, | 1565,26, | 1565,27, | 1565,28, | 1565,29, | 1565,30, | 1565,31, | 1565,32, | 1565,33, | 1565,34, | 1565,35, | 1565,36, | 1565,37, | 1565,38, | 1565,39, | 1565,40, | 1565,41, | 1565,42, | 1565,43, | 1565,44, | 1565,45, | 1565,46, | 1565,47, | 1565,48, | 1565,49, | 1565,50, | 1565,51, | 1565,52, | 1565,53, | 1565,54, | 1565,55, | 1565,56, | 1565,57, | 1565,58, | 1565,59, | 1565,60, | 1565,61, | 1565,62, | 1565,63, | 1565,64, | 1565,65, | 1565,66, | 1565,67, | 1565,68, | 1565,69, | 1565,70, | 1565,71, | 1565,72, | 1565,73, | 1565,74, | 1565,75, | 1565,76, | 1565,77, | 1565,78, | 1565,79, | 1565,80, | 1565,81, | 1565,82, | 1565,83, | 1565,84, | 1565,85, | 1566,1, | 1566,2, | 1566,3, | 1566,4, | 1566,5, | 1566,6, | 1566,7, | 1566,8, | 1566,9, | 1566,10, | 1566,11, | 1566,12, | 1566,13, | 1566,14, | 1566,15, | 1566,16, | 1566,17, | 1566,18, | 1566,19, | 1566,20, | 1566,21, | 1566,22, | 1566,23, | 1566,24, | 1566,25, | 1566,26, | 1566,27, | 1566,28, | 1566,29, | 1566,30, | 1566,31, | 1566,32, | 1566,33, | 1566,34, | 1566,35, | 1566,36, | 1566,37, | 1566,38, | 1566,39, | 1566,40, | 1566,41, | 1566,42, | 1566,43, | 1566,44, | 1566,45, | 1566,46, | 1566,47, | 1566,48, | 1566,49, | 1566,50, | 1566,51, | 1566,52, | 1566,53, | 1566,54, | 1566,55, | 1566,56, | 1566,57, | 1566,58, | 1566,59, | 1566,60, | 1566,61, | 1566,62, | 1566,63, | 1566,64, | 1566,65, | 1566,66, | 1566,67, | 1566,68, | 1566,69, | 1566,70, | 1566,71, | 1566,72, | 1566,73, | 1566,74, | 1566,75, | 1566,76, | 1566,77, | 1566,78, | 1566,79, | 1566,80, | 1566,81, | 1566,82, | 1566,83, | 1566,84, | 1566,85, | 1567,1, | 1567,2, | 1567,3, | 1567,4, | 1567,5, | 1567,6, | 1567,7, | 1567,8, | 1567,9, | 1567,10, | 1567,11, | 1567,12, | 1567,13, | 1567,14, | 1567,15, | 1567,16, | 1567,17, | 1567,18, | 1567,19, | 1567,20, | 1567,21, | 1567,22, | 1567,23, | 1567,24, | 1567,25, | 1567,26, | 1567,27, | 1567,28, | 1567,29, | 1567,30, | 1567,31, | 1567,32, | 1567,33, | 1567,34, | 1567,35, | 1567,36, | 1567,37, | 1567,38, | 1567,39, | 1567,40, | 1567,41, | 1567,42, | 1567,43, | 1567,44, | 1567,45, | 1567,46, | 1567,47, | 1567,48, | 1567,49, | 1567,50, | 1567,51, | 1567,52, | 1567,53, | 1567,54, | 1567,55, | 1567,56, | 1567,57, | 1567,58, | 1567,59, | 1567,60, | 1567,61, | 1567,62, | 1567,63, | 1567,64, | 1567,65, | 1567,66, | 1567,67, | 1567,68, | 1567,69, | 1567,70, | 1567,71, | 1567,72, | 1567,73, | 1567,74, | 1567,75, | 1567,76, | 1567,77, | 1567,78, | 1567,79, | 1567,80, | 1567,81, | 1567,82, | 1567,83, | 1567,84, | 1567,85, | 1568,1, | 1568,2, | 1568,3, | 1568,4, | 1568,5, | 1568,6, | 1568,7, | 1568,8, | 1568,9, | 1568,10, | 1568,11, | 1568,12, | 1568,13, | 1568,14, | 1568,15, | 1568,16, | 1568,17, | 1568,18, | 1568,19, | 1568,20, | 1568,21, | 1568,22, | 1568,23, | 1568,24, | 1568,25, | 1568,26, | 1568,27, | 1568,28, | 1568,29, | 1568,30, | 1568,31, | 1568,32, | 1568,33, | 1568,34, | 1568,35, | 1568,36, | 1568,37, | 1568,38, | 1568,39, | 1568,40, | 1568,41, | 1568,42, | 1568,43, | 1568,44, | 1568,45, | 1568,46, | 1568,47, | 1568,48, | 1568,49, | 1568,50, | 1568,51, | 1568,52, | 1568,53, | 1568,54, | 1568,55, | 1568,56, | 1568,57, | 1568,58, | 1568,59, | 1568,60, | 1568,61, | 1568,62, | 1568,63, | 1568,64, | 1568,65, | 1568,66, | 1568,67, | 1568,68, | 1568,69, | 1568,70, | 1568,71, | 1568,72, | 1568,73, | 1568,74, | 1568,75, | 1568,76, | 1568,77, | 1568,78, | 1568,79, | 1568,80, | 1568,81, | 1568,82, | 1568,83, | 1568,84, | 1568,85, | 1569,1, | 1569,2, | 1569,3, | 1569,4, | 1569,5, | 1569,6, | 1569,7, | 1569,8, | 1569,9, | 1569,10, | 1569,11, | 1569,12, | 1569,13, | 1569,14, | 1569,15, | 1569,16, | 1569,17, | 1569,18, | 1569,19, | 1569,20, | 1569,21, | 1569,22, | 1569,23, | 1569,24, | 1569,25, | 1569,26, | 1569,27, | 1569,28, | 1569,29, | 1569,30, | 1569,31, | 1569,32, | 1569,33, | 1569,34, | 1569,35, | 1569,36, | 1569,37, | 1569,38, | 1569,39, | 1569,40, | 1569,41, | 1569,42, | 1569,43, | 1569,44, | 1569,45, | 1569,46, | 1569,47, | 1569,48, | 1569,49, | 1569,50, | 1569,51, | 1569,52, | 1569,53, | 1569,54, | 1569,55, | 1569,56, | 1569,57, | 1569,58, | 1569,59, | 1569,60, | 1569,61, | 1569,62, | 1569,63, | 1569,64, | 1569,65, | 1569,66, | 1569,67, | 1569,68, | 1569,69, | 1569,70, | 1569,71, | 1569,72, | 1569,73, | 1569,74, | 1569,75, | 1569,76, | 1569,77, | 1569,78, | 1569,79, | 1569,80, | 1569,81, | 1569,82, | 1569,83, | 1569,84, | 1569,85, | 1570,1, | 1570,2, | 1570,3, | 1570,4, | 1570,5, | 1570,6, | 1570,7, | 1570,8, | 1570,9, | 1570,10, | 1570,11, | 1570,12, | 1570,13, | 1570,14, | 1570,15, | 1570,16, | 1570,17, | 1570,18, | 1570,19, | 1570,20, | 1570,21, | 1570,22, | 1570,23, | 1570,24, | 1570,25, | 1570,26, | 1570,27, | 1570,28, | 1570,29, | 1570,30, | 1570,31, | 1570,32, | 1570,33, | 1570,34, | 1570,35, | 1570,36, | 1570,37, | 1570,38, | 1570,39, | 1570,40, | 1570,41, | 1570,42, | 1570,43, | 1570,44, | 1570,45, | 1570,46, | 1570,47, | 1570,48, | 1570,49, | 1570,50, | 1570,51, | 1570,52, | 1570,53, | 1570,54, | 1570,55, | 1570,56, | 1570,57, | 1570,58, | 1570,59, | 1570,60, | 1570,61, | 1570,62, | 1570,63, | 1570,64, | 1570,65, | 1570,66, | 1570,67, | 1570,68, | 1570,69, | 1570,70, | 1570,71, | 1570,72, | 1570,73, | 1570,74, | 1570,75, | 1570,76, | 1570,77, | 1570,78, | 1570,79, | 1570,80, | 1570,81, | 1570,82, | 1570,83, | 1570,84, | 1570,85, | 1571,1, | 1571,2, | 1571,3, | 1571,4, | 1571,5, | 1571,6, | 1571,7, | 1571,8, | 1571,9, | 1571,10, | 1571,11, | 1571,12, | 1571,13, | 1571,14, | 1571,15, | 1571,16, | 1571,17, | 1571,18, | 1571,19, | 1571,20, | 1571,21, | 1571,22, | 1571,23, | 1571,24, | 1571,25, | 1571,26, | 1571,27, | 1571,28, | 1571,29, | 1571,30, | 1571,31, | 1571,32, | 1571,33, | 1571,34, | 1571,35, | 1571,36, | 1571,37, | 1571,38, | 1571,39, | 1571,40, | 1571,41, | 1571,42, | 1571,43, | 1571,44, | 1571,45, | 1571,46, | 1571,47, | 1571,48, | 1571,49, | 1571,50, | 1571,51, | 1571,52, | 1571,53, | 1571,54, | 1571,55, | 1571,56, | 1571,57, | 1571,58, | 1571,59, | 1571,60, | 1571,61, | 1571,62, | 1571,63, | 1571,64, | 1571,65, | 1571,66, | 1571,67, | 1571,68, | 1571,69, | 1571,70, | 1571,71, | 1571,72, | 1571,73, | 1571,74, | 1571,75, | 1571,76, | 1571,77, | 1571,78, | 1571,79, | 1571,80, | 1571,81, | 1571,82, | 1571,83, | 1571,84, | 1571,85, | 1572,1, | 1572,2, | 1572,3, | 1572,4, | 1572,5, | 1572,6, | 1572,7, | 1572,8, | 1572,9, | 1572,10, | 1572,11, | 1572,12, | 1572,13, | 1572,14, | 1572,15, | 1572,16, | 1572,17, | 1572,18, | 1572,19, | 1572,20, | 1572,21, | 1572,22, | 1572,23, | 1572,24, | 1572,25, | 1572,26, | 1572,27, | 1572,28, | 1572,29, | 1572,30, | 1572,31, | 1572,32, | 1572,33, | 1572,34, | 1572,35, | 1572,36, | 1572,37, | 1572,38, | 1572,39, | 1572,40, | 1572,41, | 1572,42, | 1572,43, | 1572,44, | 1572,45, | 1572,46, | 1572,47, | 1572,48, | 1572,49, | 1572,50, | 1572,51, | 1572,52, | 1572,53, | 1572,54, | 1572,55, | 1572,56, | 1572,57, | 1572,58, | 1572,59, | 1572,60, | 1572,61, | 1572,62, | 1572,63, | 1572,64, | 1572,65, | 1572,66, | 1572,67, | 1572,68, | 1572,69, | 1572,70, | 1572,71, | 1572,72, | 1572,73, | 1572,74, | 1572,75, | 1572,76, | 1572,77, | 1572,78, | 1572,79, | 1572,80, | 1572,81, | 1572,82, | 1572,83, | 1572,84, | 1572,85, | 1573,1, | 1573,2, | 1573,3, | 1573,4, | 1573,5, | 1573,6, | 1573,7, | 1573,8, | 1573,9, | 1573,10, | 1573,11, | 1573,12, | 1573,13, | 1573,14, | 1573,15, | 1573,16, | 1573,17, | 1573,18, | 1573,19, | 1573,20, | 1573,21, | 1573,22, | 1573,23, | 1573,24, | 1573,25, | 1573,26, | 1573,27, | 1573,28, | 1573,29, | 1573,30, | 1573,31, | 1573,32, | 1573,33, | 1573,34, | 1573,35, | 1573,36, | 1573,37, | 1573,38, | 1573,39, | 1573,40, | 1573,41, | 1573,42, | 1573,43, | 1573,44, | 1573,45, | 1573,46, | 1573,47, | 1573,48, | 1573,49, | 1573,50, | 1573,51, | 1573,52, | 1573,53, | 1573,54, | 1573,55, | 1573,56, | 1573,57, | 1573,58, | 1573,59, | 1573,60, | 1573,61, | 1573,62, | 1573,63, | 1573,64, | 1573,65, | 1573,66, | 1573,67, | 1573,68, | 1573,69, | 1573,70, | 1573,71, | 1573,72, | 1573,73, | 1573,74, | 1573,75, | 1573,76, | 1573,77, | 1573,78, | 1573,79, | 1573,80, | 1573,81, | 1573,82, | 1573,83, | 1573,84, | 1573,85, | 1574,1, | 1574,2, | 1574,3, | 1574,4, | 1574,5, | 1574,6, | 1574,7, | 1574,8, | 1574,9, | 1574,10, | 1574,11, | 1574,12, | 1574,13, | 1574,14, | 1574,15, | 1574,16, | 1574,17, | 1574,18, | 1574,19, | 1574,20, | 1574,21, | 1574,22, | 1574,23, | 1574,24, | 1574,25, | 1574,26, | 1574,27, | 1574,28, | 1574,29, | 1574,30, | 1574,31, | 1574,32, | 1574,33, | 1574,34, | 1574,35, | 1574,36, | 1574,37, | 1574,38, | 1574,39, | 1574,40, | 1574,41, | 1574,42, | 1574,43, | 1574,44, | 1574,45, | 1574,46, | 1574,47, | 1574,48, | 1574,49, | 1574,50, | 1574,51, | 1574,52, | 1574,53, | 1574,54, | 1574,55, | 1574,56, | 1574,57, | 1574,58, | 1574,59, | 1574,60, | 1574,61, | 1574,62, | 1574,63, | 1574,64, | 1574,65, | 1574,66, | 1574,67, | 1574,68, | 1574,69, | 1574,70, | 1574,71, | 1574,72, | 1574,73, | 1574,74, | 1574,75, | 1574,76, | 1574,77, | 1574,78, | 1574,79, | 1574,80, | 1574,81, | 1574,82, | 1574,83, | 1574,84, | 1574,85, | 1575,1, | 1575,2, | 1575,3, | 1575,4, | 1575,5, | 1575,6, | 1575,7, | 1575,8, | 1575,9, | 1575,10, | 1575,11, | 1575,12, | 1575,13, | 1575,14, | 1575,15, | 1575,16, | 1575,17, | 1575,18, | 1575,19, | 1575,20, | 1575,21, | 1575,22, | 1575,23, | 1575,24, | 1575,25, | 1575,26, | 1575,27, | 1575,28, | 1575,29, | 1575,30, | 1575,31, | 1575,32, | 1575,33, | 1575,34, | 1575,35, | 1575,36, | 1575,37, | 1575,38, | 1575,39, | 1575,40, | 1575,41, | 1575,42, | 1575,43, | 1575,44, | 1575,45, | 1575,46, | 1575,47, | 1575,48, | 1575,49, | 1575,50, | 1575,51, | 1575,52, | 1575,53, | 1575,54, | 1575,55, | 1575,56, | 1575,57, | 1575,58, | 1575,59, | 1575,60, | 1575,61, | 1575,62, | 1575,63, | 1575,64, | 1575,65, | 1575,66, | 1575,67, | 1575,68, | 1575,69, | 1575,70, | 1575,71, | 1575,72, | 1575,73, | 1575,74, | 1575,75, | 1575,76, | 1575,77, | 1575,78, | 1575,79, | 1575,80, | 1575,81, | 1575,82, | 1575,83, | 1575,84, | 1575,85, | 1576,1, | 1576,2, | 1576,3, | 1576,4, | 1576,5, | 1576,6, | 1576,7, | 1576,8, | 1576,9, | 1576,10, | 1576,11, | 1576,12, | 1576,13, | 1576,14, | 1576,15, | 1576,16, | 1576,17, | 1576,18, | 1576,19, | 1576,20, | 1576,21, | 1576,22, | 1576,23, | 1576,24, | 1576,25, | 1576,26, | 1576,27, | 1576,28, | 1576,29, | 1576,30, | 1576,31, | 1576,32, | 1576,33, | 1576,34, | 1576,35, | 1576,36, | 1576,37, | 1576,38, | 1576,39, | 1576,40, | 1576,41, | 1576,42, | 1576,43, | 1576,44, | 1576,45, | 1576,46, | 1576,47, | 1576,48, | 1576,49, | 1576,50, | 1576,51, | 1576,52, | 1576,53, | 1576,54, | 1576,55, | 1576,56, | 1576,57, | 1576,58, | 1576,59, | 1576,60, | 1576,61, | 1576,62, | 1576,63, | 1576,64, | 1576,65, | 1576,66, | 1576,67, | 1576,68, | 1576,69, | 1576,70, | 1576,71, | 1576,72, | 1576,73, | 1576,74, | 1576,75, | 1576,76, | 1576,77, | 1576,78, | 1576,79, | 1576,80, | 1576,81, | 1576,82, | 1576,83, | 1576,84, | 1576,85, | 1577,1, | 1577,2, | 1577,3, | 1577,4, | 1577,5, | 1577,6, | 1577,7, | 1577,8, | 1577,9, | 1577,10, | 1577,11, | 1577,12, | 1577,13, | 1577,14, | 1577,15, | 1577,16, | 1577,17, | 1577,18, | 1577,19, | 1577,20, | 1577,21, | 1577,22, | 1577,23, | 1577,24, | 1577,25, | 1577,26, | 1577,27, | 1577,28, | 1577,29, | 1577,30, | 1577,31, | 1577,32, | 1577,33, | 1577,34, | 1577,35, | 1577,36, | 1577,37, | 1577,38, | 1577,39, | 1577,40, | 1577,41, | 1577,42, | 1577,43, | 1577,44, | 1577,45, | 1577,46, | 1577,47, | 1577,48, | 1577,49, | 1577,50, | 1577,51, | 1577,52, | 1577,53, | 1577,54, | 1577,55, | 1577,56, | 1577,57, | 1577,58, | 1577,59, | 1577,60, | 1577,61, | 1577,62, | 1577,63, | 1577,64, | 1577,65, | 1577,66, | 1577,67, | 1577,68, | 1577,69, | 1577,70, | 1577,71, | 1577,72, | 1577,73, | 1577,74, | 1577,75, | 1577,76, | 1577,77, | 1577,78, | 1577,79, | 1577,80, | 1577,81, | 1577,82, | 1577,83, | 1577,84, | 1577,85, | 1578,1, | 1578,2, | 1578,3, | 1578,4, | 1578,5, | 1578,6, | 1578,7, | 1578,8, | 1578,9, | 1578,10, | 1578,11, | 1578,12, | 1578,13, | 1578,14, | 1578,15, | 1578,16, | 1578,17, | 1578,18, | 1578,19, | 1578,20, | 1578,21, | 1578,22, | 1578,23, | 1578,24, | 1578,25, | 1578,26, | 1578,27, | 1578,28, | 1578,29, | 1578,30, | 1578,31, | 1578,32, | 1578,33, | 1578,34, | 1578,35, | 1578,36, | 1578,37, | 1578,38, | 1578,39, | 1578,40, | 1578,41, | 1578,42, | 1578,43, | 1578,44, | 1578,45, | 1578,46, | 1578,47, | 1578,48, | 1578,49, | 1578,50, | 1578,51, | 1578,52, | 1578,53, | 1578,54, | 1578,55, | 1578,56, | 1578,57, | 1578,58, | 1578,59, | 1578,60, | 1578,61, | 1578,62, | 1578,63, | 1578,64, | 1578,65, | 1578,66, | 1578,67, | 1578,68, | 1578,69, | 1578,70, | 1578,71, | 1578,72, | 1578,73, | 1578,74, | 1578,75, | 1578,76, | 1578,77, | 1578,78, | 1578,79, | 1578,80, | 1578,81, | 1578,82, | 1578,83, | 1578,84, | 1578,85, | 1579,1, | 1579,2, | 1579,3, | 1579,4, | 1579,5, | 1579,6, | 1579,7, | 1579,8, | 1579,9, | 1579,10, | 1579,11, | 1579,12, | 1579,13, | 1579,14, | 1579,15, | 1579,16, | 1579,17, | 1579,18, | 1579,19, | 1579,20, | 1579,21, | 1579,22, | 1579,23, | 1579,24, | 1579,25, | 1579,26, | 1579,27, | 1579,28, | 1579,29, | 1579,30, | 1579,31, | 1579,32, | 1579,33, | 1579,34, | 1579,35, | 1579,36, | 1579,37, | 1579,38, | 1579,39, | 1579,40, | 1579,41, | 1579,42, | 1579,43, | 1579,44, | 1579,45, | 1579,46, | 1579,47, | 1579,48, | 1579,49, | 1579,50, | 1579,51, | 1579,52, | 1579,53, | 1579,54, | 1579,55, | 1579,56, | 1579,57, | 1579,58, | 1579,59, | 1579,60, | 1579,61, | 1579,62, | 1579,63, | 1579,64, | 1579,65, | 1579,66, | 1579,67, | 1579,68, | 1579,69, | 1579,70, | 1579,71, | 1579,72, | 1579,73, | 1579,74, | 1579,75, | 1579,76, | 1579,77, | 1579,78, | 1579,79, | 1579,80, | 1579,81, | 1579,82, | 1579,83, | 1579,84, | 1579,85, | 1580,1, | 1580,2, | 1580,3, | 1580,4, | 1580,5, | 1580,6, | 1580,7, | 1580,8, | 1580,9, | 1580,10, | 1580,11, | 1580,12, | 1580,13, | 1580,14, | 1580,15, | 1580,16, | 1580,17, | 1580,18, | 1580,19, | 1580,20, | 1580,21, | 1580,22, | 1580,23, | 1580,24, | 1580,25, | 1580,26, | 1580,27, | 1580,28, | 1580,29, | 1580,30, | 1580,31, | 1580,32, | 1580,33, | 1580,34, | 1580,35, | 1580,36, | 1580,37, | 1580,38, | 1580,39, | 1580,40, | 1580,41, | 1580,42, | 1580,43, | 1580,44, | 1580,45, | 1580,46, | 1580,47, | 1580,48, | 1580,49, | 1580,50, | 1580,51, | 1580,52, | 1580,53, | 1580,54, | 1580,55, | 1580,56, | 1580,57, | 1580,58, | 1580,59, | 1580,60, | 1580,61, | 1580,62, | 1580,63, | 1580,64, | 1580,65, | 1580,66, | 1580,67, | 1580,68, | 1580,69, | 1580,70, | 1580,71, | 1580,72, | 1580,73, | 1580,74, | 1580,75, | 1580,76, | 1580,77, | 1580,78, | 1580,79, | 1580,80, | 1580,81, | 1580,82, | 1580,83, | 1580,84, | 1580,85, | 1581,1, | 1581,2, | 1581,3, | 1581,4, | 1581,5, | 1581,6, | 1581,7, | 1581,8, | 1581,9, | 1581,10, | 1581,11, | 1581,12, | 1581,13, | 1581,14, | 1581,15, | 1581,16, | 1581,17, | 1581,18, | 1581,19, | 1581,20, | 1581,21, | 1581,22, | 1581,23, | 1581,24, | 1581,25, | 1581,26, | 1581,27, | 1581,28, | 1581,29, | 1581,30, | 1581,31, | 1581,32, | 1581,33, | 1581,34, | 1581,35, | 1581,36, | 1581,37, | 1581,38, | 1581,39, | 1581,40, | 1581,41, | 1581,42, | 1581,43, | 1581,44, | 1581,45, | 1581,46, | 1581,47, | 1581,48, | 1581,49, | 1581,50, | 1581,51, | 1581,52, | 1581,53, | 1581,54, | 1581,55, | 1581,56, | 1581,57, | 1581,58, | 1581,59, | 1581,60, | 1581,61, | 1581,62, | 1581,63, | 1581,64, | 1581,65, | 1581,66, | 1581,67, | 1581,68, | 1581,69, | 1581,70, | 1581,71, | 1581,72, | 1581,73, | 1581,74, | 1581,75, | 1581,76, | 1581,77, | 1581,78, | 1581,79, | 1581,80, | 1581,81, | 1581,82, | 1581,83, | 1581,84, | 1581,85, | 1582,1, | 1582,2, | 1582,3, | 1582,4, | 1582,5, | 1582,6, | 1582,7, | 1582,8, | 1582,9, | 1582,10, | 1582,11, | 1582,12, | 1582,13, | 1582,14, | 1582,15, | 1582,16, | 1582,17, | 1582,18, | 1582,19, | 1582,20, | 1582,21, | 1582,22, | 1582,23, | 1582,24, | 1582,25, | 1582,26, | 1582,27, | 1582,28, | 1582,29, | 1582,30, | 1582,31, | 1582,32, | 1582,33, | 1582,34, | 1582,35, | 1582,36, | 1582,37, | 1582,38, | 1582,39, | 1582,40, | 1582,41, | 1582,42, | 1582,43, | 1582,44, | 1582,45, | 1582,46, | 1582,47, | 1582,48, | 1582,49, | 1582,50, | 1582,51, | 1582,52, | 1582,53, | 1582,54, | 1582,55, | 1582,56, | 1582,57, | 1582,58, | 1582,59, | 1582,60, | 1582,61, | 1582,62, | 1582,63, | 1582,64, | 1582,65, | 1582,66, | 1582,67, | 1582,68, | 1582,69, | 1582,70, | 1582,71, | 1582,72, | 1582,73, | 1582,74, | 1582,75, | 1582,76, | 1582,77, | 1582,78, | 1582,79, | 1582,80, | 1582,81, | 1582,82, | 1582,83, | 1582,84, | 1582,85, | 1583,1, | 1583,2, | 1583,3, | 1583,4, | 1583,5, | 1583,6, | 1583,7, | 1583,8, | 1583,9, | 1583,10, | 1583,11, | 1583,12, | 1583,13, | 1583,14, | 1583,15, | 1583,16, | 1583,17, | 1583,18, | 1583,19, | 1583,20, | 1583,21, | 1583,22, | 1583,23, | 1583,24, | 1583,25, | 1583,26, | 1583,27, | 1583,28, | 1583,29, | 1583,30, | 1583,31, | 1583,32, | 1583,33, | 1583,34, | 1583,35, | 1583,36, | 1583,37, | 1583,38, | 1583,39, | 1583,40, | 1583,41, | 1583,42, | 1583,43, | 1583,44, | 1583,45, | 1583,46, | 1583,47, | 1583,48, | 1583,49, | 1583,50, | 1583,51, | 1583,52, | 1583,53, | 1583,54, | 1583,55, | 1583,56, | 1583,57, | 1583,58, | 1583,59, | 1583,60, | 1583,61, | 1583,62, | 1583,63, | 1583,64, | 1583,65, | 1583,66, | 1583,67, | 1583,68, | 1583,69, | 1583,70, | 1583,71, | 1583,72, | 1583,73, | 1583,74, | 1583,75, | 1583,76, | 1583,77, | 1583,78, | 1583,79, | 1583,80, | 1583,81, | 1583,82, | 1583,83, | 1583,84, | 1583,85, | 1584,1, | 1584,2, | 1584,3, | 1584,4, | 1584,5, | 1584,6, | 1584,7, | 1584,8, | 1584,9, | 1584,10, | 1584,11, | 1584,12, | 1584,13, | 1584,14, | 1584,15, | 1584,16, | 1584,17, | 1584,18, | 1584,19, | 1584,20, | 1584,21, | 1584,22, | 1584,23, | 1584,24, | 1584,25, | 1584,26, | 1584,27, | 1584,28, | 1584,29, | 1584,30, | 1584,31, | 1584,32, | 1584,33, | 1584,34, | 1584,35, | 1584,36, | 1584,37, | 1584,38, | 1584,39, | 1584,40, | 1584,41, | 1584,42, | 1584,43, | 1584,44, | 1584,45, | 1584,46, | 1584,47, | 1584,48, | 1584,49, | 1584,50, | 1584,51, | 1584,52, | 1584,53, | 1584,54, | 1584,55, | 1584,56, | 1584,57, | 1584,58, | 1584,59, | 1584,60, | 1584,61, | 1584,62, | 1584,63, | 1584,64, | 1584,65, | 1584,66, | 1584,67, | 1584,68, | 1584,69, | 1584,70, | 1584,71, | 1584,72, | 1584,73, | 1584,74, | 1584,75, | 1584,76, | 1584,77, | 1584,78, | 1584,79, | 1584,80, | 1584,81, | 1584,82, | 1584,83, | 1584,84, | 1584,85, | 1585,1, | 1585,2, | 1585,3, | 1585,4, | 1585,5, | 1585,6, | 1585,7, | 1585,8, | 1585,9, | 1585,10, | 1585,11, | 1585,12, | 1585,13, | 1585,14, | 1585,15, | 1585,16, | 1585,17, | 1585,18, | 1585,19, | 1585,20, | 1585,21, | 1585,22, | 1585,23, | 1585,24, | 1585,25, | 1585,26, | 1585,27, | 1585,28, | 1585,29, | 1585,30, | 1585,31, | 1585,32, | 1585,33, | 1585,34, | 1585,35, | 1585,36, | 1585,37, | 1585,38, | 1585,39, | 1585,40, | 1585,41, | 1585,42, | 1585,43, | 1585,44, | 1585,45, | 1585,46, | 1585,47, | 1585,48, | 1585,49, | 1585,50, | 1585,51, | 1585,52, | 1585,53, | 1585,54, | 1585,55, | 1585,56, | 1585,57, | 1585,58, | 1585,59, | 1585,60, | 1585,61, | 1585,62, | 1585,63, | 1585,64, | 1585,65, | 1585,66, | 1585,67, | 1585,68, | 1585,69, | 1585,70, | 1585,71, | 1585,72, | 1585,73, | 1585,74, | 1585,75, | 1585,76, | 1585,77, | 1585,78, | 1585,79, | 1585,80, | 1585,81, | 1585,82, | 1585,83, | 1585,84, | 1585,85, | 1586,1, | 1586,2, | 1586,3, | 1586,4, | 1586,5, | 1586,6, | 1586,7, | 1586,8, | 1586,9, | 1586,10, | 1586,11, | 1586,12, | 1586,13, | 1586,14, | 1586,15, | 1586,16, | 1586,17, | 1586,18, | 1586,19, | 1586,20, | 1586,21, | 1586,22, | 1586,23, | 1586,24, | 1586,25, | 1586,26, | 1586,27, | 1586,28, | 1586,29, | 1586,30, | 1586,31, | 1586,32, | 1586,33, | 1586,34, | 1586,35, | 1586,36, | 1586,37, | 1586,38, | 1586,39, | 1586,40, | 1586,41, | 1586,42, | 1586,43, | 1586,44, | 1586,45, | 1586,46, | 1586,47, | 1586,48, | 1586,49, | 1586,50, | 1586,51, | 1586,52, | 1586,53, | 1586,54, | 1586,55, | 1586,56, | 1586,57, | 1586,58, | 1586,59, | 1586,60, | 1586,61, | 1586,62, | 1586,63, | 1586,64, | 1586,65, | 1586,66, | 1586,67, | 1586,68, | 1586,69, | 1586,70, | 1586,71, | 1586,72, | 1586,73, | 1586,74, | 1586,75, | 1586,76, | 1586,77, | 1586,78, | 1586,79, | 1586,80, | 1586,81, | 1586,82, | 1586,83, | 1586,84, | 1586,85, | 1587,1, | 1587,2, | 1587,3, | 1587,4, | 1587,5, | 1587,6, | 1587,7, | 1587,8, | 1587,9, | 1587,10, | 1587,11, | 1587,12, | 1587,13, | 1587,14, | 1587,15, | 1587,16, | 1587,17, | 1587,18, | 1587,19, | 1587,20, | 1587,21, | 1587,22, | 1587,23, | 1587,24, | 1587,25, | 1587,26, | 1587,27, | 1587,28, | 1587,29, | 1587,30, | 1587,31, | 1587,32, | 1587,33, | 1587,34, | 1587,35, | 1587,36, | 1587,37, | 1587,38, | 1587,39, | 1587,40, | 1587,41, | 1587,42, | 1587,43, | 1587,44, | 1587,45, | 1587,46, | 1587,47, | 1587,48, | 1587,49, | 1587,50, | 1587,51, | 1587,52, | 1587,53, | 1587,54, | 1587,55, | 1587,56, | 1587,57, | 1587,58, | 1587,59, | 1587,60, | 1587,61, | 1587,62, | 1587,63, | 1587,64, | 1587,65, | 1587,66, | 1587,67, | 1587,68, | 1587,69, | 1587,70, | 1587,71, | 1587,72, | 1587,73, | 1587,74, | 1587,75, | 1587,76, | 1587,77, | 1587,78, | 1587,79, | 1587,80, | 1587,81, | 1587,82, | 1587,83, | 1587,84, | 1587,85, | 1588,1, | 1588,2, | 1588,3, | 1588,4, | 1588,5, | 1588,6, | 1588,7, | 1588,8, | 1588,9, | 1588,10, | 1588,11, | 1588,12, | 1588,13, | 1588,14, | 1588,15, | 1588,16, | 1588,17, | 1588,18, | 1588,19, | 1588,20, | 1588,21, | 1588,22, | 1588,23, | 1588,24, | 1588,25, | 1588,26, | 1588,27, | 1588,28, | 1588,29, | 1588,30, | 1588,31, | 1588,32, | 1588,33, | 1588,34, | 1588,35, | 1588,36, | 1588,37, | 1588,38, | 1588,39, | 1588,40, | 1588,41, | 1588,42, | 1588,43, | 1588,44, | 1588,45, | 1588,46, | 1588,47, | 1588,48, | 1588,49, | 1588,50, | 1588,51, | 1588,52, | 1588,53, | 1588,54, | 1588,55, | 1588,56, | 1588,57, | 1588,58, | 1588,59, | 1588,60, | 1588,61, | 1588,62, | 1588,63, | 1588,64, | 1588,65, | 1588,66, | 1588,67, | 1588,68, | 1588,69, | 1588,70, | 1588,71, | 1588,72, | 1588,73, | 1588,74, | 1588,75, | 1588,76, | 1588,77, | 1588,78, | 1588,79, | 1588,80, | 1588,81, | 1588,82, | 1588,83, | 1588,84, | 1588,85, | 1589,1, | 1589,2, | 1589,3, | 1589,4, | 1589,5, | 1589,6, | 1589,7, | 1589,8, | 1589,9, | 1589,10, | 1589,11, | 1589,12, | 1589,13, | 1589,14, | 1589,15, | 1589,16, | 1589,17, | 1589,18, | 1589,19, | 1589,20, | 1589,21, | 1589,22, | 1589,23, | 1589,24, | 1589,25, | 1589,26, | 1589,27, | 1589,28, | 1589,29, | 1589,30, | 1589,31, | 1589,32, | 1589,33, | 1589,34, | 1589,35, | 1589,36, | 1589,37, | 1589,38, | 1589,39, | 1589,40, | 1589,41, | 1589,42, | 1589,43, | 1589,44, | 1589,45, | 1589,46, | 1589,47, | 1589,48, | 1589,49, | 1589,50, | 1589,51, | 1589,52, | 1589,53, | 1589,54, | 1589,55, | 1589,56, | 1589,57, | 1589,58, | 1589,59, | 1589,60, | 1589,61, | 1589,62, | 1589,63, | 1589,64, | 1589,65, | 1589,66, | 1589,67, | 1589,68, | 1589,69, | 1589,70, | 1589,71, | 1589,72, | 1589,73, | 1589,74, | 1589,75, | 1589,76, | 1589,77, | 1589,78, | 1589,79, | 1589,80, | 1589,81, | 1589,82, | 1589,83, | 1589,84, | 1589,85, | 1590,1, | 1590,2, | 1590,3, | 1590,4, | 1590,5, | 1590,6, | 1590,7, | 1590,8, | 1590,9, | 1590,10, | 1590,11, | 1590,12, | 1590,13, | 1590,14, | 1590,15, | 1590,16, | 1590,17, | 1590,18, | 1590,19, | 1590,20, | 1590,21, | 1590,22, | 1590,23, | 1590,24, | 1590,25, | 1590,26, | 1590,27, | 1590,28, | 1590,29, | 1590,30, | 1590,31, | 1590,32, | 1590,33, | 1590,34, | 1590,35, | 1590,36, | 1590,37, | 1590,38, | 1590,39, | 1590,40, | 1590,41, | 1590,42, | 1590,43, | 1590,44, | 1590,45, | 1590,46, | 1590,47, | 1590,48, | 1590,49, | 1590,50, | 1590,51, | 1590,52, | 1590,53, | 1590,54, | 1590,55, | 1590,56, | 1590,57, | 1590,58, | 1590,59, | 1590,60, | 1590,61, | 1590,62, | 1590,63, | 1590,64, | 1590,65, | 1590,66, | 1590,67, | 1590,68, | 1590,69, | 1590,70, | 1590,71, | 1590,72, | 1590,73, | 1590,74, | 1590,75, | 1590,76, | 1590,77, | 1590,78, | 1590,79, | 1590,80, | 1590,81, | 1590,82, | 1590,83, | 1590,84, | 1590,85, | 1591,1, | 1591,2, | 1591,3, | 1591,4, | 1591,5, | 1591,6, | 1591,7, | 1591,8, | 1591,9, | 1591,10, | 1591,11, | 1591,12, | 1591,13, | 1591,14, | 1591,15, | 1591,16, | 1591,17, | 1591,18, | 1591,19, | 1591,20, | 1591,21, | 1591,22, | 1591,23, | 1591,24, | 1591,25, | 1591,26, | 1591,27, | 1591,28, | 1591,29, | 1591,30, | 1591,31, | 1591,32, | 1591,33, | 1591,34, | 1591,35, | 1591,36, | 1591,37, | 1591,38, | 1591,39, | 1591,40, | 1591,41, | 1591,42, | 1591,43, | 1591,44, | 1591,45, | 1591,46, | 1591,47, | 1591,48, | 1591,49, | 1591,50, | 1591,51, | 1591,52, | 1591,53, | 1591,54, | 1591,55, | 1591,56, | 1591,57, | 1591,58, | 1591,59, | 1591,60, | 1591,61, | 1591,62, | 1591,63, | 1591,64, | 1591,65, | 1591,66, | 1591,67, | 1591,68, | 1591,69, | 1591,70, | 1591,71, | 1591,72, | 1591,73, | 1591,74, | 1591,75, | 1591,76, | 1591,77, | 1591,78, | 1591,79, | 1591,80, | 1591,81, | 1591,82, | 1591,83, | 1591,84, | 1591,85, | 1592,1, | 1592,2, | 1592,3, | 1592,4, | 1592,5, | 1592,6, | 1592,7, | 1592,8, | 1592,9, | 1592,10, | 1592,11, | 1592,12, | 1592,13, | 1592,14, | 1592,15, | 1592,16, | 1592,17, | 1592,18, | 1592,19, | 1592,20, | 1592,21, | 1592,22, | 1592,23, | 1592,24, | 1592,25, | 1592,26, | 1592,27, | 1592,28, | 1592,29, | 1592,30, | 1592,31, | 1592,32, | 1592,33, | 1592,34, | 1592,35, | 1592,36, | 1592,37, | 1592,38, | 1592,39, | 1592,40, | 1592,41, | 1592,42, | 1592,43, | 1592,44, | 1592,45, | 1592,46, | 1592,47, | 1592,48, | 1592,49, | 1592,50, | 1592,51, | 1592,52, | 1592,53, | 1592,54, | 1592,55, | 1592,56, | 1592,57, | 1592,58, | 1592,59, | 1592,60, | 1592,61, | 1592,62, | 1592,63, | 1592,64, | 1592,65, | 1592,66, | 1592,67, | 1592,68, | 1592,69, | 1592,70, | 1592,71, | 1592,72, | 1592,73, | 1592,74, | 1592,75, | 1592,76, | 1592,77, | 1592,78, | 1592,79, | 1592,80, | 1592,81, | 1592,82, | 1592,83, | 1592,84, | 1592,85, | 1593,1, | 1593,2, | 1593,3, | 1593,4, | 1593,5, | 1593,6, | 1593,7, | 1593,8, | 1593,9, | 1593,10, | 1593,11, | 1593,12, | 1593,13, | 1593,14, | 1593,15, | 1593,16, | 1593,17, | 1593,18, | 1593,19, | 1593,20, | 1593,21, | 1593,22, | 1593,23, | 1593,24, | 1593,25, | 1593,26, | 1593,27, | 1593,28, | 1593,29, | 1593,30, | 1593,31, | 1593,32, | 1593,33, | 1593,34, | 1593,35, | 1593,36, | 1593,37, | 1593,38, | 1593,39, | 1593,40, | 1593,41, | 1593,42, | 1593,43, | 1593,44, | 1593,45, | 1593,46, | 1593,47, | 1593,48, | 1593,49, | 1593,50, | 1593,51, | 1593,52, | 1593,53, | 1593,54, | 1593,55, | 1593,56, | 1593,57, | 1593,58, | 1593,59, | 1593,60, | 1593,61, | 1593,62, | 1593,63, | 1593,64, | 1593,65, | 1593,66, | 1593,67, | 1593,68, | 1593,69, | 1593,70, | 1593,71, | 1593,72, | 1593,73, | 1593,74, | 1593,75, | 1593,76, | 1593,77, | 1593,78, | 1593,79, | 1593,80, | 1593,81, | 1593,82, | 1593,83, | 1593,84, | 1593,85, | 1594,1, | 1594,2, | 1594,3, | 1594,4, | 1594,5, | 1594,6, | 1594,7, | 1594,8, | 1594,9, | 1594,10, | 1594,11, | 1594,12, | 1594,13, | 1594,14, | 1594,15, | 1594,16, | 1594,17, | 1594,18, | 1594,19, | 1594,20, | 1594,21, | 1594,22, | 1594,23, | 1594,24, | 1594,25, | 1594,26, | 1594,27, | 1594,28, | 1594,29, | 1594,30, | 1594,31, | 1594,32, | 1594,33, | 1594,34, | 1594,35, | 1594,36, | 1594,37, | 1594,38, | 1594,39, | 1594,40, | 1594,41, | 1594,42, | 1594,43, | 1594,44, | 1594,45, | 1594,46, | 1594,47, | 1594,48, | 1594,49, | 1594,50, | 1594,51, | 1594,52, | 1594,53, | 1594,54, | 1594,55, | 1594,56, | 1594,57, | 1594,58, | 1594,59, | 1594,60, | 1594,61, | 1594,62, | 1594,63, | 1594,64, | 1594,65, | 1594,66, | 1594,67, | 1594,68, | 1594,69, | 1594,70, | 1594,71, | 1594,72, | 1594,73, | 1594,74, | 1594,75, | 1594,76, | 1594,77, | 1594,78, | 1594,79, | 1594,80, | 1594,81, | 1594,82, | 1594,83, | 1594,84, | 1594,85, | 1595,1, | 1595,2, | 1595,3, | 1595,4, | 1595,5, | 1595,6, | 1595,7, | 1595,8, | 1595,9, | 1595,10, | 1595,11, | 1595,12, | 1595,13, | 1595,14, | 1595,15, | 1595,16, | 1595,17, | 1595,18, | 1595,19, | 1595,20, | 1595,21, | 1595,22, | 1595,23, | 1595,24, | 1595,25, | 1595,26, | 1595,27, | 1595,28, | 1595,29, | 1595,30, | 1595,31, | 1595,32, | 1595,33, | 1595,34, | 1595,35, | 1595,36, | 1595,37, | 1595,38, | 1595,39, | 1595,40, | 1595,41, | 1595,42, | 1595,43, | 1595,44, | 1595,45, | 1595,46, | 1595,47, | 1595,48, | 1595,49, | 1595,50, | 1595,51, | 1595,52, | 1595,53, | 1595,54, | 1595,55, | 1595,56, | 1595,57, | 1595,58, | 1595,59, | 1595,60, | 1595,61, | 1595,62, | 1595,63, | 1595,64, | 1595,65, | 1595,66, | 1595,67, | 1595,68, | 1595,69, | 1595,70, | 1595,71, | 1595,72, | 1595,73, | 1595,74, | 1595,75, | 1595,76, | 1595,77, | 1595,78, | 1595,79, | 1595,80, | 1595,81, | 1595,82, | 1595,83, | 1595,84, | 1595,85, | 1596,1, | 1596,2, | 1596,3, | 1596,4, | 1596,5, | 1596,6, | 1596,7, | 1596,8, | 1596,9, | 1596,10, | 1596,11, | 1596,12, | 1596,13, | 1596,14, | 1596,15, | 1596,16, | 1596,17, | 1596,18, | 1596,19, | 1596,20, | 1596,21, | 1596,22, | 1596,23, | 1596,24, | 1596,25, | 1596,26, | 1596,27, | 1596,28, | 1596,29, | 1596,30, | 1596,31, | 1596,32, | 1596,33, | 1596,34, | 1596,35, | 1596,36, | 1596,37, | 1596,38, | 1596,39, | 1596,40, | 1596,41, | 1596,42, | 1596,43, | 1596,44, | 1596,45, | 1596,46, | 1596,47, | 1596,48, | 1596,49, | 1596,50, | 1596,51, | 1596,52, | 1596,53, | 1596,54, | 1596,55, | 1596,56, | 1596,57, | 1596,58, | 1596,59, | 1596,60, | 1596,61, | 1596,62, | 1596,63, | 1596,64, | 1596,65, | 1596,66, | 1596,67, | 1596,68, | 1596,69, | 1596,70, | 1596,71, | 1596,72, | 1596,73, | 1596,74, | 1596,75, | 1596,76, | 1596,77, | 1596,78, | 1596,79, | 1596,80, | 1596,81, | 1596,82, | 1596,83, | 1596,84, | 1596,85, | 1597,1, | 1597,2, | 1597,3, | 1597,4, | 1597,5, | 1597,6, | 1597,7, | 1597,8, | 1597,9, | 1597,10, | 1597,11, | 1597,12, | 1597,13, | 1597,14, | 1597,15, | 1597,16, | 1597,17, | 1597,18, | 1597,19, | 1597,20, | 1597,21, | 1597,22, | 1597,23, | 1597,24, | 1597,25, | 1597,26, | 1597,27, | 1597,28, | 1597,29, | 1597,30, | 1597,31, | 1597,32, | 1597,33, | 1597,34, | 1597,35, | 1597,36, | 1597,37, | 1597,38, | 1597,39, | 1597,40, | 1597,41, | 1597,42, | 1597,43, | 1597,44, | 1597,45, | 1597,46, | 1597,47, | 1597,48, | 1597,49, | 1597,50, | 1597,51, | 1597,52, | 1597,53, | 1597,54, | 1597,55, | 1597,56, | 1597,57, | 1597,58, | 1597,59, | 1597,60, | 1597,61, | 1597,62, | 1597,63, | 1597,64, | 1597,65, | 1597,66, | 1597,67, | 1597,68, | 1597,69, | 1597,70, | 1597,71, | 1597,72, | 1597,73, | 1597,74, | 1597,75, | 1597,76, | 1597,77, | 1597,78, | 1597,79, | 1597,80, | 1597,81, | 1597,82, | 1597,83, | 1597,84, | 1597,85, | 1598,1, | 1598,2, | 1598,3, | 1598,4, | 1598,5, | 1598,6, | 1598,7, | 1598,8, | 1598,9, | 1598,10, | 1598,11, | 1598,12, | 1598,13, | 1598,14, | 1598,15, | 1598,16, | 1598,17, | 1598,18, | 1598,19, | 1598,20, | 1598,21, | 1598,22, | 1598,23, | 1598,24, | 1598,25, | 1598,26, | 1598,27, | 1598,28, | 1598,29, | 1598,30, | 1598,31, | 1598,32, | 1598,33, | 1598,34, | 1598,35, | 1598,36, | 1598,37, | 1598,38, | 1598,39, | 1598,40, | 1598,41, | 1598,42, | 1598,43, | 1598,44, | 1598,45, | 1598,46, | 1598,47, | 1598,48, | 1598,49, | 1598,50, | 1598,51, | 1598,52, | 1598,53, | 1598,54, | 1598,55, | 1598,56, | 1598,57, | 1598,58, | 1598,59, | 1598,60, | 1598,61, | 1598,62, | 1598,63, | 1598,64, | 1598,65, | 1598,66, | 1598,67, | 1598,68, | 1598,69, | 1598,70, | 1598,71, | 1598,72, | 1598,73, | 1598,74, | 1598,75, | 1598,76, | 1598,77, | 1598,78, | 1598,79, | 1598,80, | 1598,81, | 1598,82, | 1598,83, | 1598,84, | 1598,85, | 1599,1, | 1599,2, | 1599,3, | 1599,4, | 1599,5, | 1599,6, | 1599,7, | 1599,8, | 1599,9, | 1599,10, | 1599,11, | 1599,12, | 1599,13, | 1599,14, | 1599,15, | 1599,16, | 1599,17, | 1599,18, | 1599,19, | 1599,20, | 1599,21, | 1599,22, | 1599,23, | 1599,24, | 1599,25, | 1599,26, | 1599,27, | 1599,28, | 1599,29, | 1599,30, | 1599,31, | 1599,32, | 1599,33, | 1599,34, | 1599,35, | 1599,36, | 1599,37, | 1599,38, | 1599,39, | 1599,40, | 1599,41, | 1599,42, | 1599,43, | 1599,44, | 1599,45, | 1599,46, | 1599,47, | 1599,48, | 1599,49, | 1599,50, | 1599,51, | 1599,52, | 1599,53, | 1599,54, | 1599,55, | 1599,56, | 1599,57, | 1599,58, | 1599,59, | 1599,60, | 1599,61, | 1599,62, | 1599,63, | 1599,64, | 1599,65, | 1599,66, | 1599,67, | 1599,68, | 1599,69, | 1599,70, | 1599,71, | 1599,72, | 1599,73, | 1599,74, | 1599,75, | 1599,76, | 1599,77, | 1599,78, | 1599,79, | 1599,80, | 1599,81, | 1599,82, | 1599,83, | 1599,84, | 1599,85, | 1600,1, | 1600,2, | 1600,3, | 1600,4, | 1600,5, | 1600,6, | 1600,7, | 1600,8, | 1600,9, | 1600,10, | 1600,11, | 1600,12, | 1600,13, | 1600,14, | 1600,15, | 1600,16, | 1600,17, | 1600,18, | 1600,19, | 1600,20, | 1600,21, | 1600,22, | 1600,23, | 1600,24, | 1600,25, | 1600,26, | 1600,27, | 1600,28, | 1600,29, | 1600,30, | 1600,31, | 1600,32, | 1600,33, | 1600,34, | 1600,35, | 1600,36, | 1600,37, | 1600,38, | 1600,39, | 1600,40, | 1600,41, | 1600,42, | 1600,43, | 1600,44, | 1600,45, | 1600,46, | 1600,47, | 1600,48, | 1600,49, | 1600,50, | 1600,51, | 1600,52, | 1600,53, | 1600,54, | 1600,55, | 1600,56, | 1600,57, | 1600,58, | 1600,59, | 1600,60, | 1600,61, | 1600,62, | 1600,63, | 1600,64, | 1600,65, | 1600,66, | 1600,67, | 1600,68, | 1600,69, | 1600,70, | 1600,71, | 1600,72, | 1600,73, | 1600,74, | 1600,75, | 1600,76, | 1600,77, | 1600,78, | 1600,79, | 1600,80, | 1600,81, | 1600,82, | 1600,83, | 1600,84, | 1600,85, | 1601,1, | 1601,2, | 1601,3, | 1601,4, | 1601,5, | 1601,6, | 1601,7, | 1601,8, | 1601,9, | 1601,10, | 1601,11, | 1601,12, | 1601,13, | 1601,14, | 1601,15, | 1601,16, | 1601,17, | 1601,18, | 1601,19, | 1601,20, | 1601,21, | 1601,22, | 1601,23, | 1601,24, | 1601,25, | 1601,26, | 1601,27, | 1601,28, | 1601,29, | 1601,30, | 1601,31, | 1601,32, | 1601,33, | 1601,34, | 1601,35, | 1601,36, | 1601,37, | 1601,38, | 1601,39, | 1601,40, | 1601,41, | 1601,42, | 1601,43, | 1601,44, | 1601,45, | 1601,46, | 1601,47, | 1601,48, | 1601,49, | 1601,50, | 1601,51, | 1601,52, | 1601,53, | 1601,54, | 1601,55, | 1601,56, | 1601,57, | 1601,58, | 1601,59, | 1601,60, | 1601,61, | 1601,62, | 1601,63, | 1601,64, | 1601,65, | 1601,66, | 1601,67, | 1601,68, | 1601,69, | 1601,70, | 1601,71, | 1601,72, | 1601,73, | 1601,74, | 1601,75, | 1601,76, | 1601,77, | 1601,78, | 1601,79, | 1601,80, | 1601,81, | 1601,82, | 1601,83, | 1601,84, | 1601,85, | 1602,1, | 1602,2, | 1602,3, | 1602,4, | 1602,5, | 1602,6, | 1602,7, | 1602,8, | 1602,9, | 1602,10, | 1602,11, | 1602,12, | 1602,13, | 1602,14, | 1602,15, | 1602,16, | 1602,17, | 1602,18, | 1602,19, | 1602,20, | 1602,21, | 1602,22, | 1602,23, | 1602,24, | 1602,25, | 1602,26, | 1602,27, | 1602,28, | 1602,29, | 1602,30, | 1602,31, | 1602,32, | 1602,33, | 1602,34, | 1602,35, | 1602,36, | 1602,37, | 1602,38, | 1602,39, | 1602,40, | 1602,41, | 1602,42, | 1602,43, | 1602,44, | 1602,45, | 1602,46, | 1602,47, | 1602,48, | 1602,49, | 1602,50, | 1602,51, | 1602,52, | 1602,53, | 1602,54, | 1602,55, | 1602,56, | 1602,57, | 1602,58, | 1602,59, | 1602,60, | 1602,61, | 1602,62, | 1602,63, | 1602,64, | 1602,65, | 1602,66, | 1602,67, | 1602,68, | 1602,69, | 1602,70, | 1602,71, | 1602,72, | 1602,73, | 1602,74, | 1602,75, | 1602,76, | 1602,77, | 1602,78, | 1602,79, | 1602,80, | 1602,81, | 1602,82, | 1602,83, | 1602,84, | 1602,85, | 1603,1, | 1603,2, | 1603,3, | 1603,4, | 1603,5, | 1603,6, | 1603,7, | 1603,8, | 1603,9, | 1603,10, | 1603,11, | 1603,12, | 1603,13, | 1603,14, | 1603,15, | 1603,16, | 1603,17, | 1603,18, | 1603,19, | 1603,20, | 1603,21, | 1603,22, | 1603,23, | 1603,24, | 1603,25, | 1603,26, | 1603,27, | 1603,28, | 1603,29, | 1603,30, | 1603,31, | 1603,32, | 1603,33, | 1603,34, | 1603,35, | 1603,36, | 1603,37, | 1603,38, | 1603,39, | 1603,40, | 1603,41, | 1603,42, | 1603,43, | 1603,44, | 1603,45, | 1603,46, | 1603,47, | 1603,48, | 1603,49, | 1603,50, | 1603,51, | 1603,52, | 1603,53, | 1603,54, | 1603,55, | 1603,56, | 1603,57, | 1603,58, | 1603,59, | 1603,60, | 1603,61, | 1603,62, | 1603,63, | 1603,64, | 1603,65, | 1603,66, | 1603,67, | 1603,68, | 1603,69, | 1603,70, | 1603,71, | 1603,72, | 1603,73, | 1603,74, | 1603,75, | 1603,76, | 1603,77, | 1603,78, | 1603,79, | 1603,80, | 1603,81, | 1603,82, | 1603,83, | 1603,84, | 1603,85, | 1604,1, | 1604,2, | 1604,3, | 1604,4, | 1604,5, | 1604,6, | 1604,7, | 1604,8, | 1604,9, | 1604,10, | 1604,11, | 1604,12, | 1604,13, | 1604,14, | 1604,15, | 1604,16, | 1604,17, | 1604,18, | 1604,19, | 1604,20, | 1604,21, | 1604,22, | 1604,23, | 1604,24, | 1604,25, | 1604,26, | 1604,27, | 1604,28, | 1604,29, | 1604,30, | 1604,31, | 1604,32, | 1604,33, | 1604,34, | 1604,35, | 1604,36, | 1604,37, | 1604,38, | 1604,39, | 1604,40, | 1604,41, | 1604,42, | 1604,43, | 1604,44, | 1604,45, | 1604,46, | 1604,47, | 1604,48, | 1604,49, | 1604,50, | 1604,51, | 1604,52, | 1604,53, | 1604,54, | 1604,55, | 1604,56, | 1604,57, | 1604,58, | 1604,59, | 1604,60, | 1604,61, | 1604,62, | 1604,63, | 1604,64, | 1604,65, | 1604,66, | 1604,67, | 1604,68, | 1604,69, | 1604,70, | 1604,71, | 1604,72, | 1604,73, | 1604,74, | 1604,75, | 1604,76, | 1604,77, | 1604,78, | 1604,79, | 1604,80, | 1604,81, | 1604,82, | 1604,83, | 1604,84, | 1604,85, | 1605,1, | 1605,2, | 1605,3, | 1605,4, | 1605,5, | 1605,6, | 1605,7, | 1605,8, | 1605,9, | 1605,10, | 1605,11, | 1605,12, | 1605,13, | 1605,14, | 1605,15, | 1605,16, | 1605,17, | 1605,18, | 1605,19, | 1605,20, | 1605,21, | 1605,22, | 1605,23, | 1605,24, | 1605,25, | 1605,26, | 1605,27, | 1605,28, | 1605,29, | 1605,30, | 1605,31, | 1605,32, | 1605,33, | 1605,34, | 1605,35, | 1605,36, | 1605,37, | 1605,38, | 1605,39, | 1605,40, | 1605,41, | 1605,42, | 1605,43, | 1605,44, | 1605,45, | 1605,46, | 1605,47, | 1605,48, | 1605,49, | 1605,50, | 1605,51, | 1605,52, | 1605,53, | 1605,54, | 1605,55, | 1605,56, | 1605,57, | 1605,58, | 1605,59, | 1605,60, | 1605,61, | 1605,62, | 1605,63, | 1605,64, | 1605,65, | 1605,66, | 1605,67, | 1605,68, | 1605,69, | 1605,70, | 1605,71, | 1605,72, | 1605,73, | 1605,74, | 1605,75, | 1605,76, | 1605,77, | 1605,78, | 1605,79, | 1605,80, | 1605,81, | 1605,82, | 1605,83, | 1605,84, | 1605,85, | 1606,1, | 1606,2, | 1606,3, | 1606,4, | 1606,5, | 1606,6, | 1606,7, | 1606,8, | 1606,9, | 1606,10, | 1606,11, | 1606,12, | 1606,13, | 1606,14, | 1606,15, | 1606,16, | 1606,17, | 1606,18, | 1606,19, | 1606,20, | 1606,21, | 1606,22, | 1606,23, | 1606,24, | 1606,25, | 1606,26, | 1606,27, | 1606,28, | 1606,29, | 1606,30, | 1606,31, | 1606,32, | 1606,33, | 1606,34, | 1606,35, | 1606,36, | 1606,37, | 1606,38, | 1606,39, | 1606,40, | 1606,41, | 1606,42, | 1606,43, | 1606,44, | 1606,45, | 1606,46, | 1606,47, | 1606,48, | 1606,49, | 1606,50, | 1606,51, | 1606,52, | 1606,53, | 1606,54, | 1606,55, | 1606,56, | 1606,57, | 1606,58, | 1606,59, | 1606,60, | 1606,61, | 1606,62, | 1606,63, | 1606,64, | 1606,65, | 1606,66, | 1606,67, | 1606,68, | 1606,69, | 1606,70, | 1606,71, | 1606,72, | 1606,73, | 1606,74, | 1606,75, | 1606,76, | 1606,77, | 1606,78, | 1606,79, | 1606,80, | 1606,81, | 1606,82, | 1606,83, | 1606,84, | 1606,85, | 1607,1, | 1607,2, | 1607,3, | 1607,4, | 1607,5, | 1607,6, | 1607,7, | 1607,8, | 1607,9, | 1607,10, | 1607,11, | 1607,12, | 1607,13, | 1607,14, | 1607,15, | 1607,16, | 1607,17, | 1607,18, | 1607,19, | 1607,20, | 1607,21, | 1607,22, | 1607,23, | 1607,24, | 1607,25, | 1607,26, | 1607,27, | 1607,28, | 1607,29, | 1607,30, | 1607,31, | 1607,32, | 1607,33, | 1607,34, | 1607,35, | 1607,36, | 1607,37, | 1607,38, | 1607,39, | 1607,40, | 1607,41, | 1607,42, | 1607,43, | 1607,44, | 1607,45, | 1607,46, | 1607,47, | 1607,48, | 1607,49, | 1607,50, | 1607,51, | 1607,52, | 1607,53, | 1607,54, | 1607,55, | 1607,56, | 1607,57, | 1607,58, | 1607,59, | 1607,60, | 1607,61, | 1607,62, | 1607,63, | 1607,64, | 1607,65, | 1607,66, | 1607,67, | 1607,68, | 1607,69, | 1607,70, | 1607,71, | 1607,72, | 1607,73, | 1607,74, | 1607,75, | 1607,76, | 1607,77, | 1607,78, | 1607,79, | 1607,80, | 1607,81, | 1607,82, | 1607,83, | 1607,84, | 1607,85, | 1608,1, | 1608,2, | 1608,3, | 1608,4, | 1608,5, | 1608,6, | 1608,7, | 1608,8, | 1608,9, | 1608,10, | 1608,11, | 1608,12, | 1608,13, | 1608,14, | 1608,15, | 1608,16, | 1608,17, | 1608,18, | 1608,19, | 1608,20, | 1608,21, | 1608,22, | 1608,23, | 1608,24, | 1608,25, | 1608,26, | 1608,27, | 1608,28, | 1608,29, | 1608,30, | 1608,31, | 1608,32, | 1608,33, | 1608,34, | 1608,35, | 1608,36, | 1608,37, | 1608,38, | 1608,39, | 1608,40, | 1608,41, | 1608,42, | 1608,43, | 1608,44, | 1608,45, | 1608,46, | 1608,47, | 1608,48, | 1608,49, | 1608,50, | 1608,51, | 1608,52, | 1608,53, | 1608,54, | 1608,55, | 1608,56, | 1608,57, | 1608,58, | 1608,59, | 1608,60, | 1608,61, | 1608,62, | 1608,63, | 1608,64, | 1608,65, | 1608,66, | 1608,67, | 1608,68, | 1608,69, | 1608,70, | 1608,71, | 1608,72, | 1608,73, | 1608,74, | 1608,75, | 1608,76, | 1608,77, | 1608,78, | 1608,79, | 1608,80, | 1608,81, | 1608,82, | 1608,83, | 1608,84, | 1608,85, | 1609,1, | 1609,2, | 1609,3, | 1609,4, | 1609,5, | 1609,6, | 1609,7, | 1609,8, | 1609,9, | 1609,10, | 1609,11, | 1609,12, | 1609,13, | 1609,14, | 1609,15, | 1609,16, | 1609,17, | 1609,18, | 1609,19, | 1609,20, | 1609,21, | 1609,22, | 1609,23, | 1609,24, | 1609,25, | 1609,26, | 1609,27, | 1609,28, | 1609,29, | 1609,30, | 1609,31, | 1609,32, | 1609,33, | 1609,34, | 1609,35, | 1609,36, | 1609,37, | 1609,38, | 1609,39, | 1609,40, | 1609,41, | 1609,42, | 1609,43, | 1609,44, | 1609,45, | 1609,46, | 1609,47, | 1609,48, | 1609,49, | 1609,50, | 1609,51, | 1609,52, | 1609,53, | 1609,54, | 1609,55, | 1609,56, | 1609,57, | 1609,58, | 1609,59, | 1609,60, | 1609,61, | 1609,62, | 1609,63, | 1609,64, | 1609,65, | 1609,66, | 1609,67, | 1609,68, | 1609,69, | 1609,70, | 1609,71, | 1609,72, | 1609,73, | 1609,74, | 1609,75, | 1609,76, | 1609,77, | 1609,78, | 1609,79, | 1609,80, | 1609,81, | 1609,82, | 1609,83, | 1609,84, | 1609,85, | 1610,1, | 1610,2, | 1610,3, | 1610,4, | 1610,5, | 1610,6, | 1610,7, | 1610,8, | 1610,9, | 1610,10, | 1610,11, | 1610,12, | 1610,13, | 1610,14, | 1610,15, | 1610,16, | 1610,17, | 1610,18, | 1610,19, | 1610,20, | 1610,21, | 1610,22, | 1610,23, | 1610,24, | 1610,25, | 1610,26, | 1610,27, | 1610,28, | 1610,29, | 1610,30, | 1610,31, | 1610,32, | 1610,33, | 1610,34, | 1610,35, | 1610,36, | 1610,37, | 1610,38, | 1610,39, | 1610,40, | 1610,41, | 1610,42, | 1610,43, | 1610,44, | 1610,45, | 1610,46, | 1610,47, | 1610,48, | 1610,49, | 1610,50, | 1610,51, | 1610,52, | 1610,53, | 1610,54, | 1610,55, | 1610,56, | 1610,57, | 1610,58, | 1610,59, | 1610,60, | 1610,61, | 1610,62, | 1610,63, | 1610,64, | 1610,65, | 1610,66, | 1610,67, | 1610,68, | 1610,69, | 1610,70, | 1610,71, | 1610,72, | 1610,73, | 1610,74, | 1610,75, | 1610,76, | 1610,77, | 1610,78, | 1610,79, | 1610,80, | 1610,81, | 1610,82, | 1610,83, | 1610,84, | 1610,85, | 1611,1, | 1611,2, | 1611,3, | 1611,4, | 1611,5, | 1611,6, | 1611,7, | 1611,8, | 1611,9, | 1611,10, | 1611,11, | 1611,12, | 1611,13, | 1611,14, | 1611,15, | 1611,16, | 1611,17, | 1611,18, | 1611,19, | 1611,20, | 1611,21, | 1611,22, | 1611,23, | 1611,24, | 1611,25, | 1611,26, | 1611,27, | 1611,28, | 1611,29, | 1611,30, | 1611,31, | 1611,32, | 1611,33, | 1611,34, | 1611,35, | 1611,36, | 1611,37, | 1611,38, | 1611,39, | 1611,40, | 1611,41, | 1611,42, | 1611,43, | 1611,44, | 1611,45, | 1611,46, | 1611,47, | 1611,48, | 1611,49, | 1611,50, | 1611,51, | 1611,52, | 1611,53, | 1611,54, | 1611,55, | 1611,56, | 1611,57, | 1611,58, | 1611,59, | 1611,60, | 1611,61, | 1611,62, | 1611,63, | 1611,64, | 1611,65, | 1611,66, | 1611,67, | 1611,68, | 1611,69, | 1611,70, | 1611,71, | 1611,72, | 1611,73, | 1611,74, | 1611,75, | 1611,76, | 1611,77, | 1611,78, | 1611,79, | 1611,80, | 1611,81, | 1611,82, | 1611,83, | 1611,84, | 1611,85, | 1612,1, | 1612,2, | 1612,3, | 1612,4, | 1612,5, | 1612,6, | 1612,7, | 1612,8, | 1612,9, | 1612,10, | 1612,11, | 1612,12, | 1612,13, | 1612,14, | 1612,15, | 1612,16, | 1612,17, | 1612,18, | 1612,19, | 1612,20, | 1612,21, | 1612,22, | 1612,23, | 1612,24, | 1612,25, | 1612,26, | 1612,27, | 1612,28, | 1612,29, | 1612,30, | 1612,31, | 1612,32, | 1612,33, | 1612,34, | 1612,35, | 1612,36, | 1612,37, | 1612,38, | 1612,39, | 1612,40, | 1612,41, | 1612,42, | 1612,43, | 1612,44, | 1612,45, | 1612,46, | 1612,47, | 1612,48, | 1612,49, | 1612,50, | 1612,51, | 1612,52, | 1612,53, | 1612,54, | 1612,55, | 1612,56, | 1612,57, | 1612,58, | 1612,59, | 1612,60, | 1612,61, | 1612,62, | 1612,63, | 1612,64, | 1612,65, | 1612,66, | 1612,67, | 1612,68, | 1612,69, | 1612,70, | 1612,71, | 1612,72, | 1612,73, | 1612,74, | 1612,75, | 1612,76, | 1612,77, | 1612,78, | 1612,79, | 1612,80, | 1612,81, | 1612,82, | 1612,83, | 1612,84, | 1612,85, | 1613,1, | 1613,2, | 1613,3, | 1613,4, | 1613,5, | 1613,6, | 1613,7, | 1613,8, | 1613,9, | 1613,10, | 1613,11, | 1613,12, | 1613,13, | 1613,14, | 1613,15, | 1613,16, | 1613,17, | 1613,18, | 1613,19, | 1613,20, | 1613,21, | 1613,22, | 1613,23, | 1613,24, | 1613,25, | 1613,26, | 1613,27, | 1613,28, | 1613,29, | 1613,30, | 1613,31, | 1613,32, | 1613,33, | 1613,34, | 1613,35, | 1613,36, | 1613,37, | 1613,38, | 1613,39, | 1613,40, | 1613,41, | 1613,42, | 1613,43, | 1613,44, | 1613,45, | 1613,46, | 1613,47, | 1613,48, | 1613,49, | 1613,50, | 1613,51, | 1613,52, | 1613,53, | 1613,54, | 1613,55, | 1613,56, | 1613,57, | 1613,58, | 1613,59, | 1613,60, | 1613,61, | 1613,62, | 1613,63, | 1613,64, | 1613,65, | 1613,66, | 1613,67, | 1613,68, | 1613,69, | 1613,70, | 1613,71, | 1613,72, | 1613,73, | 1613,74, | 1613,75, | 1613,76, | 1613,77, | 1613,78, | 1613,79, | 1613,80, | 1613,81, | 1613,82, | 1613,83, | 1613,84, | 1613,85, | 1614,1, | 1614,2, | 1614,3, | 1614,4, | 1614,5, | 1614,6, | 1614,7, | 1614,8, | 1614,9, | 1614,10, | 1614,11, | 1614,12, | 1614,13, | 1614,14, | 1614,15, | 1614,16, | 1614,17, | 1614,18, | 1614,19, | 1614,20, | 1614,21, | 1614,22, | 1614,23, | 1614,24, | 1614,25, | 1614,26, | 1614,27, | 1614,28, | 1614,29, | 1614,30, | 1614,31, | 1614,32, | 1614,33, | 1614,34, | 1614,35, | 1614,36, | 1614,37, | 1614,38, | 1614,39, | 1614,40, | 1614,41, | 1614,42, | 1614,43, | 1614,44, | 1614,45, | 1614,46, | 1614,47, | 1614,48, | 1614,49, | 1614,50, | 1614,51, | 1614,52, | 1614,53, | 1614,54, | 1614,55, | 1614,56, | 1614,57, | 1614,58, | 1614,59, | 1614,60, | 1614,61, | 1614,62, | 1614,63, | 1614,64, | 1614,65, | 1614,66, | 1614,67, | 1614,68, | 1614,69, | 1614,70, | 1614,71, | 1614,72, | 1614,73, | 1614,74, | 1614,75, | 1614,76, | 1614,77, | 1614,78, | 1614,79, | 1614,80, | 1614,81, | 1614,82, | 1614,83, | 1614,84, | 1614,85, | 1615,1, | 1615,2, | 1615,3, | 1615,4, | 1615,5, | 1615,6, | 1615,7, | 1615,8, | 1615,9, | 1615,10, | 1615,11, | 1615,12, | 1615,13, | 1615,14, | 1615,15, | 1615,16, | 1615,17, | 1615,18, | 1615,19, | 1615,20, | 1615,21, | 1615,22, | 1615,23, | 1615,24, | 1615,25, | 1615,26, | 1615,27, | 1615,28, | 1615,29, | 1615,30, | 1615,31, | 1615,32, | 1615,33, | 1615,34, | 1615,35, | 1615,36, | 1615,37, | 1615,38, | 1615,39, | 1615,40, | 1615,41, | 1615,42, | 1615,43, | 1615,44, | 1615,45, | 1615,46, | 1615,47, | 1615,48, | 1615,49, | 1615,50, | 1615,51, | 1615,52, | 1615,53, | 1615,54, | 1615,55, | 1615,56, | 1615,57, | 1615,58, | 1615,59, | 1615,60, | 1615,61, | 1615,62, | 1615,63, | 1615,64, | 1615,65, | 1615,66, | 1615,67, | 1615,68, | 1615,69, | 1615,70, | 1615,71, | 1615,72, | 1615,73, | 1615,74, | 1615,75, | 1615,76, | 1615,77, | 1615,78, | 1615,79, | 1615,80, | 1615,81, | 1615,82, | 1615,83, | 1615,84, | 1615,85, | 1616,1, | 1616,2, | 1616,3, | 1616,4, | 1616,5, | 1616,6, | 1616,7, | 1616,8, | 1616,9, | 1616,10, | 1616,11, | 1616,12, | 1616,13, | 1616,14, | 1616,15, | 1616,16, | 1616,17, | 1616,18, | 1616,19, | 1616,20, | 1616,21, | 1616,22, | 1616,23, | 1616,24, | 1616,25, | 1616,26, | 1616,27, | 1616,28, | 1616,29, | 1616,30, | 1616,31, | 1616,32, | 1616,33, | 1616,34, | 1616,35, | 1616,36, | 1616,37, | 1616,38, | 1616,39, | 1616,40, | 1616,41, | 1616,42, | 1616,43, | 1616,44, | 1616,45, | 1616,46, | 1616,47, | 1616,48, | 1616,49, | 1616,50, | 1616,51, | 1616,52, | 1616,53, | 1616,54, | 1616,55, | 1616,56, | 1616,57, | 1616,58, | 1616,59, | 1616,60, | 1616,61, | 1616,62, | 1616,63, | 1616,64, | 1616,65, | 1616,66, | 1616,67, | 1616,68, | 1616,69, | 1616,70, | 1616,71, | 1616,72, | 1616,73, | 1616,74, | 1616,75, | 1616,76, | 1616,77, | 1616,78, | 1616,79, | 1616,80, | 1616,81, | 1616,82, | 1616,83, | 1616,84, | 1616,85, | 1617,1, | 1617,2, | 1617,3, | 1617,4, | 1617,5, | 1617,6, | 1617,7, | 1617,8, | 1617,9, | 1617,10, | 1617,11, | 1617,12, | 1617,13, | 1617,14, | 1617,15, | 1617,16, | 1617,17, | 1617,18, | 1617,19, | 1617,20, | 1617,21, | 1617,22, | 1617,23, | 1617,24, | 1617,25, | 1617,26, | 1617,27, | 1617,28, | 1617,29, | 1617,30, | 1617,31, | 1617,32, | 1617,33, | 1617,34, | 1617,35, | 1617,36, | 1617,37, | 1617,38, | 1617,39, | 1617,40, | 1617,41, | 1617,42, | 1617,43, | 1617,44, | 1617,45, | 1617,46, | 1617,47, | 1617,48, | 1617,49, | 1617,50, | 1617,51, | 1617,52, | 1617,53, | 1617,54, | 1617,55, | 1617,56, | 1617,57, | 1617,58, | 1617,59, | 1617,60, | 1617,61, | 1617,62, | 1617,63, | 1617,64, | 1617,65, | 1617,66, | 1617,67, | 1617,68, | 1617,69, | 1617,70, | 1617,71, | 1617,72, | 1617,73, | 1617,74, | 1617,75, | 1617,76, | 1617,77, | 1617,78, | 1617,79, | 1617,80, | 1617,81, | 1617,82, | 1617,83, | 1617,84, | 1617,85, | 1618,1, | 1618,2, | 1618,3, | 1618,4, | 1618,5, | 1618,6, | 1618,7, | 1618,8, | 1618,9, | 1618,10, | 1618,11, | 1618,12, | 1618,13, | 1618,14, | 1618,15, | 1618,16, | 1618,17, | 1618,18, | 1618,19, | 1618,20, | 1618,21, | 1618,22, | 1618,23, | 1618,24, | 1618,25, | 1618,26, | 1618,27, | 1618,28, | 1618,29, | 1618,30, | 1618,31, | 1618,32, | 1618,33, | 1618,34, | 1618,35, | 1618,36, | 1618,37, | 1618,38, | 1618,39, | 1618,40, | 1618,41, | 1618,42, | 1618,43, | 1618,44, | 1618,45, | 1618,46, | 1618,47, | 1618,48, | 1618,49, | 1618,50, | 1618,51, | 1618,52, | 1618,53, | 1618,54, | 1618,55, | 1618,56, | 1618,57, | 1618,58, | 1618,59, | 1618,60, | 1618,61, | 1618,62, | 1618,63, | 1618,64, | 1618,65, | 1618,66, | 1618,67, | 1618,68, | 1618,69, | 1618,70, | 1618,71, | 1618,72, | 1618,73, | 1618,74, | 1618,75, | 1618,76, | 1618,77, | 1618,78, | 1618,79, | 1618,80, | 1618,81, | 1618,82, | 1618,83, | 1618,84, | 1618,85, | 1619,1, | 1619,2, | 1619,3, | 1619,4, | 1619,5, | 1619,6, | 1619,7, | 1619,8, | 1619,9, | 1619,10, | 1619,11, | 1619,12, | 1619,13, | 1619,14, | 1619,15, | 1619,16, | 1619,17, | 1619,18, | 1619,19, | 1619,20, | 1619,21, | 1619,22, | 1619,23, | 1619,24, | 1619,25, | 1619,26, | 1619,27, | 1619,28, | 1619,29, | 1619,30, | 1619,31, | 1619,32, | 1619,33, | 1619,34, | 1619,35, | 1619,36, | 1619,37, | 1619,38, | 1619,39, | 1619,40, | 1619,41, | 1619,42, | 1619,43, | 1619,44, | 1619,45, | 1619,46, | 1619,47, | 1619,48, | 1619,49, | 1619,50, | 1619,51, | 1619,52, | 1619,53, | 1619,54, | 1619,55, | 1619,56, | 1619,57, | 1619,58, | 1619,59, | 1619,60, | 1619,61, | 1619,62, | 1619,63, | 1619,64, | 1619,65, | 1619,66, | 1619,67, | 1619,68, | 1619,69, | 1619,70, | 1619,71, | 1619,72, | 1619,73, | 1619,74, | 1619,75, | 1619,76, | 1619,77, | 1619,78, | 1619,79, | 1619,80, | 1619,81, | 1619,82, | 1619,83, | 1619,84, | 1619,85, | 1620,1, | 1620,2, | 1620,3, | 1620,4, | 1620,5, | 1620,6, | 1620,7, | 1620,8, | 1620,9, | 1620,10, | 1620,11, | 1620,12, | 1620,13, | 1620,14, | 1620,15, | 1620,16, | 1620,17, | 1620,18, | 1620,19, | 1620,20, | 1620,21, | 1620,22, | 1620,23, | 1620,24, | 1620,25, | 1620,26, | 1620,27, | 1620,28, | 1620,29, | 1620,30, | 1620,31, | 1620,32, | 1620,33, | 1620,34, | 1620,35, | 1620,36, | 1620,37, | 1620,38, | 1620,39, | 1620,40, | 1620,41, | 1620,42, | 1620,43, | 1620,44, | 1620,45, | 1620,46, | 1620,47, | 1620,48, | 1620,49, | 1620,50, | 1620,51, | 1620,52, | 1620,53, | 1620,54, | 1620,55, | 1620,56, | 1620,57, | 1620,58, | 1620,59, | 1620,60, | 1620,61, | 1620,62, | 1620,63, | 1620,64, | 1620,65, | 1620,66, | 1620,67, | 1620,68, | 1620,69, | 1620,70, | 1620,71, | 1620,72, | 1620,73, | 1620,74, | 1620,75, | 1620,76, | 1620,77, | 1620,78, | 1620,79, | 1620,80, | 1620,81, | 1620,82, | 1620,83, | 1620,84, | 1620,85, | 1621,1, | 1621,2, | 1621,3, | 1621,4, | 1621,5, | 1621,6, | 1621,7, | 1621,8, | 1621,9, | 1621,10, | 1621,11, | 1621,12, | 1621,13, | 1621,14, | 1621,15, | 1621,16, | 1621,17, | 1621,18, | 1621,19, | 1621,20, | 1621,21, | 1621,22, | 1621,23, | 1621,24, | 1621,25, | 1621,26, | 1621,27, | 1621,28, | 1621,29, | 1621,30, | 1621,31, | 1621,32, | 1621,33, | 1621,34, | 1621,35, | 1621,36, | 1621,37, | 1621,38, | 1621,39, | 1621,40, | 1621,41, | 1621,42, | 1621,43, | 1621,44, | 1621,45, | 1621,46, | 1621,47, | 1621,48, | 1621,49, | 1621,50, | 1621,51, | 1621,52, | 1621,53, | 1621,54, | 1621,55, | 1621,56, | 1621,57, | 1621,58, | 1621,59, | 1621,60, | 1621,61, | 1621,62, | 1621,63, | 1621,64, | 1621,65, | 1621,66, | 1621,67, | 1621,68, | 1621,69, | 1621,70, | 1621,71, | 1621,72, | 1621,73, | 1621,74, | 1621,75, | 1621,76, | 1621,77, | 1621,78, | 1621,79, | 1621,80, | 1621,81, | 1621,82, | 1621,83, | 1621,84, | 1621,85, | 1622,1, | 1622,2, | 1622,3, | 1622,4, | 1622,5, | 1622,6, | 1622,7, | 1622,8, | 1622,9, | 1622,10, | 1622,11, | 1622,12, | 1622,13, | 1622,14, | 1622,15, | 1622,16, | 1622,17, | 1622,18, | 1622,19, | 1622,20, | 1622,21, | 1622,22, | 1622,23, | 1622,24, | 1622,25, | 1622,26, | 1622,27, | 1622,28, | 1622,29, | 1622,30, | 1622,31, | 1622,32, | 1622,33, | 1622,34, | 1622,35, | 1622,36, | 1622,37, | 1622,38, | 1622,39, | 1622,40, | 1622,41, | 1622,42, | 1622,43, | 1622,44, | 1622,45, | 1622,46, | 1622,47, | 1622,48, | 1622,49, | 1622,50, | 1622,51, | 1622,52, | 1622,53, | 1622,54, | 1622,55, | 1622,56, | 1622,57, | 1622,58, | 1622,59, | 1622,60, | 1622,61, | 1622,62, | 1622,63, | 1622,64, | 1622,65, | 1622,66, | 1622,67, | 1622,68, | 1622,69, | 1622,70, | 1622,71, | 1622,72, | 1622,73, | 1622,74, | 1622,75, | 1622,76, | 1622,77, | 1622,78, | 1622,79, | 1622,80, | 1622,81, | 1622,82, | 1622,83, | 1622,84, | 1622,85, | 1623,1, | 1623,2, | 1623,3, | 1623,4, | 1623,5, | 1623,6, | 1623,7, | 1623,8, | 1623,9, | 1623,10, | 1623,11, | 1623,12, | 1623,13, | 1623,14, | 1623,15, | 1623,16, | 1623,17, | 1623,18, | 1623,19, | 1623,20, | 1623,21, | 1623,22, | 1623,23, | 1623,24, | 1623,25, | 1623,26, | 1623,27, | 1623,28, | 1623,29, | 1623,30, | 1623,31, | 1623,32, | 1623,33, | 1623,34, | 1623,35, | 1623,36, | 1623,37, | 1623,38, | 1623,39, | 1623,40, | 1623,41, | 1623,42, | 1623,43, | 1623,44, | 1623,45, | 1623,46, | 1623,47, | 1623,48, | 1623,49, | 1623,50, | 1623,51, | 1623,52, | 1623,53, | 1623,54, | 1623,55, | 1623,56, | 1623,57, | 1623,58, | 1623,59, | 1623,60, | 1623,61, | 1623,62, | 1623,63, | 1623,64, | 1623,65, | 1623,66, | 1623,67, | 1623,68, | 1623,69, | 1623,70, | 1623,71, | 1623,72, | 1623,73, | 1623,74, | 1623,75, | 1623,76, | 1623,77, | 1623,78, | 1623,79, | 1623,80, | 1623,81, | 1623,82, | 1623,83, | 1623,84, | 1623,85, | 1624,1, | 1624,2, | 1624,3, | 1624,4, | 1624,5, | 1624,6, | 1624,7, | 1624,8, | 1624,9, | 1624,10, | 1624,11, | 1624,12, | 1624,13, | 1624,14, | 1624,15, | 1624,16, | 1624,17, | 1624,18, | 1624,19, | 1624,20, | 1624,21, | 1624,22, | 1624,23, | 1624,24, | 1624,25, | 1624,26, | 1624,27, | 1624,28, | 1624,29, | 1624,30, | 1624,31, | 1624,32, | 1624,33, | 1624,34, | 1624,35, | 1624,36, | 1624,37, | 1624,38, | 1624,39, | 1624,40, | 1624,41, | 1624,42, | 1624,43, | 1624,44, | 1624,45, | 1624,46, | 1624,47, | 1624,48, | 1624,49, | 1624,50, | 1624,51, | 1624,52, | 1624,53, | 1624,54, | 1624,55, | 1624,56, | 1624,57, | 1624,58, | 1624,59, | 1624,60, | 1624,61, | 1624,62, | 1624,63, | 1624,64, | 1624,65, | 1624,66, | 1624,67, | 1624,68, | 1624,69, | 1624,70, | 1624,71, | 1624,72, | 1624,73, | 1624,74, | 1624,75, | 1624,76, | 1624,77, | 1624,78, | 1624,79, | 1624,80, | 1624,81, | 1624,82, | 1624,83, | 1624,84, | 1624,85, | 1625,1, | 1625,2, | 1625,3, | 1625,4, | 1625,5, | 1625,6, | 1625,7, | 1625,8, | 1625,9, | 1625,10, | 1625,11, | 1625,12, | 1625,13, | 1625,14, | 1625,15, | 1625,16, | 1625,17, | 1625,18, | 1625,19, | 1625,20, | 1625,21, | 1625,22, | 1625,23, | 1625,24, | 1625,25, | 1625,26, | 1625,27, | 1625,28, | 1625,29, | 1625,30, | 1625,31, | 1625,32, | 1625,33, | 1625,34, | 1625,35, | 1625,36, | 1625,37, | 1625,38, | 1625,39, | 1625,40, | 1625,41, | 1625,42, | 1625,43, | 1625,44, | 1625,45, | 1625,46, | 1625,47, | 1625,48, | 1625,49, | 1625,50, | 1625,51, | 1625,52, | 1625,53, | 1625,54, | 1625,55, | 1625,56, | 1625,57, | 1625,58, | 1625,59, | 1625,60, | 1625,61, | 1625,62, | 1625,63, | 1625,64, | 1625,65, | 1625,66, | 1625,67, | 1625,68, | 1625,69, | 1625,70, | 1625,71, | 1625,72, | 1625,73, | 1625,74, | 1625,75, | 1625,76, | 1625,77, | 1625,78, | 1625,79, | 1625,80, | 1625,81, | 1625,82, | 1625,83, | 1625,84, | 1625,85, | 1626,1, | 1626,2, | 1626,3, | 1626,4, | 1626,5, | 1626,6, | 1626,7, | 1626,8, | 1626,9, | 1626,10, | 1626,11, | 1626,12, | 1626,13, | 1626,14, | 1626,15, | 1626,16, | 1626,17, | 1626,18, | 1626,19, | 1626,20, | 1626,21, | 1626,22, | 1626,23, | 1626,24, | 1626,25, | 1626,26, | 1626,27, | 1626,28, | 1626,29, | 1626,30, | 1626,31, | 1626,32, | 1626,33, | 1626,34, | 1626,35, | 1626,36, | 1626,37, | 1626,38, | 1626,39, | 1626,40, | 1626,41, | 1626,42, | 1626,43, | 1626,44, | 1626,45, | 1626,46, | 1626,47, | 1626,48, | 1626,49, | 1626,50, | 1626,51, | 1626,52, | 1626,53, | 1626,54, | 1626,55, | 1626,56, | 1626,57, | 1626,58, | 1626,59, | 1626,60, | 1626,61, | 1626,62, | 1626,63, | 1626,64, | 1626,65, | 1626,66, | 1626,67, | 1626,68, | 1626,69, | 1626,70, | 1626,71, | 1626,72, | 1626,73, | 1626,74, | 1626,75, | 1626,76, | 1626,77, | 1626,78, | 1626,79, | 1626,80, | 1626,81, | 1626,82, | 1626,83, | 1626,84, | 1626,85, | 1627,1, | 1627,2, | 1627,3, | 1627,4, | 1627,5, | 1627,6, | 1627,7, | 1627,8, | 1627,9, | 1627,10, | 1627,11, | 1627,12, | 1627,13, | 1627,14, | 1627,15, | 1627,16, | 1627,17, | 1627,18, | 1627,19, | 1627,20, | 1627,21, | 1627,22, | 1627,23, | 1627,24, | 1627,25, | 1627,26, | 1627,27, | 1627,28, | 1627,29, | 1627,30, | 1627,31, | 1627,32, | 1627,33, | 1627,34, | 1627,35, | 1627,36, | 1627,37, | 1627,38, | 1627,39, | 1627,40, | 1627,41, | 1627,42, | 1627,43, | 1627,44, | 1627,45, | 1627,46, | 1627,47, | 1627,48, | 1627,49, | 1627,50, | 1627,51, | 1627,52, | 1627,53, | 1627,54, | 1627,55, | 1627,56, | 1627,57, | 1627,58, | 1627,59, | 1627,60, | 1627,61, | 1627,62, | 1627,63, | 1627,64, | 1627,65, | 1627,66, | 1627,67, | 1627,68, | 1627,69, | 1627,70, | 1627,71, | 1627,72, | 1627,73, | 1627,74, | 1627,75, | 1627,76, | 1627,77, | 1627,78, | 1627,79, | 1627,80, | 1627,81, | 1627,82, | 1627,83, | 1627,84, | 1627,85, | 1628,1, | 1628,2, | 1628,3, | 1628,4, | 1628,5, | 1628,6, | 1628,7, | 1628,8, | 1628,9, | 1628,10, | 1628,11, | 1628,12, | 1628,13, | 1628,14, | 1628,15, | 1628,16, | 1628,17, | 1628,18, | 1628,19, | 1628,20, | 1628,21, | 1628,22, | 1628,23, | 1628,24, | 1628,25, | 1628,26, | 1628,27, | 1628,28, | 1628,29, | 1628,30, | 1628,31, | 1628,32, | 1628,33, | 1628,34, | 1628,35, | 1628,36, | 1628,37, | 1628,38, | 1628,39, | 1628,40, | 1628,41, | 1628,42, | 1628,43, | 1628,44, | 1628,45, | 1628,46, | 1628,47, | 1628,48, | 1628,49, | 1628,50, | 1628,51, | 1628,52, | 1628,53, | 1628,54, | 1628,55, | 1628,56, | 1628,57, | 1628,58, | 1628,59, | 1628,60, | 1628,61, | 1628,62, | 1628,63, | 1628,64, | 1628,65, | 1628,66, | 1628,67, | 1628,68, | 1628,69, | 1628,70, | 1628,71, | 1628,72, | 1628,73, | 1628,74, | 1628,75, | 1628,76, | 1628,77, | 1628,78, | 1628,79, | 1628,80, | 1628,81, | 1628,82, | 1628,83, | 1628,84, | 1628,85, | 1629,1, | 1629,2, | 1629,3, | 1629,4, | 1629,5, | 1629,6, | 1629,7, | 1629,8, | 1629,9, | 1629,10, | 1629,11, | 1629,12, | 1629,13, | 1629,14, | 1629,15, | 1629,16, | 1629,17, | 1629,18, | 1629,19, | 1629,20, | 1629,21, | 1629,22, | 1629,23, | 1629,24, | 1629,25, | 1629,26, | 1629,27, | 1629,28, | 1629,29, | 1629,30, | 1629,31, | 1629,32, | 1629,33, | 1629,34, | 1629,35, | 1629,36, | 1629,37, | 1629,38, | 1629,39, | 1629,40, | 1629,41, | 1629,42, | 1629,43, | 1629,44, | 1629,45, | 1629,46, | 1629,47, | 1629,48, | 1629,49, | 1629,50, | 1629,51, | 1629,52, | 1629,53, | 1629,54, | 1629,55, | 1629,56, | 1629,57, | 1629,58, | 1629,59, | 1629,60, | 1629,61, | 1629,62, | 1629,63, | 1629,64, | 1629,65, | 1629,66, | 1629,67, | 1629,68, | 1629,69, | 1629,70, | 1629,71, | 1629,72, | 1629,73, | 1629,74, | 1629,75, | 1629,76, | 1629,77, | 1629,78, | 1629,79, | 1629,80, | 1629,81, | 1629,82, | 1629,83, | 1629,84, | 1629,85, | 1630,1, | 1630,2, | 1630,3, | 1630,4, | 1630,5, | 1630,6, | 1630,7, | 1630,8, | 1630,9, | 1630,10, | 1630,11, | 1630,12, | 1630,13, | 1630,14, | 1630,15, | 1630,16, | 1630,17, | 1630,18, | 1630,19, | 1630,20, | 1630,21, | 1630,22, | 1630,23, | 1630,24, | 1630,25, | 1630,26, | 1630,27, | 1630,28, | 1630,29, | 1630,30, | 1630,31, | 1630,32, | 1630,33, | 1630,34, | 1630,35, | 1630,36, | 1630,37, | 1630,38, | 1630,39, | 1630,40, | 1630,41, | 1630,42, | 1630,43, | 1630,44, | 1630,45, | 1630,46, | 1630,47, | 1630,48, | 1630,49, | 1630,50, | 1630,51, | 1630,52, | 1630,53, | 1630,54, | 1630,55, | 1630,56, | 1630,57, | 1630,58, | 1630,59, | 1630,60, | 1630,61, | 1630,62, | 1630,63, | 1630,64, | 1630,65, | 1630,66, | 1630,67, | 1630,68, | 1630,69, | 1630,70, | 1630,71, | 1630,72, | 1630,73, | 1630,74, | 1630,75, | 1630,76, | 1630,77, | 1630,78, | 1630,79, | 1630,80, | 1630,81, | 1630,82, | 1630,83, | 1630,84, | 1630,85, | 1631,1, | 1631,2, | 1631,3, | 1631,4, | 1631,5, | 1631,6, | 1631,7, | 1631,8, | 1631,9, | 1631,10, | 1631,11, | 1631,12, | 1631,13, | 1631,14, | 1631,15, | 1631,16, | 1631,17, | 1631,18, | 1631,19, | 1631,20, | 1631,21, | 1631,22, | 1631,23, | 1631,24, | 1631,25, | 1631,26, | 1631,27, | 1631,28, | 1631,29, | 1631,30, | 1631,31, | 1631,32, | 1631,33, | 1631,34, | 1631,35, | 1631,36, | 1631,37, | 1631,38, | 1631,39, | 1631,40, | 1631,41, | 1631,42, | 1631,43, | 1631,44, | 1631,45, | 1631,46, | 1631,47, | 1631,48, | 1631,49, | 1631,50, | 1631,51, | 1631,52, | 1631,53, | 1631,54, | 1631,55, | 1631,56, | 1631,57, | 1631,58, | 1631,59, | 1631,60, | 1631,61, | 1631,62, | 1631,63, | 1631,64, | 1631,65, | 1631,66, | 1631,67, | 1631,68, | 1631,69, | 1631,70, | 1631,71, | 1631,72, | 1631,73, | 1631,74, | 1631,75, | 1631,76, | 1631,77, | 1631,78, | 1631,79, | 1631,80, | 1631,81, | 1631,82, | 1631,83, | 1631,84, | 1631,85, | 1632,1, | 1632,2, | 1632,3, | 1632,4, | 1632,5, | 1632,6, | 1632,7, | 1632,8, | 1632,9, | 1632,10, | 1632,11, | 1632,12, | 1632,13, | 1632,14, | 1632,15, | 1632,16, | 1632,17, | 1632,18, | 1632,19, | 1632,20, | 1632,21, | 1632,22, | 1632,23, | 1632,24, | 1632,25, | 1632,26, | 1632,27, | 1632,28, | 1632,29, | 1632,30, | 1632,31, | 1632,32, | 1632,33, | 1632,34, | 1632,35, | 1632,36, | 1632,37, | 1632,38, | 1632,39, | 1632,40, | 1632,41, | 1632,42, | 1632,43, | 1632,44, | 1632,45, | 1632,46, | 1632,47, | 1632,48, | 1632,49, | 1632,50, | 1632,51, | 1632,52, | 1632,53, | 1632,54, | 1632,55, | 1632,56, | 1632,57, | 1632,58, | 1632,59, | 1632,60, | 1632,61, | 1632,62, | 1632,63, | 1632,64, | 1632,65, | 1632,66, | 1632,67, | 1632,68, | 1632,69, | 1632,70, | 1632,71, | 1632,72, | 1632,73, | 1632,74, | 1632,75, | 1632,76, | 1632,77, | 1632,78, | 1632,79, | 1632,80, | 1632,81, | 1632,82, | 1632,83, | 1632,84, | 1632,85, | 1633,1, | 1633,2, | 1633,3, | 1633,4, | 1633,5, | 1633,6, | 1633,7, | 1633,8, | 1633,9, | 1633,10, | 1633,11, | 1633,12, | 1633,13, | 1633,14, | 1633,15, | 1633,16, | 1633,17, | 1633,18, | 1633,19, | 1633,20, | 1633,21, | 1633,22, | 1633,23, | 1633,24, | 1633,25, | 1633,26, | 1633,27, | 1633,28, | 1633,29, | 1633,30, | 1633,31, | 1633,32, | 1633,33, | 1633,34, | 1633,35, | 1633,36, | 1633,37, | 1633,38, | 1633,39, | 1633,40, | 1633,41, | 1633,42, | 1633,43, | 1633,44, | 1633,45, | 1633,46, | 1633,47, | 1633,48, | 1633,49, | 1633,50, | 1633,51, | 1633,52, | 1633,53, | 1633,54, | 1633,55, | 1633,56, | 1633,57, | 1633,58, | 1633,59, | 1633,60, | 1633,61, | 1633,62, | 1633,63, | 1633,64, | 1633,65, | 1633,66, | 1633,67, | 1633,68, | 1633,69, | 1633,70, | 1633,71, | 1633,72, | 1633,73, | 1633,74, | 1633,75, | 1633,76, | 1633,77, | 1633,78, | 1633,79, | 1633,80, | 1633,81, | 1633,82, | 1633,83, | 1633,84, | 1633,85, | 1634,1, | 1634,2, | 1634,3, | 1634,4, | 1634,5, | 1634,6, | 1634,7, | 1634,8, | 1634,9, | 1634,10, | 1634,11, | 1634,12, | 1634,13, | 1634,14, | 1634,15, | 1634,16, | 1634,17, | 1634,18, | 1634,19, | 1634,20, | 1634,21, | 1634,22, | 1634,23, | 1634,24, | 1634,25, | 1634,26, | 1634,27, | 1634,28, | 1634,29, | 1634,30, | 1634,31, | 1634,32, | 1634,33, | 1634,34, | 1634,35, | 1634,36, | 1634,37, | 1634,38, | 1634,39, | 1634,40, | 1634,41, | 1634,42, | 1634,43, | 1634,44, | 1634,45, | 1634,46, | 1634,47, | 1634,48, | 1634,49, | 1634,50, | 1634,51, | 1634,52, | 1634,53, | 1634,54, | 1634,55, | 1634,56, | 1634,57, | 1634,58, | 1634,59, | 1634,60, | 1634,61, | 1634,62, | 1634,63, | 1634,64, | 1634,65, | 1634,66, | 1634,67, | 1634,68, | 1634,69, | 1634,70, | 1634,71, | 1634,72, | 1634,73, | 1634,74, | 1634,75, | 1634,76, | 1634,77, | 1634,78, | 1634,79, | 1634,80, | 1634,81, | 1634,82, | 1634,83, | 1634,84, | 1634,85, | 1635,1, | 1635,2, | 1635,3, | 1635,4, | 1635,5, | 1635,6, | 1635,7, | 1635,8, | 1635,9, | 1635,10, | 1635,11, | 1635,12, | 1635,13, | 1635,14, | 1635,15, | 1635,16, | 1635,17, | 1635,18, | 1635,19, | 1635,20, | 1635,21, | 1635,22, | 1635,23, | 1635,24, | 1635,25, | 1635,26, | 1635,27, | 1635,28, | 1635,29, | 1635,30, | 1635,31, | 1635,32, | 1635,33, | 1635,34, | 1635,35, | 1635,36, | 1635,37, | 1635,38, | 1635,39, | 1635,40, | 1635,41, | 1635,42, | 1635,43, | 1635,44, | 1635,45, | 1635,46, | 1635,47, | 1635,48, | 1635,49, | 1635,50, | 1635,51, | 1635,52, | 1635,53, | 1635,54, | 1635,55, | 1635,56, | 1635,57, | 1635,58, | 1635,59, | 1635,60, | 1635,61, | 1635,62, | 1635,63, | 1635,64, | 1635,65, | 1635,66, | 1635,67, | 1635,68, | 1635,69, | 1635,70, | 1635,71, | 1635,72, | 1635,73, | 1635,74, | 1635,75, | 1635,76, | 1635,77, | 1635,78, | 1635,79, | 1635,80, | 1635,81, | 1635,82, | 1635,83, | 1635,84, | 1635,85, | 1636,1, | 1636,2, | 1636,3, | 1636,4, | 1636,5, | 1636,6, | 1636,7, | 1636,8, | 1636,9, | 1636,10, | 1636,11, | 1636,12, | 1636,13, | 1636,14, | 1636,15, | 1636,16, | 1636,17, | 1636,18, | 1636,19, | 1636,20, | 1636,21, | 1636,22, | 1636,23, | 1636,24, | 1636,25, | 1636,26, | 1636,27, | 1636,28, | 1636,29, | 1636,30, | 1636,31, | 1636,32, | 1636,33, | 1636,34, | 1636,35, | 1636,36, | 1636,37, | 1636,38, | 1636,39, | 1636,40, | 1636,41, | 1636,42, | 1636,43, | 1636,44, | 1636,45, | 1636,46, | 1636,47, | 1636,48, | 1636,49, | 1636,50, | 1636,51, | 1636,52, | 1636,53, | 1636,54, | 1636,55, | 1636,56, | 1636,57, | 1636,58, | 1636,59, | 1636,60, | 1636,61, | 1636,62, | 1636,63, | 1636,64, | 1636,65, | 1636,66, | 1636,67, | 1636,68, | 1636,69, | 1636,70, | 1636,71, | 1636,72, | 1636,73, | 1636,74, | 1636,75, | 1636,76, | 1636,77, | 1636,78, | 1636,79, | 1636,80, | 1636,81, | 1636,82, | 1636,83, | 1636,84, | 1636,85, | 1637,1, | 1637,2, | 1637,3, | 1637,4, | 1637,5, | 1637,6, | 1637,7, | 1637,8, | 1637,9, | 1637,10, | 1637,11, | 1637,12, | 1637,13, | 1637,14, | 1637,15, | 1637,16, | 1637,17, | 1637,18, | 1637,19, | 1637,20, | 1637,21, | 1637,22, | 1637,23, | 1637,24, | 1637,25, | 1637,26, | 1637,27, | 1637,28, | 1637,29, | 1637,30, | 1637,31, | 1637,32, | 1637,33, | 1637,34, | 1637,35, | 1637,36, | 1637,37, | 1637,38, | 1637,39, | 1637,40, | 1637,41, | 1637,42, | 1637,43, | 1637,44, | 1637,45, | 1637,46, | 1637,47, | 1637,48, | 1637,49, | 1637,50, | 1637,51, | 1637,52, | 1637,53, | 1637,54, | 1637,55, | 1637,56, | 1637,57, | 1637,58, | 1637,59, | 1637,60, | 1637,61, | 1637,62, | 1637,63, | 1637,64, | 1637,65, | 1637,66, | 1637,67, | 1637,68, | 1637,69, | 1637,70, | 1637,71, | 1637,72, | 1637,73, | 1637,74, | 1637,75, | 1637,76, | 1637,77, | 1637,78, | 1637,79, | 1637,80, | 1637,81, | 1637,82, | 1637,83, | 1637,84, | 1637,85, | 1638,1, | 1638,2, | 1638,3, | 1638,4, | 1638,5, | 1638,6, | 1638,7, | 1638,8, | 1638,9, | 1638,10, | 1638,11, | 1638,12, | 1638,13, | 1638,14, | 1638,15, | 1638,16, | 1638,17, | 1638,18, | 1638,19, | 1638,20, | 1638,21, | 1638,22, | 1638,23, | 1638,24, | 1638,25, | 1638,26, | 1638,27, | 1638,28, | 1638,29, | 1638,30, | 1638,31, | 1638,32, | 1638,33, | 1638,34, | 1638,35, | 1638,36, | 1638,37, | 1638,38, | 1638,39, | 1638,40, | 1638,41, | 1638,42, | 1638,43, | 1638,44, | 1638,45, | 1638,46, | 1638,47, | 1638,48, | 1638,49, | 1638,50, | 1638,51, | 1638,52, | 1638,53, | 1638,54, | 1638,55, | 1638,56, | 1638,57, | 1638,58, | 1638,59, | 1638,60, | 1638,61, | 1638,62, | 1638,63, | 1638,64, | 1638,65, | 1638,66, | 1638,67, | 1638,68, | 1638,69, | 1638,70, | 1638,71, | 1638,72, | 1638,73, | 1638,74, | 1638,75, | 1638,76, | 1638,77, | 1638,78, | 1638,79, | 1638,80, | 1638,81, | 1638,82, | 1638,83, | 1638,84, | 1638,85, | 1639,1, | 1639,2, | 1639,3, | 1639,4, | 1639,5, | 1639,6, | 1639,7, | 1639,8, | 1639,9, | 1639,10, | 1639,11, | 1639,12, | 1639,13, | 1639,14, | 1639,15, | 1639,16, | 1639,17, | 1639,18, | 1639,19, | 1639,20, | 1639,21, | 1639,22, | 1639,23, | 1639,24, | 1639,25, | 1639,26, | 1639,27, | 1639,28, | 1639,29, | 1639,30, | 1639,31, | 1639,32, | 1639,33, | 1639,34, | 1639,35, | 1639,36, | 1639,37, | 1639,38, | 1639,39, | 1639,40, | 1639,41, | 1639,42, | 1639,43, | 1639,44, | 1639,45, | 1639,46, | 1639,47, | 1639,48, | 1639,49, | 1639,50, | 1639,51, | 1639,52, | 1639,53, | 1639,54, | 1639,55, | 1639,56, | 1639,57, | 1639,58, | 1639,59, | 1639,60, | 1639,61, | 1639,62, | 1639,63, | 1639,64, | 1639,65, | 1639,66, | 1639,67, | 1639,68, | 1639,69, | 1639,70, | 1639,71, | 1639,72, | 1639,73, | 1639,74, | 1639,75, | 1639,76, | 1639,77, | 1639,78, | 1639,79, | 1639,80, | 1639,81, | 1639,82, | 1639,83, | 1639,84, | 1639,85, | 1640,1, | 1640,2, | 1640,3, | 1640,4, | 1640,5, | 1640,6, | 1640,7, | 1640,8, | 1640,9, | 1640,10, | 1640,11, | 1640,12, | 1640,13, | 1640,14, | 1640,15, | 1640,16, | 1640,17, | 1640,18, | 1640,19, | 1640,20, | 1640,21, | 1640,22, | 1640,23, | 1640,24, | 1640,25, | 1640,26, | 1640,27, | 1640,28, | 1640,29, | 1640,30, | 1640,31, | 1640,32, | 1640,33, | 1640,34, | 1640,35, | 1640,36, | 1640,37, | 1640,38, | 1640,39, | 1640,40, | 1640,41, | 1640,42, | 1640,43, | 1640,44, | 1640,45, | 1640,46, | 1640,47, | 1640,48, | 1640,49, | 1640,50, | 1640,51, | 1640,52, | 1640,53, | 1640,54, | 1640,55, | 1640,56, | 1640,57, | 1640,58, | 1640,59, | 1640,60, | 1640,61, | 1640,62, | 1640,63, | 1640,64, | 1640,65, | 1640,66, | 1640,67, | 1640,68, | 1640,69, | 1640,70, | 1640,71, | 1640,72, | 1640,73, | 1640,74, | 1640,75, | 1640,76, | 1640,77, | 1640,78, | 1640,79, | 1640,80, | 1640,81, | 1640,82, | 1640,83, | 1640,84, | 1640,85, | 1641,1, | 1641,2, | 1641,3, | 1641,4, | 1641,5, | 1641,6, | 1641,7, | 1641,8, | 1641,9, | 1641,10, | 1641,11, | 1641,12, | 1641,13, | 1641,14, | 1641,15, | 1641,16, | 1641,17, | 1641,18, | 1641,19, | 1641,20, | 1641,21, | 1641,22, | 1641,23, | 1641,24, | 1641,25, | 1641,26, | 1641,27, | 1641,28, | 1641,29, | 1641,30, | 1641,31, | 1641,32, | 1641,33, | 1641,34, | 1641,35, | 1641,36, | 1641,37, | 1641,38, | 1641,39, | 1641,40, | 1641,41, | 1641,42, | 1641,43, | 1641,44, | 1641,45, | 1641,46, | 1641,47, | 1641,48, | 1641,49, | 1641,50, | 1641,51, | 1641,52, | 1641,53, | 1641,54, | 1641,55, | 1641,56, | 1641,57, | 1641,58, | 1641,59, | 1641,60, | 1641,61, | 1641,62, | 1641,63, | 1641,64, | 1641,65, | 1641,66, | 1641,67, | 1641,68, | 1641,69, | 1641,70, | 1641,71, | 1641,72, | 1641,73, | 1641,74, | 1641,75, | 1641,76, | 1641,77, | 1641,78, | 1641,79, | 1641,80, | 1641,81, | 1641,82, | 1641,83, | 1641,84, | 1641,85, | 1642,1, | 1642,2, | 1642,3, | 1642,4, | 1642,5, | 1642,6, | 1642,7, | 1642,8, | 1642,9, | 1642,10, | 1642,11, | 1642,12, | 1642,13, | 1642,14, | 1642,15, | 1642,16, | 1642,17, | 1642,18, | 1642,19, | 1642,20, | 1642,21, | 1642,22, | 1642,23, | 1642,24, | 1642,25, | 1642,26, | 1642,27, | 1642,28, | 1642,29, | 1642,30, | 1642,31, | 1642,32, | 1642,33, | 1642,34, | 1642,35, | 1642,36, | 1642,37, | 1642,38, | 1642,39, | 1642,40, | 1642,41, | 1642,42, | 1642,43, | 1642,44, | 1642,45, | 1642,46, | 1642,47, | 1642,48, | 1642,49, | 1642,50, | 1642,51, | 1642,52, | 1642,53, | 1642,54, | 1642,55, | 1642,56, | 1642,57, | 1642,58, | 1642,59, | 1642,60, | 1642,61, | 1642,62, | 1642,63, | 1642,64, | 1642,65, | 1642,66, | 1642,67, | 1642,68, | 1642,69, | 1642,70, | 1642,71, | 1642,72, | 1642,73, | 1642,74, | 1642,75, | 1642,76, | 1642,77, | 1642,78, | 1642,79, | 1642,80, | 1642,81, | 1642,82, | 1642,83, | 1642,84, | 1642,85, | 1643,1, | 1643,2, | 1643,3, | 1643,4, | 1643,5, | 1643,6, | 1643,7, | 1643,8, | 1643,9, | 1643,10, | 1643,11, | 1643,12, | 1643,13, | 1643,14, | 1643,15, | 1643,16, | 1643,17, | 1643,18, | 1643,19, | 1643,20, | 1643,21, | 1643,22, | 1643,23, | 1643,24, | 1643,25, | 1643,26, | 1643,27, | 1643,28, | 1643,29, | 1643,30, | 1643,31, | 1643,32, | 1643,33, | 1643,34, | 1643,35, | 1643,36, | 1643,37, | 1643,38, | 1643,39, | 1643,40, | 1643,41, | 1643,42, | 1643,43, | 1643,44, | 1643,45, | 1643,46, | 1643,47, | 1643,48, | 1643,49, | 1643,50, | 1643,51, | 1643,52, | 1643,53, | 1643,54, | 1643,55, | 1643,56, | 1643,57, | 1643,58, | 1643,59, | 1643,60, | 1643,61, | 1643,62, | 1643,63, | 1643,64, | 1643,65, | 1643,66, | 1643,67, | 1643,68, | 1643,69, | 1643,70, | 1643,71, | 1643,72, | 1643,73, | 1643,74, | 1643,75, | 1643,76, | 1643,77, | 1643,78, | 1643,79, | 1643,80, | 1643,81, | 1643,82, | 1643,83, | 1643,84, | 1643,85, | 1644,1, | 1644,2, | 1644,3, | 1644,4, | 1644,5, | 1644,6, | 1644,7, | 1644,8, | 1644,9, | 1644,10, | 1644,11, | 1644,12, | 1644,13, | 1644,14, | 1644,15, | 1644,16, | 1644,17, | 1644,18, | 1644,19, | 1644,20, | 1644,21, | 1644,22, | 1644,23, | 1644,24, | 1644,25, | 1644,26, | 1644,27, | 1644,28, | 1644,29, | 1644,30, | 1644,31, | 1644,32, | 1644,33, | 1644,34, | 1644,35, | 1644,36, | 1644,37, | 1644,38, | 1644,39, | 1644,40, | 1644,41, | 1644,42, | 1644,43, | 1644,44, | 1644,45, | 1644,46, | 1644,47, | 1644,48, | 1644,49, | 1644,50, | 1644,51, | 1644,52, | 1644,53, | 1644,54, | 1644,55, | 1644,56, | 1644,57, | 1644,58, | 1644,59, | 1644,60, | 1644,61, | 1644,62, | 1644,63, | 1644,64, | 1644,65, | 1644,66, | 1644,67, | 1644,68, | 1644,69, | 1644,70, | 1644,71, | 1644,72, | 1644,73, | 1644,74, | 1644,75, | 1644,76, | 1644,77, | 1644,78, | 1644,79, | 1644,80, | 1644,81, | 1644,82, | 1644,83, | 1644,84, | 1644,85, | 1645,1, | 1645,2, | 1645,3, | 1645,4, | 1645,5, | 1645,6, | 1645,7, | 1645,8, | 1645,9, | 1645,10, | 1645,11, | 1645,12, | 1645,13, | 1645,14, | 1645,15, | 1645,16, | 1645,17, | 1645,18, | 1645,19, | 1645,20, | 1645,21, | 1645,22, | 1645,23, | 1645,24, | 1645,25, | 1645,26, | 1645,27, | 1645,28, | 1645,29, | 1645,30, | 1645,31, | 1645,32, | 1645,33, | 1645,34, | 1645,35, | 1645,36, | 1645,37, | 1645,38, | 1645,39, | 1645,40, | 1645,41, | 1645,42, | 1645,43, | 1645,44, | 1645,45, | 1645,46, | 1645,47, | 1645,48, | 1645,49, | 1645,50, | 1645,51, | 1645,52, | 1645,53, | 1645,54, | 1645,55, | 1645,56, | 1645,57, | 1645,58, | 1645,59, | 1645,60, | 1645,61, | 1645,62, | 1645,63, | 1645,64, | 1645,65, | 1645,66, | 1645,67, | 1645,68, | 1645,69, | 1645,70, | 1645,71, | 1645,72, | 1645,73, | 1645,74, | 1645,75, | 1645,76, | 1645,77, | 1645,78, | 1645,79, | 1645,80, | 1645,81, | 1645,82, | 1645,83, | 1645,84, | 1645,85, | 1646,1, | 1646,2, | 1646,3, | 1646,4, | 1646,5, | 1646,6, | 1646,7, | 1646,8, | 1646,9, | 1646,10, | 1646,11, | 1646,12, | 1646,13, | 1646,14, | 1646,15, | 1646,16, | 1646,17, | 1646,18, | 1646,19, | 1646,20, | 1646,21, | 1646,22, | 1646,23, | 1646,24, | 1646,25, | 1646,26, | 1646,27, | 1646,28, | 1646,29, | 1646,30, | 1646,31, | 1646,32, | 1646,33, | 1646,34, | 1646,35, | 1646,36, | 1646,37, | 1646,38, | 1646,39, | 1646,40, | 1646,41, | 1646,42, | 1646,43, | 1646,44, | 1646,45, | 1646,46, | 1646,47, | 1646,48, | 1646,49, | 1646,50, | 1646,51, | 1646,52, | 1646,53, | 1646,54, | 1646,55, | 1646,56, | 1646,57, | 1646,58, | 1646,59, | 1646,60, | 1646,61, | 1646,62, | 1646,63, | 1646,64, | 1646,65, | 1646,66, | 1646,67, | 1646,68, | 1646,69, | 1646,70, | 1646,71, | 1646,72, | 1646,73, | 1646,74, | 1646,75, | 1646,76, | 1646,77, | 1646,78, | 1646,79, | 1646,80, | 1646,81, | 1646,82, | 1646,83, | 1646,84, | 1646,85, | 1647,1, | 1647,2, | 1647,3, | 1647,4, | 1647,5, | 1647,6, | 1647,7, | 1647,8, | 1647,9, | 1647,10, | 1647,11, | 1647,12, | 1647,13, | 1647,14, | 1647,15, | 1647,16, | 1647,17, | 1647,18, | 1647,19, | 1647,20, | 1647,21, | 1647,22, | 1647,23, | 1647,24, | 1647,25, | 1647,26, | 1647,27, | 1647,28, | 1647,29, | 1647,30, | 1647,31, | 1647,32, | 1647,33, | 1647,34, | 1647,35, | 1647,36, | 1647,37, | 1647,38, | 1647,39, | 1647,40, | 1647,41, | 1647,42, | 1647,43, | 1647,44, | 1647,45, | 1647,46, | 1647,47, | 1647,48, | 1647,49, | 1647,50, | 1647,51, | 1647,52, | 1647,53, | 1647,54, | 1647,55, | 1647,56, | 1647,57, | 1647,58, | 1647,59, | 1647,60, | 1647,61, | 1647,62, | 1647,63, | 1647,64, | 1647,65, | 1647,66, | 1647,67, | 1647,68, | 1647,69, | 1647,70, | 1647,71, | 1647,72, | 1647,73, | 1647,74, | 1647,75, | 1647,76, | 1647,77, | 1647,78, | 1647,79, | 1647,80, | 1647,81, | 1647,82, | 1647,83, | 1647,84, | 1647,85, | 1648,1, | 1648,2, | 1648,3, | 1648,4, | 1648,5, | 1648,6, | 1648,7, | 1648,8, | 1648,9, | 1648,10, | 1648,11, | 1648,12, | 1648,13, | 1648,14, | 1648,15, | 1648,16, | 1648,17, | 1648,18, | 1648,19, | 1648,20, | 1648,21, | 1648,22, | 1648,23, | 1648,24, | 1648,25, | 1648,26, | 1648,27, | 1648,28, | 1648,29, | 1648,30, | 1648,31, | 1648,32, | 1648,33, | 1648,34, | 1648,35, | 1648,36, | 1648,37, | 1648,38, | 1648,39, | 1648,40, | 1648,41, | 1648,42, | 1648,43, | 1648,44, | 1648,45, | 1648,46, | 1648,47, | 1648,48, | 1648,49, | 1648,50, | 1648,51, | 1648,52, | 1648,53, | 1648,54, | 1648,55, | 1648,56, | 1648,57, | 1648,58, | 1648,59, | 1648,60, | 1648,61, | 1648,62, | 1648,63, | 1648,64, | 1648,65, | 1648,66, | 1648,67, | 1648,68, | 1648,69, | 1648,70, | 1648,71, | 1648,72, | 1648,73, | 1648,74, | 1648,75, | 1648,76, | 1648,77, | 1648,78, | 1648,79, | 1648,80, | 1648,81, | 1648,82, | 1648,83, | 1648,84, | 1648,85, | 1649,1, | 1649,2, | 1649,3, | 1649,4, | 1649,5, | 1649,6, | 1649,7, | 1649,8, | 1649,9, | 1649,10, | 1649,11, | 1649,12, | 1649,13, | 1649,14, | 1649,15, | 1649,16, | 1649,17, | 1649,18, | 1649,19, | 1649,20, | 1649,21, | 1649,22, | 1649,23, | 1649,24, | 1649,25, | 1649,26, | 1649,27, | 1649,28, | 1649,29, | 1649,30, | 1649,31, | 1649,32, | 1649,33, | 1649,34, | 1649,35, | 1649,36, | 1649,37, | 1649,38, | 1649,39, | 1649,40, | 1649,41, | 1649,42, | 1649,43, | 1649,44, | 1649,45, | 1649,46, | 1649,47, | 1649,48, | 1649,49, | 1649,50, | 1649,51, | 1649,52, | 1649,53, | 1649,54, | 1649,55, | 1649,56, | 1649,57, | 1649,58, | 1649,59, | 1649,60, | 1649,61, | 1649,62, | 1649,63, | 1649,64, | 1649,65, | 1649,66, | 1649,67, | 1649,68, | 1649,69, | 1649,70, | 1649,71, | 1649,72, | 1649,73, | 1649,74, | 1649,75, | 1649,76, | 1649,77, | 1649,78, | 1649,79, | 1649,80, | 1649,81, | 1649,82, | 1649,83, | 1649,84, | 1649,85, | 1650,1, | 1650,2, | 1650,3, | 1650,4, | 1650,5, | 1650,6, | 1650,7, | 1650,8, | 1650,9, | 1650,10, | 1650,11, | 1650,12, | 1650,13, | 1650,14, | 1650,15, | 1650,16, | 1650,17, | 1650,18, | 1650,19, | 1650,20, | 1650,21, | 1650,22, | 1650,23, | 1650,24, | 1650,25, | 1650,26, | 1650,27, | 1650,28, | 1650,29, | 1650,30, | 1650,31, | 1650,32, | 1650,33, | 1650,34, | 1650,35, | 1650,36, | 1650,37, | 1650,38, | 1650,39, | 1650,40, | 1650,41, | 1650,42, | 1650,43, | 1650,44, | 1650,45, | 1650,46, | 1650,47, | 1650,48, | 1650,49, | 1650,50, | 1650,51, | 1650,52, | 1650,53, | 1650,54, | 1650,55, | 1650,56, | 1650,57, | 1650,58, | 1650,59, | 1650,60, | 1650,61, | 1650,62, | 1650,63, | 1650,64, | 1650,65, | 1650,66, | 1650,67, | 1650,68, | 1650,69, | 1650,70, | 1650,71, | 1650,72, | 1650,73, | 1650,74, | 1650,75, | 1650,76, | 1650,77, | 1650,78, | 1650,79, | 1650,80, | 1650,81, | 1650,82, | 1650,83, | 1650,84, | 1650,85, | 1651,1, | 1651,2, | 1651,3, | 1651,4, | 1651,5, | 1651,6, | 1651,7, | 1651,8, | 1651,9, | 1651,10, | 1651,11, | 1651,12, | 1651,13, | 1651,14, | 1651,15, | 1651,16, | 1651,17, | 1651,18, | 1651,19, | 1651,20, | 1651,21, | 1651,22, | 1651,23, | 1651,24, | 1651,25, | 1651,26, | 1651,27, | 1651,28, | 1651,29, | 1651,30, | 1651,31, | 1651,32, | 1651,33, | 1651,34, | 1651,35, | 1651,36, | 1651,37, | 1651,38, | 1651,39, | 1651,40, | 1651,41, | 1651,42, | 1651,43, | 1651,44, | 1651,45, | 1651,46, | 1651,47, | 1651,48, | 1651,49, | 1651,50, | 1651,51, | 1651,52, | 1651,53, | 1651,54, | 1651,55, | 1651,56, | 1651,57, | 1651,58, | 1651,59, | 1651,60, | 1651,61, | 1651,62, | 1651,63, | 1651,64, | 1651,65, | 1651,66, | 1651,67, | 1651,68, | 1651,69, | 1651,70, | 1651,71, | 1651,72, | 1651,73, | 1651,74, | 1651,75, | 1651,76, | 1651,77, | 1651,78, | 1651,79, | 1651,80, | 1651,81, | 1651,82, | 1651,83, | 1651,84, | 1651,85, | 1652,1, | 1652,2, | 1652,3, | 1652,4, | 1652,5, | 1652,6, | 1652,7, | 1652,8, | 1652,9, | 1652,10, | 1652,11, | 1652,12, | 1652,13, | 1652,14, | 1652,15, | 1652,16, | 1652,17, | 1652,18, | 1652,19, | 1652,20, | 1652,21, | 1652,22, | 1652,23, | 1652,24, | 1652,25, | 1652,26, | 1652,27, | 1652,28, | 1652,29, | 1652,30, | 1652,31, | 1652,32, | 1652,33, | 1652,34, | 1652,35, | 1652,36, | 1652,37, | 1652,38, | 1652,39, | 1652,40, | 1652,41, | 1652,42, | 1652,43, | 1652,44, | 1652,45, | 1652,46, | 1652,47, | 1652,48, | 1652,49, | 1652,50, | 1652,51, | 1652,52, | 1652,53, | 1652,54, | 1652,55, | 1652,56, | 1652,57, | 1652,58, | 1652,59, | 1652,60, | 1652,61, | 1652,62, | 1652,63, | 1652,64, | 1652,65, | 1652,66, | 1652,67, | 1652,68, | 1652,69, | 1652,70, | 1652,71, | 1652,72, | 1652,73, | 1652,74, | 1652,75, | 1652,76, | 1652,77, | 1652,78, | 1652,79, | 1652,80, | 1652,81, | 1652,82, | 1652,83, | 1652,84, | 1652,85, | 1653,1, | 1653,2, | 1653,3, | 1653,4, | 1653,5, | 1653,6, | 1653,7, | 1653,8, | 1653,9, | 1653,10, | 1653,11, | 1653,12, | 1653,13, | 1653,14, | 1653,15, | 1653,16, | 1653,17, | 1653,18, | 1653,19, | 1653,20, | 1653,21, | 1653,22, | 1653,23, | 1653,24, | 1653,25, | 1653,26, | 1653,27, | 1653,28, | 1653,29, | 1653,30, | 1653,31, | 1653,32, | 1653,33, | 1653,34, | 1653,35, | 1653,36, | 1653,37, | 1653,38, | 1653,39, | 1653,40, | 1653,41, | 1653,42, | 1653,43, | 1653,44, | 1653,45, | 1653,46, | 1653,47, | 1653,48, | 1653,49, | 1653,50, | 1653,51, | 1653,52, | 1653,53, | 1653,54, | 1653,55, | 1653,56, | 1653,57, | 1653,58, | 1653,59, | 1653,60, | 1653,61, | 1653,62, | 1653,63, | 1653,64, | 1653,65, | 1653,66, | 1653,67, | 1653,68, | 1653,69, | 1653,70, | 1653,71, | 1653,72, | 1653,73, | 1653,74, | 1653,75, | 1653,76, | 1653,77, | 1653,78, | 1653,79, | 1653,80, | 1653,81, | 1653,82, | 1653,83, | 1653,84, | 1653,85, | 1654,1, | 1654,2, | 1654,3, | 1654,4, | 1654,5, | 1654,6, | 1654,7, | 1654,8, | 1654,9, | 1654,10, | 1654,11, | 1654,12, | 1654,13, | 1654,14, | 1654,15, | 1654,16, | 1654,17, | 1654,18, | 1654,19, | 1654,20, | 1654,21, | 1654,22, | 1654,23, | 1654,24, | 1654,25, | 1654,26, | 1654,27, | 1654,28, | 1654,29, | 1654,30, | 1654,31, | 1654,32, | 1654,33, | 1654,34, | 1654,35, | 1654,36, | 1654,37, | 1654,38, | 1654,39, | 1654,40, | 1654,41, | 1654,42, | 1654,43, | 1654,44, | 1654,45, | 1654,46, | 1654,47, | 1654,48, | 1654,49, | 1654,50, | 1654,51, | 1654,52, | 1654,53, | 1654,54, | 1654,55, | 1654,56, | 1654,57, | 1654,58, | 1654,59, | 1654,60, | 1654,61, | 1654,62, | 1654,63, | 1654,64, | 1654,65, | 1654,66, | 1654,67, | 1654,68, | 1654,69, | 1654,70, | 1654,71, | 1654,72, | 1654,73, | 1654,74, | 1654,75, | 1654,76, | 1654,77, | 1654,78, | 1654,79, | 1654,80, | 1654,81, | 1654,82, | 1654,83, | 1654,84, | 1654,85, | 1655,1, | 1655,2, | 1655,3, | 1655,4, | 1655,5, | 1655,6, | 1655,7, | 1655,8, | 1655,9, | 1655,10, | 1655,11, | 1655,12, | 1655,13, | 1655,14, | 1655,15, | 1655,16, | 1655,17, | 1655,18, | 1655,19, | 1655,20, | 1655,21, | 1655,22, | 1655,23, | 1655,24, | 1655,25, | 1655,26, | 1655,27, | 1655,28, | 1655,29, | 1655,30, | 1655,31, | 1655,32, | 1655,33, | 1655,34, | 1655,35, | 1655,36, | 1655,37, | 1655,38, | 1655,39, | 1655,40, | 1655,41, | 1655,42, | 1655,43, | 1655,44, | 1655,45, | 1655,46, | 1655,47, | 1655,48, | 1655,49, | 1655,50, | 1655,51, | 1655,52, | 1655,53, | 1655,54, | 1655,55, | 1655,56, | 1655,57, | 1655,58, | 1655,59, | 1655,60, | 1655,61, | 1655,62, | 1655,63, | 1655,64, | 1655,65, | 1655,66, | 1655,67, | 1655,68, | 1655,69, | 1655,70, | 1655,71, | 1655,72, | 1655,73, | 1655,74, | 1655,75, | 1655,76, | 1655,77, | 1655,78, | 1655,79, | 1655,80, | 1655,81, | 1655,82, | 1655,83, | 1655,84, | 1655,85, | 1656,1, | 1656,2, | 1656,3, | 1656,4, | 1656,5, | 1656,6, | 1656,7, | 1656,8, | 1656,9, | 1656,10, | 1656,11, | 1656,12, | 1656,13, | 1656,14, | 1656,15, | 1656,16, | 1656,17, | 1656,18, | 1656,19, | 1656,20, | 1656,21, | 1656,22, | 1656,23, | 1656,24, | 1656,25, | 1656,26, | 1656,27, | 1656,28, | 1656,29, | 1656,30, | 1656,31, | 1656,32, | 1656,33, | 1656,34, | 1656,35, | 1656,36, | 1656,37, | 1656,38, | 1656,39, | 1656,40, | 1656,41, | 1656,42, | 1656,43, | 1656,44, | 1656,45, | 1656,46, | 1656,47, | 1656,48, | 1656,49, | 1656,50, | 1656,51, | 1656,52, | 1656,53, | 1656,54, | 1656,55, | 1656,56, | 1656,57, | 1656,58, | 1656,59, | 1656,60, | 1656,61, | 1656,62, | 1656,63, | 1656,64, | 1656,65, | 1656,66, | 1656,67, | 1656,68, | 1656,69, | 1656,70, | 1656,71, | 1656,72, | 1656,73, | 1656,74, | 1656,75, | 1656,76, | 1656,77, | 1656,78, | 1656,79, | 1656,80, | 1656,81, | 1656,82, | 1656,83, | 1656,84, | 1656,85, | 1657,1, | 1657,2, | 1657,3, | 1657,4, | 1657,5, | 1657,6, | 1657,7, | 1657,8, | 1657,9, | 1657,10, | 1657,11, | 1657,12, | 1657,13, | 1657,14, | 1657,15, | 1657,16, | 1657,17, | 1657,18, | 1657,19, | 1657,20, | 1657,21, | 1657,22, | 1657,23, | 1657,24, | 1657,25, | 1657,26, | 1657,27, | 1657,28, | 1657,29, | 1657,30, | 1657,31, | 1657,32, | 1657,33, | 1657,34, | 1657,35, | 1657,36, | 1657,37, | 1657,38, | 1657,39, | 1657,40, | 1657,41, | 1657,42, | 1657,43, | 1657,44, | 1657,45, | 1657,46, | 1657,47, | 1657,48, | 1657,49, | 1657,50, | 1657,51, | 1657,52, | 1657,53, | 1657,54, | 1657,55, | 1657,56, | 1657,57, | 1657,58, | 1657,59, | 1657,60, | 1657,61, | 1657,62, | 1657,63, | 1657,64, | 1657,65, | 1657,66, | 1657,67, | 1657,68, | 1657,69, | 1657,70, | 1657,71, | 1657,72, | 1657,73, | 1657,74, | 1657,75, | 1657,76, | 1657,77, | 1657,78, | 1657,79, | 1657,80, | 1657,81, | 1657,82, | 1657,83, | 1657,84, | 1657,85, | 1658,1, | 1658,2, | 1658,3, | 1658,4, | 1658,5, | 1658,6, | 1658,7, | 1658,8, | 1658,9, | 1658,10, | 1658,11, | 1658,12, | 1658,13, | 1658,14, | 1658,15, | 1658,16, | 1658,17, | 1658,18, | 1658,19, | 1658,20, | 1658,21, | 1658,22, | 1658,23, | 1658,24, | 1658,25, | 1658,26, | 1658,27, | 1658,28, | 1658,29, | 1658,30, | 1658,31, | 1658,32, | 1658,33, | 1658,34, | 1658,35, | 1658,36, | 1658,37, | 1658,38, | 1658,39, | 1658,40, | 1658,41, | 1658,42, | 1658,43, | 1658,44, | 1658,45, | 1658,46, | 1658,47, | 1658,48, | 1658,49, | 1658,50, | 1658,51, | 1658,52, | 1658,53, | 1658,54, | 1658,55, | 1658,56, | 1658,57, | 1658,58, | 1658,59, | 1658,60, | 1658,61, | 1658,62, | 1658,63, | 1658,64, | 1658,65, | 1658,66, | 1658,67, | 1658,68, | 1658,69, | 1658,70, | 1658,71, | 1658,72, | 1658,73, | 1658,74, | 1658,75, | 1658,76, | 1658,77, | 1658,78, | 1658,79, | 1658,80, | 1658,81, | 1658,82, | 1658,83, | 1658,84, | 1658,85, | 1659,1, | 1659,2, | 1659,3, | 1659,4, | 1659,5, | 1659,6, | 1659,7, | 1659,8, | 1659,9, | 1659,10, | 1659,11, | 1659,12, | 1659,13, | 1659,14, | 1659,15, | 1659,16, | 1659,17, | 1659,18, | 1659,19, | 1659,20, | 1659,21, | 1659,22, | 1659,23, | 1659,24, | 1659,25, | 1659,26, | 1659,27, | 1659,28, | 1659,29, | 1659,30, | 1659,31, | 1659,32, | 1659,33, | 1659,34, | 1659,35, | 1659,36, | 1659,37, | 1659,38, | 1659,39, | 1659,40, | 1659,41, | 1659,42, | 1659,43, | 1659,44, | 1659,45, | 1659,46, | 1659,47, | 1659,48, | 1659,49, | 1659,50, | 1659,51, | 1659,52, | 1659,53, | 1659,54, | 1659,55, | 1659,56, | 1659,57, | 1659,58, | 1659,59, | 1659,60, | 1659,61, | 1659,62, | 1659,63, | 1659,64, | 1659,65, | 1659,66, | 1659,67, | 1659,68, | 1659,69, | 1659,70, | 1659,71, | 1659,72, | 1659,73, | 1659,74, | 1659,75, | 1659,76, | 1659,77, | 1659,78, | 1659,79, | 1659,80, | 1659,81, | 1659,82, | 1659,83, | 1659,84, | 1659,85, | 1660,1, | 1660,2, | 1660,3, | 1660,4, | 1660,5, | 1660,6, | 1660,7, | 1660,8, | 1660,9, | 1660,10, | 1660,11, | 1660,12, | 1660,13, | 1660,14, | 1660,15, | 1660,16, | 1660,17, | 1660,18, | 1660,19, | 1660,20, | 1660,21, | 1660,22, | 1660,23, | 1660,24, | 1660,25, | 1660,26, | 1660,27, | 1660,28, | 1660,29, | 1660,30, | 1660,31, | 1660,32, | 1660,33, | 1660,34, | 1660,35, | 1660,36, | 1660,37, | 1660,38, | 1660,39, | 1660,40, | 1660,41, | 1660,42, | 1660,43, | 1660,44, | 1660,45, | 1660,46, | 1660,47, | 1660,48, | 1660,49, | 1660,50, | 1660,51, | 1660,52, | 1660,53, | 1660,54, | 1660,55, | 1660,56, | 1660,57, | 1660,58, | 1660,59, | 1660,60, | 1660,61, | 1660,62, | 1660,63, | 1660,64, | 1660,65, | 1660,66, | 1660,67, | 1660,68, | 1660,69, | 1660,70, | 1660,71, | 1660,72, | 1660,73, | 1660,74, | 1660,75, | 1660,76, | 1660,77, | 1660,78, | 1660,79, | 1660,80, | 1660,81, | 1660,82, | 1660,83, | 1660,84, | 1660,85, | 1661,1, | 1661,2, | 1661,3, | 1661,4, | 1661,5, | 1661,6, | 1661,7, | 1661,8, | 1661,9, | 1661,10, | 1661,11, | 1661,12, | 1661,13, | 1661,14, | 1661,15, | 1661,16, | 1661,17, | 1661,18, | 1661,19, | 1661,20, | 1661,21, | 1661,22, | 1661,23, | 1661,24, | 1661,25, | 1661,26, | 1661,27, | 1661,28, | 1661,29, | 1661,30, | 1661,31, | 1661,32, | 1661,33, | 1661,34, | 1661,35, | 1661,36, | 1661,37, | 1661,38, | 1661,39, | 1661,40, | 1661,41, | 1661,42, | 1661,43, | 1661,44, | 1661,45, | 1661,46, | 1661,47, | 1661,48, | 1661,49, | 1661,50, | 1661,51, | 1661,52, | 1661,53, | 1661,54, | 1661,55, | 1661,56, | 1661,57, | 1661,58, | 1661,59, | 1661,60, | 1661,61, | 1661,62, | 1661,63, | 1661,64, | 1661,65, | 1661,66, | 1661,67, | 1661,68, | 1661,69, | 1661,70, | 1661,71, | 1661,72, | 1661,73, | 1661,74, | 1661,75, | 1661,76, | 1661,77, | 1661,78, | 1661,79, | 1661,80, | 1661,81, | 1661,82, | 1661,83, | 1661,84, | 1661,85, | 1662,1, | 1662,2, | 1662,3, | 1662,4, | 1662,5, | 1662,6, | 1662,7, | 1662,8, | 1662,9, | 1662,10, | 1662,11, | 1662,12, | 1662,13, | 1662,14, | 1662,15, | 1662,16, | 1662,17, | 1662,18, | 1662,19, | 1662,20, | 1662,21, | 1662,22, | 1662,23, | 1662,24, | 1662,25, | 1662,26, | 1662,27, | 1662,28, | 1662,29, | 1662,30, | 1662,31, | 1662,32, | 1662,33, | 1662,34, | 1662,35, | 1662,36, | 1662,37, | 1662,38, | 1662,39, | 1662,40, | 1662,41, | 1662,42, | 1662,43, | 1662,44, | 1662,45, | 1662,46, | 1662,47, | 1662,48, | 1662,49, | 1662,50, | 1662,51, | 1662,52, | 1662,53, | 1662,54, | 1662,55, | 1662,56, | 1662,57, | 1662,58, | 1662,59, | 1662,60, | 1662,61, | 1662,62, | 1662,63, | 1662,64, | 1662,65, | 1662,66, | 1662,67, | 1662,68, | 1662,69, | 1662,70, | 1662,71, | 1662,72, | 1662,73, | 1662,74, | 1662,75, | 1662,76, | 1662,77, | 1662,78, | 1662,79, | 1662,80, | 1662,81, | 1662,82, | 1662,83, | 1662,84, | 1662,85, | 1663,1, | 1663,2, | 1663,3, | 1663,4, | 1663,5, | 1663,6, | 1663,7, | 1663,8, | 1663,9, | 1663,10, | 1663,11, | 1663,12, | 1663,13, | 1663,14, | 1663,15, | 1663,16, | 1663,17, | 1663,18, | 1663,19, | 1663,20, | 1663,21, | 1663,22, | 1663,23, | 1663,24, | 1663,25, | 1663,26, | 1663,27, | 1663,28, | 1663,29, | 1663,30, | 1663,31, | 1663,32, | 1663,33, | 1663,34, | 1663,35, | 1663,36, | 1663,37, | 1663,38, | 1663,39, | 1663,40, | 1663,41, | 1663,42, | 1663,43, | 1663,44, | 1663,45, | 1663,46, | 1663,47, | 1663,48, | 1663,49, | 1663,50, | 1663,51, | 1663,52, | 1663,53, | 1663,54, | 1663,55, | 1663,56, | 1663,57, | 1663,58, | 1663,59, | 1663,60, | 1663,61, | 1663,62, | 1663,63, | 1663,64, | 1663,65, | 1663,66, | 1663,67, | 1663,68, | 1663,69, | 1663,70, | 1663,71, | 1663,72, | 1663,73, | 1663,74, | 1663,75, | 1663,76, | 1663,77, | 1663,78, | 1663,79, | 1663,80, | 1663,81, | 1663,82, | 1663,83, | 1663,84, | 1663,85, | 1664,1, | 1664,2, | 1664,3, | 1664,4, | 1664,5, | 1664,6, | 1664,7, | 1664,8, | 1664,9, | 1664,10, | 1664,11, | 1664,12, | 1664,13, | 1664,14, | 1664,15, | 1664,16, | 1664,17, | 1664,18, | 1664,19, | 1664,20, | 1664,21, | 1664,22, | 1664,23, | 1664,24, | 1664,25, | 1664,26, | 1664,27, | 1664,28, | 1664,29, | 1664,30, | 1664,31, | 1664,32, | 1664,33, | 1664,34, | 1664,35, | 1664,36, | 1664,37, | 1664,38, | 1664,39, | 1664,40, | 1664,41, | 1664,42, | 1664,43, | 1664,44, | 1664,45, | 1664,46, | 1664,47, | 1664,48, | 1664,49, | 1664,50, | 1664,51, | 1664,52, | 1664,53, | 1664,54, | 1664,55, | 1664,56, | 1664,57, | 1664,58, | 1664,59, | 1664,60, | 1664,61, | 1664,62, | 1664,63, | 1664,64, | 1664,65, | 1664,66, | 1664,67, | 1664,68, | 1664,69, | 1664,70, | 1664,71, | 1664,72, | 1664,73, | 1664,74, | 1664,75, | 1664,76, | 1664,77, | 1664,78, | 1664,79, | 1664,80, | 1664,81, | 1664,82, | 1664,83, | 1664,84, | 1664,85, | 1665,1, | 1665,2, | 1665,3, | 1665,4, | 1665,5, | 1665,6, | 1665,7, | 1665,8, | 1665,9, | 1665,10, | 1665,11, | 1665,12, | 1665,13, | 1665,14, | 1665,15, | 1665,16, | 1665,17, | 1665,18, | 1665,19, | 1665,20, | 1665,21, | 1665,22, | 1665,23, | 1665,24, | 1665,25, | 1665,26, | 1665,27, | 1665,28, | 1665,29, | 1665,30, | 1665,31, | 1665,32, | 1665,33, | 1665,34, | 1665,35, | 1665,36, | 1665,37, | 1665,38, | 1665,39, | 1665,40, | 1665,41, | 1665,42, | 1665,43, | 1665,44, | 1665,45, | 1665,46, | 1665,47, | 1665,48, | 1665,49, | 1665,50, | 1665,51, | 1665,52, | 1665,53, | 1665,54, | 1665,55, | 1665,56, | 1665,57, | 1665,58, | 1665,59, | 1665,60, | 1665,61, | 1665,62, | 1665,63, | 1665,64, | 1665,65, | 1665,66, | 1665,67, | 1665,68, | 1665,69, | 1665,70, | 1665,71, | 1665,72, | 1665,73, | 1665,74, | 1665,75, | 1665,76, | 1665,77, | 1665,78, | 1665,79, | 1665,80, | 1665,81, | 1665,82, | 1665,83, | 1665,84, | 1665,85, | 1666,1, | 1666,2, | 1666,3, | 1666,4, | 1666,5, | 1666,6, | 1666,7, | 1666,8, | 1666,9, | 1666,10, | 1666,11, | 1666,12, | 1666,13, | 1666,14, | 1666,15, | 1666,16, | 1666,17, | 1666,18, | 1666,19, | 1666,20, | 1666,21, | 1666,22, | 1666,23, | 1666,24, | 1666,25, | 1666,26, | 1666,27, | 1666,28, | 1666,29, | 1666,30, | 1666,31, | 1666,32, | 1666,33, | 1666,34, | 1666,35, | 1666,36, | 1666,37, | 1666,38, | 1666,39, | 1666,40, | 1666,41, | 1666,42, | 1666,43, | 1666,44, | 1666,45, | 1666,46, | 1666,47, | 1666,48, | 1666,49, | 1666,50, | 1666,51, | 1666,52, | 1666,53, | 1666,54, | 1666,55, | 1666,56, | 1666,57, | 1666,58, | 1666,59, | 1666,60, | 1666,61, | 1666,62, | 1666,63, | 1666,64, | 1666,65, | 1666,66, | 1666,67, | 1666,68, | 1666,69, | 1666,70, | 1666,71, | 1666,72, | 1666,73, | 1666,74, | 1666,75, | 1666,76, | 1666,77, | 1666,78, | 1666,79, | 1666,80, | 1666,81, | 1666,82, | 1666,83, | 1666,84, | 1666,85, | 1667,1, | 1667,2, | 1667,3, | 1667,4, | 1667,5, | 1667,6, | 1667,7, | 1667,8, | 1667,9, | 1667,10, | 1667,11, | 1667,12, | 1667,13, | 1667,14, | 1667,15, | 1667,16, | 1667,17, | 1667,18, | 1667,19, | 1667,20, | 1667,21, | 1667,22, | 1667,23, | 1667,24, | 1667,25, | 1667,26, | 1667,27, | 1667,28, | 1667,29, | 1667,30, | 1667,31, | 1667,32, | 1667,33, | 1667,34, | 1667,35, | 1667,36, | 1667,37, | 1667,38, | 1667,39, | 1667,40, | 1667,41, | 1667,42, | 1667,43, | 1667,44, | 1667,45, | 1667,46, | 1667,47, | 1667,48, | 1667,49, | 1667,50, | 1667,51, | 1667,52, | 1667,53, | 1667,54, | 1667,55, | 1667,56, | 1667,57, | 1667,58, | 1667,59, | 1667,60, | 1667,61, | 1667,62, | 1667,63, | 1667,64, | 1667,65, | 1667,66, | 1667,67, | 1667,68, | 1667,69, | 1667,70, | 1667,71, | 1667,72, | 1667,73, | 1667,74, | 1667,75, | 1667,76, | 1667,77, | 1667,78, | 1667,79, | 1667,80, | 1667,81, | 1667,82, | 1667,83, | 1667,84, | 1667,85, | 1668,1, | 1668,2, | 1668,3, | 1668,4, | 1668,5, | 1668,6, | 1668,7, | 1668,8, | 1668,9, | 1668,10, | 1668,11, | 1668,12, | 1668,13, | 1668,14, | 1668,15, | 1668,16, | 1668,17, | 1668,18, | 1668,19, | 1668,20, | 1668,21, | 1668,22, | 1668,23, | 1668,24, | 1668,25, | 1668,26, | 1668,27, | 1668,28, | 1668,29, | 1668,30, | 1668,31, | 1668,32, | 1668,33, | 1668,34, | 1668,35, | 1668,36, | 1668,37, | 1668,38, | 1668,39, | 1668,40, | 1668,41, | 1668,42, | 1668,43, | 1668,44, | 1668,45, | 1668,46, | 1668,47, | 1668,48, | 1668,49, | 1668,50, | 1668,51, | 1668,52, | 1668,53, | 1668,54, | 1668,55, | 1668,56, | 1668,57, | 1668,58, | 1668,59, | 1668,60, | 1668,61, | 1668,62, | 1668,63, | 1668,64, | 1668,65, | 1668,66, | 1668,67, | 1668,68, | 1668,69, | 1668,70, | 1668,71, | 1668,72, | 1668,73, | 1668,74, | 1668,75, | 1668,76, | 1668,77, | 1668,78, | 1668,79, | 1668,80, | 1668,81, | 1668,82, | 1668,83, | 1668,84, | 1668,85, | 1669,1, | 1669,2, | 1669,3, | 1669,4, | 1669,5, | 1669,6, | 1669,7, | 1669,8, | 1669,9, | 1669,10, | 1669,11, | 1669,12, | 1669,13, | 1669,14, | 1669,15, | 1669,16, | 1669,17, | 1669,18, | 1669,19, | 1669,20, | 1669,21, | 1669,22, | 1669,23, | 1669,24, | 1669,25, | 1669,26, | 1669,27, | 1669,28, | 1669,29, | 1669,30, | 1669,31, | 1669,32, | 1669,33, | 1669,34, | 1669,35, | 1669,36, | 1669,37, | 1669,38, | 1669,39, | 1669,40, | 1669,41, | 1669,42, | 1669,43, | 1669,44, | 1669,45, | 1669,46, | 1669,47, | 1669,48, | 1669,49, | 1669,50, | 1669,51, | 1669,52, | 1669,53, | 1669,54, | 1669,55, | 1669,56, | 1669,57, | 1669,58, | 1669,59, | 1669,60, | 1669,61, | 1669,62, | 1669,63, | 1669,64, | 1669,65, | 1669,66, | 1669,67, | 1669,68, | 1669,69, | 1669,70, | 1669,71, | 1669,72, | 1669,73, | 1669,74, | 1669,75, | 1669,76, | 1669,77, | 1669,78, | 1669,79, | 1669,80, | 1669,81, | 1669,82, | 1669,83, | 1669,84, | 1669,85, | 1670,1, | 1670,2, | 1670,3, | 1670,4, | 1670,5, | 1670,6, | 1670,7, | 1670,8, | 1670,9, | 1670,10, | 1670,11, | 1670,12, | 1670,13, | 1670,14, | 1670,15, | 1670,16, | 1670,17, | 1670,18, | 1670,19, | 1670,20, | 1670,21, | 1670,22, | 1670,23, | 1670,24, | 1670,25, | 1670,26, | 1670,27, | 1670,28, | 1670,29, | 1670,30, | 1670,31, | 1670,32, | 1670,33, | 1670,34, | 1670,35, | 1670,36, | 1670,37, | 1670,38, | 1670,39, | 1670,40, | 1670,41, | 1670,42, | 1670,43, | 1670,44, | 1670,45, | 1670,46, | 1670,47, | 1670,48, | 1670,49, | 1670,50, | 1670,51, | 1670,52, | 1670,53, | 1670,54, | 1670,55, | 1670,56, | 1670,57, | 1670,58, | 1670,59, | 1670,60, | 1670,61, | 1670,62, | 1670,63, | 1670,64, | 1670,65, | 1670,66, | 1670,67, | 1670,68, | 1670,69, | 1670,70, | 1670,71, | 1670,72, | 1670,73, | 1670,74, | 1670,75, | 1670,76, | 1670,77, | 1670,78, | 1670,79, | 1670,80, | 1670,81, | 1670,82, | 1670,83, | 1670,84, | 1670,85, | 1671,1, | 1671,2, | 1671,3, | 1671,4, | 1671,5, | 1671,6, | 1671,7, | 1671,8, | 1671,9, | 1671,10, | 1671,11, | 1671,12, | 1671,13, | 1671,14, | 1671,15, | 1671,16, | 1671,17, | 1671,18, | 1671,19, | 1671,20, | 1671,21, | 1671,22, | 1671,23, | 1671,24, | 1671,25, | 1671,26, | 1671,27, | 1671,28, | 1671,29, | 1671,30, | 1671,31, | 1671,32, | 1671,33, | 1671,34, | 1671,35, | 1671,36, | 1671,37, | 1671,38, | 1671,39, | 1671,40, | 1671,41, | 1671,42, | 1671,43, | 1671,44, | 1671,45, | 1671,46, | 1671,47, | 1671,48, | 1671,49, | 1671,50, | 1671,51, | 1671,52, | 1671,53, | 1671,54, | 1671,55, | 1671,56, | 1671,57, | 1671,58, | 1671,59, | 1671,60, | 1671,61, | 1671,62, | 1671,63, | 1671,64, | 1671,65, | 1671,66, | 1671,67, | 1671,68, | 1671,69, | 1671,70, | 1671,71, | 1671,72, | 1671,73, | 1671,74, | 1671,75, | 1671,76, | 1671,77, | 1671,78, | 1671,79, | 1671,80, | 1671,81, | 1671,82, | 1671,83, | 1671,84, | 1671,85, | 1672,1, | 1672,2, | 1672,3, | 1672,4, | 1672,5, | 1672,6, | 1672,7, | 1672,8, | 1672,9, | 1672,10, | 1672,11, | 1672,12, | 1672,13, | 1672,14, | 1672,15, | 1672,16, | 1672,17, | 1672,18, | 1672,19, | 1672,20, | 1672,21, | 1672,22, | 1672,23, | 1672,24, | 1672,25, | 1672,26, | 1672,27, | 1672,28, | 1672,29, | 1672,30, | 1672,31, | 1672,32, | 1672,33, | 1672,34, | 1672,35, | 1672,36, | 1672,37, | 1672,38, | 1672,39, | 1672,40, | 1672,41, | 1672,42, | 1672,43, | 1672,44, | 1672,45, | 1672,46, | 1672,47, | 1672,48, | 1672,49, | 1672,50, | 1672,51, | 1672,52, | 1672,53, | 1672,54, | 1672,55, | 1672,56, | 1672,57, | 1672,58, | 1672,59, | 1672,60, | 1672,61, | 1672,62, | 1672,63, | 1672,64, | 1672,65, | 1672,66, | 1672,67, | 1672,68, | 1672,69, | 1672,70, | 1672,71, | 1672,72, | 1672,73, | 1672,74, | 1672,75, | 1672,76, | 1672,77, | 1672,78, | 1672,79, | 1672,80, | 1672,81, | 1672,82, | 1672,83, | 1672,84, | 1672,85, | 1673,1, | 1673,2, | 1673,3, | 1673,4, | 1673,5, | 1673,6, | 1673,7, | 1673,8, | 1673,9, | 1673,10, | 1673,11, | 1673,12, | 1673,13, | 1673,14, | 1673,15, | 1673,16, | 1673,17, | 1673,18, | 1673,19, | 1673,20, | 1673,21, | 1673,22, | 1673,23, | 1673,24, | 1673,25, | 1673,26, | 1673,27, | 1673,28, | 1673,29, | 1673,30, | 1673,31, | 1673,32, | 1673,33, | 1673,34, | 1673,35, | 1673,36, | 1673,37, | 1673,38, | 1673,39, | 1673,40, | 1673,41, | 1673,42, | 1673,43, | 1673,44, | 1673,45, | 1673,46, | 1673,47, | 1673,48, | 1673,49, | 1673,50, | 1673,51, | 1673,52, | 1673,53, | 1673,54, | 1673,55, | 1673,56, | 1673,57, | 1673,58, | 1673,59, | 1673,60, | 1673,61, | 1673,62, | 1673,63, | 1673,64, | 1673,65, | 1673,66, | 1673,67, | 1673,68, | 1673,69, | 1673,70, | 1673,71, | 1673,72, | 1673,73, | 1673,74, | 1673,75, | 1673,76, | 1673,77, | 1673,78, | 1673,79, | 1673,80, | 1673,81, | 1673,82, | 1673,83, | 1673,84, | 1673,85, | 1674,1, | 1674,2, | 1674,3, | 1674,4, | 1674,5, | 1674,6, | 1674,7, | 1674,8, | 1674,9, | 1674,10, | 1674,11, | 1674,12, | 1674,13, | 1674,14, | 1674,15, | 1674,16, | 1674,17, | 1674,18, | 1674,19, | 1674,20, | 1674,21, | 1674,22, | 1674,23, | 1674,24, | 1674,25, | 1674,26, | 1674,27, | 1674,28, | 1674,29, | 1674,30, | 1674,31, | 1674,32, | 1674,33, | 1674,34, | 1674,35, | 1674,36, | 1674,37, | 1674,38, | 1674,39, | 1674,40, | 1674,41, | 1674,42, | 1674,43, | 1674,44, | 1674,45, | 1674,46, | 1674,47, | 1674,48, | 1674,49, | 1674,50, | 1674,51, | 1674,52, | 1674,53, | 1674,54, | 1674,55, | 1674,56, | 1674,57, | 1674,58, | 1674,59, | 1674,60, | 1674,61, | 1674,62, | 1674,63, | 1674,64, | 1674,65, | 1674,66, | 1674,67, | 1674,68, | 1674,69, | 1674,70, | 1674,71, | 1674,72, | 1674,73, | 1674,74, | 1674,75, | 1674,76, | 1674,77, | 1674,78, | 1674,79, | 1674,80, | 1674,81, | 1674,82, | 1674,83, | 1674,84, | 1674,85, | 1675,1, | 1675,2, | 1675,3, | 1675,4, | 1675,5, | 1675,6, | 1675,7, | 1675,8, | 1675,9, | 1675,10, | 1675,11, | 1675,12, | 1675,13, | 1675,14, | 1675,15, | 1675,16, | 1675,17, | 1675,18, | 1675,19, | 1675,20, | 1675,21, | 1675,22, | 1675,23, | 1675,24, | 1675,25, | 1675,26, | 1675,27, | 1675,28, | 1675,29, | 1675,30, | 1675,31, | 1675,32, | 1675,33, | 1675,34, | 1675,35, | 1675,36, | 1675,37, | 1675,38, | 1675,39, | 1675,40, | 1675,41, | 1675,42, | 1675,43, | 1675,44, | 1675,45, | 1675,46, | 1675,47, | 1675,48, | 1675,49, | 1675,50, | 1675,51, | 1675,52, | 1675,53, | 1675,54, | 1675,55, | 1675,56, | 1675,57, | 1675,58, | 1675,59, | 1675,60, | 1675,61, | 1675,62, | 1675,63, | 1675,64, | 1675,65, | 1675,66, | 1675,67, | 1675,68, | 1675,69, | 1675,70, | 1675,71, | 1675,72, | 1675,73, | 1675,74, | 1675,75, | 1675,76, | 1675,77, | 1675,78, | 1675,79, | 1675,80, | 1675,81, | 1675,82, | 1675,83, | 1675,84, | 1675,85, | 1676,1, | 1676,2, | 1676,3, | 1676,4, | 1676,5, | 1676,6, | 1676,7, | 1676,8, | 1676,9, | 1676,10, | 1676,11, | 1676,12, | 1676,13, | 1676,14, | 1676,15, | 1676,16, | 1676,17, | 1676,18, | 1676,19, | 1676,20, | 1676,21, | 1676,22, | 1676,23, | 1676,24, | 1676,25, | 1676,26, | 1676,27, | 1676,28, | 1676,29, | 1676,30, | 1676,31, | 1676,32, | 1676,33, | 1676,34, | 1676,35, | 1676,36, | 1676,37, | 1676,38, | 1676,39, | 1676,40, | 1676,41, | 1676,42, | 1676,43, | 1676,44, | 1676,45, | 1676,46, | 1676,47, | 1676,48, | 1676,49, | 1676,50, | 1676,51, | 1676,52, | 1676,53, | 1676,54, | 1676,55, | 1676,56, | 1676,57, | 1676,58, | 1676,59, | 1676,60, | 1676,61, | 1676,62, | 1676,63, | 1676,64, | 1676,65, | 1676,66, | 1676,67, | 1676,68, | 1676,69, | 1676,70, | 1676,71, | 1676,72, | 1676,73, | 1676,74, | 1676,75, | 1676,76, | 1676,77, | 1676,78, | 1676,79, | 1676,80, | 1676,81, | 1676,82, | 1676,83, | 1676,84, | 1676,85, | 1677,1, | 1677,2, | 1677,3, | 1677,4, | 1677,5, | 1677,6, | 1677,7, | 1677,8, | 1677,9, | 1677,10, | 1677,11, | 1677,12, | 1677,13, | 1677,14, | 1677,15, | 1677,16, | 1677,17, | 1677,18, | 1677,19, | 1677,20, | 1677,21, | 1677,22, | 1677,23, | 1677,24, | 1677,25, | 1677,26, | 1677,27, | 1677,28, | 1677,29, | 1677,30, | 1677,31, | 1677,32, | 1677,33, | 1677,34, | 1677,35, | 1677,36, | 1677,37, | 1677,38, | 1677,39, | 1677,40, | 1677,41, | 1677,42, | 1677,43, | 1677,44, | 1677,45, | 1677,46, | 1677,47, | 1677,48, | 1677,49, | 1677,50, | 1677,51, | 1677,52, | 1677,53, | 1677,54, | 1677,55, | 1677,56, | 1677,57, | 1677,58, | 1677,59, | 1677,60, | 1677,61, | 1677,62, | 1677,63, | 1677,64, | 1677,65, | 1677,66, | 1677,67, | 1677,68, | 1677,69, | 1677,70, | 1677,71, | 1677,72, | 1677,73, | 1677,74, | 1677,75, | 1677,76, | 1677,77, | 1677,78, | 1677,79, | 1677,80, | 1677,81, | 1677,82, | 1677,83, | 1677,84, | 1677,85, | 1678,1, | 1678,2, | 1678,3, | 1678,4, | 1678,5, | 1678,6, | 1678,7, | 1678,8, | 1678,9, | 1678,10, | 1678,11, | 1678,12, | 1678,13, | 1678,14, | 1678,15, | 1678,16, | 1678,17, | 1678,18, | 1678,19, | 1678,20, | 1678,21, | 1678,22, | 1678,23, | 1678,24, | 1678,25, | 1678,26, | 1678,27, | 1678,28, | 1678,29, | 1678,30, | 1678,31, | 1678,32, | 1678,33, | 1678,34, | 1678,35, | 1678,36, | 1678,37, | 1678,38, | 1678,39, | 1678,40, | 1678,41, | 1678,42, | 1678,43, | 1678,44, | 1678,45, | 1678,46, | 1678,47, | 1678,48, | 1678,49, | 1678,50, | 1678,51, | 1678,52, | 1678,53, | 1678,54, | 1678,55, | 1678,56, | 1678,57, | 1678,58, | 1678,59, | 1678,60, | 1678,61, | 1678,62, | 1678,63, | 1678,64, | 1678,65, | 1678,66, | 1678,67, | 1678,68, | 1678,69, | 1678,70, | 1678,71, | 1678,72, | 1678,73, | 1678,74, | 1678,75, | 1678,76, | 1678,77, | 1678,78, | 1678,79, | 1678,80, | 1678,81, | 1678,82, | 1678,83, | 1678,84, | 1678,85, | 1679,1, | 1679,2, | 1679,3, | 1679,4, | 1679,5, | 1679,6, | 1679,7, | 1679,8, | 1679,9, | 1679,10, | 1679,11, | 1679,12, | 1679,13, | 1679,14, | 1679,15, | 1679,16, | 1679,17, | 1679,18, | 1679,19, | 1679,20, | 1679,21, | 1679,22, | 1679,23, | 1679,24, | 1679,25, | 1679,26, | 1679,27, | 1679,28, | 1679,29, | 1679,30, | 1679,31, | 1679,32, | 1679,33, | 1679,34, | 1679,35, | 1679,36, | 1679,37, | 1679,38, | 1679,39, | 1679,40, | 1679,41, | 1679,42, | 1679,43, | 1679,44, | 1679,45, | 1679,46, | 1679,47, | 1679,48, | 1679,49, | 1679,50, | 1679,51, | 1679,52, | 1679,53, | 1679,54, | 1679,55, | 1679,56, | 1679,57, | 1679,58, | 1679,59, | 1679,60, | 1679,61, | 1679,62, | 1679,63, | 1679,64, | 1679,65, | 1679,66, | 1679,67, | 1679,68, | 1679,69, | 1679,70, | 1679,71, | 1679,72, | 1679,73, | 1679,74, | 1679,75, | 1679,76, | 1679,77, | 1679,78, | 1679,79, | 1679,80, | 1679,81, | 1679,82, | 1679,83, | 1679,84, | 1679,85, | 1680,1, | 1680,2, | 1680,3, | 1680,4, | 1680,5, | 1680,6, | 1680,7, | 1680,8, | 1680,9, | 1680,10, | 1680,11, | 1680,12, | 1680,13, | 1680,14, | 1680,15, | 1680,16, | 1680,17, | 1680,18, | 1680,19, | 1680,20, | 1680,21, | 1680,22, | 1680,23, | 1680,24, | 1680,25, | 1680,26, | 1680,27, | 1680,28, | 1680,29, | 1680,30, | 1680,31, | 1680,32, | 1680,33, | 1680,34, | 1680,35, | 1680,36, | 1680,37, | 1680,38, | 1680,39, | 1680,40, | 1680,41, | 1680,42, | 1680,43, | 1680,44, | 1680,45, | 1680,46, | 1680,47, | 1680,48, | 1680,49, | 1680,50, | 1680,51, | 1680,52, | 1680,53, | 1680,54, | 1680,55, | 1680,56, | 1680,57, | 1680,58, | 1680,59, | 1680,60, | 1680,61, | 1680,62, | 1680,63, | 1680,64, | 1680,65, | 1680,66, | 1680,67, | 1680,68, | 1680,69, | 1680,70, | 1680,71, | 1680,72, | 1680,73, | 1680,74, | 1680,75, | 1680,76, | 1680,77, | 1680,78, | 1680,79, | 1680,80, | 1680,81, | 1680,82, | 1680,83, | 1680,84, | 1680,85, | 1681,1, | 1681,2, | 1681,3, | 1681,4, | 1681,5, | 1681,6, | 1681,7, | 1681,8, | 1681,9, | 1681,10, | 1681,11, | 1681,12, | 1681,13, | 1681,14, | 1681,15, | 1681,16, | 1681,17, | 1681,18, | 1681,19, | 1681,20, | 1681,21, | 1681,22, | 1681,23, | 1681,24, | 1681,25, | 1681,26, | 1681,27, | 1681,28, | 1681,29, | 1681,30, | 1681,31, | 1681,32, | 1681,33, | 1681,34, | 1681,35, | 1681,36, | 1681,37, | 1681,38, | 1681,39, | 1681,40, | 1681,41, | 1681,42, | 1681,43, | 1681,44, | 1681,45, | 1681,46, | 1681,47, | 1681,48, | 1681,49, | 1681,50, | 1681,51, | 1681,52, | 1681,53, | 1681,54, | 1681,55, | 1681,56, | 1681,57, | 1681,58, | 1681,59, | 1681,60, | 1681,61, | 1681,62, | 1681,63, | 1681,64, | 1681,65, | 1681,66, | 1681,67, | 1681,68, | 1681,69, | 1681,70, | 1681,71, | 1681,72, | 1681,73, | 1681,74, | 1681,75, | 1681,76, | 1681,77, | 1681,78, | 1681,79, | 1681,80, | 1681,81, | 1681,82, | 1681,83, | 1681,84, | 1681,85, | 1682,1, | 1682,2, | 1682,3, | 1682,4, | 1682,5, | 1682,6, | 1682,7, | 1682,8, | 1682,9, | 1682,10, | 1682,11, | 1682,12, | 1682,13, | 1682,14, | 1682,15, | 1682,16, | 1682,17, | 1682,18, | 1682,19, | 1682,20, | 1682,21, | 1682,22, | 1682,23, | 1682,24, | 1682,25, | 1682,26, | 1682,27, | 1682,28, | 1682,29, | 1682,30, | 1682,31, | 1682,32, | 1682,33, | 1682,34, | 1682,35, | 1682,36, | 1682,37, | 1682,38, | 1682,39, | 1682,40, | 1682,41, | 1682,42, | 1682,43, | 1682,44, | 1682,45, | 1682,46, | 1682,47, | 1682,48, | 1682,49, | 1682,50, | 1682,51, | 1682,52, | 1682,53, | 1682,54, | 1682,55, | 1682,56, | 1682,57, | 1682,58, | 1682,59, | 1682,60, | 1682,61, | 1682,62, | 1682,63, | 1682,64, | 1682,65, | 1682,66, | 1682,67, | 1682,68, | 1682,69, | 1682,70, | 1682,71, | 1682,72, | 1682,73, | 1682,74, | 1682,75, | 1682,76, | 1682,77, | 1682,78, | 1682,79, | 1682,80, | 1682,81, | 1682,82, | 1682,83, | 1682,84, | 1682,85, | 1683,1, | 1683,2, | 1683,3, | 1683,4, | 1683,5, | 1683,6, | 1683,7, | 1683,8, | 1683,9, | 1683,10, | 1683,11, | 1683,12, | 1683,13, | 1683,14, | 1683,15, | 1683,16, | 1683,17, | 1683,18, | 1683,19, | 1683,20, | 1683,21, | 1683,22, | 1683,23, | 1683,24, | 1683,25, | 1683,26, | 1683,27, | 1683,28, | 1683,29, | 1683,30, | 1683,31, | 1683,32, | 1683,33, | 1683,34, | 1683,35, | 1683,36, | 1683,37, | 1683,38, | 1683,39, | 1683,40, | 1683,41, | 1683,42, | 1683,43, | 1683,44, | 1683,45, | 1683,46, | 1683,47, | 1683,48, | 1683,49, | 1683,50, | 1683,51, | 1683,52, | 1683,53, | 1683,54, | 1683,55, | 1683,56, | 1683,57, | 1683,58, | 1683,59, | 1683,60, | 1683,61, | 1683,62, | 1683,63, | 1683,64, | 1683,65, | 1683,66, | 1683,67, | 1683,68, | 1683,69, | 1683,70, | 1683,71, | 1683,72, | 1683,73, | 1683,74, | 1683,75, | 1683,76, | 1683,77, | 1683,78, | 1683,79, | 1683,80, | 1683,81, | 1683,82, | 1683,83, | 1683,84, | 1683,85, | 1684,1, | 1684,2, | 1684,3, | 1684,4, | 1684,5, | 1684,6, | 1684,7, | 1684,8, | 1684,9, | 1684,10, | 1684,11, | 1684,12, | 1684,13, | 1684,14, | 1684,15, | 1684,16, | 1684,17, | 1684,18, | 1684,19, | 1684,20, | 1684,21, | 1684,22, | 1684,23, | 1684,24, | 1684,25, | 1684,26, | 1684,27, | 1684,28, | 1684,29, | 1684,30, | 1684,31, | 1684,32, | 1684,33, | 1684,34, | 1684,35, | 1684,36, | 1684,37, | 1684,38, | 1684,39, | 1684,40, | 1684,41, | 1684,42, | 1684,43, | 1684,44, | 1684,45, | 1684,46, | 1684,47, | 1684,48, | 1684,49, | 1684,50, | 1684,51, | 1684,52, | 1684,53, | 1684,54, | 1684,55, | 1684,56, | 1684,57, | 1684,58, | 1684,59, | 1684,60, | 1684,61, | 1684,62, | 1684,63, | 1684,64, | 1684,65, | 1684,66, | 1684,67, | 1684,68, | 1684,69, | 1684,70, | 1684,71, | 1684,72, | 1684,73, | 1684,74, | 1684,75, | 1684,76, | 1684,77, | 1684,78, | 1684,79, | 1684,80, | 1684,81, | 1684,82, | 1684,83, | 1684,84, | 1684,85, | 1685,1, | 1685,2, | 1685,3, | 1685,4, | 1685,5, | 1685,6, | 1685,7, | 1685,8, | 1685,9, | 1685,10, | 1685,11, | 1685,12, | 1685,13, | 1685,14, | 1685,15, | 1685,16, | 1685,17, | 1685,18, | 1685,19, | 1685,20, | 1685,21, | 1685,22, | 1685,23, | 1685,24, | 1685,25, | 1685,26, | 1685,27, | 1685,28, | 1685,29, | 1685,30, | 1685,31, | 1685,32, | 1685,33, | 1685,34, | 1685,35, | 1685,36, | 1685,37, | 1685,38, | 1685,39, | 1685,40, | 1685,41, | 1685,42, | 1685,43, | 1685,44, | 1685,45, | 1685,46, | 1685,47, | 1685,48, | 1685,49, | 1685,50, | 1685,51, | 1685,52, | 1685,53, | 1685,54, | 1685,55, | 1685,56, | 1685,57, | 1685,58, | 1685,59, | 1685,60, | 1685,61, | 1685,62, | 1685,63, | 1685,64, | 1685,65, | 1685,66, | 1685,67, | 1685,68, | 1685,69, | 1685,70, | 1685,71, | 1685,72, | 1685,73, | 1685,74, | 1685,75, | 1685,76, | 1685,77, | 1685,78, | 1685,79, | 1685,80, | 1685,81, | 1685,82, | 1685,83, | 1685,84, | 1685,85, | 1686,1, | 1686,2, | 1686,3, | 1686,4, | 1686,5, | 1686,6, | 1686,7, | 1686,8, | 1686,9, | 1686,10, | 1686,11, | 1686,12, | 1686,13, | 1686,14, | 1686,15, | 1686,16, | 1686,17, | 1686,18, | 1686,19, | 1686,20, | 1686,21, | 1686,22, | 1686,23, | 1686,24, | 1686,25, | 1686,26, | 1686,27, | 1686,28, | 1686,29, | 1686,30, | 1686,31, | 1686,32, | 1686,33, | 1686,34, | 1686,35, | 1686,36, | 1686,37, | 1686,38, | 1686,39, | 1686,40, | 1686,41, | 1686,42, | 1686,43, | 1686,44, | 1686,45, | 1686,46, | 1686,47, | 1686,48, | 1686,49, | 1686,50, | 1686,51, | 1686,52, | 1686,53, | 1686,54, | 1686,55, | 1686,56, | 1686,57, | 1686,58, | 1686,59, | 1686,60, | 1686,61, | 1686,62, | 1686,63, | 1686,64, | 1686,65, | 1686,66, | 1686,67, | 1686,68, | 1686,69, | 1686,70, | 1686,71, | 1686,72, | 1686,73, | 1686,74, | 1686,75, | 1686,76, | 1686,77, | 1686,78, | 1686,79, | 1686,80, | 1686,81, | 1686,82, | 1686,83, | 1686,84, | 1686,85, | 1687,1, | 1687,2, | 1687,3, | 1687,4, | 1687,5, | 1687,6, | 1687,7, | 1687,8, | 1687,9, | 1687,10, | 1687,11, | 1687,12, | 1687,13, | 1687,14, | 1687,15, | 1687,16, | 1687,17, | 1687,18, | 1687,19, | 1687,20, | 1687,21, | 1687,22, | 1687,23, | 1687,24, | 1687,25, | 1687,26, | 1687,27, | 1687,28, | 1687,29, | 1687,30, | 1687,31, | 1687,32, | 1687,33, | 1687,34, | 1687,35, | 1687,36, | 1687,37, | 1687,38, | 1687,39, | 1687,40, | 1687,41, | 1687,42, | 1687,43, | 1687,44, | 1687,45, | 1687,46, | 1687,47, | 1687,48, | 1687,49, | 1687,50, | 1687,51, | 1687,52, | 1687,53, | 1687,54, | 1687,55, | 1687,56, | 1687,57, | 1687,58, | 1687,59, | 1687,60, | 1687,61, | 1687,62, | 1687,63, | 1687,64, | 1687,65, | 1687,66, | 1687,67, | 1687,68, | 1687,69, | 1687,70, | 1687,71, | 1687,72, | 1687,73, | 1687,74, | 1687,75, | 1687,76, | 1687,77, | 1687,78, | 1687,79, | 1687,80, | 1687,81, | 1687,82, | 1687,83, | 1687,84, | 1687,85, | 1688,1, | 1688,2, | 1688,3, | 1688,4, | 1688,5, | 1688,6, | 1688,7, | 1688,8, | 1688,9, | 1688,10, | 1688,11, | 1688,12, | 1688,13, | 1688,14, | 1688,15, | 1688,16, | 1688,17, | 1688,18, | 1688,19, | 1688,20, | 1688,21, | 1688,22, | 1688,23, | 1688,24, | 1688,25, | 1688,26, | 1688,27, | 1688,28, | 1688,29, | 1688,30, | 1688,31, | 1688,32, | 1688,33, | 1688,34, | 1688,35, | 1688,36, | 1688,37, | 1688,38, | 1688,39, | 1688,40, | 1688,41, | 1688,42, | 1688,43, | 1688,44, | 1688,45, | 1688,46, | 1688,47, | 1688,48, | 1688,49, | 1688,50, | 1688,51, | 1688,52, | 1688,53, | 1688,54, | 1688,55, | 1688,56, | 1688,57, | 1688,58, | 1688,59, | 1688,60, | 1688,61, | 1688,62, | 1688,63, | 1688,64, | 1688,65, | 1688,66, | 1688,67, | 1688,68, | 1688,69, | 1688,70, | 1688,71, | 1688,72, | 1688,73, | 1688,74, | 1688,75, | 1688,76, | 1688,77, | 1688,78, | 1688,79, | 1688,80, | 1688,81, | 1688,82, | 1688,83, | 1688,84, | 1688,85, | 1689,1, | 1689,2, | 1689,3, | 1689,4, | 1689,5, | 1689,6, | 1689,7, | 1689,8, | 1689,9, | 1689,10, | 1689,11, | 1689,12, | 1689,13, | 1689,14, | 1689,15, | 1689,16, | 1689,17, | 1689,18, | 1689,19, | 1689,20, | 1689,21, | 1689,22, | 1689,23, | 1689,24, | 1689,25, | 1689,26, | 1689,27, | 1689,28, | 1689,29, | 1689,30, | 1689,31, | 1689,32, | 1689,33, | 1689,34, | 1689,35, | 1689,36, | 1689,37, | 1689,38, | 1689,39, | 1689,40, | 1689,41, | 1689,42, | 1689,43, | 1689,44, | 1689,45, | 1689,46, | 1689,47, | 1689,48, | 1689,49, | 1689,50, | 1689,51, | 1689,52, | 1689,53, | 1689,54, | 1689,55, | 1689,56, | 1689,57, | 1689,58, | 1689,59, | 1689,60, | 1689,61, | 1689,62, | 1689,63, | 1689,64, | 1689,65, | 1689,66, | 1689,67, | 1689,68, | 1689,69, | 1689,70, | 1689,71, | 1689,72, | 1689,73, | 1689,74, | 1689,75, | 1689,76, | 1689,77, | 1689,78, | 1689,79, | 1689,80, | 1689,81, | 1689,82, | 1689,83, | 1689,84, | 1689,85, | 1690,1, | 1690,2, | 1690,3, | 1690,4, | 1690,5, | 1690,6, | 1690,7, | 1690,8, | 1690,9, | 1690,10, | 1690,11, | 1690,12, | 1690,13, | 1690,14, | 1690,15, | 1690,16, | 1690,17, | 1690,18, | 1690,19, | 1690,20, | 1690,21, | 1690,22, | 1690,23, | 1690,24, | 1690,25, | 1690,26, | 1690,27, | 1690,28, | 1690,29, | 1690,30, | 1690,31, | 1690,32, | 1690,33, | 1690,34, | 1690,35, | 1690,36, | 1690,37, | 1690,38, | 1690,39, | 1690,40, | 1690,41, | 1690,42, | 1690,43, | 1690,44, | 1690,45, | 1690,46, | 1690,47, | 1690,48, | 1690,49, | 1690,50, | 1690,51, | 1690,52, | 1690,53, | 1690,54, | 1690,55, | 1690,56, | 1690,57, | 1690,58, | 1690,59, | 1690,60, | 1690,61, | 1690,62, | 1690,63, | 1690,64, | 1690,65, | 1690,66, | 1690,67, | 1690,68, | 1690,69, | 1690,70, | 1690,71, | 1690,72, | 1690,73, | 1690,74, | 1690,75, | 1690,76, | 1690,77, | 1690,78, | 1690,79, | 1690,80, | 1690,81, | 1690,82, | 1690,83, | 1690,84, | 1690,85, | 1691,1, | 1691,2, | 1691,3, | 1691,4, | 1691,5, | 1691,6, | 1691,7, | 1691,8, | 1691,9, | 1691,10, | 1691,11, | 1691,12, | 1691,13, | 1691,14, | 1691,15, | 1691,16, | 1691,17, | 1691,18, | 1691,19, | 1691,20, | 1691,21, | 1691,22, | 1691,23, | 1691,24, | 1691,25, | 1691,26, | 1691,27, | 1691,28, | 1691,29, | 1691,30, | 1691,31, | 1691,32, | 1691,33, | 1691,34, | 1691,35, | 1691,36, | 1691,37, | 1691,38, | 1691,39, | 1691,40, | 1691,41, | 1691,42, | 1691,43, | 1691,44, | 1691,45, | 1691,46, | 1691,47, | 1691,48, | 1691,49, | 1691,50, | 1691,51, | 1691,52, | 1691,53, | 1691,54, | 1691,55, | 1691,56, | 1691,57, | 1691,58, | 1691,59, | 1691,60, | 1691,61, | 1691,62, | 1691,63, | 1691,64, | 1691,65, | 1691,66, | 1691,67, | 1691,68, | 1691,69, | 1691,70, | 1691,71, | 1691,72, | 1691,73, | 1691,74, | 1691,75, | 1691,76, | 1691,77, | 1691,78, | 1691,79, | 1691,80, | 1691,81, | 1691,82, | 1691,83, | 1691,84, | 1691,85, | 1692,1, | 1692,2, | 1692,3, | 1692,4, | 1692,5, | 1692,6, | 1692,7, | 1692,8, | 1692,9, | 1692,10, | 1692,11, | 1692,12, | 1692,13, | 1692,14, | 1692,15, | 1692,16, | 1692,17, | 1692,18, | 1692,19, | 1692,20, | 1692,21, | 1692,22, | 1692,23, | 1692,24, | 1692,25, | 1692,26, | 1692,27, | 1692,28, | 1692,29, | 1692,30, | 1692,31, | 1692,32, | 1692,33, | 1692,34, | 1692,35, | 1692,36, | 1692,37, | 1692,38, | 1692,39, | 1692,40, | 1692,41, | 1692,42, | 1692,43, | 1692,44, | 1692,45, | 1692,46, | 1692,47, | 1692,48, | 1692,49, | 1692,50, | 1692,51, | 1692,52, | 1692,53, | 1692,54, | 1692,55, | 1692,56, | 1692,57, | 1692,58, | 1692,59, | 1692,60, | 1692,61, | 1692,62, | 1692,63, | 1692,64, | 1692,65, | 1692,66, | 1692,67, | 1692,68, | 1692,69, | 1692,70, | 1692,71, | 1692,72, | 1692,73, | 1692,74, | 1692,75, | 1692,76, | 1692,77, | 1692,78, | 1692,79, | 1692,80, | 1692,81, | 1692,82, | 1692,83, | 1692,84, | 1692,85, | 1693,1, | 1693,2, | 1693,3, | 1693,4, | 1693,5, | 1693,6, | 1693,7, | 1693,8, | 1693,9, | 1693,10, | 1693,11, | 1693,12, | 1693,13, | 1693,14, | 1693,15, | 1693,16, | 1693,17, | 1693,18, | 1693,19, | 1693,20, | 1693,21, | 1693,22, | 1693,23, | 1693,24, | 1693,25, | 1693,26, | 1693,27, | 1693,28, | 1693,29, | 1693,30, | 1693,31, | 1693,32, | 1693,33, | 1693,34, | 1693,35, | 1693,36, | 1693,37, | 1693,38, | 1693,39, | 1693,40, | 1693,41, | 1693,42, | 1693,43, | 1693,44, | 1693,45, | 1693,46, | 1693,47, | 1693,48, | 1693,49, | 1693,50, | 1693,51, | 1693,52, | 1693,53, | 1693,54, | 1693,55, | 1693,56, | 1693,57, | 1693,58, | 1693,59, | 1693,60, | 1693,61, | 1693,62, | 1693,63, | 1693,64, | 1693,65, | 1693,66, | 1693,67, | 1693,68, | 1693,69, | 1693,70, | 1693,71, | 1693,72, | 1693,73, | 1693,74, | 1693,75, | 1693,76, | 1693,77, | 1693,78, | 1693,79, | 1693,80, | 1693,81, | 1693,82, | 1693,83, | 1693,84, | 1693,85, | 1694,1, | 1694,2, | 1694,3, | 1694,4, | 1694,5, | 1694,6, | 1694,7, | 1694,8, | 1694,9, | 1694,10, | 1694,11, | 1694,12, | 1694,13, | 1694,14, | 1694,15, | 1694,16, | 1694,17, | 1694,18, | 1694,19, | 1694,20, | 1694,21, | 1694,22, | 1694,23, | 1694,24, | 1694,25, | 1694,26, | 1694,27, | 1694,28, | 1694,29, | 1694,30, | 1694,31, | 1694,32, | 1694,33, | 1694,34, | 1694,35, | 1694,36, | 1694,37, | 1694,38, | 1694,39, | 1694,40, | 1694,41, | 1694,42, | 1694,43, | 1694,44, | 1694,45, | 1694,46, | 1694,47, | 1694,48, | 1694,49, | 1694,50, | 1694,51, | 1694,52, | 1694,53, | 1694,54, | 1694,55, | 1694,56, | 1694,57, | 1694,58, | 1694,59, | 1694,60, | 1694,61, | 1694,62, | 1694,63, | 1694,64, | 1694,65, | 1694,66, | 1694,67, | 1694,68, | 1694,69, | 1694,70, | 1694,71, | 1694,72, | 1694,73, | 1694,74, | 1694,75, | 1694,76, | 1694,77, | 1694,78, | 1694,79, | 1694,80, | 1694,81, | 1694,82, | 1694,83, | 1694,84, | 1694,85, | 1695,1, | 1695,2, | 1695,3, | 1695,4, | 1695,5, | 1695,6, | 1695,7, | 1695,8, | 1695,9, | 1695,10, | 1695,11, | 1695,12, | 1695,13, | 1695,14, | 1695,15, | 1695,16, | 1695,17, | 1695,18, | 1695,19, | 1695,20, | 1695,21, | 1695,22, | 1695,23, | 1695,24, | 1695,25, | 1695,26, | 1695,27, | 1695,28, | 1695,29, | 1695,30, | 1695,31, | 1695,32, | 1695,33, | 1695,34, | 1695,35, | 1695,36, | 1695,37, | 1695,38, | 1695,39, | 1695,40, | 1695,41, | 1695,42, | 1695,43, | 1695,44, | 1695,45, | 1695,46, | 1695,47, | 1695,48, | 1695,49, | 1695,50, | 1695,51, | 1695,52, | 1695,53, | 1695,54, | 1695,55, | 1695,56, | 1695,57, | 1695,58, | 1695,59, | 1695,60, | 1695,61, | 1695,62, | 1695,63, | 1695,64, | 1695,65, | 1695,66, | 1695,67, | 1695,68, | 1695,69, | 1695,70, | 1695,71, | 1695,72, | 1695,73, | 1695,74, | 1695,75, | 1695,76, | 1695,77, | 1695,78, | 1695,79, | 1695,80, | 1695,81, | 1695,82, | 1695,83, | 1695,84, | 1695,85, | 1696,1, | 1696,2, | 1696,3, | 1696,4, | 1696,5, | 1696,6, | 1696,7, | 1696,8, | 1696,9, | 1696,10, | 1696,11, | 1696,12, | 1696,13, | 1696,14, | 1696,15, | 1696,16, | 1696,17, | 1696,18, | 1696,19, | 1696,20, | 1696,21, | 1696,22, | 1696,23, | 1696,24, | 1696,25, | 1696,26, | 1696,27, | 1696,28, | 1696,29, | 1696,30, | 1696,31, | 1696,32, | 1696,33, | 1696,34, | 1696,35, | 1696,36, | 1696,37, | 1696,38, | 1696,39, | 1696,40, | 1696,41, | 1696,42, | 1696,43, | 1696,44, | 1696,45, | 1696,46, | 1696,47, | 1696,48, | 1696,49, | 1696,50, | 1696,51, | 1696,52, | 1696,53, | 1696,54, | 1696,55, | 1696,56, | 1696,57, | 1696,58, | 1696,59, | 1696,60, | 1696,61, | 1696,62, | 1696,63, | 1696,64, | 1696,65, | 1696,66, | 1696,67, | 1696,68, | 1696,69, | 1696,70, | 1696,71, | 1696,72, | 1696,73, | 1696,74, | 1696,75, | 1696,76, | 1696,77, | 1696,78, | 1696,79, | 1696,80, | 1696,81, | 1696,82, | 1696,83, | 1696,84, | 1696,85, | 1697,1, | 1697,2, | 1697,3, | 1697,4, | 1697,5, | 1697,6, | 1697,7, | 1697,8, | 1697,9, | 1697,10, | 1697,11, | 1697,12, | 1697,13, | 1697,14, | 1697,15, | 1697,16, | 1697,17, | 1697,18, | 1697,19, | 1697,20, | 1697,21, | 1697,22, | 1697,23, | 1697,24, | 1697,25, | 1697,26, | 1697,27, | 1697,28, | 1697,29, | 1697,30, | 1697,31, | 1697,32, | 1697,33, | 1697,34, | 1697,35, | 1697,36, | 1697,37, | 1697,38, | 1697,39, | 1697,40, | 1697,41, | 1697,42, | 1697,43, | 1697,44, | 1697,45, | 1697,46, | 1697,47, | 1697,48, | 1697,49, | 1697,50, | 1697,51, | 1697,52, | 1697,53, | 1697,54, | 1697,55, | 1697,56, | 1697,57, | 1697,58, | 1697,59, | 1697,60, | 1697,61, | 1697,62, | 1697,63, | 1697,64, | 1697,65, | 1697,66, | 1697,67, | 1697,68, | 1697,69, | 1697,70, | 1697,71, | 1697,72, | 1697,73, | 1697,74, | 1697,75, | 1697,76, | 1697,77, | 1697,78, | 1697,79, | 1697,80, | 1697,81, | 1697,82, | 1697,83, | 1697,84, | 1697,85, | 1698,1, | 1698,2, | 1698,3, | 1698,4, | 1698,5, | 1698,6, | 1698,7, | 1698,8, | 1698,9, | 1698,10, | 1698,11, | 1698,12, | 1698,13, | 1698,14, | 1698,15, | 1698,16, | 1698,17, | 1698,18, | 1698,19, | 1698,20, | 1698,21, | 1698,22, | 1698,23, | 1698,24, | 1698,25, | 1698,26, | 1698,27, | 1698,28, | 1698,29, | 1698,30, | 1698,31, | 1698,32, | 1698,33, | 1698,34, | 1698,35, | 1698,36, | 1698,37, | 1698,38, | 1698,39, | 1698,40, | 1698,41, | 1698,42, | 1698,43, | 1698,44, | 1698,45, | 1698,46, | 1698,47, | 1698,48, | 1698,49, | 1698,50, | 1698,51, | 1698,52, | 1698,53, | 1698,54, | 1698,55, | 1698,56, | 1698,57, | 1698,58, | 1698,59, | 1698,60, | 1698,61, | 1698,62, | 1698,63, | 1698,64, | 1698,65, | 1698,66, | 1698,67, | 1698,68, | 1698,69, | 1698,70, | 1698,71, | 1698,72, | 1698,73, | 1698,74, | 1698,75, | 1698,76, | 1698,77, | 1698,78, | 1698,79, | 1698,80, | 1698,81, | 1698,82, | 1698,83, | 1698,84, | 1698,85, | 1699,1, | 1699,2, | 1699,3, | 1699,4, | 1699,5, | 1699,6, | 1699,7, | 1699,8, | 1699,9, | 1699,10, | 1699,11, | 1699,12, | 1699,13, | 1699,14, | 1699,15, | 1699,16, | 1699,17, | 1699,18, | 1699,19, | 1699,20, | 1699,21, | 1699,22, | 1699,23, | 1699,24, | 1699,25, | 1699,26, | 1699,27, | 1699,28, | 1699,29, | 1699,30, | 1699,31, | 1699,32, | 1699,33, | 1699,34, | 1699,35, | 1699,36, | 1699,37, | 1699,38, | 1699,39, | 1699,40, | 1699,41, | 1699,42, | 1699,43, | 1699,44, | 1699,45, | 1699,46, | 1699,47, | 1699,48, | 1699,49, | 1699,50, | 1699,51, | 1699,52, | 1699,53, | 1699,54, | 1699,55, | 1699,56, | 1699,57, | 1699,58, | 1699,59, | 1699,60, | 1699,61, | 1699,62, | 1699,63, | 1699,64, | 1699,65, | 1699,66, | 1699,67, | 1699,68, | 1699,69, | 1699,70, | 1699,71, | 1699,72, | 1699,73, | 1699,74, | 1699,75, | 1699,76, | 1699,77, | 1699,78, | 1699,79, | 1699,80, | 1699,81, | 1699,82, | 1699,83, | 1699,84, | 1699,85, | 1700,1, | 1700,2, | 1700,3, | 1700,4, | 1700,5, | 1700,6, | 1700,7, | 1700,8, | 1700,9, | 1700,10, | 1700,11, | 1700,12, | 1700,13, | 1700,14, | 1700,15, | 1700,16, | 1700,17, | 1700,18, | 1700,19, | 1700,20, | 1700,21, | 1700,22, | 1700,23, | 1700,24, | 1700,25, | 1700,26, | 1700,27, | 1700,28, | 1700,29, | 1700,30, | 1700,31, | 1700,32, | 1700,33, | 1700,34, | 1700,35, | 1700,36, | 1700,37, | 1700,38, | 1700,39, | 1700,40, | 1700,41, | 1700,42, | 1700,43, | 1700,44, | 1700,45, | 1700,46, | 1700,47, | 1700,48, | 1700,49, | 1700,50, | 1700,51, | 1700,52, | 1700,53, | 1700,54, | 1700,55, | 1700,56, | 1700,57, | 1700,58, | 1700,59, | 1700,60, | 1700,61, | 1700,62, | 1700,63, | 1700,64, | 1700,65, | 1700,66, | 1700,67, | 1700,68, | 1700,69, | 1700,70, | 1700,71, | 1700,72, | 1700,73, | 1700,74, | 1700,75, | 1700,76, | 1700,77, | 1700,78, | 1700,79, | 1700,80, | 1700,81, | 1700,82, | 1700,83, | 1700,84, | 1700,85, | 1701,1, | 1701,2, | 1701,3, | 1701,4, | 1701,5, | 1701,6, | 1701,7, | 1701,8, | 1701,9, | 1701,10, | 1701,11, | 1701,12, | 1701,13, | 1701,14, | 1701,15, | 1701,16, | 1701,17, | 1701,18, | 1701,19, | 1701,20, | 1701,21, | 1701,22, | 1701,23, | 1701,24, | 1701,25, | 1701,26, | 1701,27, | 1701,28, | 1701,29, | 1701,30, | 1701,31, | 1701,32, | 1701,33, | 1701,34, | 1701,35, | 1701,36, | 1701,37, | 1701,38, | 1701,39, | 1701,40, | 1701,41, | 1701,42, | 1701,43, | 1701,44, | 1701,45, | 1701,46, | 1701,47, | 1701,48, | 1701,49, | 1701,50, | 1701,51, | 1701,52, | 1701,53, | 1701,54, | 1701,55, | 1701,56, | 1701,57, | 1701,58, | 1701,59, | 1701,60, | 1701,61, | 1701,62, | 1701,63, | 1701,64, | 1701,65, | 1701,66, | 1701,67, | 1701,68, | 1701,69, | 1701,70, | 1701,71, | 1701,72, | 1701,73, | 1701,74, | 1701,75, | 1701,76, | 1701,77, | 1701,78, | 1701,79, | 1701,80, | 1701,81, | 1701,82, | 1701,83, | 1701,84, | 1701,85, | 1702,1, | 1702,2, | 1702,3, | 1702,4, | 1702,5, | 1702,6, | 1702,7, | 1702,8, | 1702,9, | 1702,10, | 1702,11, | 1702,12, | 1702,13, | 1702,14, | 1702,15, | 1702,16, | 1702,17, | 1702,18, | 1702,19, | 1702,20, | 1702,21, | 1702,22, | 1702,23, | 1702,24, | 1702,25, | 1702,26, | 1702,27, | 1702,28, | 1702,29, | 1702,30, | 1702,31, | 1702,32, | 1702,33, | 1702,34, | 1702,35, | 1702,36, | 1702,37, | 1702,38, | 1702,39, | 1702,40, | 1702,41, | 1702,42, | 1702,43, | 1702,44, | 1702,45, | 1702,46, | 1702,47, | 1702,48, | 1702,49, | 1702,50, | 1702,51, | 1702,52, | 1702,53, | 1702,54, | 1702,55, | 1702,56, | 1702,57, | 1702,58, | 1702,59, | 1702,60, | 1702,61, | 1702,62, | 1702,63, | 1702,64, | 1702,65, | 1702,66, | 1702,67, | 1702,68, | 1702,69, | 1702,70, | 1702,71, | 1702,72, | 1702,73, | 1702,74, | 1702,75, | 1702,76, | 1702,77, | 1702,78, | 1702,79, | 1702,80, | 1702,81, | 1702,82, | 1702,83, | 1702,84, | 1702,85, | 1703,1, | 1703,2, | 1703,3, | 1703,4, | 1703,5, | 1703,6, | 1703,7, | 1703,8, | 1703,9, | 1703,10, | 1703,11, | 1703,12, | 1703,13, | 1703,14, | 1703,15, | 1703,16, | 1703,17, | 1703,18, | 1703,19, | 1703,20, | 1703,21, | 1703,22, | 1703,23, | 1703,24, | 1703,25, | 1703,26, | 1703,27, | 1703,28, | 1703,29, | 1703,30, | 1703,31, | 1703,32, | 1703,33, | 1703,34, | 1703,35, | 1703,36, | 1703,37, | 1703,38, | 1703,39, | 1703,40, | 1703,41, | 1703,42, | 1703,43, | 1703,44, | 1703,45, | 1703,46, | 1703,47, | 1703,48, | 1703,49, | 1703,50, | 1703,51, | 1703,52, | 1703,53, | 1703,54, | 1703,55, | 1703,56, | 1703,57, | 1703,58, | 1703,59, | 1703,60, | 1703,61, | 1703,62, | 1703,63, | 1703,64, | 1703,65, | 1703,66, | 1703,67, | 1703,68, | 1703,69, | 1703,70, | 1703,71, | 1703,72, | 1703,73, | 1703,74, | 1703,75, | 1703,76, | 1703,77, | 1703,78, | 1703,79, | 1703,80, | 1703,81, | 1703,82, | 1703,83, | 1703,84, | 1703,85, | 1704,1, | 1704,2, | 1704,3, | 1704,4, | 1704,5, | 1704,6, | 1704,7, | 1704,8, | 1704,9, | 1704,10, | 1704,11, | 1704,12, | 1704,13, | 1704,14, | 1704,15, | 1704,16, | 1704,17, | 1704,18, | 1704,19, | 1704,20, | 1704,21, | 1704,22, | 1704,23, | 1704,24, | 1704,25, | 1704,26, | 1704,27, | 1704,28, | 1704,29, | 1704,30, | 1704,31, | 1704,32, | 1704,33, | 1704,34, | 1704,35, | 1704,36, | 1704,37, | 1704,38, | 1704,39, | 1704,40, | 1704,41, | 1704,42, | 1704,43, | 1704,44, | 1704,45, | 1704,46, | 1704,47, | 1704,48, | 1704,49, | 1704,50, | 1704,51, | 1704,52, | 1704,53, | 1704,54, | 1704,55, | 1704,56, | 1704,57, | 1704,58, | 1704,59, | 1704,60, | 1704,61, | 1704,62, | 1704,63, | 1704,64, | 1704,65, | 1704,66, | 1704,67, | 1704,68, | 1704,69, | 1704,70, | 1704,71, | 1704,72, | 1704,73, | 1704,74, | 1704,75, | 1704,76, | 1704,77, | 1704,78, | 1704,79, | 1704,80, | 1704,81, | 1704,82, | 1704,83, | 1704,84, | 1704,85, | 1705,1, | 1705,2, | 1705,3, | 1705,4, | 1705,5, | 1705,6, | 1705,7, | 1705,8, | 1705,9, | 1705,10, | 1705,11, | 1705,12, | 1705,13, | 1705,14, | 1705,15, | 1705,16, | 1705,17, | 1705,18, | 1705,19, | 1705,20, | 1705,21, | 1705,22, | 1705,23, | 1705,24, | 1705,25, | 1705,26, | 1705,27, | 1705,28, | 1705,29, | 1705,30, | 1705,31, | 1705,32, | 1705,33, | 1705,34, | 1705,35, | 1705,36, | 1705,37, | 1705,38, | 1705,39, | 1705,40, | 1705,41, | 1705,42, | 1705,43, | 1705,44, | 1705,45, | 1705,46, | 1705,47, | 1705,48, | 1705,49, | 1705,50, | 1705,51, | 1705,52, | 1705,53, | 1705,54, | 1705,55, | 1705,56, | 1705,57, | 1705,58, | 1705,59, | 1705,60, | 1705,61, | 1705,62, | 1705,63, | 1705,64, | 1705,65, | 1705,66, | 1705,67, | 1705,68, | 1705,69, | 1705,70, | 1705,71, | 1705,72, | 1705,73, | 1705,74, | 1705,75, | 1705,76, | 1705,77, | 1705,78, | 1705,79, | 1705,80, | 1705,81, | 1705,82, | 1705,83, | 1705,84, | 1705,85, | 1706,1, | 1706,2, | 1706,3, | 1706,4, | 1706,5, | 1706,6, | 1706,7, | 1706,8, | 1706,9, | 1706,10, | 1706,11, | 1706,12, | 1706,13, | 1706,14, | 1706,15, | 1706,16, | 1706,17, | 1706,18, | 1706,19, | 1706,20, | 1706,21, | 1706,22, | 1706,23, | 1706,24, | 1706,25, | 1706,26, | 1706,27, | 1706,28, | 1706,29, | 1706,30, | 1706,31, | 1706,32, | 1706,33, | 1706,34, | 1706,35, | 1706,36, | 1706,37, | 1706,38, | 1706,39, | 1706,40, | 1706,41, | 1706,42, | 1706,43, | 1706,44, | 1706,45, | 1706,46, | 1706,47, | 1706,48, | 1706,49, | 1706,50, | 1706,51, | 1706,52, | 1706,53, | 1706,54, | 1706,55, | 1706,56, | 1706,57, | 1706,58, | 1706,59, | 1706,60, | 1706,61, | 1706,62, | 1706,63, | 1706,64, | 1706,65, | 1706,66, | 1706,67, | 1706,68, | 1706,69, | 1706,70, | 1706,71, | 1706,72, | 1706,73, | 1706,74, | 1706,75, | 1706,76, | 1706,77, | 1706,78, | 1706,79, | 1706,80, | 1706,81, | 1706,82, | 1706,83, | 1706,84, | 1706,85, | 1707,1, | 1707,2, | 1707,3, | 1707,4, | 1707,5, | 1707,6, | 1707,7, | 1707,8, | 1707,9, | 1707,10, | 1707,11, | 1707,12, | 1707,13, | 1707,14, | 1707,15, | 1707,16, | 1707,17, | 1707,18, | 1707,19, | 1707,20, | 1707,21, | 1707,22, | 1707,23, | 1707,24, | 1707,25, | 1707,26, | 1707,27, | 1707,28, | 1707,29, | 1707,30, | 1707,31, | 1707,32, | 1707,33, | 1707,34, | 1707,35, | 1707,36, | 1707,37, | 1707,38, | 1707,39, | 1707,40, | 1707,41, | 1707,42, | 1707,43, | 1707,44, | 1707,45, | 1707,46, | 1707,47, | 1707,48, | 1707,49, | 1707,50, | 1707,51, | 1707,52, | 1707,53, | 1707,54, | 1707,55, | 1707,56, | 1707,57, | 1707,58, | 1707,59, | 1707,60, | 1707,61, | 1707,62, | 1707,63, | 1707,64, | 1707,65, | 1707,66, | 1707,67, | 1707,68, | 1707,69, | 1707,70, | 1707,71, | 1707,72, | 1707,73, | 1707,74, | 1707,75, | 1707,76, | 1707,77, | 1707,78, | 1707,79, | 1707,80, | 1707,81, | 1707,82, | 1707,83, | 1707,84, | 1707,85, | 1708,1, | 1708,2, | 1708,3, | 1708,4, | 1708,5, | 1708,6, | 1708,7, | 1708,8, | 1708,9, | 1708,10, | 1708,11, | 1708,12, | 1708,13, | 1708,14, | 1708,15, | 1708,16, | 1708,17, | 1708,18, | 1708,19, | 1708,20, | 1708,21, | 1708,22, | 1708,23, | 1708,24, | 1708,25, | 1708,26, | 1708,27, | 1708,28, | 1708,29, | 1708,30, | 1708,31, | 1708,32, | 1708,33, | 1708,34, | 1708,35, | 1708,36, | 1708,37, | 1708,38, | 1708,39, | 1708,40, | 1708,41, | 1708,42, | 1708,43, | 1708,44, | 1708,45, | 1708,46, | 1708,47, | 1708,48, | 1708,49, | 1708,50, | 1708,51, | 1708,52, | 1708,53, | 1708,54, | 1708,55, | 1708,56, | 1708,57, | 1708,58, | 1708,59, | 1708,60, | 1708,61, | 1708,62, | 1708,63, | 1708,64, | 1708,65, | 1708,66, | 1708,67, | 1708,68, | 1708,69, | 1708,70, | 1708,71, | 1708,72, | 1708,73, | 1708,74, | 1708,75, | 1708,76, | 1708,77, | 1708,78, | 1708,79, | 1708,80, | 1708,81, | 1708,82, | 1708,83, | 1708,84, | 1708,85, | 1709,1, | 1709,2, | 1709,3, | 1709,4, | 1709,5, | 1709,6, | 1709,7, | 1709,8, | 1709,9, | 1709,10, | 1709,11, | 1709,12, | 1709,13, | 1709,14, | 1709,15, | 1709,16, | 1709,17, | 1709,18, | 1709,19, | 1709,20, | 1709,21, | 1709,22, | 1709,23, | 1709,24, | 1709,25, | 1709,26, | 1709,27, | 1709,28, | 1709,29, | 1709,30, | 1709,31, | 1709,32, | 1709,33, | 1709,34, | 1709,35, | 1709,36, | 1709,37, | 1709,38, | 1709,39, | 1709,40, | 1709,41, | 1709,42, | 1709,43, | 1709,44, | 1709,45, | 1709,46, | 1709,47, | 1709,48, | 1709,49, | 1709,50, | 1709,51, | 1709,52, | 1709,53, | 1709,54, | 1709,55, | 1709,56, | 1709,57, | 1709,58, | 1709,59, | 1709,60, | 1709,61, | 1709,62, | 1709,63, | 1709,64, | 1709,65, | 1709,66, | 1709,67, | 1709,68, | 1709,69, | 1709,70, | 1709,71, | 1709,72, | 1709,73, | 1709,74, | 1709,75, | 1709,76, | 1709,77, | 1709,78, | 1709,79, | 1709,80, | 1709,81, | 1709,82, | 1709,83, | 1709,84, | 1709,85, | 1710,1, | 1710,2, | 1710,3, | 1710,4, | 1710,5, | 1710,6, | 1710,7, | 1710,8, | 1710,9, | 1710,10, | 1710,11, | 1710,12, | 1710,13, | 1710,14, | 1710,15, | 1710,16, | 1710,17, | 1710,18, | 1710,19, | 1710,20, | 1710,21, | 1710,22, | 1710,23, | 1710,24, | 1710,25, | 1710,26, | 1710,27, | 1710,28, | 1710,29, | 1710,30, | 1710,31, | 1710,32, | 1710,33, | 1710,34, | 1710,35, | 1710,36, | 1710,37, | 1710,38, | 1710,39, | 1710,40, | 1710,41, | 1710,42, | 1710,43, | 1710,44, | 1710,45, | 1710,46, | 1710,47, | 1710,48, | 1710,49, | 1710,50, | 1710,51, | 1710,52, | 1710,53, | 1710,54, | 1710,55, | 1710,56, | 1710,57, | 1710,58, | 1710,59, | 1710,60, | 1710,61, | 1710,62, | 1710,63, | 1710,64, | 1710,65, | 1710,66, | 1710,67, | 1710,68, | 1710,69, | 1710,70, | 1710,71, | 1710,72, | 1710,73, | 1710,74, | 1710,75, | 1710,76, | 1710,77, | 1710,78, | 1710,79, | 1710,80, | 1710,81, | 1710,82, | 1710,83, | 1710,84, | 1710,85, | 1711,1, | 1711,2, | 1711,3, | 1711,4, | 1711,5, | 1711,6, | 1711,7, | 1711,8, | 1711,9, | 1711,10, | 1711,11, | 1711,12, | 1711,13, | 1711,14, | 1711,15, | 1711,16, | 1711,17, | 1711,18, | 1711,19, | 1711,20, | 1711,21, | 1711,22, | 1711,23, | 1711,24, | 1711,25, | 1711,26, | 1711,27, | 1711,28, | 1711,29, | 1711,30, | 1711,31, | 1711,32, | 1711,33, | 1711,34, | 1711,35, | 1711,36, | 1711,37, | 1711,38, | 1711,39, | 1711,40, | 1711,41, | 1711,42, | 1711,43, | 1711,44, | 1711,45, | 1711,46, | 1711,47, | 1711,48, | 1711,49, | 1711,50, | 1711,51, | 1711,52, | 1711,53, | 1711,54, | 1711,55, | 1711,56, | 1711,57, | 1711,58, | 1711,59, | 1711,60, | 1711,61, | 1711,62, | 1711,63, | 1711,64, | 1711,65, | 1711,66, | 1711,67, | 1711,68, | 1711,69, | 1711,70, | 1711,71, | 1711,72, | 1711,73, | 1711,74, | 1711,75, | 1711,76, | 1711,77, | 1711,78, | 1711,79, | 1711,80, | 1711,81, | 1711,82, | 1711,83, | 1711,84, | 1711,85, | 1712,1, | 1712,2, | 1712,3, | 1712,4, | 1712,5, | 1712,6, | 1712,7, | 1712,8, | 1712,9, | 1712,10, | 1712,11, | 1712,12, | 1712,13, | 1712,14, | 1712,15, | 1712,16, | 1712,17, | 1712,18, | 1712,19, | 1712,20, | 1712,21, | 1712,22, | 1712,23, | 1712,24, | 1712,25, | 1712,26, | 1712,27, | 1712,28, | 1712,29, | 1712,30, | 1712,31, | 1712,32, | 1712,33, | 1712,34, | 1712,35, | 1712,36, | 1712,37, | 1712,38, | 1712,39, | 1712,40, | 1712,41, | 1712,42, | 1712,43, | 1712,44, | 1712,45, | 1712,46, | 1712,47, | 1712,48, | 1712,49, | 1712,50, | 1712,51, | 1712,52, | 1712,53, | 1712,54, | 1712,55, | 1712,56, | 1712,57, | 1712,58, | 1712,59, | 1712,60, | 1712,61, | 1712,62, | 1712,63, | 1712,64, | 1712,65, | 1712,66, | 1712,67, | 1712,68, | 1712,69, | 1712,70, | 1712,71, | 1712,72, | 1712,73, | 1712,74, | 1712,75, | 1712,76, | 1712,77, | 1712,78, | 1712,79, | 1712,80, | 1712,81, | 1712,82, | 1712,83, | 1712,84, | 1712,85, | 1713,1, | 1713,2, | 1713,3, | 1713,4, | 1713,5, | 1713,6, | 1713,7, | 1713,8, | 1713,9, | 1713,10, | 1713,11, | 1713,12, | 1713,13, | 1713,14, | 1713,15, | 1713,16, | 1713,17, | 1713,18, | 1713,19, | 1713,20, | 1713,21, | 1713,22, | 1713,23, | 1713,24, | 1713,25, | 1713,26, | 1713,27, | 1713,28, | 1713,29, | 1713,30, | 1713,31, | 1713,32, | 1713,33, | 1713,34, | 1713,35, | 1713,36, | 1713,37, | 1713,38, | 1713,39, | 1713,40, | 1713,41, | 1713,42, | 1713,43, | 1713,44, | 1713,45, | 1713,46, | 1713,47, | 1713,48, | 1713,49, | 1713,50, | 1713,51, | 1713,52, | 1713,53, | 1713,54, | 1713,55, | 1713,56, | 1713,57, | 1713,58, | 1713,59, | 1713,60, | 1713,61, | 1713,62, | 1713,63, | 1713,64, | 1713,65, | 1713,66, | 1713,67, | 1713,68, | 1713,69, | 1713,70, | 1713,71, | 1713,72, | 1713,73, | 1713,74, | 1713,75, | 1713,76, | 1713,77, | 1713,78, | 1713,79, | 1713,80, | 1713,81, | 1713,82, | 1713,83, | 1713,84, | 1713,85, | 1714,1, | 1714,2, | 1714,3, | 1714,4, | 1714,5, | 1714,6, | 1714,7, | 1714,8, | 1714,9, | 1714,10, | 1714,11, | 1714,12, | 1714,13, | 1714,14, | 1714,15, | 1714,16, | 1714,17, | 1714,18, | 1714,19, | 1714,20, | 1714,21, | 1714,22, | 1714,23, | 1714,24, | 1714,25, | 1714,26, | 1714,27, | 1714,28, | 1714,29, | 1714,30, | 1714,31, | 1714,32, | 1714,33, | 1714,34, | 1714,35, | 1714,36, | 1714,37, | 1714,38, | 1714,39, | 1714,40, | 1714,41, | 1714,42, | 1714,43, | 1714,44, | 1714,45, | 1714,46, | 1714,47, | 1714,48, | 1714,49, | 1714,50, | 1714,51, | 1714,52, | 1714,53, | 1714,54, | 1714,55, | 1714,56, | 1714,57, | 1714,58, | 1714,59, | 1714,60, | 1714,61, | 1714,62, | 1714,63, | 1714,64, | 1714,65, | 1714,66, | 1714,67, | 1714,68, | 1714,69, | 1714,70, | 1714,71, | 1714,72, | 1714,73, | 1714,74, | 1714,75, | 1714,76, | 1714,77, | 1714,78, | 1714,79, | 1714,80, | 1714,81, | 1714,82, | 1714,83, | 1714,84, | 1714,85, | 1715,1, | 1715,2, | 1715,3, | 1715,4, | 1715,5, | 1715,6, | 1715,7, | 1715,8, | 1715,9, | 1715,10, | 1715,11, | 1715,12, | 1715,13, | 1715,14, | 1715,15, | 1715,16, | 1715,17, | 1715,18, | 1715,19, | 1715,20, | 1715,21, | 1715,22, | 1715,23, | 1715,24, | 1715,25, | 1715,26, | 1715,27, | 1715,28, | 1715,29, | 1715,30, | 1715,31, | 1715,32, | 1715,33, | 1715,34, | 1715,35, | 1715,36, | 1715,37, | 1715,38, | 1715,39, | 1715,40, | 1715,41, | 1715,42, | 1715,43, | 1715,44, | 1715,45, | 1715,46, | 1715,47, | 1715,48, | 1715,49, | 1715,50, | 1715,51, | 1715,52, | 1715,53, | 1715,54, | 1715,55, | 1715,56, | 1715,57, | 1715,58, | 1715,59, | 1715,60, | 1715,61, | 1715,62, | 1715,63, | 1715,64, | 1715,65, | 1715,66, | 1715,67, | 1715,68, | 1715,69, | 1715,70, | 1715,71, | 1715,72, | 1715,73, | 1715,74, | 1715,75, | 1715,76, | 1715,77, | 1715,78, | 1715,79, | 1715,80, | 1715,81, | 1715,82, | 1715,83, | 1715,84, | 1715,85, | 1716,1, | 1716,2, | 1716,3, | 1716,4, | 1716,5, | 1716,6, | 1716,7, | 1716,8, | 1716,9, | 1716,10, | 1716,11, | 1716,12, | 1716,13, | 1716,14, | 1716,15, | 1716,16, | 1716,17, | 1716,18, | 1716,19, | 1716,20, | 1716,21, | 1716,22, | 1716,23, | 1716,24, | 1716,25, | 1716,26, | 1716,27, | 1716,28, | 1716,29, | 1716,30, | 1716,31, | 1716,32, | 1716,33, | 1716,34, | 1716,35, | 1716,36, | 1716,37, | 1716,38, | 1716,39, | 1716,40, | 1716,41, | 1716,42, | 1716,43, | 1716,44, | 1716,45, | 1716,46, | 1716,47, | 1716,48, | 1716,49, | 1716,50, | 1716,51, | 1716,52, | 1716,53, | 1716,54, | 1716,55, | 1716,56, | 1716,57, | 1716,58, | 1716,59, | 1716,60, | 1716,61, | 1716,62, | 1716,63, | 1716,64, | 1716,65, | 1716,66, | 1716,67, | 1716,68, | 1716,69, | 1716,70, | 1716,71, | 1716,72, | 1716,73, | 1716,74, | 1716,75, | 1716,76, | 1716,77, | 1716,78, | 1716,79, | 1716,80, | 1716,81, | 1716,82, | 1716,83, | 1716,84, | 1716,85, | 1717,1, | 1717,2, | 1717,3, | 1717,4, | 1717,5, | 1717,6, | 1717,7, | 1717,8, | 1717,9, | 1717,10, | 1717,11, | 1717,12, | 1717,13, | 1717,14, | 1717,15, | 1717,16, | 1717,17, | 1717,18, | 1717,19, | 1717,20, | 1717,21, | 1717,22, | 1717,23, | 1717,24, | 1717,25, | 1717,26, | 1717,27, | 1717,28, | 1717,29, | 1717,30, | 1717,31, | 1717,32, | 1717,33, | 1717,34, | 1717,35, | 1717,36, | 1717,37, | 1717,38, | 1717,39, | 1717,40, | 1717,41, | 1717,42, | 1717,43, | 1717,44, | 1717,45, | 1717,46, | 1717,47, | 1717,48, | 1717,49, | 1717,50, | 1717,51, | 1717,52, | 1717,53, | 1717,54, | 1717,55, | 1717,56, | 1717,57, | 1717,58, | 1717,59, | 1717,60, | 1717,61, | 1717,62, | 1717,63, | 1717,64, | 1717,65, | 1717,66, | 1717,67, | 1717,68, | 1717,69, | 1717,70, | 1717,71, | 1717,72, | 1717,73, | 1717,74, | 1717,75, | 1717,76, | 1717,77, | 1717,78, | 1717,79, | 1717,80, | 1717,81, | 1717,82, | 1717,83, | 1717,84, | 1717,85, | 1718,1, | 1718,2, | 1718,3, | 1718,4, | 1718,5, | 1718,6, | 1718,7, | 1718,8, | 1718,9, | 1718,10, | 1718,11, | 1718,12, | 1718,13, | 1718,14, | 1718,15, | 1718,16, | 1718,17, | 1718,18, | 1718,19, | 1718,20, | 1718,21, | 1718,22, | 1718,23, | 1718,24, | 1718,25, | 1718,26, | 1718,27, | 1718,28, | 1718,29, | 1718,30, | 1718,31, | 1718,32, | 1718,33, | 1718,34, | 1718,35, | 1718,36, | 1718,37, | 1718,38, | 1718,39, | 1718,40, | 1718,41, | 1718,42, | 1718,43, | 1718,44, | 1718,45, | 1718,46, | 1718,47, | 1718,48, | 1718,49, | 1718,50, | 1718,51, | 1718,52, | 1718,53, | 1718,54, | 1718,55, | 1718,56, | 1718,57, | 1718,58, | 1718,59, | 1718,60, | 1718,61, | 1718,62, | 1718,63, | 1718,64, | 1718,65, | 1718,66, | 1718,67, | 1718,68, | 1718,69, | 1718,70, | 1718,71, | 1718,72, | 1718,73, | 1718,74, | 1718,75, | 1718,76, | 1718,77, | 1718,78, | 1718,79, | 1718,80, | 1718,81, | 1718,82, | 1718,83, | 1718,84, | 1718,85, | 1719,1, | 1719,2, | 1719,3, | 1719,4, | 1719,5, | 1719,6, | 1719,7, | 1719,8, | 1719,9, | 1719,10, | 1719,11, | 1719,12, | 1719,13, | 1719,14, | 1719,15, | 1719,16, | 1719,17, | 1719,18, | 1719,19, | 1719,20, | 1719,21, | 1719,22, | 1719,23, | 1719,24, | 1719,25, | 1719,26, | 1719,27, | 1719,28, | 1719,29, | 1719,30, | 1719,31, | 1719,32, | 1719,33, | 1719,34, | 1719,35, | 1719,36, | 1719,37, | 1719,38, | 1719,39, | 1719,40, | 1719,41, | 1719,42, | 1719,43, | 1719,44, | 1719,45, | 1719,46, | 1719,47, | 1719,48, | 1719,49, | 1719,50, | 1719,51, | 1719,52, | 1719,53, | 1719,54, | 1719,55, | 1719,56, | 1719,57, | 1719,58, | 1719,59, | 1719,60, | 1719,61, | 1719,62, | 1719,63, | 1719,64, | 1719,65, | 1719,66, | 1719,67, | 1719,68, | 1719,69, | 1719,70, | 1719,71, | 1719,72, | 1719,73, | 1719,74, | 1719,75, | 1719,76, | 1719,77, | 1719,78, | 1719,79, | 1719,80, | 1719,81, | 1719,82, | 1719,83, | 1719,84, | 1719,85, | 1720,1, | 1720,2, | 1720,3, | 1720,4, | 1720,5, | 1720,6, | 1720,7, | 1720,8, | 1720,9, | 1720,10, | 1720,11, | 1720,12, | 1720,13, | 1720,14, | 1720,15, | 1720,16, | 1720,17, | 1720,18, | 1720,19, | 1720,20, | 1720,21, | 1720,22, | 1720,23, | 1720,24, | 1720,25, | 1720,26, | 1720,27, | 1720,28, | 1720,29, | 1720,30, | 1720,31, | 1720,32, | 1720,33, | 1720,34, | 1720,35, | 1720,36, | 1720,37, | 1720,38, | 1720,39, | 1720,40, | 1720,41, | 1720,42, | 1720,43, | 1720,44, | 1720,45, | 1720,46, | 1720,47, | 1720,48, | 1720,49, | 1720,50, | 1720,51, | 1720,52, | 1720,53, | 1720,54, | 1720,55, | 1720,56, | 1720,57, | 1720,58, | 1720,59, | 1720,60, | 1720,61, | 1720,62, | 1720,63, | 1720,64, | 1720,65, | 1720,66, | 1720,67, | 1720,68, | 1720,69, | 1720,70, | 1720,71, | 1720,72, | 1720,73, | 1720,74, | 1720,75, | 1720,76, | 1720,77, | 1720,78, | 1720,79, | 1720,80, | 1720,81, | 1720,82, | 1720,83, | 1720,84, | 1720,85, | 1721,1, | 1721,2, | 1721,3, | 1721,4, | 1721,5, | 1721,6, | 1721,7, | 1721,8, | 1721,9, | 1721,10, | 1721,11, | 1721,12, | 1721,13, | 1721,14, | 1721,15, | 1721,16, | 1721,17, | 1721,18, | 1721,19, | 1721,20, | 1721,21, | 1721,22, | 1721,23, | 1721,24, | 1721,25, | 1721,26, | 1721,27, | 1721,28, | 1721,29, | 1721,30, | 1721,31, | 1721,32, | 1721,33, | 1721,34, | 1721,35, | 1721,36, | 1721,37, | 1721,38, | 1721,39, | 1721,40, | 1721,41, | 1721,42, | 1721,43, | 1721,44, | 1721,45, | 1721,46, | 1721,47, | 1721,48, | 1721,49, | 1721,50, | 1721,51, | 1721,52, | 1721,53, | 1721,54, | 1721,55, | 1721,56, | 1721,57, | 1721,58, | 1721,59, | 1721,60, | 1721,61, | 1721,62, | 1721,63, | 1721,64, | 1721,65, | 1721,66, | 1721,67, | 1721,68, | 1721,69, | 1721,70, | 1721,71, | 1721,72, | 1721,73, | 1721,74, | 1721,75, | 1721,76, | 1721,77, | 1721,78, | 1721,79, | 1721,80, | 1721,81, | 1721,82, | 1721,83, | 1721,84, | 1721,85, | 1722,1, | 1722,2, | 1722,3, | 1722,4, | 1722,5, | 1722,6, | 1722,7, | 1722,8, | 1722,9, | 1722,10, | 1722,11, | 1722,12, | 1722,13, | 1722,14, | 1722,15, | 1722,16, | 1722,17, | 1722,18, | 1722,19, | 1722,20, | 1722,21, | 1722,22, | 1722,23, | 1722,24, | 1722,25, | 1722,26, | 1722,27, | 1722,28, | 1722,29, | 1722,30, | 1722,31, | 1722,32, | 1722,33, | 1722,34, | 1722,35, | 1722,36, | 1722,37, | 1722,38, | 1722,39, | 1722,40, | 1722,41, | 1722,42, | 1722,43, | 1722,44, | 1722,45, | 1722,46, | 1722,47, | 1722,48, | 1722,49, | 1722,50, | 1722,51, | 1722,52, | 1722,53, | 1722,54, | 1722,55, | 1722,56, | 1722,57, | 1722,58, | 1722,59, | 1722,60, | 1722,61, | 1722,62, | 1722,63, | 1722,64, | 1722,65, | 1722,66, | 1722,67, | 1722,68, | 1722,69, | 1722,70, | 1722,71, | 1722,72, | 1722,73, | 1722,74, | 1722,75, | 1722,76, | 1722,77, | 1722,78, | 1722,79, | 1722,80, | 1722,81, | 1722,82, | 1722,83, | 1722,84, | 1722,85, | 1723,1, | 1723,2, | 1723,3, | 1723,4, | 1723,5, | 1723,6, | 1723,7, | 1723,8, | 1723,9, | 1723,10, | 1723,11, | 1723,12, | 1723,13, | 1723,14, | 1723,15, | 1723,16, | 1723,17, | 1723,18, | 1723,19, | 1723,20, | 1723,21, | 1723,22, | 1723,23, | 1723,24, | 1723,25, | 1723,26, | 1723,27, | 1723,28, | 1723,29, | 1723,30, | 1723,31, | 1723,32, | 1723,33, | 1723,34, | 1723,35, | 1723,36, | 1723,37, | 1723,38, | 1723,39, | 1723,40, | 1723,41, | 1723,42, | 1723,43, | 1723,44, | 1723,45, | 1723,46, | 1723,47, | 1723,48, | 1723,49, | 1723,50, | 1723,51, | 1723,52, | 1723,53, | 1723,54, | 1723,55, | 1723,56, | 1723,57, | 1723,58, | 1723,59, | 1723,60, | 1723,61, | 1723,62, | 1723,63, | 1723,64, | 1723,65, | 1723,66, | 1723,67, | 1723,68, | 1723,69, | 1723,70, | 1723,71, | 1723,72, | 1723,73, | 1723,74, | 1723,75, | 1723,76, | 1723,77, | 1723,78, | 1723,79, | 1723,80, | 1723,81, | 1723,82, | 1723,83, | 1723,84, | 1723,85, | 1724,1, | 1724,2, | 1724,3, | 1724,4, | 1724,5, | 1724,6, | 1724,7, | 1724,8, | 1724,9, | 1724,10, | 1724,11, | 1724,12, | 1724,13, | 1724,14, | 1724,15, | 1724,16, | 1724,17, | 1724,18, | 1724,19, | 1724,20, | 1724,21, | 1724,22, | 1724,23, | 1724,24, | 1724,25, | 1724,26, | 1724,27, | 1724,28, | 1724,29, | 1724,30, | 1724,31, | 1724,32, | 1724,33, | 1724,34, | 1724,35, | 1724,36, | 1724,37, | 1724,38, | 1724,39, | 1724,40, | 1724,41, | 1724,42, | 1724,43, | 1724,44, | 1724,45, | 1724,46, | 1724,47, | 1724,48, | 1724,49, | 1724,50, | 1724,51, | 1724,52, | 1724,53, | 1724,54, | 1724,55, | 1724,56, | 1724,57, | 1724,58, | 1724,59, | 1724,60, | 1724,61, | 1724,62, | 1724,63, | 1724,64, | 1724,65, | 1724,66, | 1724,67, | 1724,68, | 1724,69, | 1724,70, | 1724,71, | 1724,72, | 1724,73, | 1724,74, | 1724,75, | 1724,76, | 1724,77, | 1724,78, | 1724,79, | 1724,80, | 1724,81, | 1724,82, | 1724,83, | 1724,84, | 1724,85, | 1725,1, | 1725,2, | 1725,3, | 1725,4, | 1725,5, | 1725,6, | 1725,7, | 1725,8, | 1725,9, | 1725,10, | 1725,11, | 1725,12, | 1725,13, | 1725,14, | 1725,15, | 1725,16, | 1725,17, | 1725,18, | 1725,19, | 1725,20, | 1725,21, | 1725,22, | 1725,23, | 1725,24, | 1725,25, | 1725,26, | 1725,27, | 1725,28, | 1725,29, | 1725,30, | 1725,31, | 1725,32, | 1725,33, | 1725,34, | 1725,35, | 1725,36, | 1725,37, | 1725,38, | 1725,39, | 1725,40, | 1725,41, | 1725,42, | 1725,43, | 1725,44, | 1725,45, | 1725,46, | 1725,47, | 1725,48, | 1725,49, | 1725,50, | 1725,51, | 1725,52, | 1725,53, | 1725,54, | 1725,55, | 1725,56, | 1725,57, | 1725,58, | 1725,59, | 1725,60, | 1725,61, | 1725,62, | 1725,63, | 1725,64, | 1725,65, | 1725,66, | 1725,67, | 1725,68, | 1725,69, | 1725,70, | 1725,71, | 1725,72, | 1725,73, | 1725,74, | 1725,75, | 1725,76, | 1725,77, | 1725,78, | 1725,79, | 1725,80, | 1725,81, | 1725,82, | 1725,83, | 1725,84, | 1725,85, | 1726,1, | 1726,2, | 1726,3, | 1726,4, | 1726,5, | 1726,6, | 1726,7, | 1726,8, | 1726,9, | 1726,10, | 1726,11, | 1726,12, | 1726,13, | 1726,14, | 1726,15, | 1726,16, | 1726,17, | 1726,18, | 1726,19, | 1726,20, | 1726,21, | 1726,22, | 1726,23, | 1726,24, | 1726,25, | 1726,26, | 1726,27, | 1726,28, | 1726,29, | 1726,30, | 1726,31, | 1726,32, | 1726,33, | 1726,34, | 1726,35, | 1726,36, | 1726,37, | 1726,38, | 1726,39, | 1726,40, | 1726,41, | 1726,42, | 1726,43, | 1726,44, | 1726,45, | 1726,46, | 1726,47, | 1726,48, | 1726,49, | 1726,50, | 1726,51, | 1726,52, | 1726,53, | 1726,54, | 1726,55, | 1726,56, | 1726,57, | 1726,58, | 1726,59, | 1726,60, | 1726,61, | 1726,62, | 1726,63, | 1726,64, | 1726,65, | 1726,66, | 1726,67, | 1726,68, | 1726,69, | 1726,70, | 1726,71, | 1726,72, | 1726,73, | 1726,74, | 1726,75, | 1726,76, | 1726,77, | 1726,78, | 1726,79, | 1726,80, | 1726,81, | 1726,82, | 1726,83, | 1726,84, | 1726,85, | 1727,1, | 1727,2, | 1727,3, | 1727,4, | 1727,5, | 1727,6, | 1727,7, | 1727,8, | 1727,9, | 1727,10, | 1727,11, | 1727,12, | 1727,13, | 1727,14, | 1727,15, | 1727,16, | 1727,17, | 1727,18, | 1727,19, | 1727,20, | 1727,21, | 1727,22, | 1727,23, | 1727,24, | 1727,25, | 1727,26, | 1727,27, | 1727,28, | 1727,29, | 1727,30, | 1727,31, | 1727,32, | 1727,33, | 1727,34, | 1727,35, | 1727,36, | 1727,37, | 1727,38, | 1727,39, | 1727,40, | 1727,41, | 1727,42, | 1727,43, | 1727,44, | 1727,45, | 1727,46, | 1727,47, | 1727,48, | 1727,49, | 1727,50, | 1727,51, | 1727,52, | 1727,53, | 1727,54, | 1727,55, | 1727,56, | 1727,57, | 1727,58, | 1727,59, | 1727,60, | 1727,61, | 1727,62, | 1727,63, | 1727,64, | 1727,65, | 1727,66, | 1727,67, | 1727,68, | 1727,69, | 1727,70, | 1727,71, | 1727,72, | 1727,73, | 1727,74, | 1727,75, | 1727,76, | 1727,77, | 1727,78, | 1727,79, | 1727,80, | 1727,81, | 1727,82, | 1727,83, | 1727,84, | 1727,85, | 1728,1, | 1728,2, | 1728,3, | 1728,4, | 1728,5, | 1728,6, | 1728,7, | 1728,8, | 1728,9, | 1728,10, | 1728,11, | 1728,12, | 1728,13, | 1728,14, | 1728,15, | 1728,16, | 1728,17, | 1728,18, | 1728,19, | 1728,20, | 1728,21, | 1728,22, | 1728,23, | 1728,24, | 1728,25, | 1728,26, | 1728,27, | 1728,28, | 1728,29, | 1728,30, | 1728,31, | 1728,32, | 1728,33, | 1728,34, | 1728,35, | 1728,36, | 1728,37, | 1728,38, | 1728,39, | 1728,40, | 1728,41, | 1728,42, | 1728,43, | 1728,44, | 1728,45, | 1728,46, | 1728,47, | 1728,48, | 1728,49, | 1728,50, | 1728,51, | 1728,52, | 1728,53, | 1728,54, | 1728,55, | 1728,56, | 1728,57, | 1728,58, | 1728,59, | 1728,60, | 1728,61, | 1728,62, | 1728,63, | 1728,64, | 1728,65, | 1728,66, | 1728,67, | 1728,68, | 1728,69, | 1728,70, | 1728,71, | 1728,72, | 1728,73, | 1728,74, | 1728,75, | 1728,76, | 1728,77, | 1728,78, | 1728,79, | 1728,80, | 1728,81, | 1728,82, | 1728,83, | 1728,84, | 1728,85, | 1729,1, | 1729,2, | 1729,3, | 1729,4, | 1729,5, | 1729,6, | 1729,7, | 1729,8, | 1729,9, | 1729,10, | 1729,11, | 1729,12, | 1729,13, | 1729,14, | 1729,15, | 1729,16, | 1729,17, | 1729,18, | 1729,19, | 1729,20, | 1729,21, | 1729,22, | 1729,23, | 1729,24, | 1729,25, | 1729,26, | 1729,27, | 1729,28, | 1729,29, | 1729,30, | 1729,31, | 1729,32, | 1729,33, | 1729,34, | 1729,35, | 1729,36, | 1729,37, | 1729,38, | 1729,39, | 1729,40, | 1729,41, | 1729,42, | 1729,43, | 1729,44, | 1729,45, | 1729,46, | 1729,47, | 1729,48, | 1729,49, | 1729,50, | 1729,51, | 1729,52, | 1729,53, | 1729,54, | 1729,55, | 1729,56, | 1729,57, | 1729,58, | 1729,59, | 1729,60, | 1729,61, | 1729,62, | 1729,63, | 1729,64, | 1729,65, | 1729,66, | 1729,67, | 1729,68, | 1729,69, | 1729,70, | 1729,71, | 1729,72, | 1729,73, | 1729,74, | 1729,75, | 1729,76, | 1729,77, | 1729,78, | 1729,79, | 1729,80, | 1729,81, | 1729,82, | 1729,83, | 1729,84, | 1729,85, | 1730,1, | 1730,2, | 1730,3, | 1730,4, | 1730,5, | 1730,6, | 1730,7, | 1730,8, | 1730,9, | 1730,10, | 1730,11, | 1730,12, | 1730,13, | 1730,14, | 1730,15, | 1730,16, | 1730,17, | 1730,18, | 1730,19, | 1730,20, | 1730,21, | 1730,22, | 1730,23, | 1730,24, | 1730,25, | 1730,26, | 1730,27, | 1730,28, | 1730,29, | 1730,30, | 1730,31, | 1730,32, | 1730,33, | 1730,34, | 1730,35, | 1730,36, | 1730,37, | 1730,38, | 1730,39, | 1730,40, | 1730,41, | 1730,42, | 1730,43, | 1730,44, | 1730,45, | 1730,46, | 1730,47, | 1730,48, | 1730,49, | 1730,50, | 1730,51, | 1730,52, | 1730,53, | 1730,54, | 1730,55, | 1730,56, | 1730,57, | 1730,58, | 1730,59, | 1730,60, | 1730,61, | 1730,62, | 1730,63, | 1730,64, | 1730,65, | 1730,66, | 1730,67, | 1730,68, | 1730,69, | 1730,70, | 1730,71, | 1730,72, | 1730,73, | 1730,74, | 1730,75, | 1730,76, | 1730,77, | 1730,78, | 1730,79, | 1730,80, | 1730,81, | 1730,82, | 1730,83, | 1730,84, | 1730,85, | 1731,1, | 1731,2, | 1731,3, | 1731,4, | 1731,5, | 1731,6, | 1731,7, | 1731,8, | 1731,9, | 1731,10, | 1731,11, | 1731,12, | 1731,13, | 1731,14, | 1731,15, | 1731,16, | 1731,17, | 1731,18, | 1731,19, | 1731,20, | 1731,21, | 1731,22, | 1731,23, | 1731,24, | 1731,25, | 1731,26, | 1731,27, | 1731,28, | 1731,29, | 1731,30, | 1731,31, | 1731,32, | 1731,33, | 1731,34, | 1731,35, | 1731,36, | 1731,37, | 1731,38, | 1731,39, | 1731,40, | 1731,41, | 1731,42, | 1731,43, | 1731,44, | 1731,45, | 1731,46, | 1731,47, | 1731,48, | 1731,49, | 1731,50, | 1731,51, | 1731,52, | 1731,53, | 1731,54, | 1731,55, | 1731,56, | 1731,57, | 1731,58, | 1731,59, | 1731,60, | 1731,61, | 1731,62, | 1731,63, | 1731,64, | 1731,65, | 1731,66, | 1731,67, | 1731,68, | 1731,69, | 1731,70, | 1731,71, | 1731,72, | 1731,73, | 1731,74, | 1731,75, | 1731,76, | 1731,77, | 1731,78, | 1731,79, | 1731,80, | 1731,81, | 1731,82, | 1731,83, | 1731,84, | 1731,85, | 1732,1, | 1732,2, | 1732,3, | 1732,4, | 1732,5, | 1732,6, | 1732,7, | 1732,8, | 1732,9, | 1732,10, | 1732,11, | 1732,12, | 1732,13, | 1732,14, | 1732,15, | 1732,16, | 1732,17, | 1732,18, | 1732,19, | 1732,20, | 1732,21, | 1732,22, | 1732,23, | 1732,24, | 1732,25, | 1732,26, | 1732,27, | 1732,28, | 1732,29, | 1732,30, | 1732,31, | 1732,32, | 1732,33, | 1732,34, | 1732,35, | 1732,36, | 1732,37, | 1732,38, | 1732,39, | 1732,40, | 1732,41, | 1732,42, | 1732,43, | 1732,44, | 1732,45, | 1732,46, | 1732,47, | 1732,48, | 1732,49, | 1732,50, | 1732,51, | 1732,52, | 1732,53, | 1732,54, | 1732,55, | 1732,56, | 1732,57, | 1732,58, | 1732,59, | 1732,60, | 1732,61, | 1732,62, | 1732,63, | 1732,64, | 1732,65, | 1732,66, | 1732,67, | 1732,68, | 1732,69, | 1732,70, | 1732,71, | 1732,72, | 1732,73, | 1732,74, | 1732,75, | 1732,76, | 1732,77, | 1732,78, | 1732,79, | 1732,80, | 1732,81, | 1732,82, | 1732,83, | 1732,84, | 1732,85, | 1733,1, | 1733,2, | 1733,3, | 1733,4, | 1733,5, | 1733,6, | 1733,7, | 1733,8, | 1733,9, | 1733,10, | 1733,11, | 1733,12, | 1733,13, | 1733,14, | 1733,15, | 1733,16, | 1733,17, | 1733,18, | 1733,19, | 1733,20, | 1733,21, | 1733,22, | 1733,23, | 1733,24, | 1733,25, | 1733,26, | 1733,27, | 1733,28, | 1733,29, | 1733,30, | 1733,31, | 1733,32, | 1733,33, | 1733,34, | 1733,35, | 1733,36, | 1733,37, | 1733,38, | 1733,39, | 1733,40, | 1733,41, | 1733,42, | 1733,43, | 1733,44, | 1733,45, | 1733,46, | 1733,47, | 1733,48, | 1733,49, | 1733,50, | 1733,51, | 1733,52, | 1733,53, | 1733,54, | 1733,55, | 1733,56, | 1733,57, | 1733,58, | 1733,59, | 1733,60, | 1733,61, | 1733,62, | 1733,63, | 1733,64, | 1733,65, | 1733,66, | 1733,67, | 1733,68, | 1733,69, | 1733,70, | 1733,71, | 1733,72, | 1733,73, | 1733,74, | 1733,75, | 1733,76, | 1733,77, | 1733,78, | 1733,79, | 1733,80, | 1733,81, | 1733,82, | 1733,83, | 1733,84, | 1733,85, | 1734,1, | 1734,2, | 1734,3, | 1734,4, | 1734,5, | 1734,6, | 1734,7, | 1734,8, | 1734,9, | 1734,10, | 1734,11, | 1734,12, | 1734,13, | 1734,14, | 1734,15, | 1734,16, | 1734,17, | 1734,18, | 1734,19, | 1734,20, | 1734,21, | 1734,22, | 1734,23, | 1734,24, | 1734,25, | 1734,26, | 1734,27, | 1734,28, | 1734,29, | 1734,30, | 1734,31, | 1734,32, | 1734,33, | 1734,34, | 1734,35, | 1734,36, | 1734,37, | 1734,38, | 1734,39, | 1734,40, | 1734,41, | 1734,42, | 1734,43, | 1734,44, | 1734,45, | 1734,46, | 1734,47, | 1734,48, | 1734,49, | 1734,50, | 1734,51, | 1734,52, | 1734,53, | 1734,54, | 1734,55, | 1734,56, | 1734,57, | 1734,58, | 1734,59, | 1734,60, | 1734,61, | 1734,62, | 1734,63, | 1734,64, | 1734,65, | 1734,66, | 1734,67, | 1734,68, | 1734,69, | 1734,70, | 1734,71, | 1734,72, | 1734,73, | 1734,74, | 1734,75, | 1734,76, | 1734,77, | 1734,78, | 1734,79, | 1734,80, | 1734,81, | 1734,82, | 1734,83, | 1734,84, | 1734,85, | 1735,1, | 1735,2, | 1735,3, | 1735,4, | 1735,5, | 1735,6, | 1735,7, | 1735,8, | 1735,9, | 1735,10, | 1735,11, | 1735,12, | 1735,13, | 1735,14, | 1735,15, | 1735,16, | 1735,17, | 1735,18, | 1735,19, | 1735,20, | 1735,21, | 1735,22, | 1735,23, | 1735,24, | 1735,25, | 1735,26, | 1735,27, | 1735,28, | 1735,29, | 1735,30, | 1735,31, | 1735,32, | 1735,33, | 1735,34, | 1735,35, | 1735,36, | 1735,37, | 1735,38, | 1735,39, | 1735,40, | 1735,41, | 1735,42, | 1735,43, | 1735,44, | 1735,45, | 1735,46, | 1735,47, | 1735,48, | 1735,49, | 1735,50, | 1735,51, | 1735,52, | 1735,53, | 1735,54, | 1735,55, | 1735,56, | 1735,57, | 1735,58, | 1735,59, | 1735,60, | 1735,61, | 1735,62, | 1735,63, | 1735,64, | 1735,65, | 1735,66, | 1735,67, | 1735,68, | 1735,69, | 1735,70, | 1735,71, | 1735,72, | 1735,73, | 1735,74, | 1735,75, | 1735,76, | 1735,77, | 1735,78, | 1735,79, | 1735,80, | 1735,81, | 1735,82, | 1735,83, | 1735,84, | 1735,85, | 1736,1, | 1736,2, | 1736,3, | 1736,4, | 1736,5, | 1736,6, | 1736,7, | 1736,8, | 1736,9, | 1736,10, | 1736,11, | 1736,12, | 1736,13, | 1736,14, | 1736,15, | 1736,16, | 1736,17, | 1736,18, | 1736,19, | 1736,20, | 1736,21, | 1736,22, | 1736,23, | 1736,24, | 1736,25, | 1736,26, | 1736,27, | 1736,28, | 1736,29, | 1736,30, | 1736,31, | 1736,32, | 1736,33, | 1736,34, | 1736,35, | 1736,36, | 1736,37, | 1736,38, | 1736,39, | 1736,40, | 1736,41, | 1736,42, | 1736,43, | 1736,44, | 1736,45, | 1736,46, | 1736,47, | 1736,48, | 1736,49, | 1736,50, | 1736,51, | 1736,52, | 1736,53, | 1736,54, | 1736,55, | 1736,56, | 1736,57, | 1736,58, | 1736,59, | 1736,60, | 1736,61, | 1736,62, | 1736,63, | 1736,64, | 1736,65, | 1736,66, | 1736,67, | 1736,68, | 1736,69, | 1736,70, | 1736,71, | 1736,72, | 1736,73, | 1736,74, | 1736,75, | 1736,76, | 1736,77, | 1736,78, | 1736,79, | 1736,80, | 1736,81, | 1736,82, | 1736,83, | 1736,84, | 1736,85, | 1737,1, | 1737,2, | 1737,3, | 1737,4, | 1737,5, | 1737,6, | 1737,7, | 1737,8, | 1737,9, | 1737,10, | 1737,11, | 1737,12, | 1737,13, | 1737,14, | 1737,15, | 1737,16, | 1737,17, | 1737,18, | 1737,19, | 1737,20, | 1737,21, | 1737,22, | 1737,23, | 1737,24, | 1737,25, | 1737,26, | 1737,27, | 1737,28, | 1737,29, | 1737,30, | 1737,31, | 1737,32, | 1737,33, | 1737,34, | 1737,35, | 1737,36, | 1737,37, | 1737,38, | 1737,39, | 1737,40, | 1737,41, | 1737,42, | 1737,43, | 1737,44, | 1737,45, | 1737,46, | 1737,47, | 1737,48, | 1737,49, | 1737,50, | 1737,51, | 1737,52, | 1737,53, | 1737,54, | 1737,55, | 1737,56, | 1737,57, | 1737,58, | 1737,59, | 1737,60, | 1737,61, | 1737,62, | 1737,63, | 1737,64, | 1737,65, | 1737,66, | 1737,67, | 1737,68, | 1737,69, | 1737,70, | 1737,71, | 1737,72, | 1737,73, | 1737,74, | 1737,75, | 1737,76, | 1737,77, | 1737,78, | 1737,79, | 1737,80, | 1737,81, | 1737,82, | 1737,83, | 1737,84, | 1737,85, | 1738,1, | 1738,2, | 1738,3, | 1738,4, | 1738,5, | 1738,6, | 1738,7, | 1738,8, | 1738,9, | 1738,10, | 1738,11, | 1738,12, | 1738,13, | 1738,14, | 1738,15, | 1738,16, | 1738,17, | 1738,18, | 1738,19, | 1738,20, | 1738,21, | 1738,22, | 1738,23, | 1738,24, | 1738,25, | 1738,26, | 1738,27, | 1738,28, | 1738,29, | 1738,30, | 1738,31, | 1738,32, | 1738,33, | 1738,34, | 1738,35, | 1738,36, | 1738,37, | 1738,38, | 1738,39, | 1738,40, | 1738,41, | 1738,42, | 1738,43, | 1738,44, | 1738,45, | 1738,46, | 1738,47, | 1738,48, | 1738,49, | 1738,50, | 1738,51, | 1738,52, | 1738,53, | 1738,54, | 1738,55, | 1738,56, | 1738,57, | 1738,58, | 1738,59, | 1738,60, | 1738,61, | 1738,62, | 1738,63, | 1738,64, | 1738,65, | 1738,66, | 1738,67, | 1738,68, | 1738,69, | 1738,70, | 1738,71, | 1738,72, | 1738,73, | 1738,74, | 1738,75, | 1738,76, | 1738,77, | 1738,78, | 1738,79, | 1738,80, | 1738,81, | 1738,82, | 1738,83, | 1738,84, | 1738,85, | 1739,1, | 1739,2, | 1739,3, | 1739,4, | 1739,5, | 1739,6, | 1739,7, | 1739,8, | 1739,9, | 1739,10, | 1739,11, | 1739,12, | 1739,13, | 1739,14, | 1739,15, | 1739,16, | 1739,17, | 1739,18, | 1739,19, | 1739,20, | 1739,21, | 1739,22, | 1739,23, | 1739,24, | 1739,25, | 1739,26, | 1739,27, | 1739,28, | 1739,29, | 1739,30, | 1739,31, | 1739,32, | 1739,33, | 1739,34, | 1739,35, | 1739,36, | 1739,37, | 1739,38, | 1739,39, | 1739,40, | 1739,41, | 1739,42, | 1739,43, | 1739,44, | 1739,45, | 1739,46, | 1739,47, | 1739,48, | 1739,49, | 1739,50, | 1739,51, | 1739,52, | 1739,53, | 1739,54, | 1739,55, | 1739,56, | 1739,57, | 1739,58, | 1739,59, | 1739,60, | 1739,61, | 1739,62, | 1739,63, | 1739,64, | 1739,65, | 1739,66, | 1739,67, | 1739,68, | 1739,69, | 1739,70, | 1739,71, | 1739,72, | 1739,73, | 1739,74, | 1739,75, | 1739,76, | 1739,77, | 1739,78, | 1739,79, | 1739,80, | 1739,81, | 1739,82, | 1739,83, | 1739,84, | 1739,85, | 1740,1, | 1740,2, | 1740,3, | 1740,4, | 1740,5, | 1740,6, | 1740,7, | 1740,8, | 1740,9, | 1740,10, | 1740,11, | 1740,12, | 1740,13, | 1740,14, | 1740,15, | 1740,16, | 1740,17, | 1740,18, | 1740,19, | 1740,20, | 1740,21, | 1740,22, | 1740,23, | 1740,24, | 1740,25, | 1740,26, | 1740,27, | 1740,28, | 1740,29, | 1740,30, | 1740,31, | 1740,32, | 1740,33, | 1740,34, | 1740,35, | 1740,36, | 1740,37, | 1740,38, | 1740,39, | 1740,40, | 1740,41, | 1740,42, | 1740,43, | 1740,44, | 1740,45, | 1740,46, | 1740,47, | 1740,48, | 1740,49, | 1740,50, | 1740,51, | 1740,52, | 1740,53, | 1740,54, | 1740,55, | 1740,56, | 1740,57, | 1740,58, | 1740,59, | 1740,60, | 1740,61, | 1740,62, | 1740,63, | 1740,64, | 1740,65, | 1740,66, | 1740,67, | 1740,68, | 1740,69, | 1740,70, | 1740,71, | 1740,72, | 1740,73, | 1740,74, | 1740,75, | 1740,76, | 1740,77, | 1740,78, | 1740,79, | 1740,80, | 1740,81, | 1740,82, | 1740,83, | 1740,84, | 1740,85, | 1741,1, | 1741,2, | 1741,3, | 1741,4, | 1741,5, | 1741,6, | 1741,7, | 1741,8, | 1741,9, | 1741,10, | 1741,11, | 1741,12, | 1741,13, | 1741,14, | 1741,15, | 1741,16, | 1741,17, | 1741,18, | 1741,19, | 1741,20, | 1741,21, | 1741,22, | 1741,23, | 1741,24, | 1741,25, | 1741,26, | 1741,27, | 1741,28, | 1741,29, | 1741,30, | 1741,31, | 1741,32, | 1741,33, | 1741,34, | 1741,35, | 1741,36, | 1741,37, | 1741,38, | 1741,39, | 1741,40, | 1741,41, | 1741,42, | 1741,43, | 1741,44, | 1741,45, | 1741,46, | 1741,47, | 1741,48, | 1741,49, | 1741,50, | 1741,51, | 1741,52, | 1741,53, | 1741,54, | 1741,55, | 1741,56, | 1741,57, | 1741,58, | 1741,59, | 1741,60, | 1741,61, | 1741,62, | 1741,63, | 1741,64, | 1741,65, | 1741,66, | 1741,67, | 1741,68, | 1741,69, | 1741,70, | 1741,71, | 1741,72, | 1741,73, | 1741,74, | 1741,75, | 1741,76, | 1741,77, | 1741,78, | 1741,79, | 1741,80, | 1741,81, | 1741,82, | 1741,83, | 1741,84, | 1741,85, | 1742,1, | 1742,2, | 1742,3, | 1742,4, | 1742,5, | 1742,6, | 1742,7, | 1742,8, | 1742,9, | 1742,10, | 1742,11, | 1742,12, | 1742,13, | 1742,14, | 1742,15, | 1742,16, | 1742,17, | 1742,18, | 1742,19, | 1742,20, | 1742,21, | 1742,22, | 1742,23, | 1742,24, | 1742,25, | 1742,26, | 1742,27, | 1742,28, | 1742,29, | 1742,30, | 1742,31, | 1742,32, | 1742,33, | 1742,34, | 1742,35, | 1742,36, | 1742,37, | 1742,38, | 1742,39, | 1742,40, | 1742,41, | 1742,42, | 1742,43, | 1742,44, | 1742,45, | 1742,46, | 1742,47, | 1742,48, | 1742,49, | 1742,50, | 1742,51, | 1742,52, | 1742,53, | 1742,54, | 1742,55, | 1742,56, | 1742,57, | 1742,58, | 1742,59, | 1742,60, | 1742,61, | 1742,62, | 1742,63, | 1742,64, | 1742,65, | 1742,66, | 1742,67, | 1742,68, | 1742,69, | 1742,70, | 1742,71, | 1742,72, | 1742,73, | 1742,74, | 1742,75, | 1742,76, | 1742,77, | 1742,78, | 1742,79, | 1742,80, | 1742,81, | 1742,82, | 1742,83, | 1742,84, | 1742,85, | 1743,1, | 1743,2, | 1743,3, | 1743,4, | 1743,5, | 1743,6, | 1743,7, | 1743,8, | 1743,9, | 1743,10, | 1743,11, | 1743,12, | 1743,13, | 1743,14, | 1743,15, | 1743,16, | 1743,17, | 1743,18, | 1743,19, | 1743,20, | 1743,21, | 1743,22, | 1743,23, | 1743,24, | 1743,25, | 1743,26, | 1743,27, | 1743,28, | 1743,29, | 1743,30, | 1743,31, | 1743,32, | 1743,33, | 1743,34, | 1743,35, | 1743,36, | 1743,37, | 1743,38, | 1743,39, | 1743,40, | 1743,41, | 1743,42, | 1743,43, | 1743,44, | 1743,45, | 1743,46, | 1743,47, | 1743,48, | 1743,49, | 1743,50, | 1743,51, | 1743,52, | 1743,53, | 1743,54, | 1743,55, | 1743,56, | 1743,57, | 1743,58, | 1743,59, | 1743,60, | 1743,61, | 1743,62, | 1743,63, | 1743,64, | 1743,65, | 1743,66, | 1743,67, | 1743,68, | 1743,69, | 1743,70, | 1743,71, | 1743,72, | 1743,73, | 1743,74, | 1743,75, | 1743,76, | 1743,77, | 1743,78, | 1743,79, | 1743,80, | 1743,81, | 1743,82, | 1743,83, | 1743,84, | 1743,85, | 1744,1, | 1744,2, | 1744,3, | 1744,4, | 1744,5, | 1744,6, | 1744,7, | 1744,8, | 1744,9, | 1744,10, | 1744,11, | 1744,12, | 1744,13, | 1744,14, | 1744,15, | 1744,16, | 1744,17, | 1744,18, | 1744,19, | 1744,20, | 1744,21, | 1744,22, | 1744,23, | 1744,24, | 1744,25, | 1744,26, | 1744,27, | 1744,28, | 1744,29, | 1744,30, | 1744,31, | 1744,32, | 1744,33, | 1744,34, | 1744,35, | 1744,36, | 1744,37, | 1744,38, | 1744,39, | 1744,40, | 1744,41, | 1744,42, | 1744,43, | 1744,44, | 1744,45, | 1744,46, | 1744,47, | 1744,48, | 1744,49, | 1744,50, | 1744,51, | 1744,52, | 1744,53, | 1744,54, | 1744,55, | 1744,56, | 1744,57, | 1744,58, | 1744,59, | 1744,60, | 1744,61, | 1744,62, | 1744,63, | 1744,64, | 1744,65, | 1744,66, | 1744,67, | 1744,68, | 1744,69, | 1744,70, | 1744,71, | 1744,72, | 1744,73, | 1744,74, | 1744,75, | 1744,76, | 1744,77, | 1744,78, | 1744,79, | 1744,80, | 1744,81, | 1744,82, | 1744,83, | 1744,84, | 1744,85, | 1745,1, | 1745,2, | 1745,3, | 1745,4, | 1745,5, | 1745,6, | 1745,7, | 1745,8, | 1745,9, | 1745,10, | 1745,11, | 1745,12, | 1745,13, | 1745,14, | 1745,15, | 1745,16, | 1745,17, | 1745,18, | 1745,19, | 1745,20, | 1745,21, | 1745,22, | 1745,23, | 1745,24, | 1745,25, | 1745,26, | 1745,27, | 1745,28, | 1745,29, | 1745,30, | 1745,31, | 1745,32, | 1745,33, | 1745,34, | 1745,35, | 1745,36, | 1745,37, | 1745,38, | 1745,39, | 1745,40, | 1745,41, | 1745,42, | 1745,43, | 1745,44, | 1745,45, | 1745,46, | 1745,47, | 1745,48, | 1745,49, | 1745,50, | 1745,51, | 1745,52, | 1745,53, | 1745,54, | 1745,55, | 1745,56, | 1745,57, | 1745,58, | 1745,59, | 1745,60, | 1745,61, | 1745,62, | 1745,63, | 1745,64, | 1745,65, | 1745,66, | 1745,67, | 1745,68, | 1745,69, | 1745,70, | 1745,71, | 1745,72, | 1745,73, | 1745,74, | 1745,75, | 1745,76, | 1745,77, | 1745,78, | 1745,79, | 1745,80, | 1745,81, | 1745,82, | 1745,83, | 1745,84, | 1745,85, | 1746,1, | 1746,2, | 1746,3, | 1746,4, | 1746,5, | 1746,6, | 1746,7, | 1746,8, | 1746,9, | 1746,10, | 1746,11, | 1746,12, | 1746,13, | 1746,14, | 1746,15, | 1746,16, | 1746,17, | 1746,18, | 1746,19, | 1746,20, | 1746,21, | 1746,22, | 1746,23, | 1746,24, | 1746,25, | 1746,26, | 1746,27, | 1746,28, | 1746,29, | 1746,30, | 1746,31, | 1746,32, | 1746,33, | 1746,34, | 1746,35, | 1746,36, | 1746,37, | 1746,38, | 1746,39, | 1746,40, | 1746,41, | 1746,42, | 1746,43, | 1746,44, | 1746,45, | 1746,46, | 1746,47, | 1746,48, | 1746,49, | 1746,50, | 1746,51, | 1746,52, | 1746,53, | 1746,54, | 1746,55, | 1746,56, | 1746,57, | 1746,58, | 1746,59, | 1746,60, | 1746,61, | 1746,62, | 1746,63, | 1746,64, | 1746,65, | 1746,66, | 1746,67, | 1746,68, | 1746,69, | 1746,70, | 1746,71, | 1746,72, | 1746,73, | 1746,74, | 1746,75, | 1746,76, | 1746,77, | 1746,78, | 1746,79, | 1746,80, | 1746,81, | 1746,82, | 1746,83, | 1746,84, | 1746,85, | 1747,1, | 1747,2, | 1747,3, | 1747,4, | 1747,5, | 1747,6, | 1747,7, | 1747,8, | 1747,9, | 1747,10, | 1747,11, | 1747,12, | 1747,13, | 1747,14, | 1747,15, | 1747,16, | 1747,17, | 1747,18, | 1747,19, | 1747,20, | 1747,21, | 1747,22, | 1747,23, | 1747,24, | 1747,25, | 1747,26, | 1747,27, | 1747,28, | 1747,29, | 1747,30, | 1747,31, | 1747,32, | 1747,33, | 1747,34, | 1747,35, | 1747,36, | 1747,37, | 1747,38, | 1747,39, | 1747,40, | 1747,41, | 1747,42, | 1747,43, | 1747,44, | 1747,45, | 1747,46, | 1747,47, | 1747,48, | 1747,49, | 1747,50, | 1747,51, | 1747,52, | 1747,53, | 1747,54, | 1747,55, | 1747,56, | 1747,57, | 1747,58, | 1747,59, | 1747,60, | 1747,61, | 1747,62, | 1747,63, | 1747,64, | 1747,65, | 1747,66, | 1747,67, | 1747,68, | 1747,69, | 1747,70, | 1747,71, | 1747,72, | 1747,73, | 1747,74, | 1747,75, | 1747,76, | 1747,77, | 1747,78, | 1747,79, | 1747,80, | 1747,81, | 1747,82, | 1747,83, | 1747,84, | 1747,85, | 1748,1, | 1748,2, | 1748,3, | 1748,4, | 1748,5, | 1748,6, | 1748,7, | 1748,8, | 1748,9, | 1748,10, | 1748,11, | 1748,12, | 1748,13, | 1748,14, | 1748,15, | 1748,16, | 1748,17, | 1748,18, | 1748,19, | 1748,20, | 1748,21, | 1748,22, | 1748,23, | 1748,24, | 1748,25, | 1748,26, | 1748,27, | 1748,28, | 1748,29, | 1748,30, | 1748,31, | 1748,32, | 1748,33, | 1748,34, | 1748,35, | 1748,36, | 1748,37, | 1748,38, | 1748,39, | 1748,40, | 1748,41, | 1748,42, | 1748,43, | 1748,44, | 1748,45, | 1748,46, | 1748,47, | 1748,48, | 1748,49, | 1748,50, | 1748,51, | 1748,52, | 1748,53, | 1748,54, | 1748,55, | 1748,56, | 1748,57, | 1748,58, | 1748,59, | 1748,60, | 1748,61, | 1748,62, | 1748,63, | 1748,64, | 1748,65, | 1748,66, | 1748,67, | 1748,68, | 1748,69, | 1748,70, | 1748,71, | 1748,72, | 1748,73, | 1748,74, | 1748,75, | 1748,76, | 1748,77, | 1748,78, | 1748,79, | 1748,80, | 1748,81, | 1748,82, | 1748,83, | 1748,84, | 1748,85, | 1749,1, | 1749,2, | 1749,3, | 1749,4, | 1749,5, | 1749,6, | 1749,7, | 1749,8, | 1749,9, | 1749,10, | 1749,11, | 1749,12, | 1749,13, | 1749,14, | 1749,15, | 1749,16, | 1749,17, | 1749,18, | 1749,19, | 1749,20, | 1749,21, | 1749,22, | 1749,23, | 1749,24, | 1749,25, | 1749,26, | 1749,27, | 1749,28, | 1749,29, | 1749,30, | 1749,31, | 1749,32, | 1749,33, | 1749,34, | 1749,35, | 1749,36, | 1749,37, | 1749,38, | 1749,39, | 1749,40, | 1749,41, | 1749,42, | 1749,43, | 1749,44, | 1749,45, | 1749,46, | 1749,47, | 1749,48, | 1749,49, | 1749,50, | 1749,51, | 1749,52, | 1749,53, | 1749,54, | 1749,55, | 1749,56, | 1749,57, | 1749,58, | 1749,59, | 1749,60, | 1749,61, | 1749,62, | 1749,63, | 1749,64, | 1749,65, | 1749,66, | 1749,67, | 1749,68, | 1749,69, | 1749,70, | 1749,71, | 1749,72, | 1749,73, | 1749,74, | 1749,75, | 1749,76, | 1749,77, | 1749,78, | 1749,79, | 1749,80, | 1749,81, | 1749,82, | 1749,83, | 1749,84, | 1749,85, | 1750,1, | 1750,2, | 1750,3, | 1750,4, | 1750,5, | 1750,6, | 1750,7, | 1750,8, | 1750,9, | 1750,10, | 1750,11, | 1750,12, | 1750,13, | 1750,14, | 1750,15, | 1750,16, | 1750,17, | 1750,18, | 1750,19, | 1750,20, | 1750,21, | 1750,22, | 1750,23, | 1750,24, | 1750,25, | 1750,26, | 1750,27, | 1750,28, | 1750,29, | 1750,30, | 1750,31, | 1750,32, | 1750,33, | 1750,34, | 1750,35, | 1750,36, | 1750,37, | 1750,38, | 1750,39, | 1750,40, | 1750,41, | 1750,42, | 1750,43, | 1750,44, | 1750,45, | 1750,46, | 1750,47, | 1750,48, | 1750,49, | 1750,50, | 1750,51, | 1750,52, | 1750,53, | 1750,54, | 1750,55, | 1750,56, | 1750,57, | 1750,58, | 1750,59, | 1750,60, | 1750,61, | 1750,62, | 1750,63, | 1750,64, | 1750,65, | 1750,66, | 1750,67, | 1750,68, | 1750,69, | 1750,70, | 1750,71, | 1750,72, | 1750,73, | 1750,74, | 1750,75, | 1750,76, | 1750,77, | 1750,78, | 1750,79, | 1750,80, | 1750,81, | 1750,82, | 1750,83, | 1750,84, | 1750,85, | 1751,1, | 1751,2, | 1751,3, | 1751,4, | 1751,5, | 1751,6, | 1751,7, | 1751,8, | 1751,9, | 1751,10, | 1751,11, | 1751,12, | 1751,13, | 1751,14, | 1751,15, | 1751,16, | 1751,17, | 1751,18, | 1751,19, | 1751,20, | 1751,21, | 1751,22, | 1751,23, | 1751,24, | 1751,25, | 1751,26, | 1751,27, | 1751,28, | 1751,29, | 1751,30, | 1751,31, | 1751,32, | 1751,33, | 1751,34, | 1751,35, | 1751,36, | 1751,37, | 1751,38, | 1751,39, | 1751,40, | 1751,41, | 1751,42, | 1751,43, | 1751,44, | 1751,45, | 1751,46, | 1751,47, | 1751,48, | 1751,49, | 1751,50, | 1751,51, | 1751,52, | 1751,53, | 1751,54, | 1751,55, | 1751,56, | 1751,57, | 1751,58, | 1751,59, | 1751,60, | 1751,61, | 1751,62, | 1751,63, | 1751,64, | 1751,65, | 1751,66, | 1751,67, | 1751,68, | 1751,69, | 1751,70, | 1751,71, | 1751,72, | 1751,73, | 1751,74, | 1751,75, | 1751,76, | 1751,77, | 1751,78, | 1751,79, | 1751,80, | 1751,81, | 1751,82, | 1751,83, | 1751,84, | 1751,85, | 1752,1, | 1752,2, | 1752,3, | 1752,4, | 1752,5, | 1752,6, | 1752,7, | 1752,8, | 1752,9, | 1752,10, | 1752,11, | 1752,12, | 1752,13, | 1752,14, | 1752,15, | 1752,16, | 1752,17, | 1752,18, | 1752,19, | 1752,20, | 1752,21, | 1752,22, | 1752,23, | 1752,24, | 1752,25, | 1752,26, | 1752,27, | 1752,28, | 1752,29, | 1752,30, | 1752,31, | 1752,32, | 1752,33, | 1752,34, | 1752,35, | 1752,36, | 1752,37, | 1752,38, | 1752,39, | 1752,40, | 1752,41, | 1752,42, | 1752,43, | 1752,44, | 1752,45, | 1752,46, | 1752,47, | 1752,48, | 1752,49, | 1752,50, | 1752,51, | 1752,52, | 1752,53, | 1752,54, | 1752,55, | 1752,56, | 1752,57, | 1752,58, | 1752,59, | 1752,60, | 1752,61, | 1752,62, | 1752,63, | 1752,64, | 1752,65, | 1752,66, | 1752,67, | 1752,68, | 1752,69, | 1752,70, | 1752,71, | 1752,72, | 1752,73, | 1752,74, | 1752,75, | 1752,76, | 1752,77, | 1752,78, | 1752,79, | 1752,80, | 1752,81, | 1752,82, | 1752,83, | 1752,84, | 1752,85, | 1753,1, | 1753,2, | 1753,3, | 1753,4, | 1753,5, | 1753,6, | 1753,7, | 1753,8, | 1753,9, | 1753,10, | 1753,11, | 1753,12, | 1753,13, | 1753,14, | 1753,15, | 1753,16, | 1753,17, | 1753,18, | 1753,19, | 1753,20, | 1753,21, | 1753,22, | 1753,23, | 1753,24, | 1753,25, | 1753,26, | 1753,27, | 1753,28, | 1753,29, | 1753,30, | 1753,31, | 1753,32, | 1753,33, | 1753,34, | 1753,35, | 1753,36, | 1753,37, | 1753,38, | 1753,39, | 1753,40, | 1753,41, | 1753,42, | 1753,43, | 1753,44, | 1753,45, | 1753,46, | 1753,47, | 1753,48, | 1753,49, | 1753,50, | 1753,51, | 1753,52, | 1753,53, | 1753,54, | 1753,55, | 1753,56, | 1753,57, | 1753,58, | 1753,59, | 1753,60, | 1753,61, | 1753,62, | 1753,63, | 1753,64, | 1753,65, | 1753,66, | 1753,67, | 1753,68, | 1753,69, | 1753,70, | 1753,71, | 1753,72, | 1753,73, | 1753,74, | 1753,75, | 1753,76, | 1753,77, | 1753,78, | 1753,79, | 1753,80, | 1753,81, | 1753,82, | 1753,83, | 1753,84, | 1753,85, | 1754,1, | 1754,2, | 1754,3, | 1754,4, | 1754,5, | 1754,6, | 1754,7, | 1754,8, | 1754,9, | 1754,10, | 1754,11, | 1754,12, | 1754,13, | 1754,14, | 1754,15, | 1754,16, | 1754,17, | 1754,18, | 1754,19, | 1754,20, | 1754,21, | 1754,22, | 1754,23, | 1754,24, | 1754,25, | 1754,26, | 1754,27, | 1754,28, | 1754,29, | 1754,30, | 1754,31, | 1754,32, | 1754,33, | 1754,34, | 1754,35, | 1754,36, | 1754,37, | 1754,38, | 1754,39, | 1754,40, | 1754,41, | 1754,42, | 1754,43, | 1754,44, | 1754,45, | 1754,46, | 1754,47, | 1754,48, | 1754,49, | 1754,50, | 1754,51, | 1754,52, | 1754,53, | 1754,54, | 1754,55, | 1754,56, | 1754,57, | 1754,58, | 1754,59, | 1754,60, | 1754,61, | 1754,62, | 1754,63, | 1754,64, | 1754,65, | 1754,66, | 1754,67, | 1754,68, | 1754,69, | 1754,70, | 1754,71, | 1754,72, | 1754,73, | 1754,74, | 1754,75, | 1754,76, | 1754,77, | 1754,78, | 1754,79, | 1754,80, | 1754,81, | 1754,82, | 1754,83, | 1754,84, | 1754,85, | 1755,1, | 1755,2, | 1755,3, | 1755,4, | 1755,5, | 1755,6, | 1755,7, | 1755,8, | 1755,9, | 1755,10, | 1755,11, | 1755,12, | 1755,13, | 1755,14, | 1755,15, | 1755,16, | 1755,17, | 1755,18, | 1755,19, | 1755,20, | 1755,21, | 1755,22, | 1755,23, | 1755,24, | 1755,25, | 1755,26, | 1755,27, | 1755,28, | 1755,29, | 1755,30, | 1755,31, | 1755,32, | 1755,33, | 1755,34, | 1755,35, | 1755,36, | 1755,37, | 1755,38, | 1755,39, | 1755,40, | 1755,41, | 1755,42, | 1755,43, | 1755,44, | 1755,45, | 1755,46, | 1755,47, | 1755,48, | 1755,49, | 1755,50, | 1755,51, | 1755,52, | 1755,53, | 1755,54, | 1755,55, | 1755,56, | 1755,57, | 1755,58, | 1755,59, | 1755,60, | 1755,61, | 1755,62, | 1755,63, | 1755,64, | 1755,65, | 1755,66, | 1755,67, | 1755,68, | 1755,69, | 1755,70, | 1755,71, | 1755,72, | 1755,73, | 1755,74, | 1755,75, | 1755,76, | 1755,77, | 1755,78, | 1755,79, | 1755,80, | 1755,81, | 1755,82, | 1755,83, | 1755,84, | 1755,85, | 1756,1, | 1756,2, | 1756,3, | 1756,4, | 1756,5, | 1756,6, | 1756,7, | 1756,8, | 1756,9, | 1756,10, | 1756,11, | 1756,12, | 1756,13, | 1756,14, | 1756,15, | 1756,16, | 1756,17, | 1756,18, | 1756,19, | 1756,20, | 1756,21, | 1756,22, | 1756,23, | 1756,24, | 1756,25, | 1756,26, | 1756,27, | 1756,28, | 1756,29, | 1756,30, | 1756,31, | 1756,32, | 1756,33, | 1756,34, | 1756,35, | 1756,36, | 1756,37, | 1756,38, | 1756,39, | 1756,40, | 1756,41, | 1756,42, | 1756,43, | 1756,44, | 1756,45, | 1756,46, | 1756,47, | 1756,48, | 1756,49, | 1756,50, | 1756,51, | 1756,52, | 1756,53, | 1756,54, | 1756,55, | 1756,56, | 1756,57, | 1756,58, | 1756,59, | 1756,60, | 1756,61, | 1756,62, | 1756,63, | 1756,64, | 1756,65, | 1756,66, | 1756,67, | 1756,68, | 1756,69, | 1756,70, | 1756,71, | 1756,72, | 1756,73, | 1756,74, | 1756,75, | 1756,76, | 1756,77, | 1756,78, | 1756,79, | 1756,80, | 1756,81, | 1756,82, | 1756,83, | 1756,84, | 1756,85, | 1757,1, | 1757,2, | 1757,3, | 1757,4, | 1757,5, | 1757,6, | 1757,7, | 1757,8, | 1757,9, | 1757,10, | 1757,11, | 1757,12, | 1757,13, | 1757,14, | 1757,15, | 1757,16, | 1757,17, | 1757,18, | 1757,19, | 1757,20, | 1757,21, | 1757,22, | 1757,23, | 1757,24, | 1757,25, | 1757,26, | 1757,27, | 1757,28, | 1757,29, | 1757,30, | 1757,31, | 1757,32, | 1757,33, | 1757,34, | 1757,35, | 1757,36, | 1757,37, | 1757,38, | 1757,39, | 1757,40, | 1757,41, | 1757,42, | 1757,43, | 1757,44, | 1757,45, | 1757,46, | 1757,47, | 1757,48, | 1757,49, | 1757,50, | 1757,51, | 1757,52, | 1757,53, | 1757,54, | 1757,55, | 1757,56, | 1757,57, | 1757,58, | 1757,59, | 1757,60, | 1757,61, | 1757,62, | 1757,63, | 1757,64, | 1757,65, | 1757,66, | 1757,67, | 1757,68, | 1757,69, | 1757,70, | 1757,71, | 1757,72, | 1757,73, | 1757,74, | 1757,75, | 1757,76, | 1757,77, | 1757,78, | 1757,79, | 1757,80, | 1757,81, | 1757,82, | 1757,83, | 1757,84, | 1757,85, | 1758,1, | 1758,2, | 1758,3, | 1758,4, | 1758,5, | 1758,6, | 1758,7, | 1758,8, | 1758,9, | 1758,10, | 1758,11, | 1758,12, | 1758,13, | 1758,14, | 1758,15, | 1758,16, | 1758,17, | 1758,18, | 1758,19, | 1758,20, | 1758,21, | 1758,22, | 1758,23, | 1758,24, | 1758,25, | 1758,26, | 1758,27, | 1758,28, | 1758,29, | 1758,30, | 1758,31, | 1758,32, | 1758,33, | 1758,34, | 1758,35, | 1758,36, | 1758,37, | 1758,38, | 1758,39, | 1758,40, | 1758,41, | 1758,42, | 1758,43, | 1758,44, | 1758,45, | 1758,46, | 1758,47, | 1758,48, | 1758,49, | 1758,50, | 1758,51, | 1758,52, | 1758,53, | 1758,54, | 1758,55, | 1758,56, | 1758,57, | 1758,58, | 1758,59, | 1758,60, | 1758,61, | 1758,62, | 1758,63, | 1758,64, | 1758,65, | 1758,66, | 1758,67, | 1758,68, | 1758,69, | 1758,70, | 1758,71, | 1758,72, | 1758,73, | 1758,74, | 1758,75, | 1758,76, | 1758,77, | 1758,78, | 1758,79, | 1758,80, | 1758,81, | 1758,82, | 1758,83, | 1758,84, | 1758,85, | 1759,1, | 1759,2, | 1759,3, | 1759,4, | 1759,5, | 1759,6, | 1759,7, | 1759,8, | 1759,9, | 1759,10, | 1759,11, | 1759,12, | 1759,13, | 1759,14, | 1759,15, | 1759,16, | 1759,17, | 1759,18, | 1759,19, | 1759,20, | 1759,21, | 1759,22, | 1759,23, | 1759,24, | 1759,25, | 1759,26, | 1759,27, | 1759,28, | 1759,29, | 1759,30, | 1759,31, | 1759,32, | 1759,33, | 1759,34, | 1759,35, | 1759,36, | 1759,37, | 1759,38, | 1759,39, | 1759,40, | 1759,41, | 1759,42, | 1759,43, | 1759,44, | 1759,45, | 1759,46, | 1759,47, | 1759,48, | 1759,49, | 1759,50, | 1759,51, | 1759,52, | 1759,53, | 1759,54, | 1759,55, | 1759,56, | 1759,57, | 1759,58, | 1759,59, | 1759,60, | 1759,61, | 1759,62, | 1759,63, | 1759,64, | 1759,65, | 1759,66, | 1759,67, | 1759,68, | 1759,69, | 1759,70, | 1759,71, | 1759,72, | 1759,73, | 1759,74, | 1759,75, | 1759,76, | 1759,77, | 1759,78, | 1759,79, | 1759,80, | 1759,81, | 1759,82, | 1759,83, | 1759,84, | 1759,85, | 1760,1, | 1760,2, | 1760,3, | 1760,4, | 1760,5, | 1760,6, | 1760,7, | 1760,8, | 1760,9, | 1760,10, | 1760,11, | 1760,12, | 1760,13, | 1760,14, | 1760,15, | 1760,16, | 1760,17, | 1760,18, | 1760,19, | 1760,20, | 1760,21, | 1760,22, | 1760,23, | 1760,24, | 1760,25, | 1760,26, | 1760,27, | 1760,28, | 1760,29, | 1760,30, | 1760,31, | 1760,32, | 1760,33, | 1760,34, | 1760,35, | 1760,36, | 1760,37, | 1760,38, | 1760,39, | 1760,40, | 1760,41, | 1760,42, | 1760,43, | 1760,44, | 1760,45, | 1760,46, | 1760,47, | 1760,48, | 1760,49, | 1760,50, | 1760,51, | 1760,52, | 1760,53, | 1760,54, | 1760,55, | 1760,56, | 1760,57, | 1760,58, | 1760,59, | 1760,60, | 1760,61, | 1760,62, | 1760,63, | 1760,64, | 1760,65, | 1760,66, | 1760,67, | 1760,68, | 1760,69, | 1760,70, | 1760,71, | 1760,72, | 1760,73, | 1760,74, | 1760,75, | 1760,76, | 1760,77, | 1760,78, | 1760,79, | 1760,80, | 1760,81, | 1760,82, | 1760,83, | 1760,84, | 1760,85, | 1761,1, | 1761,2, | 1761,3, | 1761,4, | 1761,5, | 1761,6, | 1761,7, | 1761,8, | 1761,9, | 1761,10, | 1761,11, | 1761,12, | 1761,13, | 1761,14, | 1761,15, | 1761,16, | 1761,17, | 1761,18, | 1761,19, | 1761,20, | 1761,21, | 1761,22, | 1761,23, | 1761,24, | 1761,25, | 1761,26, | 1761,27, | 1761,28, | 1761,29, | 1761,30, | 1761,31, | 1761,32, | 1761,33, | 1761,34, | 1761,35, | 1761,36, | 1761,37, | 1761,38, | 1761,39, | 1761,40, | 1761,41, | 1761,42, | 1761,43, | 1761,44, | 1761,45, | 1761,46, | 1761,47, | 1761,48, | 1761,49, | 1761,50, | 1761,51, | 1761,52, | 1761,53, | 1761,54, | 1761,55, | 1761,56, | 1761,57, | 1761,58, | 1761,59, | 1761,60, | 1761,61, | 1761,62, | 1761,63, | 1761,64, | 1761,65, | 1761,66, | 1761,67, | 1761,68, | 1761,69, | 1761,70, | 1761,71, | 1761,72, | 1761,73, | 1761,74, | 1761,75, | 1761,76, | 1761,77, | 1761,78, | 1761,79, | 1761,80, | 1761,81, | 1761,82, | 1761,83, | 1761,84, | 1761,85, | 1762,1, | 1762,2, | 1762,3, | 1762,4, | 1762,5, | 1762,6, | 1762,7, | 1762,8, | 1762,9, | 1762,10, | 1762,11, | 1762,12, | 1762,13, | 1762,14, | 1762,15, | 1762,16, | 1762,17, | 1762,18, | 1762,19, | 1762,20, | 1762,21, | 1762,22, | 1762,23, | 1762,24, | 1762,25, | 1762,26, | 1762,27, | 1762,28, | 1762,29, | 1762,30, | 1762,31, | 1762,32, | 1762,33, | 1762,34, | 1762,35, | 1762,36, | 1762,37, | 1762,38, | 1762,39, | 1762,40, | 1762,41, | 1762,42, | 1762,43, | 1762,44, | 1762,45, | 1762,46, | 1762,47, | 1762,48, | 1762,49, | 1762,50, | 1762,51, | 1762,52, | 1762,53, | 1762,54, | 1762,55, | 1762,56, | 1762,57, | 1762,58, | 1762,59, | 1762,60, | 1762,61, | 1762,62, | 1762,63, | 1762,64, | 1762,65, | 1762,66, | 1762,67, | 1762,68, | 1762,69, | 1762,70, | 1762,71, | 1762,72, | 1762,73, | 1762,74, | 1762,75, | 1762,76, | 1762,77, | 1762,78, | 1762,79, | 1762,80, | 1762,81, | 1762,82, | 1762,83, | 1762,84, | 1762,85, | 1763,1, | 1763,2, | 1763,3, | 1763,4, | 1763,5, | 1763,6, | 1763,7, | 1763,8, | 1763,9, | 1763,10, | 1763,11, | 1763,12, | 1763,13, | 1763,14, | 1763,15, | 1763,16, | 1763,17, | 1763,18, | 1763,19, | 1763,20, | 1763,21, | 1763,22, | 1763,23, | 1763,24, | 1763,25, | 1763,26, | 1763,27, | 1763,28, | 1763,29, | 1763,30, | 1763,31, | 1763,32, | 1763,33, | 1763,34, | 1763,35, | 1763,36, | 1763,37, | 1763,38, | 1763,39, | 1763,40, | 1763,41, | 1763,42, | 1763,43, | 1763,44, | 1763,45, | 1763,46, | 1763,47, | 1763,48, | 1763,49, | 1763,50, | 1763,51, | 1763,52, | 1763,53, | 1763,54, | 1763,55, | 1763,56, | 1763,57, | 1763,58, | 1763,59, | 1763,60, | 1763,61, | 1763,62, | 1763,63, | 1763,64, | 1763,65, | 1763,66, | 1763,67, | 1763,68, | 1763,69, | 1763,70, | 1763,71, | 1763,72, | 1763,73, | 1763,74, | 1763,75, | 1763,76, | 1763,77, | 1763,78, | 1763,79, | 1763,80, | 1763,81, | 1763,82, | 1763,83, | 1763,84, | 1763,85, | 1764,1, | 1764,2, | 1764,3, | 1764,4, | 1764,5, | 1764,6, | 1764,7, | 1764,8, | 1764,9, | 1764,10, | 1764,11, | 1764,12, | 1764,13, | 1764,14, | 1764,15, | 1764,16, | 1764,17, | 1764,18, | 1764,19, | 1764,20, | 1764,21, | 1764,22, | 1764,23, | 1764,24, | 1764,25, | 1764,26, | 1764,27, | 1764,28, | 1764,29, | 1764,30, | 1764,31, | 1764,32, | 1764,33, | 1764,34, | 1764,35, | 1764,36, | 1764,37, | 1764,38, | 1764,39, | 1764,40, | 1764,41, | 1764,42, | 1764,43, | 1764,44, | 1764,45, | 1764,46, | 1764,47, | 1764,48, | 1764,49, | 1764,50, | 1764,51, | 1764,52, | 1764,53, | 1764,54, | 1764,55, | 1764,56, | 1764,57, | 1764,58, | 1764,59, | 1764,60, | 1764,61, | 1764,62, | 1764,63, | 1764,64, | 1764,65, | 1764,66, | 1764,67, | 1764,68, | 1764,69, | 1764,70, | 1764,71, | 1764,72, | 1764,73, | 1764,74, | 1764,75, | 1764,76, | 1764,77, | 1764,78, | 1764,79, | 1764,80, | 1764,81, | 1764,82, | 1764,83, | 1764,84, | 1764,85, | 1765,1, | 1765,2, | 1765,3, | 1765,4, | 1765,5, | 1765,6, | 1765,7, | 1765,8, | 1765,9, | 1765,10, | 1765,11, | 1765,12, | 1765,13, | 1765,14, | 1765,15, | 1765,16, | 1765,17, | 1765,18, | 1765,19, | 1765,20, | 1765,21, | 1765,22, | 1765,23, | 1765,24, | 1765,25, | 1765,26, | 1765,27, | 1765,28, | 1765,29, | 1765,30, | 1765,31, | 1765,32, | 1765,33, | 1765,34, | 1765,35, | 1765,36, | 1765,37, | 1765,38, | 1765,39, | 1765,40, | 1765,41, | 1765,42, | 1765,43, | 1765,44, | 1765,45, | 1765,46, | 1765,47, | 1765,48, | 1765,49, | 1765,50, | 1765,51, | 1765,52, | 1765,53, | 1765,54, | 1765,55, | 1765,56, | 1765,57, | 1765,58, | 1765,59, | 1765,60, | 1765,61, | 1765,62, | 1765,63, | 1765,64, | 1765,65, | 1765,66, | 1765,67, | 1765,68, | 1765,69, | 1765,70, | 1765,71, | 1765,72, | 1765,73, | 1765,74, | 1765,75, | 1765,76, | 1765,77, | 1765,78, | 1765,79, | 1765,80, | 1765,81, | 1765,82, | 1765,83, | 1765,84, | 1765,85, | 1766,1, | 1766,2, | 1766,3, | 1766,4, | 1766,5, | 1766,6, | 1766,7, | 1766,8, | 1766,9, | 1766,10, | 1766,11, | 1766,12, | 1766,13, | 1766,14, | 1766,15, | 1766,16, | 1766,17, | 1766,18, | 1766,19, | 1766,20, | 1766,21, | 1766,22, | 1766,23, | 1766,24, | 1766,25, | 1766,26, | 1766,27, | 1766,28, | 1766,29, | 1766,30, | 1766,31, | 1766,32, | 1766,33, | 1766,34, | 1766,35, | 1766,36, | 1766,37, | 1766,38, | 1766,39, | 1766,40, | 1766,41, | 1766,42, | 1766,43, | 1766,44, | 1766,45, | 1766,46, | 1766,47, | 1766,48, | 1766,49, | 1766,50, | 1766,51, | 1766,52, | 1766,53, | 1766,54, | 1766,55, | 1766,56, | 1766,57, | 1766,58, | 1766,59, | 1766,60, | 1766,61, | 1766,62, | 1766,63, | 1766,64, | 1766,65, | 1766,66, | 1766,67, | 1766,68, | 1766,69, | 1766,70, | 1766,71, | 1766,72, | 1766,73, | 1766,74, | 1766,75, | 1766,76, | 1766,77, | 1766,78, | 1766,79, | 1766,80, | 1766,81, | 1766,82, | 1766,83, | 1766,84, | 1766,85, | 1767,1, | 1767,2, | 1767,3, | 1767,4, | 1767,5, | 1767,6, | 1767,7, | 1767,8, | 1767,9, | 1767,10, | 1767,11, | 1767,12, | 1767,13, | 1767,14, | 1767,15, | 1767,16, | 1767,17, | 1767,18, | 1767,19, | 1767,20, | 1767,21, | 1767,22, | 1767,23, | 1767,24, | 1767,25, | 1767,26, | 1767,27, | 1767,28, | 1767,29, | 1767,30, | 1767,31, | 1767,32, | 1767,33, | 1767,34, | 1767,35, | 1767,36, | 1767,37, | 1767,38, | 1767,39, | 1767,40, | 1767,41, | 1767,42, | 1767,43, | 1767,44, | 1767,45, | 1767,46, | 1767,47, | 1767,48, | 1767,49, | 1767,50, | 1767,51, | 1767,52, | 1767,53, | 1767,54, | 1767,55, | 1767,56, | 1767,57, | 1767,58, | 1767,59, | 1767,60, | 1767,61, | 1767,62, | 1767,63, | 1767,64, | 1767,65, | 1767,66, | 1767,67, | 1767,68, | 1767,69, | 1767,70, | 1767,71, | 1767,72, | 1767,73, | 1767,74, | 1767,75, | 1767,76, | 1767,77, | 1767,78, | 1767,79, | 1767,80, | 1767,81, | 1767,82, | 1767,83, | 1767,84, | 1767,85, | 1768,1, | 1768,2, | 1768,3, | 1768,4, | 1768,5, | 1768,6, | 1768,7, | 1768,8, | 1768,9, | 1768,10, | 1768,11, | 1768,12, | 1768,13, | 1768,14, | 1768,15, | 1768,16, | 1768,17, | 1768,18, | 1768,19, | 1768,20, | 1768,21, | 1768,22, | 1768,23, | 1768,24, | 1768,25, | 1768,26, | 1768,27, | 1768,28, | 1768,29, | 1768,30, | 1768,31, | 1768,32, | 1768,33, | 1768,34, | 1768,35, | 1768,36, | 1768,37, | 1768,38, | 1768,39, | 1768,40, | 1768,41, | 1768,42, | 1768,43, | 1768,44, | 1768,45, | 1768,46, | 1768,47, | 1768,48, | 1768,49, | 1768,50, | 1768,51, | 1768,52, | 1768,53, | 1768,54, | 1768,55, | 1768,56, | 1768,57, | 1768,58, | 1768,59, | 1768,60, | 1768,61, | 1768,62, | 1768,63, | 1768,64, | 1768,65, | 1768,66, | 1768,67, | 1768,68, | 1768,69, | 1768,70, | 1768,71, | 1768,72, | 1768,73, | 1768,74, | 1768,75, | 1768,76, | 1768,77, | 1768,78, | 1768,79, | 1768,80, | 1768,81, | 1768,82, | 1768,83, | 1768,84, | 1768,85, | 1769,1, | 1769,2, | 1769,3, | 1769,4, | 1769,5, | 1769,6, | 1769,7, | 1769,8, | 1769,9, | 1769,10, | 1769,11, | 1769,12, | 1769,13, | 1769,14, | 1769,15, | 1769,16, | 1769,17, | 1769,18, | 1769,19, | 1769,20, | 1769,21, | 1769,22, | 1769,23, | 1769,24, | 1769,25, | 1769,26, | 1769,27, | 1769,28, | 1769,29, | 1769,30, | 1769,31, | 1769,32, | 1769,33, | 1769,34, | 1769,35, | 1769,36, | 1769,37, | 1769,38, | 1769,39, | 1769,40, | 1769,41, | 1769,42, | 1769,43, | 1769,44, | 1769,45, | 1769,46, | 1769,47, | 1769,48, | 1769,49, | 1769,50, | 1769,51, | 1769,52, | 1769,53, | 1769,54, | 1769,55, | 1769,56, | 1769,57, | 1769,58, | 1769,59, | 1769,60, | 1769,61, | 1769,62, | 1769,63, | 1769,64, | 1769,65, | 1769,66, | 1769,67, | 1769,68, | 1769,69, | 1769,70, | 1769,71, | 1769,72, | 1769,73, | 1769,74, | 1769,75, | 1769,76, | 1769,77, | 1769,78, | 1769,79, | 1769,80, | 1769,81, | 1769,82, | 1769,83, | 1769,84, | 1769,85, | 1770,1, | 1770,2, | 1770,3, | 1770,4, | 1770,5, | 1770,6, | 1770,7, | 1770,8, | 1770,9, | 1770,10, | 1770,11, | 1770,12, | 1770,13, | 1770,14, | 1770,15, | 1770,16, | 1770,17, | 1770,18, | 1770,19, | 1770,20, | 1770,21, | 1770,22, | 1770,23, | 1770,24, | 1770,25, | 1770,26, | 1770,27, | 1770,28, | 1770,29, | 1770,30, | 1770,31, | 1770,32, | 1770,33, | 1770,34, | 1770,35, | 1770,36, | 1770,37, | 1770,38, | 1770,39, | 1770,40, | 1770,41, | 1770,42, | 1770,43, | 1770,44, | 1770,45, | 1770,46, | 1770,47, | 1770,48, | 1770,49, | 1770,50, | 1770,51, | 1770,52, | 1770,53, | 1770,54, | 1770,55, | 1770,56, | 1770,57, | 1770,58, | 1770,59, | 1770,60, | 1770,61, | 1770,62, | 1770,63, | 1770,64, | 1770,65, | 1770,66, | 1770,67, | 1770,68, | 1770,69, | 1770,70, | 1770,71, | 1770,72, | 1770,73, | 1770,74, | 1770,75, | 1770,76, | 1770,77, | 1770,78, | 1770,79, | 1770,80, | 1770,81, | 1770,82, | 1770,83, | 1770,84, | 1770,85, | 1771,1, | 1771,2, | 1771,3, | 1771,4, | 1771,5, | 1771,6, | 1771,7, | 1771,8, | 1771,9, | 1771,10, | 1771,11, | 1771,12, | 1771,13, | 1771,14, | 1771,15, | 1771,16, | 1771,17, | 1771,18, | 1771,19, | 1771,20, | 1771,21, | 1771,22, | 1771,23, | 1771,24, | 1771,25, | 1771,26, | 1771,27, | 1771,28, | 1771,29, | 1771,30, | 1771,31, | 1771,32, | 1771,33, | 1771,34, | 1771,35, | 1771,36, | 1771,37, | 1771,38, | 1771,39, | 1771,40, | 1771,41, | 1771,42, | 1771,43, | 1771,44, | 1771,45, | 1771,46, | 1771,47, | 1771,48, | 1771,49, | 1771,50, | 1771,51, | 1771,52, | 1771,53, | 1771,54, | 1771,55, | 1771,56, | 1771,57, | 1771,58, | 1771,59, | 1771,60, | 1771,61, | 1771,62, | 1771,63, | 1771,64, | 1771,65, | 1771,66, | 1771,67, | 1771,68, | 1771,69, | 1771,70, | 1771,71, | 1771,72, | 1771,73, | 1771,74, | 1771,75, | 1771,76, | 1771,77, | 1771,78, | 1771,79, | 1771,80, | 1771,81, | 1771,82, | 1771,83, | 1771,84, | 1771,85, | 1772,1, | 1772,2, | 1772,3, | 1772,4, | 1772,5, | 1772,6, | 1772,7, | 1772,8, | 1772,9, | 1772,10, | 1772,11, | 1772,12, | 1772,13, | 1772,14, | 1772,15, | 1772,16, | 1772,17, | 1772,18, | 1772,19, | 1772,20, | 1772,21, | 1772,22, | 1772,23, | 1772,24, | 1772,25, | 1772,26, | 1772,27, | 1772,28, | 1772,29, | 1772,30, | 1772,31, | 1772,32, | 1772,33, | 1772,34, | 1772,35, | 1772,36, | 1772,37, | 1772,38, | 1772,39, | 1772,40, | 1772,41, | 1772,42, | 1772,43, | 1772,44, | 1772,45, | 1772,46, | 1772,47, | 1772,48, | 1772,49, | 1772,50, | 1772,51, | 1772,52, | 1772,53, | 1772,54, | 1772,55, | 1772,56, | 1772,57, | 1772,58, | 1772,59, | 1772,60, | 1772,61, | 1772,62, | 1772,63, | 1772,64, | 1772,65, | 1772,66, | 1772,67, | 1772,68, | 1772,69, | 1772,70, | 1772,71, | 1772,72, | 1772,73, | 1772,74, | 1772,75, | 1772,76, | 1772,77, | 1772,78, | 1772,79, | 1772,80, | 1772,81, | 1772,82, | 1772,83, | 1772,84, | 1772,85, | 1773,1, | 1773,2, | 1773,3, | 1773,4, | 1773,5, | 1773,6, | 1773,7, | 1773,8, | 1773,9, | 1773,10, | 1773,11, | 1773,12, | 1773,13, | 1773,14, | 1773,15, | 1773,16, | 1773,17, | 1773,18, | 1773,19, | 1773,20, | 1773,21, | 1773,22, | 1773,23, | 1773,24, | 1773,25, | 1773,26, | 1773,27, | 1773,28, | 1773,29, | 1773,30, | 1773,31, | 1773,32, | 1773,33, | 1773,34, | 1773,35, | 1773,36, | 1773,37, | 1773,38, | 1773,39, | 1773,40, | 1773,41, | 1773,42, | 1773,43, | 1773,44, | 1773,45, | 1773,46, | 1773,47, | 1773,48, | 1773,49, | 1773,50, | 1773,51, | 1773,52, | 1773,53, | 1773,54, | 1773,55, | 1773,56, | 1773,57, | 1773,58, | 1773,59, | 1773,60, | 1773,61, | 1773,62, | 1773,63, | 1773,64, | 1773,65, | 1773,66, | 1773,67, | 1773,68, | 1773,69, | 1773,70, | 1773,71, | 1773,72, | 1773,73, | 1773,74, | 1773,75, | 1773,76, | 1773,77, | 1773,78, | 1773,79, | 1773,80, | 1773,81, | 1773,82, | 1773,83, | 1773,84, | 1773,85, | 1774,1, | 1774,2, | 1774,3, | 1774,4, | 1774,5, | 1774,6, | 1774,7, | 1774,8, | 1774,9, | 1774,10, | 1774,11, | 1774,12, | 1774,13, | 1774,14, | 1774,15, | 1774,16, | 1774,17, | 1774,18, | 1774,19, | 1774,20, | 1774,21, | 1774,22, | 1774,23, | 1774,24, | 1774,25, | 1774,26, | 1774,27, | 1774,28, | 1774,29, | 1774,30, | 1774,31, | 1774,32, | 1774,33, | 1774,34, | 1774,35, | 1774,36, | 1774,37, | 1774,38, | 1774,39, | 1774,40, | 1774,41, | 1774,42, | 1774,43, | 1774,44, | 1774,45, | 1774,46, | 1774,47, | 1774,48, | 1774,49, | 1774,50, | 1774,51, | 1774,52, | 1774,53, | 1774,54, | 1774,55, | 1774,56, | 1774,57, | 1774,58, | 1774,59, | 1774,60, | 1774,61, | 1774,62, | 1774,63, | 1774,64, | 1774,65, | 1774,66, | 1774,67, | 1774,68, | 1774,69, | 1774,70, | 1774,71, | 1774,72, | 1774,73, | 1774,74, | 1774,75, | 1774,76, | 1774,77, | 1774,78, | 1774,79, | 1774,80, | 1774,81, | 1774,82, | 1774,83, | 1774,84, | 1774,85, | 1775,1, | 1775,2, | 1775,3, | 1775,4, | 1775,5, | 1775,6, | 1775,7, | 1775,8, | 1775,9, | 1775,10, | 1775,11, | 1775,12, | 1775,13, | 1775,14, | 1775,15, | 1775,16, | 1775,17, | 1775,18, | 1775,19, | 1775,20, | 1775,21, | 1775,22, | 1775,23, | 1775,24, | 1775,25, | 1775,26, | 1775,27, | 1775,28, | 1775,29, | 1775,30, | 1775,31, | 1775,32, | 1775,33, | 1775,34, | 1775,35, | 1775,36, | 1775,37, | 1775,38, | 1775,39, | 1775,40, | 1775,41, | 1775,42, | 1775,43, | 1775,44, | 1775,45, | 1775,46, | 1775,47, | 1775,48, | 1775,49, | 1775,50, | 1775,51, | 1775,52, | 1775,53, | 1775,54, | 1775,55, | 1775,56, | 1775,57, | 1775,58, | 1775,59, | 1775,60, | 1775,61, | 1775,62, | 1775,63, | 1775,64, | 1775,65, | 1775,66, | 1775,67, | 1775,68, | 1775,69, | 1775,70, | 1775,71, | 1775,72, | 1775,73, | 1775,74, | 1775,75, | 1775,76, | 1775,77, | 1775,78, | 1775,79, | 1775,80, | 1775,81, | 1775,82, | 1775,83, | 1775,84, | 1775,85, | 1776,1, | 1776,2, | 1776,3, | 1776,4, | 1776,5, | 1776,6, | 1776,7, | 1776,8, | 1776,9, | 1776,10, | 1776,11, | 1776,12, | 1776,13, | 1776,14, | 1776,15, | 1776,16, | 1776,17, | 1776,18, | 1776,19, | 1776,20, | 1776,21, | 1776,22, | 1776,23, | 1776,24, | 1776,25, | 1776,26, | 1776,27, | 1776,28, | 1776,29, | 1776,30, | 1776,31, | 1776,32, | 1776,33, | 1776,34, | 1776,35, | 1776,36, | 1776,37, | 1776,38, | 1776,39, | 1776,40, | 1776,41, | 1776,42, | 1776,43, | 1776,44, | 1776,45, | 1776,46, | 1776,47, | 1776,48, | 1776,49, | 1776,50, | 1776,51, | 1776,52, | 1776,53, | 1776,54, | 1776,55, | 1776,56, | 1776,57, | 1776,58, | 1776,59, | 1776,60, | 1776,61, | 1776,62, | 1776,63, | 1776,64, | 1776,65, | 1776,66, | 1776,67, | 1776,68, | 1776,69, | 1776,70, | 1776,71, | 1776,72, | 1776,73, | 1776,74, | 1776,75, | 1776,76, | 1776,77, | 1776,78, | 1776,79, | 1776,80, | 1776,81, | 1776,82, | 1776,83, | 1776,84, | 1776,85, | 1777,1, | 1777,2, | 1777,3, | 1777,4, | 1777,5, | 1777,6, | 1777,7, | 1777,8, | 1777,9, | 1777,10, | 1777,11, | 1777,12, | 1777,13, | 1777,14, | 1777,15, | 1777,16, | 1777,17, | 1777,18, | 1777,19, | 1777,20, | 1777,21, | 1777,22, | 1777,23, | 1777,24, | 1777,25, | 1777,26, | 1777,27, | 1777,28, | 1777,29, | 1777,30, | 1777,31, | 1777,32, | 1777,33, | 1777,34, | 1777,35, | 1777,36, | 1777,37, | 1777,38, | 1777,39, | 1777,40, | 1777,41, | 1777,42, | 1777,43, | 1777,44, | 1777,45, | 1777,46, | 1777,47, | 1777,48, | 1777,49, | 1777,50, | 1777,51, | 1777,52, | 1777,53, | 1777,54, | 1777,55, | 1777,56, | 1777,57, | 1777,58, | 1777,59, | 1777,60, | 1777,61, | 1777,62, | 1777,63, | 1777,64, | 1777,65, | 1777,66, | 1777,67, | 1777,68, | 1777,69, | 1777,70, | 1777,71, | 1777,72, | 1777,73, | 1777,74, | 1777,75, | 1777,76, | 1777,77, | 1777,78, | 1777,79, | 1777,80, | 1777,81, | 1777,82, | 1777,83, | 1777,84, | 1777,85, | 1778,1, | 1778,2, | 1778,3, | 1778,4, | 1778,5, | 1778,6, | 1778,7, | 1778,8, | 1778,9, | 1778,10, | 1778,11, | 1778,12, | 1778,13, | 1778,14, | 1778,15, | 1778,16, | 1778,17, | 1778,18, | 1778,19, | 1778,20, | 1778,21, | 1778,22, | 1778,23, | 1778,24, | 1778,25, | 1778,26, | 1778,27, | 1778,28, | 1778,29, | 1778,30, | 1778,31, | 1778,32, | 1778,33, | 1778,34, | 1778,35, | 1778,36, | 1778,37, | 1778,38, | 1778,39, | 1778,40, | 1778,41, | 1778,42, | 1778,43, | 1778,44, | 1778,45, | 1778,46, | 1778,47, | 1778,48, | 1778,49, | 1778,50, | 1778,51, | 1778,52, | 1778,53, | 1778,54, | 1778,55, | 1778,56, | 1778,57, | 1778,58, | 1778,59, | 1778,60, | 1778,61, | 1778,62, | 1778,63, | 1778,64, | 1778,65, | 1778,66, | 1778,67, | 1778,68, | 1778,69, | 1778,70, | 1778,71, | 1778,72, | 1778,73, | 1778,74, | 1778,75, | 1778,76, | 1778,77, | 1778,78, | 1778,79, | 1778,80, | 1778,81, | 1778,82, | 1778,83, | 1778,84, | 1778,85, | 1779,1, | 1779,2, | 1779,3, | 1779,4, | 1779,5, | 1779,6, | 1779,7, | 1779,8, | 1779,9, | 1779,10, | 1779,11, | 1779,12, | 1779,13, | 1779,14, | 1779,15, | 1779,16, | 1779,17, | 1779,18, | 1779,19, | 1779,20, | 1779,21, | 1779,22, | 1779,23, | 1779,24, | 1779,25, | 1779,26, | 1779,27, | 1779,28, | 1779,29, | 1779,30, | 1779,31, | 1779,32, | 1779,33, | 1779,34, | 1779,35, | 1779,36, | 1779,37, | 1779,38, | 1779,39, | 1779,40, | 1779,41, | 1779,42, | 1779,43, | 1779,44, | 1779,45, | 1779,46, | 1779,47, | 1779,48, | 1779,49, | 1779,50, | 1779,51, | 1779,52, | 1779,53, | 1779,54, | 1779,55, | 1779,56, | 1779,57, | 1779,58, | 1779,59, | 1779,60, | 1779,61, | 1779,62, | 1779,63, | 1779,64, | 1779,65, | 1779,66, | 1779,67, | 1779,68, | 1779,69, | 1779,70, | 1779,71, | 1779,72, | 1779,73, | 1779,74, | 1779,75, | 1779,76, | 1779,77, | 1779,78, | 1779,79, | 1779,80, | 1779,81, | 1779,82, | 1779,83, | 1779,84, | 1779,85, | 1780,1, | 1780,2, | 1780,3, | 1780,4, | 1780,5, | 1780,6, | 1780,7, | 1780,8, | 1780,9, | 1780,10, | 1780,11, | 1780,12, | 1780,13, | 1780,14, | 1780,15, | 1780,16, | 1780,17, | 1780,18, | 1780,19, | 1780,20, | 1780,21, | 1780,22, | 1780,23, | 1780,24, | 1780,25, | 1780,26, | 1780,27, | 1780,28, | 1780,29, | 1780,30, | 1780,31, | 1780,32, | 1780,33, | 1780,34, | 1780,35, | 1780,36, | 1780,37, | 1780,38, | 1780,39, | 1780,40, | 1780,41, | 1780,42, | 1780,43, | 1780,44, | 1780,45, | 1780,46, | 1780,47, | 1780,48, | 1780,49, | 1780,50, | 1780,51, | 1780,52, | 1780,53, | 1780,54, | 1780,55, | 1780,56, | 1780,57, | 1780,58, | 1780,59, | 1780,60, | 1780,61, | 1780,62, | 1780,63, | 1780,64, | 1780,65, | 1780,66, | 1780,67, | 1780,68, | 1780,69, | 1780,70, | 1780,71, | 1780,72, | 1780,73, | 1780,74, | 1780,75, | 1780,76, | 1780,77, | 1780,78, | 1780,79, | 1780,80, | 1780,81, | 1780,82, | 1780,83, | 1780,84, | 1780,85, | 1781,1, | 1781,2, | 1781,3, | 1781,4, | 1781,5, | 1781,6, | 1781,7, | 1781,8, | 1781,9, | 1781,10, | 1781,11, | 1781,12, | 1781,13, | 1781,14, | 1781,15, | 1781,16, | 1781,17, | 1781,18, | 1781,19, | 1781,20, | 1781,21, | 1781,22, | 1781,23, | 1781,24, | 1781,25, | 1781,26, | 1781,27, | 1781,28, | 1781,29, | 1781,30, | 1781,31, | 1781,32, | 1781,33, | 1781,34, | 1781,35, | 1781,36, | 1781,37, | 1781,38, | 1781,39, | 1781,40, | 1781,41, | 1781,42, | 1781,43, | 1781,44, | 1781,45, | 1781,46, | 1781,47, | 1781,48, | 1781,49, | 1781,50, | 1781,51, | 1781,52, | 1781,53, | 1781,54, | 1781,55, | 1781,56, | 1781,57, | 1781,58, | 1781,59, | 1781,60, | 1781,61, | 1781,62, | 1781,63, | 1781,64, | 1781,65, | 1781,66, | 1781,67, | 1781,68, | 1781,69, | 1781,70, | 1781,71, | 1781,72, | 1781,73, | 1781,74, | 1781,75, | 1781,76, | 1781,77, | 1781,78, | 1781,79, | 1781,80, | 1781,81, | 1781,82, | 1781,83, | 1781,84, | 1781,85, | 1782,1, | 1782,2, | 1782,3, | 1782,4, | 1782,5, | 1782,6, | 1782,7, | 1782,8, | 1782,9, | 1782,10, | 1782,11, | 1782,12, | 1782,13, | 1782,14, | 1782,15, | 1782,16, | 1782,17, | 1782,18, | 1782,19, | 1782,20, | 1782,21, | 1782,22, | 1782,23, | 1782,24, | 1782,25, | 1782,26, | 1782,27, | 1782,28, | 1782,29, | 1782,30, | 1782,31, | 1782,32, | 1782,33, | 1782,34, | 1782,35, | 1782,36, | 1782,37, | 1782,38, | 1782,39, | 1782,40, | 1782,41, | 1782,42, | 1782,43, | 1782,44, | 1782,45, | 1782,46, | 1782,47, | 1782,48, | 1782,49, | 1782,50, | 1782,51, | 1782,52, | 1782,53, | 1782,54, | 1782,55, | 1782,56, | 1782,57, | 1782,58, | 1782,59, | 1782,60, | 1782,61, | 1782,62, | 1782,63, | 1782,64, | 1782,65, | 1782,66, | 1782,67, | 1782,68, | 1782,69, | 1782,70, | 1782,71, | 1782,72, | 1782,73, | 1782,74, | 1782,75, | 1782,76, | 1782,77, | 1782,78, | 1782,79, | 1782,80, | 1782,81, | 1782,82, | 1782,83, | 1782,84, | 1782,85, | 1783,1, | 1783,2, | 1783,3, | 1783,4, | 1783,5, | 1783,6, | 1783,7, | 1783,8, | 1783,9, | 1783,10, | 1783,11, | 1783,12, | 1783,13, | 1783,14, | 1783,15, | 1783,16, | 1783,17, | 1783,18, | 1783,19, | 1783,20, | 1783,21, | 1783,22, | 1783,23, | 1783,24, | 1783,25, | 1783,26, | 1783,27, | 1783,28, | 1783,29, | 1783,30, | 1783,31, | 1783,32, | 1783,33, | 1783,34, | 1783,35, | 1783,36, | 1783,37, | 1783,38, | 1783,39, | 1783,40, | 1783,41, | 1783,42, | 1783,43, | 1783,44, | 1783,45, | 1783,46, | 1783,47, | 1783,48, | 1783,49, | 1783,50, | 1783,51, | 1783,52, | 1783,53, | 1783,54, | 1783,55, | 1783,56, | 1783,57, | 1783,58, | 1783,59, | 1783,60, | 1783,61, | 1783,62, | 1783,63, | 1783,64, | 1783,65, | 1783,66, | 1783,67, | 1783,68, | 1783,69, | 1783,70, | 1783,71, | 1783,72, | 1783,73, | 1783,74, | 1783,75, | 1783,76, | 1783,77, | 1783,78, | 1783,79, | 1783,80, | 1783,81, | 1783,82, | 1783,83, | 1783,84, | 1783,85, | 1784,1, | 1784,2, | 1784,3, | 1784,4, | 1784,5, | 1784,6, | 1784,7, | 1784,8, | 1784,9, | 1784,10, | 1784,11, | 1784,12, | 1784,13, | 1784,14, | 1784,15, | 1784,16, | 1784,17, | 1784,18, | 1784,19, | 1784,20, | 1784,21, | 1784,22, | 1784,23, | 1784,24, | 1784,25, | 1784,26, | 1784,27, | 1784,28, | 1784,29, | 1784,30, | 1784,31, | 1784,32, | 1784,33, | 1784,34, | 1784,35, | 1784,36, | 1784,37, | 1784,38, | 1784,39, | 1784,40, | 1784,41, | 1784,42, | 1784,43, | 1784,44, | 1784,45, | 1784,46, | 1784,47, | 1784,48, | 1784,49, | 1784,50, | 1784,51, | 1784,52, | 1784,53, | 1784,54, | 1784,55, | 1784,56, | 1784,57, | 1784,58, | 1784,59, | 1784,60, | 1784,61, | 1784,62, | 1784,63, | 1784,64, | 1784,65, | 1784,66, | 1784,67, | 1784,68, | 1784,69, | 1784,70, | 1784,71, | 1784,72, | 1784,73, | 1784,74, | 1784,75, | 1784,76, | 1784,77, | 1784,78, | 1784,79, | 1784,80, | 1784,81, | 1784,82, | 1784,83, | 1784,84, | 1784,85, | 1785,1, | 1785,2, | 1785,3, | 1785,4, | 1785,5, | 1785,6, | 1785,7, | 1785,8, | 1785,9, | 1785,10, | 1785,11, | 1785,12, | 1785,13, | 1785,14, | 1785,15, | 1785,16, | 1785,17, | 1785,18, | 1785,19, | 1785,20, | 1785,21, | 1785,22, | 1785,23, | 1785,24, | 1785,25, | 1785,26, | 1785,27, | 1785,28, | 1785,29, | 1785,30, | 1785,31, | 1785,32, | 1785,33, | 1785,34, | 1785,35, | 1785,36, | 1785,37, | 1785,38, | 1785,39, | 1785,40, | 1785,41, | 1785,42, | 1785,43, | 1785,44, | 1785,45, | 1785,46, | 1785,47, | 1785,48, | 1785,49, | 1785,50, | 1785,51, | 1785,52, | 1785,53, | 1785,54, | 1785,55, | 1785,56, | 1785,57, | 1785,58, | 1785,59, | 1785,60, | 1785,61, | 1785,62, | 1785,63, | 1785,64, | 1785,65, | 1785,66, | 1785,67, | 1785,68, | 1785,69, | 1785,70, | 1785,71, | 1785,72, | 1785,73, | 1785,74, | 1785,75, | 1785,76, | 1785,77, | 1785,78, | 1785,79, | 1785,80, | 1785,81, | 1785,82, | 1785,83, | 1785,84, | 1785,85, | 1786,1, | 1786,2, | 1786,3, | 1786,4, | 1786,5, | 1786,6, | 1786,7, | 1786,8, | 1786,9, | 1786,10, | 1786,11, | 1786,12, | 1786,13, | 1786,14, | 1786,15, | 1786,16, | 1786,17, | 1786,18, | 1786,19, | 1786,20, | 1786,21, | 1786,22, | 1786,23, | 1786,24, | 1786,25, | 1786,26, | 1786,27, | 1786,28, | 1786,29, | 1786,30, | 1786,31, | 1786,32, | 1786,33, | 1786,34, | 1786,35, | 1786,36, | 1786,37, | 1786,38, | 1786,39, | 1786,40, | 1786,41, | 1786,42, | 1786,43, | 1786,44, | 1786,45, | 1786,46, | 1786,47, | 1786,48, | 1786,49, | 1786,50, | 1786,51, | 1786,52, | 1786,53, | 1786,54, | 1786,55, | 1786,56, | 1786,57, | 1786,58, | 1786,59, | 1786,60, | 1786,61, | 1786,62, | 1786,63, | 1786,64, | 1786,65, | 1786,66, | 1786,67, | 1786,68, | 1786,69, | 1786,70, | 1786,71, | 1786,72, | 1786,73, | 1786,74, | 1786,75, | 1786,76, | 1786,77, | 1786,78, | 1786,79, | 1786,80, | 1786,81, | 1786,82, | 1786,83, | 1786,84, | 1786,85, | 1787,1, | 1787,2, | 1787,3, | 1787,4, | 1787,5, | 1787,6, | 1787,7, | 1787,8, | 1787,9, | 1787,10, | 1787,11, | 1787,12, | 1787,13, | 1787,14, | 1787,15, | 1787,16, | 1787,17, | 1787,18, | 1787,19, | 1787,20, | 1787,21, | 1787,22, | 1787,23, | 1787,24, | 1787,25, | 1787,26, | 1787,27, | 1787,28, | 1787,29, | 1787,30, | 1787,31, | 1787,32, | 1787,33, | 1787,34, | 1787,35, | 1787,36, | 1787,37, | 1787,38, | 1787,39, | 1787,40, | 1787,41, | 1787,42, | 1787,43, | 1787,44, | 1787,45, | 1787,46, | 1787,47, | 1787,48, | 1787,49, | 1787,50, | 1787,51, | 1787,52, | 1787,53, | 1787,54, | 1787,55, | 1787,56, | 1787,57, | 1787,58, | 1787,59, | 1787,60, | 1787,61, | 1787,62, | 1787,63, | 1787,64, | 1787,65, | 1787,66, | 1787,67, | 1787,68, | 1787,69, | 1787,70, | 1787,71, | 1787,72, | 1787,73, | 1787,74, | 1787,75, | 1787,76, | 1787,77, | 1787,78, | 1787,79, | 1787,80, | 1787,81, | 1787,82, | 1787,83, | 1787,84, | 1787,85, | 1788,1, | 1788,2, | 1788,3, | 1788,4, | 1788,5, | 1788,6, | 1788,7, | 1788,8, | 1788,9, | 1788,10, | 1788,11, | 1788,12, | 1788,13, | 1788,14, | 1788,15, | 1788,16, | 1788,17, | 1788,18, | 1788,19, | 1788,20, | 1788,21, | 1788,22, | 1788,23, | 1788,24, | 1788,25, | 1788,26, | 1788,27, | 1788,28, | 1788,29, | 1788,30, | 1788,31, | 1788,32, | 1788,33, | 1788,34, | 1788,35, | 1788,36, | 1788,37, | 1788,38, | 1788,39, | 1788,40, | 1788,41, | 1788,42, | 1788,43, | 1788,44, | 1788,45, | 1788,46, | 1788,47, | 1788,48, | 1788,49, | 1788,50, | 1788,51, | 1788,52, | 1788,53, | 1788,54, | 1788,55, | 1788,56, | 1788,57, | 1788,58, | 1788,59, | 1788,60, | 1788,61, | 1788,62, | 1788,63, | 1788,64, | 1788,65, | 1788,66, | 1788,67, | 1788,68, | 1788,69, | 1788,70, | 1788,71, | 1788,72, | 1788,73, | 1788,74, | 1788,75, | 1788,76, | 1788,77, | 1788,78, | 1788,79, | 1788,80, | 1788,81, | 1788,82, | 1788,83, | 1788,84, | 1788,85, | 1789,1, | 1789,2, | 1789,3, | 1789,4, | 1789,5, | 1789,6, | 1789,7, | 1789,8, | 1789,9, | 1789,10, | 1789,11, | 1789,12, | 1789,13, | 1789,14, | 1789,15, | 1789,16, | 1789,17, | 1789,18, | 1789,19, | 1789,20, | 1789,21, | 1789,22, | 1789,23, | 1789,24, | 1789,25, | 1789,26, | 1789,27, | 1789,28, | 1789,29, | 1789,30, | 1789,31, | 1789,32, | 1789,33, | 1789,34, | 1789,35, | 1789,36, | 1789,37, | 1789,38, | 1789,39, | 1789,40, | 1789,41, | 1789,42, | 1789,43, | 1789,44, | 1789,45, | 1789,46, | 1789,47, | 1789,48, | 1789,49, | 1789,50, | 1789,51, | 1789,52, | 1789,53, | 1789,54, | 1789,55, | 1789,56, | 1789,57, | 1789,58, | 1789,59, | 1789,60, | 1789,61, | 1789,62, | 1789,63, | 1789,64, | 1789,65, | 1789,66, | 1789,67, | 1789,68, | 1789,69, | 1789,70, | 1789,71, | 1789,72, | 1789,73, | 1789,74, | 1789,75, | 1789,76, | 1789,77, | 1789,78, | 1789,79, | 1789,80, | 1789,81, | 1789,82, | 1789,83, | 1789,84, | 1789,85, | 1790,1, | 1790,2, | 1790,3, | 1790,4, | 1790,5, | 1790,6, | 1790,7, | 1790,8, | 1790,9, | 1790,10, | 1790,11, | 1790,12, | 1790,13, | 1790,14, | 1790,15, | 1790,16, | 1790,17, | 1790,18, | 1790,19, | 1790,20, | 1790,21, | 1790,22, | 1790,23, | 1790,24, | 1790,25, | 1790,26, | 1790,27, | 1790,28, | 1790,29, | 1790,30, | 1790,31, | 1790,32, | 1790,33, | 1790,34, | 1790,35, | 1790,36, | 1790,37, | 1790,38, | 1790,39, | 1790,40, | 1790,41, | 1790,42, | 1790,43, | 1790,44, | 1790,45, | 1790,46, | 1790,47, | 1790,48, | 1790,49, | 1790,50, | 1790,51, | 1790,52, | 1790,53, | 1790,54, | 1790,55, | 1790,56, | 1790,57, | 1790,58, | 1790,59, | 1790,60, | 1790,61, | 1790,62, | 1790,63, | 1790,64, | 1790,65, | 1790,66, | 1790,67, | 1790,68, | 1790,69, | 1790,70, | 1790,71, | 1790,72, | 1790,73, | 1790,74, | 1790,75, | 1790,76, | 1790,77, | 1790,78, | 1790,79, | 1790,80, | 1790,81, | 1790,82, | 1790,83, | 1790,84, | 1790,85, | 1791,1, | 1791,2, | 1791,3, | 1791,4, | 1791,5, | 1791,6, | 1791,7, | 1791,8, | 1791,9, | 1791,10, | 1791,11, | 1791,12, | 1791,13, | 1791,14, | 1791,15, | 1791,16, | 1791,17, | 1791,18, | 1791,19, | 1791,20, | 1791,21, | 1791,22, | 1791,23, | 1791,24, | 1791,25, | 1791,26, | 1791,27, | 1791,28, | 1791,29, | 1791,30, | 1791,31, | 1791,32, | 1791,33, | 1791,34, | 1791,35, | 1791,36, | 1791,37, | 1791,38, | 1791,39, | 1791,40, | 1791,41, | 1791,42, | 1791,43, | 1791,44, | 1791,45, | 1791,46, | 1791,47, | 1791,48, | 1791,49, | 1791,50, | 1791,51, | 1791,52, | 1791,53, | 1791,54, | 1791,55, | 1791,56, | 1791,57, | 1791,58, | 1791,59, | 1791,60, | 1791,61, | 1791,62, | 1791,63, | 1791,64, | 1791,65, | 1791,66, | 1791,67, | 1791,68, | 1791,69, | 1791,70, | 1791,71, | 1791,72, | 1791,73, | 1791,74, | 1791,75, | 1791,76, | 1791,77, | 1791,78, | 1791,79, | 1791,80, | 1791,81, | 1791,82, | 1791,83, | 1791,84, | 1791,85, | 1792,1, | 1792,2, | 1792,3, | 1792,4, | 1792,5, | 1792,6, | 1792,7, | 1792,8, | 1792,9, | 1792,10, | 1792,11, | 1792,12, | 1792,13, | 1792,14, | 1792,15, | 1792,16, | 1792,17, | 1792,18, | 1792,19, | 1792,20, | 1792,21, | 1792,22, | 1792,23, | 1792,24, | 1792,25, | 1792,26, | 1792,27, | 1792,28, | 1792,29, | 1792,30, | 1792,31, | 1792,32, | 1792,33, | 1792,34, | 1792,35, | 1792,36, | 1792,37, | 1792,38, | 1792,39, | 1792,40, | 1792,41, | 1792,42, | 1792,43, | 1792,44, | 1792,45, | 1792,46, | 1792,47, | 1792,48, | 1792,49, | 1792,50, | 1792,51, | 1792,52, | 1792,53, | 1792,54, | 1792,55, | 1792,56, | 1792,57, | 1792,58, | 1792,59, | 1792,60, | 1792,61, | 1792,62, | 1792,63, | 1792,64, | 1792,65, | 1792,66, | 1792,67, | 1792,68, | 1792,69, | 1792,70, | 1792,71, | 1792,72, | 1792,73, | 1792,74, | 1792,75, | 1792,76, | 1792,77, | 1792,78, | 1792,79, | 1792,80, | 1792,81, | 1792,82, | 1792,83, | 1792,84, | 1792,85, | 1793,1, | 1793,2, | 1793,3, | 1793,4, | 1793,5, | 1793,6, | 1793,7, | 1793,8, | 1793,9, | 1793,10, | 1793,11, | 1793,12, | 1793,13, | 1793,14, | 1793,15, | 1793,16, | 1793,17, | 1793,18, | 1793,19, | 1793,20, | 1793,21, | 1793,22, | 1793,23, | 1793,24, | 1793,25, | 1793,26, | 1793,27, | 1793,28, | 1793,29, | 1793,30, | 1793,31, | 1793,32, | 1793,33, | 1793,34, | 1793,35, | 1793,36, | 1793,37, | 1793,38, | 1793,39, | 1793,40, | 1793,41, | 1793,42, | 1793,43, | 1793,44, | 1793,45, | 1793,46, | 1793,47, | 1793,48, | 1793,49, | 1793,50, | 1793,51, | 1793,52, | 1793,53, | 1793,54, | 1793,55, | 1793,56, | 1793,57, | 1793,58, | 1793,59, | 1793,60, | 1793,61, | 1793,62, | 1793,63, | 1793,64, | 1793,65, | 1793,66, | 1793,67, | 1793,68, | 1793,69, | 1793,70, | 1793,71, | 1793,72, | 1793,73, | 1793,74, | 1793,75, | 1793,76, | 1793,77, | 1793,78, | 1793,79, | 1793,80, | 1793,81, | 1793,82, | 1793,83, | 1793,84, | 1793,85, | 1794,1, | 1794,2, | 1794,3, | 1794,4, | 1794,5, | 1794,6, | 1794,7, | 1794,8, | 1794,9, | 1794,10, | 1794,11, | 1794,12, | 1794,13, | 1794,14, | 1794,15, | 1794,16, | 1794,17, | 1794,18, | 1794,19, | 1794,20, | 1794,21, | 1794,22, | 1794,23, | 1794,24, | 1794,25, | 1794,26, | 1794,27, | 1794,28, | 1794,29, | 1794,30, | 1794,31, | 1794,32, | 1794,33, | 1794,34, | 1794,35, | 1794,36, | 1794,37, | 1794,38, | 1794,39, | 1794,40, | 1794,41, | 1794,42, | 1794,43, | 1794,44, | 1794,45, | 1794,46, | 1794,47, | 1794,48, | 1794,49, | 1794,50, | 1794,51, | 1794,52, | 1794,53, | 1794,54, | 1794,55, | 1794,56, | 1794,57, | 1794,58, | 1794,59, | 1794,60, | 1794,61, | 1794,62, | 1794,63, | 1794,64, | 1794,65, | 1794,66, | 1794,67, | 1794,68, | 1794,69, | 1794,70, | 1794,71, | 1794,72, | 1794,73, | 1794,74, | 1794,75, | 1794,76, | 1794,77, | 1794,78, | 1794,79, | 1794,80, | 1794,81, | 1794,82, | 1794,83, | 1794,84, | 1794,85, | 1795,1, | 1795,2, | 1795,3, | 1795,4, | 1795,5, | 1795,6, | 1795,7, | 1795,8, | 1795,9, | 1795,10, | 1795,11, | 1795,12, | 1795,13, | 1795,14, | 1795,15, | 1795,16, | 1795,17, | 1795,18, | 1795,19, | 1795,20, | 1795,21, | 1795,22, | 1795,23, | 1795,24, | 1795,25, | 1795,26, | 1795,27, | 1795,28, | 1795,29, | 1795,30, | 1795,31, | 1795,32, | 1795,33, | 1795,34, | 1795,35, | 1795,36, | 1795,37, | 1795,38, | 1795,39, | 1795,40, | 1795,41, | 1795,42, | 1795,43, | 1795,44, | 1795,45, | 1795,46, | 1795,47, | 1795,48, | 1795,49, | 1795,50, | 1795,51, | 1795,52, | 1795,53, | 1795,54, | 1795,55, | 1795,56, | 1795,57, | 1795,58, | 1795,59, | 1795,60, | 1795,61, | 1795,62, | 1795,63, | 1795,64, | 1795,65, | 1795,66, | 1795,67, | 1795,68, | 1795,69, | 1795,70, | 1795,71, | 1795,72, | 1795,73, | 1795,74, | 1795,75, | 1795,76, | 1795,77, | 1795,78, | 1795,79, | 1795,80, | 1795,81, | 1795,82, | 1795,83, | 1795,84, | 1795,85, | 1796,1, | 1796,2, | 1796,3, | 1796,4, | 1796,5, | 1796,6, | 1796,7, | 1796,8, | 1796,9, | 1796,10, | 1796,11, | 1796,12, | 1796,13, | 1796,14, | 1796,15, | 1796,16, | 1796,17, | 1796,18, | 1796,19, | 1796,20, | 1796,21, | 1796,22, | 1796,23, | 1796,24, | 1796,25, | 1796,26, | 1796,27, | 1796,28, | 1796,29, | 1796,30, | 1796,31, | 1796,32, | 1796,33, | 1796,34, | 1796,35, | 1796,36, | 1796,37, | 1796,38, | 1796,39, | 1796,40, | 1796,41, | 1796,42, | 1796,43, | 1796,44, | 1796,45, | 1796,46, | 1796,47, | 1796,48, | 1796,49, | 1796,50, | 1796,51, | 1796,52, | 1796,53, | 1796,54, | 1796,55, | 1796,56, | 1796,57, | 1796,58, | 1796,59, | 1796,60, | 1796,61, | 1796,62, | 1796,63, | 1796,64, | 1796,65, | 1796,66, | 1796,67, | 1796,68, | 1796,69, | 1796,70, | 1796,71, | 1796,72, | 1796,73, | 1796,74, | 1796,75, | 1796,76, | 1796,77, | 1796,78, | 1796,79, | 1796,80, | 1796,81, | 1796,82, | 1796,83, | 1796,84, | 1796,85, | 1797,1, | 1797,2, | 1797,3, | 1797,4, | 1797,5, | 1797,6, | 1797,7, | 1797,8, | 1797,9, | 1797,10, | 1797,11, | 1797,12, | 1797,13, | 1797,14, | 1797,15, | 1797,16, | 1797,17, | 1797,18, | 1797,19, | 1797,20, | 1797,21, | 1797,22, | 1797,23, | 1797,24, | 1797,25, | 1797,26, | 1797,27, | 1797,28, | 1797,29, | 1797,30, | 1797,31, | 1797,32, | 1797,33, | 1797,34, | 1797,35, | 1797,36, | 1797,37, | 1797,38, | 1797,39, | 1797,40, | 1797,41, | 1797,42, | 1797,43, | 1797,44, | 1797,45, | 1797,46, | 1797,47, | 1797,48, | 1797,49, | 1797,50, | 1797,51, | 1797,52, | 1797,53, | 1797,54, | 1797,55, | 1797,56, | 1797,57, | 1797,58, | 1797,59, | 1797,60, | 1797,61, | 1797,62, | 1797,63, | 1797,64, | 1797,65, | 1797,66, | 1797,67, | 1797,68, | 1797,69, | 1797,70, | 1797,71, | 1797,72, | 1797,73, | 1797,74, | 1797,75, | 1797,76, | 1797,77, | 1797,78, | 1797,79, | 1797,80, | 1797,81, | 1797,82, | 1797,83, | 1797,84, | 1797,85, | 1798,1, | 1798,2, | 1798,3, | 1798,4, | 1798,5, | 1798,6, | 1798,7, | 1798,8, | 1798,9, | 1798,10, | 1798,11, | 1798,12, | 1798,13, | 1798,14, | 1798,15, | 1798,16, | 1798,17, | 1798,18, | 1798,19, | 1798,20, | 1798,21, | 1798,22, | 1798,23, | 1798,24, | 1798,25, | 1798,26, | 1798,27, | 1798,28, | 1798,29, | 1798,30, | 1798,31, | 1798,32, | 1798,33, | 1798,34, | 1798,35, | 1798,36, | 1798,37, | 1798,38, | 1798,39, | 1798,40, | 1798,41, | 1798,42, | 1798,43, | 1798,44, | 1798,45, | 1798,46, | 1798,47, | 1798,48, | 1798,49, | 1798,50, | 1798,51, | 1798,52, | 1798,53, | 1798,54, | 1798,55, | 1798,56, | 1798,57, | 1798,58, | 1798,59, | 1798,60, | 1798,61, | 1798,62, | 1798,63, | 1798,64, | 1798,65, | 1798,66, | 1798,67, | 1798,68, | 1798,69, | 1798,70, | 1798,71, | 1798,72, | 1798,73, | 1798,74, | 1798,75, | 1798,76, | 1798,77, | 1798,78, | 1798,79, | 1798,80, | 1798,81, | 1798,82, | 1798,83, | 1798,84, | 1798,85, | 1799,1, | 1799,2, | 1799,3, | 1799,4, | 1799,5, | 1799,6, | 1799,7, | 1799,8, | 1799,9, | 1799,10, | 1799,11, | 1799,12, | 1799,13, | 1799,14, | 1799,15, | 1799,16, | 1799,17, | 1799,18, | 1799,19, | 1799,20, | 1799,21, | 1799,22, | 1799,23, | 1799,24, | 1799,25, | 1799,26, | 1799,27, | 1799,28, | 1799,29, | 1799,30, | 1799,31, | 1799,32, | 1799,33, | 1799,34, | 1799,35, | 1799,36, | 1799,37, | 1799,38, | 1799,39, | 1799,40, | 1799,41, | 1799,42, | 1799,43, | 1799,44, | 1799,45, | 1799,46, | 1799,47, | 1799,48, | 1799,49, | 1799,50, | 1799,51, | 1799,52, | 1799,53, | 1799,54, | 1799,55, | 1799,56, | 1799,57, | 1799,58, | 1799,59, | 1799,60, | 1799,61, | 1799,62, | 1799,63, | 1799,64, | 1799,65, | 1799,66, | 1799,67, | 1799,68, | 1799,69, | 1799,70, | 1799,71, | 1799,72, | 1799,73, | 1799,74, | 1799,75, | 1799,76, | 1799,77, | 1799,78, | 1799,79, | 1799,80, | 1799,81, | 1799,82, | 1799,83, | 1799,84, | 1799,85, | 1800,1, | 1800,2, | 1800,3, | 1800,4, | 1800,5, | 1800,6, | 1800,7, | 1800,8, | 1800,9, | 1800,10, | 1800,11, | 1800,12, | 1800,13, | 1800,14, | 1800,15, | 1800,16, | 1800,17, | 1800,18, | 1800,19, | 1800,20, | 1800,21, | 1800,22, | 1800,23, | 1800,24, | 1800,25, | 1800,26, | 1800,27, | 1800,28, | 1800,29, | 1800,30, | 1800,31, | 1800,32, | 1800,33, | 1800,34, | 1800,35, | 1800,36, | 1800,37, | 1800,38, | 1800,39, | 1800,40, | 1800,41, | 1800,42, | 1800,43, | 1800,44, | 1800,45, | 1800,46, | 1800,47, | 1800,48, | 1800,49, | 1800,50, | 1800,51, | 1800,52, | 1800,53, | 1800,54, | 1800,55, | 1800,56, | 1800,57, | 1800,58, | 1800,59, | 1800,60, | 1800,61, | 1800,62, | 1800,63, | 1800,64, | 1800,65, | 1800,66, | 1800,67, | 1800,68, | 1800,69, | 1800,70, | 1800,71, | 1800,72, | 1800,73, | 1800,74, | 1800,75, | 1800,76, | 1800,77, | 1800,78, | 1800,79, | 1800,80, | 1800,81, | 1800,82, | 1800,83, | 1800,84, | 1800,85, | 1801,1, | 1801,2, | 1801,3, | 1801,4, | 1801,5, | 1801,6, | 1801,7, | 1801,8, | 1801,9, | 1801,10, | 1801,11, | 1801,12, | 1801,13, | 1801,14, | 1801,15, | 1801,16, | 1801,17, | 1801,18, | 1801,19, | 1801,20, | 1801,21, | 1801,22, | 1801,23, | 1801,24, | 1801,25, | 1801,26, | 1801,27, | 1801,28, | 1801,29, | 1801,30, | 1801,31, | 1801,32, | 1801,33, | 1801,34, | 1801,35, | 1801,36, | 1801,37, | 1801,38, | 1801,39, | 1801,40, | 1801,41, | 1801,42, | 1801,43, | 1801,44, | 1801,45, | 1801,46, | 1801,47, | 1801,48, | 1801,49, | 1801,50, | 1801,51, | 1801,52, | 1801,53, | 1801,54, | 1801,55, | 1801,56, | 1801,57, | 1801,58, | 1801,59, | 1801,60, | 1801,61, | 1801,62, | 1801,63, | 1801,64, | 1801,65, | 1801,66, | 1801,67, | 1801,68, | 1801,69, | 1801,70, | 1801,71, | 1801,72, | 1801,73, | 1801,74, | 1801,75, | 1801,76, | 1801,77, | 1801,78, | 1801,79, | 1801,80, | 1801,81, | 1801,82, | 1801,83, | 1801,84, | 1801,85, | 1802,1, | 1802,2, | 1802,3, | 1802,4, | 1802,5, | 1802,6, | 1802,7, | 1802,8, | 1802,9, | 1802,10, | 1802,11, | 1802,12, | 1802,13, | 1802,14, | 1802,15, | 1802,16, | 1802,17, | 1802,18, | 1802,19, | 1802,20, | 1802,21, | 1802,22, | 1802,23, | 1802,24, | 1802,25, | 1802,26, | 1802,27, | 1802,28, | 1802,29, | 1802,30, | 1802,31, | 1802,32, | 1802,33, | 1802,34, | 1802,35, | 1802,36, | 1802,37, | 1802,38, | 1802,39, | 1802,40, | 1802,41, | 1802,42, | 1802,43, | 1802,44, | 1802,45, | 1802,46, | 1802,47, | 1802,48, | 1802,49, | 1802,50, | 1802,51, | 1802,52, | 1802,53, | 1802,54, | 1802,55, | 1802,56, | 1802,57, | 1802,58, | 1802,59, | 1802,60, | 1802,61, | 1802,62, | 1802,63, | 1802,64, | 1802,65, | 1802,66, | 1802,67, | 1802,68, | 1802,69, | 1802,70, | 1802,71, | 1802,72, | 1802,73, | 1802,74, | 1802,75, | 1802,76, | 1802,77, | 1802,78, | 1802,79, | 1802,80, | 1802,81, | 1802,82, | 1802,83, | 1802,84, | 1802,85, | 1803,1, | 1803,2, | 1803,3, | 1803,4, | 1803,5, | 1803,6, | 1803,7, | 1803,8, | 1803,9, | 1803,10, | 1803,11, | 1803,12, | 1803,13, | 1803,14, | 1803,15, | 1803,16, | 1803,17, | 1803,18, | 1803,19, | 1803,20, | 1803,21, | 1803,22, | 1803,23, | 1803,24, | 1803,25, | 1803,26, | 1803,27, | 1803,28, | 1803,29, | 1803,30, | 1803,31, | 1803,32, | 1803,33, | 1803,34, | 1803,35, | 1803,36, | 1803,37, | 1803,38, | 1803,39, | 1803,40, | 1803,41, | 1803,42, | 1803,43, | 1803,44, | 1803,45, | 1803,46, | 1803,47, | 1803,48, | 1803,49, | 1803,50, | 1803,51, | 1803,52, | 1803,53, | 1803,54, | 1803,55, | 1803,56, | 1803,57, | 1803,58, | 1803,59, | 1803,60, | 1803,61, | 1803,62, | 1803,63, | 1803,64, | 1803,65, | 1803,66, | 1803,67, | 1803,68, | 1803,69, | 1803,70, | 1803,71, | 1803,72, | 1803,73, | 1803,74, | 1803,75, | 1803,76, | 1803,77, | 1803,78, | 1803,79, | 1803,80, | 1803,81, | 1803,82, | 1803,83, | 1803,84, | 1803,85, | 1804,1, | 1804,2, | 1804,3, | 1804,4, | 1804,5, | 1804,6, | 1804,7, | 1804,8, | 1804,9, | 1804,10, | 1804,11, | 1804,12, | 1804,13, | 1804,14, | 1804,15, | 1804,16, | 1804,17, | 1804,18, | 1804,19, | 1804,20, | 1804,21, | 1804,22, | 1804,23, | 1804,24, | 1804,25, | 1804,26, | 1804,27, | 1804,28, | 1804,29, | 1804,30, | 1804,31, | 1804,32, | 1804,33, | 1804,34, | 1804,35, | 1804,36, | 1804,37, | 1804,38, | 1804,39, | 1804,40, | 1804,41, | 1804,42, | 1804,43, | 1804,44, | 1804,45, | 1804,46, | 1804,47, | 1804,48, | 1804,49, | 1804,50, | 1804,51, | 1804,52, | 1804,53, | 1804,54, | 1804,55, | 1804,56, | 1804,57, | 1804,58, | 1804,59, | 1804,60, | 1804,61, | 1804,62, | 1804,63, | 1804,64, | 1804,65, | 1804,66, | 1804,67, | 1804,68, | 1804,69, | 1804,70, | 1804,71, | 1804,72, | 1804,73, | 1804,74, | 1804,75, | 1804,76, | 1804,77, | 1804,78, | 1804,79, | 1804,80, | 1804,81, | 1804,82, | 1804,83, | 1804,84, | 1804,85, | 1805,1, | 1805,2, | 1805,3, | 1805,4, | 1805,5, | 1805,6, | 1805,7, | 1805,8, | 1805,9, | 1805,10, | 1805,11, | 1805,12, | 1805,13, | 1805,14, | 1805,15, | 1805,16, | 1805,17, | 1805,18, | 1805,19, | 1805,20, | 1805,21, | 1805,22, | 1805,23, | 1805,24, | 1805,25, | 1805,26, | 1805,27, | 1805,28, | 1805,29, | 1805,30, | 1805,31, | 1805,32, | 1805,33, | 1805,34, | 1805,35, | 1805,36, | 1805,37, | 1805,38, | 1805,39, | 1805,40, | 1805,41, | 1805,42, | 1805,43, | 1805,44, | 1805,45, | 1805,46, | 1805,47, | 1805,48, | 1805,49, | 1805,50, | 1805,51, | 1805,52, | 1805,53, | 1805,54, | 1805,55, | 1805,56, | 1805,57, | 1805,58, | 1805,59, | 1805,60, | 1805,61, | 1805,62, | 1805,63, | 1805,64, | 1805,65, | 1805,66, | 1805,67, | 1805,68, | 1805,69, | 1805,70, | 1805,71, | 1805,72, | 1805,73, | 1805,74, | 1805,75, | 1805,76, | 1805,77, | 1805,78, | 1805,79, | 1805,80, | 1805,81, | 1805,82, | 1805,83, | 1805,84, | 1805,85, | 1806,1, | 1806,2, | 1806,3, | 1806,4, | 1806,5, | 1806,6, | 1806,7, | 1806,8, | 1806,9, | 1806,10, | 1806,11, | 1806,12, | 1806,13, | 1806,14, | 1806,15, | 1806,16, | 1806,17, | 1806,18, | 1806,19, | 1806,20, | 1806,21, | 1806,22, | 1806,23, | 1806,24, | 1806,25, | 1806,26, | 1806,27, | 1806,28, | 1806,29, | 1806,30, | 1806,31, | 1806,32, | 1806,33, | 1806,34, | 1806,35, | 1806,36, | 1806,37, | 1806,38, | 1806,39, | 1806,40, | 1806,41, | 1806,42, | 1806,43, | 1806,44, | 1806,45, | 1806,46, | 1806,47, | 1806,48, | 1806,49, | 1806,50, | 1806,51, | 1806,52, | 1806,53, | 1806,54, | 1806,55, | 1806,56, | 1806,57, | 1806,58, | 1806,59, | 1806,60, | 1806,61, | 1806,62, | 1806,63, | 1806,64, | 1806,65, | 1806,66, | 1806,67, | 1806,68, | 1806,69, | 1806,70, | 1806,71, | 1806,72, | 1806,73, | 1806,74, | 1806,75, | 1806,76, | 1806,77, | 1806,78, | 1806,79, | 1806,80, | 1806,81, | 1806,82, | 1806,83, | 1806,84, | 1806,85, | 1807,1, | 1807,2, | 1807,3, | 1807,4, | 1807,5, | 1807,6, | 1807,7, | 1807,8, | 1807,9, | 1807,10, | 1807,11, | 1807,12, | 1807,13, | 1807,14, | 1807,15, | 1807,16, | 1807,17, | 1807,18, | 1807,19, | 1807,20, | 1807,21, | 1807,22, | 1807,23, | 1807,24, | 1807,25, | 1807,26, | 1807,27, | 1807,28, | 1807,29, | 1807,30, | 1807,31, | 1807,32, | 1807,33, | 1807,34, | 1807,35, | 1807,36, | 1807,37, | 1807,38, | 1807,39, | 1807,40, | 1807,41, | 1807,42, | 1807,43, | 1807,44, | 1807,45, | 1807,46, | 1807,47, | 1807,48, | 1807,49, | 1807,50, | 1807,51, | 1807,52, | 1807,53, | 1807,54, | 1807,55, | 1807,56, | 1807,57, | 1807,58, | 1807,59, | 1807,60, | 1807,61, | 1807,62, | 1807,63, | 1807,64, | 1807,65, | 1807,66, | 1807,67, | 1807,68, | 1807,69, | 1807,70, | 1807,71, | 1807,72, | 1807,73, | 1807,74, | 1807,75, | 1807,76, | 1807,77, | 1807,78, | 1807,79, | 1807,80, | 1807,81, | 1807,82, | 1807,83, | 1807,84, | 1807,85, | 1808,1, | 1808,2, | 1808,3, | 1808,4, | 1808,5, | 1808,6, | 1808,7, | 1808,8, | 1808,9, | 1808,10, | 1808,11, | 1808,12, | 1808,13, | 1808,14, | 1808,15, | 1808,16, | 1808,17, | 1808,18, | 1808,19, | 1808,20, | 1808,21, | 1808,22, | 1808,23, | 1808,24, | 1808,25, | 1808,26, | 1808,27, | 1808,28, | 1808,29, | 1808,30, | 1808,31, | 1808,32, | 1808,33, | 1808,34, | 1808,35, | 1808,36, | 1808,37, | 1808,38, | 1808,39, | 1808,40, | 1808,41, | 1808,42, | 1808,43, | 1808,44, | 1808,45, | 1808,46, | 1808,47, | 1808,48, | 1808,49, | 1808,50, | 1808,51, | 1808,52, | 1808,53, | 1808,54, | 1808,55, | 1808,56, | 1808,57, | 1808,58, | 1808,59, | 1808,60, | 1808,61, | 1808,62, | 1808,63, | 1808,64, | 1808,65, | 1808,66, | 1808,67, | 1808,68, | 1808,69, | 1808,70, | 1808,71, | 1808,72, | 1808,73, | 1808,74, | 1808,75, | 1808,76, | 1808,77, | 1808,78, | 1808,79, | 1808,80, | 1808,81, | 1808,82, | 1808,83, | 1808,84, | 1808,85, | 1809,1, | 1809,2, | 1809,3, | 1809,4, | 1809,5, | 1809,6, | 1809,7, | 1809,8, | 1809,9, | 1809,10, | 1809,11, | 1809,12, | 1809,13, | 1809,14, | 1809,15, | 1809,16, | 1809,17, | 1809,18, | 1809,19, | 1809,20, | 1809,21, | 1809,22, | 1809,23, | 1809,24, | 1809,25, | 1809,26, | 1809,27, | 1809,28, | 1809,29, | 1809,30, | 1809,31, | 1809,32, | 1809,33, | 1809,34, | 1809,35, | 1809,36, | 1809,37, | 1809,38, | 1809,39, | 1809,40, | 1809,41, | 1809,42, | 1809,43, | 1809,44, | 1809,45, | 1809,46, | 1809,47, | 1809,48, | 1809,49, | 1809,50, | 1809,51, | 1809,52, | 1809,53, | 1809,54, | 1809,55, | 1809,56, | 1809,57, | 1809,58, | 1809,59, | 1809,60, | 1809,61, | 1809,62, | 1809,63, | 1809,64, | 1809,65, | 1809,66, | 1809,67, | 1809,68, | 1809,69, | 1809,70, | 1809,71, | 1809,72, | 1809,73, | 1809,74, | 1809,75, | 1809,76, | 1809,77, | 1809,78, | 1809,79, | 1809,80, | 1809,81, | 1809,82, | 1809,83, | 1809,84, | 1809,85, | 1810,1, | 1810,2, | 1810,3, | 1810,4, | 1810,5, | 1810,6, | 1810,7, | 1810,8, | 1810,9, | 1810,10, | 1810,11, | 1810,12, | 1810,13, | 1810,14, | 1810,15, | 1810,16, | 1810,17, | 1810,18, | 1810,19, | 1810,20, | 1810,21, | 1810,22, | 1810,23, | 1810,24, | 1810,25, | 1810,26, | 1810,27, | 1810,28, | 1810,29, | 1810,30, | 1810,31, | 1810,32, | 1810,33, | 1810,34, | 1810,35, | 1810,36, | 1810,37, | 1810,38, | 1810,39, | 1810,40, | 1810,41, | 1810,42, | 1810,43, | 1810,44, | 1810,45, | 1810,46, | 1810,47, | 1810,48, | 1810,49, | 1810,50, | 1810,51, | 1810,52, | 1810,53, | 1810,54, | 1810,55, | 1810,56, | 1810,57, | 1810,58, | 1810,59, | 1810,60, | 1810,61, | 1810,62, | 1810,63, | 1810,64, | 1810,65, | 1810,66, | 1810,67, | 1810,68, | 1810,69, | 1810,70, | 1810,71, | 1810,72, | 1810,73, | 1810,74, | 1810,75, | 1810,76, | 1810,77, | 1810,78, | 1810,79, | 1810,80, | 1810,81, | 1810,82, | 1810,83, | 1810,84, | 1810,85, | 1811,1, | 1811,2, | 1811,3, | 1811,4, | 1811,5, | 1811,6, | 1811,7, | 1811,8, | 1811,9, | 1811,10, | 1811,11, | 1811,12, | 1811,13, | 1811,14, | 1811,15, | 1811,16, | 1811,17, | 1811,18, | 1811,19, | 1811,20, | 1811,21, | 1811,22, | 1811,23, | 1811,24, | 1811,25, | 1811,26, | 1811,27, | 1811,28, | 1811,29, | 1811,30, | 1811,31, | 1811,32, | 1811,33, | 1811,34, | 1811,35, | 1811,36, | 1811,37, | 1811,38, | 1811,39, | 1811,40, | 1811,41, | 1811,42, | 1811,43, | 1811,44, | 1811,45, | 1811,46, | 1811,47, | 1811,48, | 1811,49, | 1811,50, | 1811,51, | 1811,52, | 1811,53, | 1811,54, | 1811,55, | 1811,56, | 1811,57, | 1811,58, | 1811,59, | 1811,60, | 1811,61, | 1811,62, | 1811,63, | 1811,64, | 1811,65, | 1811,66, | 1811,67, | 1811,68, | 1811,69, | 1811,70, | 1811,71, | 1811,72, | 1811,73, | 1811,74, | 1811,75, | 1811,76, | 1811,77, | 1811,78, | 1811,79, | 1811,80, | 1811,81, | 1811,82, | 1811,83, | 1811,84, | 1811,85, | 1812,1, | 1812,2, | 1812,3, | 1812,4, | 1812,5, | 1812,6, | 1812,7, | 1812,8, | 1812,9, | 1812,10, | 1812,11, | 1812,12, | 1812,13, | 1812,14, | 1812,15, | 1812,16, | 1812,17, | 1812,18, | 1812,19, | 1812,20, | 1812,21, | 1812,22, | 1812,23, | 1812,24, | 1812,25, | 1812,26, | 1812,27, | 1812,28, | 1812,29, | 1812,30, | 1812,31, | 1812,32, | 1812,33, | 1812,34, | 1812,35, | 1812,36, | 1812,37, | 1812,38, | 1812,39, | 1812,40, | 1812,41, | 1812,42, | 1812,43, | 1812,44, | 1812,45, | 1812,46, | 1812,47, | 1812,48, | 1812,49, | 1812,50, | 1812,51, | 1812,52, | 1812,53, | 1812,54, | 1812,55, | 1812,56, | 1812,57, | 1812,58, | 1812,59, | 1812,60, | 1812,61, | 1812,62, | 1812,63, | 1812,64, | 1812,65, | 1812,66, | 1812,67, | 1812,68, | 1812,69, | 1812,70, | 1812,71, | 1812,72, | 1812,73, | 1812,74, | 1812,75, | 1812,76, | 1812,77, | 1812,78, | 1812,79, | 1812,80, | 1812,81, | 1812,82, | 1812,83, | 1812,84, | 1812,85, | 1813,1, | 1813,2, | 1813,3, | 1813,4, | 1813,5, | 1813,6, | 1813,7, | 1813,8, | 1813,9, | 1813,10, | 1813,11, | 1813,12, | 1813,13, | 1813,14, | 1813,15, | 1813,16, | 1813,17, | 1813,18, | 1813,19, | 1813,20, | 1813,21, | 1813,22, | 1813,23, | 1813,24, | 1813,25, | 1813,26, | 1813,27, | 1813,28, | 1813,29, | 1813,30, | 1813,31, | 1813,32, | 1813,33, | 1813,34, | 1813,35, | 1813,36, | 1813,37, | 1813,38, | 1813,39, | 1813,40, | 1813,41, | 1813,42, | 1813,43, | 1813,44, | 1813,45, | 1813,46, | 1813,47, | 1813,48, | 1813,49, | 1813,50, | 1813,51, | 1813,52, | 1813,53, | 1813,54, | 1813,55, | 1813,56, | 1813,57, | 1813,58, | 1813,59, | 1813,60, | 1813,61, | 1813,62, | 1813,63, | 1813,64, | 1813,65, | 1813,66, | 1813,67, | 1813,68, | 1813,69, | 1813,70, | 1813,71, | 1813,72, | 1813,73, | 1813,74, | 1813,75, | 1813,76, | 1813,77, | 1813,78, | 1813,79, | 1813,80, | 1813,81, | 1813,82, | 1813,83, | 1813,84, | 1813,85, | 1814,1, | 1814,2, | 1814,3, | 1814,4, | 1814,5, | 1814,6, | 1814,7, | 1814,8, | 1814,9, | 1814,10, | 1814,11, | 1814,12, | 1814,13, | 1814,14, | 1814,15, | 1814,16, | 1814,17, | 1814,18, | 1814,19, | 1814,20, | 1814,21, | 1814,22, | 1814,23, | 1814,24, | 1814,25, | 1814,26, | 1814,27, | 1814,28, | 1814,29, | 1814,30, | 1814,31, | 1814,32, | 1814,33, | 1814,34, | 1814,35, | 1814,36, | 1814,37, | 1814,38, | 1814,39, | 1814,40, | 1814,41, | 1814,42, | 1814,43, | 1814,44, | 1814,45, | 1814,46, | 1814,47, | 1814,48, | 1814,49, | 1814,50, | 1814,51, | 1814,52, | 1814,53, | 1814,54, | 1814,55, | 1814,56, | 1814,57, | 1814,58, | 1814,59, | 1814,60, | 1814,61, | 1814,62, | 1814,63, | 1814,64, | 1814,65, | 1814,66, | 1814,67, | 1814,68, | 1814,69, | 1814,70, | 1814,71, | 1814,72, | 1814,73, | 1814,74, | 1814,75, | 1814,76, | 1814,77, | 1814,78, | 1814,79, | 1814,80, | 1814,81, | 1814,82, | 1814,83, | 1814,84, | 1814,85, | 1815,1, | 1815,2, | 1815,3, | 1815,4, | 1815,5, | 1815,6, | 1815,7, | 1815,8, | 1815,9, | 1815,10, | 1815,11, | 1815,12, | 1815,13, | 1815,14, | 1815,15, | 1815,16, | 1815,17, | 1815,18, | 1815,19, | 1815,20, | 1815,21, | 1815,22, | 1815,23, | 1815,24, | 1815,25, | 1815,26, | 1815,27, | 1815,28, | 1815,29, | 1815,30, | 1815,31, | 1815,32, | 1815,33, | 1815,34, | 1815,35, | 1815,36, | 1815,37, | 1815,38, | 1815,39, | 1815,40, | 1815,41, | 1815,42, | 1815,43, | 1815,44, | 1815,45, | 1815,46, | 1815,47, | 1815,48, | 1815,49, | 1815,50, | 1815,51, | 1815,52, | 1815,53, | 1815,54, | 1815,55, | 1815,56, | 1815,57, | 1815,58, | 1815,59, | 1815,60, | 1815,61, | 1815,62, | 1815,63, | 1815,64, | 1815,65, | 1815,66, | 1815,67, | 1815,68, | 1815,69, | 1815,70, | 1815,71, | 1815,72, | 1815,73, | 1815,74, | 1815,75, | 1815,76, | 1815,77, | 1815,78, | 1815,79, | 1815,80, | 1815,81, | 1815,82, | 1815,83, | 1815,84, | 1815,85, | 1816,1, | 1816,2, | 1816,3, | 1816,4, | 1816,5, | 1816,6, | 1816,7, | 1816,8, | 1816,9, | 1816,10, | 1816,11, | 1816,12, | 1816,13, | 1816,14, | 1816,15, | 1816,16, | 1816,17, | 1816,18, | 1816,19, | 1816,20, | 1816,21, | 1816,22, | 1816,23, | 1816,24, | 1816,25, | 1816,26, | 1816,27, | 1816,28, | 1816,29, | 1816,30, | 1816,31, | 1816,32, | 1816,33, | 1816,34, | 1816,35, | 1816,36, | 1816,37, | 1816,38, | 1816,39, | 1816,40, | 1816,41, | 1816,42, | 1816,43, | 1816,44, | 1816,45, | 1816,46, | 1816,47, | 1816,48, | 1816,49, | 1816,50, | 1816,51, | 1816,52, | 1816,53, | 1816,54, | 1816,55, | 1816,56, | 1816,57, | 1816,58, | 1816,59, | 1816,60, | 1816,61, | 1816,62, | 1816,63, | 1816,64, | 1816,65, | 1816,66, | 1816,67, | 1816,68, | 1816,69, | 1816,70, | 1816,71, | 1816,72, | 1816,73, | 1816,74, | 1816,75, | 1816,76, | 1816,77, | 1816,78, | 1816,79, | 1816,80, | 1816,81, | 1816,82, | 1816,83, | 1816,84, | 1816,85, | 1817,1, | 1817,2, | 1817,3, | 1817,4, | 1817,5, | 1817,6, | 1817,7, | 1817,8, | 1817,9, | 1817,10, | 1817,11, | 1817,12, | 1817,13, | 1817,14, | 1817,15, | 1817,16, | 1817,17, | 1817,18, | 1817,19, | 1817,20, | 1817,21, | 1817,22, | 1817,23, | 1817,24, | 1817,25, | 1817,26, | 1817,27, | 1817,28, | 1817,29, | 1817,30, | 1817,31, | 1817,32, | 1817,33, | 1817,34, | 1817,35, | 1817,36, | 1817,37, | 1817,38, | 1817,39, | 1817,40, | 1817,41, | 1817,42, | 1817,43, | 1817,44, | 1817,45, | 1817,46, | 1817,47, | 1817,48, | 1817,49, | 1817,50, | 1817,51, | 1817,52, | 1817,53, | 1817,54, | 1817,55, | 1817,56, | 1817,57, | 1817,58, | 1817,59, | 1817,60, | 1817,61, | 1817,62, | 1817,63, | 1817,64, | 1817,65, | 1817,66, | 1817,67, | 1817,68, | 1817,69, | 1817,70, | 1817,71, | 1817,72, | 1817,73, | 1817,74, | 1817,75, | 1817,76, | 1817,77, | 1817,78, | 1817,79, | 1817,80, | 1817,81, | 1817,82, | 1817,83, | 1817,84, | 1817,85, | 1818,1, | 1818,2, | 1818,3, | 1818,4, | 1818,5, | 1818,6, | 1818,7, | 1818,8, | 1818,9, | 1818,10, | 1818,11, | 1818,12, | 1818,13, | 1818,14, | 1818,15, | 1818,16, | 1818,17, | 1818,18, | 1818,19, | 1818,20, | 1818,21, | 1818,22, | 1818,23, | 1818,24, | 1818,25, | 1818,26, | 1818,27, | 1818,28, | 1818,29, | 1818,30, | 1818,31, | 1818,32, | 1818,33, | 1818,34, | 1818,35, | 1818,36, | 1818,37, | 1818,38, | 1818,39, | 1818,40, | 1818,41, | 1818,42, | 1818,43, | 1818,44, | 1818,45, | 1818,46, | 1818,47, | 1818,48, | 1818,49, | 1818,50, | 1818,51, | 1818,52, | 1818,53, | 1818,54, | 1818,55, | 1818,56, | 1818,57, | 1818,58, | 1818,59, | 1818,60, | 1818,61, | 1818,62, | 1818,63, | 1818,64, | 1818,65, | 1818,66, | 1818,67, | 1818,68, | 1818,69, | 1818,70, | 1818,71, | 1818,72, | 1818,73, | 1818,74, | 1818,75, | 1818,76, | 1818,77, | 1818,78, | 1818,79, | 1818,80, | 1818,81, | 1818,82, | 1818,83, | 1818,84, | 1818,85, | 1819,1, | 1819,2, | 1819,3, | 1819,4, | 1819,5, | 1819,6, | 1819,7, | 1819,8, | 1819,9, | 1819,10, | 1819,11, | 1819,12, | 1819,13, | 1819,14, | 1819,15, | 1819,16, | 1819,17, | 1819,18, | 1819,19, | 1819,20, | 1819,21, | 1819,22, | 1819,23, | 1819,24, | 1819,25, | 1819,26, | 1819,27, | 1819,28, | 1819,29, | 1819,30, | 1819,31, | 1819,32, | 1819,33, | 1819,34, | 1819,35, | 1819,36, | 1819,37, | 1819,38, | 1819,39, | 1819,40, | 1819,41, | 1819,42, | 1819,43, | 1819,44, | 1819,45, | 1819,46, | 1819,47, | 1819,48, | 1819,49, | 1819,50, | 1819,51, | 1819,52, | 1819,53, | 1819,54, | 1819,55, | 1819,56, | 1819,57, | 1819,58, | 1819,59, | 1819,60, | 1819,61, | 1819,62, | 1819,63, | 1819,64, | 1819,65, | 1819,66, | 1819,67, | 1819,68, | 1819,69, | 1819,70, | 1819,71, | 1819,72, | 1819,73, | 1819,74, | 1819,75, | 1819,76, | 1819,77, | 1819,78, | 1819,79, | 1819,80, | 1819,81, | 1819,82, | 1819,83, | 1819,84, | 1819,85, | 1820,1, | 1820,2, | 1820,3, | 1820,4, | 1820,5, | 1820,6, | 1820,7, | 1820,8, | 1820,9, | 1820,10, | 1820,11, | 1820,12, | 1820,13, | 1820,14, | 1820,15, | 1820,16, | 1820,17, | 1820,18, | 1820,19, | 1820,20, | 1820,21, | 1820,22, | 1820,23, | 1820,24, | 1820,25, | 1820,26, | 1820,27, | 1820,28, | 1820,29, | 1820,30, | 1820,31, | 1820,32, | 1820,33, | 1820,34, | 1820,35, | 1820,36, | 1820,37, | 1820,38, | 1820,39, | 1820,40, | 1820,41, | 1820,42, | 1820,43, | 1820,44, | 1820,45, | 1820,46, | 1820,47, | 1820,48, | 1820,49, | 1820,50, | 1820,51, | 1820,52, | 1820,53, | 1820,54, | 1820,55, | 1820,56, | 1820,57, | 1820,58, | 1820,59, | 1820,60, | 1820,61, | 1820,62, | 1820,63, | 1820,64, | 1820,65, | 1820,66, | 1820,67, | 1820,68, | 1820,69, | 1820,70, | 1820,71, | 1820,72, | 1820,73, | 1820,74, | 1820,75, | 1820,76, | 1820,77, | 1820,78, | 1820,79, | 1820,80, | 1820,81, | 1820,82, | 1820,83, | 1820,84, | 1820,85, | 1821,1, | 1821,2, | 1821,3, | 1821,4, | 1821,5, | 1821,6, | 1821,7, | 1821,8, | 1821,9, | 1821,10, | 1821,11, | 1821,12, | 1821,13, | 1821,14, | 1821,15, | 1821,16, | 1821,17, | 1821,18, | 1821,19, | 1821,20, | 1821,21, | 1821,22, | 1821,23, | 1821,24, | 1821,25, | 1821,26, | 1821,27, | 1821,28, | 1821,29, | 1821,30, | 1821,31, | 1821,32, | 1821,33, | 1821,34, | 1821,35, | 1821,36, | 1821,37, | 1821,38, | 1821,39, | 1821,40, | 1821,41, | 1821,42, | 1821,43, | 1821,44, | 1821,45, | 1821,46, | 1821,47, | 1821,48, | 1821,49, | 1821,50, | 1821,51, | 1821,52, | 1821,53, | 1821,54, | 1821,55, | 1821,56, | 1821,57, | 1821,58, | 1821,59, | 1821,60, | 1821,61, | 1821,62, | 1821,63, | 1821,64, | 1821,65, | 1821,66, | 1821,67, | 1821,68, | 1821,69, | 1821,70, | 1821,71, | 1821,72, | 1821,73, | 1821,74, | 1821,75, | 1821,76, | 1821,77, | 1821,78, | 1821,79, | 1821,80, | 1821,81, | 1821,82, | 1821,83, | 1821,84, | 1821,85, | 1822,1, | 1822,2, | 1822,3, | 1822,4, | 1822,5, | 1822,6, | 1822,7, | 1822,8, | 1822,9, | 1822,10, | 1822,11, | 1822,12, | 1822,13, | 1822,14, | 1822,15, | 1822,16, | 1822,17, | 1822,18, | 1822,19, | 1822,20, | 1822,21, | 1822,22, | 1822,23, | 1822,24, | 1822,25, | 1822,26, | 1822,27, | 1822,28, | 1822,29, | 1822,30, | 1822,31, | 1822,32, | 1822,33, | 1822,34, | 1822,35, | 1822,36, | 1822,37, | 1822,38, | 1822,39, | 1822,40, | 1822,41, | 1822,42, | 1822,43, | 1822,44, | 1822,45, | 1822,46, | 1822,47, | 1822,48, | 1822,49, | 1822,50, | 1822,51, | 1822,52, | 1822,53, | 1822,54, | 1822,55, | 1822,56, | 1822,57, | 1822,58, | 1822,59, | 1822,60, | 1822,61, | 1822,62, | 1822,63, | 1822,64, | 1822,65, | 1822,66, | 1822,67, | 1822,68, | 1822,69, | 1822,70, | 1822,71, | 1822,72, | 1822,73, | 1822,74, | 1822,75, | 1822,76, | 1822,77, | 1822,78, | 1822,79, | 1822,80, | 1822,81, | 1822,82, | 1822,83, | 1822,84, | 1822,85, | 1823,1, | 1823,2, | 1823,3, | 1823,4, | 1823,5, | 1823,6, | 1823,7, | 1823,8, | 1823,9, | 1823,10, | 1823,11, | 1823,12, | 1823,13, | 1823,14, | 1823,15, | 1823,16, | 1823,17, | 1823,18, | 1823,19, | 1823,20, | 1823,21, | 1823,22, | 1823,23, | 1823,24, | 1823,25, | 1823,26, | 1823,27, | 1823,28, | 1823,29, | 1823,30, | 1823,31, | 1823,32, | 1823,33, | 1823,34, | 1823,35, | 1823,36, | 1823,37, | 1823,38, | 1823,39, | 1823,40, | 1823,41, | 1823,42, | 1823,43, | 1823,44, | 1823,45, | 1823,46, | 1823,47, | 1823,48, | 1823,49, | 1823,50, | 1823,51, | 1823,52, | 1823,53, | 1823,54, | 1823,55, | 1823,56, | 1823,57, | 1823,58, | 1823,59, | 1823,60, | 1823,61, | 1823,62, | 1823,63, | 1823,64, | 1823,65, | 1823,66, | 1823,67, | 1823,68, | 1823,69, | 1823,70, | 1823,71, | 1823,72, | 1823,73, | 1823,74, | 1823,75, | 1823,76, | 1823,77, | 1823,78, | 1823,79, | 1823,80, | 1823,81, | 1823,82, | 1823,83, | 1823,84, | 1823,85, | 1824,1, | 1824,2, | 1824,3, | 1824,4, | 1824,5, | 1824,6, | 1824,7, | 1824,8, | 1824,9, | 1824,10, | 1824,11, | 1824,12, | 1824,13, | 1824,14, | 1824,15, | 1824,16, | 1824,17, | 1824,18, | 1824,19, | 1824,20, | 1824,21, | 1824,22, | 1824,23, | 1824,24, | 1824,25, | 1824,26, | 1824,27, | 1824,28, | 1824,29, | 1824,30, | 1824,31, | 1824,32, | 1824,33, | 1824,34, | 1824,35, | 1824,36, | 1824,37, | 1824,38, | 1824,39, | 1824,40, | 1824,41, | 1824,42, | 1824,43, | 1824,44, | 1824,45, | 1824,46, | 1824,47, | 1824,48, | 1824,49, | 1824,50, | 1824,51, | 1824,52, | 1824,53, | 1824,54, | 1824,55, | 1824,56, | 1824,57, | 1824,58, | 1824,59, | 1824,60, | 1824,61, | 1824,62, | 1824,63, | 1824,64, | 1824,65, | 1824,66, | 1824,67, | 1824,68, | 1824,69, | 1824,70, | 1824,71, | 1824,72, | 1824,73, | 1824,74, | 1824,75, | 1824,76, | 1824,77, | 1824,78, | 1824,79, | 1824,80, | 1824,81, | 1824,82, | 1824,83, | 1824,84, | 1824,85, | 1825,1, | 1825,2, | 1825,3, | 1825,4, | 1825,5, | 1825,6, | 1825,7, | 1825,8, | 1825,9, | 1825,10, | 1825,11, | 1825,12, | 1825,13, | 1825,14, | 1825,15, | 1825,16, | 1825,17, | 1825,18, | 1825,19, | 1825,20, | 1825,21, | 1825,22, | 1825,23, | 1825,24, | 1825,25, | 1825,26, | 1825,27, | 1825,28, | 1825,29, | 1825,30, | 1825,31, | 1825,32, | 1825,33, | 1825,34, | 1825,35, | 1825,36, | 1825,37, | 1825,38, | 1825,39, | 1825,40, | 1825,41, | 1825,42, | 1825,43, | 1825,44, | 1825,45, | 1825,46, | 1825,47, | 1825,48, | 1825,49, | 1825,50, | 1825,51, | 1825,52, | 1825,53, | 1825,54, | 1825,55, | 1825,56, | 1825,57, | 1825,58, | 1825,59, | 1825,60, | 1825,61, | 1825,62, | 1825,63, | 1825,64, | 1825,65, | 1825,66, | 1825,67, | 1825,68, | 1825,69, | 1825,70, | 1825,71, | 1825,72, | 1825,73, | 1825,74, | 1825,75, | 1825,76, | 1825,77, | 1825,78, | 1825,79, | 1825,80, | 1825,81, | 1825,82, | 1825,83, | 1825,84, | 1825,85, | 1826,1, | 1826,2, | 1826,3, | 1826,4, | 1826,5, | 1826,6, | 1826,7, | 1826,8, | 1826,9, | 1826,10, | 1826,11, | 1826,12, | 1826,13, | 1826,14, | 1826,15, | 1826,16, | 1826,17, | 1826,18, | 1826,19, | 1826,20, | 1826,21, | 1826,22, | 1826,23, | 1826,24, | 1826,25, | 1826,26, | 1826,27, | 1826,28, | 1826,29, | 1826,30, | 1826,31, | 1826,32, | 1826,33, | 1826,34, | 1826,35, | 1826,36, | 1826,37, | 1826,38, | 1826,39, | 1826,40, | 1826,41, | 1826,42, | 1826,43, | 1826,44, | 1826,45, | 1826,46, | 1826,47, | 1826,48, | 1826,49, | 1826,50, | 1826,51, | 1826,52, | 1826,53, | 1826,54, | 1826,55, | 1826,56, | 1826,57, | 1826,58, | 1826,59, | 1826,60, | 1826,61, | 1826,62, | 1826,63, | 1826,64, | 1826,65, | 1826,66, | 1826,67, | 1826,68, | 1826,69, | 1826,70, | 1826,71, | 1826,72, | 1826,73, | 1826,74, | 1826,75, | 1826,76, | 1826,77, | 1826,78, | 1826,79, | 1826,80, | 1826,81, | 1826,82, | 1826,83, | 1826,84, | 1826,85, | 1827,1, | 1827,2, | 1827,3, | 1827,4, | 1827,5, | 1827,6, | 1827,7, | 1827,8, | 1827,9, | 1827,10, | 1827,11, | 1827,12, | 1827,13, | 1827,14, | 1827,15, | 1827,16, | 1827,17, | 1827,18, | 1827,19, | 1827,20, | 1827,21, | 1827,22, | 1827,23, | 1827,24, | 1827,25, | 1827,26, | 1827,27, | 1827,28, | 1827,29, | 1827,30, | 1827,31, | 1827,32, | 1827,33, | 1827,34, | 1827,35, | 1827,36, | 1827,37, | 1827,38, | 1827,39, | 1827,40, | 1827,41, | 1827,42, | 1827,43, | 1827,44, | 1827,45, | 1827,46, | 1827,47, | 1827,48, | 1827,49, | 1827,50, | 1827,51, | 1827,52, | 1827,53, | 1827,54, | 1827,55, | 1827,56, | 1827,57, | 1827,58, | 1827,59, | 1827,60, | 1827,61, | 1827,62, | 1827,63, | 1827,64, | 1827,65, | 1827,66, | 1827,67, | 1827,68, | 1827,69, | 1827,70, | 1827,71, | 1827,72, | 1827,73, | 1827,74, | 1827,75, | 1827,76, | 1827,77, | 1827,78, | 1827,79, | 1827,80, | 1827,81, | 1827,82, | 1827,83, | 1827,84, | 1827,85, | 1828,1, | 1828,2, | 1828,3, | 1828,4, | 1828,5, | 1828,6, | 1828,7, | 1828,8, | 1828,9, | 1828,10, | 1828,11, | 1828,12, | 1828,13, | 1828,14, | 1828,15, | 1828,16, | 1828,17, | 1828,18, | 1828,19, | 1828,20, | 1828,21, | 1828,22, | 1828,23, | 1828,24, | 1828,25, | 1828,26, | 1828,27, | 1828,28, | 1828,29, | 1828,30, | 1828,31, | 1828,32, | 1828,33, | 1828,34, | 1828,35, | 1828,36, | 1828,37, | 1828,38, | 1828,39, | 1828,40, | 1828,41, | 1828,42, | 1828,43, | 1828,44, | 1828,45, | 1828,46, | 1828,47, | 1828,48, | 1828,49, | 1828,50, | 1828,51, | 1828,52, | 1828,53, | 1828,54, | 1828,55, | 1828,56, | 1828,57, | 1828,58, | 1828,59, | 1828,60, | 1828,61, | 1828,62, | 1828,63, | 1828,64, | 1828,65, | 1828,66, | 1828,67, | 1828,68, | 1828,69, | 1828,70, | 1828,71, | 1828,72, | 1828,73, | 1828,74, | 1828,75, | 1828,76, | 1828,77, | 1828,78, | 1828,79, | 1828,80, | 1828,81, | 1828,82, | 1828,83, | 1828,84, | 1828,85, | 1829,1, | 1829,2, | 1829,3, | 1829,4, | 1829,5, | 1829,6, | 1829,7, | 1829,8, | 1829,9, | 1829,10, | 1829,11, | 1829,12, | 1829,13, | 1829,14, | 1829,15, | 1829,16, | 1829,17, | 1829,18, | 1829,19, | 1829,20, | 1829,21, | 1829,22, | 1829,23, | 1829,24, | 1829,25, | 1829,26, | 1829,27, | 1829,28, | 1829,29, | 1829,30, | 1829,31, | 1829,32, | 1829,33, | 1829,34, | 1829,35, | 1829,36, | 1829,37, | 1829,38, | 1829,39, | 1829,40, | 1829,41, | 1829,42, | 1829,43, | 1829,44, | 1829,45, | 1829,46, | 1829,47, | 1829,48, | 1829,49, | 1829,50, | 1829,51, | 1829,52, | 1829,53, | 1829,54, | 1829,55, | 1829,56, | 1829,57, | 1829,58, | 1829,59, | 1829,60, | 1829,61, | 1829,62, | 1829,63, | 1829,64, | 1829,65, | 1829,66, | 1829,67, | 1829,68, | 1829,69, | 1829,70, | 1829,71, | 1829,72, | 1829,73, | 1829,74, | 1829,75, | 1829,76, | 1829,77, | 1829,78, | 1829,79, | 1829,80, | 1829,81, | 1829,82, | 1829,83, | 1829,84, | 1829,85, | 1830,1, | 1830,2, | 1830,3, | 1830,4, | 1830,5, | 1830,6, | 1830,7, | 1830,8, | 1830,9, | 1830,10, | 1830,11, | 1830,12, | 1830,13, | 1830,14, | 1830,15, | 1830,16, | 1830,17, | 1830,18, | 1830,19, | 1830,20, | 1830,21, | 1830,22, | 1830,23, | 1830,24, | 1830,25, | 1830,26, | 1830,27, | 1830,28, | 1830,29, | 1830,30, | 1830,31, | 1830,32, | 1830,33, | 1830,34, | 1830,35, | 1830,36, | 1830,37, | 1830,38, | 1830,39, | 1830,40, | 1830,41, | 1830,42, | 1830,43, | 1830,44, | 1830,45, | 1830,46, | 1830,47, | 1830,48, | 1830,49, | 1830,50, | 1830,51, | 1830,52, | 1830,53, | 1830,54, | 1830,55, | 1830,56, | 1830,57, | 1830,58, | 1830,59, | 1830,60, | 1830,61, | 1830,62, | 1830,63, | 1830,64, | 1830,65, | 1830,66, | 1830,67, | 1830,68, | 1830,69, | 1830,70, | 1830,71, | 1830,72, | 1830,73, | 1830,74, | 1830,75, | 1830,76, | 1830,77, | 1830,78, | 1830,79, | 1830,80, | 1830,81, | 1830,82, | 1830,83, | 1830,84, | 1830,85, | 1831,1, | 1831,2, | 1831,3, | 1831,4, | 1831,5, | 1831,6, | 1831,7, | 1831,8, | 1831,9, | 1831,10, | 1831,11, | 1831,12, | 1831,13, | 1831,14, | 1831,15, | 1831,16, | 1831,17, | 1831,18, | 1831,19, | 1831,20, | 1831,21, | 1831,22, | 1831,23, | 1831,24, | 1831,25, | 1831,26, | 1831,27, | 1831,28, | 1831,29, | 1831,30, | 1831,31, | 1831,32, | 1831,33, | 1831,34, | 1831,35, | 1831,36, | 1831,37, | 1831,38, | 1831,39, | 1831,40, | 1831,41, | 1831,42, | 1831,43, | 1831,44, | 1831,45, | 1831,46, | 1831,47, | 1831,48, | 1831,49, | 1831,50, | 1831,51, | 1831,52, | 1831,53, | 1831,54, | 1831,55, | 1831,56, | 1831,57, | 1831,58, | 1831,59, | 1831,60, | 1831,61, | 1831,62, | 1831,63, | 1831,64, | 1831,65, | 1831,66, | 1831,67, | 1831,68, | 1831,69, | 1831,70, | 1831,71, | 1831,72, | 1831,73, | 1831,74, | 1831,75, | 1831,76, | 1831,77, | 1831,78, | 1831,79, | 1831,80, | 1831,81, | 1831,82, | 1831,83, | 1831,84, | 1831,85, | 1832,1, | 1832,2, | 1832,3, | 1832,4, | 1832,5, | 1832,6, | 1832,7, | 1832,8, | 1832,9, | 1832,10, | 1832,11, | 1832,12, | 1832,13, | 1832,14, | 1832,15, | 1832,16, | 1832,17, | 1832,18, | 1832,19, | 1832,20, | 1832,21, | 1832,22, | 1832,23, | 1832,24, | 1832,25, | 1832,26, | 1832,27, | 1832,28, | 1832,29, | 1832,30, | 1832,31, | 1832,32, | 1832,33, | 1832,34, | 1832,35, | 1832,36, | 1832,37, | 1832,38, | 1832,39, | 1832,40, | 1832,41, | 1832,42, | 1832,43, | 1832,44, | 1832,45, | 1832,46, | 1832,47, | 1832,48, | 1832,49, | 1832,50, | 1832,51, | 1832,52, | 1832,53, | 1832,54, | 1832,55, | 1832,56, | 1832,57, | 1832,58, | 1832,59, | 1832,60, | 1832,61, | 1832,62, | 1832,63, | 1832,64, | 1832,65, | 1832,66, | 1832,67, | 1832,68, | 1832,69, | 1832,70, | 1832,71, | 1832,72, | 1832,73, | 1832,74, | 1832,75, | 1832,76, | 1832,77, | 1832,78, | 1832,79, | 1832,80, | 1832,81, | 1832,82, | 1832,83, | 1832,84, | 1832,85, | 1833,1, | 1833,2, | 1833,3, | 1833,4, | 1833,5, | 1833,6, | 1833,7, | 1833,8, | 1833,9, | 1833,10, | 1833,11, | 1833,12, | 1833,13, | 1833,14, | 1833,15, | 1833,16, | 1833,17, | 1833,18, | 1833,19, | 1833,20, | 1833,21, | 1833,22, | 1833,23, | 1833,24, | 1833,25, | 1833,26, | 1833,27, | 1833,28, | 1833,29, | 1833,30, | 1833,31, | 1833,32, | 1833,33, | 1833,34, | 1833,35, | 1833,36, | 1833,37, | 1833,38, | 1833,39, | 1833,40, | 1833,41, | 1833,42, | 1833,43, | 1833,44, | 1833,45, | 1833,46, | 1833,47, | 1833,48, | 1833,49, | 1833,50, | 1833,51, | 1833,52, | 1833,53, | 1833,54, | 1833,55, | 1833,56, | 1833,57, | 1833,58, | 1833,59, | 1833,60, | 1833,61, | 1833,62, | 1833,63, | 1833,64, | 1833,65, | 1833,66, | 1833,67, | 1833,68, | 1833,69, | 1833,70, | 1833,71, | 1833,72, | 1833,73, | 1833,74, | 1833,75, | 1833,76, | 1833,77, | 1833,78, | 1833,79, | 1833,80, | 1833,81, | 1833,82, | 1833,83, | 1833,84, | 1833,85, | 1834,1, | 1834,2, | 1834,3, | 1834,4, | 1834,5, | 1834,6, | 1834,7, | 1834,8, | 1834,9, | 1834,10, | 1834,11, | 1834,12, | 1834,13, | 1834,14, | 1834,15, | 1834,16, | 1834,17, | 1834,18, | 1834,19, | 1834,20, | 1834,21, | 1834,22, | 1834,23, | 1834,24, | 1834,25, | 1834,26, | 1834,27, | 1834,28, | 1834,29, | 1834,30, | 1834,31, | 1834,32, | 1834,33, | 1834,34, | 1834,35, | 1834,36, | 1834,37, | 1834,38, | 1834,39, | 1834,40, | 1834,41, | 1834,42, | 1834,43, | 1834,44, | 1834,45, | 1834,46, | 1834,47, | 1834,48, | 1834,49, | 1834,50, | 1834,51, | 1834,52, | 1834,53, | 1834,54, | 1834,55, | 1834,56, | 1834,57, | 1834,58, | 1834,59, | 1834,60, | 1834,61, | 1834,62, | 1834,63, | 1834,64, | 1834,65, | 1834,66, | 1834,67, | 1834,68, | 1834,69, | 1834,70, | 1834,71, | 1834,72, | 1834,73, | 1834,74, | 1834,75, | 1834,76, | 1834,77, | 1834,78, | 1834,79, | 1834,80, | 1834,81, | 1834,82, | 1834,83, | 1834,84, | 1834,85, | 1835,1, | 1835,2, | 1835,3, | 1835,4, | 1835,5, | 1835,6, | 1835,7, | 1835,8, | 1835,9, | 1835,10, | 1835,11, | 1835,12, | 1835,13, | 1835,14, | 1835,15, | 1835,16, | 1835,17, | 1835,18, | 1835,19, | 1835,20, | 1835,21, | 1835,22, | 1835,23, | 1835,24, | 1835,25, | 1835,26, | 1835,27, | 1835,28, | 1835,29, | 1835,30, | 1835,31, | 1835,32, | 1835,33, | 1835,34, | 1835,35, | 1835,36, | 1835,37, | 1835,38, | 1835,39, | 1835,40, | 1835,41, | 1835,42, | 1835,43, | 1835,44, | 1835,45, | 1835,46, | 1835,47, | 1835,48, | 1835,49, | 1835,50, | 1835,51, | 1835,52, | 1835,53, | 1835,54, | 1835,55, | 1835,56, | 1835,57, | 1835,58, | 1835,59, | 1835,60, | 1835,61, | 1835,62, | 1835,63, | 1835,64, | 1835,65, | 1835,66, | 1835,67, | 1835,68, | 1835,69, | 1835,70, | 1835,71, | 1835,72, | 1835,73, | 1835,74, | 1835,75, | 1835,76, | 1835,77, | 1835,78, | 1835,79, | 1835,80, | 1835,81, | 1835,82, | 1835,83, | 1835,84, | 1835,85, | 1836,1, | 1836,2, | 1836,3, | 1836,4, | 1836,5, | 1836,6, | 1836,7, | 1836,8, | 1836,9, | 1836,10, | 1836,11, | 1836,12, | 1836,13, | 1836,14, | 1836,15, | 1836,16, | 1836,17, | 1836,18, | 1836,19, | 1836,20, | 1836,21, | 1836,22, | 1836,23, | 1836,24, | 1836,25, | 1836,26, | 1836,27, | 1836,28, | 1836,29, | 1836,30, | 1836,31, | 1836,32, | 1836,33, | 1836,34, | 1836,35, | 1836,36, | 1836,37, | 1836,38, | 1836,39, | 1836,40, | 1836,41, | 1836,42, | 1836,43, | 1836,44, | 1836,45, | 1836,46, | 1836,47, | 1836,48, | 1836,49, | 1836,50, | 1836,51, | 1836,52, | 1836,53, | 1836,54, | 1836,55, | 1836,56, | 1836,57, | 1836,58, | 1836,59, | 1836,60, | 1836,61, | 1836,62, | 1836,63, | 1836,64, | 1836,65, | 1836,66, | 1836,67, | 1836,68, | 1836,69, | 1836,70, | 1836,71, | 1836,72, | 1836,73, | 1836,74, | 1836,75, | 1836,76, | 1836,77, | 1836,78, | 1836,79, | 1836,80, | 1836,81, | 1836,82, | 1836,83, | 1836,84, | 1836,85, | 1837,1, | 1837,2, | 1837,3, | 1837,4, | 1837,5, | 1837,6, | 1837,7, | 1837,8, | 1837,9, | 1837,10, | 1837,11, | 1837,12, | 1837,13, | 1837,14, | 1837,15, | 1837,16, | 1837,17, | 1837,18, | 1837,19, | 1837,20, | 1837,21, | 1837,22, | 1837,23, | 1837,24, | 1837,25, | 1837,26, | 1837,27, | 1837,28, | 1837,29, | 1837,30, | 1837,31, | 1837,32, | 1837,33, | 1837,34, | 1837,35, | 1837,36, | 1837,37, | 1837,38, | 1837,39, | 1837,40, | 1837,41, | 1837,42, | 1837,43, | 1837,44, | 1837,45, | 1837,46, | 1837,47, | 1837,48, | 1837,49, | 1837,50, | 1837,51, | 1837,52, | 1837,53, | 1837,54, | 1837,55, | 1837,56, | 1837,57, | 1837,58, | 1837,59, | 1837,60, | 1837,61, | 1837,62, | 1837,63, | 1837,64, | 1837,65, | 1837,66, | 1837,67, | 1837,68, | 1837,69, | 1837,70, | 1837,71, | 1837,72, | 1837,73, | 1837,74, | 1837,75, | 1837,76, | 1837,77, | 1837,78, | 1837,79, | 1837,80, | 1837,81, | 1837,82, | 1837,83, | 1837,84, | 1837,85, | 1838,1, | 1838,2, | 1838,3, | 1838,4, | 1838,5, | 1838,6, | 1838,7, | 1838,8, | 1838,9, | 1838,10, | 1838,11, | 1838,12, | 1838,13, | 1838,14, | 1838,15, | 1838,16, | 1838,17, | 1838,18, | 1838,19, | 1838,20, | 1838,21, | 1838,22, | 1838,23, | 1838,24, | 1838,25, | 1838,26, | 1838,27, | 1838,28, | 1838,29, | 1838,30, | 1838,31, | 1838,32, | 1838,33, | 1838,34, | 1838,35, | 1838,36, | 1838,37, | 1838,38, | 1838,39, | 1838,40, | 1838,41, | 1838,42, | 1838,43, | 1838,44, | 1838,45, | 1838,46, | 1838,47, | 1838,48, | 1838,49, | 1838,50, | 1838,51, | 1838,52, | 1838,53, | 1838,54, | 1838,55, | 1838,56, | 1838,57, | 1838,58, | 1838,59, | 1838,60, | 1838,61, | 1838,62, | 1838,63, | 1838,64, | 1838,65, | 1838,66, | 1838,67, | 1838,68, | 1838,69, | 1838,70, | 1838,71, | 1838,72, | 1838,73, | 1838,74, | 1838,75, | 1838,76, | 1838,77, | 1838,78, | 1838,79, | 1838,80, | 1838,81, | 1838,82, | 1838,83, | 1838,84, | 1838,85, | 1839,1, | 1839,2, | 1839,3, | 1839,4, | 1839,5, | 1839,6, | 1839,7, | 1839,8, | 1839,9, | 1839,10, | 1839,11, | 1839,12, | 1839,13, | 1839,14, | 1839,15, | 1839,16, | 1839,17, | 1839,18, | 1839,19, | 1839,20, | 1839,21, | 1839,22, | 1839,23, | 1839,24, | 1839,25, | 1839,26, | 1839,27, | 1839,28, | 1839,29, | 1839,30, | 1839,31, | 1839,32, | 1839,33, | 1839,34, | 1839,35, | 1839,36, | 1839,37, | 1839,38, | 1839,39, | 1839,40, | 1839,41, | 1839,42, | 1839,43, | 1839,44, | 1839,45, | 1839,46, | 1839,47, | 1839,48, | 1839,49, | 1839,50, | 1839,51, | 1839,52, | 1839,53, | 1839,54, | 1839,55, | 1839,56, | 1839,57, | 1839,58, | 1839,59, | 1839,60, | 1839,61, | 1839,62, | 1839,63, | 1839,64, | 1839,65, | 1839,66, | 1839,67, | 1839,68, | 1839,69, | 1839,70, | 1839,71, | 1839,72, | 1839,73, | 1839,74, | 1839,75, | 1839,76, | 1839,77, | 1839,78, | 1839,79, | 1839,80, | 1839,81, | 1839,82, | 1839,83, | 1839,84, | 1839,85, | 1840,1, | 1840,2, | 1840,3, | 1840,4, | 1840,5, | 1840,6, | 1840,7, | 1840,8, | 1840,9, | 1840,10, | 1840,11, | 1840,12, | 1840,13, | 1840,14, | 1840,15, | 1840,16, | 1840,17, | 1840,18, | 1840,19, | 1840,20, | 1840,21, | 1840,22, | 1840,23, | 1840,24, | 1840,25, | 1840,26, | 1840,27, | 1840,28, | 1840,29, | 1840,30, | 1840,31, | 1840,32, | 1840,33, | 1840,34, | 1840,35, | 1840,36, | 1840,37, | 1840,38, | 1840,39, | 1840,40, | 1840,41, | 1840,42, | 1840,43, | 1840,44, | 1840,45, | 1840,46, | 1840,47, | 1840,48, | 1840,49, | 1840,50, | 1840,51, | 1840,52, | 1840,53, | 1840,54, | 1840,55, | 1840,56, | 1840,57, | 1840,58, | 1840,59, | 1840,60, | 1840,61, | 1840,62, | 1840,63, | 1840,64, | 1840,65, | 1840,66, | 1840,67, | 1840,68, | 1840,69, | 1840,70, | 1840,71, | 1840,72, | 1840,73, | 1840,74, | 1840,75, | 1840,76, | 1840,77, | 1840,78, | 1840,79, | 1840,80, | 1840,81, | 1840,82, | 1840,83, | 1840,84, | 1840,85, | 1841,1, | 1841,2, | 1841,3, | 1841,4, | 1841,5, | 1841,6, | 1841,7, | 1841,8, | 1841,9, | 1841,10, | 1841,11, | 1841,12, | 1841,13, | 1841,14, | 1841,15, | 1841,16, | 1841,17, | 1841,18, | 1841,19, | 1841,20, | 1841,21, | 1841,22, | 1841,23, | 1841,24, | 1841,25, | 1841,26, | 1841,27, | 1841,28, | 1841,29, | 1841,30, | 1841,31, | 1841,32, | 1841,33, | 1841,34, | 1841,35, | 1841,36, | 1841,37, | 1841,38, | 1841,39, | 1841,40, | 1841,41, | 1841,42, | 1841,43, | 1841,44, | 1841,45, | 1841,46, | 1841,47, | 1841,48, | 1841,49, | 1841,50, | 1841,51, | 1841,52, | 1841,53, | 1841,54, | 1841,55, | 1841,56, | 1841,57, | 1841,58, | 1841,59, | 1841,60, | 1841,61, | 1841,62, | 1841,63, | 1841,64, | 1841,65, | 1841,66, | 1841,67, | 1841,68, | 1841,69, | 1841,70, | 1841,71, | 1841,72, | 1841,73, | 1841,74, | 1841,75, | 1841,76, | 1841,77, | 1841,78, | 1841,79, | 1841,80, | 1841,81, | 1841,82, | 1841,83, | 1841,84, | 1841,85, | 1842,1, | 1842,2, | 1842,3, | 1842,4, | 1842,5, | 1842,6, | 1842,7, | 1842,8, | 1842,9, | 1842,10, | 1842,11, | 1842,12, | 1842,13, | 1842,14, | 1842,15, | 1842,16, | 1842,17, | 1842,18, | 1842,19, | 1842,20, | 1842,21, | 1842,22, | 1842,23, | 1842,24, | 1842,25, | 1842,26, | 1842,27, | 1842,28, | 1842,29, | 1842,30, | 1842,31, | 1842,32, | 1842,33, | 1842,34, | 1842,35, | 1842,36, | 1842,37, | 1842,38, | 1842,39, | 1842,40, | 1842,41, | 1842,42, | 1842,43, | 1842,44, | 1842,45, | 1842,46, | 1842,47, | 1842,48, | 1842,49, | 1842,50, | 1842,51, | 1842,52, | 1842,53, | 1842,54, | 1842,55, | 1842,56, | 1842,57, | 1842,58, | 1842,59, | 1842,60, | 1842,61, | 1842,62, | 1842,63, | 1842,64, | 1842,65, | 1842,66, | 1842,67, | 1842,68, | 1842,69, | 1842,70, | 1842,71, | 1842,72, | 1842,73, | 1842,74, | 1842,75, | 1842,76, | 1842,77, | 1842,78, | 1842,79, | 1842,80, | 1842,81, | 1842,82, | 1842,83, | 1842,84, | 1842,85, | 1843,1, | 1843,2, | 1843,3, | 1843,4, | 1843,5, | 1843,6, | 1843,7, | 1843,8, | 1843,9, | 1843,10, | 1843,11, | 1843,12, | 1843,13, | 1843,14, | 1843,15, | 1843,16, | 1843,17, | 1843,18, | 1843,19, | 1843,20, | 1843,21, | 1843,22, | 1843,23, | 1843,24, | 1843,25, | 1843,26, | 1843,27, | 1843,28, | 1843,29, | 1843,30, | 1843,31, | 1843,32, | 1843,33, | 1843,34, | 1843,35, | 1843,36, | 1843,37, | 1843,38, | 1843,39, | 1843,40, | 1843,41, | 1843,42, | 1843,43, | 1843,44, | 1843,45, | 1843,46, | 1843,47, | 1843,48, | 1843,49, | 1843,50, | 1843,51, | 1843,52, | 1843,53, | 1843,54, | 1843,55, | 1843,56, | 1843,57, | 1843,58, | 1843,59, | 1843,60, | 1843,61, | 1843,62, | 1843,63, | 1843,64, | 1843,65, | 1843,66, | 1843,67, | 1843,68, | 1843,69, | 1843,70, | 1843,71, | 1843,72, | 1843,73, | 1843,74, | 1843,75, | 1843,76, | 1843,77, | 1843,78, | 1843,79, | 1843,80, | 1843,81, | 1843,82, | 1843,83, | 1843,84, | 1843,85, | 1844,1, | 1844,2, | 1844,3, | 1844,4, | 1844,5, | 1844,6, | 1844,7, | 1844,8, | 1844,9, | 1844,10, | 1844,11, | 1844,12, | 1844,13, | 1844,14, | 1844,15, | 1844,16, | 1844,17, | 1844,18, | 1844,19, | 1844,20, | 1844,21, | 1844,22, | 1844,23, | 1844,24, | 1844,25, | 1844,26, | 1844,27, | 1844,28, | 1844,29, | 1844,30, | 1844,31, | 1844,32, | 1844,33, | 1844,34, | 1844,35, | 1844,36, | 1844,37, | 1844,38, | 1844,39, | 1844,40, | 1844,41, | 1844,42, | 1844,43, | 1844,44, | 1844,45, | 1844,46, | 1844,47, | 1844,48, | 1844,49, | 1844,50, | 1844,51, | 1844,52, | 1844,53, | 1844,54, | 1844,55, | 1844,56, | 1844,57, | 1844,58, | 1844,59, | 1844,60, | 1844,61, | 1844,62, | 1844,63, | 1844,64, | 1844,65, | 1844,66, | 1844,67, | 1844,68, | 1844,69, | 1844,70, | 1844,71, | 1844,72, | 1844,73, | 1844,74, | 1844,75, | 1844,76, | 1844,77, | 1844,78, | 1844,79, | 1844,80, | 1844,81, | 1844,82, | 1844,83, | 1844,84, | 1844,85, | 1845,1, | 1845,2, | 1845,3, | 1845,4, | 1845,5, | 1845,6, | 1845,7, | 1845,8, | 1845,9, | 1845,10, | 1845,11, | 1845,12, | 1845,13, | 1845,14, | 1845,15, | 1845,16, | 1845,17, | 1845,18, | 1845,19, | 1845,20, | 1845,21, | 1845,22, | 1845,23, | 1845,24, | 1845,25, | 1845,26, | 1845,27, | 1845,28, | 1845,29, | 1845,30, | 1845,31, | 1845,32, | 1845,33, | 1845,34, | 1845,35, | 1845,36, | 1845,37, | 1845,38, | 1845,39, | 1845,40, | 1845,41, | 1845,42, | 1845,43, | 1845,44, | 1845,45, | 1845,46, | 1845,47, | 1845,48, | 1845,49, | 1845,50, | 1845,51, | 1845,52, | 1845,53, | 1845,54, | 1845,55, | 1845,56, | 1845,57, | 1845,58, | 1845,59, | 1845,60, | 1845,61, | 1845,62, | 1845,63, | 1845,64, | 1845,65, | 1845,66, | 1845,67, | 1845,68, | 1845,69, | 1845,70, | 1845,71, | 1845,72, | 1845,73, | 1845,74, | 1845,75, | 1845,76, | 1845,77, | 1845,78, | 1845,79, | 1845,80, | 1845,81, | 1845,82, | 1845,83, | 1845,84, | 1845,85, | 1846,1, | 1846,2, | 1846,3, | 1846,4, | 1846,5, | 1846,6, | 1846,7, | 1846,8, | 1846,9, | 1846,10, | 1846,11, | 1846,12, | 1846,13, | 1846,14, | 1846,15, | 1846,16, | 1846,17, | 1846,18, | 1846,19, | 1846,20, | 1846,21, | 1846,22, | 1846,23, | 1846,24, | 1846,25, | 1846,26, | 1846,27, | 1846,28, | 1846,29, | 1846,30, | 1846,31, | 1846,32, | 1846,33, | 1846,34, | 1846,35, | 1846,36, | 1846,37, | 1846,38, | 1846,39, | 1846,40, | 1846,41, | 1846,42, | 1846,43, | 1846,44, | 1846,45, | 1846,46, | 1846,47, | 1846,48, | 1846,49, | 1846,50, | 1846,51, | 1846,52, | 1846,53, | 1846,54, | 1846,55, | 1846,56, | 1846,57, | 1846,58, | 1846,59, | 1846,60, | 1846,61, | 1846,62, | 1846,63, | 1846,64, | 1846,65, | 1846,66, | 1846,67, | 1846,68, | 1846,69, | 1846,70, | 1846,71, | 1846,72, | 1846,73, | 1846,74, | 1846,75, | 1846,76, | 1846,77, | 1846,78, | 1846,79, | 1846,80, | 1846,81, | 1846,82, | 1846,83, | 1846,84, | 1846,85, | 1847,1, | 1847,2, | 1847,3, | 1847,4, | 1847,5, | 1847,6, | 1847,7, | 1847,8, | 1847,9, | 1847,10, | 1847,11, | 1847,12, | 1847,13, | 1847,14, | 1847,15, | 1847,16, | 1847,17, | 1847,18, | 1847,19, | 1847,20, | 1847,21, | 1847,22, | 1847,23, | 1847,24, | 1847,25, | 1847,26, | 1847,27, | 1847,28, | 1847,29, | 1847,30, | 1847,31, | 1847,32, | 1847,33, | 1847,34, | 1847,35, | 1847,36, | 1847,37, | 1847,38, | 1847,39, | 1847,40, | 1847,41, | 1847,42, | 1847,43, | 1847,44, | 1847,45, | 1847,46, | 1847,47, | 1847,48, | 1847,49, | 1847,50, | 1847,51, | 1847,52, | 1847,53, | 1847,54, | 1847,55, | 1847,56, | 1847,57, | 1847,58, | 1847,59, | 1847,60, | 1847,61, | 1847,62, | 1847,63, | 1847,64, | 1847,65, | 1847,66, | 1847,67, | 1847,68, | 1847,69, | 1847,70, | 1847,71, | 1847,72, | 1847,73, | 1847,74, | 1847,75, | 1847,76, | 1847,77, | 1847,78, | 1847,79, | 1847,80, | 1847,81, | 1847,82, | 1847,83, | 1847,84, | 1847,85, | 1848,1, | 1848,2, | 1848,3, | 1848,4, | 1848,5, | 1848,6, | 1848,7, | 1848,8, | 1848,9, | 1848,10, | 1848,11, | 1848,12, | 1848,13, | 1848,14, | 1848,15, | 1848,16, | 1848,17, | 1848,18, | 1848,19, | 1848,20, | 1848,21, | 1848,22, | 1848,23, | 1848,24, | 1848,25, | 1848,26, | 1848,27, | 1848,28, | 1848,29, | 1848,30, | 1848,31, | 1848,32, | 1848,33, | 1848,34, | 1848,35, | 1848,36, | 1848,37, | 1848,38, | 1848,39, | 1848,40, | 1848,41, | 1848,42, | 1848,43, | 1848,44, | 1848,45, | 1848,46, | 1848,47, | 1848,48, | 1848,49, | 1848,50, | 1848,51, | 1848,52, | 1848,53, | 1848,54, | 1848,55, | 1848,56, | 1848,57, | 1848,58, | 1848,59, | 1848,60, | 1848,61, | 1848,62, | 1848,63, | 1848,64, | 1848,65, | 1848,66, | 1848,67, | 1848,68, | 1848,69, | 1848,70, | 1848,71, | 1848,72, | 1848,73, | 1848,74, | 1848,75, | 1848,76, | 1848,77, | 1848,78, | 1848,79, | 1848,80, | 1848,81, | 1848,82, | 1848,83, | 1848,84, | 1848,85, | 1849,1, | 1849,2, | 1849,3, | 1849,4, | 1849,5, | 1849,6, | 1849,7, | 1849,8, | 1849,9, | 1849,10, | 1849,11, | 1849,12, | 1849,13, | 1849,14, | 1849,15, | 1849,16, | 1849,17, | 1849,18, | 1849,19, | 1849,20, | 1849,21, | 1849,22, | 1849,23, | 1849,24, | 1849,25, | 1849,26, | 1849,27, | 1849,28, | 1849,29, | 1849,30, | 1849,31, | 1849,32, | 1849,33, | 1849,34, | 1849,35, | 1849,36, | 1849,37, | 1849,38, | 1849,39, | 1849,40, | 1849,41, | 1849,42, | 1849,43, | 1849,44, | 1849,45, | 1849,46, | 1849,47, | 1849,48, | 1849,49, | 1849,50, | 1849,51, | 1849,52, | 1849,53, | 1849,54, | 1849,55, | 1849,56, | 1849,57, | 1849,58, | 1849,59, | 1849,60, | 1849,61, | 1849,62, | 1849,63, | 1849,64, | 1849,65, | 1849,66, | 1849,67, | 1849,68, | 1849,69, | 1849,70, | 1849,71, | 1849,72, | 1849,73, | 1849,74, | 1849,75, | 1849,76, | 1849,77, | 1849,78, | 1849,79, | 1849,80, | 1849,81, | 1849,82, | 1849,83, | 1849,84, | 1849,85, | 1850,1, | 1850,2, | 1850,3, | 1850,4, | 1850,5, | 1850,6, | 1850,7, | 1850,8, | 1850,9, | 1850,10, | 1850,11, | 1850,12, | 1850,13, | 1850,14, | 1850,15, | 1850,16, | 1850,17, | 1850,18, | 1850,19, | 1850,20, | 1850,21, | 1850,22, | 1850,23, | 1850,24, | 1850,25, | 1850,26, | 1850,27, | 1850,28, | 1850,29, | 1850,30, | 1850,31, | 1850,32, | 1850,33, | 1850,34, | 1850,35, | 1850,36, | 1850,37, | 1850,38, | 1850,39, | 1850,40, | 1850,41, | 1850,42, | 1850,43, | 1850,44, | 1850,45, | 1850,46, | 1850,47, | 1850,48, | 1850,49, | 1850,50, | 1850,51, | 1850,52, | 1850,53, | 1850,54, | 1850,55, | 1850,56, | 1850,57, | 1850,58, | 1850,59, | 1850,60, | 1850,61, | 1850,62, | 1850,63, | 1850,64, | 1850,65, | 1850,66, | 1850,67, | 1850,68, | 1850,69, | 1850,70, | 1850,71, | 1850,72, | 1850,73, | 1850,74, | 1850,75, | 1850,76, | 1850,77, | 1850,78, | 1850,79, | 1850,80, | 1850,81, | 1850,82, | 1850,83, | 1850,84, | 1850,85, | 1851,1, | 1851,2, | 1851,3, | 1851,4, | 1851,5, | 1851,6, | 1851,7, | 1851,8, | 1851,9, | 1851,10, | 1851,11, | 1851,12, | 1851,13, | 1851,14, | 1851,15, | 1851,16, | 1851,17, | 1851,18, | 1851,19, | 1851,20, | 1851,21, | 1851,22, | 1851,23, | 1851,24, | 1851,25, | 1851,26, | 1851,27, | 1851,28, | 1851,29, | 1851,30, | 1851,31, | 1851,32, | 1851,33, | 1851,34, | 1851,35, | 1851,36, | 1851,37, | 1851,38, | 1851,39, | 1851,40, | 1851,41, | 1851,42, | 1851,43, | 1851,44, | 1851,45, | 1851,46, | 1851,47, | 1851,48, | 1851,49, | 1851,50, | 1851,51, | 1851,52, | 1851,53, | 1851,54, | 1851,55, | 1851,56, | 1851,57, | 1851,58, | 1851,59, | 1851,60, | 1851,61, | 1851,62, | 1851,63, | 1851,64, | 1851,65, | 1851,66, | 1851,67, | 1851,68, | 1851,69, | 1851,70, | 1851,71, | 1851,72, | 1851,73, | 1851,74, | 1851,75, | 1851,76, | 1851,77, | 1851,78, | 1851,79, | 1851,80, | 1851,81, | 1851,82, | 1851,83, | 1851,84, | 1851,85, | 1852,1, | 1852,2, | 1852,3, | 1852,4, | 1852,5, | 1852,6, | 1852,7, | 1852,8, | 1852,9, | 1852,10, | 1852,11, | 1852,12, | 1852,13, | 1852,14, | 1852,15, | 1852,16, | 1852,17, | 1852,18, | 1852,19, | 1852,20, | 1852,21, | 1852,22, | 1852,23, | 1852,24, | 1852,25, | 1852,26, | 1852,27, | 1852,28, | 1852,29, | 1852,30, | 1852,31, | 1852,32, | 1852,33, | 1852,34, | 1852,35, | 1852,36, | 1852,37, | 1852,38, | 1852,39, | 1852,40, | 1852,41, | 1852,42, | 1852,43, | 1852,44, | 1852,45, | 1852,46, | 1852,47, | 1852,48, | 1852,49, | 1852,50, | 1852,51, | 1852,52, | 1852,53, | 1852,54, | 1852,55, | 1852,56, | 1852,57, | 1852,58, | 1852,59, | 1852,60, | 1852,61, | 1852,62, | 1852,63, | 1852,64, | 1852,65, | 1852,66, | 1852,67, | 1852,68, | 1852,69, | 1852,70, | 1852,71, | 1852,72, | 1852,73, | 1852,74, | 1852,75, | 1852,76, | 1852,77, | 1852,78, | 1852,79, | 1852,80, | 1852,81, | 1852,82, | 1852,83, | 1852,84, | 1852,85, | 1853,1, | 1853,2, | 1853,3, | 1853,4, | 1853,5, | 1853,6, | 1853,7, | 1853,8, | 1853,9, | 1853,10, | 1853,11, | 1853,12, | 1853,13, | 1853,14, | 1853,15, | 1853,16, | 1853,17, | 1853,18, | 1853,19, | 1853,20, | 1853,21, | 1853,22, | 1853,23, | 1853,24, | 1853,25, | 1853,26, | 1853,27, | 1853,28, | 1853,29, | 1853,30, | 1853,31, | 1853,32, | 1853,33, | 1853,34, | 1853,35, | 1853,36, | 1853,37, | 1853,38, | 1853,39, | 1853,40, | 1853,41, | 1853,42, | 1853,43, | 1853,44, | 1853,45, | 1853,46, | 1853,47, | 1853,48, | 1853,49, | 1853,50, | 1853,51, | 1853,52, | 1853,53, | 1853,54, | 1853,55, | 1853,56, | 1853,57, | 1853,58, | 1853,59, | 1853,60, | 1853,61, | 1853,62, | 1853,63, | 1853,64, | 1853,65, | 1853,66, | 1853,67, | 1853,68, | 1853,69, | 1853,70, | 1853,71, | 1853,72, | 1853,73, | 1853,74, | 1853,75, | 1853,76, | 1853,77, | 1853,78, | 1853,79, | 1853,80, | 1853,81, | 1853,82, | 1853,83, | 1853,84, | 1853,85, | 1854,1, | 1854,2, | 1854,3, | 1854,4, | 1854,5, | 1854,6, | 1854,7, | 1854,8, | 1854,9, | 1854,10, | 1854,11, | 1854,12, | 1854,13, | 1854,14, | 1854,15, | 1854,16, | 1854,17, | 1854,18, | 1854,19, | 1854,20, | 1854,21, | 1854,22, | 1854,23, | 1854,24, | 1854,25, | 1854,26, | 1854,27, | 1854,28, | 1854,29, | 1854,30, | 1854,31, | 1854,32, | 1854,33, | 1854,34, | 1854,35, | 1854,36, | 1854,37, | 1854,38, | 1854,39, | 1854,40, | 1854,41, | 1854,42, | 1854,43, | 1854,44, | 1854,45, | 1854,46, | 1854,47, | 1854,48, | 1854,49, | 1854,50, | 1854,51, | 1854,52, | 1854,53, | 1854,54, | 1854,55, | 1854,56, | 1854,57, | 1854,58, | 1854,59, | 1854,60, | 1854,61, | 1854,62, | 1854,63, | 1854,64, | 1854,65, | 1854,66, | 1854,67, | 1854,68, | 1854,69, | 1854,70, | 1854,71, | 1854,72, | 1854,73, | 1854,74, | 1854,75, | 1854,76, | 1854,77, | 1854,78, | 1854,79, | 1854,80, | 1854,81, | 1854,82, | 1854,83, | 1854,84, | 1854,85, | 1855,1, | 1855,2, | 1855,3, | 1855,4, | 1855,5, | 1855,6, | 1855,7, | 1855,8, | 1855,9, | 1855,10, | 1855,11, | 1855,12, | 1855,13, | 1855,14, | 1855,15, | 1855,16, | 1855,17, | 1855,18, | 1855,19, | 1855,20, | 1855,21, | 1855,22, | 1855,23, | 1855,24, | 1855,25, | 1855,26, | 1855,27, | 1855,28, | 1855,29, | 1855,30, | 1855,31, | 1855,32, | 1855,33, | 1855,34, | 1855,35, | 1855,36, | 1855,37, | 1855,38, | 1855,39, | 1855,40, | 1855,41, | 1855,42, | 1855,43, | 1855,44, | 1855,45, | 1855,46, | 1855,47, | 1855,48, | 1855,49, | 1855,50, | 1855,51, | 1855,52, | 1855,53, | 1855,54, | 1855,55, | 1855,56, | 1855,57, | 1855,58, | 1855,59, | 1855,60, | 1855,61, | 1855,62, | 1855,63, | 1855,64, | 1855,65, | 1855,66, | 1855,67, | 1855,68, | 1855,69, | 1855,70, | 1855,71, | 1855,72, | 1855,73, | 1855,74, | 1855,75, | 1855,76, | 1855,77, | 1855,78, | 1855,79, | 1855,80, | 1855,81, | 1855,82, | 1855,83, | 1855,84, | 1855,85, | 1856,1, | 1856,2, | 1856,3, | 1856,4, | 1856,5, | 1856,6, | 1856,7, | 1856,8, | 1856,9, | 1856,10, | 1856,11, | 1856,12, | 1856,13, | 1856,14, | 1856,15, | 1856,16, | 1856,17, | 1856,18, | 1856,19, | 1856,20, | 1856,21, | 1856,22, | 1856,23, | 1856,24, | 1856,25, | 1856,26, | 1856,27, | 1856,28, | 1856,29, | 1856,30, | 1856,31, | 1856,32, | 1856,33, | 1856,34, | 1856,35, | 1856,36, | 1856,37, | 1856,38, | 1856,39, | 1856,40, | 1856,41, | 1856,42, | 1856,43, | 1856,44, | 1856,45, | 1856,46, | 1856,47, | 1856,48, | 1856,49, | 1856,50, | 1856,51, | 1856,52, | 1856,53, | 1856,54, | 1856,55, | 1856,56, | 1856,57, | 1856,58, | 1856,59, | 1856,60, | 1856,61, | 1856,62, | 1856,63, | 1856,64, | 1856,65, | 1856,66, | 1856,67, | 1856,68, | 1856,69, | 1856,70, | 1856,71, | 1856,72, | 1856,73, | 1856,74, | 1856,75, | 1856,76, | 1856,77, | 1856,78, | 1856,79, | 1856,80, | 1856,81, | 1856,82, | 1856,83, | 1856,84, | 1856,85, | 1857,1, | 1857,2, | 1857,3, | 1857,4, | 1857,5, | 1857,6, | 1857,7, | 1857,8, | 1857,9, | 1857,10, | 1857,11, | 1857,12, | 1857,13, | 1857,14, | 1857,15, | 1857,16, | 1857,17, | 1857,18, | 1857,19, | 1857,20, | 1857,21, | 1857,22, | 1857,23, | 1857,24, | 1857,25, | 1857,26, | 1857,27, | 1857,28, | 1857,29, | 1857,30, | 1857,31, | 1857,32, | 1857,33, | 1857,34, | 1857,35, | 1857,36, | 1857,37, | 1857,38, | 1857,39, | 1857,40, | 1857,41, | 1857,42, | 1857,43, | 1857,44, | 1857,45, | 1857,46, | 1857,47, | 1857,48, | 1857,49, | 1857,50, | 1857,51, | 1857,52, | 1857,53, | 1857,54, | 1857,55, | 1857,56, | 1857,57, | 1857,58, | 1857,59, | 1857,60, | 1857,61, | 1857,62, | 1857,63, | 1857,64, | 1857,65, | 1857,66, | 1857,67, | 1857,68, | 1857,69, | 1857,70, | 1857,71, | 1857,72, | 1857,73, | 1857,74, | 1857,75, | 1857,76, | 1857,77, | 1857,78, | 1857,79, | 1857,80, | 1857,81, | 1857,82, | 1857,83, | 1857,84, | 1857,85, | 1858,1, | 1858,2, | 1858,3, | 1858,4, | 1858,5, | 1858,6, | 1858,7, | 1858,8, | 1858,9, | 1858,10, | 1858,11, | 1858,12, | 1858,13, | 1858,14, | 1858,15, | 1858,16, | 1858,17, | 1858,18, | 1858,19, | 1858,20, | 1858,21, | 1858,22, | 1858,23, | 1858,24, | 1858,25, | 1858,26, | 1858,27, | 1858,28, | 1858,29, | 1858,30, | 1858,31, | 1858,32, | 1858,33, | 1858,34, | 1858,35, | 1858,36, | 1858,37, | 1858,38, | 1858,39, | 1858,40, | 1858,41, | 1858,42, | 1858,43, | 1858,44, | 1858,45, | 1858,46, | 1858,47, | 1858,48, | 1858,49, | 1858,50, | 1858,51, | 1858,52, | 1858,53, | 1858,54, | 1858,55, | 1858,56, | 1858,57, | 1858,58, | 1858,59, | 1858,60, | 1858,61, | 1858,62, | 1858,63, | 1858,64, | 1858,65, | 1858,66, | 1858,67, | 1858,68, | 1858,69, | 1858,70, | 1858,71, | 1858,72, | 1858,73, | 1858,74, | 1858,75, | 1858,76, | 1858,77, | 1858,78, | 1858,79, | 1858,80, | 1858,81, | 1858,82, | 1858,83, | 1858,84, | 1858,85, | 1859,1, | 1859,2, | 1859,3, | 1859,4, | 1859,5, | 1859,6, | 1859,7, | 1859,8, | 1859,9, | 1859,10, | 1859,11, | 1859,12, | 1859,13, | 1859,14, | 1859,15, | 1859,16, | 1859,17, | 1859,18, | 1859,19, | 1859,20, | 1859,21, | 1859,22, | 1859,23, | 1859,24, | 1859,25, | 1859,26, | 1859,27, | 1859,28, | 1859,29, | 1859,30, | 1859,31, | 1859,32, | 1859,33, | 1859,34, | 1859,35, | 1859,36, | 1859,37, | 1859,38, | 1859,39, | 1859,40, | 1859,41, | 1859,42, | 1859,43, | 1859,44, | 1859,45, | 1859,46, | 1859,47, | 1859,48, | 1859,49, | 1859,50, | 1859,51, | 1859,52, | 1859,53, | 1859,54, | 1859,55, | 1859,56, | 1859,57, | 1859,58, | 1859,59, | 1859,60, | 1859,61, | 1859,62, | 1859,63, | 1859,64, | 1859,65, | 1859,66, | 1859,67, | 1859,68, | 1859,69, | 1859,70, | 1859,71, | 1859,72, | 1859,73, | 1859,74, | 1859,75, | 1859,76, | 1859,77, | 1859,78, | 1859,79, | 1859,80, | 1859,81, | 1859,82, | 1859,83, | 1859,84, | 1859,85, | 1860,1, | 1860,2, | 1860,3, | 1860,4, | 1860,5, | 1860,6, | 1860,7, | 1860,8, | 1860,9, | 1860,10, | 1860,11, | 1860,12, | 1860,13, | 1860,14, | 1860,15, | 1860,16, | 1860,17, | 1860,18, | 1860,19, | 1860,20, | 1860,21, | 1860,22, | 1860,23, | 1860,24, | 1860,25, | 1860,26, | 1860,27, | 1860,28, | 1860,29, | 1860,30, | 1860,31, | 1860,32, | 1860,33, | 1860,34, | 1860,35, | 1860,36, | 1860,37, | 1860,38, | 1860,39, | 1860,40, | 1860,41, | 1860,42, | 1860,43, | 1860,44, | 1860,45, | 1860,46, | 1860,47, | 1860,48, | 1860,49, | 1860,50, | 1860,51, | 1860,52, | 1860,53, | 1860,54, | 1860,55, | 1860,56, | 1860,57, | 1860,58, | 1860,59, | 1860,60, | 1860,61, | 1860,62, | 1860,63, | 1860,64, | 1860,65, | 1860,66, | 1860,67, | 1860,68, | 1860,69, | 1860,70, | 1860,71, | 1860,72, | 1860,73, | 1860,74, | 1860,75, | 1860,76, | 1860,77, | 1860,78, | 1860,79, | 1860,80, | 1860,81, | 1860,82, | 1860,83, | 1860,84, | 1860,85, | 1861,1, | 1861,2, | 1861,3, | 1861,4, | 1861,5, | 1861,6, | 1861,7, | 1861,8, | 1861,9, | 1861,10, | 1861,11, | 1861,12, | 1861,13, | 1861,14, | 1861,15, | 1861,16, | 1861,17, | 1861,18, | 1861,19, | 1861,20, | 1861,21, | 1861,22, | 1861,23, | 1861,24, | 1861,25, | 1861,26, | 1861,27, | 1861,28, | 1861,29, | 1861,30, | 1861,31, | 1861,32, | 1861,33, | 1861,34, | 1861,35, | 1861,36, | 1861,37, | 1861,38, | 1861,39, | 1861,40, | 1861,41, | 1861,42, | 1861,43, | 1861,44, | 1861,45, | 1861,46, | 1861,47, | 1861,48, | 1861,49, | 1861,50, | 1861,51, | 1861,52, | 1861,53, | 1861,54, | 1861,55, | 1861,56, | 1861,57, | 1861,58, | 1861,59, | 1861,60, | 1861,61, | 1861,62, | 1861,63, | 1861,64, | 1861,65, | 1861,66, | 1861,67, | 1861,68, | 1861,69, | 1861,70, | 1861,71, | 1861,72, | 1861,73, | 1861,74, | 1861,75, | 1861,76, | 1861,77, | 1861,78, | 1861,79, | 1861,80, | 1861,81, | 1861,82, | 1861,83, | 1861,84, | 1861,85, | 1862,1, | 1862,2, | 1862,3, | 1862,4, | 1862,5, | 1862,6, | 1862,7, | 1862,8, | 1862,9, | 1862,10, | 1862,11, | 1862,12, | 1862,13, | 1862,14, | 1862,15, | 1862,16, | 1862,17, | 1862,18, | 1862,19, | 1862,20, | 1862,21, | 1862,22, | 1862,23, | 1862,24, | 1862,25, | 1862,26, | 1862,27, | 1862,28, | 1862,29, | 1862,30, | 1862,31, | 1862,32, | 1862,33, | 1862,34, | 1862,35, | 1862,36, | 1862,37, | 1862,38, | 1862,39, | 1862,40, | 1862,41, | 1862,42, | 1862,43, | 1862,44, | 1862,45, | 1862,46, | 1862,47, | 1862,48, | 1862,49, | 1862,50, | 1862,51, | 1862,52, | 1862,53, | 1862,54, | 1862,55, | 1862,56, | 1862,57, | 1862,58, | 1862,59, | 1862,60, | 1862,61, | 1862,62, | 1862,63, | 1862,64, | 1862,65, | 1862,66, | 1862,67, | 1862,68, | 1862,69, | 1862,70, | 1862,71, | 1862,72, | 1862,73, | 1862,74, | 1862,75, | 1862,76, | 1862,77, | 1862,78, | 1862,79, | 1862,80, | 1862,81, | 1862,82, | 1862,83, | 1862,84, | 1862,85, | 1863,1, | 1863,2, | 1863,3, | 1863,4, | 1863,5, | 1863,6, | 1863,7, | 1863,8, | 1863,9, | 1863,10, | 1863,11, | 1863,12, | 1863,13, | 1863,14, | 1863,15, | 1863,16, | 1863,17, | 1863,18, | 1863,19, | 1863,20, | 1863,21, | 1863,22, | 1863,23, | 1863,24, | 1863,25, | 1863,26, | 1863,27, | 1863,28, | 1863,29, | 1863,30, | 1863,31, | 1863,32, | 1863,33, | 1863,34, | 1863,35, | 1863,36, | 1863,37, | 1863,38, | 1863,39, | 1863,40, | 1863,41, | 1863,42, | 1863,43, | 1863,44, | 1863,45, | 1863,46, | 1863,47, | 1863,48, | 1863,49, | 1863,50, | 1863,51, | 1863,52, | 1863,53, | 1863,54, | 1863,55, | 1863,56, | 1863,57, | 1863,58, | 1863,59, | 1863,60, | 1863,61, | 1863,62, | 1863,63, | 1863,64, | 1863,65, | 1863,66, | 1863,67, | 1863,68, | 1863,69, | 1863,70, | 1863,71, | 1863,72, | 1863,73, | 1863,74, | 1863,75, | 1863,76, | 1863,77, | 1863,78, | 1863,79, | 1863,80, | 1863,81, | 1863,82, | 1863,83, | 1863,84, | 1863,85, | 1864,1, | 1864,2, | 1864,3, | 1864,4, | 1864,5, | 1864,6, | 1864,7, | 1864,8, | 1864,9, | 1864,10, | 1864,11, | 1864,12, | 1864,13, | 1864,14, | 1864,15, | 1864,16, | 1864,17, | 1864,18, | 1864,19, | 1864,20, | 1864,21, | 1864,22, | 1864,23, | 1864,24, | 1864,25, | 1864,26, | 1864,27, | 1864,28, | 1864,29, | 1864,30, | 1864,31, | 1864,32, | 1864,33, | 1864,34, | 1864,35, | 1864,36, | 1864,37, | 1864,38, | 1864,39, | 1864,40, | 1864,41, | 1864,42, | 1864,43, | 1864,44, | 1864,45, | 1864,46, | 1864,47, | 1864,48, | 1864,49, | 1864,50, | 1864,51, | 1864,52, | 1864,53, | 1864,54, | 1864,55, | 1864,56, | 1864,57, | 1864,58, | 1864,59, | 1864,60, | 1864,61, | 1864,62, | 1864,63, | 1864,64, | 1864,65, | 1864,66, | 1864,67, | 1864,68, | 1864,69, | 1864,70, | 1864,71, | 1864,72, | 1864,73, | 1864,74, | 1864,75, | 1864,76, | 1864,77, | 1864,78, | 1864,79, | 1864,80, | 1864,81, | 1864,82, | 1864,83, | 1864,84, | 1864,85, | 1865,1, | 1865,2, | 1865,3, | 1865,4, | 1865,5, | 1865,6, | 1865,7, | 1865,8, | 1865,9, | 1865,10, | 1865,11, | 1865,12, | 1865,13, | 1865,14, | 1865,15, | 1865,16, | 1865,17, | 1865,18, | 1865,19, | 1865,20, | 1865,21, | 1865,22, | 1865,23, | 1865,24, | 1865,25, | 1865,26, | 1865,27, | 1865,28, | 1865,29, | 1865,30, | 1865,31, | 1865,32, | 1865,33, | 1865,34, | 1865,35, | 1865,36, | 1865,37, | 1865,38, | 1865,39, | 1865,40, | 1865,41, | 1865,42, | 1865,43, | 1865,44, | 1865,45, | 1865,46, | 1865,47, | 1865,48, | 1865,49, | 1865,50, | 1865,51, | 1865,52, | 1865,53, | 1865,54, | 1865,55, | 1865,56, | 1865,57, | 1865,58, | 1865,59, | 1865,60, | 1865,61, | 1865,62, | 1865,63, | 1865,64, | 1865,65, | 1865,66, | 1865,67, | 1865,68, | 1865,69, | 1865,70, | 1865,71, | 1865,72, | 1865,73, | 1865,74, | 1865,75, | 1865,76, | 1865,77, | 1865,78, | 1865,79, | 1865,80, | 1865,81, | 1865,82, | 1865,83, | 1865,84, | 1865,85, | 1866,1, | 1866,2, | 1866,3, | 1866,4, | 1866,5, | 1866,6, | 1866,7, | 1866,8, | 1866,9, | 1866,10, | 1866,11, | 1866,12, | 1866,13, | 1866,14, | 1866,15, | 1866,16, | 1866,17, | 1866,18, | 1866,19, | 1866,20, | 1866,21, | 1866,22, | 1866,23, | 1866,24, | 1866,25, | 1866,26, | 1866,27, | 1866,28, | 1866,29, | 1866,30, | 1866,31, | 1866,32, | 1866,33, | 1866,34, | 1866,35, | 1866,36, | 1866,37, | 1866,38, | 1866,39, | 1866,40, | 1866,41, | 1866,42, | 1866,43, | 1866,44, | 1866,45, | 1866,46, | 1866,47, | 1866,48, | 1866,49, | 1866,50, | 1866,51, | 1866,52, | 1866,53, | 1866,54, | 1866,55, | 1866,56, | 1866,57, | 1866,58, | 1866,59, | 1866,60, | 1866,61, | 1866,62, | 1866,63, | 1866,64, | 1866,65, | 1866,66, | 1866,67, | 1866,68, | 1866,69, | 1866,70, | 1866,71, | 1866,72, | 1866,73, | 1866,74, | 1866,75, | 1866,76, | 1866,77, | 1866,78, | 1866,79, | 1866,80, | 1866,81, | 1866,82, | 1866,83, | 1866,84, | 1866,85, | 1867,1, | 1867,2, | 1867,3, | 1867,4, | 1867,5, | 1867,6, | 1867,7, | 1867,8, | 1867,9, | 1867,10, | 1867,11, | 1867,12, | 1867,13, | 1867,14, | 1867,15, | 1867,16, | 1867,17, | 1867,18, | 1867,19, | 1867,20, | 1867,21, | 1867,22, | 1867,23, | 1867,24, | 1867,25, | 1867,26, | 1867,27, | 1867,28, | 1867,29, | 1867,30, | 1867,31, | 1867,32, | 1867,33, | 1867,34, | 1867,35, | 1867,36, | 1867,37, | 1867,38, | 1867,39, | 1867,40, | 1867,41, | 1867,42, | 1867,43, | 1867,44, | 1867,45, | 1867,46, | 1867,47, | 1867,48, | 1867,49, | 1867,50, | 1867,51, | 1867,52, | 1867,53, | 1867,54, | 1867,55, | 1867,56, | 1867,57, | 1867,58, | 1867,59, | 1867,60, | 1867,61, | 1867,62, | 1867,63, | 1867,64, | 1867,65, | 1867,66, | 1867,67, | 1867,68, | 1867,69, | 1867,70, | 1867,71, | 1867,72, | 1867,73, | 1867,74, | 1867,75, | 1867,76, | 1867,77, | 1867,78, | 1867,79, | 1867,80, | 1867,81, | 1867,82, | 1867,83, | 1867,84, | 1867,85, | 1868,1, | 1868,2, | 1868,3, | 1868,4, | 1868,5, | 1868,6, | 1868,7, | 1868,8, | 1868,9, | 1868,10, | 1868,11, | 1868,12, | 1868,13, | 1868,14, | 1868,15, | 1868,16, | 1868,17, | 1868,18, | 1868,19, | 1868,20, | 1868,21, | 1868,22, | 1868,23, | 1868,24, | 1868,25, | 1868,26, | 1868,27, | 1868,28, | 1868,29, | 1868,30, | 1868,31, | 1868,32, | 1868,33, | 1868,34, | 1868,35, | 1868,36, | 1868,37, | 1868,38, | 1868,39, | 1868,40, | 1868,41, | 1868,42, | 1868,43, | 1868,44, | 1868,45, | 1868,46, | 1868,47, | 1868,48, | 1868,49, | 1868,50, | 1868,51, | 1868,52, | 1868,53, | 1868,54, | 1868,55, | 1868,56, | 1868,57, | 1868,58, | 1868,59, | 1868,60, | 1868,61, | 1868,62, | 1868,63, | 1868,64, | 1868,65, | 1868,66, | 1868,67, | 1868,68, | 1868,69, | 1868,70, | 1868,71, | 1868,72, | 1868,73, | 1868,74, | 1868,75, | 1868,76, | 1868,77, | 1868,78, | 1868,79, | 1868,80, | 1868,81, | 1868,82, | 1868,83, | 1868,84, | 1868,85, | 1869,1, | 1869,2, | 1869,3, | 1869,4, | 1869,5, | 1869,6, | 1869,7, | 1869,8, | 1869,9, | 1869,10, | 1869,11, | 1869,12, | 1869,13, | 1869,14, | 1869,15, | 1869,16, | 1869,17, | 1869,18, | 1869,19, | 1869,20, | 1869,21, | 1869,22, | 1869,23, | 1869,24, | 1869,25, | 1869,26, | 1869,27, | 1869,28, | 1869,29, | 1869,30, | 1869,31, | 1869,32, | 1869,33, | 1869,34, | 1869,35, | 1869,36, | 1869,37, | 1869,38, | 1869,39, | 1869,40, | 1869,41, | 1869,42, | 1869,43, | 1869,44, | 1869,45, | 1869,46, | 1869,47, | 1869,48, | 1869,49, | 1869,50, | 1869,51, | 1869,52, | 1869,53, | 1869,54, | 1869,55, | 1869,56, | 1869,57, | 1869,58, | 1869,59, | 1869,60, | 1869,61, | 1869,62, | 1869,63, | 1869,64, | 1869,65, | 1869,66, | 1869,67, | 1869,68, | 1869,69, | 1869,70, | 1869,71, | 1869,72, | 1869,73, | 1869,74, | 1869,75, | 1869,76, | 1869,77, | 1869,78, | 1869,79, | 1869,80, | 1869,81, | 1869,82, | 1869,83, | 1869,84, | 1869,85, | 1870,1, | 1870,2, | 1870,3, | 1870,4, | 1870,5, | 1870,6, | 1870,7, | 1870,8, | 1870,9, | 1870,10, | 1870,11, | 1870,12, | 1870,13, | 1870,14, | 1870,15, | 1870,16, | 1870,17, | 1870,18, | 1870,19, | 1870,20, | 1870,21, | 1870,22, | 1870,23, | 1870,24, | 1870,25, | 1870,26, | 1870,27, | 1870,28, | 1870,29, | 1870,30, | 1870,31, | 1870,32, | 1870,33, | 1870,34, | 1870,35, | 1870,36, | 1870,37, | 1870,38, | 1870,39, | 1870,40, | 1870,41, | 1870,42, | 1870,43, | 1870,44, | 1870,45, | 1870,46, | 1870,47, | 1870,48, | 1870,49, | 1870,50, | 1870,51, | 1870,52, | 1870,53, | 1870,54, | 1870,55, | 1870,56, | 1870,57, | 1870,58, | 1870,59, | 1870,60, | 1870,61, | 1870,62, | 1870,63, | 1870,64, | 1870,65, | 1870,66, | 1870,67, | 1870,68, | 1870,69, | 1870,70, | 1870,71, | 1870,72, | 1870,73, | 1870,74, | 1870,75, | 1870,76, | 1870,77, | 1870,78, | 1870,79, | 1870,80, | 1870,81, | 1870,82, | 1870,83, | 1870,84, | 1870,85, | 1871,1, | 1871,2, | 1871,3, | 1871,4, | 1871,5, | 1871,6, | 1871,7, | 1871,8, | 1871,9, | 1871,10, | 1871,11, | 1871,12, | 1871,13, | 1871,14, | 1871,15, | 1871,16, | 1871,17, | 1871,18, | 1871,19, | 1871,20, | 1871,21, | 1871,22, | 1871,23, | 1871,24, | 1871,25, | 1871,26, | 1871,27, | 1871,28, | 1871,29, | 1871,30, | 1871,31, | 1871,32, | 1871,33, | 1871,34, | 1871,35, | 1871,36, | 1871,37, | 1871,38, | 1871,39, | 1871,40, | 1871,41, | 1871,42, | 1871,43, | 1871,44, | 1871,45, | 1871,46, | 1871,47, | 1871,48, | 1871,49, | 1871,50, | 1871,51, | 1871,52, | 1871,53, | 1871,54, | 1871,55, | 1871,56, | 1871,57, | 1871,58, | 1871,59, | 1871,60, | 1871,61, | 1871,62, | 1871,63, | 1871,64, | 1871,65, | 1871,66, | 1871,67, | 1871,68, | 1871,69, | 1871,70, | 1871,71, | 1871,72, | 1871,73, | 1871,74, | 1871,75, | 1871,76, | 1871,77, | 1871,78, | 1871,79, | 1871,80, | 1871,81, | 1871,82, | 1871,83, | 1871,84, | 1871,85, | 1872,1, | 1872,2, | 1872,3, | 1872,4, | 1872,5, | 1872,6, | 1872,7, | 1872,8, | 1872,9, | 1872,10, | 1872,11, | 1872,12, | 1872,13, | 1872,14, | 1872,15, | 1872,16, | 1872,17, | 1872,18, | 1872,19, | 1872,20, | 1872,21, | 1872,22, | 1872,23, | 1872,24, | 1872,25, | 1872,26, | 1872,27, | 1872,28, | 1872,29, | 1872,30, | 1872,31, | 1872,32, | 1872,33, | 1872,34, | 1872,35, | 1872,36, | 1872,37, | 1872,38, | 1872,39, | 1872,40, | 1872,41, | 1872,42, | 1872,43, | 1872,44, | 1872,45, | 1872,46, | 1872,47, | 1872,48, | 1872,49, | 1872,50, | 1872,51, | 1872,52, | 1872,53, | 1872,54, | 1872,55, | 1872,56, | 1872,57, | 1872,58, | 1872,59, | 1872,60, | 1872,61, | 1872,62, | 1872,63, | 1872,64, | 1872,65, | 1872,66, | 1872,67, | 1872,68, | 1872,69, | 1872,70, | 1872,71, | 1872,72, | 1872,73, | 1872,74, | 1872,75, | 1872,76, | 1872,77, | 1872,78, | 1872,79, | 1872,80, | 1872,81, | 1872,82, | 1872,83, | 1872,84, | 1872,85, | 1873,1, | 1873,2, | 1873,3, | 1873,4, | 1873,5, | 1873,6, | 1873,7, | 1873,8, | 1873,9, | 1873,10, | 1873,11, | 1873,12, | 1873,13, | 1873,14, | 1873,15, | 1873,16, | 1873,17, | 1873,18, | 1873,19, | 1873,20, | 1873,21, | 1873,22, | 1873,23, | 1873,24, | 1873,25, | 1873,26, | 1873,27, | 1873,28, | 1873,29, | 1873,30, | 1873,31, | 1873,32, | 1873,33, | 1873,34, | 1873,35, | 1873,36, | 1873,37, | 1873,38, | 1873,39, | 1873,40, | 1873,41, | 1873,42, | 1873,43, | 1873,44, | 1873,45, | 1873,46, | 1873,47, | 1873,48, | 1873,49, | 1873,50, | 1873,51, | 1873,52, | 1873,53, | 1873,54, | 1873,55, | 1873,56, | 1873,57, | 1873,58, | 1873,59, | 1873,60, | 1873,61, | 1873,62, | 1873,63, | 1873,64, | 1873,65, | 1873,66, | 1873,67, | 1873,68, | 1873,69, | 1873,70, | 1873,71, | 1873,72, | 1873,73, | 1873,74, | 1873,75, | 1873,76, | 1873,77, | 1873,78, | 1873,79, | 1873,80, | 1873,81, | 1873,82, | 1873,83, | 1873,84, | 1873,85, | 1874,1, | 1874,2, | 1874,3, | 1874,4, | 1874,5, | 1874,6, | 1874,7, | 1874,8, | 1874,9, | 1874,10, | 1874,11, | 1874,12, | 1874,13, | 1874,14, | 1874,15, | 1874,16, | 1874,17, | 1874,18, | 1874,19, | 1874,20, | 1874,21, | 1874,22, | 1874,23, | 1874,24, | 1874,25, | 1874,26, | 1874,27, | 1874,28, | 1874,29, | 1874,30, | 1874,31, | 1874,32, | 1874,33, | 1874,34, | 1874,35, | 1874,36, | 1874,37, | 1874,38, | 1874,39, | 1874,40, | 1874,41, | 1874,42, | 1874,43, | 1874,44, | 1874,45, | 1874,46, | 1874,47, | 1874,48, | 1874,49, | 1874,50, | 1874,51, | 1874,52, | 1874,53, | 1874,54, | 1874,55, | 1874,56, | 1874,57, | 1874,58, | 1874,59, | 1874,60, | 1874,61, | 1874,62, | 1874,63, | 1874,64, | 1874,65, | 1874,66, | 1874,67, | 1874,68, | 1874,69, | 1874,70, | 1874,71, | 1874,72, | 1874,73, | 1874,74, | 1874,75, | 1874,76, | 1874,77, | 1874,78, | 1874,79, | 1874,80, | 1874,81, | 1874,82, | 1874,83, | 1874,84, | 1874,85, | 1875,1, | 1875,2, | 1875,3, | 1875,4, | 1875,5, | 1875,6, | 1875,7, | 1875,8, | 1875,9, | 1875,10, | 1875,11, | 1875,12, | 1875,13, | 1875,14, | 1875,15, | 1875,16, | 1875,17, | 1875,18, | 1875,19, | 1875,20, | 1875,21, | 1875,22, | 1875,23, | 1875,24, | 1875,25, | 1875,26, | 1875,27, | 1875,28, | 1875,29, | 1875,30, | 1875,31, | 1875,32, | 1875,33, | 1875,34, | 1875,35, | 1875,36, | 1875,37, | 1875,38, | 1875,39, | 1875,40, | 1875,41, | 1875,42, | 1875,43, | 1875,44, | 1875,45, | 1875,46, | 1875,47, | 1875,48, | 1875,49, | 1875,50, | 1875,51, | 1875,52, | 1875,53, | 1875,54, | 1875,55, | 1875,56, | 1875,57, | 1875,58, | 1875,59, | 1875,60, | 1875,61, | 1875,62, | 1875,63, | 1875,64, | 1875,65, | 1875,66, | 1875,67, | 1875,68, | 1875,69, | 1875,70, | 1875,71, | 1875,72, | 1875,73, | 1875,74, | 1875,75, | 1875,76, | 1875,77, | 1875,78, | 1875,79, | 1875,80, | 1875,81, | 1875,82, | 1875,83, | 1875,84, | 1875,85, | 1876,1, | 1876,2, | 1876,3, | 1876,4, | 1876,5, | 1876,6, | 1876,7, | 1876,8, | 1876,9, | 1876,10, | 1876,11, | 1876,12, | 1876,13, | 1876,14, | 1876,15, | 1876,16, | 1876,17, | 1876,18, | 1876,19, | 1876,20, | 1876,21, | 1876,22, | 1876,23, | 1876,24, | 1876,25, | 1876,26, | 1876,27, | 1876,28, | 1876,29, | 1876,30, | 1876,31, | 1876,32, | 1876,33, | 1876,34, | 1876,35, | 1876,36, | 1876,37, | 1876,38, | 1876,39, | 1876,40, | 1876,41, | 1876,42, | 1876,43, | 1876,44, | 1876,45, | 1876,46, | 1876,47, | 1876,48, | 1876,49, | 1876,50, | 1876,51, | 1876,52, | 1876,53, | 1876,54, | 1876,55, | 1876,56, | 1876,57, | 1876,58, | 1876,59, | 1876,60, | 1876,61, | 1876,62, | 1876,63, | 1876,64, | 1876,65, | 1876,66, | 1876,67, | 1876,68, | 1876,69, | 1876,70, | 1876,71, | 1876,72, | 1876,73, | 1876,74, | 1876,75, | 1876,76, | 1876,77, | 1876,78, | 1876,79, | 1876,80, | 1876,81, | 1876,82, | 1876,83, | 1876,84, | 1876,85, | 1877,1, | 1877,2, | 1877,3, | 1877,4, | 1877,5, | 1877,6, | 1877,7, | 1877,8, | 1877,9, | 1877,10, | 1877,11, | 1877,12, | 1877,13, | 1877,14, | 1877,15, | 1877,16, | 1877,17, | 1877,18, | 1877,19, | 1877,20, | 1877,21, | 1877,22, | 1877,23, | 1877,24, | 1877,25, | 1877,26, | 1877,27, | 1877,28, | 1877,29, | 1877,30, | 1877,31, | 1877,32, | 1877,33, | 1877,34, | 1877,35, | 1877,36, | 1877,37, | 1877,38, | 1877,39, | 1877,40, | 1877,41, | 1877,42, | 1877,43, | 1877,44, | 1877,45, | 1877,46, | 1877,47, | 1877,48, | 1877,49, | 1877,50, | 1877,51, | 1877,52, | 1877,53, | 1877,54, | 1877,55, | 1877,56, | 1877,57, | 1877,58, | 1877,59, | 1877,60, | 1877,61, | 1877,62, | 1877,63, | 1877,64, | 1877,65, | 1877,66, | 1877,67, | 1877,68, | 1877,69, | 1877,70, | 1877,71, | 1877,72, | 1877,73, | 1877,74, | 1877,75, | 1877,76, | 1877,77, | 1877,78, | 1877,79, | 1877,80, | 1877,81, | 1877,82, | 1877,83, | 1877,84, | 1877,85, | 1878,1, | 1878,2, | 1878,3, | 1878,4, | 1878,5, | 1878,6, | 1878,7, | 1878,8, | 1878,9, | 1878,10, | 1878,11, | 1878,12, | 1878,13, | 1878,14, | 1878,15, | 1878,16, | 1878,17, | 1878,18, | 1878,19, | 1878,20, | 1878,21, | 1878,22, | 1878,23, | 1878,24, | 1878,25, | 1878,26, | 1878,27, | 1878,28, | 1878,29, | 1878,30, | 1878,31, | 1878,32, | 1878,33, | 1878,34, | 1878,35, | 1878,36, | 1878,37, | 1878,38, | 1878,39, | 1878,40, | 1878,41, | 1878,42, | 1878,43, | 1878,44, | 1878,45, | 1878,46, | 1878,47, | 1878,48, | 1878,49, | 1878,50, | 1878,51, | 1878,52, | 1878,53, | 1878,54, | 1878,55, | 1878,56, | 1878,57, | 1878,58, | 1878,59, | 1878,60, | 1878,61, | 1878,62, | 1878,63, | 1878,64, | 1878,65, | 1878,66, | 1878,67, | 1878,68, | 1878,69, | 1878,70, | 1878,71, | 1878,72, | 1878,73, | 1878,74, | 1878,75, | 1878,76, | 1878,77, | 1878,78, | 1878,79, | 1878,80, | 1878,81, | 1878,82, | 1878,83, | 1878,84, | 1878,85, | 1879,1, | 1879,2, | 1879,3, | 1879,4, | 1879,5, | 1879,6, | 1879,7, | 1879,8, | 1879,9, | 1879,10, | 1879,11, | 1879,12, | 1879,13, | 1879,14, | 1879,15, | 1879,16, | 1879,17, | 1879,18, | 1879,19, | 1879,20, | 1879,21, | 1879,22, | 1879,23, | 1879,24, | 1879,25, | 1879,26, | 1879,27, | 1879,28, | 1879,29, | 1879,30, | 1879,31, | 1879,32, | 1879,33, | 1879,34, | 1879,35, | 1879,36, | 1879,37, | 1879,38, | 1879,39, | 1879,40, | 1879,41, | 1879,42, | 1879,43, | 1879,44, | 1879,45, | 1879,46, | 1879,47, | 1879,48, | 1879,49, | 1879,50, | 1879,51, | 1879,52, | 1879,53, | 1879,54, | 1879,55, | 1879,56, | 1879,57, | 1879,58, | 1879,59, | 1879,60, | 1879,61, | 1879,62, | 1879,63, | 1879,64, | 1879,65, | 1879,66, | 1879,67, | 1879,68, | 1879,69, | 1879,70, | 1879,71, | 1879,72, | 1879,73, | 1879,74, | 1879,75, | 1879,76, | 1879,77, | 1879,78, | 1879,79, | 1879,80, | 1879,81, | 1879,82, | 1879,83, | 1879,84, | 1879,85, | 1880,1, | 1880,2, | 1880,3, | 1880,4, | 1880,5, | 1880,6, | 1880,7, | 1880,8, | 1880,9, | 1880,10, | 1880,11, | 1880,12, | 1880,13, | 1880,14, | 1880,15, | 1880,16, | 1880,17, | 1880,18, | 1880,19, | 1880,20, | 1880,21, | 1880,22, | 1880,23, | 1880,24, | 1880,25, | 1880,26, | 1880,27, | 1880,28, | 1880,29, | 1880,30, | 1880,31, | 1880,32, | 1880,33, | 1880,34, | 1880,35, | 1880,36, | 1880,37, | 1880,38, | 1880,39, | 1880,40, | 1880,41, | 1880,42, | 1880,43, | 1880,44, | 1880,45, | 1880,46, | 1880,47, | 1880,48, | 1880,49, | 1880,50, | 1880,51, | 1880,52, | 1880,53, | 1880,54, | 1880,55, | 1880,56, | 1880,57, | 1880,58, | 1880,59, | 1880,60, | 1880,61, | 1880,62, | 1880,63, | 1880,64, | 1880,65, | 1880,66, | 1880,67, | 1880,68, | 1880,69, | 1880,70, | 1880,71, | 1880,72, | 1880,73, | 1880,74, | 1880,75, | 1880,76, | 1880,77, | 1880,78, | 1880,79, | 1880,80, | 1880,81, | 1880,82, | 1880,83, | 1880,84, | 1880,85, | 1881,1, | 1881,2, | 1881,3, | 1881,4, | 1881,5, | 1881,6, | 1881,7, | 1881,8, | 1881,9, | 1881,10, | 1881,11, | 1881,12, | 1881,13, | 1881,14, | 1881,15, | 1881,16, | 1881,17, | 1881,18, | 1881,19, | 1881,20, | 1881,21, | 1881,22, | 1881,23, | 1881,24, | 1881,25, | 1881,26, | 1881,27, | 1881,28, | 1881,29, | 1881,30, | 1881,31, | 1881,32, | 1881,33, | 1881,34, | 1881,35, | 1881,36, | 1881,37, | 1881,38, | 1881,39, | 1881,40, | 1881,41, | 1881,42, | 1881,43, | 1881,44, | 1881,45, | 1881,46, | 1881,47, | 1881,48, | 1881,49, | 1881,50, | 1881,51, | 1881,52, | 1881,53, | 1881,54, | 1881,55, | 1881,56, | 1881,57, | 1881,58, | 1881,59, | 1881,60, | 1881,61, | 1881,62, | 1881,63, | 1881,64, | 1881,65, | 1881,66, | 1881,67, | 1881,68, | 1881,69, | 1881,70, | 1881,71, | 1881,72, | 1881,73, | 1881,74, | 1881,75, | 1881,76, | 1881,77, | 1881,78, | 1881,79, | 1881,80, | 1881,81, | 1881,82, | 1881,83, | 1881,84, | 1881,85, | 1882,1, | 1882,2, | 1882,3, | 1882,4, | 1882,5, | 1882,6, | 1882,7, | 1882,8, | 1882,9, | 1882,10, | 1882,11, | 1882,12, | 1882,13, | 1882,14, | 1882,15, | 1882,16, | 1882,17, | 1882,18, | 1882,19, | 1882,20, | 1882,21, | 1882,22, | 1882,23, | 1882,24, | 1882,25, | 1882,26, | 1882,27, | 1882,28, | 1882,29, | 1882,30, | 1882,31, | 1882,32, | 1882,33, | 1882,34, | 1882,35, | 1882,36, | 1882,37, | 1882,38, | 1882,39, | 1882,40, | 1882,41, | 1882,42, | 1882,43, | 1882,44, | 1882,45, | 1882,46, | 1882,47, | 1882,48, | 1882,49, | 1882,50, | 1882,51, | 1882,52, | 1882,53, | 1882,54, | 1882,55, | 1882,56, | 1882,57, | 1882,58, | 1882,59, | 1882,60, | 1882,61, | 1882,62, | 1882,63, | 1882,64, | 1882,65, | 1882,66, | 1882,67, | 1882,68, | 1882,69, | 1882,70, | 1882,71, | 1882,72, | 1882,73, | 1882,74, | 1882,75, | 1882,76, | 1882,77, | 1882,78, | 1882,79, | 1882,80, | 1882,81, | 1882,82, | 1882,83, | 1882,84, | 1882,85, | 1883,1, | 1883,2, | 1883,3, | 1883,4, | 1883,5, | 1883,6, | 1883,7, | 1883,8, | 1883,9, | 1883,10, | 1883,11, | 1883,12, | 1883,13, | 1883,14, | 1883,15, | 1883,16, | 1883,17, | 1883,18, | 1883,19, | 1883,20, | 1883,21, | 1883,22, | 1883,23, | 1883,24, | 1883,25, | 1883,26, | 1883,27, | 1883,28, | 1883,29, | 1883,30, | 1883,31, | 1883,32, | 1883,33, | 1883,34, | 1883,35, | 1883,36, | 1883,37, | 1883,38, | 1883,39, | 1883,40, | 1883,41, | 1883,42, | 1883,43, | 1883,44, | 1883,45, | 1883,46, | 1883,47, | 1883,48, | 1883,49, | 1883,50, | 1883,51, | 1883,52, | 1883,53, | 1883,54, | 1883,55, | 1883,56, | 1883,57, | 1883,58, | 1883,59, | 1883,60, | 1883,61, | 1883,62, | 1883,63, | 1883,64, | 1883,65, | 1883,66, | 1883,67, | 1883,68, | 1883,69, | 1883,70, | 1883,71, | 1883,72, | 1883,73, | 1883,74, | 1883,75, | 1883,76, | 1883,77, | 1883,78, | 1883,79, | 1883,80, | 1883,81, | 1883,82, | 1883,83, | 1883,84, | 1883,85, | 1884,1, | 1884,2, | 1884,3, | 1884,4, | 1884,5, | 1884,6, | 1884,7, | 1884,8, | 1884,9, | 1884,10, | 1884,11, | 1884,12, | 1884,13, | 1884,14, | 1884,15, | 1884,16, | 1884,17, | 1884,18, | 1884,19, | 1884,20, | 1884,21, | 1884,22, | 1884,23, | 1884,24, | 1884,25, | 1884,26, | 1884,27, | 1884,28, | 1884,29, | 1884,30, | 1884,31, | 1884,32, | 1884,33, | 1884,34, | 1884,35, | 1884,36, | 1884,37, | 1884,38, | 1884,39, | 1884,40, | 1884,41, | 1884,42, | 1884,43, | 1884,44, | 1884,45, | 1884,46, | 1884,47, | 1884,48, | 1884,49, | 1884,50, | 1884,51, | 1884,52, | 1884,53, | 1884,54, | 1884,55, | 1884,56, | 1884,57, | 1884,58, | 1884,59, | 1884,60, | 1884,61, | 1884,62, | 1884,63, | 1884,64, | 1884,65, | 1884,66, | 1884,67, | 1884,68, | 1884,69, | 1884,70, | 1884,71, | 1884,72, | 1884,73, | 1884,74, | 1884,75, | 1884,76, | 1884,77, | 1884,78, | 1884,79, | 1884,80, | 1884,81, | 1884,82, | 1884,83, | 1884,84, | 1884,85, | 1885,1, | 1885,2, | 1885,3, | 1885,4, | 1885,5, | 1885,6, | 1885,7, | 1885,8, | 1885,9, | 1885,10, | 1885,11, | 1885,12, | 1885,13, | 1885,14, | 1885,15, | 1885,16, | 1885,17, | 1885,18, | 1885,19, | 1885,20, | 1885,21, | 1885,22, | 1885,23, | 1885,24, | 1885,25, | 1885,26, | 1885,27, | 1885,28, | 1885,29, | 1885,30, | 1885,31, | 1885,32, | 1885,33, | 1885,34, | 1885,35, | 1885,36, | 1885,37, | 1885,38, | 1885,39, | 1885,40, | 1885,41, | 1885,42, | 1885,43, | 1885,44, | 1885,45, | 1885,46, | 1885,47, | 1885,48, | 1885,49, | 1885,50, | 1885,51, | 1885,52, | 1885,53, | 1885,54, | 1885,55, | 1885,56, | 1885,57, | 1885,58, | 1885,59, | 1885,60, | 1885,61, | 1885,62, | 1885,63, | 1885,64, | 1885,65, | 1885,66, | 1885,67, | 1885,68, | 1885,69, | 1885,70, | 1885,71, | 1885,72, | 1885,73, | 1885,74, | 1885,75, | 1885,76, | 1885,77, | 1885,78, | 1885,79, | 1885,80, | 1885,81, | 1885,82, | 1885,83, | 1885,84, | 1885,85, | 1886,1, | 1886,2, | 1886,3, | 1886,4, | 1886,5, | 1886,6, | 1886,7, | 1886,8, | 1886,9, | 1886,10, | 1886,11, | 1886,12, | 1886,13, | 1886,14, | 1886,15, | 1886,16, | 1886,17, | 1886,18, | 1886,19, | 1886,20, | 1886,21, | 1886,22, | 1886,23, | 1886,24, | 1886,25, | 1886,26, | 1886,27, | 1886,28, | 1886,29, | 1886,30, | 1886,31, | 1886,32, | 1886,33, | 1886,34, | 1886,35, | 1886,36, | 1886,37, | 1886,38, | 1886,39, | 1886,40, | 1886,41, | 1886,42, | 1886,43, | 1886,44, | 1886,45, | 1886,46, | 1886,47, | 1886,48, | 1886,49, | 1886,50, | 1886,51, | 1886,52, | 1886,53, | 1886,54, | 1886,55, | 1886,56, | 1886,57, | 1886,58, | 1886,59, | 1886,60, | 1886,61, | 1886,62, | 1886,63, | 1886,64, | 1886,65, | 1886,66, | 1886,67, | 1886,68, | 1886,69, | 1886,70, | 1886,71, | 1886,72, | 1886,73, | 1886,74, | 1886,75, | 1886,76, | 1886,77, | 1886,78, | 1886,79, | 1886,80, | 1886,81, | 1886,82, | 1886,83, | 1886,84, | 1886,85, | 1887,1, | 1887,2, | 1887,3, | 1887,4, | 1887,5, | 1887,6, | 1887,7, | 1887,8, | 1887,9, | 1887,10, | 1887,11, | 1887,12, | 1887,13, | 1887,14, | 1887,15, | 1887,16, | 1887,17, | 1887,18, | 1887,19, | 1887,20, | 1887,21, | 1887,22, | 1887,23, | 1887,24, | 1887,25, | 1887,26, | 1887,27, | 1887,28, | 1887,29, | 1887,30, | 1887,31, | 1887,32, | 1887,33, | 1887,34, | 1887,35, | 1887,36, | 1887,37, | 1887,38, | 1887,39, | 1887,40, | 1887,41, | 1887,42, | 1887,43, | 1887,44, | 1887,45, | 1887,46, | 1887,47, | 1887,48, | 1887,49, | 1887,50, | 1887,51, | 1887,52, | 1887,53, | 1887,54, | 1887,55, | 1887,56, | 1887,57, | 1887,58, | 1887,59, | 1887,60, | 1887,61, | 1887,62, | 1887,63, | 1887,64, | 1887,65, | 1887,66, | 1887,67, | 1887,68, | 1887,69, | 1887,70, | 1887,71, | 1887,72, | 1887,73, | 1887,74, | 1887,75, | 1887,76, | 1887,77, | 1887,78, | 1887,79, | 1887,80, | 1887,81, | 1887,82, | 1887,83, | 1887,84, | 1887,85, | 1888,1, | 1888,2, | 1888,3, | 1888,4, | 1888,5, | 1888,6, | 1888,7, | 1888,8, | 1888,9, | 1888,10, | 1888,11, | 1888,12, | 1888,13, | 1888,14, | 1888,15, | 1888,16, | 1888,17, | 1888,18, | 1888,19, | 1888,20, | 1888,21, | 1888,22, | 1888,23, | 1888,24, | 1888,25, | 1888,26, | 1888,27, | 1888,28, | 1888,29, | 1888,30, | 1888,31, | 1888,32, | 1888,33, | 1888,34, | 1888,35, | 1888,36, | 1888,37, | 1888,38, | 1888,39, | 1888,40, | 1888,41, | 1888,42, | 1888,43, | 1888,44, | 1888,45, | 1888,46, | 1888,47, | 1888,48, | 1888,49, | 1888,50, | 1888,51, | 1888,52, | 1888,53, | 1888,54, | 1888,55, | 1888,56, | 1888,57, | 1888,58, | 1888,59, | 1888,60, | 1888,61, | 1888,62, | 1888,63, | 1888,64, | 1888,65, | 1888,66, | 1888,67, | 1888,68, | 1888,69, | 1888,70, | 1888,71, | 1888,72, | 1888,73, | 1888,74, | 1888,75, | 1888,76, | 1888,77, | 1888,78, | 1888,79, | 1888,80, | 1888,81, | 1888,82, | 1888,83, | 1888,84, | 1888,85, | 1889,1, | 1889,2, | 1889,3, | 1889,4, | 1889,5, | 1889,6, | 1889,7, | 1889,8, | 1889,9, | 1889,10, | 1889,11, | 1889,12, | 1889,13, | 1889,14, | 1889,15, | 1889,16, | 1889,17, | 1889,18, | 1889,19, | 1889,20, | 1889,21, | 1889,22, | 1889,23, | 1889,24, | 1889,25, | 1889,26, | 1889,27, | 1889,28, | 1889,29, | 1889,30, | 1889,31, | 1889,32, | 1889,33, | 1889,34, | 1889,35, | 1889,36, | 1889,37, | 1889,38, | 1889,39, | 1889,40, | 1889,41, | 1889,42, | 1889,43, | 1889,44, | 1889,45, | 1889,46, | 1889,47, | 1889,48, | 1889,49, | 1889,50, | 1889,51, | 1889,52, | 1889,53, | 1889,54, | 1889,55, | 1889,56, | 1889,57, | 1889,58, | 1889,59, | 1889,60, | 1889,61, | 1889,62, | 1889,63, | 1889,64, | 1889,65, | 1889,66, | 1889,67, | 1889,68, | 1889,69, | 1889,70, | 1889,71, | 1889,72, | 1889,73, | 1889,74, | 1889,75, | 1889,76, | 1889,77, | 1889,78, | 1889,79, | 1889,80, | 1889,81, | 1889,82, | 1889,83, | 1889,84, | 1889,85, | 1890,1, | 1890,2, | 1890,3, | 1890,4, | 1890,5, | 1890,6, | 1890,7, | 1890,8, | 1890,9, | 1890,10, | 1890,11, | 1890,12, | 1890,13, | 1890,14, | 1890,15, | 1890,16, | 1890,17, | 1890,18, | 1890,19, | 1890,20, | 1890,21, | 1890,22, | 1890,23, | 1890,24, | 1890,25, | 1890,26, | 1890,27, | 1890,28, | 1890,29, | 1890,30, | 1890,31, | 1890,32, | 1890,33, | 1890,34, | 1890,35, | 1890,36, | 1890,37, | 1890,38, | 1890,39, | 1890,40, | 1890,41, | 1890,42, | 1890,43, | 1890,44, | 1890,45, | 1890,46, | 1890,47, | 1890,48, | 1890,49, | 1890,50, | 1890,51, | 1890,52, | 1890,53, | 1890,54, | 1890,55, | 1890,56, | 1890,57, | 1890,58, | 1890,59, | 1890,60, | 1890,61, | 1890,62, | 1890,63, | 1890,64, | 1890,65, | 1890,66, | 1890,67, | 1890,68, | 1890,69, | 1890,70, | 1890,71, | 1890,72, | 1890,73, | 1890,74, | 1890,75, | 1890,76, | 1890,77, | 1890,78, | 1890,79, | 1890,80, | 1890,81, | 1890,82, | 1890,83, | 1890,84, | 1890,85, | 1891,1, | 1891,2, | 1891,3, | 1891,4, | 1891,5, | 1891,6, | 1891,7, | 1891,8, | 1891,9, | 1891,10, | 1891,11, | 1891,12, | 1891,13, | 1891,14, | 1891,15, | 1891,16, | 1891,17, | 1891,18, | 1891,19, | 1891,20, | 1891,21, | 1891,22, | 1891,23, | 1891,24, | 1891,25, | 1891,26, | 1891,27, | 1891,28, | 1891,29, | 1891,30, | 1891,31, | 1891,32, | 1891,33, | 1891,34, | 1891,35, | 1891,36, | 1891,37, | 1891,38, | 1891,39, | 1891,40, | 1891,41, | 1891,42, | 1891,43, | 1891,44, | 1891,45, | 1891,46, | 1891,47, | 1891,48, | 1891,49, | 1891,50, | 1891,51, | 1891,52, | 1891,53, | 1891,54, | 1891,55, | 1891,56, | 1891,57, | 1891,58, | 1891,59, | 1891,60, | 1891,61, | 1891,62, | 1891,63, | 1891,64, | 1891,65, | 1891,66, | 1891,67, | 1891,68, | 1891,69, | 1891,70, | 1891,71, | 1891,72, | 1891,73, | 1891,74, | 1891,75, | 1891,76, | 1891,77, | 1891,78, | 1891,79, | 1891,80, | 1891,81, | 1891,82, | 1891,83, | 1891,84, | 1891,85, | 1892,1, | 1892,2, | 1892,3, | 1892,4, | 1892,5, | 1892,6, | 1892,7, | 1892,8, | 1892,9, | 1892,10, | 1892,11, | 1892,12, | 1892,13, | 1892,14, | 1892,15, | 1892,16, | 1892,17, | 1892,18, | 1892,19, | 1892,20, | 1892,21, | 1892,22, | 1892,23, | 1892,24, | 1892,25, | 1892,26, | 1892,27, | 1892,28, | 1892,29, | 1892,30, | 1892,31, | 1892,32, | 1892,33, | 1892,34, | 1892,35, | 1892,36, | 1892,37, | 1892,38, | 1892,39, | 1892,40, | 1892,41, | 1892,42, | 1892,43, | 1892,44, | 1892,45, | 1892,46, | 1892,47, | 1892,48, | 1892,49, | 1892,50, | 1892,51, | 1892,52, | 1892,53, | 1892,54, | 1892,55, | 1892,56, | 1892,57, | 1892,58, | 1892,59, | 1892,60, | 1892,61, | 1892,62, | 1892,63, | 1892,64, | 1892,65, | 1892,66, | 1892,67, | 1892,68, | 1892,69, | 1892,70, | 1892,71, | 1892,72, | 1892,73, | 1892,74, | 1892,75, | 1892,76, | 1892,77, | 1892,78, | 1892,79, | 1892,80, | 1892,81, | 1892,82, | 1892,83, | 1892,84, | 1892,85, | 1893,1, | 1893,2, | 1893,3, | 1893,4, | 1893,5, | 1893,6, | 1893,7, | 1893,8, | 1893,9, | 1893,10, | 1893,11, | 1893,12, | 1893,13, | 1893,14, | 1893,15, | 1893,16, | 1893,17, | 1893,18, | 1893,19, | 1893,20, | 1893,21, | 1893,22, | 1893,23, | 1893,24, | 1893,25, | 1893,26, | 1893,27, | 1893,28, | 1893,29, | 1893,30, | 1893,31, | 1893,32, | 1893,33, | 1893,34, | 1893,35, | 1893,36, | 1893,37, | 1893,38, | 1893,39, | 1893,40, | 1893,41, | 1893,42, | 1893,43, | 1893,44, | 1893,45, | 1893,46, | 1893,47, | 1893,48, | 1893,49, | 1893,50, | 1893,51, | 1893,52, | 1893,53, | 1893,54, | 1893,55, | 1893,56, | 1893,57, | 1893,58, | 1893,59, | 1893,60, | 1893,61, | 1893,62, | 1893,63, | 1893,64, | 1893,65, | 1893,66, | 1893,67, | 1893,68, | 1893,69, | 1893,70, | 1893,71, | 1893,72, | 1893,73, | 1893,74, | 1893,75, | 1893,76, | 1893,77, | 1893,78, | 1893,79, | 1893,80, | 1893,81, | 1893,82, | 1893,83, | 1893,84, | 1893,85, | 1894,1, | 1894,2, | 1894,3, | 1894,4, | 1894,5, | 1894,6, | 1894,7, | 1894,8, | 1894,9, | 1894,10, | 1894,11, | 1894,12, | 1894,13, | 1894,14, | 1894,15, | 1894,16, | 1894,17, | 1894,18, | 1894,19, | 1894,20, | 1894,21, | 1894,22, | 1894,23, | 1894,24, | 1894,25, | 1894,26, | 1894,27, | 1894,28, | 1894,29, | 1894,30, | 1894,31, | 1894,32, | 1894,33, | 1894,34, | 1894,35, | 1894,36, | 1894,37, | 1894,38, | 1894,39, | 1894,40, | 1894,41, | 1894,42, | 1894,43, | 1894,44, | 1894,45, | 1894,46, | 1894,47, | 1894,48, | 1894,49, | 1894,50, | 1894,51, | 1894,52, | 1894,53, | 1894,54, | 1894,55, | 1894,56, | 1894,57, | 1894,58, | 1894,59, | 1894,60, | 1894,61, | 1894,62, | 1894,63, | 1894,64, | 1894,65, | 1894,66, | 1894,67, | 1894,68, | 1894,69, | 1894,70, | 1894,71, | 1894,72, | 1894,73, | 1894,74, | 1894,75, | 1894,76, | 1894,77, | 1894,78, | 1894,79, | 1894,80, | 1894,81, | 1894,82, | 1894,83, | 1894,84, | 1894,85, | 1895,1, | 1895,2, | 1895,3, | 1895,4, | 1895,5, | 1895,6, | 1895,7, | 1895,8, | 1895,9, | 1895,10, | 1895,11, | 1895,12, | 1895,13, | 1895,14, | 1895,15, | 1895,16, | 1895,17, | 1895,18, | 1895,19, | 1895,20, | 1895,21, | 1895,22, | 1895,23, | 1895,24, | 1895,25, | 1895,26, | 1895,27, | 1895,28, | 1895,29, | 1895,30, | 1895,31, | 1895,32, | 1895,33, | 1895,34, | 1895,35, | 1895,36, | 1895,37, | 1895,38, | 1895,39, | 1895,40, | 1895,41, | 1895,42, | 1895,43, | 1895,44, | 1895,45, | 1895,46, | 1895,47, | 1895,48, | 1895,49, | 1895,50, | 1895,51, | 1895,52, | 1895,53, | 1895,54, | 1895,55, | 1895,56, | 1895,57, | 1895,58, | 1895,59, | 1895,60, | 1895,61, | 1895,62, | 1895,63, | 1895,64, | 1895,65, | 1895,66, | 1895,67, | 1895,68, | 1895,69, | 1895,70, | 1895,71, | 1895,72, | 1895,73, | 1895,74, | 1895,75, | 1895,76, | 1895,77, | 1895,78, | 1895,79, | 1895,80, | 1895,81, | 1895,82, | 1895,83, | 1895,84, | 1895,85, | 1896,1, | 1896,2, | 1896,3, | 1896,4, | 1896,5, | 1896,6, | 1896,7, | 1896,8, | 1896,9, | 1896,10, | 1896,11, | 1896,12, | 1896,13, | 1896,14, | 1896,15, | 1896,16, | 1896,17, | 1896,18, | 1896,19, | 1896,20, | 1896,21, | 1896,22, | 1896,23, | 1896,24, | 1896,25, | 1896,26, | 1896,27, | 1896,28, | 1896,29, | 1896,30, | 1896,31, | 1896,32, | 1896,33, | 1896,34, | 1896,35, | 1896,36, | 1896,37, | 1896,38, | 1896,39, | 1896,40, | 1896,41, | 1896,42, | 1896,43, | 1896,44, | 1896,45, | 1896,46, | 1896,47, | 1896,48, | 1896,49, | 1896,50, | 1896,51, | 1896,52, | 1896,53, | 1896,54, | 1896,55, | 1896,56, | 1896,57, | 1896,58, | 1896,59, | 1896,60, | 1896,61, | 1896,62, | 1896,63, | 1896,64, | 1896,65, | 1896,66, | 1896,67, | 1896,68, | 1896,69, | 1896,70, | 1896,71, | 1896,72, | 1896,73, | 1896,74, | 1896,75, | 1896,76, | 1896,77, | 1896,78, | 1896,79, | 1896,80, | 1896,81, | 1896,82, | 1896,83, | 1896,84, | 1896,85, | 1897,1, | 1897,2, | 1897,3, | 1897,4, | 1897,5, | 1897,6, | 1897,7, | 1897,8, | 1897,9, | 1897,10, | 1897,11, | 1897,12, | 1897,13, | 1897,14, | 1897,15, | 1897,16, | 1897,17, | 1897,18, | 1897,19, | 1897,20, | 1897,21, | 1897,22, | 1897,23, | 1897,24, | 1897,25, | 1897,26, | 1897,27, | 1897,28, | 1897,29, | 1897,30, | 1897,31, | 1897,32, | 1897,33, | 1897,34, | 1897,35, | 1897,36, | 1897,37, | 1897,38, | 1897,39, | 1897,40, | 1897,41, | 1897,42, | 1897,43, | 1897,44, | 1897,45, | 1897,46, | 1897,47, | 1897,48, | 1897,49, | 1897,50, | 1897,51, | 1897,52, | 1897,53, | 1897,54, | 1897,55, | 1897,56, | 1897,57, | 1897,58, | 1897,59, | 1897,60, | 1897,61, | 1897,62, | 1897,63, | 1897,64, | 1897,65, | 1897,66, | 1897,67, | 1897,68, | 1897,69, | 1897,70, | 1897,71, | 1897,72, | 1897,73, | 1897,74, | 1897,75, | 1897,76, | 1897,77, | 1897,78, | 1897,79, | 1897,80, | 1897,81, | 1897,82, | 1897,83, | 1897,84, | 1897,85, | 1898,1, | 1898,2, | 1898,3, | 1898,4, | 1898,5, | 1898,6, | 1898,7, | 1898,8, | 1898,9, | 1898,10, | 1898,11, | 1898,12, | 1898,13, | 1898,14, | 1898,15, | 1898,16, | 1898,17, | 1898,18, | 1898,19, | 1898,20, | 1898,21, | 1898,22, | 1898,23, | 1898,24, | 1898,25, | 1898,26, | 1898,27, | 1898,28, | 1898,29, | 1898,30, | 1898,31, | 1898,32, | 1898,33, | 1898,34, | 1898,35, | 1898,36, | 1898,37, | 1898,38, | 1898,39, | 1898,40, | 1898,41, | 1898,42, | 1898,43, | 1898,44, | 1898,45, | 1898,46, | 1898,47, | 1898,48, | 1898,49, | 1898,50, | 1898,51, | 1898,52, | 1898,53, | 1898,54, | 1898,55, | 1898,56, | 1898,57, | 1898,58, | 1898,59, | 1898,60, | 1898,61, | 1898,62, | 1898,63, | 1898,64, | 1898,65, | 1898,66, | 1898,67, | 1898,68, | 1898,69, | 1898,70, | 1898,71, | 1898,72, | 1898,73, | 1898,74, | 1898,75, | 1898,76, | 1898,77, | 1898,78, | 1898,79, | 1898,80, | 1898,81, | 1898,82, | 1898,83, | 1898,84, | 1898,85, | 1899,1, | 1899,2, | 1899,3, | 1899,4, | 1899,5, | 1899,6, | 1899,7, | 1899,8, | 1899,9, | 1899,10, | 1899,11, | 1899,12, | 1899,13, | 1899,14, | 1899,15, | 1899,16, | 1899,17, | 1899,18, | 1899,19, | 1899,20, | 1899,21, | 1899,22, | 1899,23, | 1899,24, | 1899,25, | 1899,26, | 1899,27, | 1899,28, | 1899,29, | 1899,30, | 1899,31, | 1899,32, | 1899,33, | 1899,34, | 1899,35, | 1899,36, | 1899,37, | 1899,38, | 1899,39, | 1899,40, | 1899,41, | 1899,42, | 1899,43, | 1899,44, | 1899,45, | 1899,46, | 1899,47, | 1899,48, | 1899,49, | 1899,50, | 1899,51, | 1899,52, | 1899,53, | 1899,54, | 1899,55, | 1899,56, | 1899,57, | 1899,58, | 1899,59, | 1899,60, | 1899,61, | 1899,62, | 1899,63, | 1899,64, | 1899,65, | 1899,66, | 1899,67, | 1899,68, | 1899,69, | 1899,70, | 1899,71, | 1899,72, | 1899,73, | 1899,74, | 1899,75, | 1899,76, | 1899,77, | 1899,78, | 1899,79, | 1899,80, | 1899,81, | 1899,82, | 1899,83, | 1899,84, | 1899,85, | 1900,1, | 1900,2, | 1900,3, | 1900,4, | 1900,5, | 1900,6, | 1900,7, | 1900,8, | 1900,9, | 1900,10, | 1900,11, | 1900,12, | 1900,13, | 1900,14, | 1900,15, | 1900,16, | 1900,17, | 1900,18, | 1900,19, | 1900,20, | 1900,21, | 1900,22, | 1900,23, | 1900,24, | 1900,25, | 1900,26, | 1900,27, | 1900,28, | 1900,29, | 1900,30, | 1900,31, | 1900,32, | 1900,33, | 1900,34, | 1900,35, | 1900,36, | 1900,37, | 1900,38, | 1900,39, | 1900,40, | 1900,41, | 1900,42, | 1900,43, | 1900,44, | 1900,45, | 1900,46, | 1900,47, | 1900,48, | 1900,49, | 1900,50, | 1900,51, | 1900,52, | 1900,53, | 1900,54, | 1900,55, | 1900,56, | 1900,57, | 1900,58, | 1900,59, | 1900,60, | 1900,61, | 1900,62, | 1900,63, | 1900,64, | 1900,65, | 1900,66, | 1900,67, | 1900,68, | 1900,69, | 1900,70, | 1900,71, | 1900,72, | 1900,73, | 1900,74, | 1900,75, | 1900,76, | 1900,77, | 1900,78, | 1900,79, | 1900,80, | 1900,81, | 1900,82, | 1900,83, | 1900,84, | 1900,85, | 1901,1, | 1901,2, | 1901,3, | 1901,4, | 1901,5, | 1901,6, | 1901,7, | 1901,8, | 1901,9, | 1901,10, | 1901,11, | 1901,12, | 1901,13, | 1901,14, | 1901,15, | 1901,16, | 1901,17, | 1901,18, | 1901,19, | 1901,20, | 1901,21, | 1901,22, | 1901,23, | 1901,24, | 1901,25, | 1901,26, | 1901,27, | 1901,28, | 1901,29, | 1901,30, | 1901,31, | 1901,32, | 1901,33, | 1901,34, | 1901,35, | 1901,36, | 1901,37, | 1901,38, | 1901,39, | 1901,40, | 1901,41, | 1901,42, | 1901,43, | 1901,44, | 1901,45, | 1901,46, | 1901,47, | 1901,48, | 1901,49, | 1901,50, | 1901,51, | 1901,52, | 1901,53, | 1901,54, | 1901,55, | 1901,56, | 1901,57, | 1901,58, | 1901,59, | 1901,60, | 1901,61, | 1901,62, | 1901,63, | 1901,64, | 1901,65, | 1901,66, | 1901,67, | 1901,68, | 1901,69, | 1901,70, | 1901,71, | 1901,72, | 1901,73, | 1901,74, | 1901,75, | 1901,76, | 1901,77, | 1901,78, | 1901,79, | 1901,80, | 1901,81, | 1901,82, | 1901,83, | 1901,84, | 1901,85, | 1902,1, | 1902,2, | 1902,3, | 1902,4, | 1902,5, | 1902,6, | 1902,7, | 1902,8, | 1902,9, | 1902,10, | 1902,11, | 1902,12, | 1902,13, | 1902,14, | 1902,15, | 1902,16, | 1902,17, | 1902,18, | 1902,19, | 1902,20, | 1902,21, | 1902,22, | 1902,23, | 1902,24, | 1902,25, | 1902,26, | 1902,27, | 1902,28, | 1902,29, | 1902,30, | 1902,31, | 1902,32, | 1902,33, | 1902,34, | 1902,35, | 1902,36, | 1902,37, | 1902,38, | 1902,39, | 1902,40, | 1902,41, | 1902,42, | 1902,43, | 1902,44, | 1902,45, | 1902,46, | 1902,47, | 1902,48, | 1902,49, | 1902,50, | 1902,51, | 1902,52, | 1902,53, | 1902,54, | 1902,55, | 1902,56, | 1902,57, | 1902,58, | 1902,59, | 1902,60, | 1902,61, | 1902,62, | 1902,63, | 1902,64, | 1902,65, | 1902,66, | 1902,67, | 1902,68, | 1902,69, | 1902,70, | 1902,71, | 1902,72, | 1902,73, | 1902,74, | 1902,75, | 1902,76, | 1902,77, | 1902,78, | 1902,79, | 1902,80, | 1902,81, | 1902,82, | 1902,83, | 1902,84, | 1902,85, | 1903,1, | 1903,2, | 1903,3, | 1903,4, | 1903,5, | 1903,6, | 1903,7, | 1903,8, | 1903,9, | 1903,10, | 1903,11, | 1903,12, | 1903,13, | 1903,14, | 1903,15, | 1903,16, | 1903,17, | 1903,18, | 1903,19, | 1903,20, | 1903,21, | 1903,22, | 1903,23, | 1903,24, | 1903,25, | 1903,26, | 1903,27, | 1903,28, | 1903,29, | 1903,30, | 1903,31, | 1903,32, | 1903,33, | 1903,34, | 1903,35, | 1903,36, | 1903,37, | 1903,38, | 1903,39, | 1903,40, | 1903,41, | 1903,42, | 1903,43, | 1903,44, | 1903,45, | 1903,46, | 1903,47, | 1903,48, | 1903,49, | 1903,50, | 1903,51, | 1903,52, | 1903,53, | 1903,54, | 1903,55, | 1903,56, | 1903,57, | 1903,58, | 1903,59, | 1903,60, | 1903,61, | 1903,62, | 1903,63, | 1903,64, | 1903,65, | 1903,66, | 1903,67, | 1903,68, | 1903,69, | 1903,70, | 1903,71, | 1903,72, | 1903,73, | 1903,74, | 1903,75, | 1903,76, | 1903,77, | 1903,78, | 1903,79, | 1903,80, | 1903,81, | 1903,82, | 1903,83, | 1903,84, | 1903,85, | 1904,1, | 1904,2, | 1904,3, | 1904,4, | 1904,5, | 1904,6, | 1904,7, | 1904,8, | 1904,9, | 1904,10, | 1904,11, | 1904,12, | 1904,13, | 1904,14, | 1904,15, | 1904,16, | 1904,17, | 1904,18, | 1904,19, | 1904,20, | 1904,21, | 1904,22, | 1904,23, | 1904,24, | 1904,25, | 1904,26, | 1904,27, | 1904,28, | 1904,29, | 1904,30, | 1904,31, | 1904,32, | 1904,33, | 1904,34, | 1904,35, | 1904,36, | 1904,37, | 1904,38, | 1904,39, | 1904,40, | 1904,41, | 1904,42, | 1904,43, | 1904,44, | 1904,45, | 1904,46, | 1904,47, | 1904,48, | 1904,49, | 1904,50, | 1904,51, | 1904,52, | 1904,53, | 1904,54, | 1904,55, | 1904,56, | 1904,57, | 1904,58, | 1904,59, | 1904,60, | 1904,61, | 1904,62, | 1904,63, | 1904,64, | 1904,65, | 1904,66, | 1904,67, | 1904,68, | 1904,69, | 1904,70, | 1904,71, | 1904,72, | 1904,73, | 1904,74, | 1904,75, | 1904,76, | 1904,77, | 1904,78, | 1904,79, | 1904,80, | 1904,81, | 1904,82, | 1904,83, | 1904,84, | 1904,85, | 1905,1, | 1905,2, | 1905,3, | 1905,4, | 1905,5, | 1905,6, | 1905,7, | 1905,8, | 1905,9, | 1905,10, | 1905,11, | 1905,12, | 1905,13, | 1905,14, | 1905,15, | 1905,16, | 1905,17, | 1905,18, | 1905,19, | 1905,20, | 1905,21, | 1905,22, | 1905,23, | 1905,24, | 1905,25, | 1905,26, | 1905,27, | 1905,28, | 1905,29, | 1905,30, | 1905,31, | 1905,32, | 1905,33, | 1905,34, | 1905,35, | 1905,36, | 1905,37, | 1905,38, | 1905,39, | 1905,40, | 1905,41, | 1905,42, | 1905,43, | 1905,44, | 1905,45, | 1905,46, | 1905,47, | 1905,48, | 1905,49, | 1905,50, | 1905,51, | 1905,52, | 1905,53, | 1905,54, | 1905,55, | 1905,56, | 1905,57, | 1905,58, | 1905,59, | 1905,60, | 1905,61, | 1905,62, | 1905,63, | 1905,64, | 1905,65, | 1905,66, | 1905,67, | 1905,68, | 1905,69, | 1905,70, | 1905,71, | 1905,72, | 1905,73, | 1905,74, | 1905,75, | 1905,76, | 1905,77, | 1905,78, | 1905,79, | 1905,80, | 1905,81, | 1905,82, | 1905,83, | 1905,84, | 1905,85, | 1906,1, | 1906,2, | 1906,3, | 1906,4, | 1906,5, | 1906,6, | 1906,7, | 1906,8, | 1906,9, | 1906,10, | 1906,11, | 1906,12, | 1906,13, | 1906,14, | 1906,15, | 1906,16, | 1906,17, | 1906,18, | 1906,19, | 1906,20, | 1906,21, | 1906,22, | 1906,23, | 1906,24, | 1906,25, | 1906,26, | 1906,27, | 1906,28, | 1906,29, | 1906,30, | 1906,31, | 1906,32, | 1906,33, | 1906,34, | 1906,35, | 1906,36, | 1906,37, | 1906,38, | 1906,39, | 1906,40, | 1906,41, | 1906,42, | 1906,43, | 1906,44, | 1906,45, | 1906,46, | 1906,47, | 1906,48, | 1906,49, | 1906,50, | 1906,51, | 1906,52, | 1906,53, | 1906,54, | 1906,55, | 1906,56, | 1906,57, | 1906,58, | 1906,59, | 1906,60, | 1906,61, | 1906,62, | 1906,63, | 1906,64, | 1906,65, | 1906,66, | 1906,67, | 1906,68, | 1906,69, | 1906,70, | 1906,71, | 1906,72, | 1906,73, | 1906,74, | 1906,75, | 1906,76, | 1906,77, | 1906,78, | 1906,79, | 1906,80, | 1906,81, | 1906,82, | 1906,83, | 1906,84, | 1906,85, | 1907,1, | 1907,2, | 1907,3, | 1907,4, | 1907,5, | 1907,6, | 1907,7, | 1907,8, | 1907,9, | 1907,10, | 1907,11, | 1907,12, | 1907,13, | 1907,14, | 1907,15, | 1907,16, | 1907,17, | 1907,18, | 1907,19, | 1907,20, | 1907,21, | 1907,22, | 1907,23, | 1907,24, | 1907,25, | 1907,26, | 1907,27, | 1907,28, | 1907,29, | 1907,30, | 1907,31, | 1907,32, | 1907,33, | 1907,34, | 1907,35, | 1907,36, | 1907,37, | 1907,38, | 1907,39, | 1907,40, | 1907,41, | 1907,42, | 1907,43, | 1907,44, | 1907,45, | 1907,46, | 1907,47, | 1907,48, | 1907,49, | 1907,50, | 1907,51, | 1907,52, | 1907,53, | 1907,54, | 1907,55, | 1907,56, | 1907,57, | 1907,58, | 1907,59, | 1907,60, | 1907,61, | 1907,62, | 1907,63, | 1907,64, | 1907,65, | 1907,66, | 1907,67, | 1907,68, | 1907,69, | 1907,70, | 1907,71, | 1907,72, | 1907,73, | 1907,74, | 1907,75, | 1907,76, | 1907,77, | 1907,78, | 1907,79, | 1907,80, | 1907,81, | 1907,82, | 1907,83, | 1907,84, | 1907,85, | 1908,1, | 1908,2, | 1908,3, | 1908,4, | 1908,5, | 1908,6, | 1908,7, | 1908,8, | 1908,9, | 1908,10, | 1908,11, | 1908,12, | 1908,13, | 1908,14, | 1908,15, | 1908,16, | 1908,17, | 1908,18, | 1908,19, | 1908,20, | 1908,21, | 1908,22, | 1908,23, | 1908,24, | 1908,25, | 1908,26, | 1908,27, | 1908,28, | 1908,29, | 1908,30, | 1908,31, | 1908,32, | 1908,33, | 1908,34, | 1908,35, | 1908,36, | 1908,37, | 1908,38, | 1908,39, | 1908,40, | 1908,41, | 1908,42, | 1908,43, | 1908,44, | 1908,45, | 1908,46, | 1908,47, | 1908,48, | 1908,49, | 1908,50, | 1908,51, | 1908,52, | 1908,53, | 1908,54, | 1908,55, | 1908,56, | 1908,57, | 1908,58, | 1908,59, | 1908,60, | 1908,61, | 1908,62, | 1908,63, | 1908,64, | 1908,65, | 1908,66, | 1908,67, | 1908,68, | 1908,69, | 1908,70, | 1908,71, | 1908,72, | 1908,73, | 1908,74, | 1908,75, | 1908,76, | 1908,77, | 1908,78, | 1908,79, | 1908,80, | 1908,81, | 1908,82, | 1908,83, | 1908,84, | 1908,85, | 1909,1, | 1909,2, | 1909,3, | 1909,4, | 1909,5, | 1909,6, | 1909,7, | 1909,8, | 1909,9, | 1909,10, | 1909,11, | 1909,12, | 1909,13, | 1909,14, | 1909,15, | 1909,16, | 1909,17, | 1909,18, | 1909,19, | 1909,20, | 1909,21, | 1909,22, | 1909,23, | 1909,24, | 1909,25, | 1909,26, | 1909,27, | 1909,28, | 1909,29, | 1909,30, | 1909,31, | 1909,32, | 1909,33, | 1909,34, | 1909,35, | 1909,36, | 1909,37, | 1909,38, | 1909,39, | 1909,40, | 1909,41, | 1909,42, | 1909,43, | 1909,44, | 1909,45, | 1909,46, | 1909,47, | 1909,48, | 1909,49, | 1909,50, | 1909,51, | 1909,52, | 1909,53, | 1909,54, | 1909,55, | 1909,56, | 1909,57, | 1909,58, | 1909,59, | 1909,60, | 1909,61, | 1909,62, | 1909,63, | 1909,64, | 1909,65, | 1909,66, | 1909,67, | 1909,68, | 1909,69, | 1909,70, | 1909,71, | 1909,72, | 1909,73, | 1909,74, | 1909,75, | 1909,76, | 1909,77, | 1909,78, | 1909,79, | 1909,80, | 1909,81, | 1909,82, | 1909,83, | 1909,84, | 1909,85, | 1910,1, | 1910,2, | 1910,3, | 1910,4, | 1910,5, | 1910,6, | 1910,7, | 1910,8, | 1910,9, | 1910,10, | 1910,11, | 1910,12, | 1910,13, | 1910,14, | 1910,15, | 1910,16, | 1910,17, | 1910,18, | 1910,19, | 1910,20, | 1910,21, | 1910,22, | 1910,23, | 1910,24, | 1910,25, | 1910,26, | 1910,27, | 1910,28, | 1910,29, | 1910,30, | 1910,31, | 1910,32, | 1910,33, | 1910,34, | 1910,35, | 1910,36, | 1910,37, | 1910,38, | 1910,39, | 1910,40, | 1910,41, | 1910,42, | 1910,43, | 1910,44, | 1910,45, | 1910,46, | 1910,47, | 1910,48, | 1910,49, | 1910,50, | 1910,51, | 1910,52, | 1910,53, | 1910,54, | 1910,55, | 1910,56, | 1910,57, | 1910,58, | 1910,59, | 1910,60, | 1910,61, | 1910,62, | 1910,63, | 1910,64, | 1910,65, | 1910,66, | 1910,67, | 1910,68, | 1910,69, | 1910,70, | 1910,71, | 1910,72, | 1910,73, | 1910,74, | 1910,75, | 1910,76, | 1910,77, | 1910,78, | 1910,79, | 1910,80, | 1910,81, | 1910,82, | 1910,83, | 1910,84, | 1910,85, | 1911,1, | 1911,2, | 1911,3, | 1911,4, | 1911,5, | 1911,6, | 1911,7, | 1911,8, | 1911,9, | 1911,10, | 1911,11, | 1911,12, | 1911,13, | 1911,14, | 1911,15, | 1911,16, | 1911,17, | 1911,18, | 1911,19, | 1911,20, | 1911,21, | 1911,22, | 1911,23, | 1911,24, | 1911,25, | 1911,26, | 1911,27, | 1911,28, | 1911,29, | 1911,30, | 1911,31, | 1911,32, | 1911,33, | 1911,34, | 1911,35, | 1911,36, | 1911,37, | 1911,38, | 1911,39, | 1911,40, | 1911,41, | 1911,42, | 1911,43, | 1911,44, | 1911,45, | 1911,46, | 1911,47, | 1911,48, | 1911,49, | 1911,50, | 1911,51, | 1911,52, | 1911,53, | 1911,54, | 1911,55, | 1911,56, | 1911,57, | 1911,58, | 1911,59, | 1911,60, | 1911,61, | 1911,62, | 1911,63, | 1911,64, | 1911,65, | 1911,66, | 1911,67, | 1911,68, | 1911,69, | 1911,70, | 1911,71, | 1911,72, | 1911,73, | 1911,74, | 1911,75, | 1911,76, | 1911,77, | 1911,78, | 1911,79, | 1911,80, | 1911,81, | 1911,82, | 1911,83, | 1911,84, | 1911,85, | 1912,1, | 1912,2, | 1912,3, | 1912,4, | 1912,5, | 1912,6, | 1912,7, | 1912,8, | 1912,9, | 1912,10, | 1912,11, | 1912,12, | 1912,13, | 1912,14, | 1912,15, | 1912,16, | 1912,17, | 1912,18, | 1912,19, | 1912,20, | 1912,21, | 1912,22, | 1912,23, | 1912,24, | 1912,25, | 1912,26, | 1912,27, | 1912,28, | 1912,29, | 1912,30, | 1912,31, | 1912,32, | 1912,33, | 1912,34, | 1912,35, | 1912,36, | 1912,37, | 1912,38, | 1912,39, | 1912,40, | 1912,41, | 1912,42, | 1912,43, | 1912,44, | 1912,45, | 1912,46, | 1912,47, | 1912,48, | 1912,49, | 1912,50, | 1912,51, | 1912,52, | 1912,53, | 1912,54, | 1912,55, | 1912,56, | 1912,57, | 1912,58, | 1912,59, | 1912,60, | 1912,61, | 1912,62, | 1912,63, | 1912,64, | 1912,65, | 1912,66, | 1912,67, | 1912,68, | 1912,69, | 1912,70, | 1912,71, | 1912,72, | 1912,73, | 1912,74, | 1912,75, | 1912,76, | 1912,77, | 1912,78, | 1912,79, | 1912,80, | 1912,81, | 1912,82, | 1912,83, | 1912,84, | 1912,85, | 1913,1, | 1913,2, | 1913,3, | 1913,4, | 1913,5, | 1913,6, | 1913,7, | 1913,8, | 1913,9, | 1913,10, | 1913,11, | 1913,12, | 1913,13, | 1913,14, | 1913,15, | 1913,16, | 1913,17, | 1913,18, | 1913,19, | 1913,20, | 1913,21, | 1913,22, | 1913,23, | 1913,24, | 1913,25, | 1913,26, | 1913,27, | 1913,28, | 1913,29, | 1913,30, | 1913,31, | 1913,32, | 1913,33, | 1913,34, | 1913,35, | 1913,36, | 1913,37, | 1913,38, | 1913,39, | 1913,40, | 1913,41, | 1913,42, | 1913,43, | 1913,44, | 1913,45, | 1913,46, | 1913,47, | 1913,48, | 1913,49, | 1913,50, | 1913,51, | 1913,52, | 1913,53, | 1913,54, | 1913,55, | 1913,56, | 1913,57, | 1913,58, | 1913,59, | 1913,60, | 1913,61, | 1913,62, | 1913,63, | 1913,64, | 1913,65, | 1913,66, | 1913,67, | 1913,68, | 1913,69, | 1913,70, | 1913,71, | 1913,72, | 1913,73, | 1913,74, | 1913,75, | 1913,76, | 1913,77, | 1913,78, | 1913,79, | 1913,80, | 1913,81, | 1913,82, | 1913,83, | 1913,84, | 1913,85, | 1914,1, | 1914,2, | 1914,3, | 1914,4, | 1914,5, | 1914,6, | 1914,7, | 1914,8, | 1914,9, | 1914,10, | 1914,11, | 1914,12, | 1914,13, | 1914,14, | 1914,15, | 1914,16, | 1914,17, | 1914,18, | 1914,19, | 1914,20, | 1914,21, | 1914,22, | 1914,23, | 1914,24, | 1914,25, | 1914,26, | 1914,27, | 1914,28, | 1914,29, | 1914,30, | 1914,31, | 1914,32, | 1914,33, | 1914,34, | 1914,35, | 1914,36, | 1914,37, | 1914,38, | 1914,39, | 1914,40, | 1914,41, | 1914,42, | 1914,43, | 1914,44, | 1914,45, | 1914,46, | 1914,47, | 1914,48, | 1914,49, | 1914,50, | 1914,51, | 1914,52, | 1914,53, | 1914,54, | 1914,55, | 1914,56, | 1914,57, | 1914,58, | 1914,59, | 1914,60, | 1914,61, | 1914,62, | 1914,63, | 1914,64, | 1914,65, | 1914,66, | 1914,67, | 1914,68, | 1914,69, | 1914,70, | 1914,71, | 1914,72, | 1914,73, | 1914,74, | 1914,75, | 1914,76, | 1914,77, | 1914,78, | 1914,79, | 1914,80, | 1914,81, | 1914,82, | 1914,83, | 1914,84, | 1914,85, | 1915,1, | 1915,2, | 1915,3, | 1915,4, | 1915,5, | 1915,6, | 1915,7, | 1915,8, | 1915,9, | 1915,10, | 1915,11, | 1915,12, | 1915,13, | 1915,14, | 1915,15, | 1915,16, | 1915,17, | 1915,18, | 1915,19, | 1915,20, | 1915,21, | 1915,22, | 1915,23, | 1915,24, | 1915,25, | 1915,26, | 1915,27, | 1915,28, | 1915,29, | 1915,30, | 1915,31, | 1915,32, | 1915,33, | 1915,34, | 1915,35, | 1915,36, | 1915,37, | 1915,38, | 1915,39, | 1915,40, | 1915,41, | 1915,42, | 1915,43, | 1915,44, | 1915,45, | 1915,46, | 1915,47, | 1915,48, | 1915,49, | 1915,50, | 1915,51, | 1915,52, | 1915,53, | 1915,54, | 1915,55, | 1915,56, | 1915,57, | 1915,58, | 1915,59, | 1915,60, | 1915,61, | 1915,62, | 1915,63, | 1915,64, | 1915,65, | 1915,66, | 1915,67, | 1915,68, | 1915,69, | 1915,70, | 1915,71, | 1915,72, | 1915,73, | 1915,74, | 1915,75, | 1915,76, | 1915,77, | 1915,78, | 1915,79, | 1915,80, | 1915,81, | 1915,82, | 1915,83, | 1915,84, | 1915,85, | 1916,1, | 1916,2, | 1916,3, | 1916,4, | 1916,5, | 1916,6, | 1916,7, | 1916,8, | 1916,9, | 1916,10, | 1916,11, | 1916,12, | 1916,13, | 1916,14, | 1916,15, | 1916,16, | 1916,17, | 1916,18, | 1916,19, | 1916,20, | 1916,21, | 1916,22, | 1916,23, | 1916,24, | 1916,25, | 1916,26, | 1916,27, | 1916,28, | 1916,29, | 1916,30, | 1916,31, | 1916,32, | 1916,33, | 1916,34, | 1916,35, | 1916,36, | 1916,37, | 1916,38, | 1916,39, | 1916,40, | 1916,41, | 1916,42, | 1916,43, | 1916,44, | 1916,45, | 1916,46, | 1916,47, | 1916,48, | 1916,49, | 1916,50, | 1916,51, | 1916,52, | 1916,53, | 1916,54, | 1916,55, | 1916,56, | 1916,57, | 1916,58, | 1916,59, | 1916,60, | 1916,61, | 1916,62, | 1916,63, | 1916,64, | 1916,65, | 1916,66, | 1916,67, | 1916,68, | 1916,69, | 1916,70, | 1916,71, | 1916,72, | 1916,73, | 1916,74, | 1916,75, | 1916,76, | 1916,77, | 1916,78, | 1916,79, | 1916,80, | 1916,81, | 1916,82, | 1916,83, | 1916,84, | 1916,85, | 1917,1, | 1917,2, | 1917,3, | 1917,4, | 1917,5, | 1917,6, | 1917,7, | 1917,8, | 1917,9, | 1917,10, | 1917,11, | 1917,12, | 1917,13, | 1917,14, | 1917,15, | 1917,16, | 1917,17, | 1917,18, | 1917,19, | 1917,20, | 1917,21, | 1917,22, | 1917,23, | 1917,24, | 1917,25, | 1917,26, | 1917,27, | 1917,28, | 1917,29, | 1917,30, | 1917,31, | 1917,32, | 1917,33, | 1917,34, | 1917,35, | 1917,36, | 1917,37, | 1917,38, | 1917,39, | 1917,40, | 1917,41, | 1917,42, | 1917,43, | 1917,44, | 1917,45, | 1917,46, | 1917,47, | 1917,48, | 1917,49, | 1917,50, | 1917,51, | 1917,52, | 1917,53, | 1917,54, | 1917,55, | 1917,56, | 1917,57, | 1917,58, | 1917,59, | 1917,60, | 1917,61, | 1917,62, | 1917,63, | 1917,64, | 1917,65, | 1917,66, | 1917,67, | 1917,68, | 1917,69, | 1917,70, | 1917,71, | 1917,72, | 1917,73, | 1917,74, | 1917,75, | 1917,76, | 1917,77, | 1917,78, | 1917,79, | 1917,80, | 1917,81, | 1917,82, | 1917,83, | 1917,84, | 1917,85, | 1918,1, | 1918,2, | 1918,3, | 1918,4, | 1918,5, | 1918,6, | 1918,7, | 1918,8, | 1918,9, | 1918,10, | 1918,11, | 1918,12, | 1918,13, | 1918,14, | 1918,15, | 1918,16, | 1918,17, | 1918,18, | 1918,19, | 1918,20, | 1918,21, | 1918,22, | 1918,23, | 1918,24, | 1918,25, | 1918,26, | 1918,27, | 1918,28, | 1918,29, | 1918,30, | 1918,31, | 1918,32, | 1918,33, | 1918,34, | 1918,35, | 1918,36, | 1918,37, | 1918,38, | 1918,39, | 1918,40, | 1918,41, | 1918,42, | 1918,43, | 1918,44, | 1918,45, | 1918,46, | 1918,47, | 1918,48, | 1918,49, | 1918,50, | 1918,51, | 1918,52, | 1918,53, | 1918,54, | 1918,55, | 1918,56, | 1918,57, | 1918,58, | 1918,59, | 1918,60, | 1918,61, | 1918,62, | 1918,63, | 1918,64, | 1918,65, | 1918,66, | 1918,67, | 1918,68, | 1918,69, | 1918,70, | 1918,71, | 1918,72, | 1918,73, | 1918,74, | 1918,75, | 1918,76, | 1918,77, | 1918,78, | 1918,79, | 1918,80, | 1918,81, | 1918,82, | 1918,83, | 1918,84, | 1918,85, | 1919,1, | 1919,2, | 1919,3, | 1919,4, | 1919,5, | 1919,6, | 1919,7, | 1919,8, | 1919,9, | 1919,10, | 1919,11, | 1919,12, | 1919,13, | 1919,14, | 1919,15, | 1919,16, | 1919,17, | 1919,18, | 1919,19, | 1919,20, | 1919,21, | 1919,22, | 1919,23, | 1919,24, | 1919,25, | 1919,26, | 1919,27, | 1919,28, | 1919,29, | 1919,30, | 1919,31, | 1919,32, | 1919,33, | 1919,34, | 1919,35, | 1919,36, | 1919,37, | 1919,38, | 1919,39, | 1919,40, | 1919,41, | 1919,42, | 1919,43, | 1919,44, | 1919,45, | 1919,46, | 1919,47, | 1919,48, | 1919,49, | 1919,50, | 1919,51, | 1919,52, | 1919,53, | 1919,54, | 1919,55, | 1919,56, | 1919,57, | 1919,58, | 1919,59, | 1919,60, | 1919,61, | 1919,62, | 1919,63, | 1919,64, | 1919,65, | 1919,66, | 1919,67, | 1919,68, | 1919,69, | 1919,70, | 1919,71, | 1919,72, | 1919,73, | 1919,74, | 1919,75, | 1919,76, | 1919,77, | 1919,78, | 1919,79, | 1919,80, | 1919,81, | 1919,82, | 1919,83, | 1919,84, | 1919,85, | 1920,1, | 1920,2, | 1920,3, | 1920,4, | 1920,5, | 1920,6, | 1920,7, | 1920,8, | 1920,9, | 1920,10, | 1920,11, | 1920,12, | 1920,13, | 1920,14, | 1920,15, | 1920,16, | 1920,17, | 1920,18, | 1920,19, | 1920,20, | 1920,21, | 1920,22, | 1920,23, | 1920,24, | 1920,25, | 1920,26, | 1920,27, | 1920,28, | 1920,29, | 1920,30, | 1920,31, | 1920,32, | 1920,33, | 1920,34, | 1920,35, | 1920,36, | 1920,37, | 1920,38, | 1920,39, | 1920,40, | 1920,41, | 1920,42, | 1920,43, | 1920,44, | 1920,45, | 1920,46, | 1920,47, | 1920,48, | 1920,49, | 1920,50, | 1920,51, | 1920,52, | 1920,53, | 1920,54, | 1920,55, | 1920,56, | 1920,57, | 1920,58, | 1920,59, | 1920,60, | 1920,61, | 1920,62, | 1920,63, | 1920,64, | 1920,65, | 1920,66, | 1920,67, | 1920,68, | 1920,69, | 1920,70, | 1920,71, | 1920,72, | 1920,73, | 1920,74, | 1920,75, | 1920,76, | 1920,77, | 1920,78, | 1920,79, | 1920,80, | 1920,81, | 1920,82, | 1920,83, | 1920,84, | 1920,85, | 1921,1, | 1921,2, | 1921,3, | 1921,4, | 1921,5, | 1921,6, | 1921,7, | 1921,8, | 1921,9, | 1921,10, | 1921,11, | 1921,12, | 1921,13, | 1921,14, | 1921,15, | 1921,16, | 1921,17, | 1921,18, | 1921,19, | 1921,20, | 1921,21, | 1921,22, | 1921,23, | 1921,24, | 1921,25, | 1921,26, | 1921,27, | 1921,28, | 1921,29, | 1921,30, | 1921,31, | 1921,32, | 1921,33, | 1921,34, | 1921,35, | 1921,36, | 1921,37, | 1921,38, | 1921,39, | 1921,40, | 1921,41, | 1921,42, | 1921,43, | 1921,44, | 1921,45, | 1921,46, | 1921,47, | 1921,48, | 1921,49, | 1921,50, | 1921,51, | 1921,52, | 1921,53, | 1921,54, | 1921,55, | 1921,56, | 1921,57, | 1921,58, | 1921,59, | 1921,60, | 1921,61, | 1921,62, | 1921,63, | 1921,64, | 1921,65, | 1921,66, | 1921,67, | 1921,68, | 1921,69, | 1921,70, | 1921,71, | 1921,72, | 1921,73, | 1921,74, | 1921,75, | 1921,76, | 1921,77, | 1921,78, | 1921,79, | 1921,80, | 1921,81, | 1921,82, | 1921,83, | 1921,84, | 1921,85, | 1922,1, | 1922,2, | 1922,3, | 1922,4, | 1922,5, | 1922,6, | 1922,7, | 1922,8, | 1922,9, | 1922,10, | 1922,11, | 1922,12, | 1922,13, | 1922,14, | 1922,15, | 1922,16, | 1922,17, | 1922,18, | 1922,19, | 1922,20, | 1922,21, | 1922,22, | 1922,23, | 1922,24, | 1922,25, | 1922,26, | 1922,27, | 1922,28, | 1922,29, | 1922,30, | 1922,31, | 1922,32, | 1922,33, | 1922,34, | 1922,35, | 1922,36, | 1922,37, | 1922,38, | 1922,39, | 1922,40, | 1922,41, | 1922,42, | 1922,43, | 1922,44, | 1922,45, | 1922,46, | 1922,47, | 1922,48, | 1922,49, | 1922,50, | 1922,51, | 1922,52, | 1922,53, | 1922,54, | 1922,55, | 1922,56, | 1922,57, | 1922,58, | 1922,59, | 1922,60, | 1922,61, | 1922,62, | 1922,63, | 1922,64, | 1922,65, | 1922,66, | 1922,67, | 1922,68, | 1922,69, | 1922,70, | 1922,71, | 1922,72, | 1922,73, | 1922,74, | 1922,75, | 1922,76, | 1922,77, | 1922,78, | 1922,79, | 1922,80, | 1922,81, | 1922,82, | 1922,83, | 1922,84, | 1922,85, | 1923,1, | 1923,2, | 1923,3, | 1923,4, | 1923,5, | 1923,6, | 1923,7, | 1923,8, | 1923,9, | 1923,10, | 1923,11, | 1923,12, | 1923,13, | 1923,14, | 1923,15, | 1923,16, | 1923,17, | 1923,18, | 1923,19, | 1923,20, | 1923,21, | 1923,22, | 1923,23, | 1923,24, | 1923,25, | 1923,26, | 1923,27, | 1923,28, | 1923,29, | 1923,30, | 1923,31, | 1923,32, | 1923,33, | 1923,34, | 1923,35, | 1923,36, | 1923,37, | 1923,38, | 1923,39, | 1923,40, | 1923,41, | 1923,42, | 1923,43, | 1923,44, | 1923,45, | 1923,46, | 1923,47, | 1923,48, | 1923,49, | 1923,50, | 1923,51, | 1923,52, | 1923,53, | 1923,54, | 1923,55, | 1923,56, | 1923,57, | 1923,58, | 1923,59, | 1923,60, | 1923,61, | 1923,62, | 1923,63, | 1923,64, | 1923,65, | 1923,66, | 1923,67, | 1923,68, | 1923,69, | 1923,70, | 1923,71, | 1923,72, | 1923,73, | 1923,74, | 1923,75, | 1923,76, | 1923,77, | 1923,78, | 1923,79, | 1923,80, | 1923,81, | 1923,82, | 1923,83, | 1923,84, | 1923,85, | 1924,1, | 1924,2, | 1924,3, | 1924,4, | 1924,5, | 1924,6, | 1924,7, | 1924,8, | 1924,9, | 1924,10, | 1924,11, | 1924,12, | 1924,13, | 1924,14, | 1924,15, | 1924,16, | 1924,17, | 1924,18, | 1924,19, | 1924,20, | 1924,21, | 1924,22, | 1924,23, | 1924,24, | 1924,25, | 1924,26, | 1924,27, | 1924,28, | 1924,29, | 1924,30, | 1924,31, | 1924,32, | 1924,33, | 1924,34, | 1924,35, | 1924,36, | 1924,37, | 1924,38, | 1924,39, | 1924,40, | 1924,41, | 1924,42, | 1924,43, | 1924,44, | 1924,45, | 1924,46, | 1924,47, | 1924,48, | 1924,49, | 1924,50, | 1924,51, | 1924,52, | 1924,53, | 1924,54, | 1924,55, | 1924,56, | 1924,57, | 1924,58, | 1924,59, | 1924,60, | 1924,61, | 1924,62, | 1924,63, | 1924,64, | 1924,65, | 1924,66, | 1924,67, | 1924,68, | 1924,69, | 1924,70, | 1924,71, | 1924,72, | 1924,73, | 1924,74, | 1924,75, | 1924,76, | 1924,77, | 1924,78, | 1924,79, | 1924,80, | 1924,81, | 1924,82, | 1924,83, | 1924,84, | 1924,85, | 1925,1, | 1925,2, | 1925,3, | 1925,4, | 1925,5, | 1925,6, | 1925,7, | 1925,8, | 1925,9, | 1925,10, | 1925,11, | 1925,12, | 1925,13, | 1925,14, | 1925,15, | 1925,16, | 1925,17, | 1925,18, | 1925,19, | 1925,20, | 1925,21, | 1925,22, | 1925,23, | 1925,24, | 1925,25, | 1925,26, | 1925,27, | 1925,28, | 1925,29, | 1925,30, | 1925,31, | 1925,32, | 1925,33, | 1925,34, | 1925,35, | 1925,36, | 1925,37, | 1925,38, | 1925,39, | 1925,40, | 1925,41, | 1925,42, | 1925,43, | 1925,44, | 1925,45, | 1925,46, | 1925,47, | 1925,48, | 1925,49, | 1925,50, | 1925,51, | 1925,52, | 1925,53, | 1925,54, | 1925,55, | 1925,56, | 1925,57, | 1925,58, | 1925,59, | 1925,60, | 1925,61, | 1925,62, | 1925,63, | 1925,64, | 1925,65, | 1925,66, | 1925,67, | 1925,68, | 1925,69, | 1925,70, | 1925,71, | 1925,72, | 1925,73, | 1925,74, | 1925,75, | 1925,76, | 1925,77, | 1925,78, | 1925,79, | 1925,80, | 1925,81, | 1925,82, | 1925,83, | 1925,84, | 1925,85, | 1926,1, | 1926,2, | 1926,3, | 1926,4, | 1926,5, | 1926,6, | 1926,7, | 1926,8, | 1926,9, | 1926,10, | 1926,11, | 1926,12, | 1926,13, | 1926,14, | 1926,15, | 1926,16, | 1926,17, | 1926,18, | 1926,19, | 1926,20, | 1926,21, | 1926,22, | 1926,23, | 1926,24, | 1926,25, | 1926,26, | 1926,27, | 1926,28, | 1926,29, | 1926,30, | 1926,31, | 1926,32, | 1926,33, | 1926,34, | 1926,35, | 1926,36, | 1926,37, | 1926,38, | 1926,39, | 1926,40, | 1926,41, | 1926,42, | 1926,43, | 1926,44, | 1926,45, | 1926,46, | 1926,47, | 1926,48, | 1926,49, | 1926,50, | 1926,51, | 1926,52, | 1926,53, | 1926,54, | 1926,55, | 1926,56, | 1926,57, | 1926,58, | 1926,59, | 1926,60, | 1926,61, | 1926,62, | 1926,63, | 1926,64, | 1926,65, | 1926,66, | 1926,67, | 1926,68, | 1926,69, | 1926,70, | 1926,71, | 1926,72, | 1926,73, | 1926,74, | 1926,75, | 1926,76, | 1926,77, | 1926,78, | 1926,79, | 1926,80, | 1926,81, | 1926,82, | 1926,83, | 1926,84, | 1926,85, | 1927,1, | 1927,2, | 1927,3, | 1927,4, | 1927,5, | 1927,6, | 1927,7, | 1927,8, | 1927,9, | 1927,10, | 1927,11, | 1927,12, | 1927,13, | 1927,14, | 1927,15, | 1927,16, | 1927,17, | 1927,18, | 1927,19, | 1927,20, | 1927,21, | 1927,22, | 1927,23, | 1927,24, | 1927,25, | 1927,26, | 1927,27, | 1927,28, | 1927,29, | 1927,30, | 1927,31, | 1927,32, | 1927,33, | 1927,34, | 1927,35, | 1927,36, | 1927,37, | 1927,38, | 1927,39, | 1927,40, | 1927,41, | 1927,42, | 1927,43, | 1927,44, | 1927,45, | 1927,46, | 1927,47, | 1927,48, | 1927,49, | 1927,50, | 1927,51, | 1927,52, | 1927,53, | 1927,54, | 1927,55, | 1927,56, | 1927,57, | 1927,58, | 1927,59, | 1927,60, | 1927,61, | 1927,62, | 1927,63, | 1927,64, | 1927,65, | 1927,66, | 1927,67, | 1927,68, | 1927,69, | 1927,70, | 1927,71, | 1927,72, | 1927,73, | 1927,74, | 1927,75, | 1927,76, | 1927,77, | 1927,78, | 1927,79, | 1927,80, | 1927,81, | 1927,82, | 1927,83, | 1927,84, | 1927,85, | 1928,1, | 1928,2, | 1928,3, | 1928,4, | 1928,5, | 1928,6, | 1928,7, | 1928,8, | 1928,9, | 1928,10, | 1928,11, | 1928,12, | 1928,13, | 1928,14, | 1928,15, | 1928,16, | 1928,17, | 1928,18, | 1928,19, | 1928,20, | 1928,21, | 1928,22, | 1928,23, | 1928,24, | 1928,25, | 1928,26, | 1928,27, | 1928,28, | 1928,29, | 1928,30, | 1928,31, | 1928,32, | 1928,33, | 1928,34, | 1928,35, | 1928,36, | 1928,37, | 1928,38, | 1928,39, | 1928,40, | 1928,41, | 1928,42, | 1928,43, | 1928,44, | 1928,45, | 1928,46, | 1928,47, | 1928,48, | 1928,49, | 1928,50, | 1928,51, | 1928,52, | 1928,53, | 1928,54, | 1928,55, | 1928,56, | 1928,57, | 1928,58, | 1928,59, | 1928,60, | 1928,61, | 1928,62, | 1928,63, | 1928,64, | 1928,65, | 1928,66, | 1928,67, | 1928,68, | 1928,69, | 1928,70, | 1928,71, | 1928,72, | 1928,73, | 1928,74, | 1928,75, | 1928,76, | 1928,77, | 1928,78, | 1928,79, | 1928,80, | 1928,81, | 1928,82, | 1928,83, | 1928,84, | 1928,85, | 1929,1, | 1929,2, | 1929,3, | 1929,4, | 1929,5, | 1929,6, | 1929,7, | 1929,8, | 1929,9, | 1929,10, | 1929,11, | 1929,12, | 1929,13, | 1929,14, | 1929,15, | 1929,16, | 1929,17, | 1929,18, | 1929,19, | 1929,20, | 1929,21, | 1929,22, | 1929,23, | 1929,24, | 1929,25, | 1929,26, | 1929,27, | 1929,28, | 1929,29, | 1929,30, | 1929,31, | 1929,32, | 1929,33, | 1929,34, | 1929,35, | 1929,36, | 1929,37, | 1929,38, | 1929,39, | 1929,40, | 1929,41, | 1929,42, | 1929,43, | 1929,44, | 1929,45, | 1929,46, | 1929,47, | 1929,48, | 1929,49, | 1929,50, | 1929,51, | 1929,52, | 1929,53, | 1929,54, | 1929,55, | 1929,56, | 1929,57, | 1929,58, | 1929,59, | 1929,60, | 1929,61, | 1929,62, | 1929,63, | 1929,64, | 1929,65, | 1929,66, | 1929,67, | 1929,68, | 1929,69, | 1929,70, | 1929,71, | 1929,72, | 1929,73, | 1929,74, | 1929,75, | 1929,76, | 1929,77, | 1929,78, | 1929,79, | 1929,80, | 1929,81, | 1929,82, | 1929,83, | 1929,84, | 1929,85, | 1930,1, | 1930,2, | 1930,3, | 1930,4, | 1930,5, | 1930,6, | 1930,7, | 1930,8, | 1930,9, | 1930,10, | 1930,11, | 1930,12, | 1930,13, | 1930,14, | 1930,15, | 1930,16, | 1930,17, | 1930,18, | 1930,19, | 1930,20, | 1930,21, | 1930,22, | 1930,23, | 1930,24, | 1930,25, | 1930,26, | 1930,27, | 1930,28, | 1930,29, | 1930,30, | 1930,31, | 1930,32, | 1930,33, | 1930,34, | 1930,35, | 1930,36, | 1930,37, | 1930,38, | 1930,39, | 1930,40, | 1930,41, | 1930,42, | 1930,43, | 1930,44, | 1930,45, | 1930,46, | 1930,47, | 1930,48, | 1930,49, | 1930,50, | 1930,51, | 1930,52, | 1930,53, | 1930,54, | 1930,55, | 1930,56, | 1930,57, | 1930,58, | 1930,59, | 1930,60, | 1930,61, | 1930,62, | 1930,63, | 1930,64, | 1930,65, | 1930,66, | 1930,67, | 1930,68, | 1930,69, | 1930,70, | 1930,71, | 1930,72, | 1930,73, | 1930,74, | 1930,75, | 1930,76, | 1930,77, | 1930,78, | 1930,79, | 1930,80, | 1930,81, | 1930,82, | 1930,83, | 1930,84, | 1930,85, | 1931,1, | 1931,2, | 1931,3, | 1931,4, | 1931,5, | 1931,6, | 1931,7, | 1931,8, | 1931,9, | 1931,10, | 1931,11, | 1931,12, | 1931,13, | 1931,14, | 1931,15, | 1931,16, | 1931,17, | 1931,18, | 1931,19, | 1931,20, | 1931,21, | 1931,22, | 1931,23, | 1931,24, | 1931,25, | 1931,26, | 1931,27, | 1931,28, | 1931,29, | 1931,30, | 1931,31, | 1931,32, | 1931,33, | 1931,34, | 1931,35, | 1931,36, | 1931,37, | 1931,38, | 1931,39, | 1931,40, | 1931,41, | 1931,42, | 1931,43, | 1931,44, | 1931,45, | 1931,46, | 1931,47, | 1931,48, | 1931,49, | 1931,50, | 1931,51, | 1931,52, | 1931,53, | 1931,54, | 1931,55, | 1931,56, | 1931,57, | 1931,58, | 1931,59, | 1931,60, | 1931,61, | 1931,62, | 1931,63, | 1931,64, | 1931,65, | 1931,66, | 1931,67, | 1931,68, | 1931,69, | 1931,70, | 1931,71, | 1931,72, | 1931,73, | 1931,74, | 1931,75, | 1931,76, | 1931,77, | 1931,78, | 1931,79, | 1931,80, | 1931,81, | 1931,82, | 1931,83, | 1931,84, | 1931,85, | 1932,1, | 1932,2, | 1932,3, | 1932,4, | 1932,5, | 1932,6, | 1932,7, | 1932,8, | 1932,9, | 1932,10, | 1932,11, | 1932,12, | 1932,13, | 1932,14, | 1932,15, | 1932,16, | 1932,17, | 1932,18, | 1932,19, | 1932,20, | 1932,21, | 1932,22, | 1932,23, | 1932,24, | 1932,25, | 1932,26, | 1932,27, | 1932,28, | 1932,29, | 1932,30, | 1932,31, | 1932,32, | 1932,33, | 1932,34, | 1932,35, | 1932,36, | 1932,37, | 1932,38, | 1932,39, | 1932,40, | 1932,41, | 1932,42, | 1932,43, | 1932,44, | 1932,45, | 1932,46, | 1932,47, | 1932,48, | 1932,49, | 1932,50, | 1932,51, | 1932,52, | 1932,53, | 1932,54, | 1932,55, | 1932,56, | 1932,57, | 1932,58, | 1932,59, | 1932,60, | 1932,61, | 1932,62, | 1932,63, | 1932,64, | 1932,65, | 1932,66, | 1932,67, | 1932,68, | 1932,69, | 1932,70, | 1932,71, | 1932,72, | 1932,73, | 1932,74, | 1932,75, | 1932,76, | 1932,77, | 1932,78, | 1932,79, | 1932,80, | 1932,81, | 1932,82, | 1932,83, | 1932,84, | 1932,85, | 1933,1, | 1933,2, | 1933,3, | 1933,4, | 1933,5, | 1933,6, | 1933,7, | 1933,8, | 1933,9, | 1933,10, | 1933,11, | 1933,12, | 1933,13, | 1933,14, | 1933,15, | 1933,16, | 1933,17, | 1933,18, | 1933,19, | 1933,20, | 1933,21, | 1933,22, | 1933,23, | 1933,24, | 1933,25, | 1933,26, | 1933,27, | 1933,28, | 1933,29, | 1933,30, | 1933,31, | 1933,32, | 1933,33, | 1933,34, | 1933,35, | 1933,36, | 1933,37, | 1933,38, | 1933,39, | 1933,40, | 1933,41, | 1933,42, | 1933,43, | 1933,44, | 1933,45, | 1933,46, | 1933,47, | 1933,48, | 1933,49, | 1933,50, | 1933,51, | 1933,52, | 1933,53, | 1933,54, | 1933,55, | 1933,56, | 1933,57, | 1933,58, | 1933,59, | 1933,60, | 1933,61, | 1933,62, | 1933,63, | 1933,64, | 1933,65, | 1933,66, | 1933,67, | 1933,68, | 1933,69, | 1933,70, | 1933,71, | 1933,72, | 1933,73, | 1933,74, | 1933,75, | 1933,76, | 1933,77, | 1933,78, | 1933,79, | 1933,80, | 1933,81, | 1933,82, | 1933,83, | 1933,84, | 1933,85, | 1934,1, | 1934,2, | 1934,3, | 1934,4, | 1934,5, | 1934,6, | 1934,7, | 1934,8, | 1934,9, | 1934,10, | 1934,11, | 1934,12, | 1934,13, | 1934,14, | 1934,15, | 1934,16, | 1934,17, | 1934,18, | 1934,19, | 1934,20, | 1934,21, | 1934,22, | 1934,23, | 1934,24, | 1934,25, | 1934,26, | 1934,27, | 1934,28, | 1934,29, | 1934,30, | 1934,31, | 1934,32, | 1934,33, | 1934,34, | 1934,35, | 1934,36, | 1934,37, | 1934,38, | 1934,39, | 1934,40, | 1934,41, | 1934,42, | 1934,43, | 1934,44, | 1934,45, | 1934,46, | 1934,47, | 1934,48, | 1934,49, | 1934,50, | 1934,51, | 1934,52, | 1934,53, | 1934,54, | 1934,55, | 1934,56, | 1934,57, | 1934,58, | 1934,59, | 1934,60, | 1934,61, | 1934,62, | 1934,63, | 1934,64, | 1934,65, | 1934,66, | 1934,67, | 1934,68, | 1934,69, | 1934,70, | 1934,71, | 1934,72, | 1934,73, | 1934,74, | 1934,75, | 1934,76, | 1934,77, | 1934,78, | 1934,79, | 1934,80, | 1934,81, | 1934,82, | 1934,83, | 1934,84, | 1934,85, | 1935,1, | 1935,2, | 1935,3, | 1935,4, | 1935,5, | 1935,6, | 1935,7, | 1935,8, | 1935,9, | 1935,10, | 1935,11, | 1935,12, | 1935,13, | 1935,14, | 1935,15, | 1935,16, | 1935,17, | 1935,18, | 1935,19, | 1935,20, | 1935,21, | 1935,22, | 1935,23, | 1935,24, | 1935,25, | 1935,26, | 1935,27, | 1935,28, | 1935,29, | 1935,30, | 1935,31, | 1935,32, | 1935,33, | 1935,34, | 1935,35, | 1935,36, | 1935,37, | 1935,38, | 1935,39, | 1935,40, | 1935,41, | 1935,42, | 1935,43, | 1935,44, | 1935,45, | 1935,46, | 1935,47, | 1935,48, | 1935,49, | 1935,50, | 1935,51, | 1935,52, | 1935,53, | 1935,54, | 1935,55, | 1935,56, | 1935,57, | 1935,58, | 1935,59, | 1935,60, | 1935,61, | 1935,62, | 1935,63, | 1935,64, | 1935,65, | 1935,66, | 1935,67, | 1935,68, | 1935,69, | 1935,70, | 1935,71, | 1935,72, | 1935,73, | 1935,74, | 1935,75, | 1935,76, | 1935,77, | 1935,78, | 1935,79, | 1935,80, | 1935,81, | 1935,82, | 1935,83, | 1935,84, | 1935,85, | 1936,1, | 1936,2, | 1936,3, | 1936,4, | 1936,5, | 1936,6, | 1936,7, | 1936,8, | 1936,9, | 1936,10, | 1936,11, | 1936,12, | 1936,13, | 1936,14, | 1936,15, | 1936,16, | 1936,17, | 1936,18, | 1936,19, | 1936,20, | 1936,21, | 1936,22, | 1936,23, | 1936,24, | 1936,25, | 1936,26, | 1936,27, | 1936,28, | 1936,29, | 1936,30, | 1936,31, | 1936,32, | 1936,33, | 1936,34, | 1936,35, | 1936,36, | 1936,37, | 1936,38, | 1936,39, | 1936,40, | 1936,41, | 1936,42, | 1936,43, | 1936,44, | 1936,45, | 1936,46, | 1936,47, | 1936,48, | 1936,49, | 1936,50, | 1936,51, | 1936,52, | 1936,53, | 1936,54, | 1936,55, | 1936,56, | 1936,57, | 1936,58, | 1936,59, | 1936,60, | 1936,61, | 1936,62, | 1936,63, | 1936,64, | 1936,65, | 1936,66, | 1936,67, | 1936,68, | 1936,69, | 1936,70, | 1936,71, | 1936,72, | 1936,73, | 1936,74, | 1936,75, | 1936,76, | 1936,77, | 1936,78, | 1936,79, | 1936,80, | 1936,81, | 1936,82, | 1936,83, | 1936,84, | 1936,85, | 1937,1, | 1937,2, | 1937,3, | 1937,4, | 1937,5, | 1937,6, | 1937,7, | 1937,8, | 1937,9, | 1937,10, | 1937,11, | 1937,12, | 1937,13, | 1937,14, | 1937,15, | 1937,16, | 1937,17, | 1937,18, | 1937,19, | 1937,20, | 1937,21, | 1937,22, | 1937,23, | 1937,24, | 1937,25, | 1937,26, | 1937,27, | 1937,28, | 1937,29, | 1937,30, | 1937,31, | 1937,32, | 1937,33, | 1937,34, | 1937,35, | 1937,36, | 1937,37, | 1937,38, | 1937,39, | 1937,40, | 1937,41, | 1937,42, | 1937,43, | 1937,44, | 1937,45, | 1937,46, | 1937,47, | 1937,48, | 1937,49, | 1937,50, | 1937,51, | 1937,52, | 1937,53, | 1937,54, | 1937,55, | 1937,56, | 1937,57, | 1937,58, | 1937,59, | 1937,60, | 1937,61, | 1937,62, | 1937,63, | 1937,64, | 1937,65, | 1937,66, | 1937,67, | 1937,68, | 1937,69, | 1937,70, | 1937,71, | 1937,72, | 1937,73, | 1937,74, | 1937,75, | 1937,76, | 1937,77, | 1937,78, | 1937,79, | 1937,80, | 1937,81, | 1937,82, | 1937,83, | 1937,84, | 1937,85, | 1938,1, | 1938,2, | 1938,3, | 1938,4, | 1938,5, | 1938,6, | 1938,7, | 1938,8, | 1938,9, | 1938,10, | 1938,11, | 1938,12, | 1938,13, | 1938,14, | 1938,15, | 1938,16, | 1938,17, | 1938,18, | 1938,19, | 1938,20, | 1938,21, | 1938,22, | 1938,23, | 1938,24, | 1938,25, | 1938,26, | 1938,27, | 1938,28, | 1938,29, | 1938,30, | 1938,31, | 1938,32, | 1938,33, | 1938,34, | 1938,35, | 1938,36, | 1938,37, | 1938,38, | 1938,39, | 1938,40, | 1938,41, | 1938,42, | 1938,43, | 1938,44, | 1938,45, | 1938,46, | 1938,47, | 1938,48, | 1938,49, | 1938,50, | 1938,51, | 1938,52, | 1938,53, | 1938,54, | 1938,55, | 1938,56, | 1938,57, | 1938,58, | 1938,59, | 1938,60, | 1938,61, | 1938,62, | 1938,63, | 1938,64, | 1938,65, | 1938,66, | 1938,67, | 1938,68, | 1938,69, | 1938,70, | 1938,71, | 1938,72, | 1938,73, | 1938,74, | 1938,75, | 1938,76, | 1938,77, | 1938,78, | 1938,79, | 1938,80, | 1938,81, | 1938,82, | 1938,83, | 1938,84, | 1938,85, | 1939,1, | 1939,2, | 1939,3, | 1939,4, | 1939,5, | 1939,6, | 1939,7, | 1939,8, | 1939,9, | 1939,10, | 1939,11, | 1939,12, | 1939,13, | 1939,14, | 1939,15, | 1939,16, | 1939,17, | 1939,18, | 1939,19, | 1939,20, | 1939,21, | 1939,22, | 1939,23, | 1939,24, | 1939,25, | 1939,26, | 1939,27, | 1939,28, | 1939,29, | 1939,30, | 1939,31, | 1939,32, | 1939,33, | 1939,34, | 1939,35, | 1939,36, | 1939,37, | 1939,38, | 1939,39, | 1939,40, | 1939,41, | 1939,42, | 1939,43, | 1939,44, | 1939,45, | 1939,46, | 1939,47, | 1939,48, | 1939,49, | 1939,50, | 1939,51, | 1939,52, | 1939,53, | 1939,54, | 1939,55, | 1939,56, | 1939,57, | 1939,58, | 1939,59, | 1939,60, | 1939,61, | 1939,62, | 1939,63, | 1939,64, | 1939,65, | 1939,66, | 1939,67, | 1939,68, | 1939,69, | 1939,70, | 1939,71, | 1939,72, | 1939,73, | 1939,74, | 1939,75, | 1939,76, | 1939,77, | 1939,78, | 1939,79, | 1939,80, | 1939,81, | 1939,82, | 1939,83, | 1939,84, | 1939,85, | 1940,1, | 1940,2, | 1940,3, | 1940,4, | 1940,5, | 1940,6, | 1940,7, | 1940,8, | 1940,9, | 1940,10, | 1940,11, | 1940,12, | 1940,13, | 1940,14, | 1940,15, | 1940,16, | 1940,17, | 1940,18, | 1940,19, | 1940,20, | 1940,21, | 1940,22, | 1940,23, | 1940,24, | 1940,25, | 1940,26, | 1940,27, | 1940,28, | 1940,29, | 1940,30, | 1940,31, | 1940,32, | 1940,33, | 1940,34, | 1940,35, | 1940,36, | 1940,37, | 1940,38, | 1940,39, | 1940,40, | 1940,41, | 1940,42, | 1940,43, | 1940,44, | 1940,45, | 1940,46, | 1940,47, | 1940,48, | 1940,49, | 1940,50, | 1940,51, | 1940,52, | 1940,53, | 1940,54, | 1940,55, | 1940,56, | 1940,57, | 1940,58, | 1940,59, | 1940,60, | 1940,61, | 1940,62, | 1940,63, | 1940,64, | 1940,65, | 1940,66, | 1940,67, | 1940,68, | 1940,69, | 1940,70, | 1940,71, | 1940,72, | 1940,73, | 1940,74, | 1940,75, | 1940,76, | 1940,77, | 1940,78, | 1940,79, | 1940,80, | 1940,81, | 1940,82, | 1940,83, | 1940,84, | 1940,85, | 1941,1, | 1941,2, | 1941,3, | 1941,4, | 1941,5, | 1941,6, | 1941,7, | 1941,8, | 1941,9, | 1941,10, | 1941,11, | 1941,12, | 1941,13, | 1941,14, | 1941,15, | 1941,16, | 1941,17, | 1941,18, | 1941,19, | 1941,20, | 1941,21, | 1941,22, | 1941,23, | 1941,24, | 1941,25, | 1941,26, | 1941,27, | 1941,28, | 1941,29, | 1941,30, | 1941,31, | 1941,32, | 1941,33, | 1941,34, | 1941,35, | 1941,36, | 1941,37, | 1941,38, | 1941,39, | 1941,40, | 1941,41, | 1941,42, | 1941,43, | 1941,44, | 1941,45, | 1941,46, | 1941,47, | 1941,48, | 1941,49, | 1941,50, | 1941,51, | 1941,52, | 1941,53, | 1941,54, | 1941,55, | 1941,56, | 1941,57, | 1941,58, | 1941,59, | 1941,60, | 1941,61, | 1941,62, | 1941,63, | 1941,64, | 1941,65, | 1941,66, | 1941,67, | 1941,68, | 1941,69, | 1941,70, | 1941,71, | 1941,72, | 1941,73, | 1941,74, | 1941,75, | 1941,76, | 1941,77, | 1941,78, | 1941,79, | 1941,80, | 1941,81, | 1941,82, | 1941,83, | 1941,84, | 1941,85, | 1942,1, | 1942,2, | 1942,3, | 1942,4, | 1942,5, | 1942,6, | 1942,7, | 1942,8, | 1942,9, | 1942,10, | 1942,11, | 1942,12, | 1942,13, | 1942,14, | 1942,15, | 1942,16, | 1942,17, | 1942,18, | 1942,19, | 1942,20, | 1942,21, | 1942,22, | 1942,23, | 1942,24, | 1942,25, | 1942,26, | 1942,27, | 1942,28, | 1942,29, | 1942,30, | 1942,31, | 1942,32, | 1942,33, | 1942,34, | 1942,35, | 1942,36, | 1942,37, | 1942,38, | 1942,39, | 1942,40, | 1942,41, | 1942,42, | 1942,43, | 1942,44, | 1942,45, | 1942,46, | 1942,47, | 1942,48, | 1942,49, | 1942,50, | 1942,51, | 1942,52, | 1942,53, | 1942,54, | 1942,55, | 1942,56, | 1942,57, | 1942,58, | 1942,59, | 1942,60, | 1942,61, | 1942,62, | 1942,63, | 1942,64, | 1942,65, | 1942,66, | 1942,67, | 1942,68, | 1942,69, | 1942,70, | 1942,71, | 1942,72, | 1942,73, | 1942,74, | 1942,75, | 1942,76, | 1942,77, | 1942,78, | 1942,79, | 1942,80, | 1942,81, | 1942,82, | 1942,83, | 1942,84, | 1942,85, | 1943,1, | 1943,2, | 1943,3, | 1943,4, | 1943,5, | 1943,6, | 1943,7, | 1943,8, | 1943,9, | 1943,10, | 1943,11, | 1943,12, | 1943,13, | 1943,14, | 1943,15, | 1943,16, | 1943,17, | 1943,18, | 1943,19, | 1943,20, | 1943,21, | 1943,22, | 1943,23, | 1943,24, | 1943,25, | 1943,26, | 1943,27, | 1943,28, | 1943,29, | 1943,30, | 1943,31, | 1943,32, | 1943,33, | 1943,34, | 1943,35, | 1943,36, | 1943,37, | 1943,38, | 1943,39, | 1943,40, | 1943,41, | 1943,42, | 1943,43, | 1943,44, | 1943,45, | 1943,46, | 1943,47, | 1943,48, | 1943,49, | 1943,50, | 1943,51, | 1943,52, | 1943,53, | 1943,54, | 1943,55, | 1943,56, | 1943,57, | 1943,58, | 1943,59, | 1943,60, | 1943,61, | 1943,62, | 1943,63, | 1943,64, | 1943,65, | 1943,66, | 1943,67, | 1943,68, | 1943,69, | 1943,70, | 1943,71, | 1943,72, | 1943,73, | 1943,74, | 1943,75, | 1943,76, | 1943,77, | 1943,78, | 1943,79, | 1943,80, | 1943,81, | 1943,82, | 1943,83, | 1943,84, | 1943,85, | 1944,1, | 1944,2, | 1944,3, | 1944,4, | 1944,5, | 1944,6, | 1944,7, | 1944,8, | 1944,9, | 1944,10, | 1944,11, | 1944,12, | 1944,13, | 1944,14, | 1944,15, | 1944,16, | 1944,17, | 1944,18, | 1944,19, | 1944,20, | 1944,21, | 1944,22, | 1944,23, | 1944,24, | 1944,25, | 1944,26, | 1944,27, | 1944,28, | 1944,29, | 1944,30, | 1944,31, | 1944,32, | 1944,33, | 1944,34, | 1944,35, | 1944,36, | 1944,37, | 1944,38, | 1944,39, | 1944,40, | 1944,41, | 1944,42, | 1944,43, | 1944,44, | 1944,45, | 1944,46, | 1944,47, | 1944,48, | 1944,49, | 1944,50, | 1944,51, | 1944,52, | 1944,53, | 1944,54, | 1944,55, | 1944,56, | 1944,57, | 1944,58, | 1944,59, | 1944,60, | 1944,61, | 1944,62, | 1944,63, | 1944,64, | 1944,65, | 1944,66, | 1944,67, | 1944,68, | 1944,69, | 1944,70, | 1944,71, | 1944,72, | 1944,73, | 1944,74, | 1944,75, | 1944,76, | 1944,77, | 1944,78, | 1944,79, | 1944,80, | 1944,81, | 1944,82, | 1944,83, | 1944,84, | 1944,85, | 1945,1, | 1945,2, | 1945,3, | 1945,4, | 1945,5, | 1945,6, | 1945,7, | 1945,8, | 1945,9, | 1945,10, | 1945,11, | 1945,12, | 1945,13, | 1945,14, | 1945,15, | 1945,16, | 1945,17, | 1945,18, | 1945,19, | 1945,20, | 1945,21, | 1945,22, | 1945,23, | 1945,24, | 1945,25, | 1945,26, | 1945,27, | 1945,28, | 1945,29, | 1945,30, | 1945,31, | 1945,32, | 1945,33, | 1945,34, | 1945,35, | 1945,36, | 1945,37, | 1945,38, | 1945,39, | 1945,40, | 1945,41, | 1945,42, | 1945,43, | 1945,44, | 1945,45, | 1945,46, | 1945,47, | 1945,48, | 1945,49, | 1945,50, | 1945,51, | 1945,52, | 1945,53, | 1945,54, | 1945,55, | 1945,56, | 1945,57, | 1945,58, | 1945,59, | 1945,60, | 1945,61, | 1945,62, | 1945,63, | 1945,64, | 1945,65, | 1945,66, | 1945,67, | 1945,68, | 1945,69, | 1945,70, | 1945,71, | 1945,72, | 1945,73, | 1945,74, | 1945,75, | 1945,76, | 1945,77, | 1945,78, | 1945,79, | 1945,80, | 1945,81, | 1945,82, | 1945,83, | 1945,84, | 1945,85, | 1946,1, | 1946,2, | 1946,3, | 1946,4, | 1946,5, | 1946,6, | 1946,7, | 1946,8, | 1946,9, | 1946,10, | 1946,11, | 1946,12, | 1946,13, | 1946,14, | 1946,15, | 1946,16, | 1946,17, | 1946,18, | 1946,19, | 1946,20, | 1946,21, | 1946,22, | 1946,23, | 1946,24, | 1946,25, | 1946,26, | 1946,27, | 1946,28, | 1946,29, | 1946,30, | 1946,31, | 1946,32, | 1946,33, | 1946,34, | 1946,35, | 1946,36, | 1946,37, | 1946,38, | 1946,39, | 1946,40, | 1946,41, | 1946,42, | 1946,43, | 1946,44, | 1946,45, | 1946,46, | 1946,47, | 1946,48, | 1946,49, | 1946,50, | 1946,51, | 1946,52, | 1946,53, | 1946,54, | 1946,55, | 1946,56, | 1946,57, | 1946,58, | 1946,59, | 1946,60, | 1946,61, | 1946,62, | 1946,63, | 1946,64, | 1946,65, | 1946,66, | 1946,67, | 1946,68, | 1946,69, | 1946,70, | 1946,71, | 1946,72, | 1946,73, | 1946,74, | 1946,75, | 1946,76, | 1946,77, | 1946,78, | 1946,79, | 1946,80, | 1946,81, | 1946,82, | 1946,83, | 1946,84, | 1946,85, | 1947,1, | 1947,2, | 1947,3, | 1947,4, | 1947,5, | 1947,6, | 1947,7, | 1947,8, | 1947,9, | 1947,10, | 1947,11, | 1947,12, | 1947,13, | 1947,14, | 1947,15, | 1947,16, | 1947,17, | 1947,18, | 1947,19, | 1947,20, | 1947,21, | 1947,22, | 1947,23, | 1947,24, | 1947,25, | 1947,26, | 1947,27, | 1947,28, | 1947,29, | 1947,30, | 1947,31, | 1947,32, | 1947,33, | 1947,34, | 1947,35, | 1947,36, | 1947,37, | 1947,38, | 1947,39, | 1947,40, | 1947,41, | 1947,42, | 1947,43, | 1947,44, | 1947,45, | 1947,46, | 1947,47, | 1947,48, | 1947,49, | 1947,50, | 1947,51, | 1947,52, | 1947,53, | 1947,54, | 1947,55, | 1947,56, | 1947,57, | 1947,58, | 1947,59, | 1947,60, | 1947,61, | 1947,62, | 1947,63, | 1947,64, | 1947,65, | 1947,66, | 1947,67, | 1947,68, | 1947,69, | 1947,70, | 1947,71, | 1947,72, | 1947,73, | 1947,74, | 1947,75, | 1947,76, | 1947,77, | 1947,78, | 1947,79, | 1947,80, | 1947,81, | 1947,82, | 1947,83, | 1947,84, | 1947,85, | 1948,1, | 1948,2, | 1948,3, | 1948,4, | 1948,5, | 1948,6, | 1948,7, | 1948,8, | 1948,9, | 1948,10, | 1948,11, | 1948,12, | 1948,13, | 1948,14, | 1948,15, | 1948,16, | 1948,17, | 1948,18, | 1948,19, | 1948,20, | 1948,21, | 1948,22, | 1948,23, | 1948,24, | 1948,25, | 1948,26, | 1948,27, | 1948,28, | 1948,29, | 1948,30, | 1948,31, | 1948,32, | 1948,33, | 1948,34, | 1948,35, | 1948,36, | 1948,37, | 1948,38, | 1948,39, | 1948,40, | 1948,41, | 1948,42, | 1948,43, | 1948,44, | 1948,45, | 1948,46, | 1948,47, | 1948,48, | 1948,49, | 1948,50, | 1948,51, | 1948,52, | 1948,53, | 1948,54, | 1948,55, | 1948,56, | 1948,57, | 1948,58, | 1948,59, | 1948,60, | 1948,61, | 1948,62, | 1948,63, | 1948,64, | 1948,65, | 1948,66, | 1948,67, | 1948,68, | 1948,69, | 1948,70, | 1948,71, | 1948,72, | 1948,73, | 1948,74, | 1948,75, | 1948,76, | 1948,77, | 1948,78, | 1948,79, | 1948,80, | 1948,81, | 1948,82, | 1948,83, | 1948,84, | 1948,85, | 1949,1, | 1949,2, | 1949,3, | 1949,4, | 1949,5, | 1949,6, | 1949,7, | 1949,8, | 1949,9, | 1949,10, | 1949,11, | 1949,12, | 1949,13, | 1949,14, | 1949,15, | 1949,16, | 1949,17, | 1949,18, | 1949,19, | 1949,20, | 1949,21, | 1949,22, | 1949,23, | 1949,24, | 1949,25, | 1949,26, | 1949,27, | 1949,28, | 1949,29, | 1949,30, | 1949,31, | 1949,32, | 1949,33, | 1949,34, | 1949,35, | 1949,36, | 1949,37, | 1949,38, | 1949,39, | 1949,40, | 1949,41, | 1949,42, | 1949,43, | 1949,44, | 1949,45, | 1949,46, | 1949,47, | 1949,48, | 1949,49, | 1949,50, | 1949,51, | 1949,52, | 1949,53, | 1949,54, | 1949,55, | 1949,56, | 1949,57, | 1949,58, | 1949,59, | 1949,60, | 1949,61, | 1949,62, | 1949,63, | 1949,64, | 1949,65, | 1949,66, | 1949,67, | 1949,68, | 1949,69, | 1949,70, | 1949,71, | 1949,72, | 1949,73, | 1949,74, | 1949,75, | 1949,76, | 1949,77, | 1949,78, | 1949,79, | 1949,80, | 1949,81, | 1949,82, | 1949,83, | 1949,84, | 1949,85, | 1950,1, | 1950,2, | 1950,3, | 1950,4, | 1950,5, | 1950,6, | 1950,7, | 1950,8, | 1950,9, | 1950,10, | 1950,11, | 1950,12, | 1950,13, | 1950,14, | 1950,15, | 1950,16, | 1950,17, | 1950,18, | 1950,19, | 1950,20, | 1950,21, | 1950,22, | 1950,23, | 1950,24, | 1950,25, | 1950,26, | 1950,27, | 1950,28, | 1950,29, | 1950,30, | 1950,31, | 1950,32, | 1950,33, | 1950,34, | 1950,35, | 1950,36, | 1950,37, | 1950,38, | 1950,39, | 1950,40, | 1950,41, | 1950,42, | 1950,43, | 1950,44, | 1950,45, | 1950,46, | 1950,47, | 1950,48, | 1950,49, | 1950,50, | 1950,51, | 1950,52, | 1950,53, | 1950,54, | 1950,55, | 1950,56, | 1950,57, | 1950,58, | 1950,59, | 1950,60, | 1950,61, | 1950,62, | 1950,63, | 1950,64, | 1950,65, | 1950,66, | 1950,67, | 1950,68, | 1950,69, | 1950,70, | 1950,71, | 1950,72, | 1950,73, | 1950,74, | 1950,75, | 1950,76, | 1950,77, | 1950,78, | 1950,79, | 1950,80, | 1950,81, | 1950,82, | 1950,83, | 1950,84, | 1950,85, | 1951,1, | 1951,2, | 1951,3, | 1951,4, | 1951,5, | 1951,6, | 1951,7, | 1951,8, | 1951,9, | 1951,10, | 1951,11, | 1951,12, | 1951,13, | 1951,14, | 1951,15, | 1951,16, | 1951,17, | 1951,18, | 1951,19, | 1951,20, | 1951,21, | 1951,22, | 1951,23, | 1951,24, | 1951,25, | 1951,26, | 1951,27, | 1951,28, | 1951,29, | 1951,30, | 1951,31, | 1951,32, | 1951,33, | 1951,34, | 1951,35, | 1951,36, | 1951,37, | 1951,38, | 1951,39, | 1951,40, | 1951,41, | 1951,42, | 1951,43, | 1951,44, | 1951,45, | 1951,46, | 1951,47, | 1951,48, | 1951,49, | 1951,50, | 1951,51, | 1951,52, | 1951,53, | 1951,54, | 1951,55, | 1951,56, | 1951,57, | 1951,58, | 1951,59, | 1951,60, | 1951,61, | 1951,62, | 1951,63, | 1951,64, | 1951,65, | 1951,66, | 1951,67, | 1951,68, | 1951,69, | 1951,70, | 1951,71, | 1951,72, | 1951,73, | 1951,74, | 1951,75, | 1951,76, | 1951,77, | 1951,78, | 1951,79, | 1951,80, | 1951,81, | 1951,82, | 1951,83, | 1951,84, | 1951,85, | 1952,1, | 1952,2, | 1952,3, | 1952,4, | 1952,5, | 1952,6, | 1952,7, | 1952,8, | 1952,9, | 1952,10, | 1952,11, | 1952,12, | 1952,13, | 1952,14, | 1952,15, | 1952,16, | 1952,17, | 1952,18, | 1952,19, | 1952,20, | 1952,21, | 1952,22, | 1952,23, | 1952,24, | 1952,25, | 1952,26, | 1952,27, | 1952,28, | 1952,29, | 1952,30, | 1952,31, | 1952,32, | 1952,33, | 1952,34, | 1952,35, | 1952,36, | 1952,37, | 1952,38, | 1952,39, | 1952,40, | 1952,41, | 1952,42, | 1952,43, | 1952,44, | 1952,45, | 1952,46, | 1952,47, | 1952,48, | 1952,49, | 1952,50, | 1952,51, | 1952,52, | 1952,53, | 1952,54, | 1952,55, | 1952,56, | 1952,57, | 1952,58, | 1952,59, | 1952,60, | 1952,61, | 1952,62, | 1952,63, | 1952,64, | 1952,65, | 1952,66, | 1952,67, | 1952,68, | 1952,69, | 1952,70, | 1952,71, | 1952,72, | 1952,73, | 1952,74, | 1952,75, | 1952,76, | 1952,77, | 1952,78, | 1952,79, | 1952,80, | 1952,81, | 1952,82, | 1952,83, | 1952,84, | 1952,85, | 1953,1, | 1953,2, | 1953,3, | 1953,4, | 1953,5, | 1953,6, | 1953,7, | 1953,8, | 1953,9, | 1953,10, | 1953,11, | 1953,12, | 1953,13, | 1953,14, | 1953,15, | 1953,16, | 1953,17, | 1953,18, | 1953,19, | 1953,20, | 1953,21, | 1953,22, | 1953,23, | 1953,24, | 1953,25, | 1953,26, | 1953,27, | 1953,28, | 1953,29, | 1953,30, | 1953,31, | 1953,32, | 1953,33, | 1953,34, | 1953,35, | 1953,36, | 1953,37, | 1953,38, | 1953,39, | 1953,40, | 1953,41, | 1953,42, | 1953,43, | 1953,44, | 1953,45, | 1953,46, | 1953,47, | 1953,48, | 1953,49, | 1953,50, | 1953,51, | 1953,52, | 1953,53, | 1953,54, | 1953,55, | 1953,56, | 1953,57, | 1953,58, | 1953,59, | 1953,60, | 1953,61, | 1953,62, | 1953,63, | 1953,64, | 1953,65, | 1953,66, | 1953,67, | 1953,68, | 1953,69, | 1953,70, | 1953,71, | 1953,72, | 1953,73, | 1953,74, | 1953,75, | 1953,76, | 1953,77, | 1953,78, | 1953,79, | 1953,80, | 1953,81, | 1953,82, | 1953,83, | 1953,84, | 1953,85, | 1954,1, | 1954,2, | 1954,3, | 1954,4, | 1954,5, | 1954,6, | 1954,7, | 1954,8, | 1954,9, | 1954,10, | 1954,11, | 1954,12, | 1954,13, | 1954,14, | 1954,15, | 1954,16, | 1954,17, | 1954,18, | 1954,19, | 1954,20, | 1954,21, | 1954,22, | 1954,23, | 1954,24, | 1954,25, | 1954,26, | 1954,27, | 1954,28, | 1954,29, | 1954,30, | 1954,31, | 1954,32, | 1954,33, | 1954,34, | 1954,35, | 1954,36, | 1954,37, | 1954,38, | 1954,39, | 1954,40, | 1954,41, | 1954,42, | 1954,43, | 1954,44, | 1954,45, | 1954,46, | 1954,47, | 1954,48, | 1954,49, | 1954,50, | 1954,51, | 1954,52, | 1954,53, | 1954,54, | 1954,55, | 1954,56, | 1954,57, | 1954,58, | 1954,59, | 1954,60, | 1954,61, | 1954,62, | 1954,63, | 1954,64, | 1954,65, | 1954,66, | 1954,67, | 1954,68, | 1954,69, | 1954,70, | 1954,71, | 1954,72, | 1954,73, | 1954,74, | 1954,75, | 1954,76, | 1954,77, | 1954,78, | 1954,79, | 1954,80, | 1954,81, | 1954,82, | 1954,83, | 1954,84, | 1954,85, | 1955,1, | 1955,2, | 1955,3, | 1955,4, | 1955,5, | 1955,6, | 1955,7, | 1955,8, | 1955,9, | 1955,10, | 1955,11, | 1955,12, | 1955,13, | 1955,14, | 1955,15, | 1955,16, | 1955,17, | 1955,18, | 1955,19, | 1955,20, | 1955,21, | 1955,22, | 1955,23, | 1955,24, | 1955,25, | 1955,26, | 1955,27, | 1955,28, | 1955,29, | 1955,30, | 1955,31, | 1955,32, | 1955,33, | 1955,34, | 1955,35, | 1955,36, | 1955,37, | 1955,38, | 1955,39, | 1955,40, | 1955,41, | 1955,42, | 1955,43, | 1955,44, | 1955,45, | 1955,46, | 1955,47, | 1955,48, | 1955,49, | 1955,50, | 1955,51, | 1955,52, | 1955,53, | 1955,54, | 1955,55, | 1955,56, | 1955,57, | 1955,58, | 1955,59, | 1955,60, | 1955,61, | 1955,62, | 1955,63, | 1955,64, | 1955,65, | 1955,66, | 1955,67, | 1955,68, | 1955,69, | 1955,70, | 1955,71, | 1955,72, | 1955,73, | 1955,74, | 1955,75, | 1955,76, | 1955,77, | 1955,78, | 1955,79, | 1955,80, | 1955,81, | 1955,82, | 1955,83, | 1955,84, | 1955,85, | 1956,1, | 1956,2, | 1956,3, | 1956,4, | 1956,5, | 1956,6, | 1956,7, | 1956,8, | 1956,9, | 1956,10, | 1956,11, | 1956,12, | 1956,13, | 1956,14, | 1956,15, | 1956,16, | 1956,17, | 1956,18, | 1956,19, | 1956,20, | 1956,21, | 1956,22, | 1956,23, | 1956,24, | 1956,25, | 1956,26, | 1956,27, | 1956,28, | 1956,29, | 1956,30, | 1956,31, | 1956,32, | 1956,33, | 1956,34, | 1956,35, | 1956,36, | 1956,37, | 1956,38, | 1956,39, | 1956,40, | 1956,41, | 1956,42, | 1956,43, | 1956,44, | 1956,45, | 1956,46, | 1956,47, | 1956,48, | 1956,49, | 1956,50, | 1956,51, | 1956,52, | 1956,53, | 1956,54, | 1956,55, | 1956,56, | 1956,57, | 1956,58, | 1956,59, | 1956,60, | 1956,61, | 1956,62, | 1956,63, | 1956,64, | 1956,65, | 1956,66, | 1956,67, | 1956,68, | 1956,69, | 1956,70, | 1956,71, | 1956,72, | 1956,73, | 1956,74, | 1956,75, | 1956,76, | 1956,77, | 1956,78, | 1956,79, | 1956,80, | 1956,81, | 1956,82, | 1956,83, | 1956,84, | 1956,85, | 1957,1, | 1957,2, | 1957,3, | 1957,4, | 1957,5, | 1957,6, | 1957,7, | 1957,8, | 1957,9, | 1957,10, | 1957,11, | 1957,12, | 1957,13, | 1957,14, | 1957,15, | 1957,16, | 1957,17, | 1957,18, | 1957,19, | 1957,20, | 1957,21, | 1957,22, | 1957,23, | 1957,24, | 1957,25, | 1957,26, | 1957,27, | 1957,28, | 1957,29, | 1957,30, | 1957,31, | 1957,32, | 1957,33, | 1957,34, | 1957,35, | 1957,36, | 1957,37, | 1957,38, | 1957,39, | 1957,40, | 1957,41, | 1957,42, | 1957,43, | 1957,44, | 1957,45, | 1957,46, | 1957,47, | 1957,48, | 1957,49, | 1957,50, | 1957,51, | 1957,52, | 1957,53, | 1957,54, | 1957,55, | 1957,56, | 1957,57, | 1957,58, | 1957,59, | 1957,60, | 1957,61, | 1957,62, | 1957,63, | 1957,64, | 1957,65, | 1957,66, | 1957,67, | 1957,68, | 1957,69, | 1957,70, | 1957,71, | 1957,72, | 1957,73, | 1957,74, | 1957,75, | 1957,76, | 1957,77, | 1957,78, | 1957,79, | 1957,80, | 1957,81, | 1957,82, | 1957,83, | 1957,84, | 1957,85, | 1958,1, | 1958,2, | 1958,3, | 1958,4, | 1958,5, | 1958,6, | 1958,7, | 1958,8, | 1958,9, | 1958,10, | 1958,11, | 1958,12, | 1958,13, | 1958,14, | 1958,15, | 1958,16, | 1958,17, | 1958,18, | 1958,19, | 1958,20, | 1958,21, | 1958,22, | 1958,23, | 1958,24, | 1958,25, | 1958,26, | 1958,27, | 1958,28, | 1958,29, | 1958,30, | 1958,31, | 1958,32, | 1958,33, | 1958,34, | 1958,35, | 1958,36, | 1958,37, | 1958,38, | 1958,39, | 1958,40, | 1958,41, | 1958,42, | 1958,43, | 1958,44, | 1958,45, | 1958,46, | 1958,47, | 1958,48, | 1958,49, | 1958,50, | 1958,51, | 1958,52, | 1958,53, | 1958,54, | 1958,55, | 1958,56, | 1958,57, | 1958,58, | 1958,59, | 1958,60, | 1958,61, | 1958,62, | 1958,63, | 1958,64, | 1958,65, | 1958,66, | 1958,67, | 1958,68, | 1958,69, | 1958,70, | 1958,71, | 1958,72, | 1958,73, | 1958,74, | 1958,75, | 1958,76, | 1958,77, | 1958,78, | 1958,79, | 1958,80, | 1958,81, | 1958,82, | 1958,83, | 1958,84, | 1958,85, | 1959,1, | 1959,2, | 1959,3, | 1959,4, | 1959,5, | 1959,6, | 1959,7, | 1959,8, | 1959,9, | 1959,10, | 1959,11, | 1959,12, | 1959,13, | 1959,14, | 1959,15, | 1959,16, | 1959,17, | 1959,18, | 1959,19, | 1959,20, | 1959,21, | 1959,22, | 1959,23, | 1959,24, | 1959,25, | 1959,26, | 1959,27, | 1959,28, | 1959,29, | 1959,30, | 1959,31, | 1959,32, | 1959,33, | 1959,34, | 1959,35, | 1959,36, | 1959,37, | 1959,38, | 1959,39, | 1959,40, | 1959,41, | 1959,42, | 1959,43, | 1959,44, | 1959,45, | 1959,46, | 1959,47, | 1959,48, | 1959,49, | 1959,50, | 1959,51, | 1959,52, | 1959,53, | 1959,54, | 1959,55, | 1959,56, | 1959,57, | 1959,58, | 1959,59, | 1959,60, | 1959,61, | 1959,62, | 1959,63, | 1959,64, | 1959,65, | 1959,66, | 1959,67, | 1959,68, | 1959,69, | 1959,70, | 1959,71, | 1959,72, | 1959,73, | 1959,74, | 1959,75, | 1959,76, | 1959,77, | 1959,78, | 1959,79, | 1959,80, | 1959,81, | 1959,82, | 1959,83, | 1959,84, | 1959,85, | 1960,1, | 1960,2, | 1960,3, | 1960,4, | 1960,5, | 1960,6, | 1960,7, | 1960,8, | 1960,9, | 1960,10, | 1960,11, | 1960,12, | 1960,13, | 1960,14, | 1960,15, | 1960,16, | 1960,17, | 1960,18, | 1960,19, | 1960,20, | 1960,21, | 1960,22, | 1960,23, | 1960,24, | 1960,25, | 1960,26, | 1960,27, | 1960,28, | 1960,29, | 1960,30, | 1960,31, | 1960,32, | 1960,33, | 1960,34, | 1960,35, | 1960,36, | 1960,37, | 1960,38, | 1960,39, | 1960,40, | 1960,41, | 1960,42, | 1960,43, | 1960,44, | 1960,45, | 1960,46, | 1960,47, | 1960,48, | 1960,49, | 1960,50, | 1960,51, | 1960,52, | 1960,53, | 1960,54, | 1960,55, | 1960,56, | 1960,57, | 1960,58, | 1960,59, | 1960,60, | 1960,61, | 1960,62, | 1960,63, | 1960,64, | 1960,65, | 1960,66, | 1960,67, | 1960,68, | 1960,69, | 1960,70, | 1960,71, | 1960,72, | 1960,73, | 1960,74, | 1960,75, | 1960,76, | 1960,77, | 1960,78, | 1960,79, | 1960,80, | 1960,81, | 1960,82, | 1960,83, | 1960,84, | 1960,85, | 1961,1, | 1961,2, | 1961,3, | 1961,4, | 1961,5, | 1961,6, | 1961,7, | 1961,8, | 1961,9, | 1961,10, | 1961,11, | 1961,12, | 1961,13, | 1961,14, | 1961,15, | 1961,16, | 1961,17, | 1961,18, | 1961,19, | 1961,20, | 1961,21, | 1961,22, | 1961,23, | 1961,24, | 1961,25, | 1961,26, | 1961,27, | 1961,28, | 1961,29, | 1961,30, | 1961,31, | 1961,32, | 1961,33, | 1961,34, | 1961,35, | 1961,36, | 1961,37, | 1961,38, | 1961,39, | 1961,40, | 1961,41, | 1961,42, | 1961,43, | 1961,44, | 1961,45, | 1961,46, | 1961,47, | 1961,48, | 1961,49, | 1961,50, | 1961,51, | 1961,52, | 1961,53, | 1961,54, | 1961,55, | 1961,56, | 1961,57, | 1961,58, | 1961,59, | 1961,60, | 1961,61, | 1961,62, | 1961,63, | 1961,64, | 1961,65, | 1961,66, | 1961,67, | 1961,68, | 1961,69, | 1961,70, | 1961,71, | 1961,72, | 1961,73, | 1961,74, | 1961,75, | 1961,76, | 1961,77, | 1961,78, | 1961,79, | 1961,80, | 1961,81, | 1961,82, | 1961,83, | 1961,84, | 1961,85, | 1962,1, | 1962,2, | 1962,3, | 1962,4, | 1962,5, | 1962,6, | 1962,7, | 1962,8, | 1962,9, | 1962,10, | 1962,11, | 1962,12, | 1962,13, | 1962,14, | 1962,15, | 1962,16, | 1962,17, | 1962,18, | 1962,19, | 1962,20, | 1962,21, | 1962,22, | 1962,23, | 1962,24, | 1962,25, | 1962,26, | 1962,27, | 1962,28, | 1962,29, | 1962,30, | 1962,31, | 1962,32, | 1962,33, | 1962,34, | 1962,35, | 1962,36, | 1962,37, | 1962,38, | 1962,39, | 1962,40, | 1962,41, | 1962,42, | 1962,43, | 1962,44, | 1962,45, | 1962,46, | 1962,47, | 1962,48, | 1962,49, | 1962,50, | 1962,51, | 1962,52, | 1962,53, | 1962,54, | 1962,55, | 1962,56, | 1962,57, | 1962,58, | 1962,59, | 1962,60, | 1962,61, | 1962,62, | 1962,63, | 1962,64, | 1962,65, | 1962,66, | 1962,67, | 1962,68, | 1962,69, | 1962,70, | 1962,71, | 1962,72, | 1962,73, | 1962,74, | 1962,75, | 1962,76, | 1962,77, | 1962,78, | 1962,79, | 1962,80, | 1962,81, | 1962,82, | 1962,83, | 1962,84, | 1962,85, | 1963,1, | 1963,2, | 1963,3, | 1963,4, | 1963,5, | 1963,6, | 1963,7, | 1963,8, | 1963,9, | 1963,10, | 1963,11, | 1963,12, | 1963,13, | 1963,14, | 1963,15, | 1963,16, | 1963,17, | 1963,18, | 1963,19, | 1963,20, | 1963,21, | 1963,22, | 1963,23, | 1963,24, | 1963,25, | 1963,26, | 1963,27, | 1963,28, | 1963,29, | 1963,30, | 1963,31, | 1963,32, | 1963,33, | 1963,34, | 1963,35, | 1963,36, | 1963,37, | 1963,38, | 1963,39, | 1963,40, | 1963,41, | 1963,42, | 1963,43, | 1963,44, | 1963,45, | 1963,46, | 1963,47, | 1963,48, | 1963,49, | 1963,50, | 1963,51, | 1963,52, | 1963,53, | 1963,54, | 1963,55, | 1963,56, | 1963,57, | 1963,58, | 1963,59, | 1963,60, | 1963,61, | 1963,62, | 1963,63, | 1963,64, | 1963,65, | 1963,66, | 1963,67, | 1963,68, | 1963,69, | 1963,70, | 1963,71, | 1963,72, | 1963,73, | 1963,74, | 1963,75, | 1963,76, | 1963,77, | 1963,78, | 1963,79, | 1963,80, | 1963,81, | 1963,82, | 1963,83, | 1963,84, | 1963,85, | 1964,1, | 1964,2, | 1964,3, | 1964,4, | 1964,5, | 1964,6, | 1964,7, | 1964,8, | 1964,9, | 1964,10, | 1964,11, | 1964,12, | 1964,13, | 1964,14, | 1964,15, | 1964,16, | 1964,17, | 1964,18, | 1964,19, | 1964,20, | 1964,21, | 1964,22, | 1964,23, | 1964,24, | 1964,25, | 1964,26, | 1964,27, | 1964,28, | 1964,29, | 1964,30, | 1964,31, | 1964,32, | 1964,33, | 1964,34, | 1964,35, | 1964,36, | 1964,37, | 1964,38, | 1964,39, | 1964,40, | 1964,41, | 1964,42, | 1964,43, | 1964,44, | 1964,45, | 1964,46, | 1964,47, | 1964,48, | 1964,49, | 1964,50, | 1964,51, | 1964,52, | 1964,53, | 1964,54, | 1964,55, | 1964,56, | 1964,57, | 1964,58, | 1964,59, | 1964,60, | 1964,61, | 1964,62, | 1964,63, | 1964,64, | 1964,65, | 1964,66, | 1964,67, | 1964,68, | 1964,69, | 1964,70, | 1964,71, | 1964,72, | 1964,73, | 1964,74, | 1964,75, | 1964,76, | 1964,77, | 1964,78, | 1964,79, | 1964,80, | 1964,81, | 1964,82, | 1964,83, | 1964,84, | 1964,85, | 1965,1, | 1965,2, | 1965,3, | 1965,4, | 1965,5, | 1965,6, | 1965,7, | 1965,8, | 1965,9, | 1965,10, | 1965,11, | 1965,12, | 1965,13, | 1965,14, | 1965,15, | 1965,16, | 1965,17, | 1965,18, | 1965,19, | 1965,20, | 1965,21, | 1965,22, | 1965,23, | 1965,24, | 1965,25, | 1965,26, | 1965,27, | 1965,28, | 1965,29, | 1965,30, | 1965,31, | 1965,32, | 1965,33, | 1965,34, | 1965,35, | 1965,36, | 1965,37, | 1965,38, | 1965,39, | 1965,40, | 1965,41, | 1965,42, | 1965,43, | 1965,44, | 1965,45, | 1965,46, | 1965,47, | 1965,48, | 1965,49, | 1965,50, | 1965,51, | 1965,52, | 1965,53, | 1965,54, | 1965,55, | 1965,56, | 1965,57, | 1965,58, | 1965,59, | 1965,60, | 1965,61, | 1965,62, | 1965,63, | 1965,64, | 1965,65, | 1965,66, | 1965,67, | 1965,68, | 1965,69, | 1965,70, | 1965,71, | 1965,72, | 1965,73, | 1965,74, | 1965,75, | 1965,76, | 1965,77, | 1965,78, | 1965,79, | 1965,80, | 1965,81, | 1965,82, | 1965,83, | 1965,84, | 1965,85, | 1966,1, | 1966,2, | 1966,3, | 1966,4, | 1966,5, | 1966,6, | 1966,7, | 1966,8, | 1966,9, | 1966,10, | 1966,11, | 1966,12, | 1966,13, | 1966,14, | 1966,15, | 1966,16, | 1966,17, | 1966,18, | 1966,19, | 1966,20, | 1966,21, | 1966,22, | 1966,23, | 1966,24, | 1966,25, | 1966,26, | 1966,27, | 1966,28, | 1966,29, | 1966,30, | 1966,31, | 1966,32, | 1966,33, | 1966,34, | 1966,35, | 1966,36, | 1966,37, | 1966,38, | 1966,39, | 1966,40, | 1966,41, | 1966,42, | 1966,43, | 1966,44, | 1966,45, | 1966,46, | 1966,47, | 1966,48, | 1966,49, | 1966,50, | 1966,51, | 1966,52, | 1966,53, | 1966,54, | 1966,55, | 1966,56, | 1966,57, | 1966,58, | 1966,59, | 1966,60, | 1966,61, | 1966,62, | 1966,63, | 1966,64, | 1966,65, | 1966,66, | 1966,67, | 1966,68, | 1966,69, | 1966,70, | 1966,71, | 1966,72, | 1966,73, | 1966,74, | 1966,75, | 1966,76, | 1966,77, | 1966,78, | 1966,79, | 1966,80, | 1966,81, | 1966,82, | 1966,83, | 1966,84, | 1966,85, | 1967,1, | 1967,2, | 1967,3, | 1967,4, | 1967,5, | 1967,6, | 1967,7, | 1967,8, | 1967,9, | 1967,10, | 1967,11, | 1967,12, | 1967,13, | 1967,14, | 1967,15, | 1967,16, | 1967,17, | 1967,18, | 1967,19, | 1967,20, | 1967,21, | 1967,22, | 1967,23, | 1967,24, | 1967,25, | 1967,26, | 1967,27, | 1967,28, | 1967,29, | 1967,30, | 1967,31, | 1967,32, | 1967,33, | 1967,34, | 1967,35, | 1967,36, | 1967,37, | 1967,38, | 1967,39, | 1967,40, | 1967,41, | 1967,42, | 1967,43, | 1967,44, | 1967,45, | 1967,46, | 1967,47, | 1967,48, | 1967,49, | 1967,50, | 1967,51, | 1967,52, | 1967,53, | 1967,54, | 1967,55, | 1967,56, | 1967,57, | 1967,58, | 1967,59, | 1967,60, | 1967,61, | 1967,62, | 1967,63, | 1967,64, | 1967,65, | 1967,66, | 1967,67, | 1967,68, | 1967,69, | 1967,70, | 1967,71, | 1967,72, | 1967,73, | 1967,74, | 1967,75, | 1967,76, | 1967,77, | 1967,78, | 1967,79, | 1967,80, | 1967,81, | 1967,82, | 1967,83, | 1967,84, | 1967,85, | 1968,1, | 1968,2, | 1968,3, | 1968,4, | 1968,5, | 1968,6, | 1968,7, | 1968,8, | 1968,9, | 1968,10, | 1968,11, | 1968,12, | 1968,13, | 1968,14, | 1968,15, | 1968,16, | 1968,17, | 1968,18, | 1968,19, | 1968,20, | 1968,21, | 1968,22, | 1968,23, | 1968,24, | 1968,25, | 1968,26, | 1968,27, | 1968,28, | 1968,29, | 1968,30, | 1968,31, | 1968,32, | 1968,33, | 1968,34, | 1968,35, | 1968,36, | 1968,37, | 1968,38, | 1968,39, | 1968,40, | 1968,41, | 1968,42, | 1968,43, | 1968,44, | 1968,45, | 1968,46, | 1968,47, | 1968,48, | 1968,49, | 1968,50, | 1968,51, | 1968,52, | 1968,53, | 1968,54, | 1968,55, | 1968,56, | 1968,57, | 1968,58, | 1968,59, | 1968,60, | 1968,61, | 1968,62, | 1968,63, | 1968,64, | 1968,65, | 1968,66, | 1968,67, | 1968,68, | 1968,69, | 1968,70, | 1968,71, | 1968,72, | 1968,73, | 1968,74, | 1968,75, | 1968,76, | 1968,77, | 1968,78, | 1968,79, | 1968,80, | 1968,81, | 1968,82, | 1968,83, | 1968,84, | 1968,85, | 1969,1, | 1969,2, | 1969,3, | 1969,4, | 1969,5, | 1969,6, | 1969,7, | 1969,8, | 1969,9, | 1969,10, | 1969,11, | 1969,12, | 1969,13, | 1969,14, | 1969,15, | 1969,16, | 1969,17, | 1969,18, | 1969,19, | 1969,20, | 1969,21, | 1969,22, | 1969,23, | 1969,24, | 1969,25, | 1969,26, | 1969,27, | 1969,28, | 1969,29, | 1969,30, | 1969,31, | 1969,32, | 1969,33, | 1969,34, | 1969,35, | 1969,36, | 1969,37, | 1969,38, | 1969,39, | 1969,40, | 1969,41, | 1969,42, | 1969,43, | 1969,44, | 1969,45, | 1969,46, | 1969,47, | 1969,48, | 1969,49, | 1969,50, | 1969,51, | 1969,52, | 1969,53, | 1969,54, | 1969,55, | 1969,56, | 1969,57, | 1969,58, | 1969,59, | 1969,60, | 1969,61, | 1969,62, | 1969,63, | 1969,64, | 1969,65, | 1969,66, | 1969,67, | 1969,68, | 1969,69, | 1969,70, | 1969,71, | 1969,72, | 1969,73, | 1969,74, | 1969,75, | 1969,76, | 1969,77, | 1969,78, | 1969,79, | 1969,80, | 1969,81, | 1969,82, | 1969,83, | 1969,84, | 1969,85, | 1970,1, | 1970,2, | 1970,3, | 1970,4, | 1970,5, | 1970,6, | 1970,7, | 1970,8, | 1970,9, | 1970,10, | 1970,11, | 1970,12, | 1970,13, | 1970,14, | 1970,15, | 1970,16, | 1970,17, | 1970,18, | 1970,19, | 1970,20, | 1970,21, | 1970,22, | 1970,23, | 1970,24, | 1970,25, | 1970,26, | 1970,27, | 1970,28, | 1970,29, | 1970,30, | 1970,31, | 1970,32, | 1970,33, | 1970,34, | 1970,35, | 1970,36, | 1970,37, | 1970,38, | 1970,39, | 1970,40, | 1970,41, | 1970,42, | 1970,43, | 1970,44, | 1970,45, | 1970,46, | 1970,47, | 1970,48, | 1970,49, | 1970,50, | 1970,51, | 1970,52, | 1970,53, | 1970,54, | 1970,55, | 1970,56, | 1970,57, | 1970,58, | 1970,59, | 1970,60, | 1970,61, | 1970,62, | 1970,63, | 1970,64, | 1970,65, | 1970,66, | 1970,67, | 1970,68, | 1970,69, | 1970,70, | 1970,71, | 1970,72, | 1970,73, | 1970,74, | 1970,75, | 1970,76, | 1970,77, | 1970,78, | 1970,79, | 1970,80, | 1970,81, | 1970,82, | 1970,83, | 1970,84, | 1970,85, | 1971,1, | 1971,2, | 1971,3, | 1971,4, | 1971,5, | 1971,6, | 1971,7, | 1971,8, | 1971,9, | 1971,10, | 1971,11, | 1971,12, | 1971,13, | 1971,14, | 1971,15, | 1971,16, | 1971,17, | 1971,18, | 1971,19, | 1971,20, | 1971,21, | 1971,22, | 1971,23, | 1971,24, | 1971,25, | 1971,26, | 1971,27, | 1971,28, | 1971,29, | 1971,30, | 1971,31, | 1971,32, | 1971,33, | 1971,34, | 1971,35, | 1971,36, | 1971,37, | 1971,38, | 1971,39, | 1971,40, | 1971,41, | 1971,42, | 1971,43, | 1971,44, | 1971,45, | 1971,46, | 1971,47, | 1971,48, | 1971,49, | 1971,50, | 1971,51, | 1971,52, | 1971,53, | 1971,54, | 1971,55, | 1971,56, | 1971,57, | 1971,58, | 1971,59, | 1971,60, | 1971,61, | 1971,62, | 1971,63, | 1971,64, | 1971,65, | 1971,66, | 1971,67, | 1971,68, | 1971,69, | 1971,70, | 1971,71, | 1971,72, | 1971,73, | 1971,74, | 1971,75, | 1971,76, | 1971,77, | 1971,78, | 1971,79, | 1971,80, | 1971,81, | 1971,82, | 1971,83, | 1971,84, | 1971,85, | 1972,1, | 1972,2, | 1972,3, | 1972,4, | 1972,5, | 1972,6, | 1972,7, | 1972,8, | 1972,9, | 1972,10, | 1972,11, | 1972,12, | 1972,13, | 1972,14, | 1972,15, | 1972,16, | 1972,17, | 1972,18, | 1972,19, | 1972,20, | 1972,21, | 1972,22, | 1972,23, | 1972,24, | 1972,25, | 1972,26, | 1972,27, | 1972,28, | 1972,29, | 1972,30, | 1972,31, | 1972,32, | 1972,33, | 1972,34, | 1972,35, | 1972,36, | 1972,37, | 1972,38, | 1972,39, | 1972,40, | 1972,41, | 1972,42, | 1972,43, | 1972,44, | 1972,45, | 1972,46, | 1972,47, | 1972,48, | 1972,49, | 1972,50, | 1972,51, | 1972,52, | 1972,53, | 1972,54, | 1972,55, | 1972,56, | 1972,57, | 1972,58, | 1972,59, | 1972,60, | 1972,61, | 1972,62, | 1972,63, | 1972,64, | 1972,65, | 1972,66, | 1972,67, | 1972,68, | 1972,69, | 1972,70, | 1972,71, | 1972,72, | 1972,73, | 1972,74, | 1972,75, | 1972,76, | 1972,77, | 1972,78, | 1972,79, | 1972,80, | 1972,81, | 1972,82, | 1972,83, | 1972,84, | 1972,85, | 1973,1, | 1973,2, | 1973,3, | 1973,4, | 1973,5, | 1973,6, | 1973,7, | 1973,8, | 1973,9, | 1973,10, | 1973,11, | 1973,12, | 1973,13, | 1973,14, | 1973,15, | 1973,16, | 1973,17, | 1973,18, | 1973,19, | 1973,20, | 1973,21, | 1973,22, | 1973,23, | 1973,24, | 1973,25, | 1973,26, | 1973,27, | 1973,28, | 1973,29, | 1973,30, | 1973,31, | 1973,32, | 1973,33, | 1973,34, | 1973,35, | 1973,36, | 1973,37, | 1973,38, | 1973,39, | 1973,40, | 1973,41, | 1973,42, | 1973,43, | 1973,44, | 1973,45, | 1973,46, | 1973,47, | 1973,48, | 1973,49, | 1973,50, | 1973,51, | 1973,52, | 1973,53, | 1973,54, | 1973,55, | 1973,56, | 1973,57, | 1973,58, | 1973,59, | 1973,60, | 1973,61, | 1973,62, | 1973,63, | 1973,64, | 1973,65, | 1973,66, | 1973,67, | 1973,68, | 1973,69, | 1973,70, | 1973,71, | 1973,72, | 1973,73, | 1973,74, | 1973,75, | 1973,76, | 1973,77, | 1973,78, | 1973,79, | 1973,80, | 1973,81, | 1973,82, | 1973,83, | 1973,84, | 1973,85, | 1974,1, | 1974,2, | 1974,3, | 1974,4, | 1974,5, | 1974,6, | 1974,7, | 1974,8, | 1974,9, | 1974,10, | 1974,11, | 1974,12, | 1974,13, | 1974,14, | 1974,15, | 1974,16, | 1974,17, | 1974,18, | 1974,19, | 1974,20, | 1974,21, | 1974,22, | 1974,23, | 1974,24, | 1974,25, | 1974,26, | 1974,27, | 1974,28, | 1974,29, | 1974,30, | 1974,31, | 1974,32, | 1974,33, | 1974,34, | 1974,35, | 1974,36, | 1974,37, | 1974,38, | 1974,39, | 1974,40, | 1974,41, | 1974,42, | 1974,43, | 1974,44, | 1974,45, | 1974,46, | 1974,47, | 1974,48, | 1974,49, | 1974,50, | 1974,51, | 1974,52, | 1974,53, | 1974,54, | 1974,55, | 1974,56, | 1974,57, | 1974,58, | 1974,59, | 1974,60, | 1974,61, | 1974,62, | 1974,63, | 1974,64, | 1974,65, | 1974,66, | 1974,67, | 1974,68, | 1974,69, | 1974,70, | 1974,71, | 1974,72, | 1974,73, | 1974,74, | 1974,75, | 1974,76, | 1974,77, | 1974,78, | 1974,79, | 1974,80, | 1974,81, | 1974,82, | 1974,83, | 1974,84, | 1974,85, | 1975,1, | 1975,2, | 1975,3, | 1975,4, | 1975,5, | 1975,6, | 1975,7, | 1975,8, | 1975,9, | 1975,10, | 1975,11, | 1975,12, | 1975,13, | 1975,14, | 1975,15, | 1975,16, | 1975,17, | 1975,18, | 1975,19, | 1975,20, | 1975,21, | 1975,22, | 1975,23, | 1975,24, | 1975,25, | 1975,26, | 1975,27, | 1975,28, | 1975,29, | 1975,30, | 1975,31, | 1975,32, | 1975,33, | 1975,34, | 1975,35, | 1975,36, | 1975,37, | 1975,38, | 1975,39, | 1975,40, | 1975,41, | 1975,42, | 1975,43, | 1975,44, | 1975,45, | 1975,46, | 1975,47, | 1975,48, | 1975,49, | 1975,50, | 1975,51, | 1975,52, | 1975,53, | 1975,54, | 1975,55, | 1975,56, | 1975,57, | 1975,58, | 1975,59, | 1975,60, | 1975,61, | 1975,62, | 1975,63, | 1975,64, | 1975,65, | 1975,66, | 1975,67, | 1975,68, | 1975,69, | 1975,70, | 1975,71, | 1975,72, | 1975,73, | 1975,74, | 1975,75, | 1975,76, | 1975,77, | 1975,78, | 1975,79, | 1975,80, | 1975,81, | 1975,82, | 1975,83, | 1975,84, | 1975,85, | 1976,1, | 1976,2, | 1976,3, | 1976,4, | 1976,5, | 1976,6, | 1976,7, | 1976,8, | 1976,9, | 1976,10, | 1976,11, | 1976,12, | 1976,13, | 1976,14, | 1976,15, | 1976,16, | 1976,17, | 1976,18, | 1976,19, | 1976,20, | 1976,21, | 1976,22, | 1976,23, | 1976,24, | 1976,25, | 1976,26, | 1976,27, | 1976,28, | 1976,29, | 1976,30, | 1976,31, | 1976,32, | 1976,33, | 1976,34, | 1976,35, | 1976,36, | 1976,37, | 1976,38, | 1976,39, | 1976,40, | 1976,41, | 1976,42, | 1976,43, | 1976,44, | 1976,45, | 1976,46, | 1976,47, | 1976,48, | 1976,49, | 1976,50, | 1976,51, | 1976,52, | 1976,53, | 1976,54, | 1976,55, | 1976,56, | 1976,57, | 1976,58, | 1976,59, | 1976,60, | 1976,61, | 1976,62, | 1976,63, | 1976,64, | 1976,65, | 1976,66, | 1976,67, | 1976,68, | 1976,69, | 1976,70, | 1976,71, | 1976,72, | 1976,73, | 1976,74, | 1976,75, | 1976,76, | 1976,77, | 1976,78, | 1976,79, | 1976,80, | 1976,81, | 1976,82, | 1976,83, | 1976,84, | 1976,85, | 1977,1, | 1977,2, | 1977,3, | 1977,4, | 1977,5, | 1977,6, | 1977,7, | 1977,8, | 1977,9, | 1977,10, | 1977,11, | 1977,12, | 1977,13, | 1977,14, | 1977,15, | 1977,16, | 1977,17, | 1977,18, | 1977,19, | 1977,20, | 1977,21, | 1977,22, | 1977,23, | 1977,24, | 1977,25, | 1977,26, | 1977,27, | 1977,28, | 1977,29, | 1977,30, | 1977,31, | 1977,32, | 1977,33, | 1977,34, | 1977,35, | 1977,36, | 1977,37, | 1977,38, | 1977,39, | 1977,40, | 1977,41, | 1977,42, | 1977,43, | 1977,44, | 1977,45, | 1977,46, | 1977,47, | 1977,48, | 1977,49, | 1977,50, | 1977,51, | 1977,52, | 1977,53, | 1977,54, | 1977,55, | 1977,56, | 1977,57, | 1977,58, | 1977,59, | 1977,60, | 1977,61, | 1977,62, | 1977,63, | 1977,64, | 1977,65, | 1977,66, | 1977,67, | 1977,68, | 1977,69, | 1977,70, | 1977,71, | 1977,72, | 1977,73, | 1977,74, | 1977,75, | 1977,76, | 1977,77, | 1977,78, | 1977,79, | 1977,80, | 1977,81, | 1977,82, | 1977,83, | 1977,84, | 1977,85, | 1978,1, | 1978,2, | 1978,3, | 1978,4, | 1978,5, | 1978,6, | 1978,7, | 1978,8, | 1978,9, | 1978,10, | 1978,11, | 1978,12, | 1978,13, | 1978,14, | 1978,15, | 1978,16, | 1978,17, | 1978,18, | 1978,19, | 1978,20, | 1978,21, | 1978,22, | 1978,23, | 1978,24, | 1978,25, | 1978,26, | 1978,27, | 1978,28, | 1978,29, | 1978,30, | 1978,31, | 1978,32, | 1978,33, | 1978,34, | 1978,35, | 1978,36, | 1978,37, | 1978,38, | 1978,39, | 1978,40, | 1978,41, | 1978,42, | 1978,43, | 1978,44, | 1978,45, | 1978,46, | 1978,47, | 1978,48, | 1978,49, | 1978,50, | 1978,51, | 1978,52, | 1978,53, | 1978,54, | 1978,55, | 1978,56, | 1978,57, | 1978,58, | 1978,59, | 1978,60, | 1978,61, | 1978,62, | 1978,63, | 1978,64, | 1978,65, | 1978,66, | 1978,67, | 1978,68, | 1978,69, | 1978,70, | 1978,71, | 1978,72, | 1978,73, | 1978,74, | 1978,75, | 1978,76, | 1978,77, | 1978,78, | 1978,79, | 1978,80, | 1978,81, | 1978,82, | 1978,83, | 1978,84, | 1978,85, | 1979,1, | 1979,2, | 1979,3, | 1979,4, | 1979,5, | 1979,6, | 1979,7, | 1979,8, | 1979,9, | 1979,10, | 1979,11, | 1979,12, | 1979,13, | 1979,14, | 1979,15, | 1979,16, | 1979,17, | 1979,18, | 1979,19, | 1979,20, | 1979,21, | 1979,22, | 1979,23, | 1979,24, | 1979,25, | 1979,26, | 1979,27, | 1979,28, | 1979,29, | 1979,30, | 1979,31, | 1979,32, | 1979,33, | 1979,34, | 1979,35, | 1979,36, | 1979,37, | 1979,38, | 1979,39, | 1979,40, | 1979,41, | 1979,42, | 1979,43, | 1979,44, | 1979,45, | 1979,46, | 1979,47, | 1979,48, | 1979,49, | 1979,50, | 1979,51, | 1979,52, | 1979,53, | 1979,54, | 1979,55, | 1979,56, | 1979,57, | 1979,58, | 1979,59, | 1979,60, | 1979,61, | 1979,62, | 1979,63, | 1979,64, | 1979,65, | 1979,66, | 1979,67, | 1979,68, | 1979,69, | 1979,70, | 1979,71, | 1979,72, | 1979,73, | 1979,74, | 1979,75, | 1979,76, | 1979,77, | 1979,78, | 1979,79, | 1979,80, | 1979,81, | 1979,82, | 1979,83, | 1979,84, | 1979,85, | 1980,1, | 1980,2, | 1980,3, | 1980,4, | 1980,5, | 1980,6, | 1980,7, | 1980,8, | 1980,9, | 1980,10, | 1980,11, | 1980,12, | 1980,13, | 1980,14, | 1980,15, | 1980,16, | 1980,17, | 1980,18, | 1980,19, | 1980,20, | 1980,21, | 1980,22, | 1980,23, | 1980,24, | 1980,25, | 1980,26, | 1980,27, | 1980,28, | 1980,29, | 1980,30, | 1980,31, | 1980,32, | 1980,33, | 1980,34, | 1980,35, | 1980,36, | 1980,37, | 1980,38, | 1980,39, | 1980,40, | 1980,41, | 1980,42, | 1980,43, | 1980,44, | 1980,45, | 1980,46, | 1980,47, | 1980,48, | 1980,49, | 1980,50, | 1980,51, | 1980,52, | 1980,53, | 1980,54, | 1980,55, | 1980,56, | 1980,57, | 1980,58, | 1980,59, | 1980,60, | 1980,61, | 1980,62, | 1980,63, | 1980,64, | 1980,65, | 1980,66, | 1980,67, | 1980,68, | 1980,69, | 1980,70, | 1980,71, | 1980,72, | 1980,73, | 1980,74, | 1980,75, | 1980,76, | 1980,77, | 1980,78, | 1980,79, | 1980,80, | 1980,81, | 1980,82, | 1980,83, | 1980,84, | 1980,85, | 1981,1, | 1981,2, | 1981,3, | 1981,4, | 1981,5, | 1981,6, | 1981,7, | 1981,8, | 1981,9, | 1981,10, | 1981,11, | 1981,12, | 1981,13, | 1981,14, | 1981,15, | 1981,16, | 1981,17, | 1981,18, | 1981,19, | 1981,20, | 1981,21, | 1981,22, | 1981,23, | 1981,24, | 1981,25, | 1981,26, | 1981,27, | 1981,28, | 1981,29, | 1981,30, | 1981,31, | 1981,32, | 1981,33, | 1981,34, | 1981,35, | 1981,36, | 1981,37, | 1981,38, | 1981,39, | 1981,40, | 1981,41, | 1981,42, | 1981,43, | 1981,44, | 1981,45, | 1981,46, | 1981,47, | 1981,48, | 1981,49, | 1981,50, | 1981,51, | 1981,52, | 1981,53, | 1981,54, | 1981,55, | 1981,56, | 1981,57, | 1981,58, | 1981,59, | 1981,60, | 1981,61, | 1981,62, | 1981,63, | 1981,64, | 1981,65, | 1981,66, | 1981,67, | 1981,68, | 1981,69, | 1981,70, | 1981,71, | 1981,72, | 1981,73, | 1981,74, | 1981,75, | 1981,76, | 1981,77, | 1981,78, | 1981,79, | 1981,80, | 1981,81, | 1981,82, | 1981,83, | 1981,84, | 1981,85, | 1982,1, | 1982,2, | 1982,3, | 1982,4, | 1982,5, | 1982,6, | 1982,7, | 1982,8, | 1982,9, | 1982,10, | 1982,11, | 1982,12, | 1982,13, | 1982,14, | 1982,15, | 1982,16, | 1982,17, | 1982,18, | 1982,19, | 1982,20, | 1982,21, | 1982,22, | 1982,23, | 1982,24, | 1982,25, | 1982,26, | 1982,27, | 1982,28, | 1982,29, | 1982,30, | 1982,31, | 1982,32, | 1982,33, | 1982,34, | 1982,35, | 1982,36, | 1982,37, | 1982,38, | 1982,39, | 1982,40, | 1982,41, | 1982,42, | 1982,43, | 1982,44, | 1982,45, | 1982,46, | 1982,47, | 1982,48, | 1982,49, | 1982,50, | 1982,51, | 1982,52, | 1982,53, | 1982,54, | 1982,55, | 1982,56, | 1982,57, | 1982,58, | 1982,59, | 1982,60, | 1982,61, | 1982,62, | 1982,63, | 1982,64, | 1982,65, | 1982,66, | 1982,67, | 1982,68, | 1982,69, | 1982,70, | 1982,71, | 1982,72, | 1982,73, | 1982,74, | 1982,75, | 1982,76, | 1982,77, | 1982,78, | 1982,79, | 1982,80, | 1982,81, | 1982,82, | 1982,83, | 1982,84, | 1982,85, | 1983,1, | 1983,2, | 1983,3, | 1983,4, | 1983,5, | 1983,6, | 1983,7, | 1983,8, | 1983,9, | 1983,10, | 1983,11, | 1983,12, | 1983,13, | 1983,14, | 1983,15, | 1983,16, | 1983,17, | 1983,18, | 1983,19, | 1983,20, | 1983,21, | 1983,22, | 1983,23, | 1983,24, | 1983,25, | 1983,26, | 1983,27, | 1983,28, | 1983,29, | 1983,30, | 1983,31, | 1983,32, | 1983,33, | 1983,34, | 1983,35, | 1983,36, | 1983,37, | 1983,38, | 1983,39, | 1983,40, | 1983,41, | 1983,42, | 1983,43, | 1983,44, | 1983,45, | 1983,46, | 1983,47, | 1983,48, | 1983,49, | 1983,50, | 1983,51, | 1983,52, | 1983,53, | 1983,54, | 1983,55, | 1983,56, | 1983,57, | 1983,58, | 1983,59, | 1983,60, | 1983,61, | 1983,62, | 1983,63, | 1983,64, | 1983,65, | 1983,66, | 1983,67, | 1983,68, | 1983,69, | 1983,70, | 1983,71, | 1983,72, | 1983,73, | 1983,74, | 1983,75, | 1983,76, | 1983,77, | 1983,78, | 1983,79, | 1983,80, | 1983,81, | 1983,82, | 1983,83, | 1983,84, | 1983,85, | 1984,1, | 1984,2, | 1984,3, | 1984,4, | 1984,5, | 1984,6, | 1984,7, | 1984,8, | 1984,9, | 1984,10, | 1984,11, | 1984,12, | 1984,13, | 1984,14, | 1984,15, | 1984,16, | 1984,17, | 1984,18, | 1984,19, | 1984,20, | 1984,21, | 1984,22, | 1984,23, | 1984,24, | 1984,25, | 1984,26, | 1984,27, | 1984,28, | 1984,29, | 1984,30, | 1984,31, | 1984,32, | 1984,33, | 1984,34, | 1984,35, | 1984,36, | 1984,37, | 1984,38, | 1984,39, | 1984,40, | 1984,41, | 1984,42, | 1984,43, | 1984,44, | 1984,45, | 1984,46, | 1984,47, | 1984,48, | 1984,49, | 1984,50, | 1984,51, | 1984,52, | 1984,53, | 1984,54, | 1984,55, | 1984,56, | 1984,57, | 1984,58, | 1984,59, | 1984,60, | 1984,61, | 1984,62, | 1984,63, | 1984,64, | 1984,65, | 1984,66, | 1984,67, | 1984,68, | 1984,69, | 1984,70, | 1984,71, | 1984,72, | 1984,73, | 1984,74, | 1984,75, | 1984,76, | 1984,77, | 1984,78, | 1984,79, | 1984,80, | 1984,81, | 1984,82, | 1984,83, | 1984,84, | 1984,85, | 1985,1, | 1985,2, | 1985,3, | 1985,4, | 1985,5, | 1985,6, | 1985,7, | 1985,8, | 1985,9, | 1985,10, | 1985,11, | 1985,12, | 1985,13, | 1985,14, | 1985,15, | 1985,16, | 1985,17, | 1985,18, | 1985,19, | 1985,20, | 1985,21, | 1985,22, | 1985,23, | 1985,24, | 1985,25, | 1985,26, | 1985,27, | 1985,28, | 1985,29, | 1985,30, | 1985,31, | 1985,32, | 1985,33, | 1985,34, | 1985,35, | 1985,36, | 1985,37, | 1985,38, | 1985,39, | 1985,40, | 1985,41, | 1985,42, | 1985,43, | 1985,44, | 1985,45, | 1985,46, | 1985,47, | 1985,48, | 1985,49, | 1985,50, | 1985,51, | 1985,52, | 1985,53, | 1985,54, | 1985,55, | 1985,56, | 1985,57, | 1985,58, | 1985,59, | 1985,60, | 1985,61, | 1985,62, | 1985,63, | 1985,64, | 1985,65, | 1985,66, | 1985,67, | 1985,68, | 1985,69, | 1985,70, | 1985,71, | 1985,72, | 1985,73, | 1985,74, | 1985,75, | 1985,76, | 1985,77, | 1985,78, | 1985,79, | 1985,80, | 1985,81, | 1985,82, | 1985,83, | 1985,84, | 1985,85, | 1986,1, | 1986,2, | 1986,3, | 1986,4, | 1986,5, | 1986,6, | 1986,7, | 1986,8, | 1986,9, | 1986,10, | 1986,11, | 1986,12, | 1986,13, | 1986,14, | 1986,15, | 1986,16, | 1986,17, | 1986,18, | 1986,19, | 1986,20, | 1986,21, | 1986,22, | 1986,23, | 1986,24, | 1986,25, | 1986,26, | 1986,27, | 1986,28, | 1986,29, | 1986,30, | 1986,31, | 1986,32, | 1986,33, | 1986,34, | 1986,35, | 1986,36, | 1986,37, | 1986,38, | 1986,39, | 1986,40, | 1986,41, | 1986,42, | 1986,43, | 1986,44, | 1986,45, | 1986,46, | 1986,47, | 1986,48, | 1986,49, | 1986,50, | 1986,51, | 1986,52, | 1986,53, | 1986,54, | 1986,55, | 1986,56, | 1986,57, | 1986,58, | 1986,59, | 1986,60, | 1986,61, | 1986,62, | 1986,63, | 1986,64, | 1986,65, | 1986,66, | 1986,67, | 1986,68, | 1986,69, | 1986,70, | 1986,71, | 1986,72, | 1986,73, | 1986,74, | 1986,75, | 1986,76, | 1986,77, | 1986,78, | 1986,79, | 1986,80, | 1986,81, | 1986,82, | 1986,83, | 1986,84, | 1986,85, | 1987,1, | 1987,2, | 1987,3, | 1987,4, | 1987,5, | 1987,6, | 1987,7, | 1987,8, | 1987,9, | 1987,10, | 1987,11, | 1987,12, | 1987,13, | 1987,14, | 1987,15, | 1987,16, | 1987,17, | 1987,18, | 1987,19, | 1987,20, | 1987,21, | 1987,22, | 1987,23, | 1987,24, | 1987,25, | 1987,26, | 1987,27, | 1987,28, | 1987,29, | 1987,30, | 1987,31, | 1987,32, | 1987,33, | 1987,34, | 1987,35, | 1987,36, | 1987,37, | 1987,38, | 1987,39, | 1987,40, | 1987,41, | 1987,42, | 1987,43, | 1987,44, | 1987,45, | 1987,46, | 1987,47, | 1987,48, | 1987,49, | 1987,50, | 1987,51, | 1987,52, | 1987,53, | 1987,54, | 1987,55, | 1987,56, | 1987,57, | 1987,58, | 1987,59, | 1987,60, | 1987,61, | 1987,62, | 1987,63, | 1987,64, | 1987,65, | 1987,66, | 1987,67, | 1987,68, | 1987,69, | 1987,70, | 1987,71, | 1987,72, | 1987,73, | 1987,74, | 1987,75, | 1987,76, | 1987,77, | 1987,78, | 1987,79, | 1987,80, | 1987,81, | 1987,82, | 1987,83, | 1987,84, | 1987,85, | 1988,1, | 1988,2, | 1988,3, | 1988,4, | 1988,5, | 1988,6, | 1988,7, | 1988,8, | 1988,9, | 1988,10, | 1988,11, | 1988,12, | 1988,13, | 1988,14, | 1988,15, | 1988,16, | 1988,17, | 1988,18, | 1988,19, | 1988,20, | 1988,21, | 1988,22, | 1988,23, | 1988,24, | 1988,25, | 1988,26, | 1988,27, | 1988,28, | 1988,29, | 1988,30, | 1988,31, | 1988,32, | 1988,33, | 1988,34, | 1988,35, | 1988,36, | 1988,37, | 1988,38, | 1988,39, | 1988,40, | 1988,41, | 1988,42, | 1988,43, | 1988,44, | 1988,45, | 1988,46, | 1988,47, | 1988,48, | 1988,49, | 1988,50, | 1988,51, | 1988,52, | 1988,53, | 1988,54, | 1988,55, | 1988,56, | 1988,57, | 1988,58, | 1988,59, | 1988,60, | 1988,61, | 1988,62, | 1988,63, | 1988,64, | 1988,65, | 1988,66, | 1988,67, | 1988,68, | 1988,69, | 1988,70, | 1988,71, | 1988,72, | 1988,73, | 1988,74, | 1988,75, | 1988,76, | 1988,77, | 1988,78, | 1988,79, | 1988,80, | 1988,81, | 1988,82, | 1988,83, | 1988,84, | 1988,85, | 1989,1, | 1989,2, | 1989,3, | 1989,4, | 1989,5, | 1989,6, | 1989,7, | 1989,8, | 1989,9, | 1989,10, | 1989,11, | 1989,12, | 1989,13, | 1989,14, | 1989,15, | 1989,16, | 1989,17, | 1989,18, | 1989,19, | 1989,20, | 1989,21, | 1989,22, | 1989,23, | 1989,24, | 1989,25, | 1989,26, | 1989,27, | 1989,28, | 1989,29, | 1989,30, | 1989,31, | 1989,32, | 1989,33, | 1989,34, | 1989,35, | 1989,36, | 1989,37, | 1989,38, | 1989,39, | 1989,40, | 1989,41, | 1989,42, | 1989,43, | 1989,44, | 1989,45, | 1989,46, | 1989,47, | 1989,48, | 1989,49, | 1989,50, | 1989,51, | 1989,52, | 1989,53, | 1989,54, | 1989,55, | 1989,56, | 1989,57, | 1989,58, | 1989,59, | 1989,60, | 1989,61, | 1989,62, | 1989,63, | 1989,64, | 1989,65, | 1989,66, | 1989,67, | 1989,68, | 1989,69, | 1989,70, | 1989,71, | 1989,72, | 1989,73, | 1989,74, | 1989,75, | 1989,76, | 1989,77, | 1989,78, | 1989,79, | 1989,80, | 1989,81, | 1989,82, | 1989,83, | 1989,84, | 1989,85, | 1990,1, | 1990,2, | 1990,3, | 1990,4, | 1990,5, | 1990,6, | 1990,7, | 1990,8, | 1990,9, | 1990,10, | 1990,11, | 1990,12, | 1990,13, | 1990,14, | 1990,15, | 1990,16, | 1990,17, | 1990,18, | 1990,19, | 1990,20, | 1990,21, | 1990,22, | 1990,23, | 1990,24, | 1990,25, | 1990,26, | 1990,27, | 1990,28, | 1990,29, | 1990,30, | 1990,31, | 1990,32, | 1990,33, | 1990,34, | 1990,35, | 1990,36, | 1990,37, | 1990,38, | 1990,39, | 1990,40, | 1990,41, | 1990,42, | 1990,43, | 1990,44, | 1990,45, | 1990,46, | 1990,47, | 1990,48, | 1990,49, | 1990,50, | 1990,51, | 1990,52, | 1990,53, | 1990,54, | 1990,55, | 1990,56, | 1990,57, | 1990,58, | 1990,59, | 1990,60, | 1990,61, | 1990,62, | 1990,63, | 1990,64, | 1990,65, | 1990,66, | 1990,67, | 1990,68, | 1990,69, | 1990,70, | 1990,71, | 1990,72, | 1990,73, | 1990,74, | 1990,75, | 1990,76, | 1990,77, | 1990,78, | 1990,79, | 1990,80, | 1990,81, | 1990,82, | 1990,83, | 1990,84, | 1990,85, | 1991,1, | 1991,2, | 1991,3, | 1991,4, | 1991,5, | 1991,6, | 1991,7, | 1991,8, | 1991,9, | 1991,10, | 1991,11, | 1991,12, | 1991,13, | 1991,14, | 1991,15, | 1991,16, | 1991,17, | 1991,18, | 1991,19, | 1991,20, | 1991,21, | 1991,22, | 1991,23, | 1991,24, | 1991,25, | 1991,26, | 1991,27, | 1991,28, | 1991,29, | 1991,30, | 1991,31, | 1991,32, | 1991,33, | 1991,34, | 1991,35, | 1991,36, | 1991,37, | 1991,38, | 1991,39, | 1991,40, | 1991,41, | 1991,42, | 1991,43, | 1991,44, | 1991,45, | 1991,46, | 1991,47, | 1991,48, | 1991,49, | 1991,50, | 1991,51, | 1991,52, | 1991,53, | 1991,54, | 1991,55, | 1991,56, | 1991,57, | 1991,58, | 1991,59, | 1991,60, | 1991,61, | 1991,62, | 1991,63, | 1991,64, | 1991,65, | 1991,66, | 1991,67, | 1991,68, | 1991,69, | 1991,70, | 1991,71, | 1991,72, | 1991,73, | 1991,74, | 1991,75, | 1991,76, | 1991,77, | 1991,78, | 1991,79, | 1991,80, | 1991,81, | 1991,82, | 1991,83, | 1991,84, | 1991,85, | 1992,1, | 1992,2, | 1992,3, | 1992,4, | 1992,5, | 1992,6, | 1992,7, | 1992,8, | 1992,9, | 1992,10, | 1992,11, | 1992,12, | 1992,13, | 1992,14, | 1992,15, | 1992,16, | 1992,17, | 1992,18, | 1992,19, | 1992,20, | 1992,21, | 1992,22, | 1992,23, | 1992,24, | 1992,25, | 1992,26, | 1992,27, | 1992,28, | 1992,29, | 1992,30, | 1992,31, | 1992,32, | 1992,33, | 1992,34, | 1992,35, | 1992,36, | 1992,37, | 1992,38, | 1992,39, | 1992,40, | 1992,41, | 1992,42, | 1992,43, | 1992,44, | 1992,45, | 1992,46, | 1992,47, | 1992,48, | 1992,49, | 1992,50, | 1992,51, | 1992,52, | 1992,53, | 1992,54, | 1992,55, | 1992,56, | 1992,57, | 1992,58, | 1992,59, | 1992,60, | 1992,61, | 1992,62, | 1992,63, | 1992,64, | 1992,65, | 1992,66, | 1992,67, | 1992,68, | 1992,69, | 1992,70, | 1992,71, | 1992,72, | 1992,73, | 1992,74, | 1992,75, | 1992,76, | 1992,77, | 1992,78, | 1992,79, | 1992,80, | 1992,81, | 1992,82, | 1992,83, | 1992,84, | 1992,85, | 1993,1, | 1993,2, | 1993,3, | 1993,4, | 1993,5, | 1993,6, | 1993,7, | 1993,8, | 1993,9, | 1993,10, | 1993,11, | 1993,12, | 1993,13, | 1993,14, | 1993,15, | 1993,16, | 1993,17, | 1993,18, | 1993,19, | 1993,20, | 1993,21, | 1993,22, | 1993,23, | 1993,24, | 1993,25, | 1993,26, | 1993,27, | 1993,28, | 1993,29, | 1993,30, | 1993,31, | 1993,32, | 1993,33, | 1993,34, | 1993,35, | 1993,36, | 1993,37, | 1993,38, | 1993,39, | 1993,40, | 1993,41, | 1993,42, | 1993,43, | 1993,44, | 1993,45, | 1993,46, | 1993,47, | 1993,48, | 1993,49, | 1993,50, | 1993,51, | 1993,52, | 1993,53, | 1993,54, | 1993,55, | 1993,56, | 1993,57, | 1993,58, | 1993,59, | 1993,60, | 1993,61, | 1993,62, | 1993,63, | 1993,64, | 1993,65, | 1993,66, | 1993,67, | 1993,68, | 1993,69, | 1993,70, | 1993,71, | 1993,72, | 1993,73, | 1993,74, | 1993,75, | 1993,76, | 1993,77, | 1993,78, | 1993,79, | 1993,80, | 1993,81, | 1993,82, | 1993,83, | 1993,84, | 1993,85, | 1994,1, | 1994,2, | 1994,3, | 1994,4, | 1994,5, | 1994,6, | 1994,7, | 1994,8, | 1994,9, | 1994,10, | 1994,11, | 1994,12, | 1994,13, | 1994,14, | 1994,15, | 1994,16, | 1994,17, | 1994,18, | 1994,19, | 1994,20, | 1994,21, | 1994,22, | 1994,23, | 1994,24, | 1994,25, | 1994,26, | 1994,27, | 1994,28, | 1994,29, | 1994,30, | 1994,31, | 1994,32, | 1994,33, | 1994,34, | 1994,35, | 1994,36, | 1994,37, | 1994,38, | 1994,39, | 1994,40, | 1994,41, | 1994,42, | 1994,43, | 1994,44, | 1994,45, | 1994,46, | 1994,47, | 1994,48, | 1994,49, | 1994,50, | 1994,51, | 1994,52, | 1994,53, | 1994,54, | 1994,55, | 1994,56, | 1994,57, | 1994,58, | 1994,59, | 1994,60, | 1994,61, | 1994,62, | 1994,63, | 1994,64, | 1994,65, | 1994,66, | 1994,67, | 1994,68, | 1994,69, | 1994,70, | 1994,71, | 1994,72, | 1994,73, | 1994,74, | 1994,75, | 1994,76, | 1994,77, | 1994,78, | 1994,79, | 1994,80, | 1994,81, | 1994,82, | 1994,83, | 1994,84, | 1994,85, | 1995,1, | 1995,2, | 1995,3, | 1995,4, | 1995,5, | 1995,6, | 1995,7, | 1995,8, | 1995,9, | 1995,10, | 1995,11, | 1995,12, | 1995,13, | 1995,14, | 1995,15, | 1995,16, | 1995,17, | 1995,18, | 1995,19, | 1995,20, | 1995,21, | 1995,22, | 1995,23, | 1995,24, | 1995,25, | 1995,26, | 1995,27, | 1995,28, | 1995,29, | 1995,30, | 1995,31, | 1995,32, | 1995,33, | 1995,34, | 1995,35, | 1995,36, | 1995,37, | 1995,38, | 1995,39, | 1995,40, | 1995,41, | 1995,42, | 1995,43, | 1995,44, | 1995,45, | 1995,46, | 1995,47, | 1995,48, | 1995,49, | 1995,50, | 1995,51, | 1995,52, | 1995,53, | 1995,54, | 1995,55, | 1995,56, | 1995,57, | 1995,58, | 1995,59, | 1995,60, | 1995,61, | 1995,62, | 1995,63, | 1995,64, | 1995,65, | 1995,66, | 1995,67, | 1995,68, | 1995,69, | 1995,70, | 1995,71, | 1995,72, | 1995,73, | 1995,74, | 1995,75, | 1995,76, | 1995,77, | 1995,78, | 1995,79, | 1995,80, | 1995,81, | 1995,82, | 1995,83, | 1995,84, | 1995,85, | 1996,1, | 1996,2, | 1996,3, | 1996,4, | 1996,5, | 1996,6, | 1996,7, | 1996,8, | 1996,9, | 1996,10, | 1996,11, | 1996,12, | 1996,13, | 1996,14, | 1996,15, | 1996,16, | 1996,17, | 1996,18, | 1996,19, | 1996,20, | 1996,21, | 1996,22, | 1996,23, | 1996,24, | 1996,25, | 1996,26, | 1996,27, | 1996,28, | 1996,29, | 1996,30, | 1996,31, | 1996,32, | 1996,33, | 1996,34, | 1996,35, | 1996,36, | 1996,37, | 1996,38, | 1996,39, | 1996,40, | 1996,41, | 1996,42, | 1996,43, | 1996,44, | 1996,45, | 1996,46, | 1996,47, | 1996,48, | 1996,49, | 1996,50, | 1996,51, | 1996,52, | 1996,53, | 1996,54, | 1996,55, | 1996,56, | 1996,57, | 1996,58, | 1996,59, | 1996,60, | 1996,61, | 1996,62, | 1996,63, | 1996,64, | 1996,65, | 1996,66, | 1996,67, | 1996,68, | 1996,69, | 1996,70, | 1996,71, | 1996,72, | 1996,73, | 1996,74, | 1996,75, | 1996,76, | 1996,77, | 1996,78, | 1996,79, | 1996,80, | 1996,81, | 1996,82, | 1996,83, | 1996,84, | 1996,85, | 1997,1, | 1997,2, | 1997,3, | 1997,4, | 1997,5, | 1997,6, | 1997,7, | 1997,8, | 1997,9, | 1997,10, | 1997,11, | 1997,12, | 1997,13, | 1997,14, | 1997,15, | 1997,16, | 1997,17, | 1997,18, | 1997,19, | 1997,20, | 1997,21, | 1997,22, | 1997,23, | 1997,24, | 1997,25, | 1997,26, | 1997,27, | 1997,28, | 1997,29, | 1997,30, | 1997,31, | 1997,32, | 1997,33, | 1997,34, | 1997,35, | 1997,36, | 1997,37, | 1997,38, | 1997,39, | 1997,40, | 1997,41, | 1997,42, | 1997,43, | 1997,44, | 1997,45, | 1997,46, | 1997,47, | 1997,48, | 1997,49, | 1997,50, | 1997,51, | 1997,52, | 1997,53, | 1997,54, | 1997,55, | 1997,56, | 1997,57, | 1997,58, | 1997,59, | 1997,60, | 1997,61, | 1997,62, | 1997,63, | 1997,64, | 1997,65, | 1997,66, | 1997,67, | 1997,68, | 1997,69, | 1997,70, | 1997,71, | 1997,72, | 1997,73, | 1997,74, | 1997,75, | 1997,76, | 1997,77, | 1997,78, | 1997,79, | 1997,80, | 1997,81, | 1997,82, | 1997,83, | 1997,84, | 1997,85, | 1998,1, | 1998,2, | 1998,3, | 1998,4, | 1998,5, | 1998,6, | 1998,7, | 1998,8, | 1998,9, | 1998,10, | 1998,11, | 1998,12, | 1998,13, | 1998,14, | 1998,15, | 1998,16, | 1998,17, | 1998,18, | 1998,19, | 1998,20, | 1998,21, | 1998,22, | 1998,23, | 1998,24, | 1998,25, | 1998,26, | 1998,27, | 1998,28, | 1998,29, | 1998,30, | 1998,31, | 1998,32, | 1998,33, | 1998,34, | 1998,35, | 1998,36, | 1998,37, | 1998,38, | 1998,39, | 1998,40, | 1998,41, | 1998,42, | 1998,43, | 1998,44, | 1998,45, | 1998,46, | 1998,47, | 1998,48, | 1998,49, | 1998,50, | 1998,51, | 1998,52, | 1998,53, | 1998,54, | 1998,55, | 1998,56, | 1998,57, | 1998,58, | 1998,59, | 1998,60, | 1998,61, | 1998,62, | 1998,63, | 1998,64, | 1998,65, | 1998,66, | 1998,67, | 1998,68, | 1998,69, | 1998,70, | 1998,71, | 1998,72, | 1998,73, | 1998,74, | 1998,75, | 1998,76, | 1998,77, | 1998,78, | 1998,79, | 1998,80, | 1998,81, | 1998,82, | 1998,83, | 1998,84, | 1998,85, | 1999,1, | 1999,2, | 1999,3, | 1999,4, | 1999,5, | 1999,6, | 1999,7, | 1999,8, | 1999,9, | 1999,10, | 1999,11, | 1999,12, | 1999,13, | 1999,14, | 1999,15, | 1999,16, | 1999,17, | 1999,18, | 1999,19, | 1999,20, | 1999,21, | 1999,22, | 1999,23, | 1999,24, | 1999,25, | 1999,26, | 1999,27, | 1999,28, | 1999,29, | 1999,30, | 1999,31, | 1999,32, | 1999,33, | 1999,34, | 1999,35, | 1999,36, | 1999,37, | 1999,38, | 1999,39, | 1999,40, | 1999,41, | 1999,42, | 1999,43, | 1999,44, | 1999,45, | 1999,46, | 1999,47, | 1999,48, | 1999,49, | 1999,50, | 1999,51, | 1999,52, | 1999,53, | 1999,54, | 1999,55, | 1999,56, | 1999,57, | 1999,58, | 1999,59, | 1999,60, | 1999,61, | 1999,62, | 1999,63, | 1999,64, | 1999,65, | 1999,66, | 1999,67, | 1999,68, | 1999,69, | 1999,70, | 1999,71, | 1999,72, | 1999,73, | 1999,74, | 1999,75, | 1999,76, | 1999,77, | 1999,78, | 1999,79, | 1999,80, | 1999,81, | 1999,82, | 1999,83, | 1999,84, | 1999,85, | 2000,1, | 2000,2, | 2000,3, | 2000,4, | 2000,5, | 2000,6, | 2000,7, | 2000,8, | 2000,9, | 2000,10, | 2000,11, | 2000,12, | 2000,13, | 2000,14, | 2000,15, | 2000,16, | 2000,17, | 2000,18, | 2000,19, | 2000,20, | 2000,21, | 2000,22, | 2000,23, | 2000,24, | 2000,25, | 2000,26, | 2000,27, | 2000,28, | 2000,29, | 2000,30, | 2000,31, | 2000,32, | 2000,33, | 2000,34, | 2000,35, | 2000,36, | 2000,37, | 2000,38, | 2000,39, | 2000,40, | 2000,41, | 2000,42, | 2000,43, | 2000,44, | 2000,45, | 2000,46, | 2000,47, | 2000,48, | 2000,49, | 2000,50, | 2000,51, | 2000,52, | 2000,53, | 2000,54, | 2000,55, | 2000,56, | 2000,57, | 2000,58, | 2000,59, | 2000,60, | 2000,61, | 2000,62, | 2000,63, | 2000,64, | 2000,65, | 2000,66, | 2000,67, | 2000,68, | 2000,69, | 2000,70, | 2000,71, | 2000,72, | 2000,73, | 2000,74, | 2000,75, | 2000,76, | 2000,77, | 2000,78, | 2000,79, | 2000,80, | 2000,81, | 2000,82, | 2000,83, | 2000,84, | 2000,85, | 2001,1, | 2001,2, | 2001,3, | 2001,4, | 2001,5, | 2001,6, | 2001,7, | 2001,8, | 2001,9, | 2001,10, | 2001,11, | 2001,12, | 2001,13, | 2001,14, | 2001,15, | 2001,16, | 2001,17, | 2001,18, | 2001,19, | 2001,20, | 2001,21, | 2001,22, | 2001,23, | 2001,24, | 2001,25, | 2001,26, | 2001,27, | 2001,28, | 2001,29, | 2001,30, | 2001,31, | 2001,32, | 2001,33, | 2001,34, | 2001,35, | 2001,36, | 2001,37, | 2001,38, | 2001,39, | 2001,40, | 2001,41, | 2001,42, | 2001,43, | 2001,44, | 2001,45, | 2001,46, | 2001,47, | 2001,48, | 2001,49, | 2001,50, | 2001,51, | 2001,52, | 2001,53, | 2001,54, | 2001,55, | 2001,56, | 2001,57, | 2001,58, | 2001,59, | 2001,60, | 2001,61, | 2001,62, | 2001,63, | 2001,64, | 2001,65, | 2001,66, | 2001,67, | 2001,68, | 2001,69, | 2001,70, | 2001,71, | 2001,72, | 2001,73, | 2001,74, | 2001,75, | 2001,76, | 2001,77, | 2001,78, | 2001,79, | 2001,80, | 2001,81, | 2001,82, | 2001,83, | 2001,84, | 2001,85, | 2002,1, | 2002,2, | 2002,3, | 2002,4, | 2002,5, | 2002,6, | 2002,7, | 2002,8, | 2002,9, | 2002,10, | 2002,11, | 2002,12, | 2002,13, | 2002,14, | 2002,15, | 2002,16, | 2002,17, | 2002,18, | 2002,19, | 2002,20, | 2002,21, | 2002,22, | 2002,23, | 2002,24, | 2002,25, | 2002,26, | 2002,27, | 2002,28, | 2002,29, | 2002,30, | 2002,31, | 2002,32, | 2002,33, | 2002,34, | 2002,35, | 2002,36, | 2002,37, | 2002,38, | 2002,39, | 2002,40, | 2002,41, | 2002,42, | 2002,43, | 2002,44, | 2002,45, | 2002,46, | 2002,47, | 2002,48, | 2002,49, | 2002,50, | 2002,51, | 2002,52, | 2002,53, | 2002,54, | 2002,55, | 2002,56, | 2002,57, | 2002,58, | 2002,59, | 2002,60, | 2002,61, | 2002,62, | 2002,63, | 2002,64, | 2002,65, | 2002,66, | 2002,67, | 2002,68, | 2002,69, | 2002,70, | 2002,71, | 2002,72, | 2002,73, | 2002,74, | 2002,75, | 2002,76, | 2002,77, | 2002,78, | 2002,79, | 2002,80, | 2002,81, | 2002,82, | 2002,83, | 2002,84, | 2002,85, | 2003,1, | 2003,2, | 2003,3, | 2003,4, | 2003,5, | 2003,6, | 2003,7, | 2003,8, | 2003,9, | 2003,10, | 2003,11, | 2003,12, | 2003,13, | 2003,14, | 2003,15, | 2003,16, | 2003,17, | 2003,18, | 2003,19, | 2003,20, | 2003,21, | 2003,22, | 2003,23, | 2003,24, | 2003,25, | 2003,26, | 2003,27, | 2003,28, | 2003,29, | 2003,30, | 2003,31, | 2003,32, | 2003,33, | 2003,34, | 2003,35, | 2003,36, | 2003,37, | 2003,38, | 2003,39, | 2003,40, | 2003,41, | 2003,42, | 2003,43, | 2003,44, | 2003,45, | 2003,46, | 2003,47, | 2003,48, | 2003,49, | 2003,50, | 2003,51, | 2003,52, | 2003,53, | 2003,54, | 2003,55, | 2003,56, | 2003,57, | 2003,58, | 2003,59, | 2003,60, | 2003,61, | 2003,62, | 2003,63, | 2003,64, | 2003,65, | 2003,66, | 2003,67, | 2003,68, | 2003,69, | 2003,70, | 2003,71, | 2003,72, | 2003,73, | 2003,74, | 2003,75, | 2003,76, | 2003,77, | 2003,78, | 2003,79, | 2003,80, | 2003,81, | 2003,82, | 2003,83, | 2003,84, | 2003,85, | 2004,1, | 2004,2, | 2004,3, | 2004,4, | 2004,5, | 2004,6, | 2004,7, | 2004,8, | 2004,9, | 2004,10, | 2004,11, | 2004,12, | 2004,13, | 2004,14, | 2004,15, | 2004,16, | 2004,17, | 2004,18, | 2004,19, | 2004,20, | 2004,21, | 2004,22, | 2004,23, | 2004,24, | 2004,25, | 2004,26, | 2004,27, | 2004,28, | 2004,29, | 2004,30, | 2004,31, | 2004,32, | 2004,33, | 2004,34, | 2004,35, | 2004,36, | 2004,37, | 2004,38, | 2004,39, | 2004,40, | 2004,41, | 2004,42, | 2004,43, | 2004,44, | 2004,45, | 2004,46, | 2004,47, | 2004,48, | 2004,49, | 2004,50, | 2004,51, | 2004,52, | 2004,53, | 2004,54, | 2004,55, | 2004,56, | 2004,57, | 2004,58, | 2004,59, | 2004,60, | 2004,61, | 2004,62, | 2004,63, | 2004,64, | 2004,65, | 2004,66, | 2004,67, | 2004,68, | 2004,69, | 2004,70, | 2004,71, | 2004,72, | 2004,73, | 2004,74, | 2004,75, | 2004,76, | 2004,77, | 2004,78, | 2004,79, | 2004,80, | 2004,81, | 2004,82, | 2004,83, | 2004,84, | 2004,85, | 2005,1, | 2005,2, | 2005,3, | 2005,4, | 2005,5, | 2005,6, | 2005,7, | 2005,8, | 2005,9, | 2005,10, | 2005,11, | 2005,12, | 2005,13, | 2005,14, | 2005,15, | 2005,16, | 2005,17, | 2005,18, | 2005,19, | 2005,20, | 2005,21, | 2005,22, | 2005,23, | 2005,24, | 2005,25, | 2005,26, | 2005,27, | 2005,28, | 2005,29, | 2005,30, | 2005,31, | 2005,32, | 2005,33, | 2005,34, | 2005,35, | 2005,36, | 2005,37, | 2005,38, | 2005,39, | 2005,40, | 2005,41, | 2005,42, | 2005,43, | 2005,44, | 2005,45, | 2005,46, | 2005,47, | 2005,48, | 2005,49, | 2005,50, | 2005,51, | 2005,52, | 2005,53, | 2005,54, | 2005,55, | 2005,56, | 2005,57, | 2005,58, | 2005,59, | 2005,60, | 2005,61, | 2005,62, | 2005,63, | 2005,64, | 2005,65, | 2005,66, | 2005,67, | 2005,68, | 2005,69, | 2005,70, | 2005,71, | 2005,72, | 2005,73, | 2005,74, | 2005,75, | 2005,76, | 2005,77, | 2005,78, | 2005,79, | 2005,80, | 2005,81, | 2005,82, | 2005,83, | 2005,84, | 2005,85, | 2006,1, | 2006,2, | 2006,3, | 2006,4, | 2006,5, | 2006,6, | 2006,7, | 2006,8, | 2006,9, | 2006,10, | 2006,11, | 2006,12, | 2006,13, | 2006,14, | 2006,15, | 2006,16, | 2006,17, | 2006,18, | 2006,19, | 2006,20, | 2006,21, | 2006,22, | 2006,23, | 2006,24, | 2006,25, | 2006,26, | 2006,27, | 2006,28, | 2006,29, | 2006,30, | 2006,31, | 2006,32, | 2006,33, | 2006,34, | 2006,35, | 2006,36, | 2006,37, | 2006,38, | 2006,39, | 2006,40, | 2006,41, | 2006,42, | 2006,43, | 2006,44, | 2006,45, | 2006,46, | 2006,47, | 2006,48, | 2006,49, | 2006,50, | 2006,51, | 2006,52, | 2006,53, | 2006,54, | 2006,55, | 2006,56, | 2006,57, | 2006,58, | 2006,59, | 2006,60, | 2006,61, | 2006,62, | 2006,63, | 2006,64, | 2006,65, | 2006,66, | 2006,67, | 2006,68, | 2006,69, | 2006,70, | 2006,71, | 2006,72, | 2006,73, | 2006,74, | 2006,75, | 2006,76, | 2006,77, | 2006,78, | 2006,79, | 2006,80, | 2006,81, | 2006,82, | 2006,83, | 2006,84, | 2006,85, | 2007,1, | 2007,2, | 2007,3, | 2007,4, | 2007,5, | 2007,6, | 2007,7, | 2007,8, | 2007,9, | 2007,10, | 2007,11, | 2007,12, | 2007,13, | 2007,14, | 2007,15, | 2007,16, | 2007,17, | 2007,18, | 2007,19, | 2007,20, | 2007,21, | 2007,22, | 2007,23, | 2007,24, | 2007,25, | 2007,26, | 2007,27, | 2007,28, | 2007,29, | 2007,30, | 2007,31, | 2007,32, | 2007,33, | 2007,34, | 2007,35, | 2007,36, | 2007,37, | 2007,38, | 2007,39, | 2007,40, | 2007,41, | 2007,42, | 2007,43, | 2007,44, | 2007,45, | 2007,46, | 2007,47, | 2007,48, | 2007,49, | 2007,50, | 2007,51, | 2007,52, | 2007,53, | 2007,54, | 2007,55, | 2007,56, | 2007,57, | 2007,58, | 2007,59, | 2007,60, | 2007,61, | 2007,62, | 2007,63, | 2007,64, | 2007,65, | 2007,66, | 2007,67, | 2007,68, | 2007,69, | 2007,70, | 2007,71, | 2007,72, | 2007,73, | 2007,74, | 2007,75, | 2007,76, | 2007,77, | 2007,78, | 2007,79, | 2007,80, | 2007,81, | 2007,82, | 2007,83, | 2007,84, | 2007,85, | 2008,1, | 2008,2, | 2008,3, | 2008,4, | 2008,5, | 2008,6, | 2008,7, | 2008,8, | 2008,9, | 2008,10, | 2008,11, | 2008,12, | 2008,13, | 2008,14, | 2008,15, | 2008,16, | 2008,17, | 2008,18, | 2008,19, | 2008,20, | 2008,21, | 2008,22, | 2008,23, | 2008,24, | 2008,25, | 2008,26, | 2008,27, | 2008,28, | 2008,29, | 2008,30, | 2008,31, | 2008,32, | 2008,33, | 2008,34, | 2008,35, | 2008,36, | 2008,37, | 2008,38, | 2008,39, | 2008,40, | 2008,41, | 2008,42, | 2008,43, | 2008,44, | 2008,45, | 2008,46, | 2008,47, | 2008,48, | 2008,49, | 2008,50, | 2008,51, | 2008,52, | 2008,53, | 2008,54, | 2008,55, | 2008,56, | 2008,57, | 2008,58, | 2008,59, | 2008,60, | 2008,61, | 2008,62, | 2008,63, | 2008,64, | 2008,65, | 2008,66, | 2008,67, | 2008,68, | 2008,69, | 2008,70, | 2008,71, | 2008,72, | 2008,73, | 2008,74, | 2008,75, | 2008,76, | 2008,77, | 2008,78, | 2008,79, | 2008,80, | 2008,81, | 2008,82, | 2008,83, | 2008,84, | 2008,85, | 2009,1, | 2009,2, | 2009,3, | 2009,4, | 2009,5, | 2009,6, | 2009,7, | 2009,8, | 2009,9, | 2009,10, | 2009,11, | 2009,12, | 2009,13, | 2009,14, | 2009,15, | 2009,16, | 2009,17, | 2009,18, | 2009,19, | 2009,20, | 2009,21, | 2009,22, | 2009,23, | 2009,24, | 2009,25, | 2009,26, | 2009,27, | 2009,28, | 2009,29, | 2009,30, | 2009,31, | 2009,32, | 2009,33, | 2009,34, | 2009,35, | 2009,36, | 2009,37, | 2009,38, | 2009,39, | 2009,40, | 2009,41, | 2009,42, | 2009,43, | 2009,44, | 2009,45, | 2009,46, | 2009,47, | 2009,48, | 2009,49, | 2009,50, | 2009,51, | 2009,52, | 2009,53, | 2009,54, | 2009,55, | 2009,56, | 2009,57, | 2009,58, | 2009,59, | 2009,60, | 2009,61, | 2009,62, | 2009,63, | 2009,64, | 2009,65, | 2009,66, | 2009,67, | 2009,68, | 2009,69, | 2009,70, | 2009,71, | 2009,72, | 2009,73, | 2009,74, | 2009,75, | 2009,76, | 2009,77, | 2009,78, | 2009,79, | 2009,80, | 2009,81, | 2009,82, | 2009,83, | 2009,84, | 2009,85, | 2010,1, | 2010,2, | 2010,3, | 2010,4, | 2010,5, | 2010,6, | 2010,7, | 2010,8, | 2010,9, | 2010,10, | 2010,11, | 2010,12, | 2010,13, | 2010,14, | 2010,15, | 2010,16, | 2010,17, | 2010,18, | 2010,19, | 2010,20, | 2010,21, | 2010,22, | 2010,23, | 2010,24, | 2010,25, | 2010,26, | 2010,27, | 2010,28, | 2010,29, | 2010,30, | 2010,31, | 2010,32, | 2010,33, | 2010,34, | 2010,35, | 2010,36, | 2010,37, | 2010,38, | 2010,39, | 2010,40, | 2010,41, | 2010,42, | 2010,43, | 2010,44, | 2010,45, | 2010,46, | 2010,47, | 2010,48, | 2010,49, | 2010,50, | 2010,51, | 2010,52, | 2010,53, | 2010,54, | 2010,55, | 2010,56, | 2010,57, | 2010,58, | 2010,59, | 2010,60, | 2010,61, | 2010,62, | 2010,63, | 2010,64, | 2010,65, | 2010,66, | 2010,67, | 2010,68, | 2010,69, | 2010,70, | 2010,71, | 2010,72, | 2010,73, | 2010,74, | 2010,75, | 2010,76, | 2010,77, | 2010,78, | 2010,79, | 2010,80, | 2010,81, | 2010,82, | 2010,83, | 2010,84, | 2010,85, | 2011,1, | 2011,2, | 2011,3, | 2011,4, | 2011,5, | 2011,6, | 2011,7, | 2011,8, | 2011,9, | 2011,10, | 2011,11, | 2011,12, | 2011,13, | 2011,14, | 2011,15, | 2011,16, | 2011,17, | 2011,18, | 2011,19, | 2011,20, | 2011,21, | 2011,22, | 2011,23, | 2011,24, | 2011,25, | 2011,26, | 2011,27, | 2011,28, | 2011,29, | 2011,30, | 2011,31, | 2011,32, | 2011,33, | 2011,34, | 2011,35, | 2011,36, | 2011,37, | 2011,38, | 2011,39, | 2011,40, | 2011,41, | 2011,42, | 2011,43, | 2011,44, | 2011,45, | 2011,46, | 2011,47, | 2011,48, | 2011,49, | 2011,50, | 2011,51, | 2011,52, | 2011,53, | 2011,54, | 2011,55, | 2011,56, | 2011,57, | 2011,58, | 2011,59, | 2011,60, | 2011,61, | 2011,62, | 2011,63, | 2011,64, | 2011,65, | 2011,66, | 2011,67, | 2011,68, | 2011,69, | 2011,70, | 2011,71, | 2011,72, | 2011,73, | 2011,74, | 2011,75, | 2011,76, | 2011,77, | 2011,78, | 2011,79, | 2011,80, | 2011,81, | 2011,82, | 2011,83, | 2011,84, | 2011,85, | 2012,1, | 2012,2, | 2012,3, | 2012,4, | 2012,5, | 2012,6, | 2012,7, | 2012,8, | 2012,9, | 2012,10, | 2012,11, | 2012,12, | 2012,13, | 2012,14, | 2012,15, | 2012,16, | 2012,17, | 2012,18, | 2012,19, | 2012,20, | 2012,21, | 2012,22, | 2012,23, | 2012,24, | 2012,25, | 2012,26, | 2012,27, | 2012,28, | 2012,29, | 2012,30, | 2012,31, | 2012,32, | 2012,33, | 2012,34, | 2012,35, | 2012,36, | 2012,37, | 2012,38, | 2012,39, | 2012,40, | 2012,41, | 2012,42, | 2012,43, | 2012,44, | 2012,45, | 2012,46, | 2012,47, | 2012,48, | 2012,49, | 2012,50, | 2012,51, | 2012,52, | 2012,53, | 2012,54, | 2012,55, | 2012,56, | 2012,57, | 2012,58, | 2012,59, | 2012,60, | 2012,61, | 2012,62, | 2012,63, | 2012,64, | 2012,65, | 2012,66, | 2012,67, | 2012,68, | 2012,69, | 2012,70, | 2012,71, | 2012,72, | 2012,73, | 2012,74, | 2012,75, | 2012,76, | 2012,77, | 2012,78, | 2012,79, | 2012,80, | 2012,81, | 2012,82, | 2012,83, | 2012,84, | 2012,85, | 2013,1, | 2013,2, | 2013,3, | 2013,4, | 2013,5, | 2013,6, | 2013,7, | 2013,8, | 2013,9, | 2013,10, | 2013,11, | 2013,12, | 2013,13, | 2013,14, | 2013,15, | 2013,16, | 2013,17, | 2013,18, | 2013,19, | 2013,20, | 2013,21, | 2013,22, | 2013,23, | 2013,24, | 2013,25, | 2013,26, | 2013,27, | 2013,28, | 2013,29, | 2013,30, | 2013,31, | 2013,32, | 2013,33, | 2013,34, | 2013,35, | 2013,36, | 2013,37, | 2013,38, | 2013,39, | 2013,40, | 2013,41, | 2013,42, | 2013,43, | 2013,44, | 2013,45, | 2013,46, | 2013,47, | 2013,48, | 2013,49, | 2013,50, | 2013,51, | 2013,52, | 2013,53, | 2013,54, | 2013,55, | 2013,56, | 2013,57, | 2013,58, | 2013,59, | 2013,60, | 2013,61, | 2013,62, | 2013,63, | 2013,64, | 2013,65, | 2013,66, | 2013,67, | 2013,68, | 2013,69, | 2013,70, | 2013,71, | 2013,72, | 2013,73, | 2013,74, | 2013,75, | 2013,76, | 2013,77, | 2013,78, | 2013,79, | 2013,80, | 2013,81, | 2013,82, | 2013,83, | 2013,84, | 2013,85, | 2014,1, | 2014,2, | 2014,3, | 2014,4, | 2014,5, | 2014,6, | 2014,7, | 2014,8, | 2014,9, | 2014,10, | 2014,11, | 2014,12, | 2014,13, | 2014,14, | 2014,15, | 2014,16, | 2014,17, | 2014,18, | 2014,19, | 2014,20, | 2014,21, | 2014,22, | 2014,23, | 2014,24, | 2014,25, | 2014,26, | 2014,27, | 2014,28, | 2014,29, | 2014,30, | 2014,31, | 2014,32, | 2014,33, | 2014,34, | 2014,35, | 2014,36, | 2014,37, | 2014,38, | 2014,39, | 2014,40, | 2014,41, | 2014,42, | 2014,43, | 2014,44, | 2014,45, | 2014,46, | 2014,47, | 2014,48, | 2014,49, | 2014,50, | 2014,51, | 2014,52, | 2014,53, | 2014,54, | 2014,55, | 2014,56, | 2014,57, | 2014,58, | 2014,59, | 2014,60, | 2014,61, | 2014,62, | 2014,63, | 2014,64, | 2014,65, | 2014,66, | 2014,67, | 2014,68, | 2014,69, | 2014,70, | 2014,71, | 2014,72, | 2014,73, | 2014,74, | 2014,75, | 2014,76, | 2014,77, | 2014,78, | 2014,79, | 2014,80, | 2014,81, | 2014,82, | 2014,83, | 2014,84, | 2014,85, | 2015,1, | 2015,2, | 2015,3, | 2015,4, | 2015,5, | 2015,6, | 2015,7, | 2015,8, | 2015,9, | 2015,10, | 2015,11, | 2015,12, | 2015,13, | 2015,14, | 2015,15, | 2015,16, | 2015,17, | 2015,18, | 2015,19, | 2015,20, | 2015,21, | 2015,22, | 2015,23, | 2015,24, | 2015,25, | 2015,26, | 2015,27, | 2015,28, | 2015,29, | 2015,30, | 2015,31, | 2015,32, | 2015,33, | 2015,34, | 2015,35, | 2015,36, | 2015,37, | 2015,38, | 2015,39, | 2015,40, | 2015,41, | 2015,42, | 2015,43, | 2015,44, | 2015,45, | 2015,46, | 2015,47, | 2015,48, | 2015,49, | 2015,50, | 2015,51, | 2015,52, | 2015,53, | 2015,54, | 2015,55, | 2015,56, | 2015,57, | 2015,58, | 2015,59, | 2015,60, | 2015,61, | 2015,62, | 2015,63, | 2015,64, | 2015,65, | 2015,66, | 2015,67, | 2015,68, | 2015,69, | 2015,70, | 2015,71, | 2015,72, | 2015,73, | 2015,74, | 2015,75, | 2015,76, | 2015,77, | 2015,78, | 2015,79, | 2015,80, | 2015,81, | 2015,82, | 2015,83, | 2015,84, | 2015,85, | 2016,1, | 2016,2, | 2016,3, | 2016,4, | 2016,5, | 2016,6, | 2016,7, | 2016,8, | 2016,9, | 2016,10, | 2016,11, | 2016,12, | 2016,13, | 2016,14, | 2016,15, | 2016,16, | 2016,17, | 2016,18, | 2016,19, | 2016,20, | 2016,21, | 2016,22, | 2016,23, | 2016,24, | 2016,25, | 2016,26, | 2016,27, | 2016,28, | 2016,29, | 2016,30, | 2016,31, | 2016,32, | 2016,33, | 2016,34, | 2016,35, | 2016,36, | 2016,37, | 2016,38, | 2016,39, | 2016,40, | 2016,41, | 2016,42, | 2016,43, | 2016,44, | 2016,45, | 2016,46, | 2016,47, | 2016,48, | 2016,49, | 2016,50, | 2016,51, | 2016,52, | 2016,53, | 2016,54, | 2016,55, | 2016,56, | 2016,57, | 2016,58, | 2016,59, | 2016,60, | 2016,61, | 2016,62, | 2016,63, | 2016,64, | 2016,65, | 2016,66, | 2016,67, | 2016,68, | 2016,69, | 2016,70, | 2016,71, | 2016,72, | 2016,73, | 2016,74, | 2016,75, | 2016,76, | 2016,77, | 2016,78, | 2016,79, | 2016,80, | 2016,81, | 2016,82, | 2016,83, | 2016,84, | 2016,85, | 2017,1, | 2017,2, | 2017,3, | 2017,4, | 2017,5, | 2017,6, | 2017,7, | 2017,8, | 2017,9, | 2017,10, | 2017,11, | 2017,12, | 2017,13, | 2017,14, | 2017,15, | 2017,16, | 2017,17, | 2017,18, | 2017,19, | 2017,20, | 2017,21, | 2017,22, | 2017,23, | 2017,24, | 2017,25, | 2017,26, | 2017,27, | 2017,28, | 2017,29, | 2017,30, | 2017,31, | 2017,32, | 2017,33, | 2017,34, | 2017,35, | 2017,36, | 2017,37, | 2017,38, | 2017,39, | 2017,40, | 2017,41, | 2017,42, | 2017,43, | 2017,44, | 2017,45, | 2017,46, | 2017,47, | 2017,48, | 2017,49, | 2017,50, | 2017,51, | 2017,52, | 2017,53, | 2017,54, | 2017,55, | 2017,56, | 2017,57, | 2017,58, | 2017,59, | 2017,60, | 2017,61, | 2017,62, | 2017,63, | 2017,64, | 2017,65, | 2017,66, | 2017,67, | 2017,68, | 2017,69, | 2017,70, | 2017,71, | 2017,72, | 2017,73, | 2017,74, | 2017,75, | 2017,76, | 2017,77, | 2017,78, | 2017,79, | 2017,80, | 2017,81, | 2017,82, | 2017,83, | 2017,84, | 2017,85, | 2018,1, | 2018,2, | 2018,3, | 2018,4, | 2018,5, | 2018,6, | 2018,7, | 2018,8, | 2018,9, | 2018,10, | 2018,11, | 2018,12, | 2018,13, | 2018,14, | 2018,15, | 2018,16, | 2018,17, | 2018,18, | 2018,19, | 2018,20, | 2018,21, | 2018,22, | 2018,23, | 2018,24, | 2018,25, | 2018,26, | 2018,27, | 2018,28, | 2018,29, | 2018,30, | 2018,31, | 2018,32, | 2018,33, | 2018,34, | 2018,35, | 2018,36, | 2018,37, | 2018,38, | 2018,39, | 2018,40, | 2018,41, | 2018,42, | 2018,43, | 2018,44, | 2018,45, | 2018,46, | 2018,47, | 2018,48, | 2018,49, | 2018,50, | 2018,51, | 2018,52, | 2018,53, | 2018,54, | 2018,55, | 2018,56, | 2018,57, | 2018,58, | 2018,59, | 2018,60, | 2018,61, | 2018,62, | 2018,63, | 2018,64, | 2018,65, | 2018,66, | 2018,67, | 2018,68, | 2018,69, | 2018,70, | 2018,71, | 2018,72, | 2018,73, | 2018,74, | 2018,75, | 2018,76, | 2018,77, | 2018,78, | 2018,79, | 2018,80, | 2018,81, | 2018,82, | 2018,83, | 2018,84, | 2018,85, | 2019,1, | 2019,2, | 2019,3, | 2019,4, | 2019,5, | 2019,6, | 2019,7, | 2019,8, | 2019,9, | 2019,10, | 2019,11, | 2019,12, | 2019,13, | 2019,14, | 2019,15, | 2019,16, | 2019,17, | 2019,18, | 2019,19, | 2019,20, | 2019,21, | 2019,22, | 2019,23, | 2019,24, | 2019,25, | 2019,26, | 2019,27, | 2019,28, | 2019,29, | 2019,30, | 2019,31, | 2019,32, | 2019,33, | 2019,34, | 2019,35, | 2019,36, | 2019,37, | 2019,38, | 2019,39, | 2019,40, | 2019,41, | 2019,42, | 2019,43, | 2019,44, | 2019,45, | 2019,46, | 2019,47, | 2019,48, | 2019,49, | 2019,50, | 2019,51, | 2019,52, | 2019,53, | 2019,54, | 2019,55, | 2019,56, | 2019,57, | 2019,58, | 2019,59, | 2019,60, | 2019,61, | 2019,62, | 2019,63, | 2019,64, | 2019,65, | 2019,66, | 2019,67, | 2019,68, | 2019,69, | 2019,70, | 2019,71, | 2019,72, | 2019,73, | 2019,74, | 2019,75, | 2019,76, | 2019,77, | 2019,78, | 2019,79, | 2019,80, | 2019,81, | 2019,82, | 2019,83, | 2019,84, | 2019,85, | 2020,1, | 2020,2, | 2020,3, | 2020,4, | 2020,5, | 2020,6, | 2020,7, | 2020,8, | 2020,9, | 2020,10, | 2020,11, | 2020,12, | 2020,13, | 2020,14, | 2020,15, | 2020,16, | 2020,17, | 2020,18, | 2020,19, | 2020,20, | 2020,21, | 2020,22, | 2020,23, | 2020,24, | 2020,25, | 2020,26, | 2020,27, | 2020,28, | 2020,29, | 2020,30, | 2020,31, | 2020,32, | 2020,33, | 2020,34, | 2020,35, | 2020,36, | 2020,37, | 2020,38, | 2020,39, | 2020,40, | 2020,41, | 2020,42, | 2020,43, | 2020,44, | 2020,45, | 2020,46, | 2020,47, | 2020,48, | 2020,49, | 2020,50, | 2020,51, | 2020,52, | 2020,53, | 2020,54, | 2020,55, | 2020,56, | 2020,57, | 2020,58, | 2020,59, | 2020,60, | 2020,61, | 2020,62, | 2020,63, | 2020,64, | 2020,65, | 2020,66, | 2020,67, | 2020,68, | 2020,69, | 2020,70, | 2020,71, | 2020,72, | 2020,73, | 2020,74, | 2020,75, | 2020,76, | 2020,77, | 2020,78, | 2020,79, | 2020,80, | 2020,81, | 2020,82, | 2020,83, | 2020,84, | 2020,85, | 2021,1, | 2021,2, | 2021,3, | 2021,4, | 2021,5, | 2021,6, | 2021,7, | 2021,8, | 2021,9, | 2021,10, | 2021,11, | 2021,12, | 2021,13, | 2021,14, | 2021,15, | 2021,16, | 2021,17, | 2021,18, | 2021,19, | 2021,20, | 2021,21, | 2021,22, | 2021,23, | 2021,24, | 2021,25, | 2021,26, | 2021,27, | 2021,28, | 2021,29, | 2021,30, | 2021,31, | 2021,32, | 2021,33, | 2021,34, | 2021,35, | 2021,36, | 2021,37, | 2021,38, | 2021,39, | 2021,40, | 2021,41, | 2021,42, | 2021,43, | 2021,44, | 2021,45, | 2021,46, | 2021,47, | 2021,48, | 2021,49, | 2021,50, | 2021,51, | 2021,52, | 2021,53, | 2021,54, | 2021,55, | 2021,56, | 2021,57, | 2021,58, | 2021,59, | 2021,60, | 2021,61, | 2021,62, | 2021,63, | 2021,64, | 2021,65, | 2021,66, | 2021,67, | 2021,68, | 2021,69, | 2021,70, | 2021,71, | 2021,72, | 2021,73, | 2021,74, | 2021,75, | 2021,76, | 2021,77, | 2021,78, | 2021,79, | 2021,80, | 2021,81, | 2021,82, | 2021,83, | 2021,84, | 2021,85, | 2022,1, | 2022,2, | 2022,3, | 2022,4, | 2022,5, | 2022,6, | 2022,7, | 2022,8, | 2022,9, | 2022,10, | 2022,11, | 2022,12, | 2022,13, | 2022,14, | 2022,15, | 2022,16, | 2022,17, | 2022,18, | 2022,19, | 2022,20, | 2022,21, | 2022,22, | 2022,23, | 2022,24, | 2022,25, | 2022,26, | 2022,27, | 2022,28, | 2022,29, | 2022,30, | 2022,31, | 2022,32, | 2022,33, | 2022,34, | 2022,35, | 2022,36, | 2022,37, | 2022,38, | 2022,39, | 2022,40, | 2022,41, | 2022,42, | 2022,43, | 2022,44, | 2022,45, | 2022,46, | 2022,47, | 2022,48, | 2022,49, | 2022,50, | 2022,51, | 2022,52, | 2022,53, | 2022,54, | 2022,55, | 2022,56, | 2022,57, | 2022,58, | 2022,59, | 2022,60, | 2022,61, | 2022,62, | 2022,63, | 2022,64, | 2022,65, | 2022,66, | 2022,67, | 2022,68, | 2022,69, | 2022,70, | 2022,71, | 2022,72, | 2022,73, | 2022,74, | 2022,75, | 2022,76, | 2022,77, | 2022,78, | 2022,79, | 2022,80, | 2022,81, | 2022,82, | 2022,83, | 2022,84, | 2022,85, | 2023,1, | 2023,2, | 2023,3, | 2023,4, | 2023,5, | 2023,6, | 2023,7, | 2023,8, | 2023,9, | 2023,10, | 2023,11, | 2023,12, | 2023,13, | 2023,14, | 2023,15, | 2023,16, | 2023,17, | 2023,18, | 2023,19, | 2023,20, | 2023,21, | 2023,22, | 2023,23, | 2023,24, | 2023,25, | 2023,26, | 2023,27, | 2023,28, | 2023,29, | 2023,30, | 2023,31, | 2023,32, | 2023,33, | 2023,34, | 2023,35, | 2023,36, | 2023,37, | 2023,38, | 2023,39, | 2023,40, | 2023,41, | 2023,42, | 2023,43, | 2023,44, | 2023,45, | 2023,46, | 2023,47, | 2023,48, | 2023,49, | 2023,50, | 2023,51, | 2023,52, | 2023,53, | 2023,54, | 2023,55, | 2023,56, | 2023,57, | 2023,58, | 2023,59, | 2023,60, | 2023,61, | 2023,62, | 2023,63, | 2023,64, | 2023,65, | 2023,66, | 2023,67, | 2023,68, | 2023,69, | 2023,70, | 2023,71, | 2023,72, | 2023,73, | 2023,74, | 2023,75, | 2023,76, | 2023,77, | 2023,78, | 2023,79, | 2023,80, | 2023,81, | 2023,82, | 2023,83, | 2023,84, | 2023,85, | 2024,1, | 2024,2, | 2024,3, | 2024,4, | 2024,5, | 2024,6, | 2024,7, | 2024,8, | 2024,9, | 2024,10, | 2024,11, | 2024,12, | 2024,13, | 2024,14, | 2024,15, | 2024,16, | 2024,17, | 2024,18, | 2024,19, | 2024,20, | 2024,21, | 2024,22, | 2024,23, | 2024,24, | 2024,25, | 2024,26, | 2024,27, | 2024,28, | 2024,29, | 2024,30, | 2024,31, | 2024,32, | 2024,33, | 2024,34, | 2024,35, | 2024,36, | 2024,37, | 2024,38, | 2024,39, | 2024,40, | 2024,41, | 2024,42, | 2024,43, | 2024,44, | 2024,45, | 2024,46, | 2024,47, | 2024,48, | 2024,49, | 2024,50, | 2024,51, | 2024,52, | 2024,53, | 2024,54, | 2024,55, | 2024,56, | 2024,57, | 2024,58, | 2024,59, | 2024,60, | 2024,61, | 2024,62, | 2024,63, | 2024,64, | 2024,65, | 2024,66, | 2024,67, | 2024,68, | 2024,69, | 2024,70, | 2024,71, | 2024,72, | 2024,73, | 2024,74, | 2024,75, | 2024,76, | 2024,77, | 2024,78, | 2024,79, | 2024,80, | 2024,81, | 2024,82, | 2024,83, | 2024,84, | 2024,85, | 2025,1, | 2025,2, | 2025,3, | 2025,4, | 2025,5, | 2025,6, | 2025,7, | 2025,8, | 2025,9, | 2025,10, | 2025,11, | 2025,12, | 2025,13, | 2025,14, | 2025,15, | 2025,16, | 2025,17, | 2025,18, | 2025,19, | 2025,20, | 2025,21, | 2025,22, | 2025,23, | 2025,24, | 2025,25, | 2025,26, | 2025,27, | 2025,28, | 2025,29, | 2025,30, | 2025,31, | 2025,32, | 2025,33, | 2025,34, | 2025,35, | 2025,36, | 2025,37, | 2025,38, | 2025,39, | 2025,40, | 2025,41, | 2025,42, | 2025,43, | 2025,44, | 2025,45, | 2025,46, | 2025,47, | 2025,48, | 2025,49, | 2025,50, | 2025,51, | 2025,52, | 2025,53, | 2025,54, | 2025,55, | 2025,56, | 2025,57, | 2025,58, | 2025,59, | 2025,60, | 2025,61, | 2025,62, | 2025,63, | 2025,64, | 2025,65, | 2025,66, | 2025,67, | 2025,68, | 2025,69, | 2025,70, | 2025,71, | 2025,72, | 2025,73, | 2025,74, | 2025,75, | 2025,76, | 2025,77, | 2025,78, | 2025,79, | 2025,80, | 2025,81, | 2025,82, | 2025,83, | 2025,84, | 2025,85, | 2026,1, | 2026,2, | 2026,3, | 2026,4, | 2026,5, | 2026,6, | 2026,7, | 2026,8, | 2026,9, | 2026,10, | 2026,11, | 2026,12, | 2026,13, | 2026,14, | 2026,15, | 2026,16, | 2026,17, | 2026,18, | 2026,19, | 2026,20, | 2026,21, | 2026,22, | 2026,23, | 2026,24, | 2026,25, | 2026,26, | 2026,27, | 2026,28, | 2026,29, | 2026,30, | 2026,31, | 2026,32, | 2026,33, | 2026,34, | 2026,35, | 2026,36, | 2026,37, | 2026,38, | 2026,39, | 2026,40, | 2026,41, | 2026,42, | 2026,43, | 2026,44, | 2026,45, | 2026,46, | 2026,47, | 2026,48, | 2026,49, | 2026,50, | 2026,51, | 2026,52, | 2026,53, | 2026,54, | 2026,55, | 2026,56, | 2026,57, | 2026,58, | 2026,59, | 2026,60, | 2026,61, | 2026,62, | 2026,63, | 2026,64, | 2026,65, | 2026,66, | 2026,67, | 2026,68, | 2026,69, | 2026,70, | 2026,71, | 2026,72, | 2026,73, | 2026,74, | 2026,75, | 2026,76, | 2026,77, | 2026,78, | 2026,79, | 2026,80, | 2026,81, | 2026,82, | 2026,83, | 2026,84, | 2026,85, | 2027,1, | 2027,2, | 2027,3, | 2027,4, | 2027,5, | 2027,6, | 2027,7, | 2027,8, | 2027,9, | 2027,10, | 2027,11, | 2027,12, | 2027,13, | 2027,14, | 2027,15, | 2027,16, | 2027,17, | 2027,18, | 2027,19, | 2027,20, | 2027,21, | 2027,22, | 2027,23, | 2027,24, | 2027,25, | 2027,26, | 2027,27, | 2027,28, | 2027,29, | 2027,30, | 2027,31, | 2027,32, | 2027,33, | 2027,34, | 2027,35, | 2027,36, | 2027,37, | 2027,38, | 2027,39, | 2027,40, | 2027,41, | 2027,42, | 2027,43, | 2027,44, | 2027,45, | 2027,46, | 2027,47, | 2027,48, | 2027,49, | 2027,50, | 2027,51, | 2027,52, | 2027,53, | 2027,54, | 2027,55, | 2027,56, | 2027,57, | 2027,58, | 2027,59, | 2027,60, | 2027,61, | 2027,62, | 2027,63, | 2027,64, | 2027,65, | 2027,66, | 2027,67, | 2027,68, | 2027,69, | 2027,70, | 2027,71, | 2027,72, | 2027,73, | 2027,74, | 2027,75, | 2027,76, | 2027,77, | 2027,78, | 2027,79, | 2027,80, | 2027,81, | 2027,82, | 2027,83, | 2027,84, | 2027,85, | 2028,1, | 2028,2, | 2028,3, | 2028,4, | 2028,5, | 2028,6, | 2028,7, | 2028,8, | 2028,9, | 2028,10, | 2028,11, | 2028,12, | 2028,13, | 2028,14, | 2028,15, | 2028,16, | 2028,17, | 2028,18, | 2028,19, | 2028,20, | 2028,21, | 2028,22, | 2028,23, | 2028,24, | 2028,25, | 2028,26, | 2028,27, | 2028,28, | 2028,29, | 2028,30, | 2028,31, | 2028,32, | 2028,33, | 2028,34, | 2028,35, | 2028,36, | 2028,37, | 2028,38, | 2028,39, | 2028,40, | 2028,41, | 2028,42, | 2028,43, | 2028,44, | 2028,45, | 2028,46, | 2028,47, | 2028,48, | 2028,49, | 2028,50, | 2028,51, | 2028,52, | 2028,53, | 2028,54, | 2028,55, | 2028,56, | 2028,57, | 2028,58, | 2028,59, | 2028,60, | 2028,61, | 2028,62, | 2028,63, | 2028,64, | 2028,65, | 2028,66, | 2028,67, | 2028,68, | 2028,69, | 2028,70, | 2028,71, | 2028,72, | 2028,73, | 2028,74, | 2028,75, | 2028,76, | 2028,77, | 2028,78, | 2028,79, | 2028,80, | 2028,81, | 2028,82, | 2028,83, | 2028,84, | 2028,85, | 2029,1, | 2029,2, | 2029,3, | 2029,4, | 2029,5, | 2029,6, | 2029,7, | 2029,8, | 2029,9, | 2029,10, | 2029,11, | 2029,12, | 2029,13, | 2029,14, | 2029,15, | 2029,16, | 2029,17, | 2029,18, | 2029,19, | 2029,20, | 2029,21, | 2029,22, | 2029,23, | 2029,24, | 2029,25, | 2029,26, | 2029,27, | 2029,28, | 2029,29, | 2029,30, | 2029,31, | 2029,32, | 2029,33, | 2029,34, | 2029,35, | 2029,36, | 2029,37, | 2029,38, | 2029,39, | 2029,40, | 2029,41, | 2029,42, | 2029,43, | 2029,44, | 2029,45, | 2029,46, | 2029,47, | 2029,48, | 2029,49, | 2029,50, | 2029,51, | 2029,52, | 2029,53, | 2029,54, | 2029,55, | 2029,56, | 2029,57, | 2029,58, | 2029,59, | 2029,60, | 2029,61, | 2029,62, | 2029,63, | 2029,64, | 2029,65, | 2029,66, | 2029,67, | 2029,68, | 2029,69, | 2029,70, | 2029,71, | 2029,72, | 2029,73, | 2029,74, | 2029,75, | 2029,76, | 2029,77, | 2029,78, | 2029,79, | 2029,80, | 2029,81, | 2029,82, | 2029,83, | 2029,84, | 2029,85, | 2030,1, | 2030,2, | 2030,3, | 2030,4, | 2030,5, | 2030,6, | 2030,7, | 2030,8, | 2030,9, | 2030,10, | 2030,11, | 2030,12, | 2030,13, | 2030,14, | 2030,15, | 2030,16, | 2030,17, | 2030,18, | 2030,19, | 2030,20, | 2030,21, | 2030,22, | 2030,23, | 2030,24, | 2030,25, | 2030,26, | 2030,27, | 2030,28, | 2030,29, | 2030,30, | 2030,31, | 2030,32, | 2030,33, | 2030,34, | 2030,35, | 2030,36, | 2030,37, | 2030,38, | 2030,39, | 2030,40, | 2030,41, | 2030,42, | 2030,43, | 2030,44, | 2030,45, | 2030,46, | 2030,47, | 2030,48, | 2030,49, | 2030,50, | 2030,51, | 2030,52, | 2030,53, | 2030,54, | 2030,55, | 2030,56, | 2030,57, | 2030,58, | 2030,59, | 2030,60, | 2030,61, | 2030,62, | 2030,63, | 2030,64, | 2030,65, | 2030,66, | 2030,67, | 2030,68, | 2030,69, | 2030,70, | 2030,71, | 2030,72, | 2030,73, | 2030,74, | 2030,75, | 2030,76, | 2030,77, | 2030,78, | 2030,79, | 2030,80, | 2030,81, | 2030,82, | 2030,83, | 2030,84, | 2030,85, | 2031,1, | 2031,2, | 2031,3, | 2031,4, | 2031,5, | 2031,6, | 2031,7, | 2031,8, | 2031,9, | 2031,10, | 2031,11, | 2031,12, | 2031,13, | 2031,14, | 2031,15, | 2031,16, | 2031,17, | 2031,18, | 2031,19, | 2031,20, | 2031,21, | 2031,22, | 2031,23, | 2031,24, | 2031,25, | 2031,26, | 2031,27, | 2031,28, | 2031,29, | 2031,30, | 2031,31, | 2031,32, | 2031,33, | 2031,34, | 2031,35, | 2031,36, | 2031,37, | 2031,38, | 2031,39, | 2031,40, | 2031,41, | 2031,42, | 2031,43, | 2031,44, | 2031,45, | 2031,46, | 2031,47, | 2031,48, | 2031,49, | 2031,50, | 2031,51, | 2031,52, | 2031,53, | 2031,54, | 2031,55, | 2031,56, | 2031,57, | 2031,58, | 2031,59, | 2031,60, | 2031,61, | 2031,62, | 2031,63, | 2031,64, | 2031,65, | 2031,66, | 2031,67, | 2031,68, | 2031,69, | 2031,70, | 2031,71, | 2031,72, | 2031,73, | 2031,74, | 2031,75, | 2031,76, | 2031,77, | 2031,78, | 2031,79, | 2031,80, | 2031,81, | 2031,82, | 2031,83, | 2031,84, | 2031,85, | 2032,1, | 2032,2, | 2032,3, | 2032,4, | 2032,5, | 2032,6, | 2032,7, | 2032,8, | 2032,9, | 2032,10, | 2032,11, | 2032,12, | 2032,13, | 2032,14, | 2032,15, | 2032,16, | 2032,17, | 2032,18, | 2032,19, | 2032,20, | 2032,21, | 2032,22, | 2032,23, | 2032,24, | 2032,25, | 2032,26, | 2032,27, | 2032,28, | 2032,29, | 2032,30, | 2032,31, | 2032,32, | 2032,33, | 2032,34, | 2032,35, | 2032,36, | 2032,37, | 2032,38, | 2032,39, | 2032,40, | 2032,41, | 2032,42, | 2032,43, | 2032,44, | 2032,45, | 2032,46, | 2032,47, | 2032,48, | 2032,49, | 2032,50, | 2032,51, | 2032,52, | 2032,53, | 2032,54, | 2032,55, | 2032,56, | 2032,57, | 2032,58, | 2032,59, | 2032,60, | 2032,61, | 2032,62, | 2032,63, | 2032,64, | 2032,65, | 2032,66, | 2032,67, | 2032,68, | 2032,69, | 2032,70, | 2032,71, | 2032,72, | 2032,73, | 2032,74, | 2032,75, | 2032,76, | 2032,77, | 2032,78, | 2032,79, | 2032,80, | 2032,81, | 2032,82, | 2032,83, | 2032,84, | 2032,85, | 2033,1, | 2033,2, | 2033,3, | 2033,4, | 2033,5, | 2033,6, | 2033,7, | 2033,8, | 2033,9, | 2033,10, | 2033,11, | 2033,12, | 2033,13, | 2033,14, | 2033,15, | 2033,16, | 2033,17, | 2033,18, | 2033,19, | 2033,20, | 2033,21, | 2033,22, | 2033,23, | 2033,24, | 2033,25, | 2033,26, | 2033,27, | 2033,28, | 2033,29, | 2033,30, | 2033,31, | 2033,32, | 2033,33, | 2033,34, | 2033,35, | 2033,36, | 2033,37, | 2033,38, | 2033,39, | 2033,40, | 2033,41, | 2033,42, | 2033,43, | 2033,44, | 2033,45, | 2033,46, | 2033,47, | 2033,48, | 2033,49, | 2033,50, | 2033,51, | 2033,52, | 2033,53, | 2033,54, | 2033,55, | 2033,56, | 2033,57, | 2033,58, | 2033,59, | 2033,60, | 2033,61, | 2033,62, | 2033,63, | 2033,64, | 2033,65, | 2033,66, | 2033,67, | 2033,68, | 2033,69, | 2033,70, | 2033,71, | 2033,72, | 2033,73, | 2033,74, | 2033,75, | 2033,76, | 2033,77, | 2033,78, | 2033,79, | 2033,80, | 2033,81, | 2033,82, | 2033,83, | 2033,84, | 2033,85, | 2034,1, | 2034,2, | 2034,3, | 2034,4, | 2034,5, | 2034,6, | 2034,7, | 2034,8, | 2034,9, | 2034,10, | 2034,11, | 2034,12, | 2034,13, | 2034,14, | 2034,15, | 2034,16, | 2034,17, | 2034,18, | 2034,19, | 2034,20, | 2034,21, | 2034,22, | 2034,23, | 2034,24, | 2034,25, | 2034,26, | 2034,27, | 2034,28, | 2034,29, | 2034,30, | 2034,31, | 2034,32, | 2034,33, | 2034,34, | 2034,35, | 2034,36, | 2034,37, | 2034,38, | 2034,39, | 2034,40, | 2034,41, | 2034,42, | 2034,43, | 2034,44, | 2034,45, | 2034,46, | 2034,47, | 2034,48, | 2034,49, | 2034,50, | 2034,51, | 2034,52, | 2034,53, | 2034,54, | 2034,55, | 2034,56, | 2034,57, | 2034,58, | 2034,59, | 2034,60, | 2034,61, | 2034,62, | 2034,63, | 2034,64, | 2034,65, | 2034,66, | 2034,67, | 2034,68, | 2034,69, | 2034,70, | 2034,71, | 2034,72, | 2034,73, | 2034,74, | 2034,75, | 2034,76, | 2034,77, | 2034,78, | 2034,79, | 2034,80, | 2034,81, | 2034,82, | 2034,83, | 2034,84, | 2034,85, | 2035,1, | 2035,2, | 2035,3, | 2035,4, | 2035,5, | 2035,6, | 2035,7, | 2035,8, | 2035,9, | 2035,10, | 2035,11, | 2035,12, | 2035,13, | 2035,14, | 2035,15, | 2035,16, | 2035,17, | 2035,18, | 2035,19, | 2035,20, | 2035,21, | 2035,22, | 2035,23, | 2035,24, | 2035,25, | 2035,26, | 2035,27, | 2035,28, | 2035,29, | 2035,30, | 2035,31, | 2035,32, | 2035,33, | 2035,34, | 2035,35, | 2035,36, | 2035,37, | 2035,38, | 2035,39, | 2035,40, | 2035,41, | 2035,42, | 2035,43, | 2035,44, | 2035,45, | 2035,46, | 2035,47, | 2035,48, | 2035,49, | 2035,50, | 2035,51, | 2035,52, | 2035,53, | 2035,54, | 2035,55, | 2035,56, | 2035,57, | 2035,58, | 2035,59, | 2035,60, | 2035,61, | 2035,62, | 2035,63, | 2035,64, | 2035,65, | 2035,66, | 2035,67, | 2035,68, | 2035,69, | 2035,70, | 2035,71, | 2035,72, | 2035,73, | 2035,74, | 2035,75, | 2035,76, | 2035,77, | 2035,78, | 2035,79, | 2035,80, | 2035,81, | 2035,82, | 2035,83, | 2035,84, | 2035,85, | 2036,1, | 2036,2, | 2036,3, | 2036,4, | 2036,5, | 2036,6, | 2036,7, | 2036,8, | 2036,9, | 2036,10, | 2036,11, | 2036,12, | 2036,13, | 2036,14, | 2036,15, | 2036,16, | 2036,17, | 2036,18, | 2036,19, | 2036,20, | 2036,21, | 2036,22, | 2036,23, | 2036,24, | 2036,25, | 2036,26, | 2036,27, | 2036,28, | 2036,29, | 2036,30, | 2036,31, | 2036,32, | 2036,33, | 2036,34, | 2036,35, | 2036,36, | 2036,37, | 2036,38, | 2036,39, | 2036,40, | 2036,41, | 2036,42, | 2036,43, | 2036,44, | 2036,45, | 2036,46, | 2036,47, | 2036,48, | 2036,49, | 2036,50, | 2036,51, | 2036,52, | 2036,53, | 2036,54, | 2036,55, | 2036,56, | 2036,57, | 2036,58, | 2036,59, | 2036,60, | 2036,61, | 2036,62, | 2036,63, | 2036,64, | 2036,65, | 2036,66, | 2036,67, | 2036,68, | 2036,69, | 2036,70, | 2036,71, | 2036,72, | 2036,73, | 2036,74, | 2036,75, | 2036,76, | 2036,77, | 2036,78, | 2036,79, | 2036,80, | 2036,81, | 2036,82, | 2036,83, | 2036,84, | 2036,85, | 2037,1, | 2037,2, | 2037,3, | 2037,4, | 2037,5, | 2037,6, | 2037,7, | 2037,8, | 2037,9, | 2037,10, | 2037,11, | 2037,12, | 2037,13, | 2037,14, | 2037,15, | 2037,16, | 2037,17, | 2037,18, | 2037,19, | 2037,20, | 2037,21, | 2037,22, | 2037,23, | 2037,24, | 2037,25, | 2037,26, | 2037,27, | 2037,28, | 2037,29, | 2037,30, | 2037,31, | 2037,32, | 2037,33, | 2037,34, | 2037,35, | 2037,36, | 2037,37, | 2037,38, | 2037,39, | 2037,40, | 2037,41, | 2037,42, | 2037,43, | 2037,44, | 2037,45, | 2037,46, | 2037,47, | 2037,48, | 2037,49, | 2037,50, | 2037,51, | 2037,52, | 2037,53, | 2037,54, | 2037,55, | 2037,56, | 2037,57, | 2037,58, | 2037,59, | 2037,60, | 2037,61, | 2037,62, | 2037,63, | 2037,64, | 2037,65, | 2037,66, | 2037,67, | 2037,68, | 2037,69, | 2037,70, | 2037,71, | 2037,72, | 2037,73, | 2037,74, | 2037,75, | 2037,76, | 2037,77, | 2037,78, | 2037,79, | 2037,80, | 2037,81, | 2037,82, | 2037,83, | 2037,84, | 2037,85, | 2038,1, | 2038,2, | 2038,3, | 2038,4, | 2038,5, | 2038,6, | 2038,7, | 2038,8, | 2038,9, | 2038,10, | 2038,11, | 2038,12, | 2038,13, | 2038,14, | 2038,15, | 2038,16, | 2038,17, | 2038,18, | 2038,19, | 2038,20, | 2038,21, | 2038,22, | 2038,23, | 2038,24, | 2038,25, | 2038,26, | 2038,27, | 2038,28, | 2038,29, | 2038,30, | 2038,31, | 2038,32, | 2038,33, | 2038,34, | 2038,35, | 2038,36, | 2038,37, | 2038,38, | 2038,39, | 2038,40, | 2038,41, | 2038,42, | 2038,43, | 2038,44, | 2038,45, | 2038,46, | 2038,47, | 2038,48, | 2038,49, | 2038,50, | 2038,51, | 2038,52, | 2038,53, | 2038,54, | 2038,55, | 2038,56, | 2038,57, | 2038,58, | 2038,59, | 2038,60, | 2038,61, | 2038,62, | 2038,63, | 2038,64, | 2038,65, | 2038,66, | 2038,67, | 2038,68, | 2038,69, | 2038,70, | 2038,71, | 2038,72, | 2038,73, | 2038,74, | 2038,75, | 2038,76, | 2038,77, | 2038,78, | 2038,79, | 2038,80, | 2038,81, | 2038,82, | 2038,83, | 2038,84, | 2038,85, | 2039,1, | 2039,2, | 2039,3, | 2039,4, | 2039,5, | 2039,6, | 2039,7, | 2039,8, | 2039,9, | 2039,10, | 2039,11, | 2039,12, | 2039,13, | 2039,14, | 2039,15, | 2039,16, | 2039,17, | 2039,18, | 2039,19, | 2039,20, | 2039,21, | 2039,22, | 2039,23, | 2039,24, | 2039,25, | 2039,26, | 2039,27, | 2039,28, | 2039,29, | 2039,30, | 2039,31, | 2039,32, | 2039,33, | 2039,34, | 2039,35, | 2039,36, | 2039,37, | 2039,38, | 2039,39, | 2039,40, | 2039,41, | 2039,42, | 2039,43, | 2039,44, | 2039,45, | 2039,46, | 2039,47, | 2039,48, | 2039,49, | 2039,50, | 2039,51, | 2039,52, | 2039,53, | 2039,54, | 2039,55, | 2039,56, | 2039,57, | 2039,58, | 2039,59, | 2039,60, | 2039,61, | 2039,62, | 2039,63, | 2039,64, | 2039,65, | 2039,66, | 2039,67, | 2039,68, | 2039,69, | 2039,70, | 2039,71, | 2039,72, | 2039,73, | 2039,74, | 2039,75, | 2039,76, | 2039,77, | 2039,78, | 2039,79, | 2039,80, | 2039,81, | 2039,82, | 2039,83, | 2039,84, | 2039,85, | 2040,1, | 2040,2, | 2040,3, | 2040,4, | 2040,5, | 2040,6, | 2040,7, | 2040,8, | 2040,9, | 2040,10, | 2040,11, | 2040,12, | 2040,13, | 2040,14, | 2040,15, | 2040,16, | 2040,17, | 2040,18, | 2040,19, | 2040,20, | 2040,21, | 2040,22, | 2040,23, | 2040,24, | 2040,25, | 2040,26, | 2040,27, | 2040,28, | 2040,29, | 2040,30, | 2040,31, | 2040,32, | 2040,33, | 2040,34, | 2040,35, | 2040,36, | 2040,37, | 2040,38, | 2040,39, | 2040,40, | 2040,41, | 2040,42, | 2040,43, | 2040,44, | 2040,45, | 2040,46, | 2040,47, | 2040,48, | 2040,49, | 2040,50, | 2040,51, | 2040,52, | 2040,53, | 2040,54, | 2040,55, | 2040,56, | 2040,57, | 2040,58, | 2040,59, | 2040,60, | 2040,61, | 2040,62, | 2040,63, | 2040,64, | 2040,65, | 2040,66, | 2040,67, | 2040,68, | 2040,69, | 2040,70, | 2040,71, | 2040,72, | 2040,73, | 2040,74, | 2040,75, | 2040,76, | 2040,77, | 2040,78, | 2040,79, | 2040,80, | 2040,81, | 2040,82, | 2040,83, | 2040,84, | 2040,85, | 2041,1, | 2041,2, | 2041,3, | 2041,4, | 2041,5, | 2041,6, | 2041,7, | 2041,8, | 2041,9, | 2041,10, | 2041,11, | 2041,12, | 2041,13, | 2041,14, | 2041,15, | 2041,16, | 2041,17, | 2041,18, | 2041,19, | 2041,20, | 2041,21, | 2041,22, | 2041,23, | 2041,24, | 2041,25, | 2041,26, | 2041,27, | 2041,28, | 2041,29, | 2041,30, | 2041,31, | 2041,32, | 2041,33, | 2041,34, | 2041,35, | 2041,36, | 2041,37, | 2041,38, | 2041,39, | 2041,40, | 2041,41, | 2041,42, | 2041,43, | 2041,44, | 2041,45, | 2041,46, | 2041,47, | 2041,48, | 2041,49, | 2041,50, | 2041,51, | 2041,52, | 2041,53, | 2041,54, | 2041,55, | 2041,56, | 2041,57, | 2041,58, | 2041,59, | 2041,60, | 2041,61, | 2041,62, | 2041,63, | 2041,64, | 2041,65, | 2041,66, | 2041,67, | 2041,68, | 2041,69, | 2041,70, | 2041,71, | 2041,72, | 2041,73, | 2041,74, | 2041,75, | 2041,76, | 2041,77, | 2041,78, | 2041,79, | 2041,80, | 2041,81, | 2041,82, | 2041,83, | 2041,84, | 2041,85, | 2042,1, | 2042,2, | 2042,3, | 2042,4, | 2042,5, | 2042,6, | 2042,7, | 2042,8, | 2042,9, | 2042,10, | 2042,11, | 2042,12, | 2042,13, | 2042,14, | 2042,15, | 2042,16, | 2042,17, | 2042,18, | 2042,19, | 2042,20, | 2042,21, | 2042,22, | 2042,23, | 2042,24, | 2042,25, | 2042,26, | 2042,27, | 2042,28, | 2042,29, | 2042,30, | 2042,31, | 2042,32, | 2042,33, | 2042,34, | 2042,35, | 2042,36, | 2042,37, | 2042,38, | 2042,39, | 2042,40, | 2042,41, | 2042,42, | 2042,43, | 2042,44, | 2042,45, | 2042,46, | 2042,47, | 2042,48, | 2042,49, | 2042,50, | 2042,51, | 2042,52, | 2042,53, | 2042,54, | 2042,55, | 2042,56, | 2042,57, | 2042,58, | 2042,59, | 2042,60, | 2042,61, | 2042,62, | 2042,63, | 2042,64, | 2042,65, | 2042,66, | 2042,67, | 2042,68, | 2042,69, | 2042,70, | 2042,71, | 2042,72, | 2042,73, | 2042,74, | 2042,75, | 2042,76, | 2042,77, | 2042,78, | 2042,79, | 2042,80, | 2042,81, | 2042,82, | 2042,83, | 2042,84, | 2042,85, | 2043,1, | 2043,2, | 2043,3, | 2043,4, | 2043,5, | 2043,6, | 2043,7, | 2043,8, | 2043,9, | 2043,10, | 2043,11, | 2043,12, | 2043,13, | 2043,14, | 2043,15, | 2043,16, | 2043,17, | 2043,18, | 2043,19, | 2043,20, | 2043,21, | 2043,22, | 2043,23, | 2043,24, | 2043,25, | 2043,26, | 2043,27, | 2043,28, | 2043,29, | 2043,30, | 2043,31, | 2043,32, | 2043,33, | 2043,34, | 2043,35, | 2043,36, | 2043,37, | 2043,38, | 2043,39, | 2043,40, | 2043,41, | 2043,42, | 2043,43, | 2043,44, | 2043,45, | 2043,46, | 2043,47, | 2043,48, | 2043,49, | 2043,50, | 2043,51, | 2043,52, | 2043,53, | 2043,54, | 2043,55, | 2043,56, | 2043,57, | 2043,58, | 2043,59, | 2043,60, | 2043,61, | 2043,62, | 2043,63, | 2043,64, | 2043,65, | 2043,66, | 2043,67, | 2043,68, | 2043,69, | 2043,70, | 2043,71, | 2043,72, | 2043,73, | 2043,74, | 2043,75, | 2043,76, | 2043,77, | 2043,78, | 2043,79, | 2043,80, | 2043,81, | 2043,82, | 2043,83, | 2043,84, | 2043,85, | 2044,1, | 2044,2, | 2044,3, | 2044,4, | 2044,5, | 2044,6, | 2044,7, | 2044,8, | 2044,9, | 2044,10, | 2044,11, | 2044,12, | 2044,13, | 2044,14, | 2044,15, | 2044,16, | 2044,17, | 2044,18, | 2044,19, | 2044,20, | 2044,21, | 2044,22, | 2044,23, | 2044,24, | 2044,25, | 2044,26, | 2044,27, | 2044,28, | 2044,29, | 2044,30, | 2044,31, | 2044,32, | 2044,33, | 2044,34, | 2044,35, | 2044,36, | 2044,37, | 2044,38, | 2044,39, | 2044,40, | 2044,41, | 2044,42, | 2044,43, | 2044,44, | 2044,45, | 2044,46, | 2044,47, | 2044,48, | 2044,49, | 2044,50, | 2044,51, | 2044,52, | 2044,53, | 2044,54, | 2044,55, | 2044,56, | 2044,57, | 2044,58, | 2044,59, | 2044,60, | 2044,61, | 2044,62, | 2044,63, | 2044,64, | 2044,65, | 2044,66, | 2044,67, | 2044,68, | 2044,69, | 2044,70, | 2044,71, | 2044,72, | 2044,73, | 2044,74, | 2044,75, | 2044,76, | 2044,77, | 2044,78, | 2044,79, | 2044,80, | 2044,81, | 2044,82, | 2044,83, | 2044,84, | 2044,85, | 2045,1, | 2045,2, | 2045,3, | 2045,4, | 2045,5, | 2045,6, | 2045,7, | 2045,8, | 2045,9, | 2045,10, | 2045,11, | 2045,12, | 2045,13, | 2045,14, | 2045,15, | 2045,16, | 2045,17, | 2045,18, | 2045,19, | 2045,20, | 2045,21, | 2045,22, | 2045,23, | 2045,24, | 2045,25, | 2045,26, | 2045,27, | 2045,28, | 2045,29, | 2045,30, | 2045,31, | 2045,32, | 2045,33, | 2045,34, | 2045,35, | 2045,36, | 2045,37, | 2045,38, | 2045,39, | 2045,40, | 2045,41, | 2045,42, | 2045,43, | 2045,44, | 2045,45, | 2045,46, | 2045,47, | 2045,48, | 2045,49, | 2045,50, | 2045,51, | 2045,52, | 2045,53, | 2045,54, | 2045,55, | 2045,56, | 2045,57, | 2045,58, | 2045,59, | 2045,60, | 2045,61, | 2045,62, | 2045,63, | 2045,64, | 2045,65, | 2045,66, | 2045,67, | 2045,68, | 2045,69, | 2045,70, | 2045,71, | 2045,72, | 2045,73, | 2045,74, | 2045,75, | 2045,76, | 2045,77, | 2045,78, | 2045,79, | 2045,80, | 2045,81, | 2045,82, | 2045,83, | 2045,84, | 2045,85, | 2046,1, | 2046,2, | 2046,3, | 2046,4, | 2046,5, | 2046,6, | 2046,7, | 2046,8, | 2046,9, | 2046,10, | 2046,11, | 2046,12, | 2046,13, | 2046,14, | 2046,15, | 2046,16, | 2046,17, | 2046,18, | 2046,19, | 2046,20, | 2046,21, | 2046,22, | 2046,23, | 2046,24, | 2046,25, | 2046,26, | 2046,27, | 2046,28, | 2046,29, | 2046,30, | 2046,31, | 2046,32, | 2046,33, | 2046,34, | 2046,35, | 2046,36, | 2046,37, | 2046,38, | 2046,39, | 2046,40, | 2046,41, | 2046,42, | 2046,43, | 2046,44, | 2046,45, | 2046,46, | 2046,47, | 2046,48, | 2046,49, | 2046,50, | 2046,51, | 2046,52, | 2046,53, | 2046,54, | 2046,55, | 2046,56, | 2046,57, | 2046,58, | 2046,59, | 2046,60, | 2046,61, | 2046,62, | 2046,63, | 2046,64, | 2046,65, | 2046,66, | 2046,67, | 2046,68, | 2046,69, | 2046,70, | 2046,71, | 2046,72, | 2046,73, | 2046,74, | 2046,75, | 2046,76, | 2046,77, | 2046,78, | 2046,79, | 2046,80, | 2046,81, | 2046,82, | 2046,83, | 2046,84, | 2046,85, | 2047,1, | 2047,2, | 2047,3, | 2047,4, | 2047,5, | 2047,6, | 2047,7, | 2047,8, | 2047,9, | 2047,10, | 2047,11, | 2047,12, | 2047,13, | 2047,14, | 2047,15, | 2047,16, | 2047,17, | 2047,18, | 2047,19, | 2047,20, | 2047,21, | 2047,22, | 2047,23, | 2047,24, | 2047,25, | 2047,26, | 2047,27, | 2047,28, | 2047,29, | 2047,30, | 2047,31, | 2047,32, | 2047,33, | 2047,34, | 2047,35, | 2047,36, | 2047,37, | 2047,38, | 2047,39, | 2047,40, | 2047,41, | 2047,42, | 2047,43, | 2047,44, | 2047,45, | 2047,46, | 2047,47, | 2047,48, | 2047,49, | 2047,50, | 2047,51, | 2047,52, | 2047,53, | 2047,54, | 2047,55, | 2047,56, | 2047,57, | 2047,58, | 2047,59, | 2047,60, | 2047,61, | 2047,62, | 2047,63, | 2047,64, | 2047,65, | 2047,66, | 2047,67, | 2047,68, | 2047,69, | 2047,70, | 2047,71, | 2047,72, | 2047,73, | 2047,74, | 2047,75, | 2047,76, | 2047,77, | 2047,78, | 2047,79, | 2047,80, | 2047,81, | 2047,82, | 2047,83, | 2047,84, | 2047,85, | 2048,1, | 2048,2, | 2048,3, | 2048,4, | 2048,5, | 2048,6, | 2048,7, | 2048,8, | 2048,9, | 2048,10, | 2048,11, | 2048,12, | 2048,13, | 2048,14, | 2048,15, | 2048,16, | 2048,17, | 2048,18, | 2048,19, | 2048,20, | 2048,21, | 2048,22, | 2048,23, | 2048,24, | 2048,25, | 2048,26, | 2048,27, | 2048,28, | 2048,29, | 2048,30, | 2048,31, | 2048,32, | 2048,33, | 2048,34, | 2048,35, | 2048,36, | 2048,37, | 2048,38, | 2048,39, | 2048,40, | 2048,41, | 2048,42, | 2048,43, | 2048,44, | 2048,45, | 2048,46, | 2048,47, | 2048,48, | 2048,49, | 2048,50, | 2048,51, | 2048,52, | 2048,53, | 2048,54, | 2048,55, | 2048,56, | 2048,57, | 2048,58, | 2048,59, | 2048,60, | 2048,61, | 2048,62, | 2048,63, | 2048,64, | 2048,65, | 2048,66, | 2048,67, | 2048,68, | 2048,69, | 2048,70, | 2048,71, | 2048,72, | 2048,73, | 2048,74, | 2048,75, | 2048,76, | 2048,77, | 2048,78, | 2048,79, | 2048,80, | 2048,81, | 2048,82, | 2048,83, | 2048,84, | 2048,85, | 2049,1, | 2049,2, | 2049,3, | 2049,4, | 2049,5, | 2049,6, | 2049,7, | 2049,8, | 2049,9, | 2049,10, | 2049,11, | 2049,12, | 2049,13, | 2049,14, | 2049,15, | 2049,16, | 2049,17, | 2049,18, | 2049,19, | 2049,20, | 2049,21, | 2049,22, | 2049,23, | 2049,24, | 2049,25, | 2049,26, | 2049,27, | 2049,28, | 2049,29, | 2049,30, | 2049,31, | 2049,32, | 2049,33, | 2049,34, | 2049,35, | 2049,36, | 2049,37, | 2049,38, | 2049,39, | 2049,40, | 2049,41, | 2049,42, | 2049,43, | 2049,44, | 2049,45, | 2049,46, | 2049,47, | 2049,48, | 2049,49, | 2049,50, | 2049,51, | 2049,52, | 2049,53, | 2049,54, | 2049,55, | 2049,56, | 2049,57, | 2049,58, | 2049,59, | 2049,60, | 2049,61, | 2049,62, | 2049,63, | 2049,64, | 2049,65, | 2049,66, | 2049,67, | 2049,68, | 2049,69, | 2049,70, | 2049,71, | 2049,72, | 2049,73, | 2049,74, | 2049,75, | 2049,76, | 2049,77, | 2049,78, | 2049,79, | 2049,80, | 2049,81, | 2049,82, | 2049,83, | 2049,84, | 2049,85, | 2050,1, | 2050,2, | 2050,3, | 2050,4, | 2050,5, | 2050,6, | 2050,7, | 2050,8, | 2050,9, | 2050,10, | 2050,11, | 2050,12, | 2050,13, | 2050,14, | 2050,15, | 2050,16, | 2050,17, | 2050,18, | 2050,19, | 2050,20, | 2050,21, | 2050,22, | 2050,23, | 2050,24, | 2050,25, | 2050,26, | 2050,27, | 2050,28, | 2050,29, | 2050,30, | 2050,31, | 2050,32, | 2050,33, | 2050,34, | 2050,35, | 2050,36, | 2050,37, | 2050,38, | 2050,39, | 2050,40, | 2050,41, | 2050,42, | 2050,43, | 2050,44, | 2050,45, | 2050,46, | 2050,47, | 2050,48, | 2050,49, | 2050,50, | 2050,51, | 2050,52, | 2050,53, | 2050,54, | 2050,55, | 2050,56, | 2050,57, | 2050,58, | 2050,59, | 2050,60, | 2050,61, | 2050,62, | 2050,63, | 2050,64, | 2050,65, | 2050,66, | 2050,67, | 2050,68, | 2050,69, | 2050,70, | 2050,71, | 2050,72, | 2050,73, | 2050,74, | 2050,75, | 2050,76, | 2050,77, | 2050,78, | 2050,79, | 2050,80, | 2050,81, | 2050,82, | 2050,83, | 2050,84, | 2050,85, | 2051,1, | 2051,2, | 2051,3, | 2051,4, | 2051,5, | 2051,6, | 2051,7, | 2051,8, | 2051,9, | 2051,10, | 2051,11, | 2051,12, | 2051,13, | 2051,14, | 2051,15, | 2051,16, | 2051,17, | 2051,18, | 2051,19, | 2051,20, | 2051,21, | 2051,22, | 2051,23, | 2051,24, | 2051,25, | 2051,26, | 2051,27, | 2051,28, | 2051,29, | 2051,30, | 2051,31, | 2051,32, | 2051,33, | 2051,34, | 2051,35, | 2051,36, | 2051,37, | 2051,38, | 2051,39, | 2051,40, | 2051,41, | 2051,42, | 2051,43, | 2051,44, | 2051,45, | 2051,46, | 2051,47, | 2051,48, | 2051,49, | 2051,50, | 2051,51, | 2051,52, | 2051,53, | 2051,54, | 2051,55, | 2051,56, | 2051,57, | 2051,58, | 2051,59, | 2051,60, | 2051,61, | 2051,62, | 2051,63, | 2051,64, | 2051,65, | 2051,66, | 2051,67, | 2051,68, | 2051,69, | 2051,70, | 2051,71, | 2051,72, | 2051,73, | 2051,74, | 2051,75, | 2051,76, | 2051,77, | 2051,78, | 2051,79, | 2051,80, | 2051,81, | 2051,82, | 2051,83, | 2051,84, | 2051,85, | 2052,1, | 2052,2, | 2052,3, | 2052,4, | 2052,5, | 2052,6, | 2052,7, | 2052,8, | 2052,9, | 2052,10, | 2052,11, | 2052,12, | 2052,13, | 2052,14, | 2052,15, | 2052,16, | 2052,17, | 2052,18, | 2052,19, | 2052,20, | 2052,21, | 2052,22, | 2052,23, | 2052,24, | 2052,25, | 2052,26, | 2052,27, | 2052,28, | 2052,29, | 2052,30, | 2052,31, | 2052,32, | 2052,33, | 2052,34, | 2052,35, | 2052,36, | 2052,37, | 2052,38, | 2052,39, | 2052,40, | 2052,41, | 2052,42, | 2052,43, | 2052,44, | 2052,45, | 2052,46, | 2052,47, | 2052,48, | 2052,49, | 2052,50, | 2052,51, | 2052,52, | 2052,53, | 2052,54, | 2052,55, | 2052,56, | 2052,57, | 2052,58, | 2052,59, | 2052,60, | 2052,61, | 2052,62, | 2052,63, | 2052,64, | 2052,65, | 2052,66, | 2052,67, | 2052,68, | 2052,69, | 2052,70, | 2052,71, | 2052,72, | 2052,73, | 2052,74, | 2052,75, | 2052,76, | 2052,77, | 2052,78, | 2052,79, | 2052,80, | 2052,81, | 2052,82, | 2052,83, | 2052,84, | 2052,85, | 2053,1, | 2053,2, | 2053,3, | 2053,4, | 2053,5, | 2053,6, | 2053,7, | 2053,8, | 2053,9, | 2053,10, | 2053,11, | 2053,12, | 2053,13, | 2053,14, | 2053,15, | 2053,16, | 2053,17, | 2053,18, | 2053,19, | 2053,20, | 2053,21, | 2053,22, | 2053,23, | 2053,24, | 2053,25, | 2053,26, | 2053,27, | 2053,28, | 2053,29, | 2053,30, | 2053,31, | 2053,32, | 2053,33, | 2053,34, | 2053,35, | 2053,36, | 2053,37, | 2053,38, | 2053,39, | 2053,40, | 2053,41, | 2053,42, | 2053,43, | 2053,44, | 2053,45, | 2053,46, | 2053,47, | 2053,48, | 2053,49, | 2053,50, | 2053,51, | 2053,52, | 2053,53, | 2053,54, | 2053,55, | 2053,56, | 2053,57, | 2053,58, | 2053,59, | 2053,60, | 2053,61, | 2053,62, | 2053,63, | 2053,64, | 2053,65, | 2053,66, | 2053,67, | 2053,68, | 2053,69, | 2053,70, | 2053,71, | 2053,72, | 2053,73, | 2053,74, | 2053,75, | 2053,76, | 2053,77, | 2053,78, | 2053,79, | 2053,80, | 2053,81, | 2053,82, | 2053,83, | 2053,84, | 2053,85, | 2054,1, | 2054,2, | 2054,3, | 2054,4, | 2054,5, | 2054,6, | 2054,7, | 2054,8, | 2054,9, | 2054,10, | 2054,11, | 2054,12, | 2054,13, | 2054,14, | 2054,15, | 2054,16, | 2054,17, | 2054,18, | 2054,19, | 2054,20, | 2054,21, | 2054,22, | 2054,23, | 2054,24, | 2054,25, | 2054,26, | 2054,27, | 2054,28, | 2054,29, | 2054,30, | 2054,31, | 2054,32, | 2054,33, | 2054,34, | 2054,35, | 2054,36, | 2054,37, | 2054,38, | 2054,39, | 2054,40, | 2054,41, | 2054,42, | 2054,43, | 2054,44, | 2054,45, | 2054,46, | 2054,47, | 2054,48, | 2054,49, | 2054,50, | 2054,51, | 2054,52, | 2054,53, | 2054,54, | 2054,55, | 2054,56, | 2054,57, | 2054,58, | 2054,59, | 2054,60, | 2054,61, | 2054,62, | 2054,63, | 2054,64, | 2054,65, | 2054,66, | 2054,67, | 2054,68, | 2054,69, | 2054,70, | 2054,71, | 2054,72, | 2054,73, | 2054,74, | 2054,75, | 2054,76, | 2054,77, | 2054,78, | 2054,79, | 2054,80, | 2054,81, | 2054,82, | 2054,83, | 2054,84, | 2054,85, | 2055,1, | 2055,2, | 2055,3, | 2055,4, | 2055,5, | 2055,6, | 2055,7, | 2055,8, | 2055,9, | 2055,10, | 2055,11, | 2055,12, | 2055,13, | 2055,14, | 2055,15, | 2055,16, | 2055,17, | 2055,18, | 2055,19, | 2055,20, | 2055,21, | 2055,22, | 2055,23, | 2055,24, | 2055,25, | 2055,26, | 2055,27, | 2055,28, | 2055,29, | 2055,30, | 2055,31, | 2055,32, | 2055,33, | 2055,34, | 2055,35, | 2055,36, | 2055,37, | 2055,38, | 2055,39, | 2055,40, | 2055,41, | 2055,42, | 2055,43, | 2055,44, | 2055,45, | 2055,46, | 2055,47, | 2055,48, | 2055,49, | 2055,50, | 2055,51, | 2055,52, | 2055,53, | 2055,54, | 2055,55, | 2055,56, | 2055,57, | 2055,58, | 2055,59, | 2055,60, | 2055,61, | 2055,62, | 2055,63, | 2055,64, | 2055,65, | 2055,66, | 2055,67, | 2055,68, | 2055,69, | 2055,70, | 2055,71, | 2055,72, | 2055,73, | 2055,74, | 2055,75, | 2055,76, | 2055,77, | 2055,78, | 2055,79, | 2055,80, | 2055,81, | 2055,82, | 2055,83, | 2055,84, | 2055,85, | 2056,1, | 2056,2, | 2056,3, | 2056,4, | 2056,5, | 2056,6, | 2056,7, | 2056,8, | 2056,9, | 2056,10, | 2056,11, | 2056,12, | 2056,13, | 2056,14, | 2056,15, | 2056,16, | 2056,17, | 2056,18, | 2056,19, | 2056,20, | 2056,21, | 2056,22, | 2056,23, | 2056,24, | 2056,25, | 2056,26, | 2056,27, | 2056,28, | 2056,29, | 2056,30, | 2056,31, | 2056,32, | 2056,33, | 2056,34, | 2056,35, | 2056,36, | 2056,37, | 2056,38, | 2056,39, | 2056,40, | 2056,41, | 2056,42, | 2056,43, | 2056,44, | 2056,45, | 2056,46, | 2056,47, | 2056,48, | 2056,49, | 2056,50, | 2056,51, | 2056,52, | 2056,53, | 2056,54, | 2056,55, | 2056,56, | 2056,57, | 2056,58, | 2056,59, | 2056,60, | 2056,61, | 2056,62, | 2056,63, | 2056,64, | 2056,65, | 2056,66, | 2056,67, | 2056,68, | 2056,69, | 2056,70, | 2056,71, | 2056,72, | 2056,73, | 2056,74, | 2056,75, | 2056,76, | 2056,77, | 2056,78, | 2056,79, | 2056,80, | 2056,81, | 2056,82, | 2056,83, | 2056,84, | 2056,85, | 2057,1, | 2057,2, | 2057,3, | 2057,4, | 2057,5, | 2057,6, | 2057,7, | 2057,8, | 2057,9, | 2057,10, | 2057,11, | 2057,12, | 2057,13, | 2057,14, | 2057,15, | 2057,16, | 2057,17, | 2057,18, | 2057,19, | 2057,20, | 2057,21, | 2057,22, | 2057,23, | 2057,24, | 2057,25, | 2057,26, | 2057,27, | 2057,28, | 2057,29, | 2057,30, | 2057,31, | 2057,32, | 2057,33, | 2057,34, | 2057,35, | 2057,36, | 2057,37, | 2057,38, | 2057,39, | 2057,40, | 2057,41, | 2057,42, | 2057,43, | 2057,44, | 2057,45, | 2057,46, | 2057,47, | 2057,48, | 2057,49, | 2057,50, | 2057,51, | 2057,52, | 2057,53, | 2057,54, | 2057,55, | 2057,56, | 2057,57, | 2057,58, | 2057,59, | 2057,60, | 2057,61, | 2057,62, | 2057,63, | 2057,64, | 2057,65, | 2057,66, | 2057,67, | 2057,68, | 2057,69, | 2057,70, | 2057,71, | 2057,72, | 2057,73, | 2057,74, | 2057,75, | 2057,76, | 2057,77, | 2057,78, | 2057,79, | 2057,80, | 2057,81, | 2057,82, | 2057,83, | 2057,84, | 2057,85, | 2058,1, | 2058,2, | 2058,3, | 2058,4, | 2058,5, | 2058,6, | 2058,7, | 2058,8, | 2058,9, | 2058,10, | 2058,11, | 2058,12, | 2058,13, | 2058,14, | 2058,15, | 2058,16, | 2058,17, | 2058,18, | 2058,19, | 2058,20, | 2058,21, | 2058,22, | 2058,23, | 2058,24, | 2058,25, | 2058,26, | 2058,27, | 2058,28, | 2058,29, | 2058,30, | 2058,31, | 2058,32, | 2058,33, | 2058,34, | 2058,35, | 2058,36, | 2058,37, | 2058,38, | 2058,39, | 2058,40, | 2058,41, | 2058,42, | 2058,43, | 2058,44, | 2058,45, | 2058,46, | 2058,47, | 2058,48, | 2058,49, | 2058,50, | 2058,51, | 2058,52, | 2058,53, | 2058,54, | 2058,55, | 2058,56, | 2058,57, | 2058,58, | 2058,59, | 2058,60, | 2058,61, | 2058,62, | 2058,63, | 2058,64, | 2058,65, | 2058,66, | 2058,67, | 2058,68, | 2058,69, | 2058,70, | 2058,71, | 2058,72, | 2058,73, | 2058,74, | 2058,75, | 2058,76, | 2058,77, | 2058,78, | 2058,79, | 2058,80, | 2058,81, | 2058,82, | 2058,83, | 2058,84, | 2058,85, | 2059,1, | 2059,2, | 2059,3, | 2059,4, | 2059,5, | 2059,6, | 2059,7, | 2059,8, | 2059,9, | 2059,10, | 2059,11, | 2059,12, | 2059,13, | 2059,14, | 2059,15, | 2059,16, | 2059,17, | 2059,18, | 2059,19, | 2059,20, | 2059,21, | 2059,22, | 2059,23, | 2059,24, | 2059,25, | 2059,26, | 2059,27, | 2059,28, | 2059,29, | 2059,30, | 2059,31, | 2059,32, | 2059,33, | 2059,34, | 2059,35, | 2059,36, | 2059,37, | 2059,38, | 2059,39, | 2059,40, | 2059,41, | 2059,42, | 2059,43, | 2059,44, | 2059,45, | 2059,46, | 2059,47, | 2059,48, | 2059,49, | 2059,50, | 2059,51, | 2059,52, | 2059,53, | 2059,54, | 2059,55, | 2059,56, | 2059,57, | 2059,58, | 2059,59, | 2059,60, | 2059,61, | 2059,62, | 2059,63, | 2059,64, | 2059,65, | 2059,66, | 2059,67, | 2059,68, | 2059,69, | 2059,70, | 2059,71, | 2059,72, | 2059,73, | 2059,74, | 2059,75, | 2059,76, | 2059,77, | 2059,78, | 2059,79, | 2059,80, | 2059,81, | 2059,82, | 2059,83, | 2059,84, | 2059,85, | 2060,1, | 2060,2, | 2060,3, | 2060,4, | 2060,5, | 2060,6, | 2060,7, | 2060,8, | 2060,9, | 2060,10, | 2060,11, | 2060,12, | 2060,13, | 2060,14, | 2060,15, | 2060,16, | 2060,17, | 2060,18, | 2060,19, | 2060,20, | 2060,21, | 2060,22, | 2060,23, | 2060,24, | 2060,25, | 2060,26, | 2060,27, | 2060,28, | 2060,29, | 2060,30, | 2060,31, | 2060,32, | 2060,33, | 2060,34, | 2060,35, | 2060,36, | 2060,37, | 2060,38, | 2060,39, | 2060,40, | 2060,41, | 2060,42, | 2060,43, | 2060,44, | 2060,45, | 2060,46, | 2060,47, | 2060,48, | 2060,49, | 2060,50, | 2060,51, | 2060,52, | 2060,53, | 2060,54, | 2060,55, | 2060,56, | 2060,57, | 2060,58, | 2060,59, | 2060,60, | 2060,61, | 2060,62, | 2060,63, | 2060,64, | 2060,65, | 2060,66, | 2060,67, | 2060,68, | 2060,69, | 2060,70, | 2060,71, | 2060,72, | 2060,73, | 2060,74, | 2060,75, | 2060,76, | 2060,77, | 2060,78, | 2060,79, | 2060,80, | 2060,81, | 2060,82, | 2060,83, | 2060,84, | 2060,85, | 2061,1, | 2061,2, | 2061,3, | 2061,4, | 2061,5, | 2061,6, | 2061,7, | 2061,8, | 2061,9, | 2061,10, | 2061,11, | 2061,12, | 2061,13, | 2061,14, | 2061,15, | 2061,16, | 2061,17, | 2061,18, | 2061,19, | 2061,20, | 2061,21, | 2061,22, | 2061,23, | 2061,24, | 2061,25, | 2061,26, | 2061,27, | 2061,28, | 2061,29, | 2061,30, | 2061,31, | 2061,32, | 2061,33, | 2061,34, | 2061,35, | 2061,36, | 2061,37, | 2061,38, | 2061,39, | 2061,40, | 2061,41, | 2061,42, | 2061,43, | 2061,44, | 2061,45, | 2061,46, | 2061,47, | 2061,48, | 2061,49, | 2061,50, | 2061,51, | 2061,52, | 2061,53, | 2061,54, | 2061,55, | 2061,56, | 2061,57, | 2061,58, | 2061,59, | 2061,60, | 2061,61, | 2061,62, | 2061,63, | 2061,64, | 2061,65, | 2061,66, | 2061,67, | 2061,68, | 2061,69, | 2061,70, | 2061,71, | 2061,72, | 2061,73, | 2061,74, | 2061,75, | 2061,76, | 2061,77, | 2061,78, | 2061,79, | 2061,80, | 2061,81, | 2061,82, | 2061,83, | 2061,84, | 2061,85, | 2062,1, | 2062,2, | 2062,3, | 2062,4, | 2062,5, | 2062,6, | 2062,7, | 2062,8, | 2062,9, | 2062,10, | 2062,11, | 2062,12, | 2062,13, | 2062,14, | 2062,15, | 2062,16, | 2062,17, | 2062,18, | 2062,19, | 2062,20, | 2062,21, | 2062,22, | 2062,23, | 2062,24, | 2062,25, | 2062,26, | 2062,27, | 2062,28, | 2062,29, | 2062,30, | 2062,31, | 2062,32, | 2062,33, | 2062,34, | 2062,35, | 2062,36, | 2062,37, | 2062,38, | 2062,39, | 2062,40, | 2062,41, | 2062,42, | 2062,43, | 2062,44, | 2062,45, | 2062,46, | 2062,47, | 2062,48, | 2062,49, | 2062,50, | 2062,51, | 2062,52, | 2062,53, | 2062,54, | 2062,55, | 2062,56, | 2062,57, | 2062,58, | 2062,59, | 2062,60, | 2062,61, | 2062,62, | 2062,63, | 2062,64, | 2062,65, | 2062,66, | 2062,67, | 2062,68, | 2062,69, | 2062,70, | 2062,71, | 2062,72, | 2062,73, | 2062,74, | 2062,75, | 2062,76, | 2062,77, | 2062,78, | 2062,79, | 2062,80, | 2062,81, | 2062,82, | 2062,83, | 2062,84, | 2062,85, | 2063,1, | 2063,2, | 2063,3, | 2063,4, | 2063,5, | 2063,6, | 2063,7, | 2063,8, | 2063,9, | 2063,10, | 2063,11, | 2063,12, | 2063,13, | 2063,14, | 2063,15, | 2063,16, | 2063,17, | 2063,18, | 2063,19, | 2063,20, | 2063,21, | 2063,22, | 2063,23, | 2063,24, | 2063,25, | 2063,26, | 2063,27, | 2063,28, | 2063,29, | 2063,30, | 2063,31, | 2063,32, | 2063,33, | 2063,34, | 2063,35, | 2063,36, | 2063,37, | 2063,38, | 2063,39, | 2063,40, | 2063,41, | 2063,42, | 2063,43, | 2063,44, | 2063,45, | 2063,46, | 2063,47, | 2063,48, | 2063,49, | 2063,50, | 2063,51, | 2063,52, | 2063,53, | 2063,54, | 2063,55, | 2063,56, | 2063,57, | 2063,58, | 2063,59, | 2063,60, | 2063,61, | 2063,62, | 2063,63, | 2063,64, | 2063,65, | 2063,66, | 2063,67, | 2063,68, | 2063,69, | 2063,70, | 2063,71, | 2063,72, | 2063,73, | 2063,74, | 2063,75, | 2063,76, | 2063,77, | 2063,78, | 2063,79, | 2063,80, | 2063,81, | 2063,82, | 2063,83, | 2063,84, | 2063,85, | 2064,1, | 2064,2, | 2064,3, | 2064,4, | 2064,5, | 2064,6, | 2064,7, | 2064,8, | 2064,9, | 2064,10, | 2064,11, | 2064,12, | 2064,13, | 2064,14, | 2064,15, | 2064,16, | 2064,17, | 2064,18, | 2064,19, | 2064,20, | 2064,21, | 2064,22, | 2064,23, | 2064,24, | 2064,25, | 2064,26, | 2064,27, | 2064,28, | 2064,29, | 2064,30, | 2064,31, | 2064,32, | 2064,33, | 2064,34, | 2064,35, | 2064,36, | 2064,37, | 2064,38, | 2064,39, | 2064,40, | 2064,41, | 2064,42, | 2064,43, | 2064,44, | 2064,45, | 2064,46, | 2064,47, | 2064,48, | 2064,49, | 2064,50, | 2064,51, | 2064,52, | 2064,53, | 2064,54, | 2064,55, | 2064,56, | 2064,57, | 2064,58, | 2064,59, | 2064,60, | 2064,61, | 2064,62, | 2064,63, | 2064,64, | 2064,65, | 2064,66, | 2064,67, | 2064,68, | 2064,69, | 2064,70, | 2064,71, | 2064,72, | 2064,73, | 2064,74, | 2064,75, | 2064,76, | 2064,77, | 2064,78, | 2064,79, | 2064,80, | 2064,81, | 2064,82, | 2064,83, | 2064,84, | 2064,85, | 2065,1, | 2065,2, | 2065,3, | 2065,4, | 2065,5, | 2065,6, | 2065,7, | 2065,8, | 2065,9, | 2065,10, | 2065,11, | 2065,12, | 2065,13, | 2065,14, | 2065,15, | 2065,16, | 2065,17, | 2065,18, | 2065,19, | 2065,20, | 2065,21, | 2065,22, | 2065,23, | 2065,24, | 2065,25, | 2065,26, | 2065,27, | 2065,28, | 2065,29, | 2065,30, | 2065,31, | 2065,32, | 2065,33, | 2065,34, | 2065,35, | 2065,36, | 2065,37, | 2065,38, | 2065,39, | 2065,40, | 2065,41, | 2065,42, | 2065,43, | 2065,44, | 2065,45, | 2065,46, | 2065,47, | 2065,48, | 2065,49, | 2065,50, | 2065,51, | 2065,52, | 2065,53, | 2065,54, | 2065,55, | 2065,56, | 2065,57, | 2065,58, | 2065,59, | 2065,60, | 2065,61, | 2065,62, | 2065,63, | 2065,64, | 2065,65, | 2065,66, | 2065,67, | 2065,68, | 2065,69, | 2065,70, | 2065,71, | 2065,72, | 2065,73, | 2065,74, | 2065,75, | 2065,76, | 2065,77, | 2065,78, | 2065,79, | 2065,80, | 2065,81, | 2065,82, | 2065,83, | 2065,84, | 2065,85, | 2066,1, | 2066,2, | 2066,3, | 2066,4, | 2066,5, | 2066,6, | 2066,7, | 2066,8, | 2066,9, | 2066,10, | 2066,11, | 2066,12, | 2066,13, | 2066,14, | 2066,15, | 2066,16, | 2066,17, | 2066,18, | 2066,19, | 2066,20, | 2066,21, | 2066,22, | 2066,23, | 2066,24, | 2066,25, | 2066,26, | 2066,27, | 2066,28, | 2066,29, | 2066,30, | 2066,31, | 2066,32, | 2066,33, | 2066,34, | 2066,35, | 2066,36, | 2066,37, | 2066,38, | 2066,39, | 2066,40, | 2066,41, | 2066,42, | 2066,43, | 2066,44, | 2066,45, | 2066,46, | 2066,47, | 2066,48, | 2066,49, | 2066,50, | 2066,51, | 2066,52, | 2066,53, | 2066,54, | 2066,55, | 2066,56, | 2066,57, | 2066,58, | 2066,59, | 2066,60, | 2066,61, | 2066,62, | 2066,63, | 2066,64, | 2066,65, | 2066,66, | 2066,67, | 2066,68, | 2066,69, | 2066,70, | 2066,71, | 2066,72, | 2066,73, | 2066,74, | 2066,75, | 2066,76, | 2066,77, | 2066,78, | 2066,79, | 2066,80, | 2066,81, | 2066,82, | 2066,83, | 2066,84, | 2066,85, | 2067,1, | 2067,2, | 2067,3, | 2067,4, | 2067,5, | 2067,6, | 2067,7, | 2067,8, | 2067,9, | 2067,10, | 2067,11, | 2067,12, | 2067,13, | 2067,14, | 2067,15, | 2067,16, | 2067,17, | 2067,18, | 2067,19, | 2067,20, | 2067,21, | 2067,22, | 2067,23, | 2067,24, | 2067,25, | 2067,26, | 2067,27, | 2067,28, | 2067,29, | 2067,30, | 2067,31, | 2067,32, | 2067,33, | 2067,34, | 2067,35, | 2067,36, | 2067,37, | 2067,38, | 2067,39, | 2067,40, | 2067,41, | 2067,42, | 2067,43, | 2067,44, | 2067,45, | 2067,46, | 2067,47, | 2067,48, | 2067,49, | 2067,50, | 2067,51, | 2067,52, | 2067,53, | 2067,54, | 2067,55, | 2067,56, | 2067,57, | 2067,58, | 2067,59, | 2067,60, | 2067,61, | 2067,62, | 2067,63, | 2067,64, | 2067,65, | 2067,66, | 2067,67, | 2067,68, | 2067,69, | 2067,70, | 2067,71, | 2067,72, | 2067,73, | 2067,74, | 2067,75, | 2067,76, | 2067,77, | 2067,78, | 2067,79, | 2067,80, | 2067,81, | 2067,82, | 2067,83, | 2067,84, | 2067,85, | 2068,1, | 2068,2, | 2068,3, | 2068,4, | 2068,5, | 2068,6, | 2068,7, | 2068,8, | 2068,9, | 2068,10, | 2068,11, | 2068,12, | 2068,13, | 2068,14, | 2068,15, | 2068,16, | 2068,17, | 2068,18, | 2068,19, | 2068,20, | 2068,21, | 2068,22, | 2068,23, | 2068,24, | 2068,25, | 2068,26, | 2068,27, | 2068,28, | 2068,29, | 2068,30, | 2068,31, | 2068,32, | 2068,33, | 2068,34, | 2068,35, | 2068,36, | 2068,37, | 2068,38, | 2068,39, | 2068,40, | 2068,41, | 2068,42, | 2068,43, | 2068,44, | 2068,45, | 2068,46, | 2068,47, | 2068,48, | 2068,49, | 2068,50, | 2068,51, | 2068,52, | 2068,53, | 2068,54, | 2068,55, | 2068,56, | 2068,57, | 2068,58, | 2068,59, | 2068,60, | 2068,61, | 2068,62, | 2068,63, | 2068,64, | 2068,65, | 2068,66, | 2068,67, | 2068,68, | 2068,69, | 2068,70, | 2068,71, | 2068,72, | 2068,73, | 2068,74, | 2068,75, | 2068,76, | 2068,77, | 2068,78, | 2068,79, | 2068,80, | 2068,81, | 2068,82, | 2068,83, | 2068,84, | 2068,85, | 2069,1, | 2069,2, | 2069,3, | 2069,4, | 2069,5, | 2069,6, | 2069,7, | 2069,8, | 2069,9, | 2069,10, | 2069,11, | 2069,12, | 2069,13, | 2069,14, | 2069,15, | 2069,16, | 2069,17, | 2069,18, | 2069,19, | 2069,20, | 2069,21, | 2069,22, | 2069,23, | 2069,24, | 2069,25, | 2069,26, | 2069,27, | 2069,28, | 2069,29, | 2069,30, | 2069,31, | 2069,32, | 2069,33, | 2069,34, | 2069,35, | 2069,36, | 2069,37, | 2069,38, | 2069,39, | 2069,40, | 2069,41, | 2069,42, | 2069,43, | 2069,44, | 2069,45, | 2069,46, | 2069,47, | 2069,48, | 2069,49, | 2069,50, | 2069,51, | 2069,52, | 2069,53, | 2069,54, | 2069,55, | 2069,56, | 2069,57, | 2069,58, | 2069,59, | 2069,60, | 2069,61, | 2069,62, | 2069,63, | 2069,64, | 2069,65, | 2069,66, | 2069,67, | 2069,68, | 2069,69, | 2069,70, | 2069,71, | 2069,72, | 2069,73, | 2069,74, | 2069,75, | 2069,76, | 2069,77, | 2069,78, | 2069,79, | 2069,80, | 2069,81, | 2069,82, | 2069,83, | 2069,84, | 2069,85, | 2070,1, | 2070,2, | 2070,3, | 2070,4, | 2070,5, | 2070,6, | 2070,7, | 2070,8, | 2070,9, | 2070,10, | 2070,11, | 2070,12, | 2070,13, | 2070,14, | 2070,15, | 2070,16, | 2070,17, | 2070,18, | 2070,19, | 2070,20, | 2070,21, | 2070,22, | 2070,23, | 2070,24, | 2070,25, | 2070,26, | 2070,27, | 2070,28, | 2070,29, | 2070,30, | 2070,31, | 2070,32, | 2070,33, | 2070,34, | 2070,35, | 2070,36, | 2070,37, | 2070,38, | 2070,39, | 2070,40, | 2070,41, | 2070,42, | 2070,43, | 2070,44, | 2070,45, | 2070,46, | 2070,47, | 2070,48, | 2070,49, | 2070,50, | 2070,51, | 2070,52, | 2070,53, | 2070,54, | 2070,55, | 2070,56, | 2070,57, | 2070,58, | 2070,59, | 2070,60, | 2070,61, | 2070,62, | 2070,63, | 2070,64, | 2070,65, | 2070,66, | 2070,67, | 2070,68, | 2070,69, | 2070,70, | 2070,71, | 2070,72, | 2070,73, | 2070,74, | 2070,75, | 2070,76, | 2070,77, | 2070,78, | 2070,79, | 2070,80, | 2070,81, | 2070,82, | 2070,83, | 2070,84, | 2070,85, | 2071,1, | 2071,2, | 2071,3, | 2071,4, | 2071,5, | 2071,6, | 2071,7, | 2071,8, | 2071,9, | 2071,10, | 2071,11, | 2071,12, | 2071,13, | 2071,14, | 2071,15, | 2071,16, | 2071,17, | 2071,18, | 2071,19, | 2071,20, | 2071,21, | 2071,22, | 2071,23, | 2071,24, | 2071,25, | 2071,26, | 2071,27, | 2071,28, | 2071,29, | 2071,30, | 2071,31, | 2071,32, | 2071,33, | 2071,34, | 2071,35, | 2071,36, | 2071,37, | 2071,38, | 2071,39, | 2071,40, | 2071,41, | 2071,42, | 2071,43, | 2071,44, | 2071,45, | 2071,46, | 2071,47, | 2071,48, | 2071,49, | 2071,50, | 2071,51, | 2071,52, | 2071,53, | 2071,54, | 2071,55, | 2071,56, | 2071,57, | 2071,58, | 2071,59, | 2071,60, | 2071,61, | 2071,62, | 2071,63, | 2071,64, | 2071,65, | 2071,66, | 2071,67, | 2071,68, | 2071,69, | 2071,70, | 2071,71, | 2071,72, | 2071,73, | 2071,74, | 2071,75, | 2071,76, | 2071,77, | 2071,78, | 2071,79, | 2071,80, | 2071,81, | 2071,82, | 2071,83, | 2071,84, | 2071,85, | 2072,1, | 2072,2, | 2072,3, | 2072,4, | 2072,5, | 2072,6, | 2072,7, | 2072,8, | 2072,9, | 2072,10, | 2072,11, | 2072,12, | 2072,13, | 2072,14, | 2072,15, | 2072,16, | 2072,17, | 2072,18, | 2072,19, | 2072,20, | 2072,21, | 2072,22, | 2072,23, | 2072,24, | 2072,25, | 2072,26, | 2072,27, | 2072,28, | 2072,29, | 2072,30, | 2072,31, | 2072,32, | 2072,33, | 2072,34, | 2072,35, | 2072,36, | 2072,37, | 2072,38, | 2072,39, | 2072,40, | 2072,41, | 2072,42, | 2072,43, | 2072,44, | 2072,45, | 2072,46, | 2072,47, | 2072,48, | 2072,49, | 2072,50, | 2072,51, | 2072,52, | 2072,53, | 2072,54, | 2072,55, | 2072,56, | 2072,57, | 2072,58, | 2072,59, | 2072,60, | 2072,61, | 2072,62, | 2072,63, | 2072,64, | 2072,65, | 2072,66, | 2072,67, | 2072,68, | 2072,69, | 2072,70, | 2072,71, | 2072,72, | 2072,73, | 2072,74, | 2072,75, | 2072,76, | 2072,77, | 2072,78, | 2072,79, | 2072,80, | 2072,81, | 2072,82, | 2072,83, | 2072,84, | 2072,85, | 2073,1, | 2073,2, | 2073,3, | 2073,4, | 2073,5, | 2073,6, | 2073,7, | 2073,8, | 2073,9, | 2073,10, | 2073,11, | 2073,12, | 2073,13, | 2073,14, | 2073,15, | 2073,16, | 2073,17, | 2073,18, | 2073,19, | 2073,20, | 2073,21, | 2073,22, | 2073,23, | 2073,24, | 2073,25, | 2073,26, | 2073,27, | 2073,28, | 2073,29, | 2073,30, | 2073,31, | 2073,32, | 2073,33, | 2073,34, | 2073,35, | 2073,36, | 2073,37, | 2073,38, | 2073,39, | 2073,40, | 2073,41, | 2073,42, | 2073,43, | 2073,44, | 2073,45, | 2073,46, | 2073,47, | 2073,48, | 2073,49, | 2073,50, | 2073,51, | 2073,52, | 2073,53, | 2073,54, | 2073,55, | 2073,56, | 2073,57, | 2073,58, | 2073,59, | 2073,60, | 2073,61, | 2073,62, | 2073,63, | 2073,64, | 2073,65, | 2073,66, | 2073,67, | 2073,68, | 2073,69, | 2073,70, | 2073,71, | 2073,72, | 2073,73, | 2073,74, | 2073,75, | 2073,76, | 2073,77, | 2073,78, | 2073,79, | 2073,80, | 2073,81, | 2073,82, | 2073,83, | 2073,84, | 2073,85, | 2074,1, | 2074,2, | 2074,3, | 2074,4, | 2074,5, | 2074,6, | 2074,7, | 2074,8, | 2074,9, | 2074,10, | 2074,11, | 2074,12, | 2074,13, | 2074,14, | 2074,15, | 2074,16, | 2074,17, | 2074,18, | 2074,19, | 2074,20, | 2074,21, | 2074,22, | 2074,23, | 2074,24, | 2074,25, | 2074,26, | 2074,27, | 2074,28, | 2074,29, | 2074,30, | 2074,31, | 2074,32, | 2074,33, | 2074,34, | 2074,35, | 2074,36, | 2074,37, | 2074,38, | 2074,39, | 2074,40, | 2074,41, | 2074,42, | 2074,43, | 2074,44, | 2074,45, | 2074,46, | 2074,47, | 2074,48, | 2074,49, | 2074,50, | 2074,51, | 2074,52, | 2074,53, | 2074,54, | 2074,55, | 2074,56, | 2074,57, | 2074,58, | 2074,59, | 2074,60, | 2074,61, | 2074,62, | 2074,63, | 2074,64, | 2074,65, | 2074,66, | 2074,67, | 2074,68, | 2074,69, | 2074,70, | 2074,71, | 2074,72, | 2074,73, | 2074,74, | 2074,75, | 2074,76, | 2074,77, | 2074,78, | 2074,79, | 2074,80, | 2074,81, | 2074,82, | 2074,83, | 2074,84, | 2074,85, | 2075,1, | 2075,2, | 2075,3, | 2075,4, | 2075,5, | 2075,6, | 2075,7, | 2075,8, | 2075,9, | 2075,10, | 2075,11, | 2075,12, | 2075,13, | 2075,14, | 2075,15, | 2075,16, | 2075,17, | 2075,18, | 2075,19, | 2075,20, | 2075,21, | 2075,22, | 2075,23, | 2075,24, | 2075,25, | 2075,26, | 2075,27, | 2075,28, | 2075,29, | 2075,30, | 2075,31, | 2075,32, | 2075,33, | 2075,34, | 2075,35, | 2075,36, | 2075,37, | 2075,38, | 2075,39, | 2075,40, | 2075,41, | 2075,42, | 2075,43, | 2075,44, | 2075,45, | 2075,46, | 2075,47, | 2075,48, | 2075,49, | 2075,50, | 2075,51, | 2075,52, | 2075,53, | 2075,54, | 2075,55, | 2075,56, | 2075,57, | 2075,58, | 2075,59, | 2075,60, | 2075,61, | 2075,62, | 2075,63, | 2075,64, | 2075,65, | 2075,66, | 2075,67, | 2075,68, | 2075,69, | 2075,70, | 2075,71, | 2075,72, | 2075,73, | 2075,74, | 2075,75, | 2075,76, | 2075,77, | 2075,78, | 2075,79, | 2075,80, | 2075,81, | 2075,82, | 2075,83, | 2075,84, | 2075,85, | 2076,1, | 2076,2, | 2076,3, | 2076,4, | 2076,5, | 2076,6, | 2076,7, | 2076,8, | 2076,9, | 2076,10, | 2076,11, | 2076,12, | 2076,13, | 2076,14, | 2076,15, | 2076,16, | 2076,17, | 2076,18, | 2076,19, | 2076,20, | 2076,21, | 2076,22, | 2076,23, | 2076,24, | 2076,25, | 2076,26, | 2076,27, | 2076,28, | 2076,29, | 2076,30, | 2076,31, | 2076,32, | 2076,33, | 2076,34, | 2076,35, | 2076,36, | 2076,37, | 2076,38, | 2076,39, | 2076,40, | 2076,41, | 2076,42, | 2076,43, | 2076,44, | 2076,45, | 2076,46, | 2076,47, | 2076,48, | 2076,49, | 2076,50, | 2076,51, | 2076,52, | 2076,53, | 2076,54, | 2076,55, | 2076,56, | 2076,57, | 2076,58, | 2076,59, | 2076,60, | 2076,61, | 2076,62, | 2076,63, | 2076,64, | 2076,65, | 2076,66, | 2076,67, | 2076,68, | 2076,69, | 2076,70, | 2076,71, | 2076,72, | 2076,73, | 2076,74, | 2076,75, | 2076,76, | 2076,77, | 2076,78, | 2076,79, | 2076,80, | 2076,81, | 2076,82, | 2076,83, | 2076,84, | 2076,85, | 2077,1, | 2077,2, | 2077,3, | 2077,4, | 2077,5, | 2077,6, | 2077,7, | 2077,8, | 2077,9, | 2077,10, | 2077,11, | 2077,12, | 2077,13, | 2077,14, | 2077,15, | 2077,16, | 2077,17, | 2077,18, | 2077,19, | 2077,20, | 2077,21, | 2077,22, | 2077,23, | 2077,24, | 2077,25, | 2077,26, | 2077,27, | 2077,28, | 2077,29, | 2077,30, | 2077,31, | 2077,32, | 2077,33, | 2077,34, | 2077,35, | 2077,36, | 2077,37, | 2077,38, | 2077,39, | 2077,40, | 2077,41, | 2077,42, | 2077,43, | 2077,44, | 2077,45, | 2077,46, | 2077,47, | 2077,48, | 2077,49, | 2077,50, | 2077,51, | 2077,52, | 2077,53, | 2077,54, | 2077,55, | 2077,56, | 2077,57, | 2077,58, | 2077,59, | 2077,60, | 2077,61, | 2077,62, | 2077,63, | 2077,64, | 2077,65, | 2077,66, | 2077,67, | 2077,68, | 2077,69, | 2077,70, | 2077,71, | 2077,72, | 2077,73, | 2077,74, | 2077,75, | 2077,76, | 2077,77, | 2077,78, | 2077,79, | 2077,80, | 2077,81, | 2077,82, | 2077,83, | 2077,84, | 2077,85, | 2078,1, | 2078,2, | 2078,3, | 2078,4, | 2078,5, | 2078,6, | 2078,7, | 2078,8, | 2078,9, | 2078,10, | 2078,11, | 2078,12, | 2078,13, | 2078,14, | 2078,15, | 2078,16, | 2078,17, | 2078,18, | 2078,19, | 2078,20, | 2078,21, | 2078,22, | 2078,23, | 2078,24, | 2078,25, | 2078,26, | 2078,27, | 2078,28, | 2078,29, | 2078,30, | 2078,31, | 2078,32, | 2078,33, | 2078,34, | 2078,35, | 2078,36, | 2078,37, | 2078,38, | 2078,39, | 2078,40, | 2078,41, | 2078,42, | 2078,43, | 2078,44, | 2078,45, | 2078,46, | 2078,47, | 2078,48, | 2078,49, | 2078,50, | 2078,51, | 2078,52, | 2078,53, | 2078,54, | 2078,55, | 2078,56, | 2078,57, | 2078,58, | 2078,59, | 2078,60, | 2078,61, | 2078,62, | 2078,63, | 2078,64, | 2078,65, | 2078,66, | 2078,67, | 2078,68, | 2078,69, | 2078,70, | 2078,71, | 2078,72, | 2078,73, | 2078,74, | 2078,75, | 2078,76, | 2078,77, | 2078,78, | 2078,79, | 2078,80, | 2078,81, | 2078,82, | 2078,83, | 2078,84, | 2078,85, | 2079,1, | 2079,2, | 2079,3, | 2079,4, | 2079,5, | 2079,6, | 2079,7, | 2079,8, | 2079,9, | 2079,10, | 2079,11, | 2079,12, | 2079,13, | 2079,14, | 2079,15, | 2079,16, | 2079,17, | 2079,18, | 2079,19, | 2079,20, | 2079,21, | 2079,22, | 2079,23, | 2079,24, | 2079,25, | 2079,26, | 2079,27, | 2079,28, | 2079,29, | 2079,30, | 2079,31, | 2079,32, | 2079,33, | 2079,34, | 2079,35, | 2079,36, | 2079,37, | 2079,38, | 2079,39, | 2079,40, | 2079,41, | 2079,42, | 2079,43, | 2079,44, | 2079,45, | 2079,46, | 2079,47, | 2079,48, | 2079,49, | 2079,50, | 2079,51, | 2079,52, | 2079,53, | 2079,54, | 2079,55, | 2079,56, | 2079,57, | 2079,58, | 2079,59, | 2079,60, | 2079,61, | 2079,62, | 2079,63, | 2079,64, | 2079,65, | 2079,66, | 2079,67, | 2079,68, | 2079,69, | 2079,70, | 2079,71, | 2079,72, | 2079,73, | 2079,74, | 2079,75, | 2079,76, | 2079,77, | 2079,78, | 2079,79, | 2079,80, | 2079,81, | 2079,82, | 2079,83, | 2079,84, | 2079,85, | 2080,1, | 2080,2, | 2080,3, | 2080,4, | 2080,5, | 2080,6, | 2080,7, | 2080,8, | 2080,9, | 2080,10, | 2080,11, | 2080,12, | 2080,13, | 2080,14, | 2080,15, | 2080,16, | 2080,17, | 2080,18, | 2080,19, | 2080,20, | 2080,21, | 2080,22, | 2080,23, | 2080,24, | 2080,25, | 2080,26, | 2080,27, | 2080,28, | 2080,29, | 2080,30, | 2080,31, | 2080,32, | 2080,33, | 2080,34, | 2080,35, | 2080,36, | 2080,37, | 2080,38, | 2080,39, | 2080,40, | 2080,41, | 2080,42, | 2080,43, | 2080,44, | 2080,45, | 2080,46, | 2080,47, | 2080,48, | 2080,49, | 2080,50, | 2080,51, | 2080,52, | 2080,53, | 2080,54, | 2080,55, | 2080,56, | 2080,57, | 2080,58, | 2080,59, | 2080,60, | 2080,61, | 2080,62, | 2080,63, | 2080,64, | 2080,65, | 2080,66, | 2080,67, | 2080,68, | 2080,69, | 2080,70, | 2080,71, | 2080,72, | 2080,73, | 2080,74, | 2080,75, | 2080,76, | 2080,77, | 2080,78, | 2080,79, | 2080,80, | 2080,81, | 2080,82, | 2080,83, | 2080,84, | 2080,85, | 2081,1, | 2081,2, | 2081,3, | 2081,4, | 2081,5, | 2081,6, | 2081,7, | 2081,8, | 2081,9, | 2081,10, | 2081,11, | 2081,12, | 2081,13, | 2081,14, | 2081,15, | 2081,16, | 2081,17, | 2081,18, | 2081,19, | 2081,20, | 2081,21, | 2081,22, | 2081,23, | 2081,24, | 2081,25, | 2081,26, | 2081,27, | 2081,28, | 2081,29, | 2081,30, | 2081,31, | 2081,32, | 2081,33, | 2081,34, | 2081,35, | 2081,36, | 2081,37, | 2081,38, | 2081,39, | 2081,40, | 2081,41, | 2081,42, | 2081,43, | 2081,44, | 2081,45, | 2081,46, | 2081,47, | 2081,48, | 2081,49, | 2081,50, | 2081,51, | 2081,52, | 2081,53, | 2081,54, | 2081,55, | 2081,56, | 2081,57, | 2081,58, | 2081,59, | 2081,60, | 2081,61, | 2081,62, | 2081,63, | 2081,64, | 2081,65, | 2081,66, | 2081,67, | 2081,68, | 2081,69, | 2081,70, | 2081,71, | 2081,72, | 2081,73, | 2081,74, | 2081,75, | 2081,76, | 2081,77, | 2081,78, | 2081,79, | 2081,80, | 2081,81, | 2081,82, | 2081,83, | 2081,84, | 2081,85, | 2082,1, | 2082,2, | 2082,3, | 2082,4, | 2082,5, | 2082,6, | 2082,7, | 2082,8, | 2082,9, | 2082,10, | 2082,11, | 2082,12, | 2082,13, | 2082,14, | 2082,15, | 2082,16, | 2082,17, | 2082,18, | 2082,19, | 2082,20, | 2082,21, | 2082,22, | 2082,23, | 2082,24, | 2082,25, | 2082,26, | 2082,27, | 2082,28, | 2082,29, | 2082,30, | 2082,31, | 2082,32, | 2082,33, | 2082,34, | 2082,35, | 2082,36, | 2082,37, | 2082,38, | 2082,39, | 2082,40, | 2082,41, | 2082,42, | 2082,43, | 2082,44, | 2082,45, | 2082,46, | 2082,47, | 2082,48, | 2082,49, | 2082,50, | 2082,51, | 2082,52, | 2082,53, | 2082,54, | 2082,55, | 2082,56, | 2082,57, | 2082,58, | 2082,59, | 2082,60, | 2082,61, | 2082,62, | 2082,63, | 2082,64, | 2082,65, | 2082,66, | 2082,67, | 2082,68, | 2082,69, | 2082,70, | 2082,71, | 2082,72, | 2082,73, | 2082,74, | 2082,75, | 2082,76, | 2082,77, | 2082,78, | 2082,79, | 2082,80, | 2082,81, | 2082,82, | 2082,83, | 2082,84, | 2082,85, | 2083,1, | 2083,2, | 2083,3, | 2083,4, | 2083,5, | 2083,6, | 2083,7, | 2083,8, | 2083,9, | 2083,10, | 2083,11, | 2083,12, | 2083,13, | 2083,14, | 2083,15, | 2083,16, | 2083,17, | 2083,18, | 2083,19, | 2083,20, | 2083,21, | 2083,22, | 2083,23, | 2083,24, | 2083,25, | 2083,26, | 2083,27, | 2083,28, | 2083,29, | 2083,30, | 2083,31, | 2083,32, | 2083,33, | 2083,34, | 2083,35, | 2083,36, | 2083,37, | 2083,38, | 2083,39, | 2083,40, | 2083,41, | 2083,42, | 2083,43, | 2083,44, | 2083,45, | 2083,46, | 2083,47, | 2083,48, | 2083,49, | 2083,50, | 2083,51, | 2083,52, | 2083,53, | 2083,54, | 2083,55, | 2083,56, | 2083,57, | 2083,58, | 2083,59, | 2083,60, | 2083,61, | 2083,62, | 2083,63, | 2083,64, | 2083,65, | 2083,66, | 2083,67, | 2083,68, | 2083,69, | 2083,70, | 2083,71, | 2083,72, | 2083,73, | 2083,74, | 2083,75, | 2083,76, | 2083,77, | 2083,78, | 2083,79, | 2083,80, | 2083,81, | 2083,82, | 2083,83, | 2083,84, | 2083,85, | 2084,1, | 2084,2, | 2084,3, | 2084,4, | 2084,5, | 2084,6, | 2084,7, | 2084,8, | 2084,9, | 2084,10, | 2084,11, | 2084,12, | 2084,13, | 2084,14, | 2084,15, | 2084,16, | 2084,17, | 2084,18, | 2084,19, | 2084,20, | 2084,21, | 2084,22, | 2084,23, | 2084,24, | 2084,25, | 2084,26, | 2084,27, | 2084,28, | 2084,29, | 2084,30, | 2084,31, | 2084,32, | 2084,33, | 2084,34, | 2084,35, | 2084,36, | 2084,37, | 2084,38, | 2084,39, | 2084,40, | 2084,41, | 2084,42, | 2084,43, | 2084,44, | 2084,45, | 2084,46, | 2084,47, | 2084,48, | 2084,49, | 2084,50, | 2084,51, | 2084,52, | 2084,53, | 2084,54, | 2084,55, | 2084,56, | 2084,57, | 2084,58, | 2084,59, | 2084,60, | 2084,61, | 2084,62, | 2084,63, | 2084,64, | 2084,65, | 2084,66, | 2084,67, | 2084,68, | 2084,69, | 2084,70, | 2084,71, | 2084,72, | 2084,73, | 2084,74, | 2084,75, | 2084,76, | 2084,77, | 2084,78, | 2084,79, | 2084,80, | 2084,81, | 2084,82, | 2084,83, | 2084,84, | 2084,85, | 2085,1, | 2085,2, | 2085,3, | 2085,4, | 2085,5, | 2085,6, | 2085,7, | 2085,8, | 2085,9, | 2085,10, | 2085,11, | 2085,12, | 2085,13, | 2085,14, | 2085,15, | 2085,16, | 2085,17, | 2085,18, | 2085,19, | 2085,20, | 2085,21, | 2085,22, | 2085,23, | 2085,24, | 2085,25, | 2085,26, | 2085,27, | 2085,28, | 2085,29, | 2085,30, | 2085,31, | 2085,32, | 2085,33, | 2085,34, | 2085,35, | 2085,36, | 2085,37, | 2085,38, | 2085,39, | 2085,40, | 2085,41, | 2085,42, | 2085,43, | 2085,44, | 2085,45, | 2085,46, | 2085,47, | 2085,48, | 2085,49, | 2085,50, | 2085,51, | 2085,52, | 2085,53, | 2085,54, | 2085,55, | 2085,56, | 2085,57, | 2085,58, | 2085,59, | 2085,60, | 2085,61, | 2085,62, | 2085,63, | 2085,64, | 2085,65, | 2085,66, | 2085,67, | 2085,68, | 2085,69, | 2085,70, | 2085,71, | 2085,72, | 2085,73, | 2085,74, | 2085,75, | 2085,76, | 2085,77, | 2085,78, | 2085,79, | 2085,80, | 2085,81, | 2085,82, | 2085,83, | 2085,84, | 2085,85, | 2086,1, | 2086,2, | 2086,3, | 2086,4, | 2086,5, | 2086,6, | 2086,7, | 2086,8, | 2086,9, | 2086,10, | 2086,11, | 2086,12, | 2086,13, | 2086,14, | 2086,15, | 2086,16, | 2086,17, | 2086,18, | 2086,19, | 2086,20, | 2086,21, | 2086,22, | 2086,23, | 2086,24, | 2086,25, | 2086,26, | 2086,27, | 2086,28, | 2086,29, | 2086,30, | 2086,31, | 2086,32, | 2086,33, | 2086,34, | 2086,35, | 2086,36, | 2086,37, | 2086,38, | 2086,39, | 2086,40, | 2086,41, | 2086,42, | 2086,43, | 2086,44, | 2086,45, | 2086,46, | 2086,47, | 2086,48, | 2086,49, | 2086,50, | 2086,51, | 2086,52, | 2086,53, | 2086,54, | 2086,55, | 2086,56, | 2086,57, | 2086,58, | 2086,59, | 2086,60, | 2086,61, | 2086,62, | 2086,63, | 2086,64, | 2086,65, | 2086,66, | 2086,67, | 2086,68, | 2086,69, | 2086,70, | 2086,71, | 2086,72, | 2086,73, | 2086,74, | 2086,75, | 2086,76, | 2086,77, | 2086,78, | 2086,79, | 2086,80, | 2086,81, | 2086,82, | 2086,83, | 2086,84, | 2086,85, | 2087,1, | 2087,2, | 2087,3, | 2087,4, | 2087,5, | 2087,6, | 2087,7, | 2087,8, | 2087,9, | 2087,10, | 2087,11, | 2087,12, | 2087,13, | 2087,14, | 2087,15, | 2087,16, | 2087,17, | 2087,18, | 2087,19, | 2087,20, | 2087,21, | 2087,22, | 2087,23, | 2087,24, | 2087,25, | 2087,26, | 2087,27, | 2087,28, | 2087,29, | 2087,30, | 2087,31, | 2087,32, | 2087,33, | 2087,34, | 2087,35, | 2087,36, | 2087,37, | 2087,38, | 2087,39, | 2087,40, | 2087,41, | 2087,42, | 2087,43, | 2087,44, | 2087,45, | 2087,46, | 2087,47, | 2087,48, | 2087,49, | 2087,50, | 2087,51, | 2087,52, | 2087,53, | 2087,54, | 2087,55, | 2087,56, | 2087,57, | 2087,58, | 2087,59, | 2087,60, | 2087,61, | 2087,62, | 2087,63, | 2087,64, | 2087,65, | 2087,66, | 2087,67, | 2087,68, | 2087,69, | 2087,70, | 2087,71, | 2087,72, | 2087,73, | 2087,74, | 2087,75, | 2087,76, | 2087,77, | 2087,78, | 2087,79, | 2087,80, | 2087,81, | 2087,82, | 2087,83, | 2087,84, | 2087,85, | 2088,1, | 2088,2, | 2088,3, | 2088,4, | 2088,5, | 2088,6, | 2088,7, | 2088,8, | 2088,9, | 2088,10, | 2088,11, | 2088,12, | 2088,13, | 2088,14, | 2088,15, | 2088,16, | 2088,17, | 2088,18, | 2088,19, | 2088,20, | 2088,21, | 2088,22, | 2088,23, | 2088,24, | 2088,25, | 2088,26, | 2088,27, | 2088,28, | 2088,29, | 2088,30, | 2088,31, | 2088,32, | 2088,33, | 2088,34, | 2088,35, | 2088,36, | 2088,37, | 2088,38, | 2088,39, | 2088,40, | 2088,41, | 2088,42, | 2088,43, | 2088,44, | 2088,45, | 2088,46, | 2088,47, | 2088,48, | 2088,49, | 2088,50, | 2088,51, | 2088,52, | 2088,53, | 2088,54, | 2088,55, | 2088,56, | 2088,57, | 2088,58, | 2088,59, | 2088,60, | 2088,61, | 2088,62, | 2088,63, | 2088,64, | 2088,65, | 2088,66, | 2088,67, | 2088,68, | 2088,69, | 2088,70, | 2088,71, | 2088,72, | 2088,73, | 2088,74, | 2088,75, | 2088,76, | 2088,77, | 2088,78, | 2088,79, | 2088,80, | 2088,81, | 2088,82, | 2088,83, | 2088,84, | 2088,85, | 2089,1, | 2089,2, | 2089,3, | 2089,4, | 2089,5, | 2089,6, | 2089,7, | 2089,8, | 2089,9, | 2089,10, | 2089,11, | 2089,12, | 2089,13, | 2089,14, | 2089,15, | 2089,16, | 2089,17, | 2089,18, | 2089,19, | 2089,20, | 2089,21, | 2089,22, | 2089,23, | 2089,24, | 2089,25, | 2089,26, | 2089,27, | 2089,28, | 2089,29, | 2089,30, | 2089,31, | 2089,32, | 2089,33, | 2089,34, | 2089,35, | 2089,36, | 2089,37, | 2089,38, | 2089,39, | 2089,40, | 2089,41, | 2089,42, | 2089,43, | 2089,44, | 2089,45, | 2089,46, | 2089,47, | 2089,48, | 2089,49, | 2089,50, | 2089,51, | 2089,52, | 2089,53, | 2089,54, | 2089,55, | 2089,56, | 2089,57, | 2089,58, | 2089,59, | 2089,60, | 2089,61, | 2089,62, | 2089,63, | 2089,64, | 2089,65, | 2089,66, | 2089,67, | 2089,68, | 2089,69, | 2089,70, | 2089,71, | 2089,72, | 2089,73, | 2089,74, | 2089,75, | 2089,76, | 2089,77, | 2089,78, | 2089,79, | 2089,80, | 2089,81, | 2089,82, | 2089,83, | 2089,84, | 2089,85, | 2090,1, | 2090,2, | 2090,3, | 2090,4, | 2090,5, | 2090,6, | 2090,7, | 2090,8, | 2090,9, | 2090,10, | 2090,11, | 2090,12, | 2090,13, | 2090,14, | 2090,15, | 2090,16, | 2090,17, | 2090,18, | 2090,19, | 2090,20, | 2090,21, | 2090,22, | 2090,23, | 2090,24, | 2090,25, | 2090,26, | 2090,27, | 2090,28, | 2090,29, | 2090,30, | 2090,31, | 2090,32, | 2090,33, | 2090,34, | 2090,35, | 2090,36, | 2090,37, | 2090,38, | 2090,39, | 2090,40, | 2090,41, | 2090,42, | 2090,43, | 2090,44, | 2090,45, | 2090,46, | 2090,47, | 2090,48, | 2090,49, | 2090,50, | 2090,51, | 2090,52, | 2090,53, | 2090,54, | 2090,55, | 2090,56, | 2090,57, | 2090,58, | 2090,59, | 2090,60, | 2090,61, | 2090,62, | 2090,63, | 2090,64, | 2090,65, | 2090,66, | 2090,67, | 2090,68, | 2090,69, | 2090,70, | 2090,71, | 2090,72, | 2090,73, | 2090,74, | 2090,75, | 2090,76, | 2090,77, | 2090,78, | 2090,79, | 2090,80, | 2090,81, | 2090,82, | 2090,83, | 2090,84, | 2090,85, | 2091,1, | 2091,2, | 2091,3, | 2091,4, | 2091,5, | 2091,6, | 2091,7, | 2091,8, | 2091,9, | 2091,10, | 2091,11, | 2091,12, | 2091,13, | 2091,14, | 2091,15, | 2091,16, | 2091,17, | 2091,18, | 2091,19, | 2091,20, | 2091,21, | 2091,22, | 2091,23, | 2091,24, | 2091,25, | 2091,26, | 2091,27, | 2091,28, | 2091,29, | 2091,30, | 2091,31, | 2091,32, | 2091,33, | 2091,34, | 2091,35, | 2091,36, | 2091,37, | 2091,38, | 2091,39, | 2091,40, | 2091,41, | 2091,42, | 2091,43, | 2091,44, | 2091,45, | 2091,46, | 2091,47, | 2091,48, | 2091,49, | 2091,50, | 2091,51, | 2091,52, | 2091,53, | 2091,54, | 2091,55, | 2091,56, | 2091,57, | 2091,58, | 2091,59, | 2091,60, | 2091,61, | 2091,62, | 2091,63, | 2091,64, | 2091,65, | 2091,66, | 2091,67, | 2091,68, | 2091,69, | 2091,70, | 2091,71, | 2091,72, | 2091,73, | 2091,74, | 2091,75, | 2091,76, | 2091,77, | 2091,78, | 2091,79, | 2091,80, | 2091,81, | 2091,82, | 2091,83, | 2091,84, | 2091,85, | 2092,1, | 2092,2, | 2092,3, | 2092,4, | 2092,5, | 2092,6, | 2092,7, | 2092,8, | 2092,9, | 2092,10, | 2092,11, | 2092,12, | 2092,13, | 2092,14, | 2092,15, | 2092,16, | 2092,17, | 2092,18, | 2092,19, | 2092,20, | 2092,21, | 2092,22, | 2092,23, | 2092,24, | 2092,25, | 2092,26, | 2092,27, | 2092,28, | 2092,29, | 2092,30, | 2092,31, | 2092,32, | 2092,33, | 2092,34, | 2092,35, | 2092,36, | 2092,37, | 2092,38, | 2092,39, | 2092,40, | 2092,41, | 2092,42, | 2092,43, | 2092,44, | 2092,45, | 2092,46, | 2092,47, | 2092,48, | 2092,49, | 2092,50, | 2092,51, | 2092,52, | 2092,53, | 2092,54, | 2092,55, | 2092,56, | 2092,57, | 2092,58, | 2092,59, | 2092,60, | 2092,61, | 2092,62, | 2092,63, | 2092,64, | 2092,65, | 2092,66, | 2092,67, | 2092,68, | 2092,69, | 2092,70, | 2092,71, | 2092,72, | 2092,73, | 2092,74, | 2092,75, | 2092,76, | 2092,77, | 2092,78, | 2092,79, | 2092,80, | 2092,81, | 2092,82, | 2092,83, | 2092,84, | 2092,85, | 2093,1, | 2093,2, | 2093,3, | 2093,4, | 2093,5, | 2093,6, | 2093,7, | 2093,8, | 2093,9, | 2093,10, | 2093,11, | 2093,12, | 2093,13, | 2093,14, | 2093,15, | 2093,16, | 2093,17, | 2093,18, | 2093,19, | 2093,20, | 2093,21, | 2093,22, | 2093,23, | 2093,24, | 2093,25, | 2093,26, | 2093,27, | 2093,28, | 2093,29, | 2093,30, | 2093,31, | 2093,32, | 2093,33, | 2093,34, | 2093,35, | 2093,36, | 2093,37, | 2093,38, | 2093,39, | 2093,40, | 2093,41, | 2093,42, | 2093,43, | 2093,44, | 2093,45, | 2093,46, | 2093,47, | 2093,48, | 2093,49, | 2093,50, | 2093,51, | 2093,52, | 2093,53, | 2093,54, | 2093,55, | 2093,56, | 2093,57, | 2093,58, | 2093,59, | 2093,60, | 2093,61, | 2093,62, | 2093,63, | 2093,64, | 2093,65, | 2093,66, | 2093,67, | 2093,68, | 2093,69, | 2093,70, | 2093,71, | 2093,72, | 2093,73, | 2093,74, | 2093,75, | 2093,76, | 2093,77, | 2093,78, | 2093,79, | 2093,80, | 2093,81, | 2093,82, | 2093,83, | 2093,84, | 2093,85, | 2094,1, | 2094,2, | 2094,3, | 2094,4, | 2094,5, | 2094,6, | 2094,7, | 2094,8, | 2094,9, | 2094,10, | 2094,11, | 2094,12, | 2094,13, | 2094,14, | 2094,15, | 2094,16, | 2094,17, | 2094,18, | 2094,19, | 2094,20, | 2094,21, | 2094,22, | 2094,23, | 2094,24, | 2094,25, | 2094,26, | 2094,27, | 2094,28, | 2094,29, | 2094,30, | 2094,31, | 2094,32, | 2094,33, | 2094,34, | 2094,35, | 2094,36, | 2094,37, | 2094,38, | 2094,39, | 2094,40, | 2094,41, | 2094,42, | 2094,43, | 2094,44, | 2094,45, | 2094,46, | 2094,47, | 2094,48, | 2094,49, | 2094,50, | 2094,51, | 2094,52, | 2094,53, | 2094,54, | 2094,55, | 2094,56, | 2094,57, | 2094,58, | 2094,59, | 2094,60, | 2094,61, | 2094,62, | 2094,63, | 2094,64, | 2094,65, | 2094,66, | 2094,67, | 2094,68, | 2094,69, | 2094,70, | 2094,71, | 2094,72, | 2094,73, | 2094,74, | 2094,75, | 2094,76, | 2094,77, | 2094,78, | 2094,79, | 2094,80, | 2094,81, | 2094,82, | 2094,83, | 2094,84, | 2094,85, | 2095,1, | 2095,2, | 2095,3, | 2095,4, | 2095,5, | 2095,6, | 2095,7, | 2095,8, | 2095,9, | 2095,10, | 2095,11, | 2095,12, | 2095,13, | 2095,14, | 2095,15, | 2095,16, | 2095,17, | 2095,18, | 2095,19, | 2095,20, | 2095,21, | 2095,22, | 2095,23, | 2095,24, | 2095,25, | 2095,26, | 2095,27, | 2095,28, | 2095,29, | 2095,30, | 2095,31, | 2095,32, | 2095,33, | 2095,34, | 2095,35, | 2095,36, | 2095,37, | 2095,38, | 2095,39, | 2095,40, | 2095,41, | 2095,42, | 2095,43, | 2095,44, | 2095,45, | 2095,46, | 2095,47, | 2095,48, | 2095,49, | 2095,50, | 2095,51, | 2095,52, | 2095,53, | 2095,54, | 2095,55, | 2095,56, | 2095,57, | 2095,58, | 2095,59, | 2095,60, | 2095,61, | 2095,62, | 2095,63, | 2095,64, | 2095,65, | 2095,66, | 2095,67, | 2095,68, | 2095,69, | 2095,70, | 2095,71, | 2095,72, | 2095,73, | 2095,74, | 2095,75, | 2095,76, | 2095,77, | 2095,78, | 2095,79, | 2095,80, | 2095,81, | 2095,82, | 2095,83, | 2095,84, | 2095,85, | 2096,1, | 2096,2, | 2096,3, | 2096,4, | 2096,5, | 2096,6, | 2096,7, | 2096,8, | 2096,9, | 2096,10, | 2096,11, | 2096,12, | 2096,13, | 2096,14, | 2096,15, | 2096,16, | 2096,17, | 2096,18, | 2096,19, | 2096,20, | 2096,21, | 2096,22, | 2096,23, | 2096,24, | 2096,25, | 2096,26, | 2096,27, | 2096,28, | 2096,29, | 2096,30, | 2096,31, | 2096,32, | 2096,33, | 2096,34, | 2096,35, | 2096,36, | 2096,37, | 2096,38, | 2096,39, | 2096,40, | 2096,41, | 2096,42, | 2096,43, | 2096,44, | 2096,45, | 2096,46, | 2096,47, | 2096,48, | 2096,49, | 2096,50, | 2096,51, | 2096,52, | 2096,53, | 2096,54, | 2096,55, | 2096,56, | 2096,57, | 2096,58, | 2096,59, | 2096,60, | 2096,61, | 2096,62, | 2096,63, | 2096,64, | 2096,65, | 2096,66, | 2096,67, | 2096,68, | 2096,69, | 2096,70, | 2096,71, | 2096,72, | 2096,73, | 2096,74, | 2096,75, | 2096,76, | 2096,77, | 2096,78, | 2096,79, | 2096,80, | 2096,81, | 2096,82, | 2096,83, | 2096,84, | 2096,85, | 2097,1, | 2097,2, | 2097,3, | 2097,4, | 2097,5, | 2097,6, | 2097,7, | 2097,8, | 2097,9, | 2097,10, | 2097,11, | 2097,12, | 2097,13, | 2097,14, | 2097,15, | 2097,16, | 2097,17, | 2097,18, | 2097,19, | 2097,20, | 2097,21, | 2097,22, | 2097,23, | 2097,24, | 2097,25, | 2097,26, | 2097,27, | 2097,28, | 2097,29, | 2097,30, | 2097,31, | 2097,32, | 2097,33, | 2097,34, | 2097,35, | 2097,36, | 2097,37, | 2097,38, | 2097,39, | 2097,40, | 2097,41, | 2097,42, | 2097,43, | 2097,44, | 2097,45, | 2097,46, | 2097,47, | 2097,48, | 2097,49, | 2097,50, | 2097,51, | 2097,52, | 2097,53, | 2097,54, | 2097,55, | 2097,56, | 2097,57, | 2097,58, | 2097,59, | 2097,60, | 2097,61, | 2097,62, | 2097,63, | 2097,64, | 2097,65, | 2097,66, | 2097,67, | 2097,68, | 2097,69, | 2097,70, | 2097,71, | 2097,72, | 2097,73, | 2097,74, | 2097,75, | 2097,76, | 2097,77, | 2097,78, | 2097,79, | 2097,80, | 2097,81, | 2097,82, | 2097,83, | 2097,84, | 2097,85, | 2098,1, | 2098,2, | 2098,3, | 2098,4, | 2098,5, | 2098,6, | 2098,7, | 2098,8, | 2098,9, | 2098,10, | 2098,11, | 2098,12, | 2098,13, | 2098,14, | 2098,15, | 2098,16, | 2098,17, | 2098,18, | 2098,19, | 2098,20, | 2098,21, | 2098,22, | 2098,23, | 2098,24, | 2098,25, | 2098,26, | 2098,27, | 2098,28, | 2098,29, | 2098,30, | 2098,31, | 2098,32, | 2098,33, | 2098,34, | 2098,35, | 2098,36, | 2098,37, | 2098,38, | 2098,39, | 2098,40, | 2098,41, | 2098,42, | 2098,43, | 2098,44, | 2098,45, | 2098,46, | 2098,47, | 2098,48, | 2098,49, | 2098,50, | 2098,51, | 2098,52, | 2098,53, | 2098,54, | 2098,55, | 2098,56, | 2098,57, | 2098,58, | 2098,59, | 2098,60, | 2098,61, | 2098,62, | 2098,63, | 2098,64, | 2098,65, | 2098,66, | 2098,67, | 2098,68, | 2098,69, | 2098,70, | 2098,71, | 2098,72, | 2098,73, | 2098,74, | 2098,75, | 2098,76, | 2098,77, | 2098,78, | 2098,79, | 2098,80, | 2098,81, | 2098,82, | 2098,83, | 2098,84, | 2098,85, | 2099,1, | 2099,2, | 2099,3, | 2099,4, | 2099,5, | 2099,6, | 2099,7, | 2099,8, | 2099,9, | 2099,10, | 2099,11, | 2099,12, | 2099,13, | 2099,14, | 2099,15, | 2099,16, | 2099,17, | 2099,18, | 2099,19, | 2099,20, | 2099,21, | 2099,22, | 2099,23, | 2099,24, | 2099,25, | 2099,26, | 2099,27, | 2099,28, | 2099,29, | 2099,30, | 2099,31, | 2099,32, | 2099,33, | 2099,34, | 2099,35, | 2099,36, | 2099,37, | 2099,38, | 2099,39, | 2099,40, | 2099,41, | 2099,42, | 2099,43, | 2099,44, | 2099,45, | 2099,46, | 2099,47, | 2099,48, | 2099,49, | 2099,50, | 2099,51, | 2099,52, | 2099,53, | 2099,54, | 2099,55, | 2099,56, | 2099,57, | 2099,58, | 2099,59, | 2099,60, | 2099,61, | 2099,62, | 2099,63, | 2099,64, | 2099,65, | 2099,66, | 2099,67, | 2099,68, | 2099,69, | 2099,70, | 2099,71, | 2099,72, | 2099,73, | 2099,74, | 2099,75, | 2099,76, | 2099,77, | 2099,78, | 2099,79, | 2099,80, | 2099,81, | 2099,82, | 2099,83, | 2099,84, | 2099,85, | 2100,1, | 2100,2, | 2100,3, | 2100,4, | 2100,5, | 2100,6, | 2100,7, | 2100,8, | 2100,9, | 2100,10, | 2100,11, | 2100,12, | 2100,13, | 2100,14, | 2100,15, | 2100,16, | 2100,17, | 2100,18, | 2100,19, | 2100,20, | 2100,21, | 2100,22, | 2100,23, | 2100,24, | 2100,25, | 2100,26, | 2100,27, | 2100,28, | 2100,29, | 2100,30, | 2100,31, | 2100,32, | 2100,33, | 2100,34, | 2100,35, | 2100,36, | 2100,37, | 2100,38, | 2100,39, | 2100,40, | 2100,41, | 2100,42, | 2100,43, | 2100,44, | 2100,45, | 2100,46, | 2100,47, | 2100,48, | 2100,49, | 2100,50, | 2100,51, | 2100,52, | 2100,53, | 2100,54, | 2100,55, | 2100,56, | 2100,57, | 2100,58, | 2100,59, | 2100,60, | 2100,61, | 2100,62, | 2100,63, | 2100,64, | 2100,65, | 2100,66, | 2100,67, | 2100,68, | 2100,69, | 2100,70, | 2100,71, | 2100,72, | 2100,73, | 2100,74, | 2100,75, | 2100,76, | 2100,77, | 2100,78, | 2100,79, | 2100,80, | 2100,81, | 2100,82, | 2100,83, | 2100,84, | 2100,85, | 2101,1, | 2101,2, | 2101,3, | 2101,4, | 2101,5, | 2101,6, | 2101,7, | 2101,8, | 2101,9, | 2101,10, | 2101,11, | 2101,12, | 2101,13, | 2101,14, | 2101,15, | 2101,16, | 2101,17, | 2101,18, | 2101,19, | 2101,20, | 2101,21, | 2101,22, | 2101,23, | 2101,24, | 2101,25, | 2101,26, | 2101,27, | 2101,28, | 2101,29, | 2101,30, | 2101,31, | 2101,32, | 2101,33, | 2101,34, | 2101,35, | 2101,36, | 2101,37, | 2101,38, | 2101,39, | 2101,40, | 2101,41, | 2101,42, | 2101,43, | 2101,44, | 2101,45, | 2101,46, | 2101,47, | 2101,48, | 2101,49, | 2101,50, | 2101,51, | 2101,52, | 2101,53, | 2101,54, | 2101,55, | 2101,56, | 2101,57, | 2101,58, | 2101,59, | 2101,60, | 2101,61, | 2101,62, | 2101,63, | 2101,64, | 2101,65, | 2101,66, | 2101,67, | 2101,68, | 2101,69, | 2101,70, | 2101,71, | 2101,72, | 2101,73, | 2101,74, | 2101,75, | 2101,76, | 2101,77, | 2101,78, | 2101,79, | 2101,80, | 2101,81, | 2101,82, | 2101,83, | 2101,84, | 2101,85, | 2102,1, | 2102,2, | 2102,3, | 2102,4, | 2102,5, | 2102,6, | 2102,7, | 2102,8, | 2102,9, | 2102,10, | 2102,11, | 2102,12, | 2102,13, | 2102,14, | 2102,15, | 2102,16, | 2102,17, | 2102,18, | 2102,19, | 2102,20, | 2102,21, | 2102,22, | 2102,23, | 2102,24, | 2102,25, | 2102,26, | 2102,27, | 2102,28, | 2102,29, | 2102,30, | 2102,31, | 2102,32, | 2102,33, | 2102,34, | 2102,35, | 2102,36, | 2102,37, | 2102,38, | 2102,39, | 2102,40, | 2102,41, | 2102,42, | 2102,43, | 2102,44, | 2102,45, | 2102,46, | 2102,47, | 2102,48, | 2102,49, | 2102,50, | 2102,51, | 2102,52, | 2102,53, | 2102,54, | 2102,55, | 2102,56, | 2102,57, | 2102,58, | 2102,59, | 2102,60, | 2102,61, | 2102,62, | 2102,63, | 2102,64, | 2102,65, | 2102,66, | 2102,67, | 2102,68, | 2102,69, | 2102,70, | 2102,71, | 2102,72, | 2102,73, | 2102,74, | 2102,75, | 2102,76, | 2102,77, | 2102,78, | 2102,79, | 2102,80, | 2102,81, | 2102,82, | 2102,83, | 2102,84, | 2102,85, | 2103,1, | 2103,2, | 2103,3, | 2103,4, | 2103,5, | 2103,6, | 2103,7, | 2103,8, | 2103,9, | 2103,10, | 2103,11, | 2103,12, | 2103,13, | 2103,14, | 2103,15, | 2103,16, | 2103,17, | 2103,18, | 2103,19, | 2103,20, | 2103,21, | 2103,22, | 2103,23, | 2103,24, | 2103,25, | 2103,26, | 2103,27, | 2103,28, | 2103,29, | 2103,30, | 2103,31, | 2103,32, | 2103,33, | 2103,34, | 2103,35, | 2103,36, | 2103,37, | 2103,38, | 2103,39, | 2103,40, | 2103,41, | 2103,42, | 2103,43, | 2103,44, | 2103,45, | 2103,46, | 2103,47, | 2103,48, | 2103,49, | 2103,50, | 2103,51, | 2103,52, | 2103,53, | 2103,54, | 2103,55, | 2103,56, | 2103,57, | 2103,58, | 2103,59, | 2103,60, | 2103,61, | 2103,62, | 2103,63, | 2103,64, | 2103,65, | 2103,66, | 2103,67, | 2103,68, | 2103,69, | 2103,70, | 2103,71, | 2103,72, | 2103,73, | 2103,74, | 2103,75, | 2103,76, | 2103,77, | 2103,78, | 2103,79, | 2103,80, | 2103,81, | 2103,82, | 2103,83, | 2103,84, | 2103,85, | 2104,1, | 2104,2, | 2104,3, | 2104,4, | 2104,5, | 2104,6, | 2104,7, | 2104,8, | 2104,9, | 2104,10, | 2104,11, | 2104,12, | 2104,13, | 2104,14, | 2104,15, | 2104,16, | 2104,17, | 2104,18, | 2104,19, | 2104,20, | 2104,21, | 2104,22, | 2104,23, | 2104,24, | 2104,25, | 2104,26, | 2104,27, | 2104,28, | 2104,29, | 2104,30, | 2104,31, | 2104,32, | 2104,33, | 2104,34, | 2104,35, | 2104,36, | 2104,37, | 2104,38, | 2104,39, | 2104,40, | 2104,41, | 2104,42, | 2104,43, | 2104,44, | 2104,45, | 2104,46, | 2104,47, | 2104,48, | 2104,49, | 2104,50, | 2104,51, | 2104,52, | 2104,53, | 2104,54, | 2104,55, | 2104,56, | 2104,57, | 2104,58, | 2104,59, | 2104,60, | 2104,61, | 2104,62, | 2104,63, | 2104,64, | 2104,65, | 2104,66, | 2104,67, | 2104,68, | 2104,69, | 2104,70, | 2104,71, | 2104,72, | 2104,73, | 2104,74, | 2104,75, | 2104,76, | 2104,77, | 2104,78, | 2104,79, | 2104,80, | 2104,81, | 2104,82, | 2104,83, | 2104,84, | 2104,85, | 2105,1, | 2105,2, | 2105,3, | 2105,4, | 2105,5, | 2105,6, | 2105,7, | 2105,8, | 2105,9, | 2105,10, | 2105,11, | 2105,12, | 2105,13, | 2105,14, | 2105,15, | 2105,16, | 2105,17, | 2105,18, | 2105,19, | 2105,20, | 2105,21, | 2105,22, | 2105,23, | 2105,24, | 2105,25, | 2105,26, | 2105,27, | 2105,28, | 2105,29, | 2105,30, | 2105,31, | 2105,32, | 2105,33, | 2105,34, | 2105,35, | 2105,36, | 2105,37, | 2105,38, | 2105,39, | 2105,40, | 2105,41, | 2105,42, | 2105,43, | 2105,44, | 2105,45, | 2105,46, | 2105,47, | 2105,48, | 2105,49, | 2105,50, | 2105,51, | 2105,52, | 2105,53, | 2105,54, | 2105,55, | 2105,56, | 2105,57, | 2105,58, | 2105,59, | 2105,60, | 2105,61, | 2105,62, | 2105,63, | 2105,64, | 2105,65, | 2105,66, | 2105,67, | 2105,68, | 2105,69, | 2105,70, | 2105,71, | 2105,72, | 2105,73, | 2105,74, | 2105,75, | 2105,76, | 2105,77, | 2105,78, | 2105,79, | 2105,80, | 2105,81, | 2105,82, | 2105,83, | 2105,84, | 2105,85, | 2106,1, | 2106,2, | 2106,3, | 2106,4, | 2106,5, | 2106,6, | 2106,7, | 2106,8, | 2106,9, | 2106,10, | 2106,11, | 2106,12, | 2106,13, | 2106,14, | 2106,15, | 2106,16, | 2106,17, | 2106,18, | 2106,19, | 2106,20, | 2106,21, | 2106,22, | 2106,23, | 2106,24, | 2106,25, | 2106,26, | 2106,27, | 2106,28, | 2106,29, | 2106,30, | 2106,31, | 2106,32, | 2106,33, | 2106,34, | 2106,35, | 2106,36, | 2106,37, | 2106,38, | 2106,39, | 2106,40, | 2106,41, | 2106,42, | 2106,43, | 2106,44, | 2106,45, | 2106,46, | 2106,47, | 2106,48, | 2106,49, | 2106,50, | 2106,51, | 2106,52, | 2106,53, | 2106,54, | 2106,55, | 2106,56, | 2106,57, | 2106,58, | 2106,59, | 2106,60, | 2106,61, | 2106,62, | 2106,63, | 2106,64, | 2106,65, | 2106,66, | 2106,67, | 2106,68, | 2106,69, | 2106,70, | 2106,71, | 2106,72, | 2106,73, | 2106,74, | 2106,75, | 2106,76, | 2106,77, | 2106,78, | 2106,79, | 2106,80, | 2106,81, | 2106,82, | 2106,83, | 2106,84, | 2106,85, | 2107,1, | 2107,2, | 2107,3, | 2107,4, | 2107,5, | 2107,6, | 2107,7, | 2107,8, | 2107,9, | 2107,10, | 2107,11, | 2107,12, | 2107,13, | 2107,14, | 2107,15, | 2107,16, | 2107,17, | 2107,18, | 2107,19, | 2107,20, | 2107,21, | 2107,22, | 2107,23, | 2107,24, | 2107,25, | 2107,26, | 2107,27, | 2107,28, | 2107,29, | 2107,30, | 2107,31, | 2107,32, | 2107,33, | 2107,34, | 2107,35, | 2107,36, | 2107,37, | 2107,38, | 2107,39, | 2107,40, | 2107,41, | 2107,42, | 2107,43, | 2107,44, | 2107,45, | 2107,46, | 2107,47, | 2107,48, | 2107,49, | 2107,50, | 2107,51, | 2107,52, | 2107,53, | 2107,54, | 2107,55, | 2107,56, | 2107,57, | 2107,58, | 2107,59, | 2107,60, | 2107,61, | 2107,62, | 2107,63, | 2107,64, | 2107,65, | 2107,66, | 2107,67, | 2107,68, | 2107,69, | 2107,70, | 2107,71, | 2107,72, | 2107,73, | 2107,74, | 2107,75, | 2107,76, | 2107,77, | 2107,78, | 2107,79, | 2107,80, | 2107,81, | 2107,82, | 2107,83, | 2107,84, | 2107,85, | 2108,1, | 2108,2, | 2108,3, | 2108,4, | 2108,5, | 2108,6, | 2108,7, | 2108,8, | 2108,9, | 2108,10, | 2108,11, | 2108,12, | 2108,13, | 2108,14, | 2108,15, | 2108,16, | 2108,17, | 2108,18, | 2108,19, | 2108,20, | 2108,21, | 2108,22, | 2108,23, | 2108,24, | 2108,25, | 2108,26, | 2108,27, | 2108,28, | 2108,29, | 2108,30, | 2108,31, | 2108,32, | 2108,33, | 2108,34, | 2108,35, | 2108,36, | 2108,37, | 2108,38, | 2108,39, | 2108,40, | 2108,41, | 2108,42, | 2108,43, | 2108,44, | 2108,45, | 2108,46, | 2108,47, | 2108,48, | 2108,49, | 2108,50, | 2108,51, | 2108,52, | 2108,53, | 2108,54, | 2108,55, | 2108,56, | 2108,57, | 2108,58, | 2108,59, | 2108,60, | 2108,61, | 2108,62, | 2108,63, | 2108,64, | 2108,65, | 2108,66, | 2108,67, | 2108,68, | 2108,69, | 2108,70, | 2108,71, | 2108,72, | 2108,73, | 2108,74, | 2108,75, | 2108,76, | 2108,77, | 2108,78, | 2108,79, | 2108,80, | 2108,81, | 2108,82, | 2108,83, | 2108,84, | 2108,85, | 2109,1, | 2109,2, | 2109,3, | 2109,4, | 2109,5, | 2109,6, | 2109,7, | 2109,8, | 2109,9, | 2109,10, | 2109,11, | 2109,12, | 2109,13, | 2109,14, | 2109,15, | 2109,16, | 2109,17, | 2109,18, | 2109,19, | 2109,20, | 2109,21, | 2109,22, | 2109,23, | 2109,24, | 2109,25, | 2109,26, | 2109,27, | 2109,28, | 2109,29, | 2109,30, | 2109,31, | 2109,32, | 2109,33, | 2109,34, | 2109,35, | 2109,36, | 2109,37, | 2109,38, | 2109,39, | 2109,40, | 2109,41, | 2109,42, | 2109,43, | 2109,44, | 2109,45, | 2109,46, | 2109,47, | 2109,48, | 2109,49, | 2109,50, | 2109,51, | 2109,52, | 2109,53, | 2109,54, | 2109,55, | 2109,56, | 2109,57, | 2109,58, | 2109,59, | 2109,60, | 2109,61, | 2109,62, | 2109,63, | 2109,64, | 2109,65, | 2109,66, | 2109,67, | 2109,68, | 2109,69, | 2109,70, | 2109,71, | 2109,72, | 2109,73, | 2109,74, | 2109,75, | 2109,76, | 2109,77, | 2109,78, | 2109,79, | 2109,80, | 2109,81, | 2109,82, | 2109,83, | 2109,84, | 2109,85, | 2110,1, | 2110,2, | 2110,3, | 2110,4, | 2110,5, | 2110,6, | 2110,7, | 2110,8, | 2110,9, | 2110,10, | 2110,11, | 2110,12, | 2110,13, | 2110,14, | 2110,15, | 2110,16, | 2110,17, | 2110,18, | 2110,19, | 2110,20, | 2110,21, | 2110,22, | 2110,23, | 2110,24, | 2110,25, | 2110,26, | 2110,27, | 2110,28, | 2110,29, | 2110,30, | 2110,31, | 2110,32, | 2110,33, | 2110,34, | 2110,35, | 2110,36, | 2110,37, | 2110,38, | 2110,39, | 2110,40, | 2110,41, | 2110,42, | 2110,43, | 2110,44, | 2110,45, | 2110,46, | 2110,47, | 2110,48, | 2110,49, | 2110,50, | 2110,51, | 2110,52, | 2110,53, | 2110,54, | 2110,55, | 2110,56, | 2110,57, | 2110,58, | 2110,59, | 2110,60, | 2110,61, | 2110,62, | 2110,63, | 2110,64, | 2110,65, | 2110,66, | 2110,67, | 2110,68, | 2110,69, | 2110,70, | 2110,71, | 2110,72, | 2110,73, | 2110,74, | 2110,75, | 2110,76, | 2110,77, | 2110,78, | 2110,79, | 2110,80, | 2110,81, | 2110,82, | 2110,83, | 2110,84, | 2110,85, | 2111,1, | 2111,2, | 2111,3, | 2111,4, | 2111,5, | 2111,6, | 2111,7, | 2111,8, | 2111,9, | 2111,10, | 2111,11, | 2111,12, | 2111,13, | 2111,14, | 2111,15, | 2111,16, | 2111,17, | 2111,18, | 2111,19, | 2111,20, | 2111,21, | 2111,22, | 2111,23, | 2111,24, | 2111,25, | 2111,26, | 2111,27, | 2111,28, | 2111,29, | 2111,30, | 2111,31, | 2111,32, | 2111,33, | 2111,34, | 2111,35, | 2111,36, | 2111,37, | 2111,38, | 2111,39, | 2111,40, | 2111,41, | 2111,42, | 2111,43, | 2111,44, | 2111,45, | 2111,46, | 2111,47, | 2111,48, | 2111,49, | 2111,50, | 2111,51, | 2111,52, | 2111,53, | 2111,54, | 2111,55, | 2111,56, | 2111,57, | 2111,58, | 2111,59, | 2111,60, | 2111,61, | 2111,62, | 2111,63, | 2111,64, | 2111,65, | 2111,66, | 2111,67, | 2111,68, | 2111,69, | 2111,70, | 2111,71, | 2111,72, | 2111,73, | 2111,74, | 2111,75, | 2111,76, | 2111,77, | 2111,78, | 2111,79, | 2111,80, | 2111,81, | 2111,82, | 2111,83, | 2111,84, | 2111,85, | 2112,1, | 2112,2, | 2112,3, | 2112,4, | 2112,5, | 2112,6, | 2112,7, | 2112,8, | 2112,9, | 2112,10, | 2112,11, | 2112,12, | 2112,13, | 2112,14, | 2112,15, | 2112,16, | 2112,17, | 2112,18, | 2112,19, | 2112,20, | 2112,21, | 2112,22, | 2112,23, | 2112,24, | 2112,25, | 2112,26, | 2112,27, | 2112,28, | 2112,29, | 2112,30, | 2112,31, | 2112,32, | 2112,33, | 2112,34, | 2112,35, | 2112,36, | 2112,37, | 2112,38, | 2112,39, | 2112,40, | 2112,41, | 2112,42, | 2112,43, | 2112,44, | 2112,45, | 2112,46, | 2112,47, | 2112,48, | 2112,49, | 2112,50, | 2112,51, | 2112,52, | 2112,53, | 2112,54, | 2112,55, | 2112,56, | 2112,57, | 2112,58, | 2112,59, | 2112,60, | 2112,61, | 2112,62, | 2112,63, | 2112,64, | 2112,65, | 2112,66, | 2112,67, | 2112,68, | 2112,69, | 2112,70, | 2112,71, | 2112,72, | 2112,73, | 2112,74, | 2112,75, | 2112,76, | 2112,77, | 2112,78, | 2112,79, | 2112,80, | 2112,81, | 2112,82, | 2112,83, | 2112,84, | 2112,85, | 2113,1, | 2113,2, | 2113,3, | 2113,4, | 2113,5, | 2113,6, | 2113,7, | 2113,8, | 2113,9, | 2113,10, | 2113,11, | 2113,12, | 2113,13, | 2113,14, | 2113,15, | 2113,16, | 2113,17, | 2113,18, | 2113,19, | 2113,20, | 2113,21, | 2113,22, | 2113,23, | 2113,24, | 2113,25, | 2113,26, | 2113,27, | 2113,28, | 2113,29, | 2113,30, | 2113,31, | 2113,32, | 2113,33, | 2113,34, | 2113,35, | 2113,36, | 2113,37, | 2113,38, | 2113,39, | 2113,40, | 2113,41, | 2113,42, | 2113,43, | 2113,44, | 2113,45, | 2113,46, | 2113,47, | 2113,48, | 2113,49, | 2113,50, | 2113,51, | 2113,52, | 2113,53, | 2113,54, | 2113,55, | 2113,56, | 2113,57, | 2113,58, | 2113,59, | 2113,60, | 2113,61, | 2113,62, | 2113,63, | 2113,64, | 2113,65, | 2113,66, | 2113,67, | 2113,68, | 2113,69, | 2113,70, | 2113,71, | 2113,72, | 2113,73, | 2113,74, | 2113,75, | 2113,76, | 2113,77, | 2113,78, | 2113,79, | 2113,80, | 2113,81, | 2113,82, | 2113,83, | 2113,84, | 2113,85, | 2114,1, | 2114,2, | 2114,3, | 2114,4, | 2114,5, | 2114,6, | 2114,7, | 2114,8, | 2114,9, | 2114,10, | 2114,11, | 2114,12, | 2114,13, | 2114,14, | 2114,15, | 2114,16, | 2114,17, | 2114,18, | 2114,19, | 2114,20, | 2114,21, | 2114,22, | 2114,23, | 2114,24, | 2114,25, | 2114,26, | 2114,27, | 2114,28, | 2114,29, | 2114,30, | 2114,31, | 2114,32, | 2114,33, | 2114,34, | 2114,35, | 2114,36, | 2114,37, | 2114,38, | 2114,39, | 2114,40, | 2114,41, | 2114,42, | 2114,43, | 2114,44, | 2114,45, | 2114,46, | 2114,47, | 2114,48, | 2114,49, | 2114,50, | 2114,51, | 2114,52, | 2114,53, | 2114,54, | 2114,55, | 2114,56, | 2114,57, | 2114,58, | 2114,59, | 2114,60, | 2114,61, | 2114,62, | 2114,63, | 2114,64, | 2114,65, | 2114,66, | 2114,67, | 2114,68, | 2114,69, | 2114,70, | 2114,71, | 2114,72, | 2114,73, | 2114,74, | 2114,75, | 2114,76, | 2114,77, | 2114,78, | 2114,79, | 2114,80, | 2114,81, | 2114,82, | 2114,83, | 2114,84, | 2114,85, | 2115,1, | 2115,2, | 2115,3, | 2115,4, | 2115,5, | 2115,6, | 2115,7, | 2115,8, | 2115,9, | 2115,10, | 2115,11, | 2115,12, | 2115,13, | 2115,14, | 2115,15, | 2115,16, | 2115,17, | 2115,18, | 2115,19, | 2115,20, | 2115,21, | 2115,22, | 2115,23, | 2115,24, | 2115,25, | 2115,26, | 2115,27, | 2115,28, | 2115,29, | 2115,30, | 2115,31, | 2115,32, | 2115,33, | 2115,34, | 2115,35, | 2115,36, | 2115,37, | 2115,38, | 2115,39, | 2115,40, | 2115,41, | 2115,42, | 2115,43, | 2115,44, | 2115,45, | 2115,46, | 2115,47, | 2115,48, | 2115,49, | 2115,50, | 2115,51, | 2115,52, | 2115,53, | 2115,54, | 2115,55, | 2115,56, | 2115,57, | 2115,58, | 2115,59, | 2115,60, | 2115,61, | 2115,62, | 2115,63, | 2115,64, | 2115,65, | 2115,66, | 2115,67, | 2115,68, | 2115,69, | 2115,70, | 2115,71, | 2115,72, | 2115,73, | 2115,74, | 2115,75, | 2115,76, | 2115,77, | 2115,78, | 2115,79, | 2115,80, | 2115,81, | 2115,82, | 2115,83, | 2115,84, | 2115,85, | 2116,1, | 2116,2, | 2116,3, | 2116,4, | 2116,5, | 2116,6, | 2116,7, | 2116,8, | 2116,9, | 2116,10, | 2116,11, | 2116,12, | 2116,13, | 2116,14, | 2116,15, | 2116,16, | 2116,17, | 2116,18, | 2116,19, | 2116,20, | 2116,21, | 2116,22, | 2116,23, | 2116,24, | 2116,25, | 2116,26, | 2116,27, | 2116,28, | 2116,29, | 2116,30, | 2116,31, | 2116,32, | 2116,33, | 2116,34, | 2116,35, | 2116,36, | 2116,37, | 2116,38, | 2116,39, | 2116,40, | 2116,41, | 2116,42, | 2116,43, | 2116,44, | 2116,45, | 2116,46, | 2116,47, | 2116,48, | 2116,49, | 2116,50, | 2116,51, | 2116,52, | 2116,53, | 2116,54, | 2116,55, | 2116,56, | 2116,57, | 2116,58, | 2116,59, | 2116,60, | 2116,61, | 2116,62, | 2116,63, | 2116,64, | 2116,65, | 2116,66, | 2116,67, | 2116,68, | 2116,69, | 2116,70, | 2116,71, | 2116,72, | 2116,73, | 2116,74, | 2116,75, | 2116,76, | 2116,77, | 2116,78, | 2116,79, | 2116,80, | 2116,81, | 2116,82, | 2116,83, | 2116,84, | 2116,85, | 2117,1, | 2117,2, | 2117,3, | 2117,4, | 2117,5, | 2117,6, | 2117,7, | 2117,8, | 2117,9, | 2117,10, | 2117,11, | 2117,12, | 2117,13, | 2117,14, | 2117,15, | 2117,16, | 2117,17, | 2117,18, | 2117,19, | 2117,20, | 2117,21, | 2117,22, | 2117,23, | 2117,24, | 2117,25, | 2117,26, | 2117,27, | 2117,28, | 2117,29, | 2117,30, | 2117,31, | 2117,32, | 2117,33, | 2117,34, | 2117,35, | 2117,36, | 2117,37, | 2117,38, | 2117,39, | 2117,40, | 2117,41, | 2117,42, | 2117,43, | 2117,44, | 2117,45, | 2117,46, | 2117,47, | 2117,48, | 2117,49, | 2117,50, | 2117,51, | 2117,52, | 2117,53, | 2117,54, | 2117,55, | 2117,56, | 2117,57, | 2117,58, | 2117,59, | 2117,60, | 2117,61, | 2117,62, | 2117,63, | 2117,64, | 2117,65, | 2117,66, | 2117,67, | 2117,68, | 2117,69, | 2117,70, | 2117,71, | 2117,72, | 2117,73, | 2117,74, | 2117,75, | 2117,76, | 2117,77, | 2117,78, | 2117,79, | 2117,80, | 2117,81, | 2117,82, | 2117,83, | 2117,84, | 2117,85, | 2118,1, | 2118,2, | 2118,3, | 2118,4, | 2118,5, | 2118,6, | 2118,7, | 2118,8, | 2118,9, | 2118,10, | 2118,11, | 2118,12, | 2118,13, | 2118,14, | 2118,15, | 2118,16, | 2118,17, | 2118,18, | 2118,19, | 2118,20, | 2118,21, | 2118,22, | 2118,23, | 2118,24, | 2118,25, | 2118,26, | 2118,27, | 2118,28, | 2118,29, | 2118,30, | 2118,31, | 2118,32, | 2118,33, | 2118,34, | 2118,35, | 2118,36, | 2118,37, | 2118,38, | 2118,39, | 2118,40, | 2118,41, | 2118,42, | 2118,43, | 2118,44, | 2118,45, | 2118,46, | 2118,47, | 2118,48, | 2118,49, | 2118,50, | 2118,51, | 2118,52, | 2118,53, | 2118,54, | 2118,55, | 2118,56, | 2118,57, | 2118,58, | 2118,59, | 2118,60, | 2118,61, | 2118,62, | 2118,63, | 2118,64, | 2118,65, | 2118,66, | 2118,67, | 2118,68, | 2118,69, | 2118,70, | 2118,71, | 2118,72, | 2118,73, | 2118,74, | 2118,75, | 2118,76, | 2118,77, | 2118,78, | 2118,79, | 2118,80, | 2118,81, | 2118,82, | 2118,83, | 2118,84, | 2118,85, | 2119,1, | 2119,2, | 2119,3, | 2119,4, | 2119,5, | 2119,6, | 2119,7, | 2119,8, | 2119,9, | 2119,10, | 2119,11, | 2119,12, | 2119,13, | 2119,14, | 2119,15, | 2119,16, | 2119,17, | 2119,18, | 2119,19, | 2119,20, | 2119,21, | 2119,22, | 2119,23, | 2119,24, | 2119,25, | 2119,26, | 2119,27, | 2119,28, | 2119,29, | 2119,30, | 2119,31, | 2119,32, | 2119,33, | 2119,34, | 2119,35, | 2119,36, | 2119,37, | 2119,38, | 2119,39, | 2119,40, | 2119,41, | 2119,42, | 2119,43, | 2119,44, | 2119,45, | 2119,46, | 2119,47, | 2119,48, | 2119,49, | 2119,50, | 2119,51, | 2119,52, | 2119,53, | 2119,54, | 2119,55, | 2119,56, | 2119,57, | 2119,58, | 2119,59, | 2119,60, | 2119,61, | 2119,62, | 2119,63, | 2119,64, | 2119,65, | 2119,66, | 2119,67, | 2119,68, | 2119,69, | 2119,70, | 2119,71, | 2119,72, | 2119,73, | 2119,74, | 2119,75, | 2119,76, | 2119,77, | 2119,78, | 2119,79, | 2119,80, | 2119,81, | 2119,82, | 2119,83, | 2119,84, | 2119,85, | 2120,1, | 2120,2, | 2120,3, | 2120,4, | 2120,5, | 2120,6, | 2120,7, | 2120,8, | 2120,9, | 2120,10, | 2120,11, | 2120,12, | 2120,13, | 2120,14, | 2120,15, | 2120,16, | 2120,17, | 2120,18, | 2120,19, | 2120,20, | 2120,21, | 2120,22, | 2120,23, | 2120,24, | 2120,25, | 2120,26, | 2120,27, | 2120,28, | 2120,29, | 2120,30, | 2120,31, | 2120,32, | 2120,33, | 2120,34, | 2120,35, | 2120,36, | 2120,37, | 2120,38, | 2120,39, | 2120,40, | 2120,41, | 2120,42, | 2120,43, | 2120,44, | 2120,45, | 2120,46, | 2120,47, | 2120,48, | 2120,49, | 2120,50, | 2120,51, | 2120,52, | 2120,53, | 2120,54, | 2120,55, | 2120,56, | 2120,57, | 2120,58, | 2120,59, | 2120,60, | 2120,61, | 2120,62, | 2120,63, | 2120,64, | 2120,65, | 2120,66, | 2120,67, | 2120,68, | 2120,69, | 2120,70, | 2120,71, | 2120,72, | 2120,73, | 2120,74, | 2120,75, | 2120,76, | 2120,77, | 2120,78, | 2120,79, | 2120,80, | 2120,81, | 2120,82, | 2120,83, | 2120,84, | 2120,85, | 2121,1, | 2121,2, | 2121,3, | 2121,4, | 2121,5, | 2121,6, | 2121,7, | 2121,8, | 2121,9, | 2121,10, | 2121,11, | 2121,12, | 2121,13, | 2121,14, | 2121,15, | 2121,16, | 2121,17, | 2121,18, | 2121,19, | 2121,20, | 2121,21, | 2121,22, | 2121,23, | 2121,24, | 2121,25, | 2121,26, | 2121,27, | 2121,28, | 2121,29, | 2121,30, | 2121,31, | 2121,32, | 2121,33, | 2121,34, | 2121,35, | 2121,36, | 2121,37, | 2121,38, | 2121,39, | 2121,40, | 2121,41, | 2121,42, | 2121,43, | 2121,44, | 2121,45, | 2121,46, | 2121,47, | 2121,48, | 2121,49, | 2121,50, | 2121,51, | 2121,52, | 2121,53, | 2121,54, | 2121,55, | 2121,56, | 2121,57, | 2121,58, | 2121,59, | 2121,60, | 2121,61, | 2121,62, | 2121,63, | 2121,64, | 2121,65, | 2121,66, | 2121,67, | 2121,68, | 2121,69, | 2121,70, | 2121,71, | 2121,72, | 2121,73, | 2121,74, | 2121,75, | 2121,76, | 2121,77, | 2121,78, | 2121,79, | 2121,80, | 2121,81, | 2121,82, | 2121,83, | 2121,84, | 2121,85, | 2122,1, | 2122,2, | 2122,3, | 2122,4, | 2122,5, | 2122,6, | 2122,7, | 2122,8, | 2122,9, | 2122,10, | 2122,11, | 2122,12, | 2122,13, | 2122,14, | 2122,15, | 2122,16, | 2122,17, | 2122,18, | 2122,19, | 2122,20, | 2122,21, | 2122,22, | 2122,23, | 2122,24, | 2122,25, | 2122,26, | 2122,27, | 2122,28, | 2122,29, | 2122,30, | 2122,31, | 2122,32, | 2122,33, | 2122,34, | 2122,35, | 2122,36, | 2122,37, | 2122,38, | 2122,39, | 2122,40, | 2122,41, | 2122,42, | 2122,43, | 2122,44, | 2122,45, | 2122,46, | 2122,47, | 2122,48, | 2122,49, | 2122,50, | 2122,51, | 2122,52, | 2122,53, | 2122,54, | 2122,55, | 2122,56, | 2122,57, | 2122,58, | 2122,59, | 2122,60, | 2122,61, | 2122,62, | 2122,63, | 2122,64, | 2122,65, | 2122,66, | 2122,67, | 2122,68, | 2122,69, | 2122,70, | 2122,71, | 2122,72, | 2122,73, | 2122,74, | 2122,75, | 2122,76, | 2122,77, | 2122,78, | 2122,79, | 2122,80, | 2122,81, | 2122,82, | 2122,83, | 2122,84, | 2122,85, | 2123,1, | 2123,2, | 2123,3, | 2123,4, | 2123,5, | 2123,6, | 2123,7, | 2123,8, | 2123,9, | 2123,10, | 2123,11, | 2123,12, | 2123,13, | 2123,14, | 2123,15, | 2123,16, | 2123,17, | 2123,18, | 2123,19, | 2123,20, | 2123,21, | 2123,22, | 2123,23, | 2123,24, | 2123,25, | 2123,26, | 2123,27, | 2123,28, | 2123,29, | 2123,30, | 2123,31, | 2123,32, | 2123,33, | 2123,34, | 2123,35, | 2123,36, | 2123,37, | 2123,38, | 2123,39, | 2123,40, | 2123,41, | 2123,42, | 2123,43, | 2123,44, | 2123,45, | 2123,46, | 2123,47, | 2123,48, | 2123,49, | 2123,50, | 2123,51, | 2123,52, | 2123,53, | 2123,54, | 2123,55, | 2123,56, | 2123,57, | 2123,58, | 2123,59, | 2123,60, | 2123,61, | 2123,62, | 2123,63, | 2123,64, | 2123,65, | 2123,66, | 2123,67, | 2123,68, | 2123,69, | 2123,70, | 2123,71, | 2123,72, | 2123,73, | 2123,74, | 2123,75, | 2123,76, | 2123,77, | 2123,78, | 2123,79, | 2123,80, | 2123,81, | 2123,82, | 2123,83, | 2123,84, | 2123,85, | 2124,1, | 2124,2, | 2124,3, | 2124,4, | 2124,5, | 2124,6, | 2124,7, | 2124,8, | 2124,9, | 2124,10, | 2124,11, | 2124,12, | 2124,13, | 2124,14, | 2124,15, | 2124,16, | 2124,17, | 2124,18, | 2124,19, | 2124,20, | 2124,21, | 2124,22, | 2124,23, | 2124,24, | 2124,25, | 2124,26, | 2124,27, | 2124,28, | 2124,29, | 2124,30, | 2124,31, | 2124,32, | 2124,33, | 2124,34, | 2124,35, | 2124,36, | 2124,37, | 2124,38, | 2124,39, | 2124,40, | 2124,41, | 2124,42, | 2124,43, | 2124,44, | 2124,45, | 2124,46, | 2124,47, | 2124,48, | 2124,49, | 2124,50, | 2124,51, | 2124,52, | 2124,53, | 2124,54, | 2124,55, | 2124,56, | 2124,57, | 2124,58, | 2124,59, | 2124,60, | 2124,61, | 2124,62, | 2124,63, | 2124,64, | 2124,65, | 2124,66, | 2124,67, | 2124,68, | 2124,69, | 2124,70, | 2124,71, | 2124,72, | 2124,73, | 2124,74, | 2124,75, | 2124,76, | 2124,77, | 2124,78, | 2124,79, | 2124,80, | 2124,81, | 2124,82, | 2124,83, | 2124,84, | 2124,85, | 2125,1, | 2125,2, | 2125,3, | 2125,4, | 2125,5, | 2125,6, | 2125,7, | 2125,8, | 2125,9, | 2125,10, | 2125,11, | 2125,12, | 2125,13, | 2125,14, | 2125,15, | 2125,16, | 2125,17, | 2125,18, | 2125,19, | 2125,20, | 2125,21, | 2125,22, | 2125,23, | 2125,24, | 2125,25, | 2125,26, | 2125,27, | 2125,28, | 2125,29, | 2125,30, | 2125,31, | 2125,32, | 2125,33, | 2125,34, | 2125,35, | 2125,36, | 2125,37, | 2125,38, | 2125,39, | 2125,40, | 2125,41, | 2125,42, | 2125,43, | 2125,44, | 2125,45, | 2125,46, | 2125,47, | 2125,48, | 2125,49, | 2125,50, | 2125,51, | 2125,52, | 2125,53, | 2125,54, | 2125,55, | 2125,56, | 2125,57, | 2125,58, | 2125,59, | 2125,60, | 2125,61, | 2125,62, | 2125,63, | 2125,64, | 2125,65, | 2125,66, | 2125,67, | 2125,68, | 2125,69, | 2125,70, | 2125,71, | 2125,72, | 2125,73, | 2125,74, | 2125,75, | 2125,76, | 2125,77, | 2125,78, | 2125,79, | 2125,80, | 2125,81, | 2125,82, | 2125,83, | 2125,84, | 2125,85, | 2126,1, | 2126,2, | 2126,3, | 2126,4, | 2126,5, | 2126,6, | 2126,7, | 2126,8, | 2126,9, | 2126,10, | 2126,11, | 2126,12, | 2126,13, | 2126,14, | 2126,15, | 2126,16, | 2126,17, | 2126,18, | 2126,19, | 2126,20, | 2126,21, | 2126,22, | 2126,23, | 2126,24, | 2126,25, | 2126,26, | 2126,27, | 2126,28, | 2126,29, | 2126,30, | 2126,31, | 2126,32, | 2126,33, | 2126,34, | 2126,35, | 2126,36, | 2126,37, | 2126,38, | 2126,39, | 2126,40, | 2126,41, | 2126,42, | 2126,43, | 2126,44, | 2126,45, | 2126,46, | 2126,47, | 2126,48, | 2126,49, | 2126,50, | 2126,51, | 2126,52, | 2126,53, | 2126,54, | 2126,55, | 2126,56, | 2126,57, | 2126,58, | 2126,59, | 2126,60, | 2126,61, | 2126,62, | 2126,63, | 2126,64, | 2126,65, | 2126,66, | 2126,67, | 2126,68, | 2126,69, | 2126,70, | 2126,71, | 2126,72, | 2126,73, | 2126,74, | 2126,75, | 2126,76, | 2126,77, | 2126,78, | 2126,79, | 2126,80, | 2126,81, | 2126,82, | 2126,83, | 2126,84, | 2126,85, | 2127,1, | 2127,2, | 2127,3, | 2127,4, | 2127,5, | 2127,6, | 2127,7, | 2127,8, | 2127,9, | 2127,10, | 2127,11, | 2127,12, | 2127,13, | 2127,14, | 2127,15, | 2127,16, | 2127,17, | 2127,18, | 2127,19, | 2127,20, | 2127,21, | 2127,22, | 2127,23, | 2127,24, | 2127,25, | 2127,26, | 2127,27, | 2127,28, | 2127,29, | 2127,30, | 2127,31, | 2127,32, | 2127,33, | 2127,34, | 2127,35, | 2127,36, | 2127,37, | 2127,38, | 2127,39, | 2127,40, | 2127,41, | 2127,42, | 2127,43, | 2127,44, | 2127,45, | 2127,46, | 2127,47, | 2127,48, | 2127,49, | 2127,50, | 2127,51, | 2127,52, | 2127,53, | 2127,54, | 2127,55, | 2127,56, | 2127,57, | 2127,58, | 2127,59, | 2127,60, | 2127,61, | 2127,62, | 2127,63, | 2127,64, | 2127,65, | 2127,66, | 2127,67, | 2127,68, | 2127,69, | 2127,70, | 2127,71, | 2127,72, | 2127,73, | 2127,74, | 2127,75, | 2127,76, | 2127,77, | 2127,78, | 2127,79, | 2127,80, | 2127,81, | 2127,82, | 2127,83, | 2127,84, | 2127,85, | 2128,1, | 2128,2, | 2128,3, | 2128,4, | 2128,5, | 2128,6, | 2128,7, | 2128,8, | 2128,9, | 2128,10, | 2128,11, | 2128,12, | 2128,13, | 2128,14, | 2128,15, | 2128,16, | 2128,17, | 2128,18, | 2128,19, | 2128,20, | 2128,21, | 2128,22, | 2128,23, | 2128,24, | 2128,25, | 2128,26, | 2128,27, | 2128,28, | 2128,29, | 2128,30, | 2128,31, | 2128,32, | 2128,33, | 2128,34, | 2128,35, | 2128,36, | 2128,37, | 2128,38, | 2128,39, | 2128,40, | 2128,41, | 2128,42, | 2128,43, | 2128,44, | 2128,45, | 2128,46, | 2128,47, | 2128,48, | 2128,49, | 2128,50, | 2128,51, | 2128,52, | 2128,53, | 2128,54, | 2128,55, | 2128,56, | 2128,57, | 2128,58, | 2128,59, | 2128,60, | 2128,61, | 2128,62, | 2128,63, | 2128,64, | 2128,65, | 2128,66, | 2128,67, | 2128,68, | 2128,69, | 2128,70, | 2128,71, | 2128,72, | 2128,73, | 2128,74, | 2128,75, | 2128,76, | 2128,77, | 2128,78, | 2128,79, | 2128,80, | 2128,81, | 2128,82, | 2128,83, | 2128,84, | 2128,85, | 2129,1, | 2129,2, | 2129,3, | 2129,4, | 2129,5, | 2129,6, | 2129,7, | 2129,8, | 2129,9, | 2129,10, | 2129,11, | 2129,12, | 2129,13, | 2129,14, | 2129,15, | 2129,16, | 2129,17, | 2129,18, | 2129,19, | 2129,20, | 2129,21, | 2129,22, | 2129,23, | 2129,24, | 2129,25, | 2129,26, | 2129,27, | 2129,28, | 2129,29, | 2129,30, | 2129,31, | 2129,32, | 2129,33, | 2129,34, | 2129,35, | 2129,36, | 2129,37, | 2129,38, | 2129,39, | 2129,40, | 2129,41, | 2129,42, | 2129,43, | 2129,44, | 2129,45, | 2129,46, | 2129,47, | 2129,48, | 2129,49, | 2129,50, | 2129,51, | 2129,52, | 2129,53, | 2129,54, | 2129,55, | 2129,56, | 2129,57, | 2129,58, | 2129,59, | 2129,60, | 2129,61, | 2129,62, | 2129,63, | 2129,64, | 2129,65, | 2129,66, | 2129,67, | 2129,68, | 2129,69, | 2129,70, | 2129,71, | 2129,72, | 2129,73, | 2129,74, | 2129,75, | 2129,76, | 2129,77, | 2129,78, | 2129,79, | 2129,80, | 2129,81, | 2129,82, | 2129,83, | 2129,84, | 2129,85, | 2130,1, | 2130,2, | 2130,3, | 2130,4, | 2130,5, | 2130,6, | 2130,7, | 2130,8, | 2130,9, | 2130,10, | 2130,11, | 2130,12, | 2130,13, | 2130,14, | 2130,15, | 2130,16, | 2130,17, | 2130,18, | 2130,19, | 2130,20, | 2130,21, | 2130,22, | 2130,23, | 2130,24, | 2130,25, | 2130,26, | 2130,27, | 2130,28, | 2130,29, | 2130,30, | 2130,31, | 2130,32, | 2130,33, | 2130,34, | 2130,35, | 2130,36, | 2130,37, | 2130,38, | 2130,39, | 2130,40, | 2130,41, | 2130,42, | 2130,43, | 2130,44, | 2130,45, | 2130,46, | 2130,47, | 2130,48, | 2130,49, | 2130,50, | 2130,51, | 2130,52, | 2130,53, | 2130,54, | 2130,55, | 2130,56, | 2130,57, | 2130,58, | 2130,59, | 2130,60, | 2130,61, | 2130,62, | 2130,63, | 2130,64, | 2130,65, | 2130,66, | 2130,67, | 2130,68, | 2130,69, | 2130,70, | 2130,71, | 2130,72, | 2130,73, | 2130,74, | 2130,75, | 2130,76, | 2130,77, | 2130,78, | 2130,79, | 2130,80, | 2130,81, | 2130,82, | 2130,83, | 2130,84, | 2130,85, | 2131,1, | 2131,2, | 2131,3, | 2131,4, | 2131,5, | 2131,6, | 2131,7, | 2131,8, | 2131,9, | 2131,10, | 2131,11, | 2131,12, | 2131,13, | 2131,14, | 2131,15, | 2131,16, | 2131,17, | 2131,18, | 2131,19, | 2131,20, | 2131,21, | 2131,22, | 2131,23, | 2131,24, | 2131,25, | 2131,26, | 2131,27, | 2131,28, | 2131,29, | 2131,30, | 2131,31, | 2131,32, | 2131,33, | 2131,34, | 2131,35, | 2131,36, | 2131,37, | 2131,38, | 2131,39, | 2131,40, | 2131,41, | 2131,42, | 2131,43, | 2131,44, | 2131,45, | 2131,46, | 2131,47, | 2131,48, | 2131,49, | 2131,50, | 2131,51, | 2131,52, | 2131,53, | 2131,54, | 2131,55, | 2131,56, | 2131,57, | 2131,58, | 2131,59, | 2131,60, | 2131,61, | 2131,62, | 2131,63, | 2131,64, | 2131,65, | 2131,66, | 2131,67, | 2131,68, | 2131,69, | 2131,70, | 2131,71, | 2131,72, | 2131,73, | 2131,74, | 2131,75, | 2131,76, | 2131,77, | 2131,78, | 2131,79, | 2131,80, | 2131,81, | 2131,82, | 2131,83, | 2131,84, | 2131,85, | 2132,1, | 2132,2, | 2132,3, | 2132,4, | 2132,5, | 2132,6, | 2132,7, | 2132,8, | 2132,9, | 2132,10, | 2132,11, | 2132,12, | 2132,13, | 2132,14, | 2132,15, | 2132,16, | 2132,17, | 2132,18, | 2132,19, | 2132,20, | 2132,21, | 2132,22, | 2132,23, | 2132,24, | 2132,25, | 2132,26, | 2132,27, | 2132,28, | 2132,29, | 2132,30, | 2132,31, | 2132,32, | 2132,33, | 2132,34, | 2132,35, | 2132,36, | 2132,37, | 2132,38, | 2132,39, | 2132,40, | 2132,41, | 2132,42, | 2132,43, | 2132,44, | 2132,45, | 2132,46, | 2132,47, | 2132,48, | 2132,49, | 2132,50, | 2132,51, | 2132,52, | 2132,53, | 2132,54, | 2132,55, | 2132,56, | 2132,57, | 2132,58, | 2132,59, | 2132,60, | 2132,61, | 2132,62, | 2132,63, | 2132,64, | 2132,65, | 2132,66, | 2132,67, | 2132,68, | 2132,69, | 2132,70, | 2132,71, | 2132,72, | 2132,73, | 2132,74, | 2132,75, | 2132,76, | 2132,77, | 2132,78, | 2132,79, | 2132,80, | 2132,81, | 2132,82, | 2132,83, | 2132,84, | 2132,85, | 2133,1, | 2133,2, | 2133,3, | 2133,4, | 2133,5, | 2133,6, | 2133,7, | 2133,8, | 2133,9, | 2133,10, | 2133,11, | 2133,12, | 2133,13, | 2133,14, | 2133,15, | 2133,16, | 2133,17, | 2133,18, | 2133,19, | 2133,20, | 2133,21, | 2133,22, | 2133,23, | 2133,24, | 2133,25, | 2133,26, | 2133,27, | 2133,28, | 2133,29, | 2133,30, | 2133,31, | 2133,32, | 2133,33, | 2133,34, | 2133,35, | 2133,36, | 2133,37, | 2133,38, | 2133,39, | 2133,40, | 2133,41, | 2133,42, | 2133,43, | 2133,44, | 2133,45, | 2133,46, | 2133,47, | 2133,48, | 2133,49, | 2133,50, | 2133,51, | 2133,52, | 2133,53, | 2133,54, | 2133,55, | 2133,56, | 2133,57, | 2133,58, | 2133,59, | 2133,60, | 2133,61, | 2133,62, | 2133,63, | 2133,64, | 2133,65, | 2133,66, | 2133,67, | 2133,68, | 2133,69, | 2133,70, | 2133,71, | 2133,72, | 2133,73, | 2133,74, | 2133,75, | 2133,76, | 2133,77, | 2133,78, | 2133,79, | 2133,80, | 2133,81, | 2133,82, | 2133,83, | 2133,84, | 2133,85, | 2134,1, | 2134,2, | 2134,3, | 2134,4, | 2134,5, | 2134,6, | 2134,7, | 2134,8, | 2134,9, | 2134,10, | 2134,11, | 2134,12, | 2134,13, | 2134,14, | 2134,15, | 2134,16, | 2134,17, | 2134,18, | 2134,19, | 2134,20, | 2134,21, | 2134,22, | 2134,23, | 2134,24, | 2134,25, | 2134,26, | 2134,27, | 2134,28, | 2134,29, | 2134,30, | 2134,31, | 2134,32, | 2134,33, | 2134,34, | 2134,35, | 2134,36, | 2134,37, | 2134,38, | 2134,39, | 2134,40, | 2134,41, | 2134,42, | 2134,43, | 2134,44, | 2134,45, | 2134,46, | 2134,47, | 2134,48, | 2134,49, | 2134,50, | 2134,51, | 2134,52, | 2134,53, | 2134,54, | 2134,55, | 2134,56, | 2134,57, | 2134,58, | 2134,59, | 2134,60, | 2134,61, | 2134,62, | 2134,63, | 2134,64, | 2134,65, | 2134,66, | 2134,67, | 2134,68, | 2134,69, | 2134,70, | 2134,71, | 2134,72, | 2134,73, | 2134,74, | 2134,75, | 2134,76, | 2134,77, | 2134,78, | 2134,79, | 2134,80, | 2134,81, | 2134,82, | 2134,83, | 2134,84, | 2134,85, | 2135,1, | 2135,2, | 2135,3, | 2135,4, | 2135,5, | 2135,6, | 2135,7, | 2135,8, | 2135,9, | 2135,10, | 2135,11, | 2135,12, | 2135,13, | 2135,14, | 2135,15, | 2135,16, | 2135,17, | 2135,18, | 2135,19, | 2135,20, | 2135,21, | 2135,22, | 2135,23, | 2135,24, | 2135,25, | 2135,26, | 2135,27, | 2135,28, | 2135,29, | 2135,30, | 2135,31, | 2135,32, | 2135,33, | 2135,34, | 2135,35, | 2135,36, | 2135,37, | 2135,38, | 2135,39, | 2135,40, | 2135,41, | 2135,42, | 2135,43, | 2135,44, | 2135,45, | 2135,46, | 2135,47, | 2135,48, | 2135,49, | 2135,50, | 2135,51, | 2135,52, | 2135,53, | 2135,54, | 2135,55, | 2135,56, | 2135,57, | 2135,58, | 2135,59, | 2135,60, | 2135,61, | 2135,62, | 2135,63, | 2135,64, | 2135,65, | 2135,66, | 2135,67, | 2135,68, | 2135,69, | 2135,70, | 2135,71, | 2135,72, | 2135,73, | 2135,74, | 2135,75, | 2135,76, | 2135,77, | 2135,78, | 2135,79, | 2135,80, | 2135,81, | 2135,82, | 2135,83, | 2135,84, | 2135,85, | 2136,1, | 2136,2, | 2136,3, | 2136,4, | 2136,5, | 2136,6, | 2136,7, | 2136,8, | 2136,9, | 2136,10, | 2136,11, | 2136,12, | 2136,13, | 2136,14, | 2136,15, | 2136,16, | 2136,17, | 2136,18, | 2136,19, | 2136,20, | 2136,21, | 2136,22, | 2136,23, | 2136,24, | 2136,25, | 2136,26, | 2136,27, | 2136,28, | 2136,29, | 2136,30, | 2136,31, | 2136,32, | 2136,33, | 2136,34, | 2136,35, | 2136,36, | 2136,37, | 2136,38, | 2136,39, | 2136,40, | 2136,41, | 2136,42, | 2136,43, | 2136,44, | 2136,45, | 2136,46, | 2136,47, | 2136,48, | 2136,49, | 2136,50, | 2136,51, | 2136,52, | 2136,53, | 2136,54, | 2136,55, | 2136,56, | 2136,57, | 2136,58, | 2136,59, | 2136,60, | 2136,61, | 2136,62, | 2136,63, | 2136,64, | 2136,65, | 2136,66, | 2136,67, | 2136,68, | 2136,69, | 2136,70, | 2136,71, | 2136,72, | 2136,73, | 2136,74, | 2136,75, | 2136,76, | 2136,77, | 2136,78, | 2136,79, | 2136,80, | 2136,81, | 2136,82, | 2136,83, | 2136,84, | 2136,85, | 2137,1, | 2137,2, | 2137,3, | 2137,4, | 2137,5, | 2137,6, | 2137,7, | 2137,8, | 2137,9, | 2137,10, | 2137,11, | 2137,12, | 2137,13, | 2137,14, | 2137,15, | 2137,16, | 2137,17, | 2137,18, | 2137,19, | 2137,20, | 2137,21, | 2137,22, | 2137,23, | 2137,24, | 2137,25, | 2137,26, | 2137,27, | 2137,28, | 2137,29, | 2137,30, | 2137,31, | 2137,32, | 2137,33, | 2137,34, | 2137,35, | 2137,36, | 2137,37, | 2137,38, | 2137,39, | 2137,40, | 2137,41, | 2137,42, | 2137,43, | 2137,44, | 2137,45, | 2137,46, | 2137,47, | 2137,48, | 2137,49, | 2137,50, | 2137,51, | 2137,52, | 2137,53, | 2137,54, | 2137,55, | 2137,56, | 2137,57, | 2137,58, | 2137,59, | 2137,60, | 2137,61, | 2137,62, | 2137,63, | 2137,64, | 2137,65, | 2137,66, | 2137,67, | 2137,68, | 2137,69, | 2137,70, | 2137,71, | 2137,72, | 2137,73, | 2137,74, | 2137,75, | 2137,76, | 2137,77, | 2137,78, | 2137,79, | 2137,80, | 2137,81, | 2137,82, | 2137,83, | 2137,84, | 2137,85, | 2138,1, | 2138,2, | 2138,3, | 2138,4, | 2138,5, | 2138,6, | 2138,7, | 2138,8, | 2138,9, | 2138,10, | 2138,11, | 2138,12, | 2138,13, | 2138,14, | 2138,15, | 2138,16, | 2138,17, | 2138,18, | 2138,19, | 2138,20, | 2138,21, | 2138,22, | 2138,23, | 2138,24, | 2138,25, | 2138,26, | 2138,27, | 2138,28, | 2138,29, | 2138,30, | 2138,31, | 2138,32, | 2138,33, | 2138,34, | 2138,35, | 2138,36, | 2138,37, | 2138,38, | 2138,39, | 2138,40, | 2138,41, | 2138,42, | 2138,43, | 2138,44, | 2138,45, | 2138,46, | 2138,47, | 2138,48, | 2138,49, | 2138,50, | 2138,51, | 2138,52, | 2138,53, | 2138,54, | 2138,55, | 2138,56, | 2138,57, | 2138,58, | 2138,59, | 2138,60, | 2138,61, | 2138,62, | 2138,63, | 2138,64, | 2138,65, | 2138,66, | 2138,67, | 2138,68, | 2138,69, | 2138,70, | 2138,71, | 2138,72, | 2138,73, | 2138,74, | 2138,75, | 2138,76, | 2138,77, | 2138,78, | 2138,79, | 2138,80, | 2138,81, | 2138,82, | 2138,83, | 2138,84, | 2138,85, | 2139,1, | 2139,2, | 2139,3, | 2139,4, | 2139,5, | 2139,6, | 2139,7, | 2139,8, | 2139,9, | 2139,10, | 2139,11, | 2139,12, | 2139,13, | 2139,14, | 2139,15, | 2139,16, | 2139,17, | 2139,18, | 2139,19, | 2139,20, | 2139,21, | 2139,22, | 2139,23, | 2139,24, | 2139,25, | 2139,26, | 2139,27, | 2139,28, | 2139,29, | 2139,30, | 2139,31, | 2139,32, | 2139,33, | 2139,34, | 2139,35, | 2139,36, | 2139,37, | 2139,38, | 2139,39, | 2139,40, | 2139,41, | 2139,42, | 2139,43, | 2139,44, | 2139,45, | 2139,46, | 2139,47, | 2139,48, | 2139,49, | 2139,50, | 2139,51, | 2139,52, | 2139,53, | 2139,54, | 2139,55, | 2139,56, | 2139,57, | 2139,58, | 2139,59, | 2139,60, | 2139,61, | 2139,62, | 2139,63, | 2139,64, | 2139,65, | 2139,66, | 2139,67, | 2139,68, | 2139,69, | 2139,70, | 2139,71, | 2139,72, | 2139,73, | 2139,74, | 2139,75, | 2139,76, | 2139,77, | 2139,78, | 2139,79, | 2139,80, | 2139,81, | 2139,82, | 2139,83, | 2139,84, | 2139,85, | 2140,1, | 2140,2, | 2140,3, | 2140,4, | 2140,5, | 2140,6, | 2140,7, | 2140,8, | 2140,9, | 2140,10, | 2140,11, | 2140,12, | 2140,13, | 2140,14, | 2140,15, | 2140,16, | 2140,17, | 2140,18, | 2140,19, | 2140,20, | 2140,21, | 2140,22, | 2140,23, | 2140,24, | 2140,25, | 2140,26, | 2140,27, | 2140,28, | 2140,29, | 2140,30, | 2140,31, | 2140,32, | 2140,33, | 2140,34, | 2140,35, | 2140,36, | 2140,37, | 2140,38, | 2140,39, | 2140,40, | 2140,41, | 2140,42, | 2140,43, | 2140,44, | 2140,45, | 2140,46, | 2140,47, | 2140,48, | 2140,49, | 2140,50, | 2140,51, | 2140,52, | 2140,53, | 2140,54, | 2140,55, | 2140,56, | 2140,57, | 2140,58, | 2140,59, | 2140,60, | 2140,61, | 2140,62, | 2140,63, | 2140,64, | 2140,65, | 2140,66, | 2140,67, | 2140,68, | 2140,69, | 2140,70, | 2140,71, | 2140,72, | 2140,73, | 2140,74, | 2140,75, | 2140,76, | 2140,77, | 2140,78, | 2140,79, | 2140,80, | 2140,81, | 2140,82, | 2140,83, | 2140,84, | 2140,85, | 2141,1, | 2141,2, | 2141,3, | 2141,4, | 2141,5, | 2141,6, | 2141,7, | 2141,8, | 2141,9, | 2141,10, | 2141,11, | 2141,12, | 2141,13, | 2141,14, | 2141,15, | 2141,16, | 2141,17, | 2141,18, | 2141,19, | 2141,20, | 2141,21, | 2141,22, | 2141,23, | 2141,24, | 2141,25, | 2141,26, | 2141,27, | 2141,28, | 2141,29, | 2141,30, | 2141,31, | 2141,32, | 2141,33, | 2141,34, | 2141,35, | 2141,36, | 2141,37, | 2141,38, | 2141,39, | 2141,40, | 2141,41, | 2141,42, | 2141,43, | 2141,44, | 2141,45, | 2141,46, | 2141,47, | 2141,48, | 2141,49, | 2141,50, | 2141,51, | 2141,52, | 2141,53, | 2141,54, | 2141,55, | 2141,56, | 2141,57, | 2141,58, | 2141,59, | 2141,60, | 2141,61, | 2141,62, | 2141,63, | 2141,64, | 2141,65, | 2141,66, | 2141,67, | 2141,68, | 2141,69, | 2141,70, | 2141,71, | 2141,72, | 2141,73, | 2141,74, | 2141,75, | 2141,76, | 2141,77, | 2141,78, | 2141,79, | 2141,80, | 2141,81, | 2141,82, | 2141,83, | 2141,84, | 2141,85, | 2142,1, | 2142,2, | 2142,3, | 2142,4, | 2142,5, | 2142,6, | 2142,7, | 2142,8, | 2142,9, | 2142,10, | 2142,11, | 2142,12, | 2142,13, | 2142,14, | 2142,15, | 2142,16, | 2142,17, | 2142,18, | 2142,19, | 2142,20, | 2142,21, | 2142,22, | 2142,23, | 2142,24, | 2142,25, | 2142,26, | 2142,27, | 2142,28, | 2142,29, | 2142,30, | 2142,31, | 2142,32, | 2142,33, | 2142,34, | 2142,35, | 2142,36, | 2142,37, | 2142,38, | 2142,39, | 2142,40, | 2142,41, | 2142,42, | 2142,43, | 2142,44, | 2142,45, | 2142,46, | 2142,47, | 2142,48, | 2142,49, | 2142,50, | 2142,51, | 2142,52, | 2142,53, | 2142,54, | 2142,55, | 2142,56, | 2142,57, | 2142,58, | 2142,59, | 2142,60, | 2142,61, | 2142,62, | 2142,63, | 2142,64, | 2142,65, | 2142,66, | 2142,67, | 2142,68, | 2142,69, | 2142,70, | 2142,71, | 2142,72, | 2142,73, | 2142,74, | 2142,75, | 2142,76, | 2142,77, | 2142,78, | 2142,79, | 2142,80, | 2142,81, | 2142,82, | 2142,83, | 2142,84, | 2142,85, | 2143,1, | 2143,2, | 2143,3, | 2143,4, | 2143,5, | 2143,6, | 2143,7, | 2143,8, | 2143,9, | 2143,10, | 2143,11, | 2143,12, | 2143,13, | 2143,14, | 2143,15, | 2143,16, | 2143,17, | 2143,18, | 2143,19, | 2143,20, | 2143,21, | 2143,22, | 2143,23, | 2143,24, | 2143,25, | 2143,26, | 2143,27, | 2143,28, | 2143,29, | 2143,30, | 2143,31, | 2143,32, | 2143,33, | 2143,34, | 2143,35, | 2143,36, | 2143,37, | 2143,38, | 2143,39, | 2143,40, | 2143,41, | 2143,42, | 2143,43, | 2143,44, | 2143,45, | 2143,46, | 2143,47, | 2143,48, | 2143,49, | 2143,50, | 2143,51, | 2143,52, | 2143,53, | 2143,54, | 2143,55, | 2143,56, | 2143,57, | 2143,58, | 2143,59, | 2143,60, | 2143,61, | 2143,62, | 2143,63, | 2143,64, | 2143,65, | 2143,66, | 2143,67, | 2143,68, | 2143,69, | 2143,70, | 2143,71, | 2143,72, | 2143,73, | 2143,74, | 2143,75, | 2143,76, | 2143,77, | 2143,78, | 2143,79, | 2143,80, | 2143,81, | 2143,82, | 2143,83, | 2143,84, | 2143,85, | 2144,1, | 2144,2, | 2144,3, | 2144,4, | 2144,5, | 2144,6, | 2144,7, | 2144,8, | 2144,9, | 2144,10, | 2144,11, | 2144,12, | 2144,13, | 2144,14, | 2144,15, | 2144,16, | 2144,17, | 2144,18, | 2144,19, | 2144,20, | 2144,21, | 2144,22, | 2144,23, | 2144,24, | 2144,25, | 2144,26, | 2144,27, | 2144,28, | 2144,29, | 2144,30, | 2144,31, | 2144,32, | 2144,33, | 2144,34, | 2144,35, | 2144,36, | 2144,37, | 2144,38, | 2144,39, | 2144,40, | 2144,41, | 2144,42, | 2144,43, | 2144,44, | 2144,45, | 2144,46, | 2144,47, | 2144,48, | 2144,49, | 2144,50, | 2144,51, | 2144,52, | 2144,53, | 2144,54, | 2144,55, | 2144,56, | 2144,57, | 2144,58, | 2144,59, | 2144,60, | 2144,61, | 2144,62, | 2144,63, | 2144,64, | 2144,65, | 2144,66, | 2144,67, | 2144,68, | 2144,69, | 2144,70, | 2144,71, | 2144,72, | 2144,73, | 2144,74, | 2144,75, | 2144,76, | 2144,77, | 2144,78, | 2144,79, | 2144,80, | 2144,81, | 2144,82, | 2144,83, | 2144,84, | 2144,85, | 2145,1, | 2145,2, | 2145,3, | 2145,4, | 2145,5, | 2145,6, | 2145,7, | 2145,8, | 2145,9, | 2145,10, | 2145,11, | 2145,12, | 2145,13, | 2145,14, | 2145,15, | 2145,16, | 2145,17, | 2145,18, | 2145,19, | 2145,20, | 2145,21, | 2145,22, | 2145,23, | 2145,24, | 2145,25, | 2145,26, | 2145,27, | 2145,28, | 2145,29, | 2145,30, | 2145,31, | 2145,32, | 2145,33, | 2145,34, | 2145,35, | 2145,36, | 2145,37, | 2145,38, | 2145,39, | 2145,40, | 2145,41, | 2145,42, | 2145,43, | 2145,44, | 2145,45, | 2145,46, | 2145,47, | 2145,48, | 2145,49, | 2145,50, | 2145,51, | 2145,52, | 2145,53, | 2145,54, | 2145,55, | 2145,56, | 2145,57, | 2145,58, | 2145,59, | 2145,60, | 2145,61, | 2145,62, | 2145,63, | 2145,64, | 2145,65, | 2145,66, | 2145,67, | 2145,68, | 2145,69, | 2145,70, | 2145,71, | 2145,72, | 2145,73, | 2145,74, | 2145,75, | 2145,76, | 2145,77, | 2145,78, | 2145,79, | 2145,80, | 2145,81, | 2145,82, | 2145,83, | 2145,84, | 2145,85, | 2146,1, | 2146,2, | 2146,3, | 2146,4, | 2146,5, | 2146,6, | 2146,7, | 2146,8, | 2146,9, | 2146,10, | 2146,11, | 2146,12, | 2146,13, | 2146,14, | 2146,15, | 2146,16, | 2146,17, | 2146,18, | 2146,19, | 2146,20, | 2146,21, | 2146,22, | 2146,23, | 2146,24, | 2146,25, | 2146,26, | 2146,27, | 2146,28, | 2146,29, | 2146,30, | 2146,31, | 2146,32, | 2146,33, | 2146,34, | 2146,35, | 2146,36, | 2146,37, | 2146,38, | 2146,39, | 2146,40, | 2146,41, | 2146,42, | 2146,43, | 2146,44, | 2146,45, | 2146,46, | 2146,47, | 2146,48, | 2146,49, | 2146,50, | 2146,51, | 2146,52, | 2146,53, | 2146,54, | 2146,55, | 2146,56, | 2146,57, | 2146,58, | 2146,59, | 2146,60, | 2146,61, | 2146,62, | 2146,63, | 2146,64, | 2146,65, | 2146,66, | 2146,67, | 2146,68, | 2146,69, | 2146,70, | 2146,71, | 2146,72, | 2146,73, | 2146,74, | 2146,75, | 2146,76, | 2146,77, | 2146,78, | 2146,79, | 2146,80, | 2146,81, | 2146,82, | 2146,83, | 2146,84, | 2146,85, | 2147,1, | 2147,2, | 2147,3, | 2147,4, | 2147,5, | 2147,6, | 2147,7, | 2147,8, | 2147,9, | 2147,10, | 2147,11, | 2147,12, | 2147,13, | 2147,14, | 2147,15, | 2147,16, | 2147,17, | 2147,18, | 2147,19, | 2147,20, | 2147,21, | 2147,22, | 2147,23, | 2147,24, | 2147,25, | 2147,26, | 2147,27, | 2147,28, | 2147,29, | 2147,30, | 2147,31, | 2147,32, | 2147,33, | 2147,34, | 2147,35, | 2147,36, | 2147,37, | 2147,38, | 2147,39, | 2147,40, | 2147,41, | 2147,42, | 2147,43, | 2147,44, | 2147,45, | 2147,46, | 2147,47, | 2147,48, | 2147,49, | 2147,50, | 2147,51, | 2147,52, | 2147,53, | 2147,54, | 2147,55, | 2147,56, | 2147,57, | 2147,58, | 2147,59, | 2147,60, | 2147,61, | 2147,62, | 2147,63, | 2147,64, | 2147,65, | 2147,66, | 2147,67, | 2147,68, | 2147,69, | 2147,70, | 2147,71, | 2147,72, | 2147,73, | 2147,74, | 2147,75, | 2147,76, | 2147,77, | 2147,78, | 2147,79, | 2147,80, | 2147,81, | 2147,82, | 2147,83, | 2147,84, | 2147,85, | 2148,1, | 2148,2, | 2148,3, | 2148,4, | 2148,5, | 2148,6, | 2148,7, | 2148,8, | 2148,9, | 2148,10, | 2148,11, | 2148,12, | 2148,13, | 2148,14, | 2148,15, | 2148,16, | 2148,17, | 2148,18, | 2148,19, | 2148,20, | 2148,21, | 2148,22, | 2148,23, | 2148,24, | 2148,25, | 2148,26, | 2148,27, | 2148,28, | 2148,29, | 2148,30, | 2148,31, | 2148,32, | 2148,33, | 2148,34, | 2148,35, | 2148,36, | 2148,37, | 2148,38, | 2148,39, | 2148,40, | 2148,41, | 2148,42, | 2148,43, | 2148,44, | 2148,45, | 2148,46, | 2148,47, | 2148,48, | 2148,49, | 2148,50, | 2148,51, | 2148,52, | 2148,53, | 2148,54, | 2148,55, | 2148,56, | 2148,57, | 2148,58, | 2148,59, | 2148,60, | 2148,61, | 2148,62, | 2148,63, | 2148,64, | 2148,65, | 2148,66, | 2148,67, | 2148,68, | 2148,69, | 2148,70, | 2148,71, | 2148,72, | 2148,73, | 2148,74, | 2148,75, | 2148,76, | 2148,77, | 2148,78, | 2148,79, | 2148,80, | 2148,81, | 2148,82, | 2148,83, | 2148,84, | 2148,85, | 2149,1, | 2149,2, | 2149,3, | 2149,4, | 2149,5, | 2149,6, | 2149,7, | 2149,8, | 2149,9, | 2149,10, | 2149,11, | 2149,12, | 2149,13, | 2149,14, | 2149,15, | 2149,16, | 2149,17, | 2149,18, | 2149,19, | 2149,20, | 2149,21, | 2149,22, | 2149,23, | 2149,24, | 2149,25, | 2149,26, | 2149,27, | 2149,28, | 2149,29, | 2149,30, | 2149,31, | 2149,32, | 2149,33, | 2149,34, | 2149,35, | 2149,36, | 2149,37, | 2149,38, | 2149,39, | 2149,40, | 2149,41, | 2149,42, | 2149,43, | 2149,44, | 2149,45, | 2149,46, | 2149,47, | 2149,48, | 2149,49, | 2149,50, | 2149,51, | 2149,52, | 2149,53, | 2149,54, | 2149,55, | 2149,56, | 2149,57, | 2149,58, | 2149,59, | 2149,60, | 2149,61, | 2149,62, | 2149,63, | 2149,64, | 2149,65, | 2149,66, | 2149,67, | 2149,68, | 2149,69, | 2149,70, | 2149,71, | 2149,72, | 2149,73, | 2149,74, | 2149,75, | 2149,76, | 2149,77, | 2149,78, | 2149,79, | 2149,80, | 2149,81, | 2149,82, | 2149,83, | 2149,84, | 2149,85, | 2150,1, | 2150,2, | 2150,3, | 2150,4, | 2150,5, | 2150,6, | 2150,7, | 2150,8, | 2150,9, | 2150,10, | 2150,11, | 2150,12, | 2150,13, | 2150,14, | 2150,15, | 2150,16, | 2150,17, | 2150,18, | 2150,19, | 2150,20, | 2150,21, | 2150,22, | 2150,23, | 2150,24, | 2150,25, | 2150,26, | 2150,27, | 2150,28, | 2150,29, | 2150,30, | 2150,31, | 2150,32, | 2150,33, | 2150,34, | 2150,35, | 2150,36, | 2150,37, | 2150,38, | 2150,39, | 2150,40, | 2150,41, | 2150,42, | 2150,43, | 2150,44, | 2150,45, | 2150,46, | 2150,47, | 2150,48, | 2150,49, | 2150,50, | 2150,51, | 2150,52, | 2150,53, | 2150,54, | 2150,55, | 2150,56, | 2150,57, | 2150,58, | 2150,59, | 2150,60, | 2150,61, | 2150,62, | 2150,63, | 2150,64, | 2150,65, | 2150,66, | 2150,67, | 2150,68, | 2150,69, | 2150,70, | 2150,71, | 2150,72, | 2150,73, | 2150,74, | 2150,75, | 2150,76, | 2150,77, | 2150,78, | 2150,79, | 2150,80, | 2150,81, | 2150,82, | 2150,83, | 2150,84, | 2150,85, | 2151,1, | 2151,2, | 2151,3, | 2151,4, | 2151,5, | 2151,6, | 2151,7, | 2151,8, | 2151,9, | 2151,10, | 2151,11, | 2151,12, | 2151,13, | 2151,14, | 2151,15, | 2151,16, | 2151,17, | 2151,18, | 2151,19, | 2151,20, | 2151,21, | 2151,22, | 2151,23, | 2151,24, | 2151,25, | 2151,26, | 2151,27, | 2151,28, | 2151,29, | 2151,30, | 2151,31, | 2151,32, | 2151,33, | 2151,34, | 2151,35, | 2151,36, | 2151,37, | 2151,38, | 2151,39, | 2151,40, | 2151,41, | 2151,42, | 2151,43, | 2151,44, | 2151,45, | 2151,46, | 2151,47, | 2151,48, | 2151,49, | 2151,50, | 2151,51, | 2151,52, | 2151,53, | 2151,54, | 2151,55, | 2151,56, | 2151,57, | 2151,58, | 2151,59, | 2151,60, | 2151,61, | 2151,62, | 2151,63, | 2151,64, | 2151,65, | 2151,66, | 2151,67, | 2151,68, | 2151,69, | 2151,70, | 2151,71, | 2151,72, | 2151,73, | 2151,74, | 2151,75, | 2151,76, | 2151,77, | 2151,78, | 2151,79, | 2151,80, | 2151,81, | 2151,82, | 2151,83, | 2151,84, | 2151,85, | 2152,1, | 2152,2, | 2152,3, | 2152,4, | 2152,5, | 2152,6, | 2152,7, | 2152,8, | 2152,9, | 2152,10, | 2152,11, | 2152,12, | 2152,13, | 2152,14, | 2152,15, | 2152,16, | 2152,17, | 2152,18, | 2152,19, | 2152,20, | 2152,21, | 2152,22, | 2152,23, | 2152,24, | 2152,25, | 2152,26, | 2152,27, | 2152,28, | 2152,29, | 2152,30, | 2152,31, | 2152,32, | 2152,33, | 2152,34, | 2152,35, | 2152,36, | 2152,37, | 2152,38, | 2152,39, | 2152,40, | 2152,41, | 2152,42, | 2152,43, | 2152,44, | 2152,45, | 2152,46, | 2152,47, | 2152,48, | 2152,49, | 2152,50, | 2152,51, | 2152,52, | 2152,53, | 2152,54, | 2152,55, | 2152,56, | 2152,57, | 2152,58, | 2152,59, | 2152,60, | 2152,61, | 2152,62, | 2152,63, | 2152,64, | 2152,65, | 2152,66, | 2152,67, | 2152,68, | 2152,69, | 2152,70, | 2152,71, | 2152,72, | 2152,73, | 2152,74, | 2152,75, | 2152,76, | 2152,77, | 2152,78, | 2152,79, | 2152,80, | 2152,81, | 2152,82, | 2152,83, | 2152,84, | 2152,85, | 2153,1, | 2153,2, | 2153,3, | 2153,4, | 2153,5, | 2153,6, | 2153,7, | 2153,8, | 2153,9, | 2153,10, | 2153,11, | 2153,12, | 2153,13, | 2153,14, | 2153,15, | 2153,16, | 2153,17, | 2153,18, | 2153,19, | 2153,20, | 2153,21, | 2153,22, | 2153,23, | 2153,24, | 2153,25, | 2153,26, | 2153,27, | 2153,28, | 2153,29, | 2153,30, | 2153,31, | 2153,32, | 2153,33, | 2153,34, | 2153,35, | 2153,36, | 2153,37, | 2153,38, | 2153,39, | 2153,40, | 2153,41, | 2153,42, | 2153,43, | 2153,44, | 2153,45, | 2153,46, | 2153,47, | 2153,48, | 2153,49, | 2153,50, | 2153,51, | 2153,52, | 2153,53, | 2153,54, | 2153,55, | 2153,56, | 2153,57, | 2153,58, | 2153,59, | 2153,60, | 2153,61, | 2153,62, | 2153,63, | 2153,64, | 2153,65, | 2153,66, | 2153,67, | 2153,68, | 2153,69, | 2153,70, | 2153,71, | 2153,72, | 2153,73, | 2153,74, | 2153,75, | 2153,76, | 2153,77, | 2153,78, | 2153,79, | 2153,80, | 2153,81, | 2153,82, | 2153,83, | 2153,84, | 2153,85, | 2154,1, | 2154,2, | 2154,3, | 2154,4, | 2154,5, | 2154,6, | 2154,7, | 2154,8, | 2154,9, | 2154,10, | 2154,11, | 2154,12, | 2154,13, | 2154,14, | 2154,15, | 2154,16, | 2154,17, | 2154,18, | 2154,19, | 2154,20, | 2154,21, | 2154,22, | 2154,23, | 2154,24, | 2154,25, | 2154,26, | 2154,27, | 2154,28, | 2154,29, | 2154,30, | 2154,31, | 2154,32, | 2154,33, | 2154,34, | 2154,35, | 2154,36, | 2154,37, | 2154,38, | 2154,39, | 2154,40, | 2154,41, | 2154,42, | 2154,43, | 2154,44, | 2154,45, | 2154,46, | 2154,47, | 2154,48, | 2154,49, | 2154,50, | 2154,51, | 2154,52, | 2154,53, | 2154,54, | 2154,55, | 2154,56, | 2154,57, | 2154,58, | 2154,59, | 2154,60, | 2154,61, | 2154,62, | 2154,63, | 2154,64, | 2154,65, | 2154,66, | 2154,67, | 2154,68, | 2154,69, | 2154,70, | 2154,71, | 2154,72, | 2154,73, | 2154,74, | 2154,75, | 2154,76, | 2154,77, | 2154,78, | 2154,79, | 2154,80, | 2154,81, | 2154,82, | 2154,83, | 2154,84, | 2154,85, | 2155,1, | 2155,2, | 2155,3, | 2155,4, | 2155,5, | 2155,6, | 2155,7, | 2155,8, | 2155,9, | 2155,10, | 2155,11, | 2155,12, | 2155,13, | 2155,14, | 2155,15, | 2155,16, | 2155,17, | 2155,18, | 2155,19, | 2155,20, | 2155,21, | 2155,22, | 2155,23, | 2155,24, | 2155,25, | 2155,26, | 2155,27, | 2155,28, | 2155,29, | 2155,30, | 2155,31, | 2155,32, | 2155,33, | 2155,34, | 2155,35, | 2155,36, | 2155,37, | 2155,38, | 2155,39, | 2155,40, | 2155,41, | 2155,42, | 2155,43, | 2155,44, | 2155,45, | 2155,46, | 2155,47, | 2155,48, | 2155,49, | 2155,50, | 2155,51, | 2155,52, | 2155,53, | 2155,54, | 2155,55, | 2155,56, | 2155,57, | 2155,58, | 2155,59, | 2155,60, | 2155,61, | 2155,62, | 2155,63, | 2155,64, | 2155,65, | 2155,66, | 2155,67, | 2155,68, | 2155,69, | 2155,70, | 2155,71, | 2155,72, | 2155,73, | 2155,74, | 2155,75, | 2155,76, | 2155,77, | 2155,78, | 2155,79, | 2155,80, | 2155,81, | 2155,82, | 2155,83, | 2155,84, | 2155,85, | 2156,1, | 2156,2, | 2156,3, | 2156,4, | 2156,5, | 2156,6, | 2156,7, | 2156,8, | 2156,9, | 2156,10, | 2156,11, | 2156,12, | 2156,13, | 2156,14, | 2156,15, | 2156,16, | 2156,17, | 2156,18, | 2156,19, | 2156,20, | 2156,21, | 2156,22, | 2156,23, | 2156,24, | 2156,25, | 2156,26, | 2156,27, | 2156,28, | 2156,29, | 2156,30, | 2156,31, | 2156,32, | 2156,33, | 2156,34, | 2156,35, | 2156,36, | 2156,37, | 2156,38, | 2156,39, | 2156,40, | 2156,41, | 2156,42, | 2156,43, | 2156,44, | 2156,45, | 2156,46, | 2156,47, | 2156,48, | 2156,49, | 2156,50, | 2156,51, | 2156,52, | 2156,53, | 2156,54, | 2156,55, | 2156,56, | 2156,57, | 2156,58, | 2156,59, | 2156,60, | 2156,61, | 2156,62, | 2156,63, | 2156,64, | 2156,65, | 2156,66, | 2156,67, | 2156,68, | 2156,69, | 2156,70, | 2156,71, | 2156,72, | 2156,73, | 2156,74, | 2156,75, | 2156,76, | 2156,77, | 2156,78, | 2156,79, | 2156,80, | 2156,81, | 2156,82, | 2156,83, | 2156,84, | 2156,85, | 2157,1, | 2157,2, | 2157,3, | 2157,4, | 2157,5, | 2157,6, | 2157,7, | 2157,8, | 2157,9, | 2157,10, | 2157,11, | 2157,12, | 2157,13, | 2157,14, | 2157,15, | 2157,16, | 2157,17, | 2157,18, | 2157,19, | 2157,20, | 2157,21, | 2157,22, | 2157,23, | 2157,24, | 2157,25, | 2157,26, | 2157,27, | 2157,28, | 2157,29, | 2157,30, | 2157,31, | 2157,32, | 2157,33, | 2157,34, | 2157,35, | 2157,36, | 2157,37, | 2157,38, | 2157,39, | 2157,40, | 2157,41, | 2157,42, | 2157,43, | 2157,44, | 2157,45, | 2157,46, | 2157,47, | 2157,48, | 2157,49, | 2157,50, | 2157,51, | 2157,52, | 2157,53, | 2157,54, | 2157,55, | 2157,56, | 2157,57, | 2157,58, | 2157,59, | 2157,60, | 2157,61, | 2157,62, | 2157,63, | 2157,64, | 2157,65, | 2157,66, | 2157,67, | 2157,68, | 2157,69, | 2157,70, | 2157,71, | 2157,72, | 2157,73, | 2157,74, | 2157,75, | 2157,76, | 2157,77, | 2157,78, | 2157,79, | 2157,80, | 2157,81, | 2157,82, | 2157,83, | 2157,84, | 2157,85, | 2158,1, | 2158,2, | 2158,3, | 2158,4, | 2158,5, | 2158,6, | 2158,7, | 2158,8, | 2158,9, | 2158,10, | 2158,11, | 2158,12, | 2158,13, | 2158,14, | 2158,15, | 2158,16, | 2158,17, | 2158,18, | 2158,19, | 2158,20, | 2158,21, | 2158,22, | 2158,23, | 2158,24, | 2158,25, | 2158,26, | 2158,27, | 2158,28, | 2158,29, | 2158,30, | 2158,31, | 2158,32, | 2158,33, | 2158,34, | 2158,35, | 2158,36, | 2158,37, | 2158,38, | 2158,39, | 2158,40, | 2158,41, | 2158,42, | 2158,43, | 2158,44, | 2158,45, | 2158,46, | 2158,47, | 2158,48, | 2158,49, | 2158,50, | 2158,51, | 2158,52, | 2158,53, | 2158,54, | 2158,55, | 2158,56, | 2158,57, | 2158,58, | 2158,59, | 2158,60, | 2158,61, | 2158,62, | 2158,63, | 2158,64, | 2158,65, | 2158,66, | 2158,67, | 2158,68, | 2158,69, | 2158,70, | 2158,71, | 2158,72, | 2158,73, | 2158,74, | 2158,75, | 2158,76, | 2158,77, | 2158,78, | 2158,79, | 2158,80, | 2158,81, | 2158,82, | 2158,83, | 2158,84, | 2158,85, | 2159,1, | 2159,2, | 2159,3, | 2159,4, | 2159,5, | 2159,6, | 2159,7, | 2159,8, | 2159,9, | 2159,10, | 2159,11, | 2159,12, | 2159,13, | 2159,14, | 2159,15, | 2159,16, | 2159,17, | 2159,18, | 2159,19, | 2159,20, | 2159,21, | 2159,22, | 2159,23, | 2159,24, | 2159,25, | 2159,26, | 2159,27, | 2159,28, | 2159,29, | 2159,30, | 2159,31, | 2159,32, | 2159,33, | 2159,34, | 2159,35, | 2159,36, | 2159,37, | 2159,38, | 2159,39, | 2159,40, | 2159,41, | 2159,42, | 2159,43, | 2159,44, | 2159,45, | 2159,46, | 2159,47, | 2159,48, | 2159,49, | 2159,50, | 2159,51, | 2159,52, | 2159,53, | 2159,54, | 2159,55, | 2159,56, | 2159,57, | 2159,58, | 2159,59, | 2159,60, | 2159,61, | 2159,62, | 2159,63, | 2159,64, | 2159,65, | 2159,66, | 2159,67, | 2159,68, | 2159,69, | 2159,70, | 2159,71, | 2159,72, | 2159,73, | 2159,74, | 2159,75, | 2159,76, | 2159,77, | 2159,78, | 2159,79, | 2159,80, | 2159,81, | 2159,82, | 2159,83, | 2159,84, | 2159,85, | 2160,1, | 2160,2, | 2160,3, | 2160,4, | 2160,5, | 2160,6, | 2160,7, | 2160,8, | 2160,9, | 2160,10, | 2160,11, | 2160,12, | 2160,13, | 2160,14, | 2160,15, | 2160,16, | 2160,17, | 2160,18, | 2160,19, | 2160,20, | 2160,21, | 2160,22, | 2160,23, | 2160,24, | 2160,25, | 2160,26, | 2160,27, | 2160,28, | 2160,29, | 2160,30, | 2160,31, | 2160,32, | 2160,33, | 2160,34, | 2160,35, | 2160,36, | 2160,37, | 2160,38, | 2160,39, | 2160,40, | 2160,41, | 2160,42, | 2160,43, | 2160,44, | 2160,45, | 2160,46, | 2160,47, | 2160,48, | 2160,49, | 2160,50, | 2160,51, | 2160,52, | 2160,53, | 2160,54, | 2160,55, | 2160,56, | 2160,57, | 2160,58, | 2160,59, | 2160,60, | 2160,61, | 2160,62, | 2160,63, | 2160,64, | 2160,65, | 2160,66, | 2160,67, | 2160,68, | 2160,69, | 2160,70, | 2160,71, | 2160,72, | 2160,73, | 2160,74, | 2160,75, | 2160,76, | 2160,77, | 2160,78, | 2160,79, | 2160,80, | 2160,81, | 2160,82, | 2160,83, | 2160,84, | 2160,85, | 2161,1, | 2161,2, | 2161,3, | 2161,4, | 2161,5, | 2161,6, | 2161,7, | 2161,8, | 2161,9, | 2161,10, | 2161,11, | 2161,12, | 2161,13, | 2161,14, | 2161,15, | 2161,16, | 2161,17, | 2161,18, | 2161,19, | 2161,20, | 2161,21, | 2161,22, | 2161,23, | 2161,24, | 2161,25, | 2161,26, | 2161,27, | 2161,28, | 2161,29, | 2161,30, | 2161,31, | 2161,32, | 2161,33, | 2161,34, | 2161,35, | 2161,36, | 2161,37, | 2161,38, | 2161,39, | 2161,40, | 2161,41, | 2161,42, | 2161,43, | 2161,44, | 2161,45, | 2161,46, | 2161,47, | 2161,48, | 2161,49, | 2161,50, | 2161,51, | 2161,52, | 2161,53, | 2161,54, | 2161,55, | 2161,56, | 2161,57, | 2161,58, | 2161,59, | 2161,60, | 2161,61, | 2161,62, | 2161,63, | 2161,64, | 2161,65, | 2161,66, | 2161,67, | 2161,68, | 2161,69, | 2161,70, | 2161,71, | 2161,72, | 2161,73, | 2161,74, | 2161,75, | 2161,76, | 2161,77, | 2161,78, | 2161,79, | 2161,80, | 2161,81, | 2161,82, | 2161,83, | 2161,84, | 2161,85, | 2162,1, | 2162,2, | 2162,3, | 2162,4, | 2162,5, | 2162,6, | 2162,7, | 2162,8, | 2162,9, | 2162,10, | 2162,11, | 2162,12, | 2162,13, | 2162,14, | 2162,15, | 2162,16, | 2162,17, | 2162,18, | 2162,19, | 2162,20, | 2162,21, | 2162,22, | 2162,23, | 2162,24, | 2162,25, | 2162,26, | 2162,27, | 2162,28, | 2162,29, | 2162,30, | 2162,31, | 2162,32, | 2162,33, | 2162,34, | 2162,35, | 2162,36, | 2162,37, | 2162,38, | 2162,39, | 2162,40, | 2162,41, | 2162,42, | 2162,43, | 2162,44, | 2162,45, | 2162,46, | 2162,47, | 2162,48, | 2162,49, | 2162,50, | 2162,51, | 2162,52, | 2162,53, | 2162,54, | 2162,55, | 2162,56, | 2162,57, | 2162,58, | 2162,59, | 2162,60, | 2162,61, | 2162,62, | 2162,63, | 2162,64, | 2162,65, | 2162,66, | 2162,67, | 2162,68, | 2162,69, | 2162,70, | 2162,71, | 2162,72, | 2162,73, | 2162,74, | 2162,75, | 2162,76, | 2162,77, | 2162,78, | 2162,79, | 2162,80, | 2162,81, | 2162,82, | 2162,83, | 2162,84, | 2162,85, | 2163,1, | 2163,2, | 2163,3, | 2163,4, | 2163,5, | 2163,6, | 2163,7, | 2163,8, | 2163,9, | 2163,10, | 2163,11, | 2163,12, | 2163,13, | 2163,14, | 2163,15, | 2163,16, | 2163,17, | 2163,18, | 2163,19, | 2163,20, | 2163,21, | 2163,22, | 2163,23, | 2163,24, | 2163,25, | 2163,26, | 2163,27, | 2163,28, | 2163,29, | 2163,30, | 2163,31, | 2163,32, | 2163,33, | 2163,34, | 2163,35, | 2163,36, | 2163,37, | 2163,38, | 2163,39, | 2163,40, | 2163,41, | 2163,42, | 2163,43, | 2163,44, | 2163,45, | 2163,46, | 2163,47, | 2163,48, | 2163,49, | 2163,50, | 2163,51, | 2163,52, | 2163,53, | 2163,54, | 2163,55, | 2163,56, | 2163,57, | 2163,58, | 2163,59, | 2163,60, | 2163,61, | 2163,62, | 2163,63, | 2163,64, | 2163,65, | 2163,66, | 2163,67, | 2163,68, | 2163,69, | 2163,70, | 2163,71, | 2163,72, | 2163,73, | 2163,74, | 2163,75, | 2163,76, | 2163,77, | 2163,78, | 2163,79, | 2163,80, | 2163,81, | 2163,82, | 2163,83, | 2163,84, | 2163,85, | 2164,1, | 2164,2, | 2164,3, | 2164,4, | 2164,5, | 2164,6, | 2164,7, | 2164,8, | 2164,9, | 2164,10, | 2164,11, | 2164,12, | 2164,13, | 2164,14, | 2164,15, | 2164,16, | 2164,17, | 2164,18, | 2164,19, | 2164,20, | 2164,21, | 2164,22, | 2164,23, | 2164,24, | 2164,25, | 2164,26, | 2164,27, | 2164,28, | 2164,29, | 2164,30, | 2164,31, | 2164,32, | 2164,33, | 2164,34, | 2164,35, | 2164,36, | 2164,37, | 2164,38, | 2164,39, | 2164,40, | 2164,41, | 2164,42, | 2164,43, | 2164,44, | 2164,45, | 2164,46, | 2164,47, | 2164,48, | 2164,49, | 2164,50, | 2164,51, | 2164,52, | 2164,53, | 2164,54, | 2164,55, | 2164,56, | 2164,57, | 2164,58, | 2164,59, | 2164,60, | 2164,61, | 2164,62, | 2164,63, | 2164,64, | 2164,65, | 2164,66, | 2164,67, | 2164,68, | 2164,69, | 2164,70, | 2164,71, | 2164,72, | 2164,73, | 2164,74, | 2164,75, | 2164,76, | 2164,77, | 2164,78, | 2164,79, | 2164,80, | 2164,81, | 2164,82, | 2164,83, | 2164,84, | 2164,85, | 2165,1, | 2165,2, | 2165,3, | 2165,4, | 2165,5, | 2165,6, | 2165,7, | 2165,8, | 2165,9, | 2165,10, | 2165,11, | 2165,12, | 2165,13, | 2165,14, | 2165,15, | 2165,16, | 2165,17, | 2165,18, | 2165,19, | 2165,20, | 2165,21, | 2165,22, | 2165,23, | 2165,24, | 2165,25, | 2165,26, | 2165,27, | 2165,28, | 2165,29, | 2165,30, | 2165,31, | 2165,32, | 2165,33, | 2165,34, | 2165,35, | 2165,36, | 2165,37, | 2165,38, | 2165,39, | 2165,40, | 2165,41, | 2165,42, | 2165,43, | 2165,44, | 2165,45, | 2165,46, | 2165,47, | 2165,48, | 2165,49, | 2165,50, | 2165,51, | 2165,52, | 2165,53, | 2165,54, | 2165,55, | 2165,56, | 2165,57, | 2165,58, | 2165,59, | 2165,60, | 2165,61, | 2165,62, | 2165,63, | 2165,64, | 2165,65, | 2165,66, | 2165,67, | 2165,68, | 2165,69, | 2165,70, | 2165,71, | 2165,72, | 2165,73, | 2165,74, | 2165,75, | 2165,76, | 2165,77, | 2165,78, | 2165,79, | 2165,80, | 2165,81, | 2165,82, | 2165,83, | 2165,84, | 2165,85, | 2166,1, | 2166,2, | 2166,3, | 2166,4, | 2166,5, | 2166,6, | 2166,7, | 2166,8, | 2166,9, | 2166,10, | 2166,11, | 2166,12, | 2166,13, | 2166,14, | 2166,15, | 2166,16, | 2166,17, | 2166,18, | 2166,19, | 2166,20, | 2166,21, | 2166,22, | 2166,23, | 2166,24, | 2166,25, | 2166,26, | 2166,27, | 2166,28, | 2166,29, | 2166,30, | 2166,31, | 2166,32, | 2166,33, | 2166,34, | 2166,35, | 2166,36, | 2166,37, | 2166,38, | 2166,39, | 2166,40, | 2166,41, | 2166,42, | 2166,43, | 2166,44, | 2166,45, | 2166,46, | 2166,47, | 2166,48, | 2166,49, | 2166,50, | 2166,51, | 2166,52, | 2166,53, | 2166,54, | 2166,55, | 2166,56, | 2166,57, | 2166,58, | 2166,59, | 2166,60, | 2166,61, | 2166,62, | 2166,63, | 2166,64, | 2166,65, | 2166,66, | 2166,67, | 2166,68, | 2166,69, | 2166,70, | 2166,71, | 2166,72, | 2166,73, | 2166,74, | 2166,75, | 2166,76, | 2166,77, | 2166,78, | 2166,79, | 2166,80, | 2166,81, | 2166,82, | 2166,83, | 2166,84, | 2166,85, | 2167,1, | 2167,2, | 2167,3, | 2167,4, | 2167,5, | 2167,6, | 2167,7, | 2167,8, | 2167,9, | 2167,10, | 2167,11, | 2167,12, | 2167,13, | 2167,14, | 2167,15, | 2167,16, | 2167,17, | 2167,18, | 2167,19, | 2167,20, | 2167,21, | 2167,22, | 2167,23, | 2167,24, | 2167,25, | 2167,26, | 2167,27, | 2167,28, | 2167,29, | 2167,30, | 2167,31, | 2167,32, | 2167,33, | 2167,34, | 2167,35, | 2167,36, | 2167,37, | 2167,38, | 2167,39, | 2167,40, | 2167,41, | 2167,42, | 2167,43, | 2167,44, | 2167,45, | 2167,46, | 2167,47, | 2167,48, | 2167,49, | 2167,50, | 2167,51, | 2167,52, | 2167,53, | 2167,54, | 2167,55, | 2167,56, | 2167,57, | 2167,58, | 2167,59, | 2167,60, | 2167,61, | 2167,62, | 2167,63, | 2167,64, | 2167,65, | 2167,66, | 2167,67, | 2167,68, | 2167,69, | 2167,70, | 2167,71, | 2167,72, | 2167,73, | 2167,74, | 2167,75, | 2167,76, | 2167,77, | 2167,78, | 2167,79, | 2167,80, | 2167,81, | 2167,82, | 2167,83, | 2167,84, | 2167,85, | 2168,1, | 2168,2, | 2168,3, | 2168,4, | 2168,5, | 2168,6, | 2168,7, | 2168,8, | 2168,9, | 2168,10, | 2168,11, | 2168,12, | 2168,13, | 2168,14, | 2168,15, | 2168,16, | 2168,17, | 2168,18, | 2168,19, | 2168,20, | 2168,21, | 2168,22, | 2168,23, | 2168,24, | 2168,25, | 2168,26, | 2168,27, | 2168,28, | 2168,29, | 2168,30, | 2168,31, | 2168,32, | 2168,33, | 2168,34, | 2168,35, | 2168,36, | 2168,37, | 2168,38, | 2168,39, | 2168,40, | 2168,41, | 2168,42, | 2168,43, | 2168,44, | 2168,45, | 2168,46, | 2168,47, | 2168,48, | 2168,49, | 2168,50, | 2168,51, | 2168,52, | 2168,53, | 2168,54, | 2168,55, | 2168,56, | 2168,57, | 2168,58, | 2168,59, | 2168,60, | 2168,61, | 2168,62, | 2168,63, | 2168,64, | 2168,65, | 2168,66, | 2168,67, | 2168,68, | 2168,69, | 2168,70, | 2168,71, | 2168,72, | 2168,73, | 2168,74, | 2168,75, | 2168,76, | 2168,77, | 2168,78, | 2168,79, | 2168,80, | 2168,81, | 2168,82, | 2168,83, | 2168,84, | 2168,85, | 2169,1, | 2169,2, | 2169,3, | 2169,4, | 2169,5, | 2169,6, | 2169,7, | 2169,8, | 2169,9, | 2169,10, | 2169,11, | 2169,12, | 2169,13, | 2169,14, | 2169,15, | 2169,16, | 2169,17, | 2169,18, | 2169,19, | 2169,20, | 2169,21, | 2169,22, | 2169,23, | 2169,24, | 2169,25, | 2169,26, | 2169,27, | 2169,28, | 2169,29, | 2169,30, | 2169,31, | 2169,32, | 2169,33, | 2169,34, | 2169,35, | 2169,36, | 2169,37, | 2169,38, | 2169,39, | 2169,40, | 2169,41, | 2169,42, | 2169,43, | 2169,44, | 2169,45, | 2169,46, | 2169,47, | 2169,48, | 2169,49, | 2169,50, | 2169,51, | 2169,52, | 2169,53, | 2169,54, | 2169,55, | 2169,56, | 2169,57, | 2169,58, | 2169,59, | 2169,60, | 2169,61, | 2169,62, | 2169,63, | 2169,64, | 2169,65, | 2169,66, | 2169,67, | 2169,68, | 2169,69, | 2169,70, | 2169,71, | 2169,72, | 2169,73, | 2169,74, | 2169,75, | 2169,76, | 2169,77, | 2169,78, | 2169,79, | 2169,80, | 2169,81, | 2169,82, | 2169,83, | 2169,84, | 2169,85, | 2170,1, | 2170,2, | 2170,3, | 2170,4, | 2170,5, | 2170,6, | 2170,7, | 2170,8, | 2170,9, | 2170,10, | 2170,11, | 2170,12, | 2170,13, | 2170,14, | 2170,15, | 2170,16, | 2170,17, | 2170,18, | 2170,19, | 2170,20, | 2170,21, | 2170,22, | 2170,23, | 2170,24, | 2170,25, | 2170,26, | 2170,27, | 2170,28, | 2170,29, | 2170,30, | 2170,31, | 2170,32, | 2170,33, | 2170,34, | 2170,35, | 2170,36, | 2170,37, | 2170,38, | 2170,39, | 2170,40, | 2170,41, | 2170,42, | 2170,43, | 2170,44, | 2170,45, | 2170,46, | 2170,47, | 2170,48, | 2170,49, | 2170,50, | 2170,51, | 2170,52, | 2170,53, | 2170,54, | 2170,55, | 2170,56, | 2170,57, | 2170,58, | 2170,59, | 2170,60, | 2170,61, | 2170,62, | 2170,63, | 2170,64, | 2170,65, | 2170,66, | 2170,67, | 2170,68, | 2170,69, | 2170,70, | 2170,71, | 2170,72, | 2170,73, | 2170,74, | 2170,75, | 2170,76, | 2170,77, | 2170,78, | 2170,79, | 2170,80, | 2170,81, | 2170,82, | 2170,83, | 2170,84, | 2170,85, | 2171,1, | 2171,2, | 2171,3, | 2171,4, | 2171,5, | 2171,6, | 2171,7, | 2171,8, | 2171,9, | 2171,10, | 2171,11, | 2171,12, | 2171,13, | 2171,14, | 2171,15, | 2171,16, | 2171,17, | 2171,18, | 2171,19, | 2171,20, | 2171,21, | 2171,22, | 2171,23, | 2171,24, | 2171,25, | 2171,26, | 2171,27, | 2171,28, | 2171,29, | 2171,30, | 2171,31, | 2171,32, | 2171,33, | 2171,34, | 2171,35, | 2171,36, | 2171,37, | 2171,38, | 2171,39, | 2171,40, | 2171,41, | 2171,42, | 2171,43, | 2171,44, | 2171,45, | 2171,46, | 2171,47, | 2171,48, | 2171,49, | 2171,50, | 2171,51, | 2171,52, | 2171,53, | 2171,54, | 2171,55, | 2171,56, | 2171,57, | 2171,58, | 2171,59, | 2171,60, | 2171,61, | 2171,62, | 2171,63, | 2171,64, | 2171,65, | 2171,66, | 2171,67, | 2171,68, | 2171,69, | 2171,70, | 2171,71, | 2171,72, | 2171,73, | 2171,74, | 2171,75, | 2171,76, | 2171,77, | 2171,78, | 2171,79, | 2171,80, | 2171,81, | 2171,82, | 2171,83, | 2171,84, | 2171,85, | 2172,1, | 2172,2, | 2172,3, | 2172,4, | 2172,5, | 2172,6, | 2172,7, | 2172,8, | 2172,9, | 2172,10, | 2172,11, | 2172,12, | 2172,13, | 2172,14, | 2172,15, | 2172,16, | 2172,17, | 2172,18, | 2172,19, | 2172,20, | 2172,21, | 2172,22, | 2172,23, | 2172,24, | 2172,25, | 2172,26, | 2172,27, | 2172,28, | 2172,29, | 2172,30, | 2172,31, | 2172,32, | 2172,33, | 2172,34, | 2172,35, | 2172,36, | 2172,37, | 2172,38, | 2172,39, | 2172,40, | 2172,41, | 2172,42, | 2172,43, | 2172,44, | 2172,45, | 2172,46, | 2172,47, | 2172,48, | 2172,49, | 2172,50, | 2172,51, | 2172,52, | 2172,53, | 2172,54, | 2172,55, | 2172,56, | 2172,57, | 2172,58, | 2172,59, | 2172,60, | 2172,61, | 2172,62, | 2172,63, | 2172,64, | 2172,65, | 2172,66, | 2172,67, | 2172,68, | 2172,69, | 2172,70, | 2172,71, | 2172,72, | 2172,73, | 2172,74, | 2172,75, | 2172,76, | 2172,77, | 2172,78, | 2172,79, | 2172,80, | 2172,81, | 2172,82, | 2172,83, | 2172,84, | 2172,85, | 2173,1, | 2173,2, | 2173,3, | 2173,4, | 2173,5, | 2173,6, | 2173,7, | 2173,8, | 2173,9, | 2173,10, | 2173,11, | 2173,12, | 2173,13, | 2173,14, | 2173,15, | 2173,16, | 2173,17, | 2173,18, | 2173,19, | 2173,20, | 2173,21, | 2173,22, | 2173,23, | 2173,24, | 2173,25, | 2173,26, | 2173,27, | 2173,28, | 2173,29, | 2173,30, | 2173,31, | 2173,32, | 2173,33, | 2173,34, | 2173,35, | 2173,36, | 2173,37, | 2173,38, | 2173,39, | 2173,40, | 2173,41, | 2173,42, | 2173,43, | 2173,44, | 2173,45, | 2173,46, | 2173,47, | 2173,48, | 2173,49, | 2173,50, | 2173,51, | 2173,52, | 2173,53, | 2173,54, | 2173,55, | 2173,56, | 2173,57, | 2173,58, | 2173,59, | 2173,60, | 2173,61, | 2173,62, | 2173,63, | 2173,64, | 2173,65, | 2173,66, | 2173,67, | 2173,68, | 2173,69, | 2173,70, | 2173,71, | 2173,72, | 2173,73, | 2173,74, | 2173,75, | 2173,76, | 2173,77, | 2173,78, | 2173,79, | 2173,80, | 2173,81, | 2173,82, | 2173,83, | 2173,84, | 2173,85, | 2174,1, | 2174,2, | 2174,3, | 2174,4, | 2174,5, | 2174,6, | 2174,7, | 2174,8, | 2174,9, | 2174,10, | 2174,11, | 2174,12, | 2174,13, | 2174,14, | 2174,15, | 2174,16, | 2174,17, | 2174,18, | 2174,19, | 2174,20, | 2174,21, | 2174,22, | 2174,23, | 2174,24, | 2174,25, | 2174,26, | 2174,27, | 2174,28, | 2174,29, | 2174,30, | 2174,31, | 2174,32, | 2174,33, | 2174,34, | 2174,35, | 2174,36, | 2174,37, | 2174,38, | 2174,39, | 2174,40, | 2174,41, | 2174,42, | 2174,43, | 2174,44, | 2174,45, | 2174,46, | 2174,47, | 2174,48, | 2174,49, | 2174,50, | 2174,51, | 2174,52, | 2174,53, | 2174,54, | 2174,55, | 2174,56, | 2174,57, | 2174,58, | 2174,59, | 2174,60, | 2174,61, | 2174,62, | 2174,63, | 2174,64, | 2174,65, | 2174,66, | 2174,67, | 2174,68, | 2174,69, | 2174,70, | 2174,71, | 2174,72, | 2174,73, | 2174,74, | 2174,75, | 2174,76, | 2174,77, | 2174,78, | 2174,79, | 2174,80, | 2174,81, | 2174,82, | 2174,83, | 2174,84, | 2174,85, | 2175,1, | 2175,2, | 2175,3, | 2175,4, | 2175,5, | 2175,6, | 2175,7, | 2175,8, | 2175,9, | 2175,10, | 2175,11, | 2175,12, | 2175,13, | 2175,14, | 2175,15, | 2175,16, | 2175,17, | 2175,18, | 2175,19, | 2175,20, | 2175,21, | 2175,22, | 2175,23, | 2175,24, | 2175,25, | 2175,26, | 2175,27, | 2175,28, | 2175,29, | 2175,30, | 2175,31, | 2175,32, | 2175,33, | 2175,34, | 2175,35, | 2175,36, | 2175,37, | 2175,38, | 2175,39, | 2175,40, | 2175,41, | 2175,42, | 2175,43, | 2175,44, | 2175,45, | 2175,46, | 2175,47, | 2175,48, | 2175,49, | 2175,50, | 2175,51, | 2175,52, | 2175,53, | 2175,54, | 2175,55, | 2175,56, | 2175,57, | 2175,58, | 2175,59, | 2175,60, | 2175,61, | 2175,62, | 2175,63, | 2175,64, | 2175,65, | 2175,66, | 2175,67, | 2175,68, | 2175,69, | 2175,70, | 2175,71, | 2175,72, | 2175,73, | 2175,74, | 2175,75, | 2175,76, | 2175,77, | 2175,78, | 2175,79, | 2175,80, | 2175,81, | 2175,82, | 2175,83, | 2175,84, | 2175,85, | 2176,1, | 2176,2, | 2176,3, | 2176,4, | 2176,5, | 2176,6, | 2176,7, | 2176,8, | 2176,9, | 2176,10, | 2176,11, | 2176,12, | 2176,13, | 2176,14, | 2176,15, | 2176,16, | 2176,17, | 2176,18, | 2176,19, | 2176,20, | 2176,21, | 2176,22, | 2176,23, | 2176,24, | 2176,25, | 2176,26, | 2176,27, | 2176,28, | 2176,29, | 2176,30, | 2176,31, | 2176,32, | 2176,33, | 2176,34, | 2176,35, | 2176,36, | 2176,37, | 2176,38, | 2176,39, | 2176,40, | 2176,41, | 2176,42, | 2176,43, | 2176,44, | 2176,45, | 2176,46, | 2176,47, | 2176,48, | 2176,49, | 2176,50, | 2176,51, | 2176,52, | 2176,53, | 2176,54, | 2176,55, | 2176,56, | 2176,57, | 2176,58, | 2176,59, | 2176,60, | 2176,61, | 2176,62, | 2176,63, | 2176,64, | 2176,65, | 2176,66, | 2176,67, | 2176,68, | 2176,69, | 2176,70, | 2176,71, | 2176,72, | 2176,73, | 2176,74, | 2176,75, | 2176,76, | 2176,77, | 2176,78, | 2176,79, | 2176,80, | 2176,81, | 2176,82, | 2176,83, | 2176,84, | 2176,85, | 2177,1, | 2177,2, | 2177,3, | 2177,4, | 2177,5, | 2177,6, | 2177,7, | 2177,8, | 2177,9, | 2177,10, | 2177,11, | 2177,12, | 2177,13, | 2177,14, | 2177,15, | 2177,16, | 2177,17, | 2177,18, | 2177,19, | 2177,20, | 2177,21, | 2177,22, | 2177,23, | 2177,24, | 2177,25, | 2177,26, | 2177,27, | 2177,28, | 2177,29, | 2177,30, | 2177,31, | 2177,32, | 2177,33, | 2177,34, | 2177,35, | 2177,36, | 2177,37, | 2177,38, | 2177,39, | 2177,40, | 2177,41, | 2177,42, | 2177,43, | 2177,44, | 2177,45, | 2177,46, | 2177,47, | 2177,48, | 2177,49, | 2177,50, | 2177,51, | 2177,52, | 2177,53, | 2177,54, | 2177,55, | 2177,56, | 2177,57, | 2177,58, | 2177,59, | 2177,60, | 2177,61, | 2177,62, | 2177,63, | 2177,64, | 2177,65, | 2177,66, | 2177,67, | 2177,68, | 2177,69, | 2177,70, | 2177,71, | 2177,72, | 2177,73, | 2177,74, | 2177,75, | 2177,76, | 2177,77, | 2177,78, | 2177,79, | 2177,80, | 2177,81, | 2177,82, | 2177,83, | 2177,84, | 2177,85, | 2178,1, | 2178,2, | 2178,3, | 2178,4, | 2178,5, | 2178,6, | 2178,7, | 2178,8, | 2178,9, | 2178,10, | 2178,11, | 2178,12, | 2178,13, | 2178,14, | 2178,15, | 2178,16, | 2178,17, | 2178,18, | 2178,19, | 2178,20, | 2178,21, | 2178,22, | 2178,23, | 2178,24, | 2178,25, | 2178,26, | 2178,27, | 2178,28, | 2178,29, | 2178,30, | 2178,31, | 2178,32, | 2178,33, | 2178,34, | 2178,35, | 2178,36, | 2178,37, | 2178,38, | 2178,39, | 2178,40, | 2178,41, | 2178,42, | 2178,43, | 2178,44, | 2178,45, | 2178,46, | 2178,47, | 2178,48, | 2178,49, | 2178,50, | 2178,51, | 2178,52, | 2178,53, | 2178,54, | 2178,55, | 2178,56, | 2178,57, | 2178,58, | 2178,59, | 2178,60, | 2178,61, | 2178,62, | 2178,63, | 2178,64, | 2178,65, | 2178,66, | 2178,67, | 2178,68, | 2178,69, | 2178,70, | 2178,71, | 2178,72, | 2178,73, | 2178,74, | 2178,75, | 2178,76, | 2178,77, | 2178,78, | 2178,79, | 2178,80, | 2178,81, | 2178,82, | 2178,83, | 2178,84, | 2178,85, | 2179,1, | 2179,2, | 2179,3, | 2179,4, | 2179,5, | 2179,6, | 2179,7, | 2179,8, | 2179,9, | 2179,10, | 2179,11, | 2179,12, | 2179,13, | 2179,14, | 2179,15, | 2179,16, | 2179,17, | 2179,18, | 2179,19, | 2179,20, | 2179,21, | 2179,22, | 2179,23, | 2179,24, | 2179,25, | 2179,26, | 2179,27, | 2179,28, | 2179,29, | 2179,30, | 2179,31, | 2179,32, | 2179,33, | 2179,34, | 2179,35, | 2179,36, | 2179,37, | 2179,38, | 2179,39, | 2179,40, | 2179,41, | 2179,42, | 2179,43, | 2179,44, | 2179,45, | 2179,46, | 2179,47, | 2179,48, | 2179,49, | 2179,50, | 2179,51, | 2179,52, | 2179,53, | 2179,54, | 2179,55, | 2179,56, | 2179,57, | 2179,58, | 2179,59, | 2179,60, | 2179,61, | 2179,62, | 2179,63, | 2179,64, | 2179,65, | 2179,66, | 2179,67, | 2179,68, | 2179,69, | 2179,70, | 2179,71, | 2179,72, | 2179,73, | 2179,74, | 2179,75, | 2179,76, | 2179,77, | 2179,78, | 2179,79, | 2179,80, | 2179,81, | 2179,82, | 2179,83, | 2179,84, | 2179,85, | 2180,1, | 2180,2, | 2180,3, | 2180,4, | 2180,5, | 2180,6, | 2180,7, | 2180,8, | 2180,9, | 2180,10, | 2180,11, | 2180,12, | 2180,13, | 2180,14, | 2180,15, | 2180,16, | 2180,17, | 2180,18, | 2180,19, | 2180,20, | 2180,21, | 2180,22, | 2180,23, | 2180,24, | 2180,25, | 2180,26, | 2180,27, | 2180,28, | 2180,29, | 2180,30, | 2180,31, | 2180,32, | 2180,33, | 2180,34, | 2180,35, | 2180,36, | 2180,37, | 2180,38, | 2180,39, | 2180,40, | 2180,41, | 2180,42, | 2180,43, | 2180,44, | 2180,45, | 2180,46, | 2180,47, | 2180,48, | 2180,49, | 2180,50, | 2180,51, | 2180,52, | 2180,53, | 2180,54, | 2180,55, | 2180,56, | 2180,57, | 2180,58, | 2180,59, | 2180,60, | 2180,61, | 2180,62, | 2180,63, | 2180,64, | 2180,65, | 2180,66, | 2180,67, | 2180,68, | 2180,69, | 2180,70, | 2180,71, | 2180,72, | 2180,73, | 2180,74, | 2180,75, | 2180,76, | 2180,77, | 2180,78, | 2180,79, | 2180,80, | 2180,81, | 2180,82, | 2180,83, | 2180,84, | 2180,85, | 2181,1, | 2181,2, | 2181,3, | 2181,4, | 2181,5, | 2181,6, | 2181,7, | 2181,8, | 2181,9, | 2181,10, | 2181,11, | 2181,12, | 2181,13, | 2181,14, | 2181,15, | 2181,16, | 2181,17, | 2181,18, | 2181,19, | 2181,20, | 2181,21, | 2181,22, | 2181,23, | 2181,24, | 2181,25, | 2181,26, | 2181,27, | 2181,28, | 2181,29, | 2181,30, | 2181,31, | 2181,32, | 2181,33, | 2181,34, | 2181,35, | 2181,36, | 2181,37, | 2181,38, | 2181,39, | 2181,40, | 2181,41, | 2181,42, | 2181,43, | 2181,44, | 2181,45, | 2181,46, | 2181,47, | 2181,48, | 2181,49, | 2181,50, | 2181,51, | 2181,52, | 2181,53, | 2181,54, | 2181,55, | 2181,56, | 2181,57, | 2181,58, | 2181,59, | 2181,60, | 2181,61, | 2181,62, | 2181,63, | 2181,64, | 2181,65, | 2181,66, | 2181,67, | 2181,68, | 2181,69, | 2181,70, | 2181,71, | 2181,72, | 2181,73, | 2181,74, | 2181,75, | 2181,76, | 2181,77, | 2181,78, | 2181,79, | 2181,80, | 2181,81, | 2181,82, | 2181,83, | 2181,84, | 2181,85, | 2182,1, | 2182,2, | 2182,3, | 2182,4, | 2182,5, | 2182,6, | 2182,7, | 2182,8, | 2182,9, | 2182,10, | 2182,11, | 2182,12, | 2182,13, | 2182,14, | 2182,15, | 2182,16, | 2182,17, | 2182,18, | 2182,19, | 2182,20, | 2182,21, | 2182,22, | 2182,23, | 2182,24, | 2182,25, | 2182,26, | 2182,27, | 2182,28, | 2182,29, | 2182,30, | 2182,31, | 2182,32, | 2182,33, | 2182,34, | 2182,35, | 2182,36, | 2182,37, | 2182,38, | 2182,39, | 2182,40, | 2182,41, | 2182,42, | 2182,43, | 2182,44, | 2182,45, | 2182,46, | 2182,47, | 2182,48, | 2182,49, | 2182,50, | 2182,51, | 2182,52, | 2182,53, | 2182,54, | 2182,55, | 2182,56, | 2182,57, | 2182,58, | 2182,59, | 2182,60, | 2182,61, | 2182,62, | 2182,63, | 2182,64, | 2182,65, | 2182,66, | 2182,67, | 2182,68, | 2182,69, | 2182,70, | 2182,71, | 2182,72, | 2182,73, | 2182,74, | 2182,75, | 2182,76, | 2182,77, | 2182,78, | 2182,79, | 2182,80, | 2182,81, | 2182,82, | 2182,83, | 2182,84, | 2182,85, | 2183,1, | 2183,2, | 2183,3, | 2183,4, | 2183,5, | 2183,6, | 2183,7, | 2183,8, | 2183,9, | 2183,10, | 2183,11, | 2183,12, | 2183,13, | 2183,14, | 2183,15, | 2183,16, | 2183,17, | 2183,18, | 2183,19, | 2183,20, | 2183,21, | 2183,22, | 2183,23, | 2183,24, | 2183,25, | 2183,26, | 2183,27, | 2183,28, | 2183,29, | 2183,30, | 2183,31, | 2183,32, | 2183,33, | 2183,34, | 2183,35, | 2183,36, | 2183,37, | 2183,38, | 2183,39, | 2183,40, | 2183,41, | 2183,42, | 2183,43, | 2183,44, | 2183,45, | 2183,46, | 2183,47, | 2183,48, | 2183,49, | 2183,50, | 2183,51, | 2183,52, | 2183,53, | 2183,54, | 2183,55, | 2183,56, | 2183,57, | 2183,58, | 2183,59, | 2183,60, | 2183,61, | 2183,62, | 2183,63, | 2183,64, | 2183,65, | 2183,66, | 2183,67, | 2183,68, | 2183,69, | 2183,70, | 2183,71, | 2183,72, | 2183,73, | 2183,74, | 2183,75, | 2183,76, | 2183,77, | 2183,78, | 2183,79, | 2183,80, | 2183,81, | 2183,82, | 2183,83, | 2183,84, | 2183,85, | 2184,1, | 2184,2, | 2184,3, | 2184,4, | 2184,5, | 2184,6, | 2184,7, | 2184,8, | 2184,9, | 2184,10, | 2184,11, | 2184,12, | 2184,13, | 2184,14, | 2184,15, | 2184,16, | 2184,17, | 2184,18, | 2184,19, | 2184,20, | 2184,21, | 2184,22, | 2184,23, | 2184,24, | 2184,25, | 2184,26, | 2184,27, | 2184,28, | 2184,29, | 2184,30, | 2184,31, | 2184,32, | 2184,33, | 2184,34, | 2184,35, | 2184,36, | 2184,37, | 2184,38, | 2184,39, | 2184,40, | 2184,41, | 2184,42, | 2184,43, | 2184,44, | 2184,45, | 2184,46, | 2184,47, | 2184,48, | 2184,49, | 2184,50, | 2184,51, | 2184,52, | 2184,53, | 2184,54, | 2184,55, | 2184,56, | 2184,57, | 2184,58, | 2184,59, | 2184,60, | 2184,61, | 2184,62, | 2184,63, | 2184,64, | 2184,65, | 2184,66, | 2184,67, | 2184,68, | 2184,69, | 2184,70, | 2184,71, | 2184,72, | 2184,73, | 2184,74, | 2184,75, | 2184,76, | 2184,77, | 2184,78, | 2184,79, | 2184,80, | 2184,81, | 2184,82, | 2184,83, | 2184,84, | 2184,85, | 2185,1, | 2185,2, | 2185,3, | 2185,4, | 2185,5, | 2185,6, | 2185,7, | 2185,8, | 2185,9, | 2185,10, | 2185,11, | 2185,12, | 2185,13, | 2185,14, | 2185,15, | 2185,16, | 2185,17, | 2185,18, | 2185,19, | 2185,20, | 2185,21, | 2185,22, | 2185,23, | 2185,24, | 2185,25, | 2185,26, | 2185,27, | 2185,28, | 2185,29, | 2185,30, | 2185,31, | 2185,32, | 2185,33, | 2185,34, | 2185,35, | 2185,36, | 2185,37, | 2185,38, | 2185,39, | 2185,40, | 2185,41, | 2185,42, | 2185,43, | 2185,44, | 2185,45, | 2185,46, | 2185,47, | 2185,48, | 2185,49, | 2185,50, | 2185,51, | 2185,52, | 2185,53, | 2185,54, | 2185,55, | 2185,56, | 2185,57, | 2185,58, | 2185,59, | 2185,60, | 2185,61, | 2185,62, | 2185,63, | 2185,64, | 2185,65, | 2185,66, | 2185,67, | 2185,68, | 2185,69, | 2185,70, | 2185,71, | 2185,72, | 2185,73, | 2185,74, | 2185,75, | 2185,76, | 2185,77, | 2185,78, | 2185,79, | 2185,80, | 2185,81, | 2185,82, | 2185,83, | 2185,84, | 2185,85, | 2186,1, | 2186,2, | 2186,3, | 2186,4, | 2186,5, | 2186,6, | 2186,7, | 2186,8, | 2186,9, | 2186,10, | 2186,11, | 2186,12, | 2186,13, | 2186,14, | 2186,15, | 2186,16, | 2186,17, | 2186,18, | 2186,19, | 2186,20, | 2186,21, | 2186,22, | 2186,23, | 2186,24, | 2186,25, | 2186,26, | 2186,27, | 2186,28, | 2186,29, | 2186,30, | 2186,31, | 2186,32, | 2186,33, | 2186,34, | 2186,35, | 2186,36, | 2186,37, | 2186,38, | 2186,39, | 2186,40, | 2186,41, | 2186,42, | 2186,43, | 2186,44, | 2186,45, | 2186,46, | 2186,47, | 2186,48, | 2186,49, | 2186,50, | 2186,51, | 2186,52, | 2186,53, | 2186,54, | 2186,55, | 2186,56, | 2186,57, | 2186,58, | 2186,59, | 2186,60, | 2186,61, | 2186,62, | 2186,63, | 2186,64, | 2186,65, | 2186,66, | 2186,67, | 2186,68, | 2186,69, | 2186,70, | 2186,71, | 2186,72, | 2186,73, | 2186,74, | 2186,75, | 2186,76, | 2186,77, | 2186,78, | 2186,79, | 2186,80, | 2186,81, | 2186,82, | 2186,83, | 2186,84, | 2186,85, | 2187,1, | 2187,2, | 2187,3, | 2187,4, | 2187,5, | 2187,6, | 2187,7, | 2187,8, | 2187,9, | 2187,10, | 2187,11, | 2187,12, | 2187,13, | 2187,14, | 2187,15, | 2187,16, | 2187,17, | 2187,18, | 2187,19, | 2187,20, | 2187,21, | 2187,22, | 2187,23, | 2187,24, | 2187,25, | 2187,26, | 2187,27, | 2187,28, | 2187,29, | 2187,30, | 2187,31, | 2187,32, | 2187,33, | 2187,34, | 2187,35, | 2187,36, | 2187,37, | 2187,38, | 2187,39, | 2187,40, | 2187,41, | 2187,42, | 2187,43, | 2187,44, | 2187,45, | 2187,46, | 2187,47, | 2187,48, | 2187,49, | 2187,50, | 2187,51, | 2187,52, | 2187,53, | 2187,54, | 2187,55, | 2187,56, | 2187,57, | 2187,58, | 2187,59, | 2187,60, | 2187,61, | 2187,62, | 2187,63, | 2187,64, | 2187,65, | 2187,66, | 2187,67, | 2187,68, | 2187,69, | 2187,70, | 2187,71, | 2187,72, | 2187,73, | 2187,74, | 2187,75, | 2187,76, | 2187,77, | 2187,78, | 2187,79, | 2187,80, | 2187,81, | 2187,82, | 2187,83, | 2187,84, | 2187,85, | 2188,1, | 2188,2, | 2188,3, | 2188,4, | 2188,5, | 2188,6, | 2188,7, | 2188,8, | 2188,9, | 2188,10, | 2188,11, | 2188,12, | 2188,13, | 2188,14, | 2188,15, | 2188,16, | 2188,17, | 2188,18, | 2188,19, | 2188,20, | 2188,21, | 2188,22, | 2188,23, | 2188,24, | 2188,25, | 2188,26, | 2188,27, | 2188,28, | 2188,29, | 2188,30, | 2188,31, | 2188,32, | 2188,33, | 2188,34, | 2188,35, | 2188,36, | 2188,37, | 2188,38, | 2188,39, | 2188,40, | 2188,41, | 2188,42, | 2188,43, | 2188,44, | 2188,45, | 2188,46, | 2188,47, | 2188,48, | 2188,49, | 2188,50, | 2188,51, | 2188,52, | 2188,53, | 2188,54, | 2188,55, | 2188,56, | 2188,57, | 2188,58, | 2188,59, | 2188,60, | 2188,61, | 2188,62, | 2188,63, | 2188,64, | 2188,65, | 2188,66, | 2188,67, | 2188,68, | 2188,69, | 2188,70, | 2188,71, | 2188,72, | 2188,73, | 2188,74, | 2188,75, | 2188,76, | 2188,77, | 2188,78, | 2188,79, | 2188,80, | 2188,81, | 2188,82, | 2188,83, | 2188,84, | 2188,85, | 2189,1, | 2189,2, | 2189,3, | 2189,4, | 2189,5, | 2189,6, | 2189,7, | 2189,8, | 2189,9, | 2189,10, | 2189,11, | 2189,12, | 2189,13, | 2189,14, | 2189,15, | 2189,16, | 2189,17, | 2189,18, | 2189,19, | 2189,20, | 2189,21, | 2189,22, | 2189,23, | 2189,24, | 2189,25, | 2189,26, | 2189,27, | 2189,28, | 2189,29, | 2189,30, | 2189,31, | 2189,32, | 2189,33, | 2189,34, | 2189,35, | 2189,36, | 2189,37, | 2189,38, | 2189,39, | 2189,40, | 2189,41, | 2189,42, | 2189,43, | 2189,44, | 2189,45, | 2189,46, | 2189,47, | 2189,48, | 2189,49, | 2189,50, | 2189,51, | 2189,52, | 2189,53, | 2189,54, | 2189,55, | 2189,56, | 2189,57, | 2189,58, | 2189,59, | 2189,60, | 2189,61, | 2189,62, | 2189,63, | 2189,64, | 2189,65, | 2189,66, | 2189,67, | 2189,68, | 2189,69, | 2189,70, | 2189,71, | 2189,72, | 2189,73, | 2189,74, | 2189,75, | 2189,76, | 2189,77, | 2189,78, | 2189,79, | 2189,80, | 2189,81, | 2189,82, | 2189,83, | 2189,84, | 2189,85, | 2190,1, | 2190,2, | 2190,3, | 2190,4, | 2190,5, | 2190,6, | 2190,7, | 2190,8, | 2190,9, | 2190,10, | 2190,11, | 2190,12, | 2190,13, | 2190,14, | 2190,15, | 2190,16, | 2190,17, | 2190,18, | 2190,19, | 2190,20, | 2190,21, | 2190,22, | 2190,23, | 2190,24, | 2190,25, | 2190,26, | 2190,27, | 2190,28, | 2190,29, | 2190,30, | 2190,31, | 2190,32, | 2190,33, | 2190,34, | 2190,35, | 2190,36, | 2190,37, | 2190,38, | 2190,39, | 2190,40, | 2190,41, | 2190,42, | 2190,43, | 2190,44, | 2190,45, | 2190,46, | 2190,47, | 2190,48, | 2190,49, | 2190,50, | 2190,51, | 2190,52, | 2190,53, | 2190,54, | 2190,55, | 2190,56, | 2190,57, | 2190,58, | 2190,59, | 2190,60, | 2190,61, | 2190,62, | 2190,63, | 2190,64, | 2190,65, | 2190,66, | 2190,67, | 2190,68, | 2190,69, | 2190,70, | 2190,71, | 2190,72, | 2190,73, | 2190,74, | 2190,75, | 2190,76, | 2190,77, | 2190,78, | 2190,79, | 2190,80, | 2190,81, | 2190,82, | 2190,83, | 2190,84, | 2190,85, | 2191,1, | 2191,2, | 2191,3, | 2191,4, | 2191,5, | 2191,6, | 2191,7, | 2191,8, | 2191,9, | 2191,10, | 2191,11, | 2191,12, | 2191,13, | 2191,14, | 2191,15, | 2191,16, | 2191,17, | 2191,18, | 2191,19, | 2191,20, | 2191,21, | 2191,22, | 2191,23, | 2191,24, | 2191,25, | 2191,26, | 2191,27, | 2191,28, | 2191,29, | 2191,30, | 2191,31, | 2191,32, | 2191,33, | 2191,34, | 2191,35, | 2191,36, | 2191,37, | 2191,38, | 2191,39, | 2191,40, | 2191,41, | 2191,42, | 2191,43, | 2191,44, | 2191,45, | 2191,46, | 2191,47, | 2191,48, | 2191,49, | 2191,50, | 2191,51, | 2191,52, | 2191,53, | 2191,54, | 2191,55, | 2191,56, | 2191,57, | 2191,58, | 2191,59, | 2191,60, | 2191,61, | 2191,62, | 2191,63, | 2191,64, | 2191,65, | 2191,66, | 2191,67, | 2191,68, | 2191,69, | 2191,70, | 2191,71, | 2191,72, | 2191,73, | 2191,74, | 2191,75, | 2191,76, | 2191,77, | 2191,78, | 2191,79, | 2191,80, | 2191,81, | 2191,82, | 2191,83, | 2191,84, | 2191,85, | 2192,1, | 2192,2, | 2192,3, | 2192,4, | 2192,5, | 2192,6, | 2192,7, | 2192,8, | 2192,9, | 2192,10, | 2192,11, | 2192,12, | 2192,13, | 2192,14, | 2192,15, | 2192,16, | 2192,17, | 2192,18, | 2192,19, | 2192,20, | 2192,21, | 2192,22, | 2192,23, | 2192,24, | 2192,25, | 2192,26, | 2192,27, | 2192,28, | 2192,29, | 2192,30, | 2192,31, | 2192,32, | 2192,33, | 2192,34, | 2192,35, | 2192,36, | 2192,37, | 2192,38, | 2192,39, | 2192,40, | 2192,41, | 2192,42, | 2192,43, | 2192,44, | 2192,45, | 2192,46, | 2192,47, | 2192,48, | 2192,49, | 2192,50, | 2192,51, | 2192,52, | 2192,53, | 2192,54, | 2192,55, | 2192,56, | 2192,57, | 2192,58, | 2192,59, | 2192,60, | 2192,61, | 2192,62, | 2192,63, | 2192,64, | 2192,65, | 2192,66, | 2192,67, | 2192,68, | 2192,69, | 2192,70, | 2192,71, | 2192,72, | 2192,73, | 2192,74, | 2192,75, | 2192,76, | 2192,77, | 2192,78, | 2192,79, | 2192,80, | 2192,81, | 2192,82, | 2192,83, | 2192,84, | 2192,85, | 2193,1, | 2193,2, | 2193,3, | 2193,4, | 2193,5, | 2193,6, | 2193,7, | 2193,8, | 2193,9, | 2193,10, | 2193,11, | 2193,12, | 2193,13, | 2193,14, | 2193,15, | 2193,16, | 2193,17, | 2193,18, | 2193,19, | 2193,20, | 2193,21, | 2193,22, | 2193,23, | 2193,24, | 2193,25, | 2193,26, | 2193,27, | 2193,28, | 2193,29, | 2193,30, | 2193,31, | 2193,32, | 2193,33, | 2193,34, | 2193,35, | 2193,36, | 2193,37, | 2193,38, | 2193,39, | 2193,40, | 2193,41, | 2193,42, | 2193,43, | 2193,44, | 2193,45, | 2193,46, | 2193,47, | 2193,48, | 2193,49, | 2193,50, | 2193,51, | 2193,52, | 2193,53, | 2193,54, | 2193,55, | 2193,56, | 2193,57, | 2193,58, | 2193,59, | 2193,60, | 2193,61, | 2193,62, | 2193,63, | 2193,64, | 2193,65, | 2193,66, | 2193,67, | 2193,68, | 2193,69, | 2193,70, | 2193,71, | 2193,72, | 2193,73, | 2193,74, | 2193,75, | 2193,76, | 2193,77, | 2193,78, | 2193,79, | 2193,80, | 2193,81, | 2193,82, | 2193,83, | 2193,84, | 2193,85, | 2194,1, | 2194,2, | 2194,3, | 2194,4, | 2194,5, | 2194,6, | 2194,7, | 2194,8, | 2194,9, | 2194,10, | 2194,11, | 2194,12, | 2194,13, | 2194,14, | 2194,15, | 2194,16, | 2194,17, | 2194,18, | 2194,19, | 2194,20, | 2194,21, | 2194,22, | 2194,23, | 2194,24, | 2194,25, | 2194,26, | 2194,27, | 2194,28, | 2194,29, | 2194,30, | 2194,31, | 2194,32, | 2194,33, | 2194,34, | 2194,35, | 2194,36, | 2194,37, | 2194,38, | 2194,39, | 2194,40, | 2194,41, | 2194,42, | 2194,43, | 2194,44, | 2194,45, | 2194,46, | 2194,47, | 2194,48, | 2194,49, | 2194,50, | 2194,51, | 2194,52, | 2194,53, | 2194,54, | 2194,55, | 2194,56, | 2194,57, | 2194,58, | 2194,59, | 2194,60, | 2194,61, | 2194,62, | 2194,63, | 2194,64, | 2194,65, | 2194,66, | 2194,67, | 2194,68, | 2194,69, | 2194,70, | 2194,71, | 2194,72, | 2194,73, | 2194,74, | 2194,75, | 2194,76, | 2194,77, | 2194,78, | 2194,79, | 2194,80, | 2194,81, | 2194,82, | 2194,83, | 2194,84, | 2194,85, | 2195,1, | 2195,2, | 2195,3, | 2195,4, | 2195,5, | 2195,6, | 2195,7, | 2195,8, | 2195,9, | 2195,10, | 2195,11, | 2195,12, | 2195,13, | 2195,14, | 2195,15, | 2195,16, | 2195,17, | 2195,18, | 2195,19, | 2195,20, | 2195,21, | 2195,22, | 2195,23, | 2195,24, | 2195,25, | 2195,26, | 2195,27, | 2195,28, | 2195,29, | 2195,30, | 2195,31, | 2195,32, | 2195,33, | 2195,34, | 2195,35, | 2195,36, | 2195,37, | 2195,38, | 2195,39, | 2195,40, | 2195,41, | 2195,42, | 2195,43, | 2195,44, | 2195,45, | 2195,46, | 2195,47, | 2195,48, | 2195,49, | 2195,50, | 2195,51, | 2195,52, | 2195,53, | 2195,54, | 2195,55, | 2195,56, | 2195,57, | 2195,58, | 2195,59, | 2195,60, | 2195,61, | 2195,62, | 2195,63, | 2195,64, | 2195,65, | 2195,66, | 2195,67, | 2195,68, | 2195,69, | 2195,70, | 2195,71, | 2195,72, | 2195,73, | 2195,74, | 2195,75, | 2195,76, | 2195,77, | 2195,78, | 2195,79, | 2195,80, | 2195,81, | 2195,82, | 2195,83, | 2195,84, | 2195,85, | 2196,1, | 2196,2, | 2196,3, | 2196,4, | 2196,5, | 2196,6, | 2196,7, | 2196,8, | 2196,9, | 2196,10, | 2196,11, | 2196,12, | 2196,13, | 2196,14, | 2196,15, | 2196,16, | 2196,17, | 2196,18, | 2196,19, | 2196,20, | 2196,21, | 2196,22, | 2196,23, | 2196,24, | 2196,25, | 2196,26, | 2196,27, | 2196,28, | 2196,29, | 2196,30, | 2196,31, | 2196,32, | 2196,33, | 2196,34, | 2196,35, | 2196,36, | 2196,37, | 2196,38, | 2196,39, | 2196,40, | 2196,41, | 2196,42, | 2196,43, | 2196,44, | 2196,45, | 2196,46, | 2196,47, | 2196,48, | 2196,49, | 2196,50, | 2196,51, | 2196,52, | 2196,53, | 2196,54, | 2196,55, | 2196,56, | 2196,57, | 2196,58, | 2196,59, | 2196,60, | 2196,61, | 2196,62, | 2196,63, | 2196,64, | 2196,65, | 2196,66, | 2196,67, | 2196,68, | 2196,69, | 2196,70, | 2196,71, | 2196,72, | 2196,73, | 2196,74, | 2196,75, | 2196,76, | 2196,77, | 2196,78, | 2196,79, | 2196,80, | 2196,81, | 2196,82, | 2196,83, | 2196,84, | 2196,85, | 2197,1, | 2197,2, | 2197,3, | 2197,4, | 2197,5, | 2197,6, | 2197,7, | 2197,8, | 2197,9, | 2197,10, | 2197,11, | 2197,12, | 2197,13, | 2197,14, | 2197,15, | 2197,16, | 2197,17, | 2197,18, | 2197,19, | 2197,20, | 2197,21, | 2197,22, | 2197,23, | 2197,24, | 2197,25, | 2197,26, | 2197,27, | 2197,28, | 2197,29, | 2197,30, | 2197,31, | 2197,32, | 2197,33, | 2197,34, | 2197,35, | 2197,36, | 2197,37, | 2197,38, | 2197,39, | 2197,40, | 2197,41, | 2197,42, | 2197,43, | 2197,44, | 2197,45, | 2197,46, | 2197,47, | 2197,48, | 2197,49, | 2197,50, | 2197,51, | 2197,52, | 2197,53, | 2197,54, | 2197,55, | 2197,56, | 2197,57, | 2197,58, | 2197,59, | 2197,60, | 2197,61, | 2197,62, | 2197,63, | 2197,64, | 2197,65, | 2197,66, | 2197,67, | 2197,68, | 2197,69, | 2197,70, | 2197,71, | 2197,72, | 2197,73, | 2197,74, | 2197,75, | 2197,76, | 2197,77, | 2197,78, | 2197,79, | 2197,80, | 2197,81, | 2197,82, | 2197,83, | 2197,84, | 2197,85, | 2198,1, | 2198,2, | 2198,3, | 2198,4, | 2198,5, | 2198,6, | 2198,7, | 2198,8, | 2198,9, | 2198,10, | 2198,11, | 2198,12, | 2198,13, | 2198,14, | 2198,15, | 2198,16, | 2198,17, | 2198,18, | 2198,19, | 2198,20, | 2198,21, | 2198,22, | 2198,23, | 2198,24, | 2198,25, | 2198,26, | 2198,27, | 2198,28, | 2198,29, | 2198,30, | 2198,31, | 2198,32, | 2198,33, | 2198,34, | 2198,35, | 2198,36, | 2198,37, | 2198,38, | 2198,39, | 2198,40, | 2198,41, | 2198,42, | 2198,43, | 2198,44, | 2198,45, | 2198,46, | 2198,47, | 2198,48, | 2198,49, | 2198,50, | 2198,51, | 2198,52, | 2198,53, | 2198,54, | 2198,55, | 2198,56, | 2198,57, | 2198,58, | 2198,59, | 2198,60, | 2198,61, | 2198,62, | 2198,63, | 2198,64, | 2198,65, | 2198,66, | 2198,67, | 2198,68, | 2198,69, | 2198,70, | 2198,71, | 2198,72, | 2198,73, | 2198,74, | 2198,75, | 2198,76, | 2198,77, | 2198,78, | 2198,79, | 2198,80, | 2198,81, | 2198,82, | 2198,83, | 2198,84, | 2198,85, | 2199,1, | 2199,2, | 2199,3, | 2199,4, | 2199,5, | 2199,6, | 2199,7, | 2199,8, | 2199,9, | 2199,10, | 2199,11, | 2199,12, | 2199,13, | 2199,14, | 2199,15, | 2199,16, | 2199,17, | 2199,18, | 2199,19, | 2199,20, | 2199,21, | 2199,22, | 2199,23, | 2199,24, | 2199,25, | 2199,26, | 2199,27, | 2199,28, | 2199,29, | 2199,30, | 2199,31, | 2199,32, | 2199,33, | 2199,34, | 2199,35, | 2199,36, | 2199,37, | 2199,38, | 2199,39, | 2199,40, | 2199,41, | 2199,42, | 2199,43, | 2199,44, | 2199,45, | 2199,46, | 2199,47, | 2199,48, | 2199,49, | 2199,50, | 2199,51, | 2199,52, | 2199,53, | 2199,54, | 2199,55, | 2199,56, | 2199,57, | 2199,58, | 2199,59, | 2199,60, | 2199,61, | 2199,62, | 2199,63, | 2199,64, | 2199,65, | 2199,66, | 2199,67, | 2199,68, | 2199,69, | 2199,70, | 2199,71, | 2199,72, | 2199,73, | 2199,74, | 2199,75, | 2199,76, | 2199,77, | 2199,78, | 2199,79, | 2199,80, | 2199,81, | 2199,82, | 2199,83, | 2199,84, | 2199,85, | 2200,1, | 2200,2, | 2200,3, | 2200,4, | 2200,5, | 2200,6, | 2200,7, | 2200,8, | 2200,9, | 2200,10, | 2200,11, | 2200,12, | 2200,13, | 2200,14, | 2200,15, | 2200,16, | 2200,17, | 2200,18, | 2200,19, | 2200,20, | 2200,21, | 2200,22, | 2200,23, | 2200,24, | 2200,25, | 2200,26, | 2200,27, | 2200,28, | 2200,29, | 2200,30, | 2200,31, | 2200,32, | 2200,33, | 2200,34, | 2200,35, | 2200,36, | 2200,37, | 2200,38, | 2200,39, | 2200,40, | 2200,41, | 2200,42, | 2200,43, | 2200,44, | 2200,45, | 2200,46, | 2200,47, | 2200,48, | 2200,49, | 2200,50, | 2200,51, | 2200,52, | 2200,53, | 2200,54, | 2200,55, | 2200,56, | 2200,57, | 2200,58, | 2200,59, | 2200,60, | 2200,61, | 2200,62, | 2200,63, | 2200,64, | 2200,65, | 2200,66, | 2200,67, | 2200,68, | 2200,69, | 2200,70, | 2200,71, | 2200,72, | 2200,73, | 2200,74, | 2200,75, | 2200,76, | 2200,77, | 2200,78, | 2200,79, | 2200,80, | 2200,81, | 2200,82, | 2200,83, | 2200,84, | 2200,85, | 2201,1, | 2201,2, | 2201,3, | 2201,4, | 2201,5, | 2201,6, | 2201,7, | 2201,8, | 2201,9, | 2201,10, | 2201,11, | 2201,12, | 2201,13, | 2201,14, | 2201,15, | 2201,16, | 2201,17, | 2201,18, | 2201,19, | 2201,20, | 2201,21, | 2201,22, | 2201,23, | 2201,24, | 2201,25, | 2201,26, | 2201,27, | 2201,28, | 2201,29, | 2201,30, | 2201,31, | 2201,32, | 2201,33, | 2201,34, | 2201,35, | 2201,36, | 2201,37, | 2201,38, | 2201,39, | 2201,40, | 2201,41, | 2201,42, | 2201,43, | 2201,44, | 2201,45, | 2201,46, | 2201,47, | 2201,48, | 2201,49, | 2201,50, | 2201,51, | 2201,52, | 2201,53, | 2201,54, | 2201,55, | 2201,56, | 2201,57, | 2201,58, | 2201,59, | 2201,60, | 2201,61, | 2201,62, | 2201,63, | 2201,64, | 2201,65, | 2201,66, | 2201,67, | 2201,68, | 2201,69, | 2201,70, | 2201,71, | 2201,72, | 2201,73, | 2201,74, | 2201,75, | 2201,76, | 2201,77, | 2201,78, | 2201,79, | 2201,80, | 2201,81, | 2201,82, | 2201,83, | 2201,84, | 2201,85, | 2202,1, | 2202,2, | 2202,3, | 2202,4, | 2202,5, | 2202,6, | 2202,7, | 2202,8, | 2202,9, | 2202,10, | 2202,11, | 2202,12, | 2202,13, | 2202,14, | 2202,15, | 2202,16, | 2202,17, | 2202,18, | 2202,19, | 2202,20, | 2202,21, | 2202,22, | 2202,23, | 2202,24, | 2202,25, | 2202,26, | 2202,27, | 2202,28, | 2202,29, | 2202,30, | 2202,31, | 2202,32, | 2202,33, | 2202,34, | 2202,35, | 2202,36, | 2202,37, | 2202,38, | 2202,39, | 2202,40, | 2202,41, | 2202,42, | 2202,43, | 2202,44, | 2202,45, | 2202,46, | 2202,47, | 2202,48, | 2202,49, | 2202,50, | 2202,51, | 2202,52, | 2202,53, | 2202,54, | 2202,55, | 2202,56, | 2202,57, | 2202,58, | 2202,59, | 2202,60, | 2202,61, | 2202,62, | 2202,63, | 2202,64, | 2202,65, | 2202,66, | 2202,67, | 2202,68, | 2202,69, | 2202,70, | 2202,71, | 2202,72, | 2202,73, | 2202,74, | 2202,75, | 2202,76, | 2202,77, | 2202,78, | 2202,79, | 2202,80, | 2202,81, | 2202,82, | 2202,83, | 2202,84, | 2202,85, | 2203,1, | 2203,2, | 2203,3, | 2203,4, | 2203,5, | 2203,6, | 2203,7, | 2203,8, | 2203,9, | 2203,10, | 2203,11, | 2203,12, | 2203,13, | 2203,14, | 2203,15, | 2203,16, | 2203,17, | 2203,18, | 2203,19, | 2203,20, | 2203,21, | 2203,22, | 2203,23, | 2203,24, | 2203,25, | 2203,26, | 2203,27, | 2203,28, | 2203,29, | 2203,30, | 2203,31, | 2203,32, | 2203,33, | 2203,34, | 2203,35, | 2203,36, | 2203,37, | 2203,38, | 2203,39, | 2203,40, | 2203,41, | 2203,42, | 2203,43, | 2203,44, | 2203,45, | 2203,46, | 2203,47, | 2203,48, | 2203,49, | 2203,50, | 2203,51, | 2203,52, | 2203,53, | 2203,54, | 2203,55, | 2203,56, | 2203,57, | 2203,58, | 2203,59, | 2203,60, | 2203,61, | 2203,62, | 2203,63, | 2203,64, | 2203,65, | 2203,66, | 2203,67, | 2203,68, | 2203,69, | 2203,70, | 2203,71, | 2203,72, | 2203,73, | 2203,74, | 2203,75, | 2203,76, | 2203,77, | 2203,78, | 2203,79, | 2203,80, | 2203,81, | 2203,82, | 2203,83, | 2203,84, | 2203,85, | 2204,1, | 2204,2, | 2204,3, | 2204,4, | 2204,5, | 2204,6, | 2204,7, | 2204,8, | 2204,9, | 2204,10, | 2204,11, | 2204,12, | 2204,13, | 2204,14, | 2204,15, | 2204,16, | 2204,17, | 2204,18, | 2204,19, | 2204,20, | 2204,21, | 2204,22, | 2204,23, | 2204,24, | 2204,25, | 2204,26, | 2204,27, | 2204,28, | 2204,29, | 2204,30, | 2204,31, | 2204,32, | 2204,33, | 2204,34, | 2204,35, | 2204,36, | 2204,37, | 2204,38, | 2204,39, | 2204,40, | 2204,41, | 2204,42, | 2204,43, | 2204,44, | 2204,45, | 2204,46, | 2204,47, | 2204,48, | 2204,49, | 2204,50, | 2204,51, | 2204,52, | 2204,53, | 2204,54, | 2204,55, | 2204,56, | 2204,57, | 2204,58, | 2204,59, | 2204,60, | 2204,61, | 2204,62, | 2204,63, | 2204,64, | 2204,65, | 2204,66, | 2204,67, | 2204,68, | 2204,69, | 2204,70, | 2204,71, | 2204,72, | 2204,73, | 2204,74, | 2204,75, | 2204,76, | 2204,77, | 2204,78, | 2204,79, | 2204,80, | 2204,81, | 2204,82, | 2204,83, | 2204,84, | 2204,85, | 2205,1, | 2205,2, | 2205,3, | 2205,4, | 2205,5, | 2205,6, | 2205,7, | 2205,8, | 2205,9, | 2205,10, | 2205,11, | 2205,12, | 2205,13, | 2205,14, | 2205,15, | 2205,16, | 2205,17, | 2205,18, | 2205,19, | 2205,20, | 2205,21, | 2205,22, | 2205,23, | 2205,24, | 2205,25, | 2205,26, | 2205,27, | 2205,28, | 2205,29, | 2205,30, | 2205,31, | 2205,32, | 2205,33, | 2205,34, | 2205,35, | 2205,36, | 2205,37, | 2205,38, | 2205,39, | 2205,40, | 2205,41, | 2205,42, | 2205,43, | 2205,44, | 2205,45, | 2205,46, | 2205,47, | 2205,48, | 2205,49, | 2205,50, | 2205,51, | 2205,52, | 2205,53, | 2205,54, | 2205,55, | 2205,56, | 2205,57, | 2205,58, | 2205,59, | 2205,60, | 2205,61, | 2205,62, | 2205,63, | 2205,64, | 2205,65, | 2205,66, | 2205,67, | 2205,68, | 2205,69, | 2205,70, | 2205,71, | 2205,72, | 2205,73, | 2205,74, | 2205,75, | 2205,76, | 2205,77, | 2205,78, | 2205,79, | 2205,80, | 2205,81, | 2205,82, | 2205,83, | 2205,84, | 2205,85, | 2206,1, | 2206,2, | 2206,3, | 2206,4, | 2206,5, | 2206,6, | 2206,7, | 2206,8, | 2206,9, | 2206,10, | 2206,11, | 2206,12, | 2206,13, | 2206,14, | 2206,15, | 2206,16, | 2206,17, | 2206,18, | 2206,19, | 2206,20, | 2206,21, | 2206,22, | 2206,23, | 2206,24, | 2206,25, | 2206,26, | 2206,27, | 2206,28, | 2206,29, | 2206,30, | 2206,31, | 2206,32, | 2206,33, | 2206,34, | 2206,35, | 2206,36, | 2206,37, | 2206,38, | 2206,39, | 2206,40, | 2206,41, | 2206,42, | 2206,43, | 2206,44, | 2206,45, | 2206,46, | 2206,47, | 2206,48, | 2206,49, | 2206,50, | 2206,51, | 2206,52, | 2206,53, | 2206,54, | 2206,55, | 2206,56, | 2206,57, | 2206,58, | 2206,59, | 2206,60, | 2206,61, | 2206,62, | 2206,63, | 2206,64, | 2206,65, | 2206,66, | 2206,67, | 2206,68, | 2206,69, | 2206,70, | 2206,71, | 2206,72, | 2206,73, | 2206,74, | 2206,75, | 2206,76, | 2206,77, | 2206,78, | 2206,79, | 2206,80, | 2206,81, | 2206,82, | 2206,83, | 2206,84, | 2206,85, | 2207,1, | 2207,2, | 2207,3, | 2207,4, | 2207,5, | 2207,6, | 2207,7, | 2207,8, | 2207,9, | 2207,10, | 2207,11, | 2207,12, | 2207,13, | 2207,14, | 2207,15, | 2207,16, | 2207,17, | 2207,18, | 2207,19, | 2207,20, | 2207,21, | 2207,22, | 2207,23, | 2207,24, | 2207,25, | 2207,26, | 2207,27, | 2207,28, | 2207,29, | 2207,30, | 2207,31, | 2207,32, | 2207,33, | 2207,34, | 2207,35, | 2207,36, | 2207,37, | 2207,38, | 2207,39, | 2207,40, | 2207,41, | 2207,42, | 2207,43, | 2207,44, | 2207,45, | 2207,46, | 2207,47, | 2207,48, | 2207,49, | 2207,50, | 2207,51, | 2207,52, | 2207,53, | 2207,54, | 2207,55, | 2207,56, | 2207,57, | 2207,58, | 2207,59, | 2207,60, | 2207,61, | 2207,62, | 2207,63, | 2207,64, | 2207,65, | 2207,66, | 2207,67, | 2207,68, | 2207,69, | 2207,70, | 2207,71, | 2207,72, | 2207,73, | 2207,74, | 2207,75, | 2207,76, | 2207,77, | 2207,78, | 2207,79, | 2207,80, | 2207,81, | 2207,82, | 2207,83, | 2207,84, | 2207,85, | 2208,1, | 2208,2, | 2208,3, | 2208,4, | 2208,5, | 2208,6, | 2208,7, | 2208,8, | 2208,9, | 2208,10, | 2208,11, | 2208,12, | 2208,13, | 2208,14, | 2208,15, | 2208,16, | 2208,17, | 2208,18, | 2208,19, | 2208,20, | 2208,21, | 2208,22, | 2208,23, | 2208,24, | 2208,25, | 2208,26, | 2208,27, | 2208,28, | 2208,29, | 2208,30, | 2208,31, | 2208,32, | 2208,33, | 2208,34, | 2208,35, | 2208,36, | 2208,37, | 2208,38, | 2208,39, | 2208,40, | 2208,41, | 2208,42, | 2208,43, | 2208,44, | 2208,45, | 2208,46, | 2208,47, | 2208,48, | 2208,49, | 2208,50, | 2208,51, | 2208,52, | 2208,53, | 2208,54, | 2208,55, | 2208,56, | 2208,57, | 2208,58, | 2208,59, | 2208,60, | 2208,61, | 2208,62, | 2208,63, | 2208,64, | 2208,65, | 2208,66, | 2208,67, | 2208,68, | 2208,69, | 2208,70, | 2208,71, | 2208,72, | 2208,73, | 2208,74, | 2208,75, | 2208,76, | 2208,77, | 2208,78, | 2208,79, | 2208,80, | 2208,81, | 2208,82, | 2208,83, | 2208,84, | 2208,85, | 2209,1, | 2209,2, | 2209,3, | 2209,4, | 2209,5, | 2209,6, | 2209,7, | 2209,8, | 2209,9, | 2209,10, | 2209,11, | 2209,12, | 2209,13, | 2209,14, | 2209,15, | 2209,16, | 2209,17, | 2209,18, | 2209,19, | 2209,20, | 2209,21, | 2209,22, | 2209,23, | 2209,24, | 2209,25, | 2209,26, | 2209,27, | 2209,28, | 2209,29, | 2209,30, | 2209,31, | 2209,32, | 2209,33, | 2209,34, | 2209,35, | 2209,36, | 2209,37, | 2209,38, | 2209,39, | 2209,40, | 2209,41, | 2209,42, | 2209,43, | 2209,44, | 2209,45, | 2209,46, | 2209,47, | 2209,48, | 2209,49, | 2209,50, | 2209,51, | 2209,52, | 2209,53, | 2209,54, | 2209,55, | 2209,56, | 2209,57, | 2209,58, | 2209,59, | 2209,60, | 2209,61, | 2209,62, | 2209,63, | 2209,64, | 2209,65, | 2209,66, | 2209,67, | 2209,68, | 2209,69, | 2209,70, | 2209,71, | 2209,72, | 2209,73, | 2209,74, | 2209,75, | 2209,76, | 2209,77, | 2209,78, | 2209,79, | 2209,80, | 2209,81, | 2209,82, | 2209,83, | 2209,84, | 2209,85, | 2210,1, | 2210,2, | 2210,3, | 2210,4, | 2210,5, | 2210,6, | 2210,7, | 2210,8, | 2210,9, | 2210,10, | 2210,11, | 2210,12, | 2210,13, | 2210,14, | 2210,15, | 2210,16, | 2210,17, | 2210,18, | 2210,19, | 2210,20, | 2210,21, | 2210,22, | 2210,23, | 2210,24, | 2210,25, | 2210,26, | 2210,27, | 2210,28, | 2210,29, | 2210,30, | 2210,31, | 2210,32, | 2210,33, | 2210,34, | 2210,35, | 2210,36, | 2210,37, | 2210,38, | 2210,39, | 2210,40, | 2210,41, | 2210,42, | 2210,43, | 2210,44, | 2210,45, | 2210,46, | 2210,47, | 2210,48, | 2210,49, | 2210,50, | 2210,51, | 2210,52, | 2210,53, | 2210,54, | 2210,55, | 2210,56, | 2210,57, | 2210,58, | 2210,59, | 2210,60, | 2210,61, | 2210,62, | 2210,63, | 2210,64, | 2210,65, | 2210,66, | 2210,67, | 2210,68, | 2210,69, | 2210,70, | 2210,71, | 2210,72, | 2210,73, | 2210,74, | 2210,75, | 2210,76, | 2210,77, | 2210,78, | 2210,79, | 2210,80, | 2210,81, | 2210,82, | 2210,83, | 2210,84, | 2210,85, | 2211,1, | 2211,2, | 2211,3, | 2211,4, | 2211,5, | 2211,6, | 2211,7, | 2211,8, | 2211,9, | 2211,10, | 2211,11, | 2211,12, | 2211,13, | 2211,14, | 2211,15, | 2211,16, | 2211,17, | 2211,18, | 2211,19, | 2211,20, | 2211,21, | 2211,22, | 2211,23, | 2211,24, | 2211,25, | 2211,26, | 2211,27, | 2211,28, | 2211,29, | 2211,30, | 2211,31, | 2211,32, | 2211,33, | 2211,34, | 2211,35, | 2211,36, | 2211,37, | 2211,38, | 2211,39, | 2211,40, | 2211,41, | 2211,42, | 2211,43, | 2211,44, | 2211,45, | 2211,46, | 2211,47, | 2211,48, | 2211,49, | 2211,50, | 2211,51, | 2211,52, | 2211,53, | 2211,54, | 2211,55, | 2211,56, | 2211,57, | 2211,58, | 2211,59, | 2211,60, | 2211,61, | 2211,62, | 2211,63, | 2211,64, | 2211,65, | 2211,66, | 2211,67, | 2211,68, | 2211,69, | 2211,70, | 2211,71, | 2211,72, | 2211,73, | 2211,74, | 2211,75, | 2211,76, | 2211,77, | 2211,78, | 2211,79, | 2211,80, | 2211,81, | 2211,82, | 2211,83, | 2211,84, | 2211,85, | 2212,1, | 2212,2, | 2212,3, | 2212,4, | 2212,5, | 2212,6, | 2212,7, | 2212,8, | 2212,9, | 2212,10, | 2212,11, | 2212,12, | 2212,13, | 2212,14, | 2212,15, | 2212,16, | 2212,17, | 2212,18, | 2212,19, | 2212,20, | 2212,21, | 2212,22, | 2212,23, | 2212,24, | 2212,25, | 2212,26, | 2212,27, | 2212,28, | 2212,29, | 2212,30, | 2212,31, | 2212,32, | 2212,33, | 2212,34, | 2212,35, | 2212,36, | 2212,37, | 2212,38, | 2212,39, | 2212,40, | 2212,41, | 2212,42, | 2212,43, | 2212,44, | 2212,45, | 2212,46, | 2212,47, | 2212,48, | 2212,49, | 2212,50, | 2212,51, | 2212,52, | 2212,53, | 2212,54, | 2212,55, | 2212,56, | 2212,57, | 2212,58, | 2212,59, | 2212,60, | 2212,61, | 2212,62, | 2212,63, | 2212,64, | 2212,65, | 2212,66, | 2212,67, | 2212,68, | 2212,69, | 2212,70, | 2212,71, | 2212,72, | 2212,73, | 2212,74, | 2212,75, | 2212,76, | 2212,77, | 2212,78, | 2212,79, | 2212,80, | 2212,81, | 2212,82, | 2212,83, | 2212,84, | 2212,85, | 2213,1, | 2213,2, | 2213,3, | 2213,4, | 2213,5, | 2213,6, | 2213,7, | 2213,8, | 2213,9, | 2213,10, | 2213,11, | 2213,12, | 2213,13, | 2213,14, | 2213,15, | 2213,16, | 2213,17, | 2213,18, | 2213,19, | 2213,20, | 2213,21, | 2213,22, | 2213,23, | 2213,24, | 2213,25, | 2213,26, | 2213,27, | 2213,28, | 2213,29, | 2213,30, | 2213,31, | 2213,32, | 2213,33, | 2213,34, | 2213,35, | 2213,36, | 2213,37, | 2213,38, | 2213,39, | 2213,40, | 2213,41, | 2213,42, | 2213,43, | 2213,44, | 2213,45, | 2213,46, | 2213,47, | 2213,48, | 2213,49, | 2213,50, | 2213,51, | 2213,52, | 2213,53, | 2213,54, | 2213,55, | 2213,56, | 2213,57, | 2213,58, | 2213,59, | 2213,60, | 2213,61, | 2213,62, | 2213,63, | 2213,64, | 2213,65, | 2213,66, | 2213,67, | 2213,68, | 2213,69, | 2213,70, | 2213,71, | 2213,72, | 2213,73, | 2213,74, | 2213,75, | 2213,76, | 2213,77, | 2213,78, | 2213,79, | 2213,80, | 2213,81, | 2213,82, | 2213,83, | 2213,84, | 2213,85, | 2214,1, | 2214,2, | 2214,3, | 2214,4, | 2214,5, | 2214,6, | 2214,7, | 2214,8, | 2214,9, | 2214,10, | 2214,11, | 2214,12, | 2214,13, | 2214,14, | 2214,15, | 2214,16, | 2214,17, | 2214,18, | 2214,19, | 2214,20, | 2214,21, | 2214,22, | 2214,23, | 2214,24, | 2214,25, | 2214,26, | 2214,27, | 2214,28, | 2214,29, | 2214,30, | 2214,31, | 2214,32, | 2214,33, | 2214,34, | 2214,35, | 2214,36, | 2214,37, | 2214,38, | 2214,39, | 2214,40, | 2214,41, | 2214,42, | 2214,43, | 2214,44, | 2214,45, | 2214,46, | 2214,47, | 2214,48, | 2214,49, | 2214,50, | 2214,51, | 2214,52, | 2214,53, | 2214,54, | 2214,55, | 2214,56, | 2214,57, | 2214,58, | 2214,59, | 2214,60, | 2214,61, | 2214,62, | 2214,63, | 2214,64, | 2214,65, | 2214,66, | 2214,67, | 2214,68, | 2214,69, | 2214,70, | 2214,71, | 2214,72, | 2214,73, | 2214,74, | 2214,75, | 2214,76, | 2214,77, | 2214,78, | 2214,79, | 2214,80, | 2214,81, | 2214,82, | 2214,83, | 2214,84, | 2214,85, | 2215,1, | 2215,2, | 2215,3, | 2215,4, | 2215,5, | 2215,6, | 2215,7, | 2215,8, | 2215,9, | 2215,10, | 2215,11, | 2215,12, | 2215,13, | 2215,14, | 2215,15, | 2215,16, | 2215,17, | 2215,18, | 2215,19, | 2215,20, | 2215,21, | 2215,22, | 2215,23, | 2215,24, | 2215,25, | 2215,26, | 2215,27, | 2215,28, | 2215,29, | 2215,30, | 2215,31, | 2215,32, | 2215,33, | 2215,34, | 2215,35, | 2215,36, | 2215,37, | 2215,38, | 2215,39, | 2215,40, | 2215,41, | 2215,42, | 2215,43, | 2215,44, | 2215,45, | 2215,46, | 2215,47, | 2215,48, | 2215,49, | 2215,50, | 2215,51, | 2215,52, | 2215,53, | 2215,54, | 2215,55, | 2215,56, | 2215,57, | 2215,58, | 2215,59, | 2215,60, | 2215,61, | 2215,62, | 2215,63, | 2215,64, | 2215,65, | 2215,66, | 2215,67, | 2215,68, | 2215,69, | 2215,70, | 2215,71, | 2215,72, | 2215,73, | 2215,74, | 2215,75, | 2215,76, | 2215,77, | 2215,78, | 2215,79, | 2215,80, | 2215,81, | 2215,82, | 2215,83, | 2215,84, | 2215,85, | 2216,1, | 2216,2, | 2216,3, | 2216,4, | 2216,5, | 2216,6, | 2216,7, | 2216,8, | 2216,9, | 2216,10, | 2216,11, | 2216,12, | 2216,13, | 2216,14, | 2216,15, | 2216,16, | 2216,17, | 2216,18, | 2216,19, | 2216,20, | 2216,21, | 2216,22, | 2216,23, | 2216,24, | 2216,25, | 2216,26, | 2216,27, | 2216,28, | 2216,29, | 2216,30, | 2216,31, | 2216,32, | 2216,33, | 2216,34, | 2216,35, | 2216,36, | 2216,37, | 2216,38, | 2216,39, | 2216,40, | 2216,41, | 2216,42, | 2216,43, | 2216,44, | 2216,45, | 2216,46, | 2216,47, | 2216,48, | 2216,49, | 2216,50, | 2216,51, | 2216,52, | 2216,53, | 2216,54, | 2216,55, | 2216,56, | 2216,57, | 2216,58, | 2216,59, | 2216,60, | 2216,61, | 2216,62, | 2216,63, | 2216,64, | 2216,65, | 2216,66, | 2216,67, | 2216,68, | 2216,69, | 2216,70, | 2216,71, | 2216,72, | 2216,73, | 2216,74, | 2216,75, | 2216,76, | 2216,77, | 2216,78, | 2216,79, | 2216,80, | 2216,81, | 2216,82, | 2216,83, | 2216,84, | 2216,85, | 2217,1, | 2217,2, | 2217,3, | 2217,4, | 2217,5, | 2217,6, | 2217,7, | 2217,8, | 2217,9, | 2217,10, | 2217,11, | 2217,12, | 2217,13, | 2217,14, | 2217,15, | 2217,16, | 2217,17, | 2217,18, | 2217,19, | 2217,20, | 2217,21, | 2217,22, | 2217,23, | 2217,24, | 2217,25, | 2217,26, | 2217,27, | 2217,28, | 2217,29, | 2217,30, | 2217,31, | 2217,32, | 2217,33, | 2217,34, | 2217,35, | 2217,36, | 2217,37, | 2217,38, | 2217,39, | 2217,40, | 2217,41, | 2217,42, | 2217,43, | 2217,44, | 2217,45, | 2217,46, | 2217,47, | 2217,48, | 2217,49, | 2217,50, | 2217,51, | 2217,52, | 2217,53, | 2217,54, | 2217,55, | 2217,56, | 2217,57, | 2217,58, | 2217,59, | 2217,60, | 2217,61, | 2217,62, | 2217,63, | 2217,64, | 2217,65, | 2217,66, | 2217,67, | 2217,68, | 2217,69, | 2217,70, | 2217,71, | 2217,72, | 2217,73, | 2217,74, | 2217,75, | 2217,76, | 2217,77, | 2217,78, | 2217,79, | 2217,80, | 2217,81, | 2217,82, | 2217,83, | 2217,84, | 2217,85, | 2218,1, | 2218,2, | 2218,3, | 2218,4, | 2218,5, | 2218,6, | 2218,7, | 2218,8, | 2218,9, | 2218,10, | 2218,11, | 2218,12, | 2218,13, | 2218,14, | 2218,15, | 2218,16, | 2218,17, | 2218,18, | 2218,19, | 2218,20, | 2218,21, | 2218,22, | 2218,23, | 2218,24, | 2218,25, | 2218,26, | 2218,27, | 2218,28, | 2218,29, | 2218,30, | 2218,31, | 2218,32, | 2218,33, | 2218,34, | 2218,35, | 2218,36, | 2218,37, | 2218,38, | 2218,39, | 2218,40, | 2218,41, | 2218,42, | 2218,43, | 2218,44, | 2218,45, | 2218,46, | 2218,47, | 2218,48, | 2218,49, | 2218,50, | 2218,51, | 2218,52, | 2218,53, | 2218,54, | 2218,55, | 2218,56, | 2218,57, | 2218,58, | 2218,59, | 2218,60, | 2218,61, | 2218,62, | 2218,63, | 2218,64, | 2218,65, | 2218,66, | 2218,67, | 2218,68, | 2218,69, | 2218,70, | 2218,71, | 2218,72, | 2218,73, | 2218,74, | 2218,75, | 2218,76, | 2218,77, | 2218,78, | 2218,79, | 2218,80, | 2218,81, | 2218,82, | 2218,83, | 2218,84, | 2218,85, | 2219,1, | 2219,2, | 2219,3, | 2219,4, | 2219,5, | 2219,6, | 2219,7, | 2219,8, | 2219,9, | 2219,10, | 2219,11, | 2219,12, | 2219,13, | 2219,14, | 2219,15, | 2219,16, | 2219,17, | 2219,18, | 2219,19, | 2219,20, | 2219,21, | 2219,22, | 2219,23, | 2219,24, | 2219,25, | 2219,26, | 2219,27, | 2219,28, | 2219,29, | 2219,30, | 2219,31, | 2219,32, | 2219,33, | 2219,34, | 2219,35, | 2219,36, | 2219,37, | 2219,38, | 2219,39, | 2219,40, | 2219,41, | 2219,42, | 2219,43, | 2219,44, | 2219,45, | 2219,46, | 2219,47, | 2219,48, | 2219,49, | 2219,50, | 2219,51, | 2219,52, | 2219,53, | 2219,54, | 2219,55, | 2219,56, | 2219,57, | 2219,58, | 2219,59, | 2219,60, | 2219,61, | 2219,62, | 2219,63, | 2219,64, | 2219,65, | 2219,66, | 2219,67, | 2219,68, | 2219,69, | 2219,70, | 2219,71, | 2219,72, | 2219,73, | 2219,74, | 2219,75, | 2219,76, | 2219,77, | 2219,78, | 2219,79, | 2219,80, | 2219,81, | 2219,82, | 2219,83, | 2219,84, | 2219,85, | 2220,1, | 2220,2, | 2220,3, | 2220,4, | 2220,5, | 2220,6, | 2220,7, | 2220,8, | 2220,9, | 2220,10, | 2220,11, | 2220,12, | 2220,13, | 2220,14, | 2220,15, | 2220,16, | 2220,17, | 2220,18, | 2220,19, | 2220,20, | 2220,21, | 2220,22, | 2220,23, | 2220,24, | 2220,25, | 2220,26, | 2220,27, | 2220,28, | 2220,29, | 2220,30, | 2220,31, | 2220,32, | 2220,33, | 2220,34, | 2220,35, | 2220,36, | 2220,37, | 2220,38, | 2220,39, | 2220,40, | 2220,41, | 2220,42, | 2220,43, | 2220,44, | 2220,45, | 2220,46, | 2220,47, | 2220,48, | 2220,49, | 2220,50, | 2220,51, | 2220,52, | 2220,53, | 2220,54, | 2220,55, | 2220,56, | 2220,57, | 2220,58, | 2220,59, | 2220,60, | 2220,61, | 2220,62, | 2220,63, | 2220,64, | 2220,65, | 2220,66, | 2220,67, | 2220,68, | 2220,69, | 2220,70, | 2220,71, | 2220,72, | 2220,73, | 2220,74, | 2220,75, | 2220,76, | 2220,77, | 2220,78, | 2220,79, | 2220,80, | 2220,81, | 2220,82, | 2220,83, | 2220,84, | 2220,85, | 2221,1, | 2221,2, | 2221,3, | 2221,4, | 2221,5, | 2221,6, | 2221,7, | 2221,8, | 2221,9, | 2221,10, | 2221,11, | 2221,12, | 2221,13, | 2221,14, | 2221,15, | 2221,16, | 2221,17, | 2221,18, | 2221,19, | 2221,20, | 2221,21, | 2221,22, | 2221,23, | 2221,24, | 2221,25, | 2221,26, | 2221,27, | 2221,28, | 2221,29, | 2221,30, | 2221,31, | 2221,32, | 2221,33, | 2221,34, | 2221,35, | 2221,36, | 2221,37, | 2221,38, | 2221,39, | 2221,40, | 2221,41, | 2221,42, | 2221,43, | 2221,44, | 2221,45, | 2221,46, | 2221,47, | 2221,48, | 2221,49, | 2221,50, | 2221,51, | 2221,52, | 2221,53, | 2221,54, | 2221,55, | 2221,56, | 2221,57, | 2221,58, | 2221,59, | 2221,60, | 2221,61, | 2221,62, | 2221,63, | 2221,64, | 2221,65, | 2221,66, | 2221,67, | 2221,68, | 2221,69, | 2221,70, | 2221,71, | 2221,72, | 2221,73, | 2221,74, | 2221,75, | 2221,76, | 2221,77, | 2221,78, | 2221,79, | 2221,80, | 2221,81, | 2221,82, | 2221,83, | 2221,84, | 2221,85, | 2222,1, | 2222,2, | 2222,3, | 2222,4, | 2222,5, | 2222,6, | 2222,7, | 2222,8, | 2222,9, | 2222,10, | 2222,11, | 2222,12, | 2222,13, | 2222,14, | 2222,15, | 2222,16, | 2222,17, | 2222,18, | 2222,19, | 2222,20, | 2222,21, | 2222,22, | 2222,23, | 2222,24, | 2222,25, | 2222,26, | 2222,27, | 2222,28, | 2222,29, | 2222,30, | 2222,31, | 2222,32, | 2222,33, | 2222,34, | 2222,35, | 2222,36, | 2222,37, | 2222,38, | 2222,39, | 2222,40, | 2222,41, | 2222,42, | 2222,43, | 2222,44, | 2222,45, | 2222,46, | 2222,47, | 2222,48, | 2222,49, | 2222,50, | 2222,51, | 2222,52, | 2222,53, | 2222,54, | 2222,55, | 2222,56, | 2222,57, | 2222,58, | 2222,59, | 2222,60, | 2222,61, | 2222,62, | 2222,63, | 2222,64, | 2222,65, | 2222,66, | 2222,67, | 2222,68, | 2222,69, | 2222,70, | 2222,71, | 2222,72, | 2222,73, | 2222,74, | 2222,75, | 2222,76, | 2222,77, | 2222,78, | 2222,79, | 2222,80, | 2222,81, | 2222,82, | 2222,83, | 2222,84, | 2222,85, | 2223,1, | 2223,2, | 2223,3, | 2223,4, | 2223,5, | 2223,6, | 2223,7, | 2223,8, | 2223,9, | 2223,10, | 2223,11, | 2223,12, | 2223,13, | 2223,14, | 2223,15, | 2223,16, | 2223,17, | 2223,18, | 2223,19, | 2223,20, | 2223,21, | 2223,22, | 2223,23, | 2223,24, | 2223,25, | 2223,26, | 2223,27, | 2223,28, | 2223,29, | 2223,30, | 2223,31, | 2223,32, | 2223,33, | 2223,34, | 2223,35, | 2223,36, | 2223,37, | 2223,38, | 2223,39, | 2223,40, | 2223,41, | 2223,42, | 2223,43, | 2223,44, | 2223,45, | 2223,46, | 2223,47, | 2223,48, | 2223,49, | 2223,50, | 2223,51, | 2223,52, | 2223,53, | 2223,54, | 2223,55, | 2223,56, | 2223,57, | 2223,58, | 2223,59, | 2223,60, | 2223,61, | 2223,62, | 2223,63, | 2223,64, | 2223,65, | 2223,66, | 2223,67, | 2223,68, | 2223,69, | 2223,70, | 2223,71, | 2223,72, | 2223,73, | 2223,74, | 2223,75, | 2223,76, | 2223,77, | 2223,78, | 2223,79, | 2223,80, | 2223,81, | 2223,82, | 2223,83, | 2223,84, | 2223,85, | 2224,1, | 2224,2, | 2224,3, | 2224,4, | 2224,5, | 2224,6, | 2224,7, | 2224,8, | 2224,9, | 2224,10, | 2224,11, | 2224,12, | 2224,13, | 2224,14, | 2224,15, | 2224,16, | 2224,17, | 2224,18, | 2224,19, | 2224,20, | 2224,21, | 2224,22, | 2224,23, | 2224,24, | 2224,25, | 2224,26, | 2224,27, | 2224,28, | 2224,29, | 2224,30, | 2224,31, | 2224,32, | 2224,33, | 2224,34, | 2224,35, | 2224,36, | 2224,37, | 2224,38, | 2224,39, | 2224,40, | 2224,41, | 2224,42, | 2224,43, | 2224,44, | 2224,45, | 2224,46, | 2224,47, | 2224,48, | 2224,49, | 2224,50, | 2224,51, | 2224,52, | 2224,53, | 2224,54, | 2224,55, | 2224,56, | 2224,57, | 2224,58, | 2224,59, | 2224,60, | 2224,61, | 2224,62, | 2224,63, | 2224,64, | 2224,65, | 2224,66, | 2224,67, | 2224,68, | 2224,69, | 2224,70, | 2224,71, | 2224,72, | 2224,73, | 2224,74, | 2224,75, | 2224,76, | 2224,77, | 2224,78, | 2224,79, | 2224,80, | 2224,81, | 2224,82, | 2224,83, | 2224,84, | 2224,85, | 2225,1, | 2225,2, | 2225,3, | 2225,4, | 2225,5, | 2225,6, | 2225,7, | 2225,8, | 2225,9, | 2225,10, | 2225,11, | 2225,12, | 2225,13, | 2225,14, | 2225,15, | 2225,16, | 2225,17, | 2225,18, | 2225,19, | 2225,20, | 2225,21, | 2225,22, | 2225,23, | 2225,24, | 2225,25, | 2225,26, | 2225,27, | 2225,28, | 2225,29, | 2225,30, | 2225,31, | 2225,32, | 2225,33, | 2225,34, | 2225,35, | 2225,36, | 2225,37, | 2225,38, | 2225,39, | 2225,40, | 2225,41, | 2225,42, | 2225,43, | 2225,44, | 2225,45, | 2225,46, | 2225,47, | 2225,48, | 2225,49, | 2225,50, | 2225,51, | 2225,52, | 2225,53, | 2225,54, | 2225,55, | 2225,56, | 2225,57, | 2225,58, | 2225,59, | 2225,60, | 2225,61, | 2225,62, | 2225,63, | 2225,64, | 2225,65, | 2225,66, | 2225,67, | 2225,68, | 2225,69, | 2225,70, | 2225,71, | 2225,72, | 2225,73, | 2225,74, | 2225,75, | 2225,76, | 2225,77, | 2225,78, | 2225,79, | 2225,80, | 2225,81, | 2225,82, | 2225,83, | 2225,84, | 2225,85, | 2226,1, | 2226,2, | 2226,3, | 2226,4, | 2226,5, | 2226,6, | 2226,7, | 2226,8, | 2226,9, | 2226,10, | 2226,11, | 2226,12, | 2226,13, | 2226,14, | 2226,15, | 2226,16, | 2226,17, | 2226,18, | 2226,19, | 2226,20, | 2226,21, | 2226,22, | 2226,23, | 2226,24, | 2226,25, | 2226,26, | 2226,27, | 2226,28, | 2226,29, | 2226,30, | 2226,31, | 2226,32, | 2226,33, | 2226,34, | 2226,35, | 2226,36, | 2226,37, | 2226,38, | 2226,39, | 2226,40, | 2226,41, | 2226,42, | 2226,43, | 2226,44, | 2226,45, | 2226,46, | 2226,47, | 2226,48, | 2226,49, | 2226,50, | 2226,51, | 2226,52, | 2226,53, | 2226,54, | 2226,55, | 2226,56, | 2226,57, | 2226,58, | 2226,59, | 2226,60, | 2226,61, | 2226,62, | 2226,63, | 2226,64, | 2226,65, | 2226,66, | 2226,67, | 2226,68, | 2226,69, | 2226,70, | 2226,71, | 2226,72, | 2226,73, | 2226,74, | 2226,75, | 2226,76, | 2226,77, | 2226,78, | 2226,79, | 2226,80, | 2226,81, | 2226,82, | 2226,83, | 2226,84, | 2226,85, | 2227,1, | 2227,2, | 2227,3, | 2227,4, | 2227,5, | 2227,6, | 2227,7, | 2227,8, | 2227,9, | 2227,10, | 2227,11, | 2227,12, | 2227,13, | 2227,14, | 2227,15, | 2227,16, | 2227,17, | 2227,18, | 2227,19, | 2227,20, | 2227,21, | 2227,22, | 2227,23, | 2227,24, | 2227,25, | 2227,26, | 2227,27, | 2227,28, | 2227,29, | 2227,30, | 2227,31, | 2227,32, | 2227,33, | 2227,34, | 2227,35, | 2227,36, | 2227,37, | 2227,38, | 2227,39, | 2227,40, | 2227,41, | 2227,42, | 2227,43, | 2227,44, | 2227,45, | 2227,46, | 2227,47, | 2227,48, | 2227,49, | 2227,50, | 2227,51, | 2227,52, | 2227,53, | 2227,54, | 2227,55, | 2227,56, | 2227,57, | 2227,58, | 2227,59, | 2227,60, | 2227,61, | 2227,62, | 2227,63, | 2227,64, | 2227,65, | 2227,66, | 2227,67, | 2227,68, | 2227,69, | 2227,70, | 2227,71, | 2227,72, | 2227,73, | 2227,74, | 2227,75, | 2227,76, | 2227,77, | 2227,78, | 2227,79, | 2227,80, | 2227,81, | 2227,82, | 2227,83, | 2227,84, | 2227,85, | 2228,1, | 2228,2, | 2228,3, | 2228,4, | 2228,5, | 2228,6, | 2228,7, | 2228,8, | 2228,9, | 2228,10, | 2228,11, | 2228,12, | 2228,13, | 2228,14, | 2228,15, | 2228,16, | 2228,17, | 2228,18, | 2228,19, | 2228,20, | 2228,21, | 2228,22, | 2228,23, | 2228,24, | 2228,25, | 2228,26, | 2228,27, | 2228,28, | 2228,29, | 2228,30, | 2228,31, | 2228,32, | 2228,33, | 2228,34, | 2228,35, | 2228,36, | 2228,37, | 2228,38, | 2228,39, | 2228,40, | 2228,41, | 2228,42, | 2228,43, | 2228,44, | 2228,45, | 2228,46, | 2228,47, | 2228,48, | 2228,49, | 2228,50, | 2228,51, | 2228,52, | 2228,53, | 2228,54, | 2228,55, | 2228,56, | 2228,57, | 2228,58, | 2228,59, | 2228,60, | 2228,61, | 2228,62, | 2228,63, | 2228,64, | 2228,65, | 2228,66, | 2228,67, | 2228,68, | 2228,69, | 2228,70, | 2228,71, | 2228,72, | 2228,73, | 2228,74, | 2228,75, | 2228,76, | 2228,77, | 2228,78, | 2228,79, | 2228,80, | 2228,81, | 2228,82, | 2228,83, | 2228,84, | 2228,85, | 2229,1, | 2229,2, | 2229,3, | 2229,4, | 2229,5, | 2229,6, | 2229,7, | 2229,8, | 2229,9, | 2229,10, | 2229,11, | 2229,12, | 2229,13, | 2229,14, | 2229,15, | 2229,16, | 2229,17, | 2229,18, | 2229,19, | 2229,20, | 2229,21, | 2229,22, | 2229,23, | 2229,24, | 2229,25, | 2229,26, | 2229,27, | 2229,28, | 2229,29, | 2229,30, | 2229,31, | 2229,32, | 2229,33, | 2229,34, | 2229,35, | 2229,36, | 2229,37, | 2229,38, | 2229,39, | 2229,40, | 2229,41, | 2229,42, | 2229,43, | 2229,44, | 2229,45, | 2229,46, | 2229,47, | 2229,48, | 2229,49, | 2229,50, | 2229,51, | 2229,52, | 2229,53, | 2229,54, | 2229,55, | 2229,56, | 2229,57, | 2229,58, | 2229,59, | 2229,60, | 2229,61, | 2229,62, | 2229,63, | 2229,64, | 2229,65, | 2229,66, | 2229,67, | 2229,68, | 2229,69, | 2229,70, | 2229,71, | 2229,72, | 2229,73, | 2229,74, | 2229,75, | 2229,76, | 2229,77, | 2229,78, | 2229,79, | 2229,80, | 2229,81, | 2229,82, | 2229,83, | 2229,84, | 2229,85, | 2230,1, | 2230,2, | 2230,3, | 2230,4, | 2230,5, | 2230,6, | 2230,7, | 2230,8, | 2230,9, | 2230,10, | 2230,11, | 2230,12, | 2230,13, | 2230,14, | 2230,15, | 2230,16, | 2230,17, | 2230,18, | 2230,19, | 2230,20, | 2230,21, | 2230,22, | 2230,23, | 2230,24, | 2230,25, | 2230,26, | 2230,27, | 2230,28, | 2230,29, | 2230,30, | 2230,31, | 2230,32, | 2230,33, | 2230,34, | 2230,35, | 2230,36, | 2230,37, | 2230,38, | 2230,39, | 2230,40, | 2230,41, | 2230,42, | 2230,43, | 2230,44, | 2230,45, | 2230,46, | 2230,47, | 2230,48, | 2230,49, | 2230,50, | 2230,51, | 2230,52, | 2230,53, | 2230,54, | 2230,55, | 2230,56, | 2230,57, | 2230,58, | 2230,59, | 2230,60, | 2230,61, | 2230,62, | 2230,63, | 2230,64, | 2230,65, | 2230,66, | 2230,67, | 2230,68, | 2230,69, | 2230,70, | 2230,71, | 2230,72, | 2230,73, | 2230,74, | 2230,75, | 2230,76, | 2230,77, | 2230,78, | 2230,79, | 2230,80, | 2230,81, | 2230,82, | 2230,83, | 2230,84, | 2230,85, | 2231,1, | 2231,2, | 2231,3, | 2231,4, | 2231,5, | 2231,6, | 2231,7, | 2231,8, | 2231,9, | 2231,10, | 2231,11, | 2231,12, | 2231,13, | 2231,14, | 2231,15, | 2231,16, | 2231,17, | 2231,18, | 2231,19, | 2231,20, | 2231,21, | 2231,22, | 2231,23, | 2231,24, | 2231,25, | 2231,26, | 2231,27, | 2231,28, | 2231,29, | 2231,30, | 2231,31, | 2231,32, | 2231,33, | 2231,34, | 2231,35, | 2231,36, | 2231,37, | 2231,38, | 2231,39, | 2231,40, | 2231,41, | 2231,42, | 2231,43, | 2231,44, | 2231,45, | 2231,46, | 2231,47, | 2231,48, | 2231,49, | 2231,50, | 2231,51, | 2231,52, | 2231,53, | 2231,54, | 2231,55, | 2231,56, | 2231,57, | 2231,58, | 2231,59, | 2231,60, | 2231,61, | 2231,62, | 2231,63, | 2231,64, | 2231,65, | 2231,66, | 2231,67, | 2231,68, | 2231,69, | 2231,70, | 2231,71, | 2231,72, | 2231,73, | 2231,74, | 2231,75, | 2231,76, | 2231,77, | 2231,78, | 2231,79, | 2231,80, | 2231,81, | 2231,82, | 2231,83, | 2231,84, | 2231,85, | 2232,1, | 2232,2, | 2232,3, | 2232,4, | 2232,5, | 2232,6, | 2232,7, | 2232,8, | 2232,9, | 2232,10, | 2232,11, | 2232,12, | 2232,13, | 2232,14, | 2232,15, | 2232,16, | 2232,17, | 2232,18, | 2232,19, | 2232,20, | 2232,21, | 2232,22, | 2232,23, | 2232,24, | 2232,25, | 2232,26, | 2232,27, | 2232,28, | 2232,29, | 2232,30, | 2232,31, | 2232,32, | 2232,33, | 2232,34, | 2232,35, | 2232,36, | 2232,37, | 2232,38, | 2232,39, | 2232,40, | 2232,41, | 2232,42, | 2232,43, | 2232,44, | 2232,45, | 2232,46, | 2232,47, | 2232,48, | 2232,49, | 2232,50, | 2232,51, | 2232,52, | 2232,53, | 2232,54, | 2232,55, | 2232,56, | 2232,57, | 2232,58, | 2232,59, | 2232,60, | 2232,61, | 2232,62, | 2232,63, | 2232,64, | 2232,65, | 2232,66, | 2232,67, | 2232,68, | 2232,69, | 2232,70, | 2232,71, | 2232,72, | 2232,73, | 2232,74, | 2232,75, | 2232,76, | 2232,77, | 2232,78, | 2232,79, | 2232,80, | 2232,81, | 2232,82, | 2232,83, | 2232,84, | 2232,85, | 2233,1, | 2233,2, | 2233,3, | 2233,4, | 2233,5, | 2233,6, | 2233,7, | 2233,8, | 2233,9, | 2233,10, | 2233,11, | 2233,12, | 2233,13, | 2233,14, | 2233,15, | 2233,16, | 2233,17, | 2233,18, | 2233,19, | 2233,20, | 2233,21, | 2233,22, | 2233,23, | 2233,24, | 2233,25, | 2233,26, | 2233,27, | 2233,28, | 2233,29, | 2233,30, | 2233,31, | 2233,32, | 2233,33, | 2233,34, | 2233,35, | 2233,36, | 2233,37, | 2233,38, | 2233,39, | 2233,40, | 2233,41, | 2233,42, | 2233,43, | 2233,44, | 2233,45, | 2233,46, | 2233,47, | 2233,48, | 2233,49, | 2233,50, | 2233,51, | 2233,52, | 2233,53, | 2233,54, | 2233,55, | 2233,56, | 2233,57, | 2233,58, | 2233,59, | 2233,60, | 2233,61, | 2233,62, | 2233,63, | 2233,64, | 2233,65, | 2233,66, | 2233,67, | 2233,68, | 2233,69, | 2233,70, | 2233,71, | 2233,72, | 2233,73, | 2233,74, | 2233,75, | 2233,76, | 2233,77, | 2233,78, | 2233,79, | 2233,80, | 2233,81, | 2233,82, | 2233,83, | 2233,84, | 2233,85, | 2234,1, | 2234,2, | 2234,3, | 2234,4, | 2234,5, | 2234,6, | 2234,7, | 2234,8, | 2234,9, | 2234,10, | 2234,11, | 2234,12, | 2234,13, | 2234,14, | 2234,15, | 2234,16, | 2234,17, | 2234,18, | 2234,19, | 2234,20, | 2234,21, | 2234,22, | 2234,23, | 2234,24, | 2234,25, | 2234,26, | 2234,27, | 2234,28, | 2234,29, | 2234,30, | 2234,31, | 2234,32, | 2234,33, | 2234,34, | 2234,35, | 2234,36, | 2234,37, | 2234,38, | 2234,39, | 2234,40, | 2234,41, | 2234,42, | 2234,43, | 2234,44, | 2234,45, | 2234,46, | 2234,47, | 2234,48, | 2234,49, | 2234,50, | 2234,51, | 2234,52, | 2234,53, | 2234,54, | 2234,55, | 2234,56, | 2234,57, | 2234,58, | 2234,59, | 2234,60, | 2234,61, | 2234,62, | 2234,63, | 2234,64, | 2234,65, | 2234,66, | 2234,67, | 2234,68, | 2234,69, | 2234,70, | 2234,71, | 2234,72, | 2234,73, | 2234,74, | 2234,75, | 2234,76, | 2234,77, | 2234,78, | 2234,79, | 2234,80, | 2234,81, | 2234,82, | 2234,83, | 2234,84, | 2234,85, | 2235,1, | 2235,2, | 2235,3, | 2235,4, | 2235,5, | 2235,6, | 2235,7, | 2235,8, | 2235,9, | 2235,10, | 2235,11, | 2235,12, | 2235,13, | 2235,14, | 2235,15, | 2235,16, | 2235,17, | 2235,18, | 2235,19, | 2235,20, | 2235,21, | 2235,22, | 2235,23, | 2235,24, | 2235,25, | 2235,26, | 2235,27, | 2235,28, | 2235,29, | 2235,30, | 2235,31, | 2235,32, | 2235,33, | 2235,34, | 2235,35, | 2235,36, | 2235,37, | 2235,38, | 2235,39, | 2235,40, | 2235,41, | 2235,42, | 2235,43, | 2235,44, | 2235,45, | 2235,46, | 2235,47, | 2235,48, | 2235,49, | 2235,50, | 2235,51, | 2235,52, | 2235,53, | 2235,54, | 2235,55, | 2235,56, | 2235,57, | 2235,58, | 2235,59, | 2235,60, | 2235,61, | 2235,62, | 2235,63, | 2235,64, | 2235,65, | 2235,66, | 2235,67, | 2235,68, | 2235,69, | 2235,70, | 2235,71, | 2235,72, | 2235,73, | 2235,74, | 2235,75, | 2235,76, | 2235,77, | 2235,78, | 2235,79, | 2235,80, | 2235,81, | 2235,82, | 2235,83, | 2235,84, | 2235,85, | 2236,1, | 2236,2, | 2236,3, | 2236,4, | 2236,5, | 2236,6, | 2236,7, | 2236,8, | 2236,9, | 2236,10, | 2236,11, | 2236,12, | 2236,13, | 2236,14, | 2236,15, | 2236,16, | 2236,17, | 2236,18, | 2236,19, | 2236,20, | 2236,21, | 2236,22, | 2236,23, | 2236,24, | 2236,25, | 2236,26, | 2236,27, | 2236,28, | 2236,29, | 2236,30, | 2236,31, | 2236,32, | 2236,33, | 2236,34, | 2236,35, | 2236,36, | 2236,37, | 2236,38, | 2236,39, | 2236,40, | 2236,41, | 2236,42, | 2236,43, | 2236,44, | 2236,45, | 2236,46, | 2236,47, | 2236,48, | 2236,49, | 2236,50, | 2236,51, | 2236,52, | 2236,53, | 2236,54, | 2236,55, | 2236,56, | 2236,57, | 2236,58, | 2236,59, | 2236,60, | 2236,61, | 2236,62, | 2236,63, | 2236,64, | 2236,65, | 2236,66, | 2236,67, | 2236,68, | 2236,69, | 2236,70, | 2236,71, | 2236,72, | 2236,73, | 2236,74, | 2236,75, | 2236,76, | 2236,77, | 2236,78, | 2236,79, | 2236,80, | 2236,81, | 2236,82, | 2236,83, | 2236,84, | 2236,85, | 2237,1, | 2237,2, | 2237,3, | 2237,4, | 2237,5, | 2237,6, | 2237,7, | 2237,8, | 2237,9, | 2237,10, | 2237,11, | 2237,12, | 2237,13, | 2237,14, | 2237,15, | 2237,16, | 2237,17, | 2237,18, | 2237,19, | 2237,20, | 2237,21, | 2237,22, | 2237,23, | 2237,24, | 2237,25, | 2237,26, | 2237,27, | 2237,28, | 2237,29, | 2237,30, | 2237,31, | 2237,32, | 2237,33, | 2237,34, | 2237,35, | 2237,36, | 2237,37, | 2237,38, | 2237,39, | 2237,40, | 2237,41, | 2237,42, | 2237,43, | 2237,44, | 2237,45, | 2237,46, | 2237,47, | 2237,48, | 2237,49, | 2237,50, | 2237,51, | 2237,52, | 2237,53, | 2237,54, | 2237,55, | 2237,56, | 2237,57, | 2237,58, | 2237,59, | 2237,60, | 2237,61, | 2237,62, | 2237,63, | 2237,64, | 2237,65, | 2237,66, | 2237,67, | 2237,68, | 2237,69, | 2237,70, | 2237,71, | 2237,72, | 2237,73, | 2237,74, | 2237,75, | 2237,76, | 2237,77, | 2237,78, | 2237,79, | 2237,80, | 2237,81, | 2237,82, | 2237,83, | 2237,84, | 2237,85, | 2238,1, | 2238,2, | 2238,3, | 2238,4, | 2238,5, | 2238,6, | 2238,7, | 2238,8, | 2238,9, | 2238,10, | 2238,11, | 2238,12, | 2238,13, | 2238,14, | 2238,15, | 2238,16, | 2238,17, | 2238,18, | 2238,19, | 2238,20, | 2238,21, | 2238,22, | 2238,23, | 2238,24, | 2238,25, | 2238,26, | 2238,27, | 2238,28, | 2238,29, | 2238,30, | 2238,31, | 2238,32, | 2238,33, | 2238,34, | 2238,35, | 2238,36, | 2238,37, | 2238,38, | 2238,39, | 2238,40, | 2238,41, | 2238,42, | 2238,43, | 2238,44, | 2238,45, | 2238,46, | 2238,47, | 2238,48, | 2238,49, | 2238,50, | 2238,51, | 2238,52, | 2238,53, | 2238,54, | 2238,55, | 2238,56, | 2238,57, | 2238,58, | 2238,59, | 2238,60, | 2238,61, | 2238,62, | 2238,63, | 2238,64, | 2238,65, | 2238,66, | 2238,67, | 2238,68, | 2238,69, | 2238,70, | 2238,71, | 2238,72, | 2238,73, | 2238,74, | 2238,75, | 2238,76, | 2238,77, | 2238,78, | 2238,79, | 2238,80, | 2238,81, | 2238,82, | 2238,83, | 2238,84, | 2238,85, | 2239,1, | 2239,2, | 2239,3, | 2239,4, | 2239,5, | 2239,6, | 2239,7, | 2239,8, | 2239,9, | 2239,10, | 2239,11, | 2239,12, | 2239,13, | 2239,14, | 2239,15, | 2239,16, | 2239,17, | 2239,18, | 2239,19, | 2239,20, | 2239,21, | 2239,22, | 2239,23, | 2239,24, | 2239,25, | 2239,26, | 2239,27, | 2239,28, | 2239,29, | 2239,30, | 2239,31, | 2239,32, | 2239,33, | 2239,34, | 2239,35, | 2239,36, | 2239,37, | 2239,38, | 2239,39, | 2239,40, | 2239,41, | 2239,42, | 2239,43, | 2239,44, | 2239,45, | 2239,46, | 2239,47, | 2239,48, | 2239,49, | 2239,50, | 2239,51, | 2239,52, | 2239,53, | 2239,54, | 2239,55, | 2239,56, | 2239,57, | 2239,58, | 2239,59, | 2239,60, | 2239,61, | 2239,62, | 2239,63, | 2239,64, | 2239,65, | 2239,66, | 2239,67, | 2239,68, | 2239,69, | 2239,70, | 2239,71, | 2239,72, | 2239,73, | 2239,74, | 2239,75, | 2239,76, | 2239,77, | 2239,78, | 2239,79, | 2239,80, | 2239,81, | 2239,82, | 2239,83, | 2239,84, | 2239,85, | 2240,1, | 2240,2, | 2240,3, | 2240,4, | 2240,5, | 2240,6, | 2240,7, | 2240,8, | 2240,9, | 2240,10, | 2240,11, | 2240,12, | 2240,13, | 2240,14, | 2240,15, | 2240,16, | 2240,17, | 2240,18, | 2240,19, | 2240,20, | 2240,21, | 2240,22, | 2240,23, | 2240,24, | 2240,25, | 2240,26, | 2240,27, | 2240,28, | 2240,29, | 2240,30, | 2240,31, | 2240,32, | 2240,33, | 2240,34, | 2240,35, | 2240,36, | 2240,37, | 2240,38, | 2240,39, | 2240,40, | 2240,41, | 2240,42, | 2240,43, | 2240,44, | 2240,45, | 2240,46, | 2240,47, | 2240,48, | 2240,49, | 2240,50, | 2240,51, | 2240,52, | 2240,53, | 2240,54, | 2240,55, | 2240,56, | 2240,57, | 2240,58, | 2240,59, | 2240,60, | 2240,61, | 2240,62, | 2240,63, | 2240,64, | 2240,65, | 2240,66, | 2240,67, | 2240,68, | 2240,69, | 2240,70, | 2240,71, | 2240,72, | 2240,73, | 2240,74, | 2240,75, | 2240,76, | 2240,77, | 2240,78, | 2240,79, | 2240,80, | 2240,81, | 2240,82, | 2240,83, | 2240,84, | 2240,85, | 2241,1, | 2241,2, | 2241,3, | 2241,4, | 2241,5, | 2241,6, | 2241,7, | 2241,8, | 2241,9, | 2241,10, | 2241,11, | 2241,12, | 2241,13, | 2241,14, | 2241,15, | 2241,16, | 2241,17, | 2241,18, | 2241,19, | 2241,20, | 2241,21, | 2241,22, | 2241,23, | 2241,24, | 2241,25, | 2241,26, | 2241,27, | 2241,28, | 2241,29, | 2241,30, | 2241,31, | 2241,32, | 2241,33, | 2241,34, | 2241,35, | 2241,36, | 2241,37, | 2241,38, | 2241,39, | 2241,40, | 2241,41, | 2241,42, | 2241,43, | 2241,44, | 2241,45, | 2241,46, | 2241,47, | 2241,48, | 2241,49, | 2241,50, | 2241,51, | 2241,52, | 2241,53, | 2241,54, | 2241,55, | 2241,56, | 2241,57, | 2241,58, | 2241,59, | 2241,60, | 2241,61, | 2241,62, | 2241,63, | 2241,64, | 2241,65, | 2241,66, | 2241,67, | 2241,68, | 2241,69, | 2241,70, | 2241,71, | 2241,72, | 2241,73, | 2241,74, | 2241,75, | 2241,76, | 2241,77, | 2241,78, | 2241,79, | 2241,80, | 2241,81, | 2241,82, | 2241,83, | 2241,84, | 2241,85, | 2242,1, | 2242,2, | 2242,3, | 2242,4, | 2242,5, | 2242,6, | 2242,7, | 2242,8, | 2242,9, | 2242,10, | 2242,11, | 2242,12, | 2242,13, | 2242,14, | 2242,15, | 2242,16, | 2242,17, | 2242,18, | 2242,19, | 2242,20, | 2242,21, | 2242,22, | 2242,23, | 2242,24, | 2242,25, | 2242,26, | 2242,27, | 2242,28, | 2242,29, | 2242,30, | 2242,31, | 2242,32, | 2242,33, | 2242,34, | 2242,35, | 2242,36, | 2242,37, | 2242,38, | 2242,39, | 2242,40, | 2242,41, | 2242,42, | 2242,43, | 2242,44, | 2242,45, | 2242,46, | 2242,47, | 2242,48, | 2242,49, | 2242,50, | 2242,51, | 2242,52, | 2242,53, | 2242,54, | 2242,55, | 2242,56, | 2242,57, | 2242,58, | 2242,59, | 2242,60, | 2242,61, | 2242,62, | 2242,63, | 2242,64, | 2242,65, | 2242,66, | 2242,67, | 2242,68, | 2242,69, | 2242,70, | 2242,71, | 2242,72, | 2242,73, | 2242,74, | 2242,75, | 2242,76, | 2242,77, | 2242,78, | 2242,79, | 2242,80, | 2242,81, | 2242,82, | 2242,83, | 2242,84, | 2242,85, | 2243,1, | 2243,2, | 2243,3, | 2243,4, | 2243,5, | 2243,6, | 2243,7, | 2243,8, | 2243,9, | 2243,10, | 2243,11, | 2243,12, | 2243,13, | 2243,14, | 2243,15, | 2243,16, | 2243,17, | 2243,18, | 2243,19, | 2243,20, | 2243,21, | 2243,22, | 2243,23, | 2243,24, | 2243,25, | 2243,26, | 2243,27, | 2243,28, | 2243,29, | 2243,30, | 2243,31, | 2243,32, | 2243,33, | 2243,34, | 2243,35, | 2243,36, | 2243,37, | 2243,38, | 2243,39, | 2243,40, | 2243,41, | 2243,42, | 2243,43, | 2243,44, | 2243,45, | 2243,46, | 2243,47, | 2243,48, | 2243,49, | 2243,50, | 2243,51, | 2243,52, | 2243,53, | 2243,54, | 2243,55, | 2243,56, | 2243,57, | 2243,58, | 2243,59, | 2243,60, | 2243,61, | 2243,62, | 2243,63, | 2243,64, | 2243,65, | 2243,66, | 2243,67, | 2243,68, | 2243,69, | 2243,70, | 2243,71, | 2243,72, | 2243,73, | 2243,74, | 2243,75, | 2243,76, | 2243,77, | 2243,78, | 2243,79, | 2243,80, | 2243,81, | 2243,82, | 2243,83, | 2243,84, | 2243,85, | 2244,1, | 2244,2, | 2244,3, | 2244,4, | 2244,5, | 2244,6, | 2244,7, | 2244,8, | 2244,9, | 2244,10, | 2244,11, | 2244,12, | 2244,13, | 2244,14, | 2244,15, | 2244,16, | 2244,17, | 2244,18, | 2244,19, | 2244,20, | 2244,21, | 2244,22, | 2244,23, | 2244,24, | 2244,25, | 2244,26, | 2244,27, | 2244,28, | 2244,29, | 2244,30, | 2244,31, | 2244,32, | 2244,33, | 2244,34, | 2244,35, | 2244,36, | 2244,37, | 2244,38, | 2244,39, | 2244,40, | 2244,41, | 2244,42, | 2244,43, | 2244,44, | 2244,45, | 2244,46, | 2244,47, | 2244,48, | 2244,49, | 2244,50, | 2244,51, | 2244,52, | 2244,53, | 2244,54, | 2244,55, | 2244,56, | 2244,57, | 2244,58, | 2244,59, | 2244,60, | 2244,61, | 2244,62, | 2244,63, | 2244,64, | 2244,65, | 2244,66, | 2244,67, | 2244,68, | 2244,69, | 2244,70, | 2244,71, | 2244,72, | 2244,73, | 2244,74, | 2244,75, | 2244,76, | 2244,77, | 2244,78, | 2244,79, | 2244,80, | 2244,81, | 2244,82, | 2244,83, | 2244,84, | 2244,85, | 2245,1, | 2245,2, | 2245,3, | 2245,4, | 2245,5, | 2245,6, | 2245,7, | 2245,8, | 2245,9, | 2245,10, | 2245,11, | 2245,12, | 2245,13, | 2245,14, | 2245,15, | 2245,16, | 2245,17, | 2245,18, | 2245,19, | 2245,20, | 2245,21, | 2245,22, | 2245,23, | 2245,24, | 2245,25, | 2245,26, | 2245,27, | 2245,28, | 2245,29, | 2245,30, | 2245,31, | 2245,32, | 2245,33, | 2245,34, | 2245,35, | 2245,36, | 2245,37, | 2245,38, | 2245,39, | 2245,40, | 2245,41, | 2245,42, | 2245,43, | 2245,44, | 2245,45, | 2245,46, | 2245,47, | 2245,48, | 2245,49, | 2245,50, | 2245,51, | 2245,52, | 2245,53, | 2245,54, | 2245,55, | 2245,56, | 2245,57, | 2245,58, | 2245,59, | 2245,60, | 2245,61, | 2245,62, | 2245,63, | 2245,64, | 2245,65, | 2245,66, | 2245,67, | 2245,68, | 2245,69, | 2245,70, | 2245,71, | 2245,72, | 2245,73, | 2245,74, | 2245,75, | 2245,76, | 2245,77, | 2245,78, | 2245,79, | 2245,80, | 2245,81, | 2245,82, | 2245,83, | 2245,84, | 2245,85, | 2246,1, | 2246,2, | 2246,3, | 2246,4, | 2246,5, | 2246,6, | 2246,7, | 2246,8, | 2246,9, | 2246,10, | 2246,11, | 2246,12, | 2246,13, | 2246,14, | 2246,15, | 2246,16, | 2246,17, | 2246,18, | 2246,19, | 2246,20, | 2246,21, | 2246,22, | 2246,23, | 2246,24, | 2246,25, | 2246,26, | 2246,27, | 2246,28, | 2246,29, | 2246,30, | 2246,31, | 2246,32, | 2246,33, | 2246,34, | 2246,35, | 2246,36, | 2246,37, | 2246,38, | 2246,39, | 2246,40, | 2246,41, | 2246,42, | 2246,43, | 2246,44, | 2246,45, | 2246,46, | 2246,47, | 2246,48, | 2246,49, | 2246,50, | 2246,51, | 2246,52, | 2246,53, | 2246,54, | 2246,55, | 2246,56, | 2246,57, | 2246,58, | 2246,59, | 2246,60, | 2246,61, | 2246,62, | 2246,63, | 2246,64, | 2246,65, | 2246,66, | 2246,67, | 2246,68, | 2246,69, | 2246,70, | 2246,71, | 2246,72, | 2246,73, | 2246,74, | 2246,75, | 2246,76, | 2246,77, | 2246,78, | 2246,79, | 2246,80, | 2246,81, | 2246,82, | 2246,83, | 2246,84, | 2246,85, | 2247,1, | 2247,2, | 2247,3, | 2247,4, | 2247,5, | 2247,6, | 2247,7, | 2247,8, | 2247,9, | 2247,10, | 2247,11, | 2247,12, | 2247,13, | 2247,14, | 2247,15, | 2247,16, | 2247,17, | 2247,18, | 2247,19, | 2247,20, | 2247,21, | 2247,22, | 2247,23, | 2247,24, | 2247,25, | 2247,26, | 2247,27, | 2247,28, | 2247,29, | 2247,30, | 2247,31, | 2247,32, | 2247,33, | 2247,34, | 2247,35, | 2247,36, | 2247,37, | 2247,38, | 2247,39, | 2247,40, | 2247,41, | 2247,42, | 2247,43, | 2247,44, | 2247,45, | 2247,46, | 2247,47, | 2247,48, | 2247,49, | 2247,50, | 2247,51, | 2247,52, | 2247,53, | 2247,54, | 2247,55, | 2247,56, | 2247,57, | 2247,58, | 2247,59, | 2247,60, | 2247,61, | 2247,62, | 2247,63, | 2247,64, | 2247,65, | 2247,66, | 2247,67, | 2247,68, | 2247,69, | 2247,70, | 2247,71, | 2247,72, | 2247,73, | 2247,74, | 2247,75, | 2247,76, | 2247,77, | 2247,78, | 2247,79, | 2247,80, | 2247,81, | 2247,82, | 2247,83, | 2247,84, | 2247,85, | 2248,1, | 2248,2, | 2248,3, | 2248,4, | 2248,5, | 2248,6, | 2248,7, | 2248,8, | 2248,9, | 2248,10, | 2248,11, | 2248,12, | 2248,13, | 2248,14, | 2248,15, | 2248,16, | 2248,17, | 2248,18, | 2248,19, | 2248,20, | 2248,21, | 2248,22, | 2248,23, | 2248,24, | 2248,25, | 2248,26, | 2248,27, | 2248,28, | 2248,29, | 2248,30, | 2248,31, | 2248,32, | 2248,33, | 2248,34, | 2248,35, | 2248,36, | 2248,37, | 2248,38, | 2248,39, | 2248,40, | 2248,41, | 2248,42, | 2248,43, | 2248,44, | 2248,45, | 2248,46, | 2248,47, | 2248,48, | 2248,49, | 2248,50, | 2248,51, | 2248,52, | 2248,53, | 2248,54, | 2248,55, | 2248,56, | 2248,57, | 2248,58, | 2248,59, | 2248,60, | 2248,61, | 2248,62, | 2248,63, | 2248,64, | 2248,65, | 2248,66, | 2248,67, | 2248,68, | 2248,69, | 2248,70, | 2248,71, | 2248,72, | 2248,73, | 2248,74, | 2248,75, | 2248,76, | 2248,77, | 2248,78, | 2248,79, | 2248,80, | 2248,81, | 2248,82, | 2248,83, | 2248,84, | 2248,85, | 2249,1, | 2249,2, | 2249,3, | 2249,4, | 2249,5, | 2249,6, | 2249,7, | 2249,8, | 2249,9, | 2249,10, | 2249,11, | 2249,12, | 2249,13, | 2249,14, | 2249,15, | 2249,16, | 2249,17, | 2249,18, | 2249,19, | 2249,20, | 2249,21, | 2249,22, | 2249,23, | 2249,24, | 2249,25, | 2249,26, | 2249,27, | 2249,28, | 2249,29, | 2249,30, | 2249,31, | 2249,32, | 2249,33, | 2249,34, | 2249,35, | 2249,36, | 2249,37, | 2249,38, | 2249,39, | 2249,40, | 2249,41, | 2249,42, | 2249,43, | 2249,44, | 2249,45, | 2249,46, | 2249,47, | 2249,48, | 2249,49, | 2249,50, | 2249,51, | 2249,52, | 2249,53, | 2249,54, | 2249,55, | 2249,56, | 2249,57, | 2249,58, | 2249,59, | 2249,60, | 2249,61, | 2249,62, | 2249,63, | 2249,64, | 2249,65, | 2249,66, | 2249,67, | 2249,68, | 2249,69, | 2249,70, | 2249,71, | 2249,72, | 2249,73, | 2249,74, | 2249,75, | 2249,76, | 2249,77, | 2249,78, | 2249,79, | 2249,80, | 2249,81, | 2249,82, | 2249,83, | 2249,84, | 2249,85, | 2250,1, | 2250,2, | 2250,3, | 2250,4, | 2250,5, | 2250,6, | 2250,7, | 2250,8, | 2250,9, | 2250,10, | 2250,11, | 2250,12, | 2250,13, | 2250,14, | 2250,15, | 2250,16, | 2250,17, | 2250,18, | 2250,19, | 2250,20, | 2250,21, | 2250,22, | 2250,23, | 2250,24, | 2250,25, | 2250,26, | 2250,27, | 2250,28, | 2250,29, | 2250,30, | 2250,31, | 2250,32, | 2250,33, | 2250,34, | 2250,35, | 2250,36, | 2250,37, | 2250,38, | 2250,39, | 2250,40, | 2250,41, | 2250,42, | 2250,43, | 2250,44, | 2250,45, | 2250,46, | 2250,47, | 2250,48, | 2250,49, | 2250,50, | 2250,51, | 2250,52, | 2250,53, | 2250,54, | 2250,55, | 2250,56, | 2250,57, | 2250,58, | 2250,59, | 2250,60, | 2250,61, | 2250,62, | 2250,63, | 2250,64, | 2250,65, | 2250,66, | 2250,67, | 2250,68, | 2250,69, | 2250,70, | 2250,71, | 2250,72, | 2250,73, | 2250,74, | 2250,75, | 2250,76, | 2250,77, | 2250,78, | 2250,79, | 2250,80, | 2250,81, | 2250,82, | 2250,83, | 2250,84, | 2250,85, | 2251,1, | 2251,2, | 2251,3, | 2251,4, | 2251,5, | 2251,6, | 2251,7, | 2251,8, | 2251,9, | 2251,10, | 2251,11, | 2251,12, | 2251,13, | 2251,14, | 2251,15, | 2251,16, | 2251,17, | 2251,18, | 2251,19, | 2251,20, | 2251,21, | 2251,22, | 2251,23, | 2251,24, | 2251,25, | 2251,26, | 2251,27, | 2251,28, | 2251,29, | 2251,30, | 2251,31, | 2251,32, | 2251,33, | 2251,34, | 2251,35, | 2251,36, | 2251,37, | 2251,38, | 2251,39, | 2251,40, | 2251,41, | 2251,42, | 2251,43, | 2251,44, | 2251,45, | 2251,46, | 2251,47, | 2251,48, | 2251,49, | 2251,50, | 2251,51, | 2251,52, | 2251,53, | 2251,54, | 2251,55, | 2251,56, | 2251,57, | 2251,58, | 2251,59, | 2251,60, | 2251,61, | 2251,62, | 2251,63, | 2251,64, | 2251,65, | 2251,66, | 2251,67, | 2251,68, | 2251,69, | 2251,70, | 2251,71, | 2251,72, | 2251,73, | 2251,74, | 2251,75, | 2251,76, | 2251,77, | 2251,78, | 2251,79, | 2251,80, | 2251,81, | 2251,82, | 2251,83, | 2251,84, | 2251,85, | 2252,1, | 2252,2, | 2252,3, | 2252,4, | 2252,5, | 2252,6, | 2252,7, | 2252,8, | 2252,9, | 2252,10, | 2252,11, | 2252,12, | 2252,13, | 2252,14, | 2252,15, | 2252,16, | 2252,17, | 2252,18, | 2252,19, | 2252,20, | 2252,21, | 2252,22, | 2252,23, | 2252,24, | 2252,25, | 2252,26, | 2252,27, | 2252,28, | 2252,29, | 2252,30, | 2252,31, | 2252,32, | 2252,33, | 2252,34, | 2252,35, | 2252,36, | 2252,37, | 2252,38, | 2252,39, | 2252,40, | 2252,41, | 2252,42, | 2252,43, | 2252,44, | 2252,45, | 2252,46, | 2252,47, | 2252,48, | 2252,49, | 2252,50, | 2252,51, | 2252,52, | 2252,53, | 2252,54, | 2252,55, | 2252,56, | 2252,57, | 2252,58, | 2252,59, | 2252,60, | 2252,61, | 2252,62, | 2252,63, | 2252,64, | 2252,65, | 2252,66, | 2252,67, | 2252,68, | 2252,69, | 2252,70, | 2252,71, | 2252,72, | 2252,73, | 2252,74, | 2252,75, | 2252,76, | 2252,77, | 2252,78, | 2252,79, | 2252,80, | 2252,81, | 2252,82, | 2252,83, | 2252,84, | 2252,85, | 2253,1, | 2253,2, | 2253,3, | 2253,4, | 2253,5, | 2253,6, | 2253,7, | 2253,8, | 2253,9, | 2253,10, | 2253,11, | 2253,12, | 2253,13, | 2253,14, | 2253,15, | 2253,16, | 2253,17, | 2253,18, | 2253,19, | 2253,20, | 2253,21, | 2253,22, | 2253,23, | 2253,24, | 2253,25, | 2253,26, | 2253,27, | 2253,28, | 2253,29, | 2253,30, | 2253,31, | 2253,32, | 2253,33, | 2253,34, | 2253,35, | 2253,36, | 2253,37, | 2253,38, | 2253,39, | 2253,40, | 2253,41, | 2253,42, | 2253,43, | 2253,44, | 2253,45, | 2253,46, | 2253,47, | 2253,48, | 2253,49, | 2253,50, | 2253,51, | 2253,52, | 2253,53, | 2253,54, | 2253,55, | 2253,56, | 2253,57, | 2253,58, | 2253,59, | 2253,60, | 2253,61, | 2253,62, | 2253,63, | 2253,64, | 2253,65, | 2253,66, | 2253,67, | 2253,68, | 2253,69, | 2253,70, | 2253,71, | 2253,72, | 2253,73, | 2253,74, | 2253,75, | 2253,76, | 2253,77, | 2253,78, | 2253,79, | 2253,80, | 2253,81, | 2253,82, | 2253,83, | 2253,84, | 2253,85, | 2254,1, | 2254,2, | 2254,3, | 2254,4, | 2254,5, | 2254,6, | 2254,7, | 2254,8, | 2254,9, | 2254,10, | 2254,11, | 2254,12, | 2254,13, | 2254,14, | 2254,15, | 2254,16, | 2254,17, | 2254,18, | 2254,19, | 2254,20, | 2254,21, | 2254,22, | 2254,23, | 2254,24, | 2254,25, | 2254,26, | 2254,27, | 2254,28, | 2254,29, | 2254,30, | 2254,31, | 2254,32, | 2254,33, | 2254,34, | 2254,35, | 2254,36, | 2254,37, | 2254,38, | 2254,39, | 2254,40, | 2254,41, | 2254,42, | 2254,43, | 2254,44, | 2254,45, | 2254,46, | 2254,47, | 2254,48, | 2254,49, | 2254,50, | 2254,51, | 2254,52, | 2254,53, | 2254,54, | 2254,55, | 2254,56, | 2254,57, | 2254,58, | 2254,59, | 2254,60, | 2254,61, | 2254,62, | 2254,63, | 2254,64, | 2254,65, | 2254,66, | 2254,67, | 2254,68, | 2254,69, | 2254,70, | 2254,71, | 2254,72, | 2254,73, | 2254,74, | 2254,75, | 2254,76, | 2254,77, | 2254,78, | 2254,79, | 2254,80, | 2254,81, | 2254,82, | 2254,83, | 2254,84, | 2254,85, | 2255,1, | 2255,2, | 2255,3, | 2255,4, | 2255,5, | 2255,6, | 2255,7, | 2255,8, | 2255,9, | 2255,10, | 2255,11, | 2255,12, | 2255,13, | 2255,14, | 2255,15, | 2255,16, | 2255,17, | 2255,18, | 2255,19, | 2255,20, | 2255,21, | 2255,22, | 2255,23, | 2255,24, | 2255,25, | 2255,26, | 2255,27, | 2255,28, | 2255,29, | 2255,30, | 2255,31, | 2255,32, | 2255,33, | 2255,34, | 2255,35, | 2255,36, | 2255,37, | 2255,38, | 2255,39, | 2255,40, | 2255,41, | 2255,42, | 2255,43, | 2255,44, | 2255,45, | 2255,46, | 2255,47, | 2255,48, | 2255,49, | 2255,50, | 2255,51, | 2255,52, | 2255,53, | 2255,54, | 2255,55, | 2255,56, | 2255,57, | 2255,58, | 2255,59, | 2255,60, | 2255,61, | 2255,62, | 2255,63, | 2255,64, | 2255,65, | 2255,66, | 2255,67, | 2255,68, | 2255,69, | 2255,70, | 2255,71, | 2255,72, | 2255,73, | 2255,74, | 2255,75, | 2255,76, | 2255,77, | 2255,78, | 2255,79, | 2255,80, | 2255,81, | 2255,82, | 2255,83, | 2255,84, | 2255,85, | 2256,1, | 2256,2, | 2256,3, | 2256,4, | 2256,5, | 2256,6, | 2256,7, | 2256,8, | 2256,9, | 2256,10, | 2256,11, | 2256,12, | 2256,13, | 2256,14, | 2256,15, | 2256,16, | 2256,17, | 2256,18, | 2256,19, | 2256,20, | 2256,21, | 2256,22, | 2256,23, | 2256,24, | 2256,25, | 2256,26, | 2256,27, | 2256,28, | 2256,29, | 2256,30, | 2256,31, | 2256,32, | 2256,33, | 2256,34, | 2256,35, | 2256,36, | 2256,37, | 2256,38, | 2256,39, | 2256,40, | 2256,41, | 2256,42, | 2256,43, | 2256,44, | 2256,45, | 2256,46, | 2256,47, | 2256,48, | 2256,49, | 2256,50, | 2256,51, | 2256,52, | 2256,53, | 2256,54, | 2256,55, | 2256,56, | 2256,57, | 2256,58, | 2256,59, | 2256,60, | 2256,61, | 2256,62, | 2256,63, | 2256,64, | 2256,65, | 2256,66, | 2256,67, | 2256,68, | 2256,69, | 2256,70, | 2256,71, | 2256,72, | 2256,73, | 2256,74, | 2256,75, | 2256,76, | 2256,77, | 2256,78, | 2256,79, | 2256,80, | 2256,81, | 2256,82, | 2256,83, | 2256,84, | 2256,85, | 2257,1, | 2257,2, | 2257,3, | 2257,4, | 2257,5, | 2257,6, | 2257,7, | 2257,8, | 2257,9, | 2257,10, | 2257,11, | 2257,12, | 2257,13, | 2257,14, | 2257,15, | 2257,16, | 2257,17, | 2257,18, | 2257,19, | 2257,20, | 2257,21, | 2257,22, | 2257,23, | 2257,24, | 2257,25, | 2257,26, | 2257,27, | 2257,28, | 2257,29, | 2257,30, | 2257,31, | 2257,32, | 2257,33, | 2257,34, | 2257,35, | 2257,36, | 2257,37, | 2257,38, | 2257,39, | 2257,40, | 2257,41, | 2257,42, | 2257,43, | 2257,44, | 2257,45, | 2257,46, | 2257,47, | 2257,48, | 2257,49, | 2257,50, | 2257,51, | 2257,52, | 2257,53, | 2257,54, | 2257,55, | 2257,56, | 2257,57, | 2257,58, | 2257,59, | 2257,60, | 2257,61, | 2257,62, | 2257,63, | 2257,64, | 2257,65, | 2257,66, | 2257,67, | 2257,68, | 2257,69, | 2257,70, | 2257,71, | 2257,72, | 2257,73, | 2257,74, | 2257,75, | 2257,76, | 2257,77, | 2257,78, | 2257,79, | 2257,80, | 2257,81, | 2257,82, | 2257,83, | 2257,84, | 2257,85, | 2258,1, | 2258,2, | 2258,3, | 2258,4, | 2258,5, | 2258,6, | 2258,7, | 2258,8, | 2258,9, | 2258,10, | 2258,11, | 2258,12, | 2258,13, | 2258,14, | 2258,15, | 2258,16, | 2258,17, | 2258,18, | 2258,19, | 2258,20, | 2258,21, | 2258,22, | 2258,23, | 2258,24, | 2258,25, | 2258,26, | 2258,27, | 2258,28, | 2258,29, | 2258,30, | 2258,31, | 2258,32, | 2258,33, | 2258,34, | 2258,35, | 2258,36, | 2258,37, | 2258,38, | 2258,39, | 2258,40, | 2258,41, | 2258,42, | 2258,43, | 2258,44, | 2258,45, | 2258,46, | 2258,47, | 2258,48, | 2258,49, | 2258,50, | 2258,51, | 2258,52, | 2258,53, | 2258,54, | 2258,55, | 2258,56, | 2258,57, | 2258,58, | 2258,59, | 2258,60, | 2258,61, | 2258,62, | 2258,63, | 2258,64, | 2258,65, | 2258,66, | 2258,67, | 2258,68, | 2258,69, | 2258,70, | 2258,71, | 2258,72, | 2258,73, | 2258,74, | 2258,75, | 2258,76, | 2258,77, | 2258,78, | 2258,79, | 2258,80, | 2258,81, | 2258,82, | 2258,83, | 2258,84, | 2258,85, | 2259,1, | 2259,2, | 2259,3, | 2259,4, | 2259,5, | 2259,6, | 2259,7, | 2259,8, | 2259,9, | 2259,10, | 2259,11, | 2259,12, | 2259,13, | 2259,14, | 2259,15, | 2259,16, | 2259,17, | 2259,18, | 2259,19, | 2259,20, | 2259,21, | 2259,22, | 2259,23, | 2259,24, | 2259,25, | 2259,26, | 2259,27, | 2259,28, | 2259,29, | 2259,30, | 2259,31, | 2259,32, | 2259,33, | 2259,34, | 2259,35, | 2259,36, | 2259,37, | 2259,38, | 2259,39, | 2259,40, | 2259,41, | 2259,42, | 2259,43, | 2259,44, | 2259,45, | 2259,46, | 2259,47, | 2259,48, | 2259,49, | 2259,50, | 2259,51, | 2259,52, | 2259,53, | 2259,54, | 2259,55, | 2259,56, | 2259,57, | 2259,58, | 2259,59, | 2259,60, | 2259,61, | 2259,62, | 2259,63, | 2259,64, | 2259,65, | 2259,66, | 2259,67, | 2259,68, | 2259,69, | 2259,70, | 2259,71, | 2259,72, | 2259,73, | 2259,74, | 2259,75, | 2259,76, | 2259,77, | 2259,78, | 2259,79, | 2259,80, | 2259,81, | 2259,82, | 2259,83, | 2259,84, | 2259,85, | 2260,1, | 2260,2, | 2260,3, | 2260,4, | 2260,5, | 2260,6, | 2260,7, | 2260,8, | 2260,9, | 2260,10, | 2260,11, | 2260,12, | 2260,13, | 2260,14, | 2260,15, | 2260,16, | 2260,17, | 2260,18, | 2260,19, | 2260,20, | 2260,21, | 2260,22, | 2260,23, | 2260,24, | 2260,25, | 2260,26, | 2260,27, | 2260,28, | 2260,29, | 2260,30, | 2260,31, | 2260,32, | 2260,33, | 2260,34, | 2260,35, | 2260,36, | 2260,37, | 2260,38, | 2260,39, | 2260,40, | 2260,41, | 2260,42, | 2260,43, | 2260,44, | 2260,45, | 2260,46, | 2260,47, | 2260,48, | 2260,49, | 2260,50, | 2260,51, | 2260,52, | 2260,53, | 2260,54, | 2260,55, | 2260,56, | 2260,57, | 2260,58, | 2260,59, | 2260,60, | 2260,61, | 2260,62, | 2260,63, | 2260,64, | 2260,65, | 2260,66, | 2260,67, | 2260,68, | 2260,69, | 2260,70, | 2260,71, | 2260,72, | 2260,73, | 2260,74, | 2260,75, | 2260,76, | 2260,77, | 2260,78, | 2260,79, | 2260,80, | 2260,81, | 2260,82, | 2260,83, | 2260,84, | 2260,85, | 2261,1, | 2261,2, | 2261,3, | 2261,4, | 2261,5, | 2261,6, | 2261,7, | 2261,8, | 2261,9, | 2261,10, | 2261,11, | 2261,12, | 2261,13, | 2261,14, | 2261,15, | 2261,16, | 2261,17, | 2261,18, | 2261,19, | 2261,20, | 2261,21, | 2261,22, | 2261,23, | 2261,24, | 2261,25, | 2261,26, | 2261,27, | 2261,28, | 2261,29, | 2261,30, | 2261,31, | 2261,32, | 2261,33, | 2261,34, | 2261,35, | 2261,36, | 2261,37, | 2261,38, | 2261,39, | 2261,40, | 2261,41, | 2261,42, | 2261,43, | 2261,44, | 2261,45, | 2261,46, | 2261,47, | 2261,48, | 2261,49, | 2261,50, | 2261,51, | 2261,52, | 2261,53, | 2261,54, | 2261,55, | 2261,56, | 2261,57, | 2261,58, | 2261,59, | 2261,60, | 2261,61, | 2261,62, | 2261,63, | 2261,64, | 2261,65, | 2261,66, | 2261,67, | 2261,68, | 2261,69, | 2261,70, | 2261,71, | 2261,72, | 2261,73, | 2261,74, | 2261,75, | 2261,76, | 2261,77, | 2261,78, | 2261,79, | 2261,80, | 2261,81, | 2261,82, | 2261,83, | 2261,84, | 2261,85, | 2262,1, | 2262,2, | 2262,3, | 2262,4, | 2262,5, | 2262,6, | 2262,7, | 2262,8, | 2262,9, | 2262,10, | 2262,11, | 2262,12, | 2262,13, | 2262,14, | 2262,15, | 2262,16, | 2262,17, | 2262,18, | 2262,19, | 2262,20, | 2262,21, | 2262,22, | 2262,23, | 2262,24, | 2262,25, | 2262,26, | 2262,27, | 2262,28, | 2262,29, | 2262,30, | 2262,31, | 2262,32, | 2262,33, | 2262,34, | 2262,35, | 2262,36, | 2262,37, | 2262,38, | 2262,39, | 2262,40, | 2262,41, | 2262,42, | 2262,43, | 2262,44, | 2262,45, | 2262,46, | 2262,47, | 2262,48, | 2262,49, | 2262,50, | 2262,51, | 2262,52, | 2262,53, | 2262,54, | 2262,55, | 2262,56, | 2262,57, | 2262,58, | 2262,59, | 2262,60, | 2262,61, | 2262,62, | 2262,63, | 2262,64, | 2262,65, | 2262,66, | 2262,67, | 2262,68, | 2262,69, | 2262,70, | 2262,71, | 2262,72, | 2262,73, | 2262,74, | 2262,75, | 2262,76, | 2262,77, | 2262,78, | 2262,79, | 2262,80, | 2262,81, | 2262,82, | 2262,83, | 2262,84, | 2262,85, | 2263,1, | 2263,2, | 2263,3, | 2263,4, | 2263,5, | 2263,6, | 2263,7, | 2263,8, | 2263,9, | 2263,10, | 2263,11, | 2263,12, | 2263,13, | 2263,14, | 2263,15, | 2263,16, | 2263,17, | 2263,18, | 2263,19, | 2263,20, | 2263,21, | 2263,22, | 2263,23, | 2263,24, | 2263,25, | 2263,26, | 2263,27, | 2263,28, | 2263,29, | 2263,30, | 2263,31, | 2263,32, | 2263,33, | 2263,34, | 2263,35, | 2263,36, | 2263,37, | 2263,38, | 2263,39, | 2263,40, | 2263,41, | 2263,42, | 2263,43, | 2263,44, | 2263,45, | 2263,46, | 2263,47, | 2263,48, | 2263,49, | 2263,50, | 2263,51, | 2263,52, | 2263,53, | 2263,54, | 2263,55, | 2263,56, | 2263,57, | 2263,58, | 2263,59, | 2263,60, | 2263,61, | 2263,62, | 2263,63, | 2263,64, | 2263,65, | 2263,66, | 2263,67, | 2263,68, | 2263,69, | 2263,70, | 2263,71, | 2263,72, | 2263,73, | 2263,74, | 2263,75, | 2263,76, | 2263,77, | 2263,78, | 2263,79, | 2263,80, | 2263,81, | 2263,82, | 2263,83, | 2263,84, | 2263,85, | 2264,1, | 2264,2, | 2264,3, | 2264,4, | 2264,5, | 2264,6, | 2264,7, | 2264,8, | 2264,9, | 2264,10, | 2264,11, | 2264,12, | 2264,13, | 2264,14, | 2264,15, | 2264,16, | 2264,17, | 2264,18, | 2264,19, | 2264,20, | 2264,21, | 2264,22, | 2264,23, | 2264,24, | 2264,25, | 2264,26, | 2264,27, | 2264,28, | 2264,29, | 2264,30, | 2264,31, | 2264,32, | 2264,33, | 2264,34, | 2264,35, | 2264,36, | 2264,37, | 2264,38, | 2264,39, | 2264,40, | 2264,41, | 2264,42, | 2264,43, | 2264,44, | 2264,45, | 2264,46, | 2264,47, | 2264,48, | 2264,49, | 2264,50, | 2264,51, | 2264,52, | 2264,53, | 2264,54, | 2264,55, | 2264,56, | 2264,57, | 2264,58, | 2264,59, | 2264,60, | 2264,61, | 2264,62, | 2264,63, | 2264,64, | 2264,65, | 2264,66, | 2264,67, | 2264,68, | 2264,69, | 2264,70, | 2264,71, | 2264,72, | 2264,73, | 2264,74, | 2264,75, | 2264,76, | 2264,77, | 2264,78, | 2264,79, | 2264,80, | 2264,81, | 2264,82, | 2264,83, | 2264,84, | 2264,85, | 2265,1, | 2265,2, | 2265,3, | 2265,4, | 2265,5, | 2265,6, | 2265,7, | 2265,8, | 2265,9, | 2265,10, | 2265,11, | 2265,12, | 2265,13, | 2265,14, | 2265,15, | 2265,16, | 2265,17, | 2265,18, | 2265,19, | 2265,20, | 2265,21, | 2265,22, | 2265,23, | 2265,24, | 2265,25, | 2265,26, | 2265,27, | 2265,28, | 2265,29, | 2265,30, | 2265,31, | 2265,32, | 2265,33, | 2265,34, | 2265,35, | 2265,36, | 2265,37, | 2265,38, | 2265,39, | 2265,40, | 2265,41, | 2265,42, | 2265,43, | 2265,44, | 2265,45, | 2265,46, | 2265,47, | 2265,48, | 2265,49, | 2265,50, | 2265,51, | 2265,52, | 2265,53, | 2265,54, | 2265,55, | 2265,56, | 2265,57, | 2265,58, | 2265,59, | 2265,60, | 2265,61, | 2265,62, | 2265,63, | 2265,64, | 2265,65, | 2265,66, | 2265,67, | 2265,68, | 2265,69, | 2265,70, | 2265,71, | 2265,72, | 2265,73, | 2265,74, | 2265,75, | 2265,76, | 2265,77, | 2265,78, | 2265,79, | 2265,80, | 2265,81, | 2265,82, | 2265,83, | 2265,84, | 2265,85, | 2266,1, | 2266,2, | 2266,3, | 2266,4, | 2266,5, | 2266,6, | 2266,7, | 2266,8, | 2266,9, | 2266,10, | 2266,11, | 2266,12, | 2266,13, | 2266,14, | 2266,15, | 2266,16, | 2266,17, | 2266,18, | 2266,19, | 2266,20, | 2266,21, | 2266,22, | 2266,23, | 2266,24, | 2266,25, | 2266,26, | 2266,27, | 2266,28, | 2266,29, | 2266,30, | 2266,31, | 2266,32, | 2266,33, | 2266,34, | 2266,35, | 2266,36, | 2266,37, | 2266,38, | 2266,39, | 2266,40, | 2266,41, | 2266,42, | 2266,43, | 2266,44, | 2266,45, | 2266,46, | 2266,47, | 2266,48, | 2266,49, | 2266,50, | 2266,51, | 2266,52, | 2266,53, | 2266,54, | 2266,55, | 2266,56, | 2266,57, | 2266,58, | 2266,59, | 2266,60, | 2266,61, | 2266,62, | 2266,63, | 2266,64, | 2266,65, | 2266,66, | 2266,67, | 2266,68, | 2266,69, | 2266,70, | 2266,71, | 2266,72, | 2266,73, | 2266,74, | 2266,75, | 2266,76, | 2266,77, | 2266,78, | 2266,79, | 2266,80, | 2266,81, | 2266,82, | 2266,83, | 2266,84, | 2266,85, | 2267,1, | 2267,2, | 2267,3, | 2267,4, | 2267,5, | 2267,6, | 2267,7, | 2267,8, | 2267,9, | 2267,10, | 2267,11, | 2267,12, | 2267,13, | 2267,14, | 2267,15, | 2267,16, | 2267,17, | 2267,18, | 2267,19, | 2267,20, | 2267,21, | 2267,22, | 2267,23, | 2267,24, | 2267,25, | 2267,26, | 2267,27, | 2267,28, | 2267,29, | 2267,30, | 2267,31, | 2267,32, | 2267,33, | 2267,34, | 2267,35, | 2267,36, | 2267,37, | 2267,38, | 2267,39, | 2267,40, | 2267,41, | 2267,42, | 2267,43, | 2267,44, | 2267,45, | 2267,46, | 2267,47, | 2267,48, | 2267,49, | 2267,50, | 2267,51, | 2267,52, | 2267,53, | 2267,54, | 2267,55, | 2267,56, | 2267,57, | 2267,58, | 2267,59, | 2267,60, | 2267,61, | 2267,62, | 2267,63, | 2267,64, | 2267,65, | 2267,66, | 2267,67, | 2267,68, | 2267,69, | 2267,70, | 2267,71, | 2267,72, | 2267,73, | 2267,74, | 2267,75, | 2267,76, | 2267,77, | 2267,78, | 2267,79, | 2267,80, | 2267,81, | 2267,82, | 2267,83, | 2267,84, | 2267,85, | 2268,1, | 2268,2, | 2268,3, | 2268,4, | 2268,5, | 2268,6, | 2268,7, | 2268,8, | 2268,9, | 2268,10, | 2268,11, | 2268,12, | 2268,13, | 2268,14, | 2268,15, | 2268,16, | 2268,17, | 2268,18, | 2268,19, | 2268,20, | 2268,21, | 2268,22, | 2268,23, | 2268,24, | 2268,25, | 2268,26, | 2268,27, | 2268,28, | 2268,29, | 2268,30, | 2268,31, | 2268,32, | 2268,33, | 2268,34, | 2268,35, | 2268,36, | 2268,37, | 2268,38, | 2268,39, | 2268,40, | 2268,41, | 2268,42, | 2268,43, | 2268,44, | 2268,45, | 2268,46, | 2268,47, | 2268,48, | 2268,49, | 2268,50, | 2268,51, | 2268,52, | 2268,53, | 2268,54, | 2268,55, | 2268,56, | 2268,57, | 2268,58, | 2268,59, | 2268,60, | 2268,61, | 2268,62, | 2268,63, | 2268,64, | 2268,65, | 2268,66, | 2268,67, | 2268,68, | 2268,69, | 2268,70, | 2268,71, | 2268,72, | 2268,73, | 2268,74, | 2268,75, | 2268,76, | 2268,77, | 2268,78, | 2268,79, | 2268,80, | 2268,81, | 2268,82, | 2268,83, | 2268,84, | 2268,85, | 2269,1, | 2269,2, | 2269,3, | 2269,4, | 2269,5, | 2269,6, | 2269,7, | 2269,8, | 2269,9, | 2269,10, | 2269,11, | 2269,12, | 2269,13, | 2269,14, | 2269,15, | 2269,16, | 2269,17, | 2269,18, | 2269,19, | 2269,20, | 2269,21, | 2269,22, | 2269,23, | 2269,24, | 2269,25, | 2269,26, | 2269,27, | 2269,28, | 2269,29, | 2269,30, | 2269,31, | 2269,32, | 2269,33, | 2269,34, | 2269,35, | 2269,36, | 2269,37, | 2269,38, | 2269,39, | 2269,40, | 2269,41, | 2269,42, | 2269,43, | 2269,44, | 2269,45, | 2269,46, | 2269,47, | 2269,48, | 2269,49, | 2269,50, | 2269,51, | 2269,52, | 2269,53, | 2269,54, | 2269,55, | 2269,56, | 2269,57, | 2269,58, | 2269,59, | 2269,60, | 2269,61, | 2269,62, | 2269,63, | 2269,64, | 2269,65, | 2269,66, | 2269,67, | 2269,68, | 2269,69, | 2269,70, | 2269,71, | 2269,72, | 2269,73, | 2269,74, | 2269,75, | 2269,76, | 2269,77, | 2269,78, | 2269,79, | 2269,80, | 2269,81, | 2269,82, | 2269,83, | 2269,84, | 2269,85, | 2270,1, | 2270,2, | 2270,3, | 2270,4, | 2270,5, | 2270,6, | 2270,7, | 2270,8, | 2270,9, | 2270,10, | 2270,11, | 2270,12, | 2270,13, | 2270,14, | 2270,15, | 2270,16, | 2270,17, | 2270,18, | 2270,19, | 2270,20, | 2270,21, | 2270,22, | 2270,23, | 2270,24, | 2270,25, | 2270,26, | 2270,27, | 2270,28, | 2270,29, | 2270,30, | 2270,31, | 2270,32, | 2270,33, | 2270,34, | 2270,35, | 2270,36, | 2270,37, | 2270,38, | 2270,39, | 2270,40, | 2270,41, | 2270,42, | 2270,43, | 2270,44, | 2270,45, | 2270,46, | 2270,47, | 2270,48, | 2270,49, | 2270,50, | 2270,51, | 2270,52, | 2270,53, | 2270,54, | 2270,55, | 2270,56, | 2270,57, | 2270,58, | 2270,59, | 2270,60, | 2270,61, | 2270,62, | 2270,63, | 2270,64, | 2270,65, | 2270,66, | 2270,67, | 2270,68, | 2270,69, | 2270,70, | 2270,71, | 2270,72, | 2270,73, | 2270,74, | 2270,75, | 2270,76, | 2270,77, | 2270,78, | 2270,79, | 2270,80, | 2270,81, | 2270,82, | 2270,83, | 2270,84, | 2270,85, | 2271,1, | 2271,2, | 2271,3, | 2271,4, | 2271,5, | 2271,6, | 2271,7, | 2271,8, | 2271,9, | 2271,10, | 2271,11, | 2271,12, | 2271,13, | 2271,14, | 2271,15, | 2271,16, | 2271,17, | 2271,18, | 2271,19, | 2271,20, | 2271,21, | 2271,22, | 2271,23, | 2271,24, | 2271,25, | 2271,26, | 2271,27, | 2271,28, | 2271,29, | 2271,30, | 2271,31, | 2271,32, | 2271,33, | 2271,34, | 2271,35, | 2271,36, | 2271,37, | 2271,38, | 2271,39, | 2271,40, | 2271,41, | 2271,42, | 2271,43, | 2271,44, | 2271,45, | 2271,46, | 2271,47, | 2271,48, | 2271,49, | 2271,50, | 2271,51, | 2271,52, | 2271,53, | 2271,54, | 2271,55, | 2271,56, | 2271,57, | 2271,58, | 2271,59, | 2271,60, | 2271,61, | 2271,62, | 2271,63, | 2271,64, | 2271,65, | 2271,66, | 2271,67, | 2271,68, | 2271,69, | 2271,70, | 2271,71, | 2271,72, | 2271,73, | 2271,74, | 2271,75, | 2271,76, | 2271,77, | 2271,78, | 2271,79, | 2271,80, | 2271,81, | 2271,82, | 2271,83, | 2271,84, | 2271,85, | 2272,1, | 2272,2, | 2272,3, | 2272,4, | 2272,5, | 2272,6, | 2272,7, | 2272,8, | 2272,9, | 2272,10, | 2272,11, | 2272,12, | 2272,13, | 2272,14, | 2272,15, | 2272,16, | 2272,17, | 2272,18, | 2272,19, | 2272,20, | 2272,21, | 2272,22, | 2272,23, | 2272,24, | 2272,25, | 2272,26, | 2272,27, | 2272,28, | 2272,29, | 2272,30, | 2272,31, | 2272,32, | 2272,33, | 2272,34, | 2272,35, | 2272,36, | 2272,37, | 2272,38, | 2272,39, | 2272,40, | 2272,41, | 2272,42, | 2272,43, | 2272,44, | 2272,45, | 2272,46, | 2272,47, | 2272,48, | 2272,49, | 2272,50, | 2272,51, | 2272,52, | 2272,53, | 2272,54, | 2272,55, | 2272,56, | 2272,57, | 2272,58, | 2272,59, | 2272,60, | 2272,61, | 2272,62, | 2272,63, | 2272,64, | 2272,65, | 2272,66, | 2272,67, | 2272,68, | 2272,69, | 2272,70, | 2272,71, | 2272,72, | 2272,73, | 2272,74, | 2272,75, | 2272,76, | 2272,77, | 2272,78, | 2272,79, | 2272,80, | 2272,81, | 2272,82, | 2272,83, | 2272,84, | 2272,85, | 2273,1, | 2273,2, | 2273,3, | 2273,4, | 2273,5, | 2273,6, | 2273,7, | 2273,8, | 2273,9, | 2273,10, | 2273,11, | 2273,12, | 2273,13, | 2273,14, | 2273,15, | 2273,16, | 2273,17, | 2273,18, | 2273,19, | 2273,20, | 2273,21, | 2273,22, | 2273,23, | 2273,24, | 2273,25, | 2273,26, | 2273,27, | 2273,28, | 2273,29, | 2273,30, | 2273,31, | 2273,32, | 2273,33, | 2273,34, | 2273,35, | 2273,36, | 2273,37, | 2273,38, | 2273,39, | 2273,40, | 2273,41, | 2273,42, | 2273,43, | 2273,44, | 2273,45, | 2273,46, | 2273,47, | 2273,48, | 2273,49, | 2273,50, | 2273,51, | 2273,52, | 2273,53, | 2273,54, | 2273,55, | 2273,56, | 2273,57, | 2273,58, | 2273,59, | 2273,60, | 2273,61, | 2273,62, | 2273,63, | 2273,64, | 2273,65, | 2273,66, | 2273,67, | 2273,68, | 2273,69, | 2273,70, | 2273,71, | 2273,72, | 2273,73, | 2273,74, | 2273,75, | 2273,76, | 2273,77, | 2273,78, | 2273,79, | 2273,80, | 2273,81, | 2273,82, | 2273,83, | 2273,84, | 2273,85, | 2274,1, | 2274,2, | 2274,3, | 2274,4, | 2274,5, | 2274,6, | 2274,7, | 2274,8, | 2274,9, | 2274,10, | 2274,11, | 2274,12, | 2274,13, | 2274,14, | 2274,15, | 2274,16, | 2274,17, | 2274,18, | 2274,19, | 2274,20, | 2274,21, | 2274,22, | 2274,23, | 2274,24, | 2274,25, | 2274,26, | 2274,27, | 2274,28, | 2274,29, | 2274,30, | 2274,31, | 2274,32, | 2274,33, | 2274,34, | 2274,35, | 2274,36, | 2274,37, | 2274,38, | 2274,39, | 2274,40, | 2274,41, | 2274,42, | 2274,43, | 2274,44, | 2274,45, | 2274,46, | 2274,47, | 2274,48, | 2274,49, | 2274,50, | 2274,51, | 2274,52, | 2274,53, | 2274,54, | 2274,55, | 2274,56, | 2274,57, | 2274,58, | 2274,59, | 2274,60, | 2274,61, | 2274,62, | 2274,63, | 2274,64, | 2274,65, | 2274,66, | 2274,67, | 2274,68, | 2274,69, | 2274,70, | 2274,71, | 2274,72, | 2274,73, | 2274,74, | 2274,75, | 2274,76, | 2274,77, | 2274,78, | 2274,79, | 2274,80, | 2274,81, | 2274,82, | 2274,83, | 2274,84, | 2274,85, | 2275,1, | 2275,2, | 2275,3, | 2275,4, | 2275,5, | 2275,6, | 2275,7, | 2275,8, | 2275,9, | 2275,10, | 2275,11, | 2275,12, | 2275,13, | 2275,14, | 2275,15, | 2275,16, | 2275,17, | 2275,18, | 2275,19, | 2275,20, | 2275,21, | 2275,22, | 2275,23, | 2275,24, | 2275,25, | 2275,26, | 2275,27, | 2275,28, | 2275,29, | 2275,30, | 2275,31, | 2275,32, | 2275,33, | 2275,34, | 2275,35, | 2275,36, | 2275,37, | 2275,38, | 2275,39, | 2275,40, | 2275,41, | 2275,42, | 2275,43, | 2275,44, | 2275,45, | 2275,46, | 2275,47, | 2275,48, | 2275,49, | 2275,50, | 2275,51, | 2275,52, | 2275,53, | 2275,54, | 2275,55, | 2275,56, | 2275,57, | 2275,58, | 2275,59, | 2275,60, | 2275,61, | 2275,62, | 2275,63, | 2275,64, | 2275,65, | 2275,66, | 2275,67, | 2275,68, | 2275,69, | 2275,70, | 2275,71, | 2275,72, | 2275,73, | 2275,74, | 2275,75, | 2275,76, | 2275,77, | 2275,78, | 2275,79, | 2275,80, | 2275,81, | 2275,82, | 2275,83, | 2275,84, | 2275,85, | 2276,1, | 2276,2, | 2276,3, | 2276,4, | 2276,5, | 2276,6, | 2276,7, | 2276,8, | 2276,9, | 2276,10, | 2276,11, | 2276,12, | 2276,13, | 2276,14, | 2276,15, | 2276,16, | 2276,17, | 2276,18, | 2276,19, | 2276,20, | 2276,21, | 2276,22, | 2276,23, | 2276,24, | 2276,25, | 2276,26, | 2276,27, | 2276,28, | 2276,29, | 2276,30, | 2276,31, | 2276,32, | 2276,33, | 2276,34, | 2276,35, | 2276,36, | 2276,37, | 2276,38, | 2276,39, | 2276,40, | 2276,41, | 2276,42, | 2276,43, | 2276,44, | 2276,45, | 2276,46, | 2276,47, | 2276,48, | 2276,49, | 2276,50, | 2276,51, | 2276,52, | 2276,53, | 2276,54, | 2276,55, | 2276,56, | 2276,57, | 2276,58, | 2276,59, | 2276,60, | 2276,61, | 2276,62, | 2276,63, | 2276,64, | 2276,65, | 2276,66, | 2276,67, | 2276,68, | 2276,69, | 2276,70, | 2276,71, | 2276,72, | 2276,73, | 2276,74, | 2276,75, | 2276,76, | 2276,77, | 2276,78, | 2276,79, | 2276,80, | 2276,81, | 2276,82, | 2276,83, | 2276,84, | 2276,85, | 2277,1, | 2277,2, | 2277,3, | 2277,4, | 2277,5, | 2277,6, | 2277,7, | 2277,8, | 2277,9, | 2277,10, | 2277,11, | 2277,12, | 2277,13, | 2277,14, | 2277,15, | 2277,16, | 2277,17, | 2277,18, | 2277,19, | 2277,20, | 2277,21, | 2277,22, | 2277,23, | 2277,24, | 2277,25, | 2277,26, | 2277,27, | 2277,28, | 2277,29, | 2277,30, | 2277,31, | 2277,32, | 2277,33, | 2277,34, | 2277,35, | 2277,36, | 2277,37, | 2277,38, | 2277,39, | 2277,40, | 2277,41, | 2277,42, | 2277,43, | 2277,44, | 2277,45, | 2277,46, | 2277,47, | 2277,48, | 2277,49, | 2277,50, | 2277,51, | 2277,52, | 2277,53, | 2277,54, | 2277,55, | 2277,56, | 2277,57, | 2277,58, | 2277,59, | 2277,60, | 2277,61, | 2277,62, | 2277,63, | 2277,64, | 2277,65, | 2277,66, | 2277,67, | 2277,68, | 2277,69, | 2277,70, | 2277,71, | 2277,72, | 2277,73, | 2277,74, | 2277,75, | 2277,76, | 2277,77, | 2277,78, | 2277,79, | 2277,80, | 2277,81, | 2277,82, | 2277,83, | 2277,84, | 2277,85, | 2278,1, | 2278,2, | 2278,3, | 2278,4, | 2278,5, | 2278,6, | 2278,7, | 2278,8, | 2278,9, | 2278,10, | 2278,11, | 2278,12, | 2278,13, | 2278,14, | 2278,15, | 2278,16, | 2278,17, | 2278,18, | 2278,19, | 2278,20, | 2278,21, | 2278,22, | 2278,23, | 2278,24, | 2278,25, | 2278,26, | 2278,27, | 2278,28, | 2278,29, | 2278,30, | 2278,31, | 2278,32, | 2278,33, | 2278,34, | 2278,35, | 2278,36, | 2278,37, | 2278,38, | 2278,39, | 2278,40, | 2278,41, | 2278,42, | 2278,43, | 2278,44, | 2278,45, | 2278,46, | 2278,47, | 2278,48, | 2278,49, | 2278,50, | 2278,51, | 2278,52, | 2278,53, | 2278,54, | 2278,55, | 2278,56, | 2278,57, | 2278,58, | 2278,59, | 2278,60, | 2278,61, | 2278,62, | 2278,63, | 2278,64, | 2278,65, | 2278,66, | 2278,67, | 2278,68, | 2278,69, | 2278,70, | 2278,71, | 2278,72, | 2278,73, | 2278,74, | 2278,75, | 2278,76, | 2278,77, | 2278,78, | 2278,79, | 2278,80, | 2278,81, | 2278,82, | 2278,83, | 2278,84, | 2278,85, | 2279,1, | 2279,2, | 2279,3, | 2279,4, | 2279,5, | 2279,6, | 2279,7, | 2279,8, | 2279,9, | 2279,10, | 2279,11, | 2279,12, | 2279,13, | 2279,14, | 2279,15, | 2279,16, | 2279,17, | 2279,18, | 2279,19, | 2279,20, | 2279,21, | 2279,22, | 2279,23, | 2279,24, | 2279,25, | 2279,26, | 2279,27, | 2279,28, | 2279,29, | 2279,30, | 2279,31, | 2279,32, | 2279,33, | 2279,34, | 2279,35, | 2279,36, | 2279,37, | 2279,38, | 2279,39, | 2279,40, | 2279,41, | 2279,42, | 2279,43, | 2279,44, | 2279,45, | 2279,46, | 2279,47, | 2279,48, | 2279,49, | 2279,50, | 2279,51, | 2279,52, | 2279,53, | 2279,54, | 2279,55, | 2279,56, | 2279,57, | 2279,58, | 2279,59, | 2279,60, | 2279,61, | 2279,62, | 2279,63, | 2279,64, | 2279,65, | 2279,66, | 2279,67, | 2279,68, | 2279,69, | 2279,70, | 2279,71, | 2279,72, | 2279,73, | 2279,74, | 2279,75, | 2279,76, | 2279,77, | 2279,78, | 2279,79, | 2279,80, | 2279,81, | 2279,82, | 2279,83, | 2279,84, | 2279,85, | 2280,1, | 2280,2, | 2280,3, | 2280,4, | 2280,5, | 2280,6, | 2280,7, | 2280,8, | 2280,9, | 2280,10, | 2280,11, | 2280,12, | 2280,13, | 2280,14, | 2280,15, | 2280,16, | 2280,17, | 2280,18, | 2280,19, | 2280,20, | 2280,21, | 2280,22, | 2280,23, | 2280,24, | 2280,25, | 2280,26, | 2280,27, | 2280,28, | 2280,29, | 2280,30, | 2280,31, | 2280,32, | 2280,33, | 2280,34, | 2280,35, | 2280,36, | 2280,37, | 2280,38, | 2280,39, | 2280,40, | 2280,41, | 2280,42, | 2280,43, | 2280,44, | 2280,45, | 2280,46, | 2280,47, | 2280,48, | 2280,49, | 2280,50, | 2280,51, | 2280,52, | 2280,53, | 2280,54, | 2280,55, | 2280,56, | 2280,57, | 2280,58, | 2280,59, | 2280,60, | 2280,61, | 2280,62, | 2280,63, | 2280,64, | 2280,65, | 2280,66, | 2280,67, | 2280,68, | 2280,69, | 2280,70, | 2280,71, | 2280,72, | 2280,73, | 2280,74, | 2280,75, | 2280,76, | 2280,77, | 2280,78, | 2280,79, | 2280,80, | 2280,81, | 2280,82, | 2280,83, | 2280,84, | 2280,85, | 2281,1, | 2281,2, | 2281,3, | 2281,4, | 2281,5, | 2281,6, | 2281,7, | 2281,8, | 2281,9, | 2281,10, | 2281,11, | 2281,12, | 2281,13, | 2281,14, | 2281,15, | 2281,16, | 2281,17, | 2281,18, | 2281,19, | 2281,20, | 2281,21, | 2281,22, | 2281,23, | 2281,24, | 2281,25, | 2281,26, | 2281,27, | 2281,28, | 2281,29, | 2281,30, | 2281,31, | 2281,32, | 2281,33, | 2281,34, | 2281,35, | 2281,36, | 2281,37, | 2281,38, | 2281,39, | 2281,40, | 2281,41, | 2281,42, | 2281,43, | 2281,44, | 2281,45, | 2281,46, | 2281,47, | 2281,48, | 2281,49, | 2281,50, | 2281,51, | 2281,52, | 2281,53, | 2281,54, | 2281,55, | 2281,56, | 2281,57, | 2281,58, | 2281,59, | 2281,60, | 2281,61, | 2281,62, | 2281,63, | 2281,64, | 2281,65, | 2281,66, | 2281,67, | 2281,68, | 2281,69, | 2281,70, | 2281,71, | 2281,72, | 2281,73, | 2281,74, | 2281,75, | 2281,76, | 2281,77, | 2281,78, | 2281,79, | 2281,80, | 2281,81, | 2281,82, | 2281,83, | 2281,84, | 2281,85, | 2282,1, | 2282,2, | 2282,3, | 2282,4, | 2282,5, | 2282,6, | 2282,7, | 2282,8, | 2282,9, | 2282,10, | 2282,11, | 2282,12, | 2282,13, | 2282,14, | 2282,15, | 2282,16, | 2282,17, | 2282,18, | 2282,19, | 2282,20, | 2282,21, | 2282,22, | 2282,23, | 2282,24, | 2282,25, | 2282,26, | 2282,27, | 2282,28, | 2282,29, | 2282,30, | 2282,31, | 2282,32, | 2282,33, | 2282,34, | 2282,35, | 2282,36, | 2282,37, | 2282,38, | 2282,39, | 2282,40, | 2282,41, | 2282,42, | 2282,43, | 2282,44, | 2282,45, | 2282,46, | 2282,47, | 2282,48, | 2282,49, | 2282,50, | 2282,51, | 2282,52, | 2282,53, | 2282,54, | 2282,55, | 2282,56, | 2282,57, | 2282,58, | 2282,59, | 2282,60, | 2282,61, | 2282,62, | 2282,63, | 2282,64, | 2282,65, | 2282,66, | 2282,67, | 2282,68, | 2282,69, | 2282,70, | 2282,71, | 2282,72, | 2282,73, | 2282,74, | 2282,75, | 2282,76, | 2282,77, | 2282,78, | 2282,79, | 2282,80, | 2282,81, | 2282,82, | 2282,83, | 2282,84, | 2282,85, | 2283,1, | 2283,2, | 2283,3, | 2283,4, | 2283,5, | 2283,6, | 2283,7, | 2283,8, | 2283,9, | 2283,10, | 2283,11, | 2283,12, | 2283,13, | 2283,14, | 2283,15, | 2283,16, | 2283,17, | 2283,18, | 2283,19, | 2283,20, | 2283,21, | 2283,22, | 2283,23, | 2283,24, | 2283,25, | 2283,26, | 2283,27, | 2283,28, | 2283,29, | 2283,30, | 2283,31, | 2283,32, | 2283,33, | 2283,34, | 2283,35, | 2283,36, | 2283,37, | 2283,38, | 2283,39, | 2283,40, | 2283,41, | 2283,42, | 2283,43, | 2283,44, | 2283,45, | 2283,46, | 2283,47, | 2283,48, | 2283,49, | 2283,50, | 2283,51, | 2283,52, | 2283,53, | 2283,54, | 2283,55, | 2283,56, | 2283,57, | 2283,58, | 2283,59, | 2283,60, | 2283,61, | 2283,62, | 2283,63, | 2283,64, | 2283,65, | 2283,66, | 2283,67, | 2283,68, | 2283,69, | 2283,70, | 2283,71, | 2283,72, | 2283,73, | 2283,74, | 2283,75, | 2283,76, | 2283,77, | 2283,78, | 2283,79, | 2283,80, | 2283,81, | 2283,82, | 2283,83, | 2283,84, | 2283,85, | 2284,1, | 2284,2, | 2284,3, | 2284,4, | 2284,5, | 2284,6, | 2284,7, | 2284,8, | 2284,9, | 2284,10, | 2284,11, | 2284,12, | 2284,13, | 2284,14, | 2284,15, | 2284,16, | 2284,17, | 2284,18, | 2284,19, | 2284,20, | 2284,21, | 2284,22, | 2284,23, | 2284,24, | 2284,25, | 2284,26, | 2284,27, | 2284,28, | 2284,29, | 2284,30, | 2284,31, | 2284,32, | 2284,33, | 2284,34, | 2284,35, | 2284,36, | 2284,37, | 2284,38, | 2284,39, | 2284,40, | 2284,41, | 2284,42, | 2284,43, | 2284,44, | 2284,45, | 2284,46, | 2284,47, | 2284,48, | 2284,49, | 2284,50, | 2284,51, | 2284,52, | 2284,53, | 2284,54, | 2284,55, | 2284,56, | 2284,57, | 2284,58, | 2284,59, | 2284,60, | 2284,61, | 2284,62, | 2284,63, | 2284,64, | 2284,65, | 2284,66, | 2284,67, | 2284,68, | 2284,69, | 2284,70, | 2284,71, | 2284,72, | 2284,73, | 2284,74, | 2284,75, | 2284,76, | 2284,77, | 2284,78, | 2284,79, | 2284,80, | 2284,81, | 2284,82, | 2284,83, | 2284,84, | 2284,85, | 2285,1, | 2285,2, | 2285,3, | 2285,4, | 2285,5, | 2285,6, | 2285,7, | 2285,8, | 2285,9, | 2285,10, | 2285,11, | 2285,12, | 2285,13, | 2285,14, | 2285,15, | 2285,16, | 2285,17, | 2285,18, | 2285,19, | 2285,20, | 2285,21, | 2285,22, | 2285,23, | 2285,24, | 2285,25, | 2285,26, | 2285,27, | 2285,28, | 2285,29, | 2285,30, | 2285,31, | 2285,32, | 2285,33, | 2285,34, | 2285,35, | 2285,36, | 2285,37, | 2285,38, | 2285,39, | 2285,40, | 2285,41, | 2285,42, | 2285,43, | 2285,44, | 2285,45, | 2285,46, | 2285,47, | 2285,48, | 2285,49, | 2285,50, | 2285,51, | 2285,52, | 2285,53, | 2285,54, | 2285,55, | 2285,56, | 2285,57, | 2285,58, | 2285,59, | 2285,60, | 2285,61, | 2285,62, | 2285,63, | 2285,64, | 2285,65, | 2285,66, | 2285,67, | 2285,68, | 2285,69, | 2285,70, | 2285,71, | 2285,72, | 2285,73, | 2285,74, | 2285,75, | 2285,76, | 2285,77, | 2285,78, | 2285,79, | 2285,80, | 2285,81, | 2285,82, | 2285,83, | 2285,84, | 2285,85, | 2286,1, | 2286,2, | 2286,3, | 2286,4, | 2286,5, | 2286,6, | 2286,7, | 2286,8, | 2286,9, | 2286,10, | 2286,11, | 2286,12, | 2286,13, | 2286,14, | 2286,15, | 2286,16, | 2286,17, | 2286,18, | 2286,19, | 2286,20, | 2286,21, | 2286,22, | 2286,23, | 2286,24, | 2286,25, | 2286,26, | 2286,27, | 2286,28, | 2286,29, | 2286,30, | 2286,31, | 2286,32, | 2286,33, | 2286,34, | 2286,35, | 2286,36, | 2286,37, | 2286,38, | 2286,39, | 2286,40, | 2286,41, | 2286,42, | 2286,43, | 2286,44, | 2286,45, | 2286,46, | 2286,47, | 2286,48, | 2286,49, | 2286,50, | 2286,51, | 2286,52, | 2286,53, | 2286,54, | 2286,55, | 2286,56, | 2286,57, | 2286,58, | 2286,59, | 2286,60, | 2286,61, | 2286,62, | 2286,63, | 2286,64, | 2286,65, | 2286,66, | 2286,67, | 2286,68, | 2286,69, | 2286,70, | 2286,71, | 2286,72, | 2286,73, | 2286,74, | 2286,75, | 2286,76, | 2286,77, | 2286,78, | 2286,79, | 2286,80, | 2286,81, | 2286,82, | 2286,83, | 2286,84, | 2286,85, | 2287,1, | 2287,2, | 2287,3, | 2287,4, | 2287,5, | 2287,6, | 2287,7, | 2287,8, | 2287,9, | 2287,10, | 2287,11, | 2287,12, | 2287,13, | 2287,14, | 2287,15, | 2287,16, | 2287,17, | 2287,18, | 2287,19, | 2287,20, | 2287,21, | 2287,22, | 2287,23, | 2287,24, | 2287,25, | 2287,26, | 2287,27, | 2287,28, | 2287,29, | 2287,30, | 2287,31, | 2287,32, | 2287,33, | 2287,34, | 2287,35, | 2287,36, | 2287,37, | 2287,38, | 2287,39, | 2287,40, | 2287,41, | 2287,42, | 2287,43, | 2287,44, | 2287,45, | 2287,46, | 2287,47, | 2287,48, | 2287,49, | 2287,50, | 2287,51, | 2287,52, | 2287,53, | 2287,54, | 2287,55, | 2287,56, | 2287,57, | 2287,58, | 2287,59, | 2287,60, | 2287,61, | 2287,62, | 2287,63, | 2287,64, | 2287,65, | 2287,66, | 2287,67, | 2287,68, | 2287,69, | 2287,70, | 2287,71, | 2287,72, | 2287,73, | 2287,74, | 2287,75, | 2287,76, | 2287,77, | 2287,78, | 2287,79, | 2287,80, | 2287,81, | 2287,82, | 2287,83, | 2287,84, | 2287,85, | 2288,1, | 2288,2, | 2288,3, | 2288,4, | 2288,5, | 2288,6, | 2288,7, | 2288,8, | 2288,9, | 2288,10, | 2288,11, | 2288,12, | 2288,13, | 2288,14, | 2288,15, | 2288,16, | 2288,17, | 2288,18, | 2288,19, | 2288,20, | 2288,21, | 2288,22, | 2288,23, | 2288,24, | 2288,25, | 2288,26, | 2288,27, | 2288,28, | 2288,29, | 2288,30, | 2288,31, | 2288,32, | 2288,33, | 2288,34, | 2288,35, | 2288,36, | 2288,37, | 2288,38, | 2288,39, | 2288,40, | 2288,41, | 2288,42, | 2288,43, | 2288,44, | 2288,45, | 2288,46, | 2288,47, | 2288,48, | 2288,49, | 2288,50, | 2288,51, | 2288,52, | 2288,53, | 2288,54, | 2288,55, | 2288,56, | 2288,57, | 2288,58, | 2288,59, | 2288,60, | 2288,61, | 2288,62, | 2288,63, | 2288,64, | 2288,65, | 2288,66, | 2288,67, | 2288,68, | 2288,69, | 2288,70, | 2288,71, | 2288,72, | 2288,73, | 2288,74, | 2288,75, | 2288,76, | 2288,77, | 2288,78, | 2288,79, | 2288,80, | 2288,81, | 2288,82, | 2288,83, | 2288,84, | 2288,85, | 2289,1, | 2289,2, | 2289,3, | 2289,4, | 2289,5, | 2289,6, | 2289,7, | 2289,8, | 2289,9, | 2289,10, | 2289,11, | 2289,12, | 2289,13, | 2289,14, | 2289,15, | 2289,16, | 2289,17, | 2289,18, | 2289,19, | 2289,20, | 2289,21, | 2289,22, | 2289,23, | 2289,24, | 2289,25, | 2289,26, | 2289,27, | 2289,28, | 2289,29, | 2289,30, | 2289,31, | 2289,32, | 2289,33, | 2289,34, | 2289,35, | 2289,36, | 2289,37, | 2289,38, | 2289,39, | 2289,40, | 2289,41, | 2289,42, | 2289,43, | 2289,44, | 2289,45, | 2289,46, | 2289,47, | 2289,48, | 2289,49, | 2289,50, | 2289,51, | 2289,52, | 2289,53, | 2289,54, | 2289,55, | 2289,56, | 2289,57, | 2289,58, | 2289,59, | 2289,60, | 2289,61, | 2289,62, | 2289,63, | 2289,64, | 2289,65, | 2289,66, | 2289,67, | 2289,68, | 2289,69, | 2289,70, | 2289,71, | 2289,72, | 2289,73, | 2289,74, | 2289,75, | 2289,76, | 2289,77, | 2289,78, | 2289,79, | 2289,80, | 2289,81, | 2289,82, | 2289,83, | 2289,84, | 2289,85, | 2290,1, | 2290,2, | 2290,3, | 2290,4, | 2290,5, | 2290,6, | 2290,7, | 2290,8, | 2290,9, | 2290,10, | 2290,11, | 2290,12, | 2290,13, | 2290,14, | 2290,15, | 2290,16, | 2290,17, | 2290,18, | 2290,19, | 2290,20, | 2290,21, | 2290,22, | 2290,23, | 2290,24, | 2290,25, | 2290,26, | 2290,27, | 2290,28, | 2290,29, | 2290,30, | 2290,31, | 2290,32, | 2290,33, | 2290,34, | 2290,35, | 2290,36, | 2290,37, | 2290,38, | 2290,39, | 2290,40, | 2290,41, | 2290,42, | 2290,43, | 2290,44, | 2290,45, | 2290,46, | 2290,47, | 2290,48, | 2290,49, | 2290,50, | 2290,51, | 2290,52, | 2290,53, | 2290,54, | 2290,55, | 2290,56, | 2290,57, | 2290,58, | 2290,59, | 2290,60, | 2290,61, | 2290,62, | 2290,63, | 2290,64, | 2290,65, | 2290,66, | 2290,67, | 2290,68, | 2290,69, | 2290,70, | 2290,71, | 2290,72, | 2290,73, | 2290,74, | 2290,75, | 2290,76, | 2290,77, | 2290,78, | 2290,79, | 2290,80, | 2290,81, | 2290,82, | 2290,83, | 2290,84, | 2290,85, | 2291,1, | 2291,2, | 2291,3, | 2291,4, | 2291,5, | 2291,6, | 2291,7, | 2291,8, | 2291,9, | 2291,10, | 2291,11, | 2291,12, | 2291,13, | 2291,14, | 2291,15, | 2291,16, | 2291,17, | 2291,18, | 2291,19, | 2291,20, | 2291,21, | 2291,22, | 2291,23, | 2291,24, | 2291,25, | 2291,26, | 2291,27, | 2291,28, | 2291,29, | 2291,30, | 2291,31, | 2291,32, | 2291,33, | 2291,34, | 2291,35, | 2291,36, | 2291,37, | 2291,38, | 2291,39, | 2291,40, | 2291,41, | 2291,42, | 2291,43, | 2291,44, | 2291,45, | 2291,46, | 2291,47, | 2291,48, | 2291,49, | 2291,50, | 2291,51, | 2291,52, | 2291,53, | 2291,54, | 2291,55, | 2291,56, | 2291,57, | 2291,58, | 2291,59, | 2291,60, | 2291,61, | 2291,62, | 2291,63, | 2291,64, | 2291,65, | 2291,66, | 2291,67, | 2291,68, | 2291,69, | 2291,70, | 2291,71, | 2291,72, | 2291,73, | 2291,74, | 2291,75, | 2291,76, | 2291,77, | 2291,78, | 2291,79, | 2291,80, | 2291,81, | 2291,82, | 2291,83, | 2291,84, | 2291,85, | 2292,1, | 2292,2, | 2292,3, | 2292,4, | 2292,5, | 2292,6, | 2292,7, | 2292,8, | 2292,9, | 2292,10, | 2292,11, | 2292,12, | 2292,13, | 2292,14, | 2292,15, | 2292,16, | 2292,17, | 2292,18, | 2292,19, | 2292,20, | 2292,21, | 2292,22, | 2292,23, | 2292,24, | 2292,25, | 2292,26, | 2292,27, | 2292,28, | 2292,29, | 2292,30, | 2292,31, | 2292,32, | 2292,33, | 2292,34, | 2292,35, | 2292,36, | 2292,37, | 2292,38, | 2292,39, | 2292,40, | 2292,41, | 2292,42, | 2292,43, | 2292,44, | 2292,45, | 2292,46, | 2292,47, | 2292,48, | 2292,49, | 2292,50, | 2292,51, | 2292,52, | 2292,53, | 2292,54, | 2292,55, | 2292,56, | 2292,57, | 2292,58, | 2292,59, | 2292,60, | 2292,61, | 2292,62, | 2292,63, | 2292,64, | 2292,65, | 2292,66, | 2292,67, | 2292,68, | 2292,69, | 2292,70, | 2292,71, | 2292,72, | 2292,73, | 2292,74, | 2292,75, | 2292,76, | 2292,77, | 2292,78, | 2292,79, | 2292,80, | 2292,81, | 2292,82, | 2292,83, | 2292,84, | 2292,85, | 2293,1, | 2293,2, | 2293,3, | 2293,4, | 2293,5, | 2293,6, | 2293,7, | 2293,8, | 2293,9, | 2293,10, | 2293,11, | 2293,12, | 2293,13, | 2293,14, | 2293,15, | 2293,16, | 2293,17, | 2293,18, | 2293,19, | 2293,20, | 2293,21, | 2293,22, | 2293,23, | 2293,24, | 2293,25, | 2293,26, | 2293,27, | 2293,28, | 2293,29, | 2293,30, | 2293,31, | 2293,32, | 2293,33, | 2293,34, | 2293,35, | 2293,36, | 2293,37, | 2293,38, | 2293,39, | 2293,40, | 2293,41, | 2293,42, | 2293,43, | 2293,44, | 2293,45, | 2293,46, | 2293,47, | 2293,48, | 2293,49, | 2293,50, | 2293,51, | 2293,52, | 2293,53, | 2293,54, | 2293,55, | 2293,56, | 2293,57, | 2293,58, | 2293,59, | 2293,60, | 2293,61, | 2293,62, | 2293,63, | 2293,64, | 2293,65, | 2293,66, | 2293,67, | 2293,68, | 2293,69, | 2293,70, | 2293,71, | 2293,72, | 2293,73, | 2293,74, | 2293,75, | 2293,76, | 2293,77, | 2293,78, | 2293,79, | 2293,80, | 2293,81, | 2293,82, | 2293,83, | 2293,84, | 2293,85, | 2294,1, | 2294,2, | 2294,3, | 2294,4, | 2294,5, | 2294,6, | 2294,7, | 2294,8, | 2294,9, | 2294,10, | 2294,11, | 2294,12, | 2294,13, | 2294,14, | 2294,15, | 2294,16, | 2294,17, | 2294,18, | 2294,19, | 2294,20, | 2294,21, | 2294,22, | 2294,23, | 2294,24, | 2294,25, | 2294,26, | 2294,27, | 2294,28, | 2294,29, | 2294,30, | 2294,31, | 2294,32, | 2294,33, | 2294,34, | 2294,35, | 2294,36, | 2294,37, | 2294,38, | 2294,39, | 2294,40, | 2294,41, | 2294,42, | 2294,43, | 2294,44, | 2294,45, | 2294,46, | 2294,47, | 2294,48, | 2294,49, | 2294,50, | 2294,51, | 2294,52, | 2294,53, | 2294,54, | 2294,55, | 2294,56, | 2294,57, | 2294,58, | 2294,59, | 2294,60, | 2294,61, | 2294,62, | 2294,63, | 2294,64, | 2294,65, | 2294,66, | 2294,67, | 2294,68, | 2294,69, | 2294,70, | 2294,71, | 2294,72, | 2294,73, | 2294,74, | 2294,75, | 2294,76, | 2294,77, | 2294,78, | 2294,79, | 2294,80, | 2294,81, | 2294,82, | 2294,83, | 2294,84, | 2294,85, | 2295,1, | 2295,2, | 2295,3, | 2295,4, | 2295,5, | 2295,6, | 2295,7, | 2295,8, | 2295,9, | 2295,10, | 2295,11, | 2295,12, | 2295,13, | 2295,14, | 2295,15, | 2295,16, | 2295,17, | 2295,18, | 2295,19, | 2295,20, | 2295,21, | 2295,22, | 2295,23, | 2295,24, | 2295,25, | 2295,26, | 2295,27, | 2295,28, | 2295,29, | 2295,30, | 2295,31, | 2295,32, | 2295,33, | 2295,34, | 2295,35, | 2295,36, | 2295,37, | 2295,38, | 2295,39, | 2295,40, | 2295,41, | 2295,42, | 2295,43, | 2295,44, | 2295,45, | 2295,46, | 2295,47, | 2295,48, | 2295,49, | 2295,50, | 2295,51, | 2295,52, | 2295,53, | 2295,54, | 2295,55, | 2295,56, | 2295,57, | 2295,58, | 2295,59, | 2295,60, | 2295,61, | 2295,62, | 2295,63, | 2295,64, | 2295,65, | 2295,66, | 2295,67, | 2295,68, | 2295,69, | 2295,70, | 2295,71, | 2295,72, | 2295,73, | 2295,74, | 2295,75, | 2295,76, | 2295,77, | 2295,78, | 2295,79, | 2295,80, | 2295,81, | 2295,82, | 2295,83, | 2295,84, | 2295,85, | 2296,1, | 2296,2, | 2296,3, | 2296,4, | 2296,5, | 2296,6, | 2296,7, | 2296,8, | 2296,9, | 2296,10, | 2296,11, | 2296,12, | 2296,13, | 2296,14, | 2296,15, | 2296,16, | 2296,17, | 2296,18, | 2296,19, | 2296,20, | 2296,21, | 2296,22, | 2296,23, | 2296,24, | 2296,25, | 2296,26, | 2296,27, | 2296,28, | 2296,29, | 2296,30, | 2296,31, | 2296,32, | 2296,33, | 2296,34, | 2296,35, | 2296,36, | 2296,37, | 2296,38, | 2296,39, | 2296,40, | 2296,41, | 2296,42, | 2296,43, | 2296,44, | 2296,45, | 2296,46, | 2296,47, | 2296,48, | 2296,49, | 2296,50, | 2296,51, | 2296,52, | 2296,53, | 2296,54, | 2296,55, | 2296,56, | 2296,57, | 2296,58, | 2296,59, | 2296,60, | 2296,61, | 2296,62, | 2296,63, | 2296,64, | 2296,65, | 2296,66, | 2296,67, | 2296,68, | 2296,69, | 2296,70, | 2296,71, | 2296,72, | 2296,73, | 2296,74, | 2296,75, | 2296,76, | 2296,77, | 2296,78, | 2296,79, | 2296,80, | 2296,81, | 2296,82, | 2296,83, | 2296,84, | 2296,85, | 2297,1, | 2297,2, | 2297,3, | 2297,4, | 2297,5, | 2297,6, | 2297,7, | 2297,8, | 2297,9, | 2297,10, | 2297,11, | 2297,12, | 2297,13, | 2297,14, | 2297,15, | 2297,16, | 2297,17, | 2297,18, | 2297,19, | 2297,20, | 2297,21, | 2297,22, | 2297,23, | 2297,24, | 2297,25, | 2297,26, | 2297,27, | 2297,28, | 2297,29, | 2297,30, | 2297,31, | 2297,32, | 2297,33, | 2297,34, | 2297,35, | 2297,36, | 2297,37, | 2297,38, | 2297,39, | 2297,40, | 2297,41, | 2297,42, | 2297,43, | 2297,44, | 2297,45, | 2297,46, | 2297,47, | 2297,48, | 2297,49, | 2297,50, | 2297,51, | 2297,52, | 2297,53, | 2297,54, | 2297,55, | 2297,56, | 2297,57, | 2297,58, | 2297,59, | 2297,60, | 2297,61, | 2297,62, | 2297,63, | 2297,64, | 2297,65, | 2297,66, | 2297,67, | 2297,68, | 2297,69, | 2297,70, | 2297,71, | 2297,72, | 2297,73, | 2297,74, | 2297,75, | 2297,76, | 2297,77, | 2297,78, | 2297,79, | 2297,80, | 2297,81, | 2297,82, | 2297,83, | 2297,84, | 2297,85, | 2298,1, | 2298,2, | 2298,3, | 2298,4, | 2298,5, | 2298,6, | 2298,7, | 2298,8, | 2298,9, | 2298,10, | 2298,11, | 2298,12, | 2298,13, | 2298,14, | 2298,15, | 2298,16, | 2298,17, | 2298,18, | 2298,19, | 2298,20, | 2298,21, | 2298,22, | 2298,23, | 2298,24, | 2298,25, | 2298,26, | 2298,27, | 2298,28, | 2298,29, | 2298,30, | 2298,31, | 2298,32, | 2298,33, | 2298,34, | 2298,35, | 2298,36, | 2298,37, | 2298,38, | 2298,39, | 2298,40, | 2298,41, | 2298,42, | 2298,43, | 2298,44, | 2298,45, | 2298,46, | 2298,47, | 2298,48, | 2298,49, | 2298,50, | 2298,51, | 2298,52, | 2298,53, | 2298,54, | 2298,55, | 2298,56, | 2298,57, | 2298,58, | 2298,59, | 2298,60, | 2298,61, | 2298,62, | 2298,63, | 2298,64, | 2298,65, | 2298,66, | 2298,67, | 2298,68, | 2298,69, | 2298,70, | 2298,71, | 2298,72, | 2298,73, | 2298,74, | 2298,75, | 2298,76, | 2298,77, | 2298,78, | 2298,79, | 2298,80, | 2298,81, | 2298,82, | 2298,83, | 2298,84, | 2298,85, | 2299,1, | 2299,2, | 2299,3, | 2299,4, | 2299,5, | 2299,6, | 2299,7, | 2299,8, | 2299,9, | 2299,10, | 2299,11, | 2299,12, | 2299,13, | 2299,14, | 2299,15, | 2299,16, | 2299,17, | 2299,18, | 2299,19, | 2299,20, | 2299,21, | 2299,22, | 2299,23, | 2299,24, | 2299,25, | 2299,26, | 2299,27, | 2299,28, | 2299,29, | 2299,30, | 2299,31, | 2299,32, | 2299,33, | 2299,34, | 2299,35, | 2299,36, | 2299,37, | 2299,38, | 2299,39, | 2299,40, | 2299,41, | 2299,42, | 2299,43, | 2299,44, | 2299,45, | 2299,46, | 2299,47, | 2299,48, | 2299,49, | 2299,50, | 2299,51, | 2299,52, | 2299,53, | 2299,54, | 2299,55, | 2299,56, | 2299,57, | 2299,58, | 2299,59, | 2299,60, | 2299,61, | 2299,62, | 2299,63, | 2299,64, | 2299,65, | 2299,66, | 2299,67, | 2299,68, | 2299,69, | 2299,70, | 2299,71, | 2299,72, | 2299,73, | 2299,74, | 2299,75, | 2299,76, | 2299,77, | 2299,78, | 2299,79, | 2299,80, | 2299,81, | 2299,82, | 2299,83, | 2299,84, | 2299,85, | 2300,1, | 2300,2, | 2300,3, | 2300,4, | 2300,5, | 2300,6, | 2300,7, | 2300,8, | 2300,9, | 2300,10, | 2300,11, | 2300,12, | 2300,13, | 2300,14, | 2300,15, | 2300,16, | 2300,17, | 2300,18, | 2300,19, | 2300,20, | 2300,21, | 2300,22, | 2300,23, | 2300,24, | 2300,25, | 2300,26, | 2300,27, | 2300,28, | 2300,29, | 2300,30, | 2300,31, | 2300,32, | 2300,33, | 2300,34, | 2300,35, | 2300,36, | 2300,37, | 2300,38, | 2300,39, | 2300,40, | 2300,41, | 2300,42, | 2300,43, | 2300,44, | 2300,45, | 2300,46, | 2300,47, | 2300,48, | 2300,49, | 2300,50, | 2300,51, | 2300,52, | 2300,53, | 2300,54, | 2300,55, | 2300,56, | 2300,57, | 2300,58, | 2300,59, | 2300,60, | 2300,61, | 2300,62, | 2300,63, | 2300,64, | 2300,65, | 2300,66, | 2300,67, | 2300,68, | 2300,69, | 2300,70, | 2300,71, | 2300,72, | 2300,73, | 2300,74, | 2300,75, | 2300,76, | 2300,77, | 2300,78, | 2300,79, | 2300,80, | 2300,81, | 2300,82, | 2300,83, | 2300,84, | 2300,85, | 2301,1, | 2301,2, | 2301,3, | 2301,4, | 2301,5, | 2301,6, | 2301,7, | 2301,8, | 2301,9, | 2301,10, | 2301,11, | 2301,12, | 2301,13, | 2301,14, | 2301,15, | 2301,16, | 2301,17, | 2301,18, | 2301,19, | 2301,20, | 2301,21, | 2301,22, | 2301,23, | 2301,24, | 2301,25, | 2301,26, | 2301,27, | 2301,28, | 2301,29, | 2301,30, | 2301,31, | 2301,32, | 2301,33, | 2301,34, | 2301,35, | 2301,36, | 2301,37, | 2301,38, | 2301,39, | 2301,40, | 2301,41, | 2301,42, | 2301,43, | 2301,44, | 2301,45, | 2301,46, | 2301,47, | 2301,48, | 2301,49, | 2301,50, | 2301,51, | 2301,52, | 2301,53, | 2301,54, | 2301,55, | 2301,56, | 2301,57, | 2301,58, | 2301,59, | 2301,60, | 2301,61, | 2301,62, | 2301,63, | 2301,64, | 2301,65, | 2301,66, | 2301,67, | 2301,68, | 2301,69, | 2301,70, | 2301,71, | 2301,72, | 2301,73, | 2301,74, | 2301,75, | 2301,76, | 2301,77, | 2301,78, | 2301,79, | 2301,80, | 2301,81, | 2301,82, | 2301,83, | 2301,84, | 2301,85, | 2302,1, | 2302,2, | 2302,3, | 2302,4, | 2302,5, | 2302,6, | 2302,7, | 2302,8, | 2302,9, | 2302,10, | 2302,11, | 2302,12, | 2302,13, | 2302,14, | 2302,15, | 2302,16, | 2302,17, | 2302,18, | 2302,19, | 2302,20, | 2302,21, | 2302,22, | 2302,23, | 2302,24, | 2302,25, | 2302,26, | 2302,27, | 2302,28, | 2302,29, | 2302,30, | 2302,31, | 2302,32, | 2302,33, | 2302,34, | 2302,35, | 2302,36, | 2302,37, | 2302,38, | 2302,39, | 2302,40, | 2302,41, | 2302,42, | 2302,43, | 2302,44, | 2302,45, | 2302,46, | 2302,47, | 2302,48, | 2302,49, | 2302,50, | 2302,51, | 2302,52, | 2302,53, | 2302,54, | 2302,55, | 2302,56, | 2302,57, | 2302,58, | 2302,59, | 2302,60, | 2302,61, | 2302,62, | 2302,63, | 2302,64, | 2302,65, | 2302,66, | 2302,67, | 2302,68, | 2302,69, | 2302,70, | 2302,71, | 2302,72, | 2302,73, | 2302,74, | 2302,75, | 2302,76, | 2302,77, | 2302,78, | 2302,79, | 2302,80, | 2302,81, | 2302,82, | 2302,83, | 2302,84, | 2302,85, | 2303,1, | 2303,2, | 2303,3, | 2303,4, | 2303,5, | 2303,6, | 2303,7, | 2303,8, | 2303,9, | 2303,10, | 2303,11, | 2303,12, | 2303,13, | 2303,14, | 2303,15, | 2303,16, | 2303,17, | 2303,18, | 2303,19, | 2303,20, | 2303,21, | 2303,22, | 2303,23, | 2303,24, | 2303,25, | 2303,26, | 2303,27, | 2303,28, | 2303,29, | 2303,30, | 2303,31, | 2303,32, | 2303,33, | 2303,34, | 2303,35, | 2303,36, | 2303,37, | 2303,38, | 2303,39, | 2303,40, | 2303,41, | 2303,42, | 2303,43, | 2303,44, | 2303,45, | 2303,46, | 2303,47, | 2303,48, | 2303,49, | 2303,50, | 2303,51, | 2303,52, | 2303,53, | 2303,54, | 2303,55, | 2303,56, | 2303,57, | 2303,58, | 2303,59, | 2303,60, | 2303,61, | 2303,62, | 2303,63, | 2303,64, | 2303,65, | 2303,66, | 2303,67, | 2303,68, | 2303,69, | 2303,70, | 2303,71, | 2303,72, | 2303,73, | 2303,74, | 2303,75, | 2303,76, | 2303,77, | 2303,78, | 2303,79, | 2303,80, | 2303,81, | 2303,82, | 2303,83, | 2303,84, | 2303,85, | 2304,1, | 2304,2, | 2304,3, | 2304,4, | 2304,5, | 2304,6, | 2304,7, | 2304,8, | 2304,9, | 2304,10, | 2304,11, | 2304,12, | 2304,13, | 2304,14, | 2304,15, | 2304,16, | 2304,17, | 2304,18, | 2304,19, | 2304,20, | 2304,21, | 2304,22, | 2304,23, | 2304,24, | 2304,25, | 2304,26, | 2304,27, | 2304,28, | 2304,29, | 2304,30, | 2304,31, | 2304,32, | 2304,33, | 2304,34, | 2304,35, | 2304,36, | 2304,37, | 2304,38, | 2304,39, | 2304,40, | 2304,41, | 2304,42, | 2304,43, | 2304,44, | 2304,45, | 2304,46, | 2304,47, | 2304,48, | 2304,49, | 2304,50, | 2304,51, | 2304,52, | 2304,53, | 2304,54, | 2304,55, | 2304,56, | 2304,57, | 2304,58, | 2304,59, | 2304,60, | 2304,61, | 2304,62, | 2304,63, | 2304,64, | 2304,65, | 2304,66, | 2304,67, | 2304,68, | 2304,69, | 2304,70, | 2304,71, | 2304,72, | 2304,73, | 2304,74, | 2304,75, | 2304,76, | 2304,77, | 2304,78, | 2304,79, | 2304,80, | 2304,81, | 2304,82, | 2304,83, | 2304,84, | 2304,85, | 2305,1, | 2305,2, | 2305,3, | 2305,4, | 2305,5, | 2305,6, | 2305,7, | 2305,8, | 2305,9, | 2305,10, | 2305,11, | 2305,12, | 2305,13, | 2305,14, | 2305,15, | 2305,16, | 2305,17, | 2305,18, | 2305,19, | 2305,20, | 2305,21, | 2305,22, | 2305,23, | 2305,24, | 2305,25, | 2305,26, | 2305,27, | 2305,28, | 2305,29, | 2305,30, | 2305,31, | 2305,32, | 2305,33, | 2305,34, | 2305,35, | 2305,36, | 2305,37, | 2305,38, | 2305,39, | 2305,40, | 2305,41, | 2305,42, | 2305,43, | 2305,44, | 2305,45, | 2305,46, | 2305,47, | 2305,48, | 2305,49, | 2305,50, | 2305,51, | 2305,52, | 2305,53, | 2305,54, | 2305,55, | 2305,56, | 2305,57, | 2305,58, | 2305,59, | 2305,60, | 2305,61, | 2305,62, | 2305,63, | 2305,64, | 2305,65, | 2305,66, | 2305,67, | 2305,68, | 2305,69, | 2305,70, | 2305,71, | 2305,72, | 2305,73, | 2305,74, | 2305,75, | 2305,76, | 2305,77, | 2305,78, | 2305,79, | 2305,80, | 2305,81, | 2305,82, | 2305,83, | 2305,84, | 2305,85, | 2306,1, | 2306,2, | 2306,3, | 2306,4, | 2306,5, | 2306,6, | 2306,7, | 2306,8, | 2306,9, | 2306,10, | 2306,11, | 2306,12, | 2306,13, | 2306,14, | 2306,15, | 2306,16, | 2306,17, | 2306,18, | 2306,19, | 2306,20, | 2306,21, | 2306,22, | 2306,23, | 2306,24, | 2306,25, | 2306,26, | 2306,27, | 2306,28, | 2306,29, | 2306,30, | 2306,31, | 2306,32, | 2306,33, | 2306,34, | 2306,35, | 2306,36, | 2306,37, | 2306,38, | 2306,39, | 2306,40, | 2306,41, | 2306,42, | 2306,43, | 2306,44, | 2306,45, | 2306,46, | 2306,47, | 2306,48, | 2306,49, | 2306,50, | 2306,51, | 2306,52, | 2306,53, | 2306,54, | 2306,55, | 2306,56, | 2306,57, | 2306,58, | 2306,59, | 2306,60, | 2306,61, | 2306,62, | 2306,63, | 2306,64, | 2306,65, | 2306,66, | 2306,67, | 2306,68, | 2306,69, | 2306,70, | 2306,71, | 2306,72, | 2306,73, | 2306,74, | 2306,75, | 2306,76, | 2306,77, | 2306,78, | 2306,79, | 2306,80, | 2306,81, | 2306,82, | 2306,83, | 2306,84, | 2306,85, | 2307,1, | 2307,2, | 2307,3, | 2307,4, | 2307,5, | 2307,6, | 2307,7, | 2307,8, | 2307,9, | 2307,10, | 2307,11, | 2307,12, | 2307,13, | 2307,14, | 2307,15, | 2307,16, | 2307,17, | 2307,18, | 2307,19, | 2307,20, | 2307,21, | 2307,22, | 2307,23, | 2307,24, | 2307,25, | 2307,26, | 2307,27, | 2307,28, | 2307,29, | 2307,30, | 2307,31, | 2307,32, | 2307,33, | 2307,34, | 2307,35, | 2307,36, | 2307,37, | 2307,38, | 2307,39, | 2307,40, | 2307,41, | 2307,42, | 2307,43, | 2307,44, | 2307,45, | 2307,46, | 2307,47, | 2307,48, | 2307,49, | 2307,50, | 2307,51, | 2307,52, | 2307,53, | 2307,54, | 2307,55, | 2307,56, | 2307,57, | 2307,58, | 2307,59, | 2307,60, | 2307,61, | 2307,62, | 2307,63, | 2307,64, | 2307,65, | 2307,66, | 2307,67, | 2307,68, | 2307,69, | 2307,70, | 2307,71, | 2307,72, | 2307,73, | 2307,74, | 2307,75, | 2307,76, | 2307,77, | 2307,78, | 2307,79, | 2307,80, | 2307,81, | 2307,82, | 2307,83, | 2307,84, | 2307,85, | 2308,1, | 2308,2, | 2308,3, | 2308,4, | 2308,5, | 2308,6, | 2308,7, | 2308,8, | 2308,9, | 2308,10, | 2308,11, | 2308,12, | 2308,13, | 2308,14, | 2308,15, | 2308,16, | 2308,17, | 2308,18, | 2308,19, | 2308,20, | 2308,21, | 2308,22, | 2308,23, | 2308,24, | 2308,25, | 2308,26, | 2308,27, | 2308,28, | 2308,29, | 2308,30, | 2308,31, | 2308,32, | 2308,33, | 2308,34, | 2308,35, | 2308,36, | 2308,37, | 2308,38, | 2308,39, | 2308,40, | 2308,41, | 2308,42, | 2308,43, | 2308,44, | 2308,45, | 2308,46, | 2308,47, | 2308,48, | 2308,49, | 2308,50, | 2308,51, | 2308,52, | 2308,53, | 2308,54, | 2308,55, | 2308,56, | 2308,57, | 2308,58, | 2308,59, | 2308,60, | 2308,61, | 2308,62, | 2308,63, | 2308,64, | 2308,65, | 2308,66, | 2308,67, | 2308,68, | 2308,69, | 2308,70, | 2308,71, | 2308,72, | 2308,73, | 2308,74, | 2308,75, | 2308,76, | 2308,77, | 2308,78, | 2308,79, | 2308,80, | 2308,81, | 2308,82, | 2308,83, | 2308,84, | 2308,85, | 2309,1, | 2309,2, | 2309,3, | 2309,4, | 2309,5, | 2309,6, | 2309,7, | 2309,8, | 2309,9, | 2309,10, | 2309,11, | 2309,12, | 2309,13, | 2309,14, | 2309,15, | 2309,16, | 2309,17, | 2309,18, | 2309,19, | 2309,20, | 2309,21, | 2309,22, | 2309,23, | 2309,24, | 2309,25, | 2309,26, | 2309,27, | 2309,28, | 2309,29, | 2309,30, | 2309,31, | 2309,32, | 2309,33, | 2309,34, | 2309,35, | 2309,36, | 2309,37, | 2309,38, | 2309,39, | 2309,40, | 2309,41, | 2309,42, | 2309,43, | 2309,44, | 2309,45, | 2309,46, | 2309,47, | 2309,48, | 2309,49, | 2309,50, | 2309,51, | 2309,52, | 2309,53, | 2309,54, | 2309,55, | 2309,56, | 2309,57, | 2309,58, | 2309,59, | 2309,60, | 2309,61, | 2309,62, | 2309,63, | 2309,64, | 2309,65, | 2309,66, | 2309,67, | 2309,68, | 2309,69, | 2309,70, | 2309,71, | 2309,72, | 2309,73, | 2309,74, | 2309,75, | 2309,76, | 2309,77, | 2309,78, | 2309,79, | 2309,80, | 2309,81, | 2309,82, | 2309,83, | 2309,84, | 2309,85, | 2310,1, | 2310,2, | 2310,3, | 2310,4, | 2310,5, | 2310,6, | 2310,7, | 2310,8, | 2310,9, | 2310,10, | 2310,11, | 2310,12, | 2310,13, | 2310,14, | 2310,15, | 2310,16, | 2310,17, | 2310,18, | 2310,19, | 2310,20, | 2310,21, | 2310,22, | 2310,23, | 2310,24, | 2310,25, | 2310,26, | 2310,27, | 2310,28, | 2310,29, | 2310,30, | 2310,31, | 2310,32, | 2310,33, | 2310,34, | 2310,35, | 2310,36, | 2310,37, | 2310,38, | 2310,39, | 2310,40, | 2310,41, | 2310,42, | 2310,43, | 2310,44, | 2310,45, | 2310,46, | 2310,47, | 2310,48, | 2310,49, | 2310,50, | 2310,51, | 2310,52, | 2310,53, | 2310,54, | 2310,55, | 2310,56, | 2310,57, | 2310,58, | 2310,59, | 2310,60, | 2310,61, | 2310,62, | 2310,63, | 2310,64, | 2310,65, | 2310,66, | 2310,67, | 2310,68, | 2310,69, | 2310,70, | 2310,71, | 2310,72, | 2310,73, | 2310,74, | 2310,75, | 2310,76, | 2310,77, | 2310,78, | 2310,79, | 2310,80, | 2310,81, | 2310,82, | 2310,83, | 2310,84, | 2310,85, | 2311,1, | 2311,2, | 2311,3, | 2311,4, | 2311,5, | 2311,6, | 2311,7, | 2311,8, | 2311,9, | 2311,10, | 2311,11, | 2311,12, | 2311,13, | 2311,14, | 2311,15, | 2311,16, | 2311,17, | 2311,18, | 2311,19, | 2311,20, | 2311,21, | 2311,22, | 2311,23, | 2311,24, | 2311,25, | 2311,26, | 2311,27, | 2311,28, | 2311,29, | 2311,30, | 2311,31, | 2311,32, | 2311,33, | 2311,34, | 2311,35, | 2311,36, | 2311,37, | 2311,38, | 2311,39, | 2311,40, | 2311,41, | 2311,42, | 2311,43, | 2311,44, | 2311,45, | 2311,46, | 2311,47, | 2311,48, | 2311,49, | 2311,50, | 2311,51, | 2311,52, | 2311,53, | 2311,54, | 2311,55, | 2311,56, | 2311,57, | 2311,58, | 2311,59, | 2311,60, | 2311,61, | 2311,62, | 2311,63, | 2311,64, | 2311,65, | 2311,66, | 2311,67, | 2311,68, | 2311,69, | 2311,70, | 2311,71, | 2311,72, | 2311,73, | 2311,74, | 2311,75, | 2311,76, | 2311,77, | 2311,78, | 2311,79, | 2311,80, | 2311,81, | 2311,82, | 2311,83, | 2311,84, | 2311,85, | 2312,1, | 2312,2, | 2312,3, | 2312,4, | 2312,5, | 2312,6, | 2312,7, | 2312,8, | 2312,9, | 2312,10, | 2312,11, | 2312,12, | 2312,13, | 2312,14, | 2312,15, | 2312,16, | 2312,17, | 2312,18, | 2312,19, | 2312,20, | 2312,21, | 2312,22, | 2312,23, | 2312,24, | 2312,25, | 2312,26, | 2312,27, | 2312,28, | 2312,29, | 2312,30, | 2312,31, | 2312,32, | 2312,33, | 2312,34, | 2312,35, | 2312,36, | 2312,37, | 2312,38, | 2312,39, | 2312,40, | 2312,41, | 2312,42, | 2312,43, | 2312,44, | 2312,45, | 2312,46, | 2312,47, | 2312,48, | 2312,49, | 2312,50, | 2312,51, | 2312,52, | 2312,53, | 2312,54, | 2312,55, | 2312,56, | 2312,57, | 2312,58, | 2312,59, | 2312,60, | 2312,61, | 2312,62, | 2312,63, | 2312,64, | 2312,65, | 2312,66, | 2312,67, | 2312,68, | 2312,69, | 2312,70, | 2312,71, | 2312,72, | 2312,73, | 2312,74, | 2312,75, | 2312,76, | 2312,77, | 2312,78, | 2312,79, | 2312,80, | 2312,81, | 2312,82, | 2312,83, | 2312,84, | 2312,85, | 2313,1, | 2313,2, | 2313,3, | 2313,4, | 2313,5, | 2313,6, | 2313,7, | 2313,8, | 2313,9, | 2313,10, | 2313,11, | 2313,12, | 2313,13, | 2313,14, | 2313,15, | 2313,16, | 2313,17, | 2313,18, | 2313,19, | 2313,20, | 2313,21, | 2313,22, | 2313,23, | 2313,24, | 2313,25, | 2313,26, | 2313,27, | 2313,28, | 2313,29, | 2313,30, | 2313,31, | 2313,32, | 2313,33, | 2313,34, | 2313,35, | 2313,36, | 2313,37, | 2313,38, | 2313,39, | 2313,40, | 2313,41, | 2313,42, | 2313,43, | 2313,44, | 2313,45, | 2313,46, | 2313,47, | 2313,48, | 2313,49, | 2313,50, | 2313,51, | 2313,52, | 2313,53, | 2313,54, | 2313,55, | 2313,56, | 2313,57, | 2313,58, | 2313,59, | 2313,60, | 2313,61, | 2313,62, | 2313,63, | 2313,64, | 2313,65, | 2313,66, | 2313,67, | 2313,68, | 2313,69, | 2313,70, | 2313,71, | 2313,72, | 2313,73, | 2313,74, | 2313,75, | 2313,76, | 2313,77, | 2313,78, | 2313,79, | 2313,80, | 2313,81, | 2313,82, | 2313,83, | 2313,84, | 2313,85, | 2314,1, | 2314,2, | 2314,3, | 2314,4, | 2314,5, | 2314,6, | 2314,7, | 2314,8, | 2314,9, | 2314,10, | 2314,11, | 2314,12, | 2314,13, | 2314,14, | 2314,15, | 2314,16, | 2314,17, | 2314,18, | 2314,19, | 2314,20, | 2314,21, | 2314,22, | 2314,23, | 2314,24, | 2314,25, | 2314,26, | 2314,27, | 2314,28, | 2314,29, | 2314,30, | 2314,31, | 2314,32, | 2314,33, | 2314,34, | 2314,35, | 2314,36, | 2314,37, | 2314,38, | 2314,39, | 2314,40, | 2314,41, | 2314,42, | 2314,43, | 2314,44, | 2314,45, | 2314,46, | 2314,47, | 2314,48, | 2314,49, | 2314,50, | 2314,51, | 2314,52, | 2314,53, | 2314,54, | 2314,55, | 2314,56, | 2314,57, | 2314,58, | 2314,59, | 2314,60, | 2314,61, | 2314,62, | 2314,63, | 2314,64, | 2314,65, | 2314,66, | 2314,67, | 2314,68, | 2314,69, | 2314,70, | 2314,71, | 2314,72, | 2314,73, | 2314,74, | 2314,75, | 2314,76, | 2314,77, | 2314,78, | 2314,79, | 2314,80, | 2314,81, | 2314,82, | 2314,83, | 2314,84, | 2314,85, | 2315,1, | 2315,2, | 2315,3, | 2315,4, | 2315,5, | 2315,6, | 2315,7, | 2315,8, | 2315,9, | 2315,10, | 2315,11, | 2315,12, | 2315,13, | 2315,14, | 2315,15, | 2315,16, | 2315,17, | 2315,18, | 2315,19, | 2315,20, | 2315,21, | 2315,22, | 2315,23, | 2315,24, | 2315,25, | 2315,26, | 2315,27, | 2315,28, | 2315,29, | 2315,30, | 2315,31, | 2315,32, | 2315,33, | 2315,34, | 2315,35, | 2315,36, | 2315,37, | 2315,38, | 2315,39, | 2315,40, | 2315,41, | 2315,42, | 2315,43, | 2315,44, | 2315,45, | 2315,46, | 2315,47, | 2315,48, | 2315,49, | 2315,50, | 2315,51, | 2315,52, | 2315,53, | 2315,54, | 2315,55, | 2315,56, | 2315,57, | 2315,58, | 2315,59, | 2315,60, | 2315,61, | 2315,62, | 2315,63, | 2315,64, | 2315,65, | 2315,66, | 2315,67, | 2315,68, | 2315,69, | 2315,70, | 2315,71, | 2315,72, | 2315,73, | 2315,74, | 2315,75, | 2315,76, | 2315,77, | 2315,78, | 2315,79, | 2315,80, | 2315,81, | 2315,82, | 2315,83, | 2315,84, | 2315,85, | 2316,1, | 2316,2, | 2316,3, | 2316,4, | 2316,5, | 2316,6, | 2316,7, | 2316,8, | 2316,9, | 2316,10, | 2316,11, | 2316,12, | 2316,13, | 2316,14, | 2316,15, | 2316,16, | 2316,17, | 2316,18, | 2316,19, | 2316,20, | 2316,21, | 2316,22, | 2316,23, | 2316,24, | 2316,25, | 2316,26, | 2316,27, | 2316,28, | 2316,29, | 2316,30, | 2316,31, | 2316,32, | 2316,33, | 2316,34, | 2316,35, | 2316,36, | 2316,37, | 2316,38, | 2316,39, | 2316,40, | 2316,41, | 2316,42, | 2316,43, | 2316,44, | 2316,45, | 2316,46, | 2316,47, | 2316,48, | 2316,49, | 2316,50, | 2316,51, | 2316,52, | 2316,53, | 2316,54, | 2316,55, | 2316,56, | 2316,57, | 2316,58, | 2316,59, | 2316,60, | 2316,61, | 2316,62, | 2316,63, | 2316,64, | 2316,65, | 2316,66, | 2316,67, | 2316,68, | 2316,69, | 2316,70, | 2316,71, | 2316,72, | 2316,73, | 2316,74, | 2316,75, | 2316,76, | 2316,77, | 2316,78, | 2316,79, | 2316,80, | 2316,81, | 2316,82, | 2316,83, | 2316,84, | 2316,85, | 2317,1, | 2317,2, | 2317,3, | 2317,4, | 2317,5, | 2317,6, | 2317,7, | 2317,8, | 2317,9, | 2317,10, | 2317,11, | 2317,12, | 2317,13, | 2317,14, | 2317,15, | 2317,16, | 2317,17, | 2317,18, | 2317,19, | 2317,20, | 2317,21, | 2317,22, | 2317,23, | 2317,24, | 2317,25, | 2317,26, | 2317,27, | 2317,28, | 2317,29, | 2317,30, | 2317,31, | 2317,32, | 2317,33, | 2317,34, | 2317,35, | 2317,36, | 2317,37, | 2317,38, | 2317,39, | 2317,40, | 2317,41, | 2317,42, | 2317,43, | 2317,44, | 2317,45, | 2317,46, | 2317,47, | 2317,48, | 2317,49, | 2317,50, | 2317,51, | 2317,52, | 2317,53, | 2317,54, | 2317,55, | 2317,56, | 2317,57, | 2317,58, | 2317,59, | 2317,60, | 2317,61, | 2317,62, | 2317,63, | 2317,64, | 2317,65, | 2317,66, | 2317,67, | 2317,68, | 2317,69, | 2317,70, | 2317,71, | 2317,72, | 2317,73, | 2317,74, | 2317,75, | 2317,76, | 2317,77, | 2317,78, | 2317,79, | 2317,80, | 2317,81, | 2317,82, | 2317,83, | 2317,84, | 2317,85, | 2318,1, | 2318,2, | 2318,3, | 2318,4, | 2318,5, | 2318,6, | 2318,7, | 2318,8, | 2318,9, | 2318,10, | 2318,11, | 2318,12, | 2318,13, | 2318,14, | 2318,15, | 2318,16, | 2318,17, | 2318,18, | 2318,19, | 2318,20, | 2318,21, | 2318,22, | 2318,23, | 2318,24, | 2318,25, | 2318,26, | 2318,27, | 2318,28, | 2318,29, | 2318,30, | 2318,31, | 2318,32, | 2318,33, | 2318,34, | 2318,35, | 2318,36, | 2318,37, | 2318,38, | 2318,39, | 2318,40, | 2318,41, | 2318,42, | 2318,43, | 2318,44, | 2318,45, | 2318,46, | 2318,47, | 2318,48, | 2318,49, | 2318,50, | 2318,51, | 2318,52, | 2318,53, | 2318,54, | 2318,55, | 2318,56, | 2318,57, | 2318,58, | 2318,59, | 2318,60, | 2318,61, | 2318,62, | 2318,63, | 2318,64, | 2318,65, | 2318,66, | 2318,67, | 2318,68, | 2318,69, | 2318,70, | 2318,71, | 2318,72, | 2318,73, | 2318,74, | 2318,75, | 2318,76, | 2318,77, | 2318,78, | 2318,79, | 2318,80, | 2318,81, | 2318,82, | 2318,83, | 2318,84, | 2318,85, | 2319,1, | 2319,2, | 2319,3, | 2319,4, | 2319,5, | 2319,6, | 2319,7, | 2319,8, | 2319,9, | 2319,10, | 2319,11, | 2319,12, | 2319,13, | 2319,14, | 2319,15, | 2319,16, | 2319,17, | 2319,18, | 2319,19, | 2319,20, | 2319,21, | 2319,22, | 2319,23, | 2319,24, | 2319,25, | 2319,26, | 2319,27, | 2319,28, | 2319,29, | 2319,30, | 2319,31, | 2319,32, | 2319,33, | 2319,34, | 2319,35, | 2319,36, | 2319,37, | 2319,38, | 2319,39, | 2319,40, | 2319,41, | 2319,42, | 2319,43, | 2319,44, | 2319,45, | 2319,46, | 2319,47, | 2319,48, | 2319,49, | 2319,50, | 2319,51, | 2319,52, | 2319,53, | 2319,54, | 2319,55, | 2319,56, | 2319,57, | 2319,58, | 2319,59, | 2319,60, | 2319,61, | 2319,62, | 2319,63, | 2319,64, | 2319,65, | 2319,66, | 2319,67, | 2319,68, | 2319,69, | 2319,70, | 2319,71, | 2319,72, | 2319,73, | 2319,74, | 2319,75, | 2319,76, | 2319,77, | 2319,78, | 2319,79, | 2319,80, | 2319,81, | 2319,82, | 2319,83, | 2319,84, | 2319,85, | 2320,1, | 2320,2, | 2320,3, | 2320,4, | 2320,5, | 2320,6, | 2320,7, | 2320,8, | 2320,9, | 2320,10, | 2320,11, | 2320,12, | 2320,13, | 2320,14, | 2320,15, | 2320,16, | 2320,17, | 2320,18, | 2320,19, | 2320,20, | 2320,21, | 2320,22, | 2320,23, | 2320,24, | 2320,25, | 2320,26, | 2320,27, | 2320,28, | 2320,29, | 2320,30, | 2320,31, | 2320,32, | 2320,33, | 2320,34, | 2320,35, | 2320,36, | 2320,37, | 2320,38, | 2320,39, | 2320,40, | 2320,41, | 2320,42, | 2320,43, | 2320,44, | 2320,45, | 2320,46, | 2320,47, | 2320,48, | 2320,49, | 2320,50, | 2320,51, | 2320,52, | 2320,53, | 2320,54, | 2320,55, | 2320,56, | 2320,57, | 2320,58, | 2320,59, | 2320,60, | 2320,61, | 2320,62, | 2320,63, | 2320,64, | 2320,65, | 2320,66, | 2320,67, | 2320,68, | 2320,69, | 2320,70, | 2320,71, | 2320,72, | 2320,73, | 2320,74, | 2320,75, | 2320,76, | 2320,77, | 2320,78, | 2320,79, | 2320,80, | 2320,81, | 2320,82, | 2320,83, | 2320,84, | 2320,85, | 2321,1, | 2321,2, | 2321,3, | 2321,4, | 2321,5, | 2321,6, | 2321,7, | 2321,8, | 2321,9, | 2321,10, | 2321,11, | 2321,12, | 2321,13, | 2321,14, | 2321,15, | 2321,16, | 2321,17, | 2321,18, | 2321,19, | 2321,20, | 2321,21, | 2321,22, | 2321,23, | 2321,24, | 2321,25, | 2321,26, | 2321,27, | 2321,28, | 2321,29, | 2321,30, | 2321,31, | 2321,32, | 2321,33, | 2321,34, | 2321,35, | 2321,36, | 2321,37, | 2321,38, | 2321,39, | 2321,40, | 2321,41, | 2321,42, | 2321,43, | 2321,44, | 2321,45, | 2321,46, | 2321,47, | 2321,48, | 2321,49, | 2321,50, | 2321,51, | 2321,52, | 2321,53, | 2321,54, | 2321,55, | 2321,56, | 2321,57, | 2321,58, | 2321,59, | 2321,60, | 2321,61, | 2321,62, | 2321,63, | 2321,64, | 2321,65, | 2321,66, | 2321,67, | 2321,68, | 2321,69, | 2321,70, | 2321,71, | 2321,72, | 2321,73, | 2321,74, | 2321,75, | 2321,76, | 2321,77, | 2321,78, | 2321,79, | 2321,80, | 2321,81, | 2321,82, | 2321,83, | 2321,84, | 2321,85, | 2322,1, | 2322,2, | 2322,3, | 2322,4, | 2322,5, | 2322,6, | 2322,7, | 2322,8, | 2322,9, | 2322,10, | 2322,11, | 2322,12, | 2322,13, | 2322,14, | 2322,15, | 2322,16, | 2322,17, | 2322,18, | 2322,19, | 2322,20, | 2322,21, | 2322,22, | 2322,23, | 2322,24, | 2322,25, | 2322,26, | 2322,27, | 2322,28, | 2322,29, | 2322,30, | 2322,31, | 2322,32, | 2322,33, | 2322,34, | 2322,35, | 2322,36, | 2322,37, | 2322,38, | 2322,39, | 2322,40, | 2322,41, | 2322,42, | 2322,43, | 2322,44, | 2322,45, | 2322,46, | 2322,47, | 2322,48, | 2322,49, | 2322,50, | 2322,51, | 2322,52, | 2322,53, | 2322,54, | 2322,55, | 2322,56, | 2322,57, | 2322,58, | 2322,59, | 2322,60, | 2322,61, | 2322,62, | 2322,63, | 2322,64, | 2322,65, | 2322,66, | 2322,67, | 2322,68, | 2322,69, | 2322,70, | 2322,71, | 2322,72, | 2322,73, | 2322,74, | 2322,75, | 2322,76, | 2322,77, | 2322,78, | 2322,79, | 2322,80, | 2322,81, | 2322,82, | 2322,83, | 2322,84, | 2322,85, | 2323,1, | 2323,2, | 2323,3, | 2323,4, | 2323,5, | 2323,6, | 2323,7, | 2323,8, | 2323,9, | 2323,10, | 2323,11, | 2323,12, | 2323,13, | 2323,14, | 2323,15, | 2323,16, | 2323,17, | 2323,18, | 2323,19, | 2323,20, | 2323,21, | 2323,22, | 2323,23, | 2323,24, | 2323,25, | 2323,26, | 2323,27, | 2323,28, | 2323,29, | 2323,30, | 2323,31, | 2323,32, | 2323,33, | 2323,34, | 2323,35, | 2323,36, | 2323,37, | 2323,38, | 2323,39, | 2323,40, | 2323,41, | 2323,42, | 2323,43, | 2323,44, | 2323,45, | 2323,46, | 2323,47, | 2323,48, | 2323,49, | 2323,50, | 2323,51, | 2323,52, | 2323,53, | 2323,54, | 2323,55, | 2323,56, | 2323,57, | 2323,58, | 2323,59, | 2323,60, | 2323,61, | 2323,62, | 2323,63, | 2323,64, | 2323,65, | 2323,66, | 2323,67, | 2323,68, | 2323,69, | 2323,70, | 2323,71, | 2323,72, | 2323,73, | 2323,74, | 2323,75, | 2323,76, | 2323,77, | 2323,78, | 2323,79, | 2323,80, | 2323,81, | 2323,82, | 2323,83, | 2323,84, | 2323,85, | 2324,1, | 2324,2, | 2324,3, | 2324,4, | 2324,5, | 2324,6, | 2324,7, | 2324,8, | 2324,9, | 2324,10, | 2324,11, | 2324,12, | 2324,13, | 2324,14, | 2324,15, | 2324,16, | 2324,17, | 2324,18, | 2324,19, | 2324,20, | 2324,21, | 2324,22, | 2324,23, | 2324,24, | 2324,25, | 2324,26, | 2324,27, | 2324,28, | 2324,29, | 2324,30, | 2324,31, | 2324,32, | 2324,33, | 2324,34, | 2324,35, | 2324,36, | 2324,37, | 2324,38, | 2324,39, | 2324,40, | 2324,41, | 2324,42, | 2324,43, | 2324,44, | 2324,45, | 2324,46, | 2324,47, | 2324,48, | 2324,49, | 2324,50, | 2324,51, | 2324,52, | 2324,53, | 2324,54, | 2324,55, | 2324,56, | 2324,57, | 2324,58, | 2324,59, | 2324,60, | 2324,61, | 2324,62, | 2324,63, | 2324,64, | 2324,65, | 2324,66, | 2324,67, | 2324,68, | 2324,69, | 2324,70, | 2324,71, | 2324,72, | 2324,73, | 2324,74, | 2324,75, | 2324,76, | 2324,77, | 2324,78, | 2324,79, | 2324,80, | 2324,81, | 2324,82, | 2324,83, | 2324,84, | 2324,85, | 2325,1, | 2325,2, | 2325,3, | 2325,4, | 2325,5, | 2325,6, | 2325,7, | 2325,8, | 2325,9, | 2325,10, | 2325,11, | 2325,12, | 2325,13, | 2325,14, | 2325,15, | 2325,16, | 2325,17, | 2325,18, | 2325,19, | 2325,20, | 2325,21, | 2325,22, | 2325,23, | 2325,24, | 2325,25, | 2325,26, | 2325,27, | 2325,28, | 2325,29, | 2325,30, | 2325,31, | 2325,32, | 2325,33, | 2325,34, | 2325,35, | 2325,36, | 2325,37, | 2325,38, | 2325,39, | 2325,40, | 2325,41, | 2325,42, | 2325,43, | 2325,44, | 2325,45, | 2325,46, | 2325,47, | 2325,48, | 2325,49, | 2325,50, | 2325,51, | 2325,52, | 2325,53, | 2325,54, | 2325,55, | 2325,56, | 2325,57, | 2325,58, | 2325,59, | 2325,60, | 2325,61, | 2325,62, | 2325,63, | 2325,64, | 2325,65, | 2325,66, | 2325,67, | 2325,68, | 2325,69, | 2325,70, | 2325,71, | 2325,72, | 2325,73, | 2325,74, | 2325,75, | 2325,76, | 2325,77, | 2325,78, | 2325,79, | 2325,80, | 2325,81, | 2325,82, | 2325,83, | 2325,84, | 2325,85, | 2326,1, | 2326,2, | 2326,3, | 2326,4, | 2326,5, | 2326,6, | 2326,7, | 2326,8, | 2326,9, | 2326,10, | 2326,11, | 2326,12, | 2326,13, | 2326,14, | 2326,15, | 2326,16, | 2326,17, | 2326,18, | 2326,19, | 2326,20, | 2326,21, | 2326,22, | 2326,23, | 2326,24, | 2326,25, | 2326,26, | 2326,27, | 2326,28, | 2326,29, | 2326,30, | 2326,31, | 2326,32, | 2326,33, | 2326,34, | 2326,35, | 2326,36, | 2326,37, | 2326,38, | 2326,39, | 2326,40, | 2326,41, | 2326,42, | 2326,43, | 2326,44, | 2326,45, | 2326,46, | 2326,47, | 2326,48, | 2326,49, | 2326,50, | 2326,51, | 2326,52, | 2326,53, | 2326,54, | 2326,55, | 2326,56, | 2326,57, | 2326,58, | 2326,59, | 2326,60, | 2326,61, | 2326,62, | 2326,63, | 2326,64, | 2326,65, | 2326,66, | 2326,67, | 2326,68, | 2326,69, | 2326,70, | 2326,71, | 2326,72, | 2326,73, | 2326,74, | 2326,75, | 2326,76, | 2326,77, | 2326,78, | 2326,79, | 2326,80, | 2326,81, | 2326,82, | 2326,83, | 2326,84, | 2326,85, | 2327,1, | 2327,2, | 2327,3, | 2327,4, | 2327,5, | 2327,6, | 2327,7, | 2327,8, | 2327,9, | 2327,10, | 2327,11, | 2327,12, | 2327,13, | 2327,14, | 2327,15, | 2327,16, | 2327,17, | 2327,18, | 2327,19, | 2327,20, | 2327,21, | 2327,22, | 2327,23, | 2327,24, | 2327,25, | 2327,26, | 2327,27, | 2327,28, | 2327,29, | 2327,30, | 2327,31, | 2327,32, | 2327,33, | 2327,34, | 2327,35, | 2327,36, | 2327,37, | 2327,38, | 2327,39, | 2327,40, | 2327,41, | 2327,42, | 2327,43, | 2327,44, | 2327,45, | 2327,46, | 2327,47, | 2327,48, | 2327,49, | 2327,50, | 2327,51, | 2327,52, | 2327,53, | 2327,54, | 2327,55, | 2327,56, | 2327,57, | 2327,58, | 2327,59, | 2327,60, | 2327,61, | 2327,62, | 2327,63, | 2327,64, | 2327,65, | 2327,66, | 2327,67, | 2327,68, | 2327,69, | 2327,70, | 2327,71, | 2327,72, | 2327,73, | 2327,74, | 2327,75, | 2327,76, | 2327,77, | 2327,78, | 2327,79, | 2327,80, | 2327,81, | 2327,82, | 2327,83, | 2327,84, | 2327,85, | 2328,1, | 2328,2, | 2328,3, | 2328,4, | 2328,5, | 2328,6, | 2328,7, | 2328,8, | 2328,9, | 2328,10, | 2328,11, | 2328,12, | 2328,13, | 2328,14, | 2328,15, | 2328,16, | 2328,17, | 2328,18, | 2328,19, | 2328,20, | 2328,21, | 2328,22, | 2328,23, | 2328,24, | 2328,25, | 2328,26, | 2328,27, | 2328,28, | 2328,29, | 2328,30, | 2328,31, | 2328,32, | 2328,33, | 2328,34, | 2328,35, | 2328,36, | 2328,37, | 2328,38, | 2328,39, | 2328,40, | 2328,41, | 2328,42, | 2328,43, | 2328,44, | 2328,45, | 2328,46, | 2328,47, | 2328,48, | 2328,49, | 2328,50, | 2328,51, | 2328,52, | 2328,53, | 2328,54, | 2328,55, | 2328,56, | 2328,57, | 2328,58, | 2328,59, | 2328,60, | 2328,61, | 2328,62, | 2328,63, | 2328,64, | 2328,65, | 2328,66, | 2328,67, | 2328,68, | 2328,69, | 2328,70, | 2328,71, | 2328,72, | 2328,73, | 2328,74, | 2328,75, | 2328,76, | 2328,77, | 2328,78, | 2328,79, | 2328,80, | 2328,81, | 2328,82, | 2328,83, | 2328,84, | 2328,85, | 2329,1, | 2329,2, | 2329,3, | 2329,4, | 2329,5, | 2329,6, | 2329,7, | 2329,8, | 2329,9, | 2329,10, | 2329,11, | 2329,12, | 2329,13, | 2329,14, | 2329,15, | 2329,16, | 2329,17, | 2329,18, | 2329,19, | 2329,20, | 2329,21, | 2329,22, | 2329,23, | 2329,24, | 2329,25, | 2329,26, | 2329,27, | 2329,28, | 2329,29, | 2329,30, | 2329,31, | 2329,32, | 2329,33, | 2329,34, | 2329,35, | 2329,36, | 2329,37, | 2329,38, | 2329,39, | 2329,40, | 2329,41, | 2329,42, | 2329,43, | 2329,44, | 2329,45, | 2329,46, | 2329,47, | 2329,48, | 2329,49, | 2329,50, | 2329,51, | 2329,52, | 2329,53, | 2329,54, | 2329,55, | 2329,56, | 2329,57, | 2329,58, | 2329,59, | 2329,60, | 2329,61, | 2329,62, | 2329,63, | 2329,64, | 2329,65, | 2329,66, | 2329,67, | 2329,68, | 2329,69, | 2329,70, | 2329,71, | 2329,72, | 2329,73, | 2329,74, | 2329,75, | 2329,76, | 2329,77, | 2329,78, | 2329,79, | 2329,80, | 2329,81, | 2329,82, | 2329,83, | 2329,84, | 2329,85, | 2330,1, | 2330,2, | 2330,3, | 2330,4, | 2330,5, | 2330,6, | 2330,7, | 2330,8, | 2330,9, | 2330,10, | 2330,11, | 2330,12, | 2330,13, | 2330,14, | 2330,15, | 2330,16, | 2330,17, | 2330,18, | 2330,19, | 2330,20, | 2330,21, | 2330,22, | 2330,23, | 2330,24, | 2330,25, | 2330,26, | 2330,27, | 2330,28, | 2330,29, | 2330,30, | 2330,31, | 2330,32, | 2330,33, | 2330,34, | 2330,35, | 2330,36, | 2330,37, | 2330,38, | 2330,39, | 2330,40, | 2330,41, | 2330,42, | 2330,43, | 2330,44, | 2330,45, | 2330,46, | 2330,47, | 2330,48, | 2330,49, | 2330,50, | 2330,51, | 2330,52, | 2330,53, | 2330,54, | 2330,55, | 2330,56, | 2330,57, | 2330,58, | 2330,59, | 2330,60, | 2330,61, | 2330,62, | 2330,63, | 2330,64, | 2330,65, | 2330,66, | 2330,67, | 2330,68, | 2330,69, | 2330,70, | 2330,71, | 2330,72, | 2330,73, | 2330,74, | 2330,75, | 2330,76, | 2330,77, | 2330,78, | 2330,79, | 2330,80, | 2330,81, | 2330,82, | 2330,83, | 2330,84, | 2330,85, | 2331,1, | 2331,2, | 2331,3, | 2331,4, | 2331,5, | 2331,6, | 2331,7, | 2331,8, | 2331,9, | 2331,10, | 2331,11, | 2331,12, | 2331,13, | 2331,14, | 2331,15, | 2331,16, | 2331,17, | 2331,18, | 2331,19, | 2331,20, | 2331,21, | 2331,22, | 2331,23, | 2331,24, | 2331,25, | 2331,26, | 2331,27, | 2331,28, | 2331,29, | 2331,30, | 2331,31, | 2331,32, | 2331,33, | 2331,34, | 2331,35, | 2331,36, | 2331,37, | 2331,38, | 2331,39, | 2331,40, | 2331,41, | 2331,42, | 2331,43, | 2331,44, | 2331,45, | 2331,46, | 2331,47, | 2331,48, | 2331,49, | 2331,50, | 2331,51, | 2331,52, | 2331,53, | 2331,54, | 2331,55, | 2331,56, | 2331,57, | 2331,58, | 2331,59, | 2331,60, | 2331,61, | 2331,62, | 2331,63, | 2331,64, | 2331,65, | 2331,66, | 2331,67, | 2331,68, | 2331,69, | 2331,70, | 2331,71, | 2331,72, | 2331,73, | 2331,74, | 2331,75, | 2331,76, | 2331,77, | 2331,78, | 2331,79, | 2331,80, | 2331,81, | 2331,82, | 2331,83, | 2331,84, | 2331,85, | 2332,1, | 2332,2, | 2332,3, | 2332,4, | 2332,5, | 2332,6, | 2332,7, | 2332,8, | 2332,9, | 2332,10, | 2332,11, | 2332,12, | 2332,13, | 2332,14, | 2332,15, | 2332,16, | 2332,17, | 2332,18, | 2332,19, | 2332,20, | 2332,21, | 2332,22, | 2332,23, | 2332,24, | 2332,25, | 2332,26, | 2332,27, | 2332,28, | 2332,29, | 2332,30, | 2332,31, | 2332,32, | 2332,33, | 2332,34, | 2332,35, | 2332,36, | 2332,37, | 2332,38, | 2332,39, | 2332,40, | 2332,41, | 2332,42, | 2332,43, | 2332,44, | 2332,45, | 2332,46, | 2332,47, | 2332,48, | 2332,49, | 2332,50, | 2332,51, | 2332,52, | 2332,53, | 2332,54, | 2332,55, | 2332,56, | 2332,57, | 2332,58, | 2332,59, | 2332,60, | 2332,61, | 2332,62, | 2332,63, | 2332,64, | 2332,65, | 2332,66, | 2332,67, | 2332,68, | 2332,69, | 2332,70, | 2332,71, | 2332,72, | 2332,73, | 2332,74, | 2332,75, | 2332,76, | 2332,77, | 2332,78, | 2332,79, | 2332,80, | 2332,81, | 2332,82, | 2332,83, | 2332,84, | 2332,85, | 2333,1, | 2333,2, | 2333,3, | 2333,4, | 2333,5, | 2333,6, | 2333,7, | 2333,8, | 2333,9, | 2333,10, | 2333,11, | 2333,12, | 2333,13, | 2333,14, | 2333,15, | 2333,16, | 2333,17, | 2333,18, | 2333,19, | 2333,20, | 2333,21, | 2333,22, | 2333,23, | 2333,24, | 2333,25, | 2333,26, | 2333,27, | 2333,28, | 2333,29, | 2333,30, | 2333,31, | 2333,32, | 2333,33, | 2333,34, | 2333,35, | 2333,36, | 2333,37, | 2333,38, | 2333,39, | 2333,40, | 2333,41, | 2333,42, | 2333,43, | 2333,44, | 2333,45, | 2333,46, | 2333,47, | 2333,48, | 2333,49, | 2333,50, | 2333,51, | 2333,52, | 2333,53, | 2333,54, | 2333,55, | 2333,56, | 2333,57, | 2333,58, | 2333,59, | 2333,60, | 2333,61, | 2333,62, | 2333,63, | 2333,64, | 2333,65, | 2333,66, | 2333,67, | 2333,68, | 2333,69, | 2333,70, | 2333,71, | 2333,72, | 2333,73, | 2333,74, | 2333,75, | 2333,76, | 2333,77, | 2333,78, | 2333,79, | 2333,80, | 2333,81, | 2333,82, | 2333,83, | 2333,84, | 2333,85, | 2334,1, | 2334,2, | 2334,3, | 2334,4, | 2334,5, | 2334,6, | 2334,7, | 2334,8, | 2334,9, | 2334,10, | 2334,11, | 2334,12, | 2334,13, | 2334,14, | 2334,15, | 2334,16, | 2334,17, | 2334,18, | 2334,19, | 2334,20, | 2334,21, | 2334,22, | 2334,23, | 2334,24, | 2334,25, | 2334,26, | 2334,27, | 2334,28, | 2334,29, | 2334,30, | 2334,31, | 2334,32, | 2334,33, | 2334,34, | 2334,35, | 2334,36, | 2334,37, | 2334,38, | 2334,39, | 2334,40, | 2334,41, | 2334,42, | 2334,43, | 2334,44, | 2334,45, | 2334,46, | 2334,47, | 2334,48, | 2334,49, | 2334,50, | 2334,51, | 2334,52, | 2334,53, | 2334,54, | 2334,55, | 2334,56, | 2334,57, | 2334,58, | 2334,59, | 2334,60, | 2334,61, | 2334,62, | 2334,63, | 2334,64, | 2334,65, | 2334,66, | 2334,67, | 2334,68, | 2334,69, | 2334,70, | 2334,71, | 2334,72, | 2334,73, | 2334,74, | 2334,75, | 2334,76, | 2334,77, | 2334,78, | 2334,79, | 2334,80, | 2334,81, | 2334,82, | 2334,83, | 2334,84, | 2334,85, | 2335,1, | 2335,2, | 2335,3, | 2335,4, | 2335,5, | 2335,6, | 2335,7, | 2335,8, | 2335,9, | 2335,10, | 2335,11, | 2335,12, | 2335,13, | 2335,14, | 2335,15, | 2335,16, | 2335,17, | 2335,18, | 2335,19, | 2335,20, | 2335,21, | 2335,22, | 2335,23, | 2335,24, | 2335,25, | 2335,26, | 2335,27, | 2335,28, | 2335,29, | 2335,30, | 2335,31, | 2335,32, | 2335,33, | 2335,34, | 2335,35, | 2335,36, | 2335,37, | 2335,38, | 2335,39, | 2335,40, | 2335,41, | 2335,42, | 2335,43, | 2335,44, | 2335,45, | 2335,46, | 2335,47, | 2335,48, | 2335,49, | 2335,50, | 2335,51, | 2335,52, | 2335,53, | 2335,54, | 2335,55, | 2335,56, | 2335,57, | 2335,58, | 2335,59, | 2335,60, | 2335,61, | 2335,62, | 2335,63, | 2335,64, | 2335,65, | 2335,66, | 2335,67, | 2335,68, | 2335,69, | 2335,70, | 2335,71, | 2335,72, | 2335,73, | 2335,74, | 2335,75, | 2335,76, | 2335,77, | 2335,78, | 2335,79, | 2335,80, | 2335,81, | 2335,82, | 2335,83, | 2335,84, | 2335,85, | 2336,1, | 2336,2, | 2336,3, | 2336,4, | 2336,5, | 2336,6, | 2336,7, | 2336,8, | 2336,9, | 2336,10, | 2336,11, | 2336,12, | 2336,13, | 2336,14, | 2336,15, | 2336,16, | 2336,17, | 2336,18, | 2336,19, | 2336,20, | 2336,21, | 2336,22, | 2336,23, | 2336,24, | 2336,25, | 2336,26, | 2336,27, | 2336,28, | 2336,29, | 2336,30, | 2336,31, | 2336,32, | 2336,33, | 2336,34, | 2336,35, | 2336,36, | 2336,37, | 2336,38, | 2336,39, | 2336,40, | 2336,41, | 2336,42, | 2336,43, | 2336,44, | 2336,45, | 2336,46, | 2336,47, | 2336,48, | 2336,49, | 2336,50, | 2336,51, | 2336,52, | 2336,53, | 2336,54, | 2336,55, | 2336,56, | 2336,57, | 2336,58, | 2336,59, | 2336,60, | 2336,61, | 2336,62, | 2336,63, | 2336,64, | 2336,65, | 2336,66, | 2336,67, | 2336,68, | 2336,69, | 2336,70, | 2336,71, | 2336,72, | 2336,73, | 2336,74, | 2336,75, | 2336,76, | 2336,77, | 2336,78, | 2336,79, | 2336,80, | 2336,81, | 2336,82, | 2336,83, | 2336,84, | 2336,85, | 2337,1, | 2337,2, | 2337,3, | 2337,4, | 2337,5, | 2337,6, | 2337,7, | 2337,8, | 2337,9, | 2337,10, | 2337,11, | 2337,12, | 2337,13, | 2337,14, | 2337,15, | 2337,16, | 2337,17, | 2337,18, | 2337,19, | 2337,20, | 2337,21, | 2337,22, | 2337,23, | 2337,24, | 2337,25, | 2337,26, | 2337,27, | 2337,28, | 2337,29, | 2337,30, | 2337,31, | 2337,32, | 2337,33, | 2337,34, | 2337,35, | 2337,36, | 2337,37, | 2337,38, | 2337,39, | 2337,40, | 2337,41, | 2337,42, | 2337,43, | 2337,44, | 2337,45, | 2337,46, | 2337,47, | 2337,48, | 2337,49, | 2337,50, | 2337,51, | 2337,52, | 2337,53, | 2337,54, | 2337,55, | 2337,56, | 2337,57, | 2337,58, | 2337,59, | 2337,60, | 2337,61, | 2337,62, | 2337,63, | 2337,64, | 2337,65, | 2337,66, | 2337,67, | 2337,68, | 2337,69, | 2337,70, | 2337,71, | 2337,72, | 2337,73, | 2337,74, | 2337,75, | 2337,76, | 2337,77, | 2337,78, | 2337,79, | 2337,80, | 2337,81, | 2337,82, | 2337,83, | 2337,84, | 2337,85, | 2338,1, | 2338,2, | 2338,3, | 2338,4, | 2338,5, | 2338,6, | 2338,7, | 2338,8, | 2338,9, | 2338,10, | 2338,11, | 2338,12, | 2338,13, | 2338,14, | 2338,15, | 2338,16, | 2338,17, | 2338,18, | 2338,19, | 2338,20, | 2338,21, | 2338,22, | 2338,23, | 2338,24, | 2338,25, | 2338,26, | 2338,27, | 2338,28, | 2338,29, | 2338,30, | 2338,31, | 2338,32, | 2338,33, | 2338,34, | 2338,35, | 2338,36, | 2338,37, | 2338,38, | 2338,39, | 2338,40, | 2338,41, | 2338,42, | 2338,43, | 2338,44, | 2338,45, | 2338,46, | 2338,47, | 2338,48, | 2338,49, | 2338,50, | 2338,51, | 2338,52, | 2338,53, | 2338,54, | 2338,55, | 2338,56, | 2338,57, | 2338,58, | 2338,59, | 2338,60, | 2338,61, | 2338,62, | 2338,63, | 2338,64, | 2338,65, | 2338,66, | 2338,67, | 2338,68, | 2338,69, | 2338,70, | 2338,71, | 2338,72, | 2338,73, | 2338,74, | 2338,75, | 2338,76, | 2338,77, | 2338,78, | 2338,79, | 2338,80, | 2338,81, | 2338,82, | 2338,83, | 2338,84, | 2338,85, | 2339,1, | 2339,2, | 2339,3, | 2339,4, | 2339,5, | 2339,6, | 2339,7, | 2339,8, | 2339,9, | 2339,10, | 2339,11, | 2339,12, | 2339,13, | 2339,14, | 2339,15, | 2339,16, | 2339,17, | 2339,18, | 2339,19, | 2339,20, | 2339,21, | 2339,22, | 2339,23, | 2339,24, | 2339,25, | 2339,26, | 2339,27, | 2339,28, | 2339,29, | 2339,30, | 2339,31, | 2339,32, | 2339,33, | 2339,34, | 2339,35, | 2339,36, | 2339,37, | 2339,38, | 2339,39, | 2339,40, | 2339,41, | 2339,42, | 2339,43, | 2339,44, | 2339,45, | 2339,46, | 2339,47, | 2339,48, | 2339,49, | 2339,50, | 2339,51, | 2339,52, | 2339,53, | 2339,54, | 2339,55, | 2339,56, | 2339,57, | 2339,58, | 2339,59, | 2339,60, | 2339,61, | 2339,62, | 2339,63, | 2339,64, | 2339,65, | 2339,66, | 2339,67, | 2339,68, | 2339,69, | 2339,70, | 2339,71, | 2339,72, | 2339,73, | 2339,74, | 2339,75, | 2339,76, | 2339,77, | 2339,78, | 2339,79, | 2339,80, | 2339,81, | 2339,82, | 2339,83, | 2339,84, | 2339,85, | 2340,1, | 2340,2, | 2340,3, | 2340,4, | 2340,5, | 2340,6, | 2340,7, | 2340,8, | 2340,9, | 2340,10, | 2340,11, | 2340,12, | 2340,13, | 2340,14, | 2340,15, | 2340,16, | 2340,17, | 2340,18, | 2340,19, | 2340,20, | 2340,21, | 2340,22, | 2340,23, | 2340,24, | 2340,25, | 2340,26, | 2340,27, | 2340,28, | 2340,29, | 2340,30, | 2340,31, | 2340,32, | 2340,33, | 2340,34, | 2340,35, | 2340,36, | 2340,37, | 2340,38, | 2340,39, | 2340,40, | 2340,41, | 2340,42, | 2340,43, | 2340,44, | 2340,45, | 2340,46, | 2340,47, | 2340,48, | 2340,49, | 2340,50, | 2340,51, | 2340,52, | 2340,53, | 2340,54, | 2340,55, | 2340,56, | 2340,57, | 2340,58, | 2340,59, | 2340,60, | 2340,61, | 2340,62, | 2340,63, | 2340,64, | 2340,65, | 2340,66, | 2340,67, | 2340,68, | 2340,69, | 2340,70, | 2340,71, | 2340,72, | 2340,73, | 2340,74, | 2340,75, | 2340,76, | 2340,77, | 2340,78, | 2340,79, | 2340,80, | 2340,81, | 2340,82, | 2340,83, | 2340,84, | 2340,85, | 2341,1, | 2341,2, | 2341,3, | 2341,4, | 2341,5, | 2341,6, | 2341,7, | 2341,8, | 2341,9, | 2341,10, | 2341,11, | 2341,12, | 2341,13, | 2341,14, | 2341,15, | 2341,16, | 2341,17, | 2341,18, | 2341,19, | 2341,20, | 2341,21, | 2341,22, | 2341,23, | 2341,24, | 2341,25, | 2341,26, | 2341,27, | 2341,28, | 2341,29, | 2341,30, | 2341,31, | 2341,32, | 2341,33, | 2341,34, | 2341,35, | 2341,36, | 2341,37, | 2341,38, | 2341,39, | 2341,40, | 2341,41, | 2341,42, | 2341,43, | 2341,44, | 2341,45, | 2341,46, | 2341,47, | 2341,48, | 2341,49, | 2341,50, | 2341,51, | 2341,52, | 2341,53, | 2341,54, | 2341,55, | 2341,56, | 2341,57, | 2341,58, | 2341,59, | 2341,60, | 2341,61, | 2341,62, | 2341,63, | 2341,64, | 2341,65, | 2341,66, | 2341,67, | 2341,68, | 2341,69, | 2341,70, | 2341,71, | 2341,72, | 2341,73, | 2341,74, | 2341,75, | 2341,76, | 2341,77, | 2341,78, | 2341,79, | 2341,80, | 2341,81, | 2341,82, | 2341,83, | 2341,84, | 2341,85, | 2342,1, | 2342,2, | 2342,3, | 2342,4, | 2342,5, | 2342,6, | 2342,7, | 2342,8, | 2342,9, | 2342,10, | 2342,11, | 2342,12, | 2342,13, | 2342,14, | 2342,15, | 2342,16, | 2342,17, | 2342,18, | 2342,19, | 2342,20, | 2342,21, | 2342,22, | 2342,23, | 2342,24, | 2342,25, | 2342,26, | 2342,27, | 2342,28, | 2342,29, | 2342,30, | 2342,31, | 2342,32, | 2342,33, | 2342,34, | 2342,35, | 2342,36, | 2342,37, | 2342,38, | 2342,39, | 2342,40, | 2342,41, | 2342,42, | 2342,43, | 2342,44, | 2342,45, | 2342,46, | 2342,47, | 2342,48, | 2342,49, | 2342,50, | 2342,51, | 2342,52, | 2342,53, | 2342,54, | 2342,55, | 2342,56, | 2342,57, | 2342,58, | 2342,59, | 2342,60, | 2342,61, | 2342,62, | 2342,63, | 2342,64, | 2342,65, | 2342,66, | 2342,67, | 2342,68, | 2342,69, | 2342,70, | 2342,71, | 2342,72, | 2342,73, | 2342,74, | 2342,75, | 2342,76, | 2342,77, | 2342,78, | 2342,79, | 2342,80, | 2342,81, | 2342,82, | 2342,83, | 2342,84, | 2342,85, | 2343,1, | 2343,2, | 2343,3, | 2343,4, | 2343,5, | 2343,6, | 2343,7, | 2343,8, | 2343,9, | 2343,10, | 2343,11, | 2343,12, | 2343,13, | 2343,14, | 2343,15, | 2343,16, | 2343,17, | 2343,18, | 2343,19, | 2343,20, | 2343,21, | 2343,22, | 2343,23, | 2343,24, | 2343,25, | 2343,26, | 2343,27, | 2343,28, | 2343,29, | 2343,30, | 2343,31, | 2343,32, | 2343,33, | 2343,34, | 2343,35, | 2343,36, | 2343,37, | 2343,38, | 2343,39, | 2343,40, | 2343,41, | 2343,42, | 2343,43, | 2343,44, | 2343,45, | 2343,46, | 2343,47, | 2343,48, | 2343,49, | 2343,50, | 2343,51, | 2343,52, | 2343,53, | 2343,54, | 2343,55, | 2343,56, | 2343,57, | 2343,58, | 2343,59, | 2343,60, | 2343,61, | 2343,62, | 2343,63, | 2343,64, | 2343,65, | 2343,66, | 2343,67, | 2343,68, | 2343,69, | 2343,70, | 2343,71, | 2343,72, | 2343,73, | 2343,74, | 2343,75, | 2343,76, | 2343,77, | 2343,78, | 2343,79, | 2343,80, | 2343,81, | 2343,82, | 2343,83, | 2343,84, | 2343,85, | 2344,1, | 2344,2, | 2344,3, | 2344,4, | 2344,5, | 2344,6, | 2344,7, | 2344,8, | 2344,9, | 2344,10, | 2344,11, | 2344,12, | 2344,13, | 2344,14, | 2344,15, | 2344,16, | 2344,17, | 2344,18, | 2344,19, | 2344,20, | 2344,21, | 2344,22, | 2344,23, | 2344,24, | 2344,25, | 2344,26, | 2344,27, | 2344,28, | 2344,29, | 2344,30, | 2344,31, | 2344,32, | 2344,33, | 2344,34, | 2344,35, | 2344,36, | 2344,37, | 2344,38, | 2344,39, | 2344,40, | 2344,41, | 2344,42, | 2344,43, | 2344,44, | 2344,45, | 2344,46, | 2344,47, | 2344,48, | 2344,49, | 2344,50, | 2344,51, | 2344,52, | 2344,53, | 2344,54, | 2344,55, | 2344,56, | 2344,57, | 2344,58, | 2344,59, | 2344,60, | 2344,61, | 2344,62, | 2344,63, | 2344,64, | 2344,65, | 2344,66, | 2344,67, | 2344,68, | 2344,69, | 2344,70, | 2344,71, | 2344,72, | 2344,73, | 2344,74, | 2344,75, | 2344,76, | 2344,77, | 2344,78, | 2344,79, | 2344,80, | 2344,81, | 2344,82, | 2344,83, | 2344,84, | 2344,85, | 2345,1, | 2345,2, | 2345,3, | 2345,4, | 2345,5, | 2345,6, | 2345,7, | 2345,8, | 2345,9, | 2345,10, | 2345,11, | 2345,12, | 2345,13, | 2345,14, | 2345,15, | 2345,16, | 2345,17, | 2345,18, | 2345,19, | 2345,20, | 2345,21, | 2345,22, | 2345,23, | 2345,24, | 2345,25, | 2345,26, | 2345,27, | 2345,28, | 2345,29, | 2345,30, | 2345,31, | 2345,32, | 2345,33, | 2345,34, | 2345,35, | 2345,36, | 2345,37, | 2345,38, | 2345,39, | 2345,40, | 2345,41, | 2345,42, | 2345,43, | 2345,44, | 2345,45, | 2345,46, | 2345,47, | 2345,48, | 2345,49, | 2345,50, | 2345,51, | 2345,52, | 2345,53, | 2345,54, | 2345,55, | 2345,56, | 2345,57, | 2345,58, | 2345,59, | 2345,60, | 2345,61, | 2345,62, | 2345,63, | 2345,64, | 2345,65, | 2345,66, | 2345,67, | 2345,68, | 2345,69, | 2345,70, | 2345,71, | 2345,72, | 2345,73, | 2345,74, | 2345,75, | 2345,76, | 2345,77, | 2345,78, | 2345,79, | 2345,80, | 2345,81, | 2345,82, | 2345,83, | 2345,84, | 2345,85, | 2346,1, | 2346,2, | 2346,3, | 2346,4, | 2346,5, | 2346,6, | 2346,7, | 2346,8, | 2346,9, | 2346,10, | 2346,11, | 2346,12, | 2346,13, | 2346,14, | 2346,15, | 2346,16, | 2346,17, | 2346,18, | 2346,19, | 2346,20, | 2346,21, | 2346,22, | 2346,23, | 2346,24, | 2346,25, | 2346,26, | 2346,27, | 2346,28, | 2346,29, | 2346,30, | 2346,31, | 2346,32, | 2346,33, | 2346,34, | 2346,35, | 2346,36, | 2346,37, | 2346,38, | 2346,39, | 2346,40, | 2346,41, | 2346,42, | 2346,43, | 2346,44, | 2346,45, | 2346,46, | 2346,47, | 2346,48, | 2346,49, | 2346,50, | 2346,51, | 2346,52, | 2346,53, | 2346,54, | 2346,55, | 2346,56, | 2346,57, | 2346,58, | 2346,59, | 2346,60, | 2346,61, | 2346,62, | 2346,63, | 2346,64, | 2346,65, | 2346,66, | 2346,67, | 2346,68, | 2346,69, | 2346,70, | 2346,71, | 2346,72, | 2346,73, | 2346,74, | 2346,75, | 2346,76, | 2346,77, | 2346,78, | 2346,79, | 2346,80, | 2346,81, | 2346,82, | 2346,83, | 2346,84, | 2346,85, | 2347,1, | 2347,2, | 2347,3, | 2347,4, | 2347,5, | 2347,6, | 2347,7, | 2347,8, | 2347,9, | 2347,10, | 2347,11, | 2347,12, | 2347,13, | 2347,14, | 2347,15, | 2347,16, | 2347,17, | 2347,18, | 2347,19, | 2347,20, | 2347,21, | 2347,22, | 2347,23, | 2347,24, | 2347,25, | 2347,26, | 2347,27, | 2347,28, | 2347,29, | 2347,30, | 2347,31, | 2347,32, | 2347,33, | 2347,34, | 2347,35, | 2347,36, | 2347,37, | 2347,38, | 2347,39, | 2347,40, | 2347,41, | 2347,42, | 2347,43, | 2347,44, | 2347,45, | 2347,46, | 2347,47, | 2347,48, | 2347,49, | 2347,50, | 2347,51, | 2347,52, | 2347,53, | 2347,54, | 2347,55, | 2347,56, | 2347,57, | 2347,58, | 2347,59, | 2347,60, | 2347,61, | 2347,62, | 2347,63, | 2347,64, | 2347,65, | 2347,66, | 2347,67, | 2347,68, | 2347,69, | 2347,70, | 2347,71, | 2347,72, | 2347,73, | 2347,74, | 2347,75, | 2347,76, | 2347,77, | 2347,78, | 2347,79, | 2347,80, | 2347,81, | 2347,82, | 2347,83, | 2347,84, | 2347,85, | 2348,1, | 2348,2, | 2348,3, | 2348,4, | 2348,5, | 2348,6, | 2348,7, | 2348,8, | 2348,9, | 2348,10, | 2348,11, | 2348,12, | 2348,13, | 2348,14, | 2348,15, | 2348,16, | 2348,17, | 2348,18, | 2348,19, | 2348,20, | 2348,21, | 2348,22, | 2348,23, | 2348,24, | 2348,25, | 2348,26, | 2348,27, | 2348,28, | 2348,29, | 2348,30, | 2348,31, | 2348,32, | 2348,33, | 2348,34, | 2348,35, | 2348,36, | 2348,37, | 2348,38, | 2348,39, | 2348,40, | 2348,41, | 2348,42, | 2348,43, | 2348,44, | 2348,45, | 2348,46, | 2348,47, | 2348,48, | 2348,49, | 2348,50, | 2348,51, | 2348,52, | 2348,53, | 2348,54, | 2348,55, | 2348,56, | 2348,57, | 2348,58, | 2348,59, | 2348,60, | 2348,61, | 2348,62, | 2348,63, | 2348,64, | 2348,65, | 2348,66, | 2348,67, | 2348,68, | 2348,69, | 2348,70, | 2348,71, | 2348,72, | 2348,73, | 2348,74, | 2348,75, | 2348,76, | 2348,77, | 2348,78, | 2348,79, | 2348,80, | 2348,81, | 2348,82, | 2348,83, | 2348,84, | 2348,85, | 2349,1, | 2349,2, | 2349,3, | 2349,4, | 2349,5, | 2349,6, | 2349,7, | 2349,8, | 2349,9, | 2349,10, | 2349,11, | 2349,12, | 2349,13, | 2349,14, | 2349,15, | 2349,16, | 2349,17, | 2349,18, | 2349,19, | 2349,20, | 2349,21, | 2349,22, | 2349,23, | 2349,24, | 2349,25, | 2349,26, | 2349,27, | 2349,28, | 2349,29, | 2349,30, | 2349,31, | 2349,32, | 2349,33, | 2349,34, | 2349,35, | 2349,36, | 2349,37, | 2349,38, | 2349,39, | 2349,40, | 2349,41, | 2349,42, | 2349,43, | 2349,44, | 2349,45, | 2349,46, | 2349,47, | 2349,48, | 2349,49, | 2349,50, | 2349,51, | 2349,52, | 2349,53, | 2349,54, | 2349,55, | 2349,56, | 2349,57, | 2349,58, | 2349,59, | 2349,60, | 2349,61, | 2349,62, | 2349,63, | 2349,64, | 2349,65, | 2349,66, | 2349,67, | 2349,68, | 2349,69, | 2349,70, | 2349,71, | 2349,72, | 2349,73, | 2349,74, | 2349,75, | 2349,76, | 2349,77, | 2349,78, | 2349,79, | 2349,80, | 2349,81, | 2349,82, | 2349,83, | 2349,84, | 2349,85, | 2350,1, | 2350,2, | 2350,3, | 2350,4, | 2350,5, | 2350,6, | 2350,7, | 2350,8, | 2350,9, | 2350,10, | 2350,11, | 2350,12, | 2350,13, | 2350,14, | 2350,15, | 2350,16, | 2350,17, | 2350,18, | 2350,19, | 2350,20, | 2350,21, | 2350,22, | 2350,23, | 2350,24, | 2350,25, | 2350,26, | 2350,27, | 2350,28, | 2350,29, | 2350,30, | 2350,31, | 2350,32, | 2350,33, | 2350,34, | 2350,35, | 2350,36, | 2350,37, | 2350,38, | 2350,39, | 2350,40, | 2350,41, | 2350,42, | 2350,43, | 2350,44, | 2350,45, | 2350,46, | 2350,47, | 2350,48, | 2350,49, | 2350,50, | 2350,51, | 2350,52, | 2350,53, | 2350,54, | 2350,55, | 2350,56, | 2350,57, | 2350,58, | 2350,59, | 2350,60, | 2350,61, | 2350,62, | 2350,63, | 2350,64, | 2350,65, | 2350,66, | 2350,67, | 2350,68, | 2350,69, | 2350,70, | 2350,71, | 2350,72, | 2350,73, | 2350,74, | 2350,75, | 2350,76, | 2350,77, | 2350,78, | 2350,79, | 2350,80, | 2350,81, | 2350,82, | 2350,83, | 2350,84, | 2350,85, | 2351,1, | 2351,2, | 2351,3, | 2351,4, | 2351,5, | 2351,6, | 2351,7, | 2351,8, | 2351,9, | 2351,10, | 2351,11, | 2351,12, | 2351,13, | 2351,14, | 2351,15, | 2351,16, | 2351,17, | 2351,18, | 2351,19, | 2351,20, | 2351,21, | 2351,22, | 2351,23, | 2351,24, | 2351,25, | 2351,26, | 2351,27, | 2351,28, | 2351,29, | 2351,30, | 2351,31, | 2351,32, | 2351,33, | 2351,34, | 2351,35, | 2351,36, | 2351,37, | 2351,38, | 2351,39, | 2351,40, | 2351,41, | 2351,42, | 2351,43, | 2351,44, | 2351,45, | 2351,46, | 2351,47, | 2351,48, | 2351,49, | 2351,50, | 2351,51, | 2351,52, | 2351,53, | 2351,54, | 2351,55, | 2351,56, | 2351,57, | 2351,58, | 2351,59, | 2351,60, | 2351,61, | 2351,62, | 2351,63, | 2351,64, | 2351,65, | 2351,66, | 2351,67, | 2351,68, | 2351,69, | 2351,70, | 2351,71, | 2351,72, | 2351,73, | 2351,74, | 2351,75, | 2351,76, | 2351,77, | 2351,78, | 2351,79, | 2351,80, | 2351,81, | 2351,82, | 2351,83, | 2351,84, | 2351,85, | 2352,1, | 2352,2, | 2352,3, | 2352,4, | 2352,5, | 2352,6, | 2352,7, | 2352,8, | 2352,9, | 2352,10, | 2352,11, | 2352,12, | 2352,13, | 2352,14, | 2352,15, | 2352,16, | 2352,17, | 2352,18, | 2352,19, | 2352,20, | 2352,21, | 2352,22, | 2352,23, | 2352,24, | 2352,25, | 2352,26, | 2352,27, | 2352,28, | 2352,29, | 2352,30, | 2352,31, | 2352,32, | 2352,33, | 2352,34, | 2352,35, | 2352,36, | 2352,37, | 2352,38, | 2352,39, | 2352,40, | 2352,41, | 2352,42, | 2352,43, | 2352,44, | 2352,45, | 2352,46, | 2352,47, | 2352,48, | 2352,49, | 2352,50, | 2352,51, | 2352,52, | 2352,53, | 2352,54, | 2352,55, | 2352,56, | 2352,57, | 2352,58, | 2352,59, | 2352,60, | 2352,61, | 2352,62, | 2352,63, | 2352,64, | 2352,65, | 2352,66, | 2352,67, | 2352,68, | 2352,69, | 2352,70, | 2352,71, | 2352,72, | 2352,73, | 2352,74, | 2352,75, | 2352,76, | 2352,77, | 2352,78, | 2352,79, | 2352,80, | 2352,81, | 2352,82, | 2352,83, | 2352,84, | 2352,85, | 2353,1, | 2353,2, | 2353,3, | 2353,4, | 2353,5, | 2353,6, | 2353,7, | 2353,8, | 2353,9, | 2353,10, | 2353,11, | 2353,12, | 2353,13, | 2353,14, | 2353,15, | 2353,16, | 2353,17, | 2353,18, | 2353,19, | 2353,20, | 2353,21, | 2353,22, | 2353,23, | 2353,24, | 2353,25, | 2353,26, | 2353,27, | 2353,28, | 2353,29, | 2353,30, | 2353,31, | 2353,32, | 2353,33, | 2353,34, | 2353,35, | 2353,36, | 2353,37, | 2353,38, | 2353,39, | 2353,40, | 2353,41, | 2353,42, | 2353,43, | 2353,44, | 2353,45, | 2353,46, | 2353,47, | 2353,48, | 2353,49, | 2353,50, | 2353,51, | 2353,52, | 2353,53, | 2353,54, | 2353,55, | 2353,56, | 2353,57, | 2353,58, | 2353,59, | 2353,60, | 2353,61, | 2353,62, | 2353,63, | 2353,64, | 2353,65, | 2353,66, | 2353,67, | 2353,68, | 2353,69, | 2353,70, | 2353,71, | 2353,72, | 2353,73, | 2353,74, | 2353,75, | 2353,76, | 2353,77, | 2353,78, | 2353,79, | 2353,80, | 2353,81, | 2353,82, | 2353,83, | 2353,84, | 2353,85, | 2354,1, | 2354,2, | 2354,3, | 2354,4, | 2354,5, | 2354,6, | 2354,7, | 2354,8, | 2354,9, | 2354,10, | 2354,11, | 2354,12, | 2354,13, | 2354,14, | 2354,15, | 2354,16, | 2354,17, | 2354,18, | 2354,19, | 2354,20, | 2354,21, | 2354,22, | 2354,23, | 2354,24, | 2354,25, | 2354,26, | 2354,27, | 2354,28, | 2354,29, | 2354,30, | 2354,31, | 2354,32, | 2354,33, | 2354,34, | 2354,35, | 2354,36, | 2354,37, | 2354,38, | 2354,39, | 2354,40, | 2354,41, | 2354,42, | 2354,43, | 2354,44, | 2354,45, | 2354,46, | 2354,47, | 2354,48, | 2354,49, | 2354,50, | 2354,51, | 2354,52, | 2354,53, | 2354,54, | 2354,55, | 2354,56, | 2354,57, | 2354,58, | 2354,59, | 2354,60, | 2354,61, | 2354,62, | 2354,63, | 2354,64, | 2354,65, | 2354,66, | 2354,67, | 2354,68, | 2354,69, | 2354,70, | 2354,71, | 2354,72, | 2354,73, | 2354,74, | 2354,75, | 2354,76, | 2354,77, | 2354,78, | 2354,79, | 2354,80, | 2354,81, | 2354,82, | 2354,83, | 2354,84, | 2354,85, | 2355,1, | 2355,2, | 2355,3, | 2355,4, | 2355,5, | 2355,6, | 2355,7, | 2355,8, | 2355,9, | 2355,10, | 2355,11, | 2355,12, | 2355,13, | 2355,14, | 2355,15, | 2355,16, | 2355,17, | 2355,18, | 2355,19, | 2355,20, | 2355,21, | 2355,22, | 2355,23, | 2355,24, | 2355,25, | 2355,26, | 2355,27, | 2355,28, | 2355,29, | 2355,30, | 2355,31, | 2355,32, | 2355,33, | 2355,34, | 2355,35, | 2355,36, | 2355,37, | 2355,38, | 2355,39, | 2355,40, | 2355,41, | 2355,42, | 2355,43, | 2355,44, | 2355,45, | 2355,46, | 2355,47, | 2355,48, | 2355,49, | 2355,50, | 2355,51, | 2355,52, | 2355,53, | 2355,54, | 2355,55, | 2355,56, | 2355,57, | 2355,58, | 2355,59, | 2355,60, | 2355,61, | 2355,62, | 2355,63, | 2355,64, | 2355,65, | 2355,66, | 2355,67, | 2355,68, | 2355,69, | 2355,70, | 2355,71, | 2355,72, | 2355,73, | 2355,74, | 2355,75, | 2355,76, | 2355,77, | 2355,78, | 2355,79, | 2355,80, | 2355,81, | 2355,82, | 2355,83, | 2355,84, | 2355,85, | 2356,1, | 2356,2, | 2356,3, | 2356,4, | 2356,5, | 2356,6, | 2356,7, | 2356,8, | 2356,9, | 2356,10, | 2356,11, | 2356,12, | 2356,13, | 2356,14, | 2356,15, | 2356,16, | 2356,17, | 2356,18, | 2356,19, | 2356,20, | 2356,21, | 2356,22, | 2356,23, | 2356,24, | 2356,25, | 2356,26, | 2356,27, | 2356,28, | 2356,29, | 2356,30, | 2356,31, | 2356,32, | 2356,33, | 2356,34, | 2356,35, | 2356,36, | 2356,37, | 2356,38, | 2356,39, | 2356,40, | 2356,41, | 2356,42, | 2356,43, | 2356,44, | 2356,45, | 2356,46, | 2356,47, | 2356,48, | 2356,49, | 2356,50, | 2356,51, | 2356,52, | 2356,53, | 2356,54, | 2356,55, | 2356,56, | 2356,57, | 2356,58, | 2356,59, | 2356,60, | 2356,61, | 2356,62, | 2356,63, | 2356,64, | 2356,65, | 2356,66, | 2356,67, | 2356,68, | 2356,69, | 2356,70, | 2356,71, | 2356,72, | 2356,73, | 2356,74, | 2356,75, | 2356,76, | 2356,77, | 2356,78, | 2356,79, | 2356,80, | 2356,81, | 2356,82, | 2356,83, | 2356,84, | 2356,85, | 2357,1, | 2357,2, | 2357,3, | 2357,4, | 2357,5, | 2357,6, | 2357,7, | 2357,8, | 2357,9, | 2357,10, | 2357,11, | 2357,12, | 2357,13, | 2357,14, | 2357,15, | 2357,16, | 2357,17, | 2357,18, | 2357,19, | 2357,20, | 2357,21, | 2357,22, | 2357,23, | 2357,24, | 2357,25, | 2357,26, | 2357,27, | 2357,28, | 2357,29, | 2357,30, | 2357,31, | 2357,32, | 2357,33, | 2357,34, | 2357,35, | 2357,36, | 2357,37, | 2357,38, | 2357,39, | 2357,40, | 2357,41, | 2357,42, | 2357,43, | 2357,44, | 2357,45, | 2357,46, | 2357,47, | 2357,48, | 2357,49, | 2357,50, | 2357,51, | 2357,52, | 2357,53, | 2357,54, | 2357,55, | 2357,56, | 2357,57, | 2357,58, | 2357,59, | 2357,60, | 2357,61, | 2357,62, | 2357,63, | 2357,64, | 2357,65, | 2357,66, | 2357,67, | 2357,68, | 2357,69, | 2357,70, | 2357,71, | 2357,72, | 2357,73, | 2357,74, | 2357,75, | 2357,76, | 2357,77, | 2357,78, | 2357,79, | 2357,80, | 2357,81, | 2357,82, | 2357,83, | 2357,84, | 2357,85, | 2358,1, | 2358,2, | 2358,3, | 2358,4, | 2358,5, | 2358,6, | 2358,7, | 2358,8, | 2358,9, | 2358,10, | 2358,11, | 2358,12, | 2358,13, | 2358,14, | 2358,15, | 2358,16, | 2358,17, | 2358,18, | 2358,19, | 2358,20, | 2358,21, | 2358,22, | 2358,23, | 2358,24, | 2358,25, | 2358,26, | 2358,27, | 2358,28, | 2358,29, | 2358,30, | 2358,31, | 2358,32, | 2358,33, | 2358,34, | 2358,35, | 2358,36, | 2358,37, | 2358,38, | 2358,39, | 2358,40, | 2358,41, | 2358,42, | 2358,43, | 2358,44, | 2358,45, | 2358,46, | 2358,47, | 2358,48, | 2358,49, | 2358,50, | 2358,51, | 2358,52, | 2358,53, | 2358,54, | 2358,55, | 2358,56, | 2358,57, | 2358,58, | 2358,59, | 2358,60, | 2358,61, | 2358,62, | 2358,63, | 2358,64, | 2358,65, | 2358,66, | 2358,67, | 2358,68, | 2358,69, | 2358,70, | 2358,71, | 2358,72, | 2358,73, | 2358,74, | 2358,75, | 2358,76, | 2358,77, | 2358,78, | 2358,79, | 2358,80, | 2358,81, | 2358,82, | 2358,83, | 2358,84, | 2358,85, | 2359,1, | 2359,2, | 2359,3, | 2359,4, | 2359,5, | 2359,6, | 2359,7, | 2359,8, | 2359,9, | 2359,10, | 2359,11, | 2359,12, | 2359,13, | 2359,14, | 2359,15, | 2359,16, | 2359,17, | 2359,18, | 2359,19, | 2359,20, | 2359,21, | 2359,22, | 2359,23, | 2359,24, | 2359,25, | 2359,26, | 2359,27, | 2359,28, | 2359,29, | 2359,30, | 2359,31, | 2359,32, | 2359,33, | 2359,34, | 2359,35, | 2359,36, | 2359,37, | 2359,38, | 2359,39, | 2359,40, | 2359,41, | 2359,42, | 2359,43, | 2359,44, | 2359,45, | 2359,46, | 2359,47, | 2359,48, | 2359,49, | 2359,50, | 2359,51, | 2359,52, | 2359,53, | 2359,54, | 2359,55, | 2359,56, | 2359,57, | 2359,58, | 2359,59, | 2359,60, | 2359,61, | 2359,62, | 2359,63, | 2359,64, | 2359,65, | 2359,66, | 2359,67, | 2359,68, | 2359,69, | 2359,70, | 2359,71, | 2359,72, | 2359,73, | 2359,74, | 2359,75, | 2359,76, | 2359,77, | 2359,78, | 2359,79, | 2359,80, | 2359,81, | 2359,82, | 2359,83, | 2359,84, | 2359,85, | 2360,1, | 2360,2, | 2360,3, | 2360,4, | 2360,5, | 2360,6, | 2360,7, | 2360,8, | 2360,9, | 2360,10, | 2360,11, | 2360,12, | 2360,13, | 2360,14, | 2360,15, | 2360,16, | 2360,17, | 2360,18, | 2360,19, | 2360,20, | 2360,21, | 2360,22, | 2360,23, | 2360,24, | 2360,25, | 2360,26, | 2360,27, | 2360,28, | 2360,29, | 2360,30, | 2360,31, | 2360,32, | 2360,33, | 2360,34, | 2360,35, | 2360,36, | 2360,37, | 2360,38, | 2360,39, | 2360,40, | 2360,41, | 2360,42, | 2360,43, | 2360,44, | 2360,45, | 2360,46, | 2360,47, | 2360,48, | 2360,49, | 2360,50, | 2360,51, | 2360,52, | 2360,53, | 2360,54, | 2360,55, | 2360,56, | 2360,57, | 2360,58, | 2360,59, | 2360,60, | 2360,61, | 2360,62, | 2360,63, | 2360,64, | 2360,65, | 2360,66, | 2360,67, | 2360,68, | 2360,69, | 2360,70, | 2360,71, | 2360,72, | 2360,73, | 2360,74, | 2360,75, | 2360,76, | 2360,77, | 2360,78, | 2360,79, | 2360,80, | 2360,81, | 2360,82, | 2360,83, | 2360,84, | 2360,85, | 2361,1, | 2361,2, | 2361,3, | 2361,4, | 2361,5, | 2361,6, | 2361,7, | 2361,8, | 2361,9, | 2361,10, | 2361,11, | 2361,12, | 2361,13, | 2361,14, | 2361,15, | 2361,16, | 2361,17, | 2361,18, | 2361,19, | 2361,20, | 2361,21, | 2361,22, | 2361,23, | 2361,24, | 2361,25, | 2361,26, | 2361,27, | 2361,28, | 2361,29, | 2361,30, | 2361,31, | 2361,32, | 2361,33, | 2361,34, | 2361,35, | 2361,36, | 2361,37, | 2361,38, | 2361,39, | 2361,40, | 2361,41, | 2361,42, | 2361,43, | 2361,44, | 2361,45, | 2361,46, | 2361,47, | 2361,48, | 2361,49, | 2361,50, | 2361,51, | 2361,52, | 2361,53, | 2361,54, | 2361,55, | 2361,56, | 2361,57, | 2361,58, | 2361,59, | 2361,60, | 2361,61, | 2361,62, | 2361,63, | 2361,64, | 2361,65, | 2361,66, | 2361,67, | 2361,68, | 2361,69, | 2361,70, | 2361,71, | 2361,72, | 2361,73, | 2361,74, | 2361,75, | 2361,76, | 2361,77, | 2361,78, | 2361,79, | 2361,80, | 2361,81, | 2361,82, | 2361,83, | 2361,84, | 2361,85, | 2362,1, | 2362,2, | 2362,3, | 2362,4, | 2362,5, | 2362,6, | 2362,7, | 2362,8, | 2362,9, | 2362,10, | 2362,11, | 2362,12, | 2362,13, | 2362,14, | 2362,15, | 2362,16, | 2362,17, | 2362,18, | 2362,19, | 2362,20, | 2362,21, | 2362,22, | 2362,23, | 2362,24, | 2362,25, | 2362,26, | 2362,27, | 2362,28, | 2362,29, | 2362,30, | 2362,31, | 2362,32, | 2362,33, | 2362,34, | 2362,35, | 2362,36, | 2362,37, | 2362,38, | 2362,39, | 2362,40, | 2362,41, | 2362,42, | 2362,43, | 2362,44, | 2362,45, | 2362,46, | 2362,47, | 2362,48, | 2362,49, | 2362,50, | 2362,51, | 2362,52, | 2362,53, | 2362,54, | 2362,55, | 2362,56, | 2362,57, | 2362,58, | 2362,59, | 2362,60, | 2362,61, | 2362,62, | 2362,63, | 2362,64, | 2362,65, | 2362,66, | 2362,67, | 2362,68, | 2362,69, | 2362,70, | 2362,71, | 2362,72, | 2362,73, | 2362,74, | 2362,75, | 2362,76, | 2362,77, | 2362,78, | 2362,79, | 2362,80, | 2362,81, | 2362,82, | 2362,83, | 2362,84, | 2362,85, | 2363,1, | 2363,2, | 2363,3, | 2363,4, | 2363,5, | 2363,6, | 2363,7, | 2363,8, | 2363,9, | 2363,10, | 2363,11, | 2363,12, | 2363,13, | 2363,14, | 2363,15, | 2363,16, | 2363,17, | 2363,18, | 2363,19, | 2363,20, | 2363,21, | 2363,22, | 2363,23, | 2363,24, | 2363,25, | 2363,26, | 2363,27, | 2363,28, | 2363,29, | 2363,30, | 2363,31, | 2363,32, | 2363,33, | 2363,34, | 2363,35, | 2363,36, | 2363,37, | 2363,38, | 2363,39, | 2363,40, | 2363,41, | 2363,42, | 2363,43, | 2363,44, | 2363,45, | 2363,46, | 2363,47, | 2363,48, | 2363,49, | 2363,50, | 2363,51, | 2363,52, | 2363,53, | 2363,54, | 2363,55, | 2363,56, | 2363,57, | 2363,58, | 2363,59, | 2363,60, | 2363,61, | 2363,62, | 2363,63, | 2363,64, | 2363,65, | 2363,66, | 2363,67, | 2363,68, | 2363,69, | 2363,70, | 2363,71, | 2363,72, | 2363,73, | 2363,74, | 2363,75, | 2363,76, | 2363,77, | 2363,78, | 2363,79, | 2363,80, | 2363,81, | 2363,82, | 2363,83, | 2363,84, | 2363,85, | 2364,1, | 2364,2, | 2364,3, | 2364,4, | 2364,5, | 2364,6, | 2364,7, | 2364,8, | 2364,9, | 2364,10, | 2364,11, | 2364,12, | 2364,13, | 2364,14, | 2364,15, | 2364,16, | 2364,17, | 2364,18, | 2364,19, | 2364,20, | 2364,21, | 2364,22, | 2364,23, | 2364,24, | 2364,25, | 2364,26, | 2364,27, | 2364,28, | 2364,29, | 2364,30, | 2364,31, | 2364,32, | 2364,33, | 2364,34, | 2364,35, | 2364,36, | 2364,37, | 2364,38, | 2364,39, | 2364,40, | 2364,41, | 2364,42, | 2364,43, | 2364,44, | 2364,45, | 2364,46, | 2364,47, | 2364,48, | 2364,49, | 2364,50, | 2364,51, | 2364,52, | 2364,53, | 2364,54, | 2364,55, | 2364,56, | 2364,57, | 2364,58, | 2364,59, | 2364,60, | 2364,61, | 2364,62, | 2364,63, | 2364,64, | 2364,65, | 2364,66, | 2364,67, | 2364,68, | 2364,69, | 2364,70, | 2364,71, | 2364,72, | 2364,73, | 2364,74, | 2364,75, | 2364,76, | 2364,77, | 2364,78, | 2364,79, | 2364,80, | 2364,81, | 2364,82, | 2364,83, | 2364,84, | 2364,85, | 2365,1, | 2365,2, | 2365,3, | 2365,4, | 2365,5, | 2365,6, | 2365,7, | 2365,8, | 2365,9, | 2365,10, | 2365,11, | 2365,12, | 2365,13, | 2365,14, | 2365,15, | 2365,16, | 2365,17, | 2365,18, | 2365,19, | 2365,20, | 2365,21, | 2365,22, | 2365,23, | 2365,24, | 2365,25, | 2365,26, | 2365,27, | 2365,28, | 2365,29, | 2365,30, | 2365,31, | 2365,32, | 2365,33, | 2365,34, | 2365,35, | 2365,36, | 2365,37, | 2365,38, | 2365,39, | 2365,40, | 2365,41, | 2365,42, | 2365,43, | 2365,44, | 2365,45, | 2365,46, | 2365,47, | 2365,48, | 2365,49, | 2365,50, | 2365,51, | 2365,52, | 2365,53, | 2365,54, | 2365,55, | 2365,56, | 2365,57, | 2365,58, | 2365,59, | 2365,60, | 2365,61, | 2365,62, | 2365,63, | 2365,64, | 2365,65, | 2365,66, | 2365,67, | 2365,68, | 2365,69, | 2365,70, | 2365,71, | 2365,72, | 2365,73, | 2365,74, | 2365,75, | 2365,76, | 2365,77, | 2365,78, | 2365,79, | 2365,80, | 2365,81, | 2365,82, | 2365,83, | 2365,84, | 2365,85, | 2366,1, | 2366,2, | 2366,3, | 2366,4, | 2366,5, | 2366,6, | 2366,7, | 2366,8, | 2366,9, | 2366,10, | 2366,11, | 2366,12, | 2366,13, | 2366,14, | 2366,15, | 2366,16, | 2366,17, | 2366,18, | 2366,19, | 2366,20, | 2366,21, | 2366,22, | 2366,23, | 2366,24, | 2366,25, | 2366,26, | 2366,27, | 2366,28, | 2366,29, | 2366,30, | 2366,31, | 2366,32, | 2366,33, | 2366,34, | 2366,35, | 2366,36, | 2366,37, | 2366,38, | 2366,39, | 2366,40, | 2366,41, | 2366,42, | 2366,43, | 2366,44, | 2366,45, | 2366,46, | 2366,47, | 2366,48, | 2366,49, | 2366,50, | 2366,51, | 2366,52, | 2366,53, | 2366,54, | 2366,55, | 2366,56, | 2366,57, | 2366,58, | 2366,59, | 2366,60, | 2366,61, | 2366,62, | 2366,63, | 2366,64, | 2366,65, | 2366,66, | 2366,67, | 2366,68, | 2366,69, | 2366,70, | 2366,71, | 2366,72, | 2366,73, | 2366,74, | 2366,75, | 2366,76, | 2366,77, | 2366,78, | 2366,79, | 2366,80, | 2366,81, | 2366,82, | 2366,83, | 2366,84, | 2366,85, | 2367,1, | 2367,2, | 2367,3, | 2367,4, | 2367,5, | 2367,6, | 2367,7, | 2367,8, | 2367,9, | 2367,10, | 2367,11, | 2367,12, | 2367,13, | 2367,14, | 2367,15, | 2367,16, | 2367,17, | 2367,18, | 2367,19, | 2367,20, | 2367,21, | 2367,22, | 2367,23, | 2367,24, | 2367,25, | 2367,26, | 2367,27, | 2367,28, | 2367,29, | 2367,30, | 2367,31, | 2367,32, | 2367,33, | 2367,34, | 2367,35, | 2367,36, | 2367,37, | 2367,38, | 2367,39, | 2367,40, | 2367,41, | 2367,42, | 2367,43, | 2367,44, | 2367,45, | 2367,46, | 2367,47, | 2367,48, | 2367,49, | 2367,50, | 2367,51, | 2367,52, | 2367,53, | 2367,54, | 2367,55, | 2367,56, | 2367,57, | 2367,58, | 2367,59, | 2367,60, | 2367,61, | 2367,62, | 2367,63, | 2367,64, | 2367,65, | 2367,66, | 2367,67, | 2367,68, | 2367,69, | 2367,70, | 2367,71, | 2367,72, | 2367,73, | 2367,74, | 2367,75, | 2367,76, | 2367,77, | 2367,78, | 2367,79, | 2367,80, | 2367,81, | 2367,82, | 2367,83, | 2367,84, | 2367,85, | 2368,1, | 2368,2, | 2368,3, | 2368,4, | 2368,5, | 2368,6, | 2368,7, | 2368,8, | 2368,9, | 2368,10, | 2368,11, | 2368,12, | 2368,13, | 2368,14, | 2368,15, | 2368,16, | 2368,17, | 2368,18, | 2368,19, | 2368,20, | 2368,21, | 2368,22, | 2368,23, | 2368,24, | 2368,25, | 2368,26, | 2368,27, | 2368,28, | 2368,29, | 2368,30, | 2368,31, | 2368,32, | 2368,33, | 2368,34, | 2368,35, | 2368,36, | 2368,37, | 2368,38, | 2368,39, | 2368,40, | 2368,41, | 2368,42, | 2368,43, | 2368,44, | 2368,45, | 2368,46, | 2368,47, | 2368,48, | 2368,49, | 2368,50, | 2368,51, | 2368,52, | 2368,53, | 2368,54, | 2368,55, | 2368,56, | 2368,57, | 2368,58, | 2368,59, | 2368,60, | 2368,61, | 2368,62, | 2368,63, | 2368,64, | 2368,65, | 2368,66, | 2368,67, | 2368,68, | 2368,69, | 2368,70, | 2368,71, | 2368,72, | 2368,73, | 2368,74, | 2368,75, | 2368,76, | 2368,77, | 2368,78, | 2368,79, | 2368,80, | 2368,81, | 2368,82, | 2368,83, | 2368,84, | 2368,85, | 2369,1, | 2369,2, | 2369,3, | 2369,4, | 2369,5, | 2369,6, | 2369,7, | 2369,8, | 2369,9, | 2369,10, | 2369,11, | 2369,12, | 2369,13, | 2369,14, | 2369,15, | 2369,16, | 2369,17, | 2369,18, | 2369,19, | 2369,20, | 2369,21, | 2369,22, | 2369,23, | 2369,24, | 2369,25, | 2369,26, | 2369,27, | 2369,28, | 2369,29, | 2369,30, | 2369,31, | 2369,32, | 2369,33, | 2369,34, | 2369,35, | 2369,36, | 2369,37, | 2369,38, | 2369,39, | 2369,40, | 2369,41, | 2369,42, | 2369,43, | 2369,44, | 2369,45, | 2369,46, | 2369,47, | 2369,48, | 2369,49, | 2369,50, | 2369,51, | 2369,52, | 2369,53, | 2369,54, | 2369,55, | 2369,56, | 2369,57, | 2369,58, | 2369,59, | 2369,60, | 2369,61, | 2369,62, | 2369,63, | 2369,64, | 2369,65, | 2369,66, | 2369,67, | 2369,68, | 2369,69, | 2369,70, | 2369,71, | 2369,72, | 2369,73, | 2369,74, | 2369,75, | 2369,76, | 2369,77, | 2369,78, | 2369,79, | 2369,80, | 2369,81, | 2369,82, | 2369,83, | 2369,84, | 2369,85, | 2370,1, | 2370,2, | 2370,3, | 2370,4, | 2370,5, | 2370,6, | 2370,7, | 2370,8, | 2370,9, | 2370,10, | 2370,11, | 2370,12, | 2370,13, | 2370,14, | 2370,15, | 2370,16, | 2370,17, | 2370,18, | 2370,19, | 2370,20, | 2370,21, | 2370,22, | 2370,23, | 2370,24, | 2370,25, | 2370,26, | 2370,27, | 2370,28, | 2370,29, | 2370,30, | 2370,31, | 2370,32, | 2370,33, | 2370,34, | 2370,35, | 2370,36, | 2370,37, | 2370,38, | 2370,39, | 2370,40, | 2370,41, | 2370,42, | 2370,43, | 2370,44, | 2370,45, | 2370,46, | 2370,47, | 2370,48, | 2370,49, | 2370,50, | 2370,51, | 2370,52, | 2370,53, | 2370,54, | 2370,55, | 2370,56, | 2370,57, | 2370,58, | 2370,59, | 2370,60, | 2370,61, | 2370,62, | 2370,63, | 2370,64, | 2370,65, | 2370,66, | 2370,67, | 2370,68, | 2370,69, | 2370,70, | 2370,71, | 2370,72, | 2370,73, | 2370,74, | 2370,75, | 2370,76, | 2370,77, | 2370,78, | 2370,79, | 2370,80, | 2370,81, | 2370,82, | 2370,83, | 2370,84, | 2370,85, | 2371,1, | 2371,2, | 2371,3, | 2371,4, | 2371,5, | 2371,6, | 2371,7, | 2371,8, | 2371,9, | 2371,10, | 2371,11, | 2371,12, | 2371,13, | 2371,14, | 2371,15, | 2371,16, | 2371,17, | 2371,18, | 2371,19, | 2371,20, | 2371,21, | 2371,22, | 2371,23, | 2371,24, | 2371,25, | 2371,26, | 2371,27, | 2371,28, | 2371,29, | 2371,30, | 2371,31, | 2371,32, | 2371,33, | 2371,34, | 2371,35, | 2371,36, | 2371,37, | 2371,38, | 2371,39, | 2371,40, | 2371,41, | 2371,42, | 2371,43, | 2371,44, | 2371,45, | 2371,46, | 2371,47, | 2371,48, | 2371,49, | 2371,50, | 2371,51, | 2371,52, | 2371,53, | 2371,54, | 2371,55, | 2371,56, | 2371,57, | 2371,58, | 2371,59, | 2371,60, | 2371,61, | 2371,62, | 2371,63, | 2371,64, | 2371,65, | 2371,66, | 2371,67, | 2371,68, | 2371,69, | 2371,70, | 2371,71, | 2371,72, | 2371,73, | 2371,74, | 2371,75, | 2371,76, | 2371,77, | 2371,78, | 2371,79, | 2371,80, | 2371,81, | 2371,82, | 2371,83, | 2371,84, | 2371,85, | 2372,1, | 2372,2, | 2372,3, | 2372,4, | 2372,5, | 2372,6, | 2372,7, | 2372,8, | 2372,9, | 2372,10, | 2372,11, | 2372,12, | 2372,13, | 2372,14, | 2372,15, | 2372,16, | 2372,17, | 2372,18, | 2372,19, | 2372,20, | 2372,21, | 2372,22, | 2372,23, | 2372,24, | 2372,25, | 2372,26, | 2372,27, | 2372,28, | 2372,29, | 2372,30, | 2372,31, | 2372,32, | 2372,33, | 2372,34, | 2372,35, | 2372,36, | 2372,37, | 2372,38, | 2372,39, | 2372,40, | 2372,41, | 2372,42, | 2372,43, | 2372,44, | 2372,45, | 2372,46, | 2372,47, | 2372,48, | 2372,49, | 2372,50, | 2372,51, | 2372,52, | 2372,53, | 2372,54, | 2372,55, | 2372,56, | 2372,57, | 2372,58, | 2372,59, | 2372,60, | 2372,61, | 2372,62, | 2372,63, | 2372,64, | 2372,65, | 2372,66, | 2372,67, | 2372,68, | 2372,69, | 2372,70, | 2372,71, | 2372,72, | 2372,73, | 2372,74, | 2372,75, | 2372,76, | 2372,77, | 2372,78, | 2372,79, | 2372,80, | 2372,81, | 2372,82, | 2372,83, | 2372,84, | 2372,85, | 2373,1, | 2373,2, | 2373,3, | 2373,4, | 2373,5, | 2373,6, | 2373,7, | 2373,8, | 2373,9, | 2373,10, | 2373,11, | 2373,12, | 2373,13, | 2373,14, | 2373,15, | 2373,16, | 2373,17, | 2373,18, | 2373,19, | 2373,20, | 2373,21, | 2373,22, | 2373,23, | 2373,24, | 2373,25, | 2373,26, | 2373,27, | 2373,28, | 2373,29, | 2373,30, | 2373,31, | 2373,32, | 2373,33, | 2373,34, | 2373,35, | 2373,36, | 2373,37, | 2373,38, | 2373,39, | 2373,40, | 2373,41, | 2373,42, | 2373,43, | 2373,44, | 2373,45, | 2373,46, | 2373,47, | 2373,48, | 2373,49, | 2373,50, | 2373,51, | 2373,52, | 2373,53, | 2373,54, | 2373,55, | 2373,56, | 2373,57, | 2373,58, | 2373,59, | 2373,60, | 2373,61, | 2373,62, | 2373,63, | 2373,64, | 2373,65, | 2373,66, | 2373,67, | 2373,68, | 2373,69, | 2373,70, | 2373,71, | 2373,72, | 2373,73, | 2373,74, | 2373,75, | 2373,76, | 2373,77, | 2373,78, | 2373,79, | 2373,80, | 2373,81, | 2373,82, | 2373,83, | 2373,84, | 2373,85, | 2374,1, | 2374,2, | 2374,3, | 2374,4, | 2374,5, | 2374,6, | 2374,7, | 2374,8, | 2374,9, | 2374,10, | 2374,11, | 2374,12, | 2374,13, | 2374,14, | 2374,15, | 2374,16, | 2374,17, | 2374,18, | 2374,19, | 2374,20, | 2374,21, | 2374,22, | 2374,23, | 2374,24, | 2374,25, | 2374,26, | 2374,27, | 2374,28, | 2374,29, | 2374,30, | 2374,31, | 2374,32, | 2374,33, | 2374,34, | 2374,35, | 2374,36, | 2374,37, | 2374,38, | 2374,39, | 2374,40, | 2374,41, | 2374,42, | 2374,43, | 2374,44, | 2374,45, | 2374,46, | 2374,47, | 2374,48, | 2374,49, | 2374,50, | 2374,51, | 2374,52, | 2374,53, | 2374,54, | 2374,55, | 2374,56, | 2374,57, | 2374,58, | 2374,59, | 2374,60, | 2374,61, | 2374,62, | 2374,63, | 2374,64, | 2374,65, | 2374,66, | 2374,67, | 2374,68, | 2374,69, | 2374,70, | 2374,71, | 2374,72, | 2374,73, | 2374,74, | 2374,75, | 2374,76, | 2374,77, | 2374,78, | 2374,79, | 2374,80, | 2374,81, | 2374,82, | 2374,83, | 2374,84, | 2374,85, | 2375,1, | 2375,2, | 2375,3, | 2375,4, | 2375,5, | 2375,6, | 2375,7, | 2375,8, | 2375,9, | 2375,10, | 2375,11, | 2375,12, | 2375,13, | 2375,14, | 2375,15, | 2375,16, | 2375,17, | 2375,18, | 2375,19, | 2375,20, | 2375,21, | 2375,22, | 2375,23, | 2375,24, | 2375,25, | 2375,26, | 2375,27, | 2375,28, | 2375,29, | 2375,30, | 2375,31, | 2375,32, | 2375,33, | 2375,34, | 2375,35, | 2375,36, | 2375,37, | 2375,38, | 2375,39, | 2375,40, | 2375,41, | 2375,42, | 2375,43, | 2375,44, | 2375,45, | 2375,46, | 2375,47, | 2375,48, | 2375,49, | 2375,50, | 2375,51, | 2375,52, | 2375,53, | 2375,54, | 2375,55, | 2375,56, | 2375,57, | 2375,58, | 2375,59, | 2375,60, | 2375,61, | 2375,62, | 2375,63, | 2375,64, | 2375,65, | 2375,66, | 2375,67, | 2375,68, | 2375,69, | 2375,70, | 2375,71, | 2375,72, | 2375,73, | 2375,74, | 2375,75, | 2375,76, | 2375,77, | 2375,78, | 2375,79, | 2375,80, | 2375,81, | 2375,82, | 2375,83, | 2375,84, | 2375,85, | 2376,1, | 2376,2, | 2376,3, | 2376,4, | 2376,5, | 2376,6, | 2376,7, | 2376,8, | 2376,9, | 2376,10, | 2376,11, | 2376,12, | 2376,13, | 2376,14, | 2376,15, | 2376,16, | 2376,17, | 2376,18, | 2376,19, | 2376,20, | 2376,21, | 2376,22, | 2376,23, | 2376,24, | 2376,25, | 2376,26, | 2376,27, | 2376,28, | 2376,29, | 2376,30, | 2376,31, | 2376,32, | 2376,33, | 2376,34, | 2376,35, | 2376,36, | 2376,37, | 2376,38, | 2376,39, | 2376,40, | 2376,41, | 2376,42, | 2376,43, | 2376,44, | 2376,45, | 2376,46, | 2376,47, | 2376,48, | 2376,49, | 2376,50, | 2376,51, | 2376,52, | 2376,53, | 2376,54, | 2376,55, | 2376,56, | 2376,57, | 2376,58, | 2376,59, | 2376,60, | 2376,61, | 2376,62, | 2376,63, | 2376,64, | 2376,65, | 2376,66, | 2376,67, | 2376,68, | 2376,69, | 2376,70, | 2376,71, | 2376,72, | 2376,73, | 2376,74, | 2376,75, | 2376,76, | 2376,77, | 2376,78, | 2376,79, | 2376,80, | 2376,81, | 2376,82, | 2376,83, | 2376,84, | 2376,85, | 2377,1, | 2377,2, | 2377,3, | 2377,4, | 2377,5, | 2377,6, | 2377,7, | 2377,8, | 2377,9, | 2377,10, | 2377,11, | 2377,12, | 2377,13, | 2377,14, | 2377,15, | 2377,16, | 2377,17, | 2377,18, | 2377,19, | 2377,20, | 2377,21, | 2377,22, | 2377,23, | 2377,24, | 2377,25, | 2377,26, | 2377,27, | 2377,28, | 2377,29, | 2377,30, | 2377,31, | 2377,32, | 2377,33, | 2377,34, | 2377,35, | 2377,36, | 2377,37, | 2377,38, | 2377,39, | 2377,40, | 2377,41, | 2377,42, | 2377,43, | 2377,44, | 2377,45, | 2377,46, | 2377,47, | 2377,48, | 2377,49, | 2377,50, | 2377,51, | 2377,52, | 2377,53, | 2377,54, | 2377,55, | 2377,56, | 2377,57, | 2377,58, | 2377,59, | 2377,60, | 2377,61, | 2377,62, | 2377,63, | 2377,64, | 2377,65, | 2377,66, | 2377,67, | 2377,68, | 2377,69, | 2377,70, | 2377,71, | 2377,72, | 2377,73, | 2377,74, | 2377,75, | 2377,76, | 2377,77, | 2377,78, | 2377,79, | 2377,80, | 2377,81, | 2377,82, | 2377,83, | 2377,84, | 2377,85, | 2378,1, | 2378,2, | 2378,3, | 2378,4, | 2378,5, | 2378,6, | 2378,7, | 2378,8, | 2378,9, | 2378,10, | 2378,11, | 2378,12, | 2378,13, | 2378,14, | 2378,15, | 2378,16, | 2378,17, | 2378,18, | 2378,19, | 2378,20, | 2378,21, | 2378,22, | 2378,23, | 2378,24, | 2378,25, | 2378,26, | 2378,27, | 2378,28, | 2378,29, | 2378,30, | 2378,31, | 2378,32, | 2378,33, | 2378,34, | 2378,35, | 2378,36, | 2378,37, | 2378,38, | 2378,39, | 2378,40, | 2378,41, | 2378,42, | 2378,43, | 2378,44, | 2378,45, | 2378,46, | 2378,47, | 2378,48, | 2378,49, | 2378,50, | 2378,51, | 2378,52, | 2378,53, | 2378,54, | 2378,55, | 2378,56, | 2378,57, | 2378,58, | 2378,59, | 2378,60, | 2378,61, | 2378,62, | 2378,63, | 2378,64, | 2378,65, | 2378,66, | 2378,67, | 2378,68, | 2378,69, | 2378,70, | 2378,71, | 2378,72, | 2378,73, | 2378,74, | 2378,75, | 2378,76, | 2378,77, | 2378,78, | 2378,79, | 2378,80, | 2378,81, | 2378,82, | 2378,83, | 2378,84, | 2378,85, | 2379,1, | 2379,2, | 2379,3, | 2379,4, | 2379,5, | 2379,6, | 2379,7, | 2379,8, | 2379,9, | 2379,10, | 2379,11, | 2379,12, | 2379,13, | 2379,14, | 2379,15, | 2379,16, | 2379,17, | 2379,18, | 2379,19, | 2379,20, | 2379,21, | 2379,22, | 2379,23, | 2379,24, | 2379,25, | 2379,26, | 2379,27, | 2379,28, | 2379,29, | 2379,30, | 2379,31, | 2379,32, | 2379,33, | 2379,34, | 2379,35, | 2379,36, | 2379,37, | 2379,38, | 2379,39, | 2379,40, | 2379,41, | 2379,42, | 2379,43, | 2379,44, | 2379,45, | 2379,46, | 2379,47, | 2379,48, | 2379,49, | 2379,50, | 2379,51, | 2379,52, | 2379,53, | 2379,54, | 2379,55, | 2379,56, | 2379,57, | 2379,58, | 2379,59, | 2379,60, | 2379,61, | 2379,62, | 2379,63, | 2379,64, | 2379,65, | 2379,66, | 2379,67, | 2379,68, | 2379,69, | 2379,70, | 2379,71, | 2379,72, | 2379,73, | 2379,74, | 2379,75, | 2379,76, | 2379,77, | 2379,78, | 2379,79, | 2379,80, | 2379,81, | 2379,82, | 2379,83, | 2379,84, | 2379,85, | 2380,1, | 2380,2, | 2380,3, | 2380,4, | 2380,5, | 2380,6, | 2380,7, | 2380,8, | 2380,9, | 2380,10, | 2380,11, | 2380,12, | 2380,13, | 2380,14, | 2380,15, | 2380,16, | 2380,17, | 2380,18, | 2380,19, | 2380,20, | 2380,21, | 2380,22, | 2380,23, | 2380,24, | 2380,25, | 2380,26, | 2380,27, | 2380,28, | 2380,29, | 2380,30, | 2380,31, | 2380,32, | 2380,33, | 2380,34, | 2380,35, | 2380,36, | 2380,37, | 2380,38, | 2380,39, | 2380,40, | 2380,41, | 2380,42, | 2380,43, | 2380,44, | 2380,45, | 2380,46, | 2380,47, | 2380,48, | 2380,49, | 2380,50, | 2380,51, | 2380,52, | 2380,53, | 2380,54, | 2380,55, | 2380,56, | 2380,57, | 2380,58, | 2380,59, | 2380,60, | 2380,61, | 2380,62, | 2380,63, | 2380,64, | 2380,65, | 2380,66, | 2380,67, | 2380,68, | 2380,69, | 2380,70, | 2380,71, | 2380,72, | 2380,73, | 2380,74, | 2380,75, | 2380,76, | 2380,77, | 2380,78, | 2380,79, | 2380,80, | 2380,81, | 2380,82, | 2380,83, | 2380,84, | 2380,85, | 2381,1, | 2381,2, | 2381,3, | 2381,4, | 2381,5, | 2381,6, | 2381,7, | 2381,8, | 2381,9, | 2381,10, | 2381,11, | 2381,12, | 2381,13, | 2381,14, | 2381,15, | 2381,16, | 2381,17, | 2381,18, | 2381,19, | 2381,20, | 2381,21, | 2381,22, | 2381,23, | 2381,24, | 2381,25, | 2381,26, | 2381,27, | 2381,28, | 2381,29, | 2381,30, | 2381,31, | 2381,32, | 2381,33, | 2381,34, | 2381,35, | 2381,36, | 2381,37, | 2381,38, | 2381,39, | 2381,40, | 2381,41, | 2381,42, | 2381,43, | 2381,44, | 2381,45, | 2381,46, | 2381,47, | 2381,48, | 2381,49, | 2381,50, | 2381,51, | 2381,52, | 2381,53, | 2381,54, | 2381,55, | 2381,56, | 2381,57, | 2381,58, | 2381,59, | 2381,60, | 2381,61, | 2381,62, | 2381,63, | 2381,64, | 2381,65, | 2381,66, | 2381,67, | 2381,68, | 2381,69, | 2381,70, | 2381,71, | 2381,72, | 2381,73, | 2381,74, | 2381,75, | 2381,76, | 2381,77, | 2381,78, | 2381,79, | 2381,80, | 2381,81, | 2381,82, | 2381,83, | 2381,84, | 2381,85, | 2382,1, | 2382,2, | 2382,3, | 2382,4, | 2382,5, | 2382,6, | 2382,7, | 2382,8, | 2382,9, | 2382,10, | 2382,11, | 2382,12, | 2382,13, | 2382,14, | 2382,15, | 2382,16, | 2382,17, | 2382,18, | 2382,19, | 2382,20, | 2382,21, | 2382,22, | 2382,23, | 2382,24, | 2382,25, | 2382,26, | 2382,27, | 2382,28, | 2382,29, | 2382,30, | 2382,31, | 2382,32, | 2382,33, | 2382,34, | 2382,35, | 2382,36, | 2382,37, | 2382,38, | 2382,39, | 2382,40, | 2382,41, | 2382,42, | 2382,43, | 2382,44, | 2382,45, | 2382,46, | 2382,47, | 2382,48, | 2382,49, | 2382,50, | 2382,51, | 2382,52, | 2382,53, | 2382,54, | 2382,55, | 2382,56, | 2382,57, | 2382,58, | 2382,59, | 2382,60, | 2382,61, | 2382,62, | 2382,63, | 2382,64, | 2382,65, | 2382,66, | 2382,67, | 2382,68, | 2382,69, | 2382,70, | 2382,71, | 2382,72, | 2382,73, | 2382,74, | 2382,75, | 2382,76, | 2382,77, | 2382,78, | 2382,79, | 2382,80, | 2382,81, | 2382,82, | 2382,83, | 2382,84, | 2382,85, | 2383,1, | 2383,2, | 2383,3, | 2383,4, | 2383,5, | 2383,6, | 2383,7, | 2383,8, | 2383,9, | 2383,10, | 2383,11, | 2383,12, | 2383,13, | 2383,14, | 2383,15, | 2383,16, | 2383,17, | 2383,18, | 2383,19, | 2383,20, | 2383,21, | 2383,22, | 2383,23, | 2383,24, | 2383,25, | 2383,26, | 2383,27, | 2383,28, | 2383,29, | 2383,30, | 2383,31, | 2383,32, | 2383,33, | 2383,34, | 2383,35, | 2383,36, | 2383,37, | 2383,38, | 2383,39, | 2383,40, | 2383,41, | 2383,42, | 2383,43, | 2383,44, | 2383,45, | 2383,46, | 2383,47, | 2383,48, | 2383,49, | 2383,50, | 2383,51, | 2383,52, | 2383,53, | 2383,54, | 2383,55, | 2383,56, | 2383,57, | 2383,58, | 2383,59, | 2383,60, | 2383,61, | 2383,62, | 2383,63, | 2383,64, | 2383,65, | 2383,66, | 2383,67, | 2383,68, | 2383,69, | 2383,70, | 2383,71, | 2383,72, | 2383,73, | 2383,74, | 2383,75, | 2383,76, | 2383,77, | 2383,78, | 2383,79, | 2383,80, | 2383,81, | 2383,82, | 2383,83, | 2383,84, | 2383,85, | 2384,1, | 2384,2, | 2384,3, | 2384,4, | 2384,5, | 2384,6, | 2384,7, | 2384,8, | 2384,9, | 2384,10, | 2384,11, | 2384,12, | 2384,13, | 2384,14, | 2384,15, | 2384,16, | 2384,17, | 2384,18, | 2384,19, | 2384,20, | 2384,21, | 2384,22, | 2384,23, | 2384,24, | 2384,25, | 2384,26, | 2384,27, | 2384,28, | 2384,29, | 2384,30, | 2384,31, | 2384,32, | 2384,33, | 2384,34, | 2384,35, | 2384,36, | 2384,37, | 2384,38, | 2384,39, | 2384,40, | 2384,41, | 2384,42, | 2384,43, | 2384,44, | 2384,45, | 2384,46, | 2384,47, | 2384,48, | 2384,49, | 2384,50, | 2384,51, | 2384,52, | 2384,53, | 2384,54, | 2384,55, | 2384,56, | 2384,57, | 2384,58, | 2384,59, | 2384,60, | 2384,61, | 2384,62, | 2384,63, | 2384,64, | 2384,65, | 2384,66, | 2384,67, | 2384,68, | 2384,69, | 2384,70, | 2384,71, | 2384,72, | 2384,73, | 2384,74, | 2384,75, | 2384,76, | 2384,77, | 2384,78, | 2384,79, | 2384,80, | 2384,81, | 2384,82, | 2384,83, | 2384,84, | 2384,85, | 2385,1, | 2385,2, | 2385,3, | 2385,4, | 2385,5, | 2385,6, | 2385,7, | 2385,8, | 2385,9, | 2385,10, | 2385,11, | 2385,12, | 2385,13, | 2385,14, | 2385,15, | 2385,16, | 2385,17, | 2385,18, | 2385,19, | 2385,20, | 2385,21, | 2385,22, | 2385,23, | 2385,24, | 2385,25, | 2385,26, | 2385,27, | 2385,28, | 2385,29, | 2385,30, | 2385,31, | 2385,32, | 2385,33, | 2385,34, | 2385,35, | 2385,36, | 2385,37, | 2385,38, | 2385,39, | 2385,40, | 2385,41, | 2385,42, | 2385,43, | 2385,44, | 2385,45, | 2385,46, | 2385,47, | 2385,48, | 2385,49, | 2385,50, | 2385,51, | 2385,52, | 2385,53, | 2385,54, | 2385,55, | 2385,56, | 2385,57, | 2385,58, | 2385,59, | 2385,60, | 2385,61, | 2385,62, | 2385,63, | 2385,64, | 2385,65, | 2385,66, | 2385,67, | 2385,68, | 2385,69, | 2385,70, | 2385,71, | 2385,72, | 2385,73, | 2385,74, | 2385,75, | 2385,76, | 2385,77, | 2385,78, | 2385,79, | 2385,80, | 2385,81, | 2385,82, | 2385,83, | 2385,84, | 2385,85, | 2386,1, | 2386,2, | 2386,3, | 2386,4, | 2386,5, | 2386,6, | 2386,7, | 2386,8, | 2386,9, | 2386,10, | 2386,11, | 2386,12, | 2386,13, | 2386,14, | 2386,15, | 2386,16, | 2386,17, | 2386,18, | 2386,19, | 2386,20, | 2386,21, | 2386,22, | 2386,23, | 2386,24, | 2386,25, | 2386,26, | 2386,27, | 2386,28, | 2386,29, | 2386,30, | 2386,31, | 2386,32, | 2386,33, | 2386,34, | 2386,35, | 2386,36, | 2386,37, | 2386,38, | 2386,39, | 2386,40, | 2386,41, | 2386,42, | 2386,43, | 2386,44, | 2386,45, | 2386,46, | 2386,47, | 2386,48, | 2386,49, | 2386,50, | 2386,51, | 2386,52, | 2386,53, | 2386,54, | 2386,55, | 2386,56, | 2386,57, | 2386,58, | 2386,59, | 2386,60, | 2386,61, | 2386,62, | 2386,63, | 2386,64, | 2386,65, | 2386,66, | 2386,67, | 2386,68, | 2386,69, | 2386,70, | 2386,71, | 2386,72, | 2386,73, | 2386,74, | 2386,75, | 2386,76, | 2386,77, | 2386,78, | 2386,79, | 2386,80, | 2386,81, | 2386,82, | 2386,83, | 2386,84, | 2386,85, | 2387,1, | 2387,2, | 2387,3, | 2387,4, | 2387,5, | 2387,6, | 2387,7, | 2387,8, | 2387,9, | 2387,10, | 2387,11, | 2387,12, | 2387,13, | 2387,14, | 2387,15, | 2387,16, | 2387,17, | 2387,18, | 2387,19, | 2387,20, | 2387,21, | 2387,22, | 2387,23, | 2387,24, | 2387,25, | 2387,26, | 2387,27, | 2387,28, | 2387,29, | 2387,30, | 2387,31, | 2387,32, | 2387,33, | 2387,34, | 2387,35, | 2387,36, | 2387,37, | 2387,38, | 2387,39, | 2387,40, | 2387,41, | 2387,42, | 2387,43, | 2387,44, | 2387,45, | 2387,46, | 2387,47, | 2387,48, | 2387,49, | 2387,50, | 2387,51, | 2387,52, | 2387,53, | 2387,54, | 2387,55, | 2387,56, | 2387,57, | 2387,58, | 2387,59, | 2387,60, | 2387,61, | 2387,62, | 2387,63, | 2387,64, | 2387,65, | 2387,66, | 2387,67, | 2387,68, | 2387,69, | 2387,70, | 2387,71, | 2387,72, | 2387,73, | 2387,74, | 2387,75, | 2387,76, | 2387,77, | 2387,78, | 2387,79, | 2387,80, | 2387,81, | 2387,82, | 2387,83, | 2387,84, | 2387,85, | 2388,1, | 2388,2, | 2388,3, | 2388,4, | 2388,5, | 2388,6, | 2388,7, | 2388,8, | 2388,9, | 2388,10, | 2388,11, | 2388,12, | 2388,13, | 2388,14, | 2388,15, | 2388,16, | 2388,17, | 2388,18, | 2388,19, | 2388,20, | 2388,21, | 2388,22, | 2388,23, | 2388,24, | 2388,25, | 2388,26, | 2388,27, | 2388,28, | 2388,29, | 2388,30, | 2388,31, | 2388,32, | 2388,33, | 2388,34, | 2388,35, | 2388,36, | 2388,37, | 2388,38, | 2388,39, | 2388,40, | 2388,41, | 2388,42, | 2388,43, | 2388,44, | 2388,45, | 2388,46, | 2388,47, | 2388,48, | 2388,49, | 2388,50, | 2388,51, | 2388,52, | 2388,53, | 2388,54, | 2388,55, | 2388,56, | 2388,57, | 2388,58, | 2388,59, | 2388,60, | 2388,61, | 2388,62, | 2388,63, | 2388,64, | 2388,65, | 2388,66, | 2388,67, | 2388,68, | 2388,69, | 2388,70, | 2388,71, | 2388,72, | 2388,73, | 2388,74, | 2388,75, | 2388,76, | 2388,77, | 2388,78, | 2388,79, | 2388,80, | 2388,81, | 2388,82, | 2388,83, | 2388,84, | 2388,85, | 2389,1, | 2389,2, | 2389,3, | 2389,4, | 2389,5, | 2389,6, | 2389,7, | 2389,8, | 2389,9, | 2389,10, | 2389,11, | 2389,12, | 2389,13, | 2389,14, | 2389,15, | 2389,16, | 2389,17, | 2389,18, | 2389,19, | 2389,20, | 2389,21, | 2389,22, | 2389,23, | 2389,24, | 2389,25, | 2389,26, | 2389,27, | 2389,28, | 2389,29, | 2389,30, | 2389,31, | 2389,32, | 2389,33, | 2389,34, | 2389,35, | 2389,36, | 2389,37, | 2389,38, | 2389,39, | 2389,40, | 2389,41, | 2389,42, | 2389,43, | 2389,44, | 2389,45, | 2389,46, | 2389,47, | 2389,48, | 2389,49, | 2389,50, | 2389,51, | 2389,52, | 2389,53, | 2389,54, | 2389,55, | 2389,56, | 2389,57, | 2389,58, | 2389,59, | 2389,60, | 2389,61, | 2389,62, | 2389,63, | 2389,64, | 2389,65, | 2389,66, | 2389,67, | 2389,68, | 2389,69, | 2389,70, | 2389,71, | 2389,72, | 2389,73, | 2389,74, | 2389,75, | 2389,76, | 2389,77, | 2389,78, | 2389,79, | 2389,80, | 2389,81, | 2389,82, | 2389,83, | 2389,84, | 2389,85, | 2390,1, | 2390,2, | 2390,3, | 2390,4, | 2390,5, | 2390,6, | 2390,7, | 2390,8, | 2390,9, | 2390,10, | 2390,11, | 2390,12, | 2390,13, | 2390,14, | 2390,15, | 2390,16, | 2390,17, | 2390,18, | 2390,19, | 2390,20, | 2390,21, | 2390,22, | 2390,23, | 2390,24, | 2390,25, | 2390,26, | 2390,27, | 2390,28, | 2390,29, | 2390,30, | 2390,31, | 2390,32, | 2390,33, | 2390,34, | 2390,35, | 2390,36, | 2390,37, | 2390,38, | 2390,39, | 2390,40, | 2390,41, | 2390,42, | 2390,43, | 2390,44, | 2390,45, | 2390,46, | 2390,47, | 2390,48, | 2390,49, | 2390,50, | 2390,51, | 2390,52, | 2390,53, | 2390,54, | 2390,55, | 2390,56, | 2390,57, | 2390,58, | 2390,59, | 2390,60, | 2390,61, | 2390,62, | 2390,63, | 2390,64, | 2390,65, | 2390,66, | 2390,67, | 2390,68, | 2390,69, | 2390,70, | 2390,71, | 2390,72, | 2390,73, | 2390,74, | 2390,75, | 2390,76, | 2390,77, | 2390,78, | 2390,79, | 2390,80, | 2390,81, | 2390,82, | 2390,83, | 2390,84, | 2390,85, | 2391,1, | 2391,2, | 2391,3, | 2391,4, | 2391,5, | 2391,6, | 2391,7, | 2391,8, | 2391,9, | 2391,10, | 2391,11, | 2391,12, | 2391,13, | 2391,14, | 2391,15, | 2391,16, | 2391,17, | 2391,18, | 2391,19, | 2391,20, | 2391,21, | 2391,22, | 2391,23, | 2391,24, | 2391,25, | 2391,26, | 2391,27, | 2391,28, | 2391,29, | 2391,30, | 2391,31, | 2391,32, | 2391,33, | 2391,34, | 2391,35, | 2391,36, | 2391,37, | 2391,38, | 2391,39, | 2391,40, | 2391,41, | 2391,42, | 2391,43, | 2391,44, | 2391,45, | 2391,46, | 2391,47, | 2391,48, | 2391,49, | 2391,50, | 2391,51, | 2391,52, | 2391,53, | 2391,54, | 2391,55, | 2391,56, | 2391,57, | 2391,58, | 2391,59, | 2391,60, | 2391,61, | 2391,62, | 2391,63, | 2391,64, | 2391,65, | 2391,66, | 2391,67, | 2391,68, | 2391,69, | 2391,70, | 2391,71, | 2391,72, | 2391,73, | 2391,74, | 2391,75, | 2391,76, | 2391,77, | 2391,78, | 2391,79, | 2391,80, | 2391,81, | 2391,82, | 2391,83, | 2391,84, | 2391,85, | 2392,1, | 2392,2, | 2392,3, | 2392,4, | 2392,5, | 2392,6, | 2392,7, | 2392,8, | 2392,9, | 2392,10, | 2392,11, | 2392,12, | 2392,13, | 2392,14, | 2392,15, | 2392,16, | 2392,17, | 2392,18, | 2392,19, | 2392,20, | 2392,21, | 2392,22, | 2392,23, | 2392,24, | 2392,25, | 2392,26, | 2392,27, | 2392,28, | 2392,29, | 2392,30, | 2392,31, | 2392,32, | 2392,33, | 2392,34, | 2392,35, | 2392,36, | 2392,37, | 2392,38, | 2392,39, | 2392,40, | 2392,41, | 2392,42, | 2392,43, | 2392,44, | 2392,45, | 2392,46, | 2392,47, | 2392,48, | 2392,49, | 2392,50, | 2392,51, | 2392,52, | 2392,53, | 2392,54, | 2392,55, | 2392,56, | 2392,57, | 2392,58, | 2392,59, | 2392,60, | 2392,61, | 2392,62, | 2392,63, | 2392,64, | 2392,65, | 2392,66, | 2392,67, | 2392,68, | 2392,69, | 2392,70, | 2392,71, | 2392,72, | 2392,73, | 2392,74, | 2392,75, | 2392,76, | 2392,77, | 2392,78, | 2392,79, | 2392,80, | 2392,81, | 2392,82, | 2392,83, | 2392,84, | 2392,85, | 2393,1, | 2393,2, | 2393,3, | 2393,4, | 2393,5, | 2393,6, | 2393,7, | 2393,8, | 2393,9, | 2393,10, | 2393,11, | 2393,12, | 2393,13, | 2393,14, | 2393,15, | 2393,16, | 2393,17, | 2393,18, | 2393,19, | 2393,20, | 2393,21, | 2393,22, | 2393,23, | 2393,24, | 2393,25, | 2393,26, | 2393,27, | 2393,28, | 2393,29, | 2393,30, | 2393,31, | 2393,32, | 2393,33, | 2393,34, | 2393,35, | 2393,36, | 2393,37, | 2393,38, | 2393,39, | 2393,40, | 2393,41, | 2393,42, | 2393,43, | 2393,44, | 2393,45, | 2393,46, | 2393,47, | 2393,48, | 2393,49, | 2393,50, | 2393,51, | 2393,52, | 2393,53, | 2393,54, | 2393,55, | 2393,56, | 2393,57, | 2393,58, | 2393,59, | 2393,60, | 2393,61, | 2393,62, | 2393,63, | 2393,64, | 2393,65, | 2393,66, | 2393,67, | 2393,68, | 2393,69, | 2393,70, | 2393,71, | 2393,72, | 2393,73, | 2393,74, | 2393,75, | 2393,76, | 2393,77, | 2393,78, | 2393,79, | 2393,80, | 2393,81, | 2393,82, | 2393,83, | 2393,84, | 2393,85, | 2394,1, | 2394,2, | 2394,3, | 2394,4, | 2394,5, | 2394,6, | 2394,7, | 2394,8, | 2394,9, | 2394,10, | 2394,11, | 2394,12, | 2394,13, | 2394,14, | 2394,15, | 2394,16, | 2394,17, | 2394,18, | 2394,19, | 2394,20, | 2394,21, | 2394,22, | 2394,23, | 2394,24, | 2394,25, | 2394,26, | 2394,27, | 2394,28, | 2394,29, | 2394,30, | 2394,31, | 2394,32, | 2394,33, | 2394,34, | 2394,35, | 2394,36, | 2394,37, | 2394,38, | 2394,39, | 2394,40, | 2394,41, | 2394,42, | 2394,43, | 2394,44, | 2394,45, | 2394,46, | 2394,47, | 2394,48, | 2394,49, | 2394,50, | 2394,51, | 2394,52, | 2394,53, | 2394,54, | 2394,55, | 2394,56, | 2394,57, | 2394,58, | 2394,59, | 2394,60, | 2394,61, | 2394,62, | 2394,63, | 2394,64, | 2394,65, | 2394,66, | 2394,67, | 2394,68, | 2394,69, | 2394,70, | 2394,71, | 2394,72, | 2394,73, | 2394,74, | 2394,75, | 2394,76, | 2394,77, | 2394,78, | 2394,79, | 2394,80, | 2394,81, | 2394,82, | 2394,83, | 2394,84, | 2394,85, | 2395,1, | 2395,2, | 2395,3, | 2395,4, | 2395,5, | 2395,6, | 2395,7, | 2395,8, | 2395,9, | 2395,10, | 2395,11, | 2395,12, | 2395,13, | 2395,14, | 2395,15, | 2395,16, | 2395,17, | 2395,18, | 2395,19, | 2395,20, | 2395,21, | 2395,22, | 2395,23, | 2395,24, | 2395,25, | 2395,26, | 2395,27, | 2395,28, | 2395,29, | 2395,30, | 2395,31, | 2395,32, | 2395,33, | 2395,34, | 2395,35, | 2395,36, | 2395,37, | 2395,38, | 2395,39, | 2395,40, | 2395,41, | 2395,42, | 2395,43, | 2395,44, | 2395,45, | 2395,46, | 2395,47, | 2395,48, | 2395,49, | 2395,50, | 2395,51, | 2395,52, | 2395,53, | 2395,54, | 2395,55, | 2395,56, | 2395,57, | 2395,58, | 2395,59, | 2395,60, | 2395,61, | 2395,62, | 2395,63, | 2395,64, | 2395,65, | 2395,66, | 2395,67, | 2395,68, | 2395,69, | 2395,70, | 2395,71, | 2395,72, | 2395,73, | 2395,74, | 2395,75, | 2395,76, | 2395,77, | 2395,78, | 2395,79, | 2395,80, | 2395,81, | 2395,82, | 2395,83, | 2395,84, | 2395,85, | 2396,1, | 2396,2, | 2396,3, | 2396,4, | 2396,5, | 2396,6, | 2396,7, | 2396,8, | 2396,9, | 2396,10, | 2396,11, | 2396,12, | 2396,13, | 2396,14, | 2396,15, | 2396,16, | 2396,17, | 2396,18, | 2396,19, | 2396,20, | 2396,21, | 2396,22, | 2396,23, | 2396,24, | 2396,25, | 2396,26, | 2396,27, | 2396,28, | 2396,29, | 2396,30, | 2396,31, | 2396,32, | 2396,33, | 2396,34, | 2396,35, | 2396,36, | 2396,37, | 2396,38, | 2396,39, | 2396,40, | 2396,41, | 2396,42, | 2396,43, | 2396,44, | 2396,45, | 2396,46, | 2396,47, | 2396,48, | 2396,49, | 2396,50, | 2396,51, | 2396,52, | 2396,53, | 2396,54, | 2396,55, | 2396,56, | 2396,57, | 2396,58, | 2396,59, | 2396,60, | 2396,61, | 2396,62, | 2396,63, | 2396,64, | 2396,65, | 2396,66, | 2396,67, | 2396,68, | 2396,69, | 2396,70, | 2396,71, | 2396,72, | 2396,73, | 2396,74, | 2396,75, | 2396,76, | 2396,77, | 2396,78, | 2396,79, | 2396,80, | 2396,81, | 2396,82, | 2396,83, | 2396,84, | 2396,85, | 2397,1, | 2397,2, | 2397,3, | 2397,4, | 2397,5, | 2397,6, | 2397,7, | 2397,8, | 2397,9, | 2397,10, | 2397,11, | 2397,12, | 2397,13, | 2397,14, | 2397,15, | 2397,16, | 2397,17, | 2397,18, | 2397,19, | 2397,20, | 2397,21, | 2397,22, | 2397,23, | 2397,24, | 2397,25, | 2397,26, | 2397,27, | 2397,28, | 2397,29, | 2397,30, | 2397,31, | 2397,32, | 2397,33, | 2397,34, | 2397,35, | 2397,36, | 2397,37, | 2397,38, | 2397,39, | 2397,40, | 2397,41, | 2397,42, | 2397,43, | 2397,44, | 2397,45, | 2397,46, | 2397,47, | 2397,48, | 2397,49, | 2397,50, | 2397,51, | 2397,52, | 2397,53, | 2397,54, | 2397,55, | 2397,56, | 2397,57, | 2397,58, | 2397,59, | 2397,60, | 2397,61, | 2397,62, | 2397,63, | 2397,64, | 2397,65, | 2397,66, | 2397,67, | 2397,68, | 2397,69, | 2397,70, | 2397,71, | 2397,72, | 2397,73, | 2397,74, | 2397,75, | 2397,76, | 2397,77, | 2397,78, | 2397,79, | 2397,80, | 2397,81, | 2397,82, | 2397,83, | 2397,84, | 2397,85, | 2398,1, | 2398,2, | 2398,3, | 2398,4, | 2398,5, | 2398,6, | 2398,7, | 2398,8, | 2398,9, | 2398,10, | 2398,11, | 2398,12, | 2398,13, | 2398,14, | 2398,15, | 2398,16, | 2398,17, | 2398,18, | 2398,19, | 2398,20, | 2398,21, | 2398,22, | 2398,23, | 2398,24, | 2398,25, | 2398,26, | 2398,27, | 2398,28, | 2398,29, | 2398,30, | 2398,31, | 2398,32, | 2398,33, | 2398,34, | 2398,35, | 2398,36, | 2398,37, | 2398,38, | 2398,39, | 2398,40, | 2398,41, | 2398,42, | 2398,43, | 2398,44, | 2398,45, | 2398,46, | 2398,47, | 2398,48, | 2398,49, | 2398,50, | 2398,51, | 2398,52, | 2398,53, | 2398,54, | 2398,55, | 2398,56, | 2398,57, | 2398,58, | 2398,59, | 2398,60, | 2398,61, | 2398,62, | 2398,63, | 2398,64, | 2398,65, | 2398,66, | 2398,67, | 2398,68, | 2398,69, | 2398,70, | 2398,71, | 2398,72, | 2398,73, | 2398,74, | 2398,75, | 2398,76, | 2398,77, | 2398,78, | 2398,79, | 2398,80, | 2398,81, | 2398,82, | 2398,83, | 2398,84, | 2398,85, | 2399,1, | 2399,2, | 2399,3, | 2399,4, | 2399,5, | 2399,6, | 2399,7, | 2399,8, | 2399,9, | 2399,10, | 2399,11, | 2399,12, | 2399,13, | 2399,14, | 2399,15, | 2399,16, | 2399,17, | 2399,18, | 2399,19, | 2399,20, | 2399,21, | 2399,22, | 2399,23, | 2399,24, | 2399,25, | 2399,26, | 2399,27, | 2399,28, | 2399,29, | 2399,30, | 2399,31, | 2399,32, | 2399,33, | 2399,34, | 2399,35, | 2399,36, | 2399,37, | 2399,38, | 2399,39, | 2399,40, | 2399,41, | 2399,42, | 2399,43, | 2399,44, | 2399,45, | 2399,46, | 2399,47, | 2399,48, | 2399,49, | 2399,50, | 2399,51, | 2399,52, | 2399,53, | 2399,54, | 2399,55, | 2399,56, | 2399,57, | 2399,58, | 2399,59, | 2399,60, | 2399,61, | 2399,62, | 2399,63, | 2399,64, | 2399,65, | 2399,66, | 2399,67, | 2399,68, | 2399,69, | 2399,70, | 2399,71, | 2399,72, | 2399,73, | 2399,74, | 2399,75, | 2399,76, | 2399,77, | 2399,78, | 2399,79, | 2399,80, | 2399,81, | 2399,82, | 2399,83, | 2399,84, | 2399,85, | 2400,1, | 2400,2, | 2400,3, | 2400,4, | 2400,5, | 2400,6, | 2400,7, | 2400,8, | 2400,9, | 2400,10, | 2400,11, | 2400,12, | 2400,13, | 2400,14, | 2400,15, | 2400,16, | 2400,17, | 2400,18, | 2400,19, | 2400,20, | 2400,21, | 2400,22, | 2400,23, | 2400,24, | 2400,25, | 2400,26, | 2400,27, | 2400,28, | 2400,29, | 2400,30, | 2400,31, | 2400,32, | 2400,33, | 2400,34, | 2400,35, | 2400,36, | 2400,37, | 2400,38, | 2400,39, | 2400,40, | 2400,41, | 2400,42, | 2400,43, | 2400,44, | 2400,45, | 2400,46, | 2400,47, | 2400,48, | 2400,49, | 2400,50, | 2400,51, | 2400,52, | 2400,53, | 2400,54, | 2400,55, | 2400,56, | 2400,57, | 2400,58, | 2400,59, | 2400,60, | 2400,61, | 2400,62, | 2400,63, | 2400,64, | 2400,65, | 2400,66, | 2400,67, | 2400,68, | 2400,69, | 2400,70, | 2400,71, | 2400,72, | 2400,73, | 2400,74, | 2400,75, | 2400,76, | 2400,77, | 2400,78, | 2400,79, | 2400,80, | 2400,81, | 2400,82, | 2400,83, | 2400,84, | 2400,85, | 2401,1, | 2401,2, | 2401,3, | 2401,4, | 2401,5, | 2401,6, | 2401,7, | 2401,8, | 2401,9, | 2401,10, | 2401,11, | 2401,12, | 2401,13, | 2401,14, | 2401,15, | 2401,16, | 2401,17, | 2401,18, | 2401,19, | 2401,20, | 2401,21, | 2401,22, | 2401,23, | 2401,24, | 2401,25, | 2401,26, | 2401,27, | 2401,28, | 2401,29, | 2401,30, | 2401,31, | 2401,32, | 2401,33, | 2401,34, | 2401,35, | 2401,36, | 2401,37, | 2401,38, | 2401,39, | 2401,40, | 2401,41, | 2401,42, | 2401,43, | 2401,44, | 2401,45, | 2401,46, | 2401,47, | 2401,48, | 2401,49, | 2401,50, | 2401,51, | 2401,52, | 2401,53, | 2401,54, | 2401,55, | 2401,56, | 2401,57, | 2401,58, | 2401,59, | 2401,60, | 2401,61, | 2401,62, | 2401,63, | 2401,64, | 2401,65, | 2401,66, | 2401,67, | 2401,68, | 2401,69, | 2401,70, | 2401,71, | 2401,72, | 2401,73, | 2401,74, | 2401,75, | 2401,76, | 2401,77, | 2401,78, | 2401,79, | 2401,80, | 2401,81, | 2401,82, | 2401,83, | 2401,84, | 2401,85, | 2402,1, | 2402,2, | 2402,3, | 2402,4, | 2402,5, | 2402,6, | 2402,7, | 2402,8, | 2402,9, | 2402,10, | 2402,11, | 2402,12, | 2402,13, | 2402,14, | 2402,15, | 2402,16, | 2402,17, | 2402,18, | 2402,19, | 2402,20, | 2402,21, | 2402,22, | 2402,23, | 2402,24, | 2402,25, | 2402,26, | 2402,27, | 2402,28, | 2402,29, | 2402,30, | 2402,31, | 2402,32, | 2402,33, | 2402,34, | 2402,35, | 2402,36, | 2402,37, | 2402,38, | 2402,39, | 2402,40, | 2402,41, | 2402,42, | 2402,43, | 2402,44, | 2402,45, | 2402,46, | 2402,47, | 2402,48, | 2402,49, | 2402,50, | 2402,51, | 2402,52, | 2402,53, | 2402,54, | 2402,55, | 2402,56, | 2402,57, | 2402,58, | 2402,59, | 2402,60, | 2402,61, | 2402,62, | 2402,63, | 2402,64, | 2402,65, | 2402,66, | 2402,67, | 2402,68, | 2402,69, | 2402,70, | 2402,71, | 2402,72, | 2402,73, | 2402,74, | 2402,75, | 2402,76, | 2402,77, | 2402,78, | 2402,79, | 2402,80, | 2402,81, | 2402,82, | 2402,83, | 2402,84, | 2402,85, | 2403,1, | 2403,2, | 2403,3, | 2403,4, | 2403,5, | 2403,6, | 2403,7, | 2403,8, | 2403,9, | 2403,10, | 2403,11, | 2403,12, | 2403,13, | 2403,14, | 2403,15, | 2403,16, | 2403,17, | 2403,18, | 2403,19, | 2403,20, | 2403,21, | 2403,22, | 2403,23, | 2403,24, | 2403,25, | 2403,26, | 2403,27, | 2403,28, | 2403,29, | 2403,30, | 2403,31, | 2403,32, | 2403,33, | 2403,34, | 2403,35, | 2403,36, | 2403,37, | 2403,38, | 2403,39, | 2403,40, | 2403,41, | 2403,42, | 2403,43, | 2403,44, | 2403,45, | 2403,46, | 2403,47, | 2403,48, | 2403,49, | 2403,50, | 2403,51, | 2403,52, | 2403,53, | 2403,54, | 2403,55, | 2403,56, | 2403,57, | 2403,58, | 2403,59, | 2403,60, | 2403,61, | 2403,62, | 2403,63, | 2403,64, | 2403,65, | 2403,66, | 2403,67, | 2403,68, | 2403,69, | 2403,70, | 2403,71, | 2403,72, | 2403,73, | 2403,74, | 2403,75, | 2403,76, | 2403,77, | 2403,78, | 2403,79, | 2403,80, | 2403,81, | 2403,82, | 2403,83, | 2403,84, | 2403,85, | 2404,1, | 2404,2, | 2404,3, | 2404,4, | 2404,5, | 2404,6, | 2404,7, | 2404,8, | 2404,9, | 2404,10, | 2404,11, | 2404,12, | 2404,13, | 2404,14, | 2404,15, | 2404,16, | 2404,17, | 2404,18, | 2404,19, | 2404,20, | 2404,21, | 2404,22, | 2404,23, | 2404,24, | 2404,25, | 2404,26, | 2404,27, | 2404,28, | 2404,29, | 2404,30, | 2404,31, | 2404,32, | 2404,33, | 2404,34, | 2404,35, | 2404,36, | 2404,37, | 2404,38, | 2404,39, | 2404,40, | 2404,41, | 2404,42, | 2404,43, | 2404,44, | 2404,45, | 2404,46, | 2404,47, | 2404,48, | 2404,49, | 2404,50, | 2404,51, | 2404,52, | 2404,53, | 2404,54, | 2404,55, | 2404,56, | 2404,57, | 2404,58, | 2404,59, | 2404,60, | 2404,61, | 2404,62, | 2404,63, | 2404,64, | 2404,65, | 2404,66, | 2404,67, | 2404,68, | 2404,69, | 2404,70, | 2404,71, | 2404,72, | 2404,73, | 2404,74, | 2404,75, | 2404,76, | 2404,77, | 2404,78, | 2404,79, | 2404,80, | 2404,81, | 2404,82, | 2404,83, | 2404,84, | 2404,85, | 2405,1, | 2405,2, | 2405,3, | 2405,4, | 2405,5, | 2405,6, | 2405,7, | 2405,8, | 2405,9, | 2405,10, | 2405,11, | 2405,12, | 2405,13, | 2405,14, | 2405,15, | 2405,16, | 2405,17, | 2405,18, | 2405,19, | 2405,20, | 2405,21, | 2405,22, | 2405,23, | 2405,24, | 2405,25, | 2405,26, | 2405,27, | 2405,28, | 2405,29, | 2405,30, | 2405,31, | 2405,32, | 2405,33, | 2405,34, | 2405,35, | 2405,36, | 2405,37, | 2405,38, | 2405,39, | 2405,40, | 2405,41, | 2405,42, | 2405,43, | 2405,44, | 2405,45, | 2405,46, | 2405,47, | 2405,48, | 2405,49, | 2405,50, | 2405,51, | 2405,52, | 2405,53, | 2405,54, | 2405,55, | 2405,56, | 2405,57, | 2405,58, | 2405,59, | 2405,60, | 2405,61, | 2405,62, | 2405,63, | 2405,64, | 2405,65, | 2405,66, | 2405,67, | 2405,68, | 2405,69, | 2405,70, | 2405,71, | 2405,72, | 2405,73, | 2405,74, | 2405,75, | 2405,76, | 2405,77, | 2405,78, | 2405,79, | 2405,80, | 2405,81, | 2405,82, | 2405,83, | 2405,84, | 2405,85, | 2406,1, | 2406,2, | 2406,3, | 2406,4, | 2406,5, | 2406,6, | 2406,7, | 2406,8, | 2406,9, | 2406,10, | 2406,11, | 2406,12, | 2406,13, | 2406,14, | 2406,15, | 2406,16, | 2406,17, | 2406,18, | 2406,19, | 2406,20, | 2406,21, | 2406,22, | 2406,23, | 2406,24, | 2406,25, | 2406,26, | 2406,27, | 2406,28, | 2406,29, | 2406,30, | 2406,31, | 2406,32, | 2406,33, | 2406,34, | 2406,35, | 2406,36, | 2406,37, | 2406,38, | 2406,39, | 2406,40, | 2406,41, | 2406,42, | 2406,43, | 2406,44, | 2406,45, | 2406,46, | 2406,47, | 2406,48, | 2406,49, | 2406,50, | 2406,51, | 2406,52, | 2406,53, | 2406,54, | 2406,55, | 2406,56, | 2406,57, | 2406,58, | 2406,59, | 2406,60, | 2406,61, | 2406,62, | 2406,63, | 2406,64, | 2406,65, | 2406,66, | 2406,67, | 2406,68, | 2406,69, | 2406,70, | 2406,71, | 2406,72, | 2406,73, | 2406,74, | 2406,75, | 2406,76, | 2406,77, | 2406,78, | 2406,79, | 2406,80, | 2406,81, | 2406,82, | 2406,83, | 2406,84, | 2406,85, | 2407,1, | 2407,2, | 2407,3, | 2407,4, | 2407,5, | 2407,6, | 2407,7, | 2407,8, | 2407,9, | 2407,10, | 2407,11, | 2407,12, | 2407,13, | 2407,14, | 2407,15, | 2407,16, | 2407,17, | 2407,18, | 2407,19, | 2407,20, | 2407,21, | 2407,22, | 2407,23, | 2407,24, | 2407,25, | 2407,26, | 2407,27, | 2407,28, | 2407,29, | 2407,30, | 2407,31, | 2407,32, | 2407,33, | 2407,34, | 2407,35, | 2407,36, | 2407,37, | 2407,38, | 2407,39, | 2407,40, | 2407,41, | 2407,42, | 2407,43, | 2407,44, | 2407,45, | 2407,46, | 2407,47, | 2407,48, | 2407,49, | 2407,50, | 2407,51, | 2407,52, | 2407,53, | 2407,54, | 2407,55, | 2407,56, | 2407,57, | 2407,58, | 2407,59, | 2407,60, | 2407,61, | 2407,62, | 2407,63, | 2407,64, | 2407,65, | 2407,66, | 2407,67, | 2407,68, | 2407,69, | 2407,70, | 2407,71, | 2407,72, | 2407,73, | 2407,74, | 2407,75, | 2407,76, | 2407,77, | 2407,78, | 2407,79, | 2407,80, | 2407,81, | 2407,82, | 2407,83, | 2407,84, | 2407,85, | 2408,1, | 2408,2, | 2408,3, | 2408,4, | 2408,5, | 2408,6, | 2408,7, | 2408,8, | 2408,9, | 2408,10, | 2408,11, | 2408,12, | 2408,13, | 2408,14, | 2408,15, | 2408,16, | 2408,17, | 2408,18, | 2408,19, | 2408,20, | 2408,21, | 2408,22, | 2408,23, | 2408,24, | 2408,25, | 2408,26, | 2408,27, | 2408,28, | 2408,29, | 2408,30, | 2408,31, | 2408,32, | 2408,33, | 2408,34, | 2408,35, | 2408,36, | 2408,37, | 2408,38, | 2408,39, | 2408,40, | 2408,41, | 2408,42, | 2408,43, | 2408,44, | 2408,45, | 2408,46, | 2408,47, | 2408,48, | 2408,49, | 2408,50, | 2408,51, | 2408,52, | 2408,53, | 2408,54, | 2408,55, | 2408,56, | 2408,57, | 2408,58, | 2408,59, | 2408,60, | 2408,61, | 2408,62, | 2408,63, | 2408,64, | 2408,65, | 2408,66, | 2408,67, | 2408,68, | 2408,69, | 2408,70, | 2408,71, | 2408,72, | 2408,73, | 2408,74, | 2408,75, | 2408,76, | 2408,77, | 2408,78, | 2408,79, | 2408,80, | 2408,81, | 2408,82, | 2408,83, | 2408,84, | 2408,85, | 2409,1, | 2409,2, | 2409,3, | 2409,4, | 2409,5, | 2409,6, | 2409,7, | 2409,8, | 2409,9, | 2409,10, | 2409,11, | 2409,12, | 2409,13, | 2409,14, | 2409,15, | 2409,16, | 2409,17, | 2409,18, | 2409,19, | 2409,20, | 2409,21, | 2409,22, | 2409,23, | 2409,24, | 2409,25, | 2409,26, | 2409,27, | 2409,28, | 2409,29, | 2409,30, | 2409,31, | 2409,32, | 2409,33, | 2409,34, | 2409,35, | 2409,36, | 2409,37, | 2409,38, | 2409,39, | 2409,40, | 2409,41, | 2409,42, | 2409,43, | 2409,44, | 2409,45, | 2409,46, | 2409,47, | 2409,48, | 2409,49, | 2409,50, | 2409,51, | 2409,52, | 2409,53, | 2409,54, | 2409,55, | 2409,56, | 2409,57, | 2409,58, | 2409,59, | 2409,60, | 2409,61, | 2409,62, | 2409,63, | 2409,64, | 2409,65, | 2409,66, | 2409,67, | 2409,68, | 2409,69, | 2409,70, | 2409,71, | 2409,72, | 2409,73, | 2409,74, | 2409,75, | 2409,76, | 2409,77, | 2409,78, | 2409,79, | 2409,80, | 2409,81, | 2409,82, | 2409,83, | 2409,84, | 2409,85, | 2410,1, | 2410,2, | 2410,3, | 2410,4, | 2410,5, | 2410,6, | 2410,7, | 2410,8, | 2410,9, | 2410,10, | 2410,11, | 2410,12, | 2410,13, | 2410,14, | 2410,15, | 2410,16, | 2410,17, | 2410,18, | 2410,19, | 2410,20, | 2410,21, | 2410,22, | 2410,23, | 2410,24, | 2410,25, | 2410,26, | 2410,27, | 2410,28, | 2410,29, | 2410,30, | 2410,31, | 2410,32, | 2410,33, | 2410,34, | 2410,35, | 2410,36, | 2410,37, | 2410,38, | 2410,39, | 2410,40, | 2410,41, | 2410,42, | 2410,43, | 2410,44, | 2410,45, | 2410,46, | 2410,47, | 2410,48, | 2410,49, | 2410,50, | 2410,51, | 2410,52, | 2410,53, | 2410,54, | 2410,55, | 2410,56, | 2410,57, | 2410,58, | 2410,59, | 2410,60, | 2410,61, | 2410,62, | 2410,63, | 2410,64, | 2410,65, | 2410,66, | 2410,67, | 2410,68, | 2410,69, | 2410,70, | 2410,71, | 2410,72, | 2410,73, | 2410,74, | 2410,75, | 2410,76, | 2410,77, | 2410,78, | 2410,79, | 2410,80, | 2410,81, | 2410,82, | 2410,83, | 2410,84, | 2410,85, | 2411,1, | 2411,2, | 2411,3, | 2411,4, | 2411,5, | 2411,6, | 2411,7, | 2411,8, | 2411,9, | 2411,10, | 2411,11, | 2411,12, | 2411,13, | 2411,14, | 2411,15, | 2411,16, | 2411,17, | 2411,18, | 2411,19, | 2411,20, | 2411,21, | 2411,22, | 2411,23, | 2411,24, | 2411,25, | 2411,26, | 2411,27, | 2411,28, | 2411,29, | 2411,30, | 2411,31, | 2411,32, | 2411,33, | 2411,34, | 2411,35, | 2411,36, | 2411,37, | 2411,38, | 2411,39, | 2411,40, | 2411,41, | 2411,42, | 2411,43, | 2411,44, | 2411,45, | 2411,46, | 2411,47, | 2411,48, | 2411,49, | 2411,50, | 2411,51, | 2411,52, | 2411,53, | 2411,54, | 2411,55, | 2411,56, | 2411,57, | 2411,58, | 2411,59, | 2411,60, | 2411,61, | 2411,62, | 2411,63, | 2411,64, | 2411,65, | 2411,66, | 2411,67, | 2411,68, | 2411,69, | 2411,70, | 2411,71, | 2411,72, | 2411,73, | 2411,74, | 2411,75, | 2411,76, | 2411,77, | 2411,78, | 2411,79, | 2411,80, | 2411,81, | 2411,82, | 2411,83, | 2411,84, | 2411,85, | 2412,1, | 2412,2, | 2412,3, | 2412,4, | 2412,5, | 2412,6, | 2412,7, | 2412,8, | 2412,9, | 2412,10, | 2412,11, | 2412,12, | 2412,13, | 2412,14, | 2412,15, | 2412,16, | 2412,17, | 2412,18, | 2412,19, | 2412,20, | 2412,21, | 2412,22, | 2412,23, | 2412,24, | 2412,25, | 2412,26, | 2412,27, | 2412,28, | 2412,29, | 2412,30, | 2412,31, | 2412,32, | 2412,33, | 2412,34, | 2412,35, | 2412,36, | 2412,37, | 2412,38, | 2412,39, | 2412,40, | 2412,41, | 2412,42, | 2412,43, | 2412,44, | 2412,45, | 2412,46, | 2412,47, | 2412,48, | 2412,49, | 2412,50, | 2412,51, | 2412,52, | 2412,53, | 2412,54, | 2412,55, | 2412,56, | 2412,57, | 2412,58, | 2412,59, | 2412,60, | 2412,61, | 2412,62, | 2412,63, | 2412,64, | 2412,65, | 2412,66, | 2412,67, | 2412,68, | 2412,69, | 2412,70, | 2412,71, | 2412,72, | 2412,73, | 2412,74, | 2412,75, | 2412,76, | 2412,77, | 2412,78, | 2412,79, | 2412,80, | 2412,81, | 2412,82, | 2412,83, | 2412,84, | 2412,85, | 2413,1, | 2413,2, | 2413,3, | 2413,4, | 2413,5, | 2413,6, | 2413,7, | 2413,8, | 2413,9, | 2413,10, | 2413,11, | 2413,12, | 2413,13, | 2413,14, | 2413,15, | 2413,16, | 2413,17, | 2413,18, | 2413,19, | 2413,20, | 2413,21, | 2413,22, | 2413,23, | 2413,24, | 2413,25, | 2413,26, | 2413,27, | 2413,28, | 2413,29, | 2413,30, | 2413,31, | 2413,32, | 2413,33, | 2413,34, | 2413,35, | 2413,36, | 2413,37, | 2413,38, | 2413,39, | 2413,40, | 2413,41, | 2413,42, | 2413,43, | 2413,44, | 2413,45, | 2413,46, | 2413,47, | 2413,48, | 2413,49, | 2413,50, | 2413,51, | 2413,52, | 2413,53, | 2413,54, | 2413,55, | 2413,56, | 2413,57, | 2413,58, | 2413,59, | 2413,60, | 2413,61, | 2413,62, | 2413,63, | 2413,64, | 2413,65, | 2413,66, | 2413,67, | 2413,68, | 2413,69, | 2413,70, | 2413,71, | 2413,72, | 2413,73, | 2413,74, | 2413,75, | 2413,76, | 2413,77, | 2413,78, | 2413,79, | 2413,80, | 2413,81, | 2413,82, | 2413,83, | 2413,84, | 2413,85, | 2414,1, | 2414,2, | 2414,3, | 2414,4, | 2414,5, | 2414,6, | 2414,7, | 2414,8, | 2414,9, | 2414,10, | 2414,11, | 2414,12, | 2414,13, | 2414,14, | 2414,15, | 2414,16, | 2414,17, | 2414,18, | 2414,19, | 2414,20, | 2414,21, | 2414,22, | 2414,23, | 2414,24, | 2414,25, | 2414,26, | 2414,27, | 2414,28, | 2414,29, | 2414,30, | 2414,31, | 2414,32, | 2414,33, | 2414,34, | 2414,35, | 2414,36, | 2414,37, | 2414,38, | 2414,39, | 2414,40, | 2414,41, | 2414,42, | 2414,43, | 2414,44, | 2414,45, | 2414,46, | 2414,47, | 2414,48, | 2414,49, | 2414,50, | 2414,51, | 2414,52, | 2414,53, | 2414,54, | 2414,55, | 2414,56, | 2414,57, | 2414,58, | 2414,59, | 2414,60, | 2414,61, | 2414,62, | 2414,63, | 2414,64, | 2414,65, | 2414,66, | 2414,67, | 2414,68, | 2414,69, | 2414,70, | 2414,71, | 2414,72, | 2414,73, | 2414,74, | 2414,75, | 2414,76, | 2414,77, | 2414,78, | 2414,79, | 2414,80, | 2414,81, | 2414,82, | 2414,83, | 2414,84, | 2414,85, | 2415,1, | 2415,2, | 2415,3, | 2415,4, | 2415,5, | 2415,6, | 2415,7, | 2415,8, | 2415,9, | 2415,10, | 2415,11, | 2415,12, | 2415,13, | 2415,14, | 2415,15, | 2415,16, | 2415,17, | 2415,18, | 2415,19, | 2415,20, | 2415,21, | 2415,22, | 2415,23, | 2415,24, | 2415,25, | 2415,26, | 2415,27, | 2415,28, | 2415,29, | 2415,30, | 2415,31, | 2415,32, | 2415,33, | 2415,34, | 2415,35, | 2415,36, | 2415,37, | 2415,38, | 2415,39, | 2415,40, | 2415,41, | 2415,42, | 2415,43, | 2415,44, | 2415,45, | 2415,46, | 2415,47, | 2415,48, | 2415,49, | 2415,50, | 2415,51, | 2415,52, | 2415,53, | 2415,54, | 2415,55, | 2415,56, | 2415,57, | 2415,58, | 2415,59, | 2415,60, | 2415,61, | 2415,62, | 2415,63, | 2415,64, | 2415,65, | 2415,66, | 2415,67, | 2415,68, | 2415,69, | 2415,70, | 2415,71, | 2415,72, | 2415,73, | 2415,74, | 2415,75, | 2415,76, | 2415,77, | 2415,78, | 2415,79, | 2415,80, | 2415,81, | 2415,82, | 2415,83, | 2415,84, | 2415,85, | 2416,1, | 2416,2, | 2416,3, | 2416,4, | 2416,5, | 2416,6, | 2416,7, | 2416,8, | 2416,9, | 2416,10, | 2416,11, | 2416,12, | 2416,13, | 2416,14, | 2416,15, | 2416,16, | 2416,17, | 2416,18, | 2416,19, | 2416,20, | 2416,21, | 2416,22, | 2416,23, | 2416,24, | 2416,25, | 2416,26, | 2416,27, | 2416,28, | 2416,29, | 2416,30, | 2416,31, | 2416,32, | 2416,33, | 2416,34, | 2416,35, | 2416,36, | 2416,37, | 2416,38, | 2416,39, | 2416,40, | 2416,41, | 2416,42, | 2416,43, | 2416,44, | 2416,45, | 2416,46, | 2416,47, | 2416,48, | 2416,49, | 2416,50, | 2416,51, | 2416,52, | 2416,53, | 2416,54, | 2416,55, | 2416,56, | 2416,57, | 2416,58, | 2416,59, | 2416,60, | 2416,61, | 2416,62, | 2416,63, | 2416,64, | 2416,65, | 2416,66, | 2416,67, | 2416,68, | 2416,69, | 2416,70, | 2416,71, | 2416,72, | 2416,73, | 2416,74, | 2416,75, | 2416,76, | 2416,77, | 2416,78, | 2416,79, | 2416,80, | 2416,81, | 2416,82, | 2416,83, | 2416,84, | 2416,85, | 2417,1, | 2417,2, | 2417,3, | 2417,4, | 2417,5, | 2417,6, | 2417,7, | 2417,8, | 2417,9, | 2417,10, | 2417,11, | 2417,12, | 2417,13, | 2417,14, | 2417,15, | 2417,16, | 2417,17, | 2417,18, | 2417,19, | 2417,20, | 2417,21, | 2417,22, | 2417,23, | 2417,24, | 2417,25, | 2417,26, | 2417,27, | 2417,28, | 2417,29, | 2417,30, | 2417,31, | 2417,32, | 2417,33, | 2417,34, | 2417,35, | 2417,36, | 2417,37, | 2417,38, | 2417,39, | 2417,40, | 2417,41, | 2417,42, | 2417,43, | 2417,44, | 2417,45, | 2417,46, | 2417,47, | 2417,48, | 2417,49, | 2417,50, | 2417,51, | 2417,52, | 2417,53, | 2417,54, | 2417,55, | 2417,56, | 2417,57, | 2417,58, | 2417,59, | 2417,60, | 2417,61, | 2417,62, | 2417,63, | 2417,64, | 2417,65, | 2417,66, | 2417,67, | 2417,68, | 2417,69, | 2417,70, | 2417,71, | 2417,72, | 2417,73, | 2417,74, | 2417,75, | 2417,76, | 2417,77, | 2417,78, | 2417,79, | 2417,80, | 2417,81, | 2417,82, | 2417,83, | 2417,84, | 2417,85, | 2418,1, | 2418,2, | 2418,3, | 2418,4, | 2418,5, | 2418,6, | 2418,7, | 2418,8, | 2418,9, | 2418,10, | 2418,11, | 2418,12, | 2418,13, | 2418,14, | 2418,15, | 2418,16, | 2418,17, | 2418,18, | 2418,19, | 2418,20, | 2418,21, | 2418,22, | 2418,23, | 2418,24, | 2418,25, | 2418,26, | 2418,27, | 2418,28, | 2418,29, | 2418,30, | 2418,31, | 2418,32, | 2418,33, | 2418,34, | 2418,35, | 2418,36, | 2418,37, | 2418,38, | 2418,39, | 2418,40, | 2418,41, | 2418,42, | 2418,43, | 2418,44, | 2418,45, | 2418,46, | 2418,47, | 2418,48, | 2418,49, | 2418,50, | 2418,51, | 2418,52, | 2418,53, | 2418,54, | 2418,55, | 2418,56, | 2418,57, | 2418,58, | 2418,59, | 2418,60, | 2418,61, | 2418,62, | 2418,63, | 2418,64, | 2418,65, | 2418,66, | 2418,67, | 2418,68, | 2418,69, | 2418,70, | 2418,71, | 2418,72, | 2418,73, | 2418,74, | 2418,75, | 2418,76, | 2418,77, | 2418,78, | 2418,79, | 2418,80, | 2418,81, | 2418,82, | 2418,83, | 2418,84, | 2418,85, | 2419,1, | 2419,2, | 2419,3, | 2419,4, | 2419,5, | 2419,6, | 2419,7, | 2419,8, | 2419,9, | 2419,10, | 2419,11, | 2419,12, | 2419,13, | 2419,14, | 2419,15, | 2419,16, | 2419,17, | 2419,18, | 2419,19, | 2419,20, | 2419,21, | 2419,22, | 2419,23, | 2419,24, | 2419,25, | 2419,26, | 2419,27, | 2419,28, | 2419,29, | 2419,30, | 2419,31, | 2419,32, | 2419,33, | 2419,34, | 2419,35, | 2419,36, | 2419,37, | 2419,38, | 2419,39, | 2419,40, | 2419,41, | 2419,42, | 2419,43, | 2419,44, | 2419,45, | 2419,46, | 2419,47, | 2419,48, | 2419,49, | 2419,50, | 2419,51, | 2419,52, | 2419,53, | 2419,54, | 2419,55, | 2419,56, | 2419,57, | 2419,58, | 2419,59, | 2419,60, | 2419,61, | 2419,62, | 2419,63, | 2419,64, | 2419,65, | 2419,66, | 2419,67, | 2419,68, | 2419,69, | 2419,70, | 2419,71, | 2419,72, | 2419,73, | 2419,74, | 2419,75, | 2419,76, | 2419,77, | 2419,78, | 2419,79, | 2419,80, | 2419,81, | 2419,82, | 2419,83, | 2419,84, | 2419,85, | 2420,1, | 2420,2, | 2420,3, | 2420,4, | 2420,5, | 2420,6, | 2420,7, | 2420,8, | 2420,9, | 2420,10, | 2420,11, | 2420,12, | 2420,13, | 2420,14, | 2420,15, | 2420,16, | 2420,17, | 2420,18, | 2420,19, | 2420,20, | 2420,21, | 2420,22, | 2420,23, | 2420,24, | 2420,25, | 2420,26, | 2420,27, | 2420,28, | 2420,29, | 2420,30, | 2420,31, | 2420,32, | 2420,33, | 2420,34, | 2420,35, | 2420,36, | 2420,37, | 2420,38, | 2420,39, | 2420,40, | 2420,41, | 2420,42, | 2420,43, | 2420,44, | 2420,45, | 2420,46, | 2420,47, | 2420,48, | 2420,49, | 2420,50, | 2420,51, | 2420,52, | 2420,53, | 2420,54, | 2420,55, | 2420,56, | 2420,57, | 2420,58, | 2420,59, | 2420,60, | 2420,61, | 2420,62, | 2420,63, | 2420,64, | 2420,65, | 2420,66, | 2420,67, | 2420,68, | 2420,69, | 2420,70, | 2420,71, | 2420,72, | 2420,73, | 2420,74, | 2420,75, | 2420,76, | 2420,77, | 2420,78, | 2420,79, | 2420,80, | 2420,81, | 2420,82, | 2420,83, | 2420,84, | 2420,85, | 2421,1, | 2421,2, | 2421,3, | 2421,4, | 2421,5, | 2421,6, | 2421,7, | 2421,8, | 2421,9, | 2421,10, | 2421,11, | 2421,12, | 2421,13, | 2421,14, | 2421,15, | 2421,16, | 2421,17, | 2421,18, | 2421,19, | 2421,20, | 2421,21, | 2421,22, | 2421,23, | 2421,24, | 2421,25, | 2421,26, | 2421,27, | 2421,28, | 2421,29, | 2421,30, | 2421,31, | 2421,32, | 2421,33, | 2421,34, | 2421,35, | 2421,36, | 2421,37, | 2421,38, | 2421,39, | 2421,40, | 2421,41, | 2421,42, | 2421,43, | 2421,44, | 2421,45, | 2421,46, | 2421,47, | 2421,48, | 2421,49, | 2421,50, | 2421,51, | 2421,52, | 2421,53, | 2421,54, | 2421,55, | 2421,56, | 2421,57, | 2421,58, | 2421,59, | 2421,60, | 2421,61, | 2421,62, | 2421,63, | 2421,64, | 2421,65, | 2421,66, | 2421,67, | 2421,68, | 2421,69, | 2421,70, | 2421,71, | 2421,72, | 2421,73, | 2421,74, | 2421,75, | 2421,76, | 2421,77, | 2421,78, | 2421,79, | 2421,80, | 2421,81, | 2421,82, | 2421,83, | 2421,84, | 2421,85, | 2422,1, | 2422,2, | 2422,3, | 2422,4, | 2422,5, | 2422,6, | 2422,7, | 2422,8, | 2422,9, | 2422,10, | 2422,11, | 2422,12, | 2422,13, | 2422,14, | 2422,15, | 2422,16, | 2422,17, | 2422,18, | 2422,19, | 2422,20, | 2422,21, | 2422,22, | 2422,23, | 2422,24, | 2422,25, | 2422,26, | 2422,27, | 2422,28, | 2422,29, | 2422,30, | 2422,31, | 2422,32, | 2422,33, | 2422,34, | 2422,35, | 2422,36, | 2422,37, | 2422,38, | 2422,39, | 2422,40, | 2422,41, | 2422,42, | 2422,43, | 2422,44, | 2422,45, | 2422,46, | 2422,47, | 2422,48, | 2422,49, | 2422,50, | 2422,51, | 2422,52, | 2422,53, | 2422,54, | 2422,55, | 2422,56, | 2422,57, | 2422,58, | 2422,59, | 2422,60, | 2422,61, | 2422,62, | 2422,63, | 2422,64, | 2422,65, | 2422,66, | 2422,67, | 2422,68, | 2422,69, | 2422,70, | 2422,71, | 2422,72, | 2422,73, | 2422,74, | 2422,75, | 2422,76, | 2422,77, | 2422,78, | 2422,79, | 2422,80, | 2422,81, | 2422,82, | 2422,83, | 2422,84, | 2422,85, | 2423,1, | 2423,2, | 2423,3, | 2423,4, | 2423,5, | 2423,6, | 2423,7, | 2423,8, | 2423,9, | 2423,10, | 2423,11, | 2423,12, | 2423,13, | 2423,14, | 2423,15, | 2423,16, | 2423,17, | 2423,18, | 2423,19, | 2423,20, | 2423,21, | 2423,22, | 2423,23, | 2423,24, | 2423,25, | 2423,26, | 2423,27, | 2423,28, | 2423,29, | 2423,30, | 2423,31, | 2423,32, | 2423,33, | 2423,34, | 2423,35, | 2423,36, | 2423,37, | 2423,38, | 2423,39, | 2423,40, | 2423,41, | 2423,42, | 2423,43, | 2423,44, | 2423,45, | 2423,46, | 2423,47, | 2423,48, | 2423,49, | 2423,50, | 2423,51, | 2423,52, | 2423,53, | 2423,54, | 2423,55, | 2423,56, | 2423,57, | 2423,58, | 2423,59, | 2423,60, | 2423,61, | 2423,62, | 2423,63, | 2423,64, | 2423,65, | 2423,66, | 2423,67, | 2423,68, | 2423,69, | 2423,70, | 2423,71, | 2423,72, | 2423,73, | 2423,74, | 2423,75, | 2423,76, | 2423,77, | 2423,78, | 2423,79, | 2423,80, | 2423,81, | 2423,82, | 2423,83, | 2423,84, | 2423,85, | 2424,1, | 2424,2, | 2424,3, | 2424,4, | 2424,5, | 2424,6, | 2424,7, | 2424,8, | 2424,9, | 2424,10, | 2424,11, | 2424,12, | 2424,13, | 2424,14, | 2424,15, | 2424,16, | 2424,17, | 2424,18, | 2424,19, | 2424,20, | 2424,21, | 2424,22, | 2424,23, | 2424,24, | 2424,25, | 2424,26, | 2424,27, | 2424,28, | 2424,29, | 2424,30, | 2424,31, | 2424,32, | 2424,33, | 2424,34, | 2424,35, | 2424,36, | 2424,37, | 2424,38, | 2424,39, | 2424,40, | 2424,41, | 2424,42, | 2424,43, | 2424,44, | 2424,45, | 2424,46, | 2424,47, | 2424,48, | 2424,49, | 2424,50, | 2424,51, | 2424,52, | 2424,53, | 2424,54, | 2424,55, | 2424,56, | 2424,57, | 2424,58, | 2424,59, | 2424,60, | 2424,61, | 2424,62, | 2424,63, | 2424,64, | 2424,65, | 2424,66, | 2424,67, | 2424,68, | 2424,69, | 2424,70, | 2424,71, | 2424,72, | 2424,73, | 2424,74, | 2424,75, | 2424,76, | 2424,77, | 2424,78, | 2424,79, | 2424,80, | 2424,81, | 2424,82, | 2424,83, | 2424,84, | 2424,85, | 2425,1, | 2425,2, | 2425,3, | 2425,4, | 2425,5, | 2425,6, | 2425,7, | 2425,8, | 2425,9, | 2425,10, | 2425,11, | 2425,12, | 2425,13, | 2425,14, | 2425,15, | 2425,16, | 2425,17, | 2425,18, | 2425,19, | 2425,20, | 2425,21, | 2425,22, | 2425,23, | 2425,24, | 2425,25, | 2425,26, | 2425,27, | 2425,28, | 2425,29, | 2425,30, | 2425,31, | 2425,32, | 2425,33, | 2425,34, | 2425,35, | 2425,36, | 2425,37, | 2425,38, | 2425,39, | 2425,40, | 2425,41, | 2425,42, | 2425,43, | 2425,44, | 2425,45, | 2425,46, | 2425,47, | 2425,48, | 2425,49, | 2425,50, | 2425,51, | 2425,52, | 2425,53, | 2425,54, | 2425,55, | 2425,56, | 2425,57, | 2425,58, | 2425,59, | 2425,60, | 2425,61, | 2425,62, | 2425,63, | 2425,64, | 2425,65, | 2425,66, | 2425,67, | 2425,68, | 2425,69, | 2425,70, | 2425,71, | 2425,72, | 2425,73, | 2425,74, | 2425,75, | 2425,76, | 2425,77, | 2425,78, | 2425,79, | 2425,80, | 2425,81, | 2425,82, | 2425,83, | 2425,84, | 2425,85, | 2426,1, | 2426,2, | 2426,3, | 2426,4, | 2426,5, | 2426,6, | 2426,7, | 2426,8, | 2426,9, | 2426,10, | 2426,11, | 2426,12, | 2426,13, | 2426,14, | 2426,15, | 2426,16, | 2426,17, | 2426,18, | 2426,19, | 2426,20, | 2426,21, | 2426,22, | 2426,23, | 2426,24, | 2426,25, | 2426,26, | 2426,27, | 2426,28, | 2426,29, | 2426,30, | 2426,31, | 2426,32, | 2426,33, | 2426,34, | 2426,35, | 2426,36, | 2426,37, | 2426,38, | 2426,39, | 2426,40, | 2426,41, | 2426,42, | 2426,43, | 2426,44, | 2426,45, | 2426,46, | 2426,47, | 2426,48, | 2426,49, | 2426,50, | 2426,51, | 2426,52, | 2426,53, | 2426,54, | 2426,55, | 2426,56, | 2426,57, | 2426,58, | 2426,59, | 2426,60, | 2426,61, | 2426,62, | 2426,63, | 2426,64, | 2426,65, | 2426,66, | 2426,67, | 2426,68, | 2426,69, | 2426,70, | 2426,71, | 2426,72, | 2426,73, | 2426,74, | 2426,75, | 2426,76, | 2426,77, | 2426,78, | 2426,79, | 2426,80, | 2426,81, | 2426,82, | 2426,83, | 2426,84, | 2426,85, | 2427,1, | 2427,2, | 2427,3, | 2427,4, | 2427,5, | 2427,6, | 2427,7, | 2427,8, | 2427,9, | 2427,10, | 2427,11, | 2427,12, | 2427,13, | 2427,14, | 2427,15, | 2427,16, | 2427,17, | 2427,18, | 2427,19, | 2427,20, | 2427,21, | 2427,22, | 2427,23, | 2427,24, | 2427,25, | 2427,26, | 2427,27, | 2427,28, | 2427,29, | 2427,30, | 2427,31, | 2427,32, | 2427,33, | 2427,34, | 2427,35, | 2427,36, | 2427,37, | 2427,38, | 2427,39, | 2427,40, | 2427,41, | 2427,42, | 2427,43, | 2427,44, | 2427,45, | 2427,46, | 2427,47, | 2427,48, | 2427,49, | 2427,50, | 2427,51, | 2427,52, | 2427,53, | 2427,54, | 2427,55, | 2427,56, | 2427,57, | 2427,58, | 2427,59, | 2427,60, | 2427,61, | 2427,62, | 2427,63, | 2427,64, | 2427,65, | 2427,66, | 2427,67, | 2427,68, | 2427,69, | 2427,70, | 2427,71, | 2427,72, | 2427,73, | 2427,74, | 2427,75, | 2427,76, | 2427,77, | 2427,78, | 2427,79, | 2427,80, | 2427,81, | 2427,82, | 2427,83, | 2427,84, | 2427,85, | 2428,1, | 2428,2, | 2428,3, | 2428,4, | 2428,5, | 2428,6, | 2428,7, | 2428,8, | 2428,9, | 2428,10, | 2428,11, | 2428,12, | 2428,13, | 2428,14, | 2428,15, | 2428,16, | 2428,17, | 2428,18, | 2428,19, | 2428,20, | 2428,21, | 2428,22, | 2428,23, | 2428,24, | 2428,25, | 2428,26, | 2428,27, | 2428,28, | 2428,29, | 2428,30, | 2428,31, | 2428,32, | 2428,33, | 2428,34, | 2428,35, | 2428,36, | 2428,37, | 2428,38, | 2428,39, | 2428,40, | 2428,41, | 2428,42, | 2428,43, | 2428,44, | 2428,45, | 2428,46, | 2428,47, | 2428,48, | 2428,49, | 2428,50, | 2428,51, | 2428,52, | 2428,53, | 2428,54, | 2428,55, | 2428,56, | 2428,57, | 2428,58, | 2428,59, | 2428,60, | 2428,61, | 2428,62, | 2428,63, | 2428,64, | 2428,65, | 2428,66, | 2428,67, | 2428,68, | 2428,69, | 2428,70, | 2428,71, | 2428,72, | 2428,73, | 2428,74, | 2428,75, | 2428,76, | 2428,77, | 2428,78, | 2428,79, | 2428,80, | 2428,81, | 2428,82, | 2428,83, | 2428,84, | 2428,85, | 2429,1, | 2429,2, | 2429,3, | 2429,4, | 2429,5, | 2429,6, | 2429,7, | 2429,8, | 2429,9, | 2429,10, | 2429,11, | 2429,12, | 2429,13, | 2429,14, | 2429,15, | 2429,16, | 2429,17, | 2429,18, | 2429,19, | 2429,20, | 2429,21, | 2429,22, | 2429,23, | 2429,24, | 2429,25, | 2429,26, | 2429,27, | 2429,28, | 2429,29, | 2429,30, | 2429,31, | 2429,32, | 2429,33, | 2429,34, | 2429,35, | 2429,36, | 2429,37, | 2429,38, | 2429,39, | 2429,40, | 2429,41, | 2429,42, | 2429,43, | 2429,44, | 2429,45, | 2429,46, | 2429,47, | 2429,48, | 2429,49, | 2429,50, | 2429,51, | 2429,52, | 2429,53, | 2429,54, | 2429,55, | 2429,56, | 2429,57, | 2429,58, | 2429,59, | 2429,60, | 2429,61, | 2429,62, | 2429,63, | 2429,64, | 2429,65, | 2429,66, | 2429,67, | 2429,68, | 2429,69, | 2429,70, | 2429,71, | 2429,72, | 2429,73, | 2429,74, | 2429,75, | 2429,76, | 2429,77, | 2429,78, | 2429,79, | 2429,80, | 2429,81, | 2429,82, | 2429,83, | 2429,84, | 2429,85, | 2430,1, | 2430,2, | 2430,3, | 2430,4, | 2430,5, | 2430,6, | 2430,7, | 2430,8, | 2430,9, | 2430,10, | 2430,11, | 2430,12, | 2430,13, | 2430,14, | 2430,15, | 2430,16, | 2430,17, | 2430,18, | 2430,19, | 2430,20, | 2430,21, | 2430,22, | 2430,23, | 2430,24, | 2430,25, | 2430,26, | 2430,27, | 2430,28, | 2430,29, | 2430,30, | 2430,31, | 2430,32, | 2430,33, | 2430,34, | 2430,35, | 2430,36, | 2430,37, | 2430,38, | 2430,39, | 2430,40, | 2430,41, | 2430,42, | 2430,43, | 2430,44, | 2430,45, | 2430,46, | 2430,47, | 2430,48, | 2430,49, | 2430,50, | 2430,51, | 2430,52, | 2430,53, | 2430,54, | 2430,55, | 2430,56, | 2430,57, | 2430,58, | 2430,59, | 2430,60, | 2430,61, | 2430,62, | 2430,63, | 2430,64, | 2430,65, | 2430,66, | 2430,67, | 2430,68, | 2430,69, | 2430,70, | 2430,71, | 2430,72, | 2430,73, | 2430,74, | 2430,75, | 2430,76, | 2430,77, | 2430,78, | 2430,79, | 2430,80, | 2430,81, | 2430,82, | 2430,83, | 2430,84, | 2430,85, | 2431,1, | 2431,2, | 2431,3, | 2431,4, | 2431,5, | 2431,6, | 2431,7, | 2431,8, | 2431,9, | 2431,10, | 2431,11, | 2431,12, | 2431,13, | 2431,14, | 2431,15, | 2431,16, | 2431,17, | 2431,18, | 2431,19, | 2431,20, | 2431,21, | 2431,22, | 2431,23, | 2431,24, | 2431,25, | 2431,26, | 2431,27, | 2431,28, | 2431,29, | 2431,30, | 2431,31, | 2431,32, | 2431,33, | 2431,34, | 2431,35, | 2431,36, | 2431,37, | 2431,38, | 2431,39, | 2431,40, | 2431,41, | 2431,42, | 2431,43, | 2431,44, | 2431,45, | 2431,46, | 2431,47, | 2431,48, | 2431,49, | 2431,50, | 2431,51, | 2431,52, | 2431,53, | 2431,54, | 2431,55, | 2431,56, | 2431,57, | 2431,58, | 2431,59, | 2431,60, | 2431,61, | 2431,62, | 2431,63, | 2431,64, | 2431,65, | 2431,66, | 2431,67, | 2431,68, | 2431,69, | 2431,70, | 2431,71, | 2431,72, | 2431,73, | 2431,74, | 2431,75, | 2431,76, | 2431,77, | 2431,78, | 2431,79, | 2431,80, | 2431,81, | 2431,82, | 2431,83, | 2431,84, | 2431,85, | 2432,1, | 2432,2, | 2432,3, | 2432,4, | 2432,5, | 2432,6, | 2432,7, | 2432,8, | 2432,9, | 2432,10, | 2432,11, | 2432,12, | 2432,13, | 2432,14, | 2432,15, | 2432,16, | 2432,17, | 2432,18, | 2432,19, | 2432,20, | 2432,21, | 2432,22, | 2432,23, | 2432,24, | 2432,25, | 2432,26, | 2432,27, | 2432,28, | 2432,29, | 2432,30, | 2432,31, | 2432,32, | 2432,33, | 2432,34, | 2432,35, | 2432,36, | 2432,37, | 2432,38, | 2432,39, | 2432,40, | 2432,41, | 2432,42, | 2432,43, | 2432,44, | 2432,45, | 2432,46, | 2432,47, | 2432,48, | 2432,49, | 2432,50, | 2432,51, | 2432,52, | 2432,53, | 2432,54, | 2432,55, | 2432,56, | 2432,57, | 2432,58, | 2432,59, | 2432,60, | 2432,61, | 2432,62, | 2432,63, | 2432,64, | 2432,65, | 2432,66, | 2432,67, | 2432,68, | 2432,69, | 2432,70, | 2432,71, | 2432,72, | 2432,73, | 2432,74, | 2432,75, | 2432,76, | 2432,77, | 2432,78, | 2432,79, | 2432,80, | 2432,81, | 2432,82, | 2432,83, | 2432,84, | 2432,85, | 2433,1, | 2433,2, | 2433,3, | 2433,4, | 2433,5, | 2433,6, | 2433,7, | 2433,8, | 2433,9, | 2433,10, | 2433,11, | 2433,12, | 2433,13, | 2433,14, | 2433,15, | 2433,16, | 2433,17, | 2433,18, | 2433,19, | 2433,20, | 2433,21, | 2433,22, | 2433,23, | 2433,24, | 2433,25, | 2433,26, | 2433,27, | 2433,28, | 2433,29, | 2433,30, | 2433,31, | 2433,32, | 2433,33, | 2433,34, | 2433,35, | 2433,36, | 2433,37, | 2433,38, | 2433,39, | 2433,40, | 2433,41, | 2433,42, | 2433,43, | 2433,44, | 2433,45, | 2433,46, | 2433,47, | 2433,48, | 2433,49, | 2433,50, | 2433,51, | 2433,52, | 2433,53, | 2433,54, | 2433,55, | 2433,56, | 2433,57, | 2433,58, | 2433,59, | 2433,60, | 2433,61, | 2433,62, | 2433,63, | 2433,64, | 2433,65, | 2433,66, | 2433,67, | 2433,68, | 2433,69, | 2433,70, | 2433,71, | 2433,72, | 2433,73, | 2433,74, | 2433,75, | 2433,76, | 2433,77, | 2433,78, | 2433,79, | 2433,80, | 2433,81, | 2433,82, | 2433,83, | 2433,84, | 2433,85, | 2434,1, | 2434,2, | 2434,3, | 2434,4, | 2434,5, | 2434,6, | 2434,7, | 2434,8, | 2434,9, | 2434,10, | 2434,11, | 2434,12, | 2434,13, | 2434,14, | 2434,15, | 2434,16, | 2434,17, | 2434,18, | 2434,19, | 2434,20, | 2434,21, | 2434,22, | 2434,23, | 2434,24, | 2434,25, | 2434,26, | 2434,27, | 2434,28, | 2434,29, | 2434,30, | 2434,31, | 2434,32, | 2434,33, | 2434,34, | 2434,35, | 2434,36, | 2434,37, | 2434,38, | 2434,39, | 2434,40, | 2434,41, | 2434,42, | 2434,43, | 2434,44, | 2434,45, | 2434,46, | 2434,47, | 2434,48, | 2434,49, | 2434,50, | 2434,51, | 2434,52, | 2434,53, | 2434,54, | 2434,55, | 2434,56, | 2434,57, | 2434,58, | 2434,59, | 2434,60, | 2434,61, | 2434,62, | 2434,63, | 2434,64, | 2434,65, | 2434,66, | 2434,67, | 2434,68, | 2434,69, | 2434,70, | 2434,71, | 2434,72, | 2434,73, | 2434,74, | 2434,75, | 2434,76, | 2434,77, | 2434,78, | 2434,79, | 2434,80, | 2434,81, | 2434,82, | 2434,83, | 2434,84, | 2434,85, | 2435,1, | 2435,2, | 2435,3, | 2435,4, | 2435,5, | 2435,6, | 2435,7, | 2435,8, | 2435,9, | 2435,10, | 2435,11, | 2435,12, | 2435,13, | 2435,14, | 2435,15, | 2435,16, | 2435,17, | 2435,18, | 2435,19, | 2435,20, | 2435,21, | 2435,22, | 2435,23, | 2435,24, | 2435,25, | 2435,26, | 2435,27, | 2435,28, | 2435,29, | 2435,30, | 2435,31, | 2435,32, | 2435,33, | 2435,34, | 2435,35, | 2435,36, | 2435,37, | 2435,38, | 2435,39, | 2435,40, | 2435,41, | 2435,42, | 2435,43, | 2435,44, | 2435,45, | 2435,46, | 2435,47, | 2435,48, | 2435,49, | 2435,50, | 2435,51, | 2435,52, | 2435,53, | 2435,54, | 2435,55, | 2435,56, | 2435,57, | 2435,58, | 2435,59, | 2435,60, | 2435,61, | 2435,62, | 2435,63, | 2435,64, | 2435,65, | 2435,66, | 2435,67, | 2435,68, | 2435,69, | 2435,70, | 2435,71, | 2435,72, | 2435,73, | 2435,74, | 2435,75, | 2435,76, | 2435,77, | 2435,78, | 2435,79, | 2435,80, | 2435,81, | 2435,82, | 2435,83, | 2435,84, | 2435,85, | 2436,1, | 2436,2, | 2436,3, | 2436,4, | 2436,5, | 2436,6, | 2436,7, | 2436,8, | 2436,9, | 2436,10, | 2436,11, | 2436,12, | 2436,13, | 2436,14, | 2436,15, | 2436,16, | 2436,17, | 2436,18, | 2436,19, | 2436,20, | 2436,21, | 2436,22, | 2436,23, | 2436,24, | 2436,25, | 2436,26, | 2436,27, | 2436,28, | 2436,29, | 2436,30, | 2436,31, | 2436,32, | 2436,33, | 2436,34, | 2436,35, | 2436,36, | 2436,37, | 2436,38, | 2436,39, | 2436,40, | 2436,41, | 2436,42, | 2436,43, | 2436,44, | 2436,45, | 2436,46, | 2436,47, | 2436,48, | 2436,49, | 2436,50, | 2436,51, | 2436,52, | 2436,53, | 2436,54, | 2436,55, | 2436,56, | 2436,57, | 2436,58, | 2436,59, | 2436,60, | 2436,61, | 2436,62, | 2436,63, | 2436,64, | 2436,65, | 2436,66, | 2436,67, | 2436,68, | 2436,69, | 2436,70, | 2436,71, | 2436,72, | 2436,73, | 2436,74, | 2436,75, | 2436,76, | 2436,77, | 2436,78, | 2436,79, | 2436,80, | 2436,81, | 2436,82, | 2436,83, | 2436,84, | 2436,85, | 2437,1, | 2437,2, | 2437,3, | 2437,4, | 2437,5, | 2437,6, | 2437,7, | 2437,8, | 2437,9, | 2437,10, | 2437,11, | 2437,12, | 2437,13, | 2437,14, | 2437,15, | 2437,16, | 2437,17, | 2437,18, | 2437,19, | 2437,20, | 2437,21, | 2437,22, | 2437,23, | 2437,24, | 2437,25, | 2437,26, | 2437,27, | 2437,28, | 2437,29, | 2437,30, | 2437,31, | 2437,32, | 2437,33, | 2437,34, | 2437,35, | 2437,36, | 2437,37, | 2437,38, | 2437,39, | 2437,40, | 2437,41, | 2437,42, | 2437,43, | 2437,44, | 2437,45, | 2437,46, | 2437,47, | 2437,48, | 2437,49, | 2437,50, | 2437,51, | 2437,52, | 2437,53, | 2437,54, | 2437,55, | 2437,56, | 2437,57, | 2437,58, | 2437,59, | 2437,60, | 2437,61, | 2437,62, | 2437,63, | 2437,64, | 2437,65, | 2437,66, | 2437,67, | 2437,68, | 2437,69, | 2437,70, | 2437,71, | 2437,72, | 2437,73, | 2437,74, | 2437,75, | 2437,76, | 2437,77, | 2437,78, | 2437,79, | 2437,80, | 2437,81, | 2437,82, | 2437,83, | 2437,84, | 2437,85, | 2438,1, | 2438,2, | 2438,3, | 2438,4, | 2438,5, | 2438,6, | 2438,7, | 2438,8, | 2438,9, | 2438,10, | 2438,11, | 2438,12, | 2438,13, | 2438,14, | 2438,15, | 2438,16, | 2438,17, | 2438,18, | 2438,19, | 2438,20, | 2438,21, | 2438,22, | 2438,23, | 2438,24, | 2438,25, | 2438,26, | 2438,27, | 2438,28, | 2438,29, | 2438,30, | 2438,31, | 2438,32, | 2438,33, | 2438,34, | 2438,35, | 2438,36, | 2438,37, | 2438,38, | 2438,39, | 2438,40, | 2438,41, | 2438,42, | 2438,43, | 2438,44, | 2438,45, | 2438,46, | 2438,47, | 2438,48, | 2438,49, | 2438,50, | 2438,51, | 2438,52, | 2438,53, | 2438,54, | 2438,55, | 2438,56, | 2438,57, | 2438,58, | 2438,59, | 2438,60, | 2438,61, | 2438,62, | 2438,63, | 2438,64, | 2438,65, | 2438,66, | 2438,67, | 2438,68, | 2438,69, | 2438,70, | 2438,71, | 2438,72, | 2438,73, | 2438,74, | 2438,75, | 2438,76, | 2438,77, | 2438,78, | 2438,79, | 2438,80, | 2438,81, | 2438,82, | 2438,83, | 2438,84, | 2438,85, | 2439,1, | 2439,2, | 2439,3, | 2439,4, | 2439,5, | 2439,6, | 2439,7, | 2439,8, | 2439,9, | 2439,10, | 2439,11, | 2439,12, | 2439,13, | 2439,14, | 2439,15, | 2439,16, | 2439,17, | 2439,18, | 2439,19, | 2439,20, | 2439,21, | 2439,22, | 2439,23, | 2439,24, | 2439,25, | 2439,26, | 2439,27, | 2439,28, | 2439,29, | 2439,30, | 2439,31, | 2439,32, | 2439,33, | 2439,34, | 2439,35, | 2439,36, | 2439,37, | 2439,38, | 2439,39, | 2439,40, | 2439,41, | 2439,42, | 2439,43, | 2439,44, | 2439,45, | 2439,46, | 2439,47, | 2439,48, | 2439,49, | 2439,50, | 2439,51, | 2439,52, | 2439,53, | 2439,54, | 2439,55, | 2439,56, | 2439,57, | 2439,58, | 2439,59, | 2439,60, | 2439,61, | 2439,62, | 2439,63, | 2439,64, | 2439,65, | 2439,66, | 2439,67, | 2439,68, | 2439,69, | 2439,70, | 2439,71, | 2439,72, | 2439,73, | 2439,74, | 2439,75, | 2439,76, | 2439,77, | 2439,78, | 2439,79, | 2439,80, | 2439,81, | 2439,82, | 2439,83, | 2439,84, | 2439,85, | 2440,1, | 2440,2, | 2440,3, | 2440,4, | 2440,5, | 2440,6, | 2440,7, | 2440,8, | 2440,9, | 2440,10, | 2440,11, | 2440,12, | 2440,13, | 2440,14, | 2440,15, | 2440,16, | 2440,17, | 2440,18, | 2440,19, | 2440,20, | 2440,21, | 2440,22, | 2440,23, | 2440,24, | 2440,25, | 2440,26, | 2440,27, | 2440,28, | 2440,29, | 2440,30, | 2440,31, | 2440,32, | 2440,33, | 2440,34, | 2440,35, | 2440,36, | 2440,37, | 2440,38, | 2440,39, | 2440,40, | 2440,41, | 2440,42, | 2440,43, | 2440,44, | 2440,45, | 2440,46, | 2440,47, | 2440,48, | 2440,49, | 2440,50, | 2440,51, | 2440,52, | 2440,53, | 2440,54, | 2440,55, | 2440,56, | 2440,57, | 2440,58, | 2440,59, | 2440,60, | 2440,61, | 2440,62, | 2440,63, | 2440,64, | 2440,65, | 2440,66, | 2440,67, | 2440,68, | 2440,69, | 2440,70, | 2440,71, | 2440,72, | 2440,73, | 2440,74, | 2440,75, | 2440,76, | 2440,77, | 2440,78, | 2440,79, | 2440,80, | 2440,81, | 2440,82, | 2440,83, | 2440,84, | 2440,85, | 2441,1, | 2441,2, | 2441,3, | 2441,4, | 2441,5, | 2441,6, | 2441,7, | 2441,8, | 2441,9, | 2441,10, | 2441,11, | 2441,12, | 2441,13, | 2441,14, | 2441,15, | 2441,16, | 2441,17, | 2441,18, | 2441,19, | 2441,20, | 2441,21, | 2441,22, | 2441,23, | 2441,24, | 2441,25, | 2441,26, | 2441,27, | 2441,28, | 2441,29, | 2441,30, | 2441,31, | 2441,32, | 2441,33, | 2441,34, | 2441,35, | 2441,36, | 2441,37, | 2441,38, | 2441,39, | 2441,40, | 2441,41, | 2441,42, | 2441,43, | 2441,44, | 2441,45, | 2441,46, | 2441,47, | 2441,48, | 2441,49, | 2441,50, | 2441,51, | 2441,52, | 2441,53, | 2441,54, | 2441,55, | 2441,56, | 2441,57, | 2441,58, | 2441,59, | 2441,60, | 2441,61, | 2441,62, | 2441,63, | 2441,64, | 2441,65, | 2441,66, | 2441,67, | 2441,68, | 2441,69, | 2441,70, | 2441,71, | 2441,72, | 2441,73, | 2441,74, | 2441,75, | 2441,76, | 2441,77, | 2441,78, | 2441,79, | 2441,80, | 2441,81, | 2441,82, | 2441,83, | 2441,84, | 2441,85, | 2442,1, | 2442,2, | 2442,3, | 2442,4, | 2442,5, | 2442,6, | 2442,7, | 2442,8, | 2442,9, | 2442,10, | 2442,11, | 2442,12, | 2442,13, | 2442,14, | 2442,15, | 2442,16, | 2442,17, | 2442,18, | 2442,19, | 2442,20, | 2442,21, | 2442,22, | 2442,23, | 2442,24, | 2442,25, | 2442,26, | 2442,27, | 2442,28, | 2442,29, | 2442,30, | 2442,31, | 2442,32, | 2442,33, | 2442,34, | 2442,35, | 2442,36, | 2442,37, | 2442,38, | 2442,39, | 2442,40, | 2442,41, | 2442,42, | 2442,43, | 2442,44, | 2442,45, | 2442,46, | 2442,47, | 2442,48, | 2442,49, | 2442,50, | 2442,51, | 2442,52, | 2442,53, | 2442,54, | 2442,55, | 2442,56, | 2442,57, | 2442,58, | 2442,59, | 2442,60, | 2442,61, | 2442,62, | 2442,63, | 2442,64, | 2442,65, | 2442,66, | 2442,67, | 2442,68, | 2442,69, | 2442,70, | 2442,71, | 2442,72, | 2442,73, | 2442,74, | 2442,75, | 2442,76, | 2442,77, | 2442,78, | 2442,79, | 2442,80, | 2442,81, | 2442,82, | 2442,83, | 2442,84, | 2442,85, | 2443,1, | 2443,2, | 2443,3, | 2443,4, | 2443,5, | 2443,6, | 2443,7, | 2443,8, | 2443,9, | 2443,10, | 2443,11, | 2443,12, | 2443,13, | 2443,14, | 2443,15, | 2443,16, | 2443,17, | 2443,18, | 2443,19, | 2443,20, | 2443,21, | 2443,22, | 2443,23, | 2443,24, | 2443,25, | 2443,26, | 2443,27, | 2443,28, | 2443,29, | 2443,30, | 2443,31, | 2443,32, | 2443,33, | 2443,34, | 2443,35, | 2443,36, | 2443,37, | 2443,38, | 2443,39, | 2443,40, | 2443,41, | 2443,42, | 2443,43, | 2443,44, | 2443,45, | 2443,46, | 2443,47, | 2443,48, | 2443,49, | 2443,50, | 2443,51, | 2443,52, | 2443,53, | 2443,54, | 2443,55, | 2443,56, | 2443,57, | 2443,58, | 2443,59, | 2443,60, | 2443,61, | 2443,62, | 2443,63, | 2443,64, | 2443,65, | 2443,66, | 2443,67, | 2443,68, | 2443,69, | 2443,70, | 2443,71, | 2443,72, | 2443,73, | 2443,74, | 2443,75, | 2443,76, | 2443,77, | 2443,78, | 2443,79, | 2443,80, | 2443,81, | 2443,82, | 2443,83, | 2443,84, | 2443,85, | 2444,1, | 2444,2, | 2444,3, | 2444,4, | 2444,5, | 2444,6, | 2444,7, | 2444,8, | 2444,9, | 2444,10, | 2444,11, | 2444,12, | 2444,13, | 2444,14, | 2444,15, | 2444,16, | 2444,17, | 2444,18, | 2444,19, | 2444,20, | 2444,21, | 2444,22, | 2444,23, | 2444,24, | 2444,25, | 2444,26, | 2444,27, | 2444,28, | 2444,29, | 2444,30, | 2444,31, | 2444,32, | 2444,33, | 2444,34, | 2444,35, | 2444,36, | 2444,37, | 2444,38, | 2444,39, | 2444,40, | 2444,41, | 2444,42, | 2444,43, | 2444,44, | 2444,45, | 2444,46, | 2444,47, | 2444,48, | 2444,49, | 2444,50, | 2444,51, | 2444,52, | 2444,53, | 2444,54, | 2444,55, | 2444,56, | 2444,57, | 2444,58, | 2444,59, | 2444,60, | 2444,61, | 2444,62, | 2444,63, | 2444,64, | 2444,65, | 2444,66, | 2444,67, | 2444,68, | 2444,69, | 2444,70, | 2444,71, | 2444,72, | 2444,73, | 2444,74, | 2444,75, | 2444,76, | 2444,77, | 2444,78, | 2444,79, | 2444,80, | 2444,81, | 2444,82, | 2444,83, | 2444,84, | 2444,85, | 2445,1, | 2445,2, | 2445,3, | 2445,4, | 2445,5, | 2445,6, | 2445,7, | 2445,8, | 2445,9, | 2445,10, | 2445,11, | 2445,12, | 2445,13, | 2445,14, | 2445,15, | 2445,16, | 2445,17, | 2445,18, | 2445,19, | 2445,20, | 2445,21, | 2445,22, | 2445,23, | 2445,24, | 2445,25, | 2445,26, | 2445,27, | 2445,28, | 2445,29, | 2445,30, | 2445,31, | 2445,32, | 2445,33, | 2445,34, | 2445,35, | 2445,36, | 2445,37, | 2445,38, | 2445,39, | 2445,40, | 2445,41, | 2445,42, | 2445,43, | 2445,44, | 2445,45, | 2445,46, | 2445,47, | 2445,48, | 2445,49, | 2445,50, | 2445,51, | 2445,52, | 2445,53, | 2445,54, | 2445,55, | 2445,56, | 2445,57, | 2445,58, | 2445,59, | 2445,60, | 2445,61, | 2445,62, | 2445,63, | 2445,64, | 2445,65, | 2445,66, | 2445,67, | 2445,68, | 2445,69, | 2445,70, | 2445,71, | 2445,72, | 2445,73, | 2445,74, | 2445,75, | 2445,76, | 2445,77, | 2445,78, | 2445,79, | 2445,80, | 2445,81, | 2445,82, | 2445,83, | 2445,84, | 2445,85, | 2446,1, | 2446,2, | 2446,3, | 2446,4, | 2446,5, | 2446,6, | 2446,7, | 2446,8, | 2446,9, | 2446,10, | 2446,11, | 2446,12, | 2446,13, | 2446,14, | 2446,15, | 2446,16, | 2446,17, | 2446,18, | 2446,19, | 2446,20, | 2446,21, | 2446,22, | 2446,23, | 2446,24, | 2446,25, | 2446,26, | 2446,27, | 2446,28, | 2446,29, | 2446,30, | 2446,31, | 2446,32, | 2446,33, | 2446,34, | 2446,35, | 2446,36, | 2446,37, | 2446,38, | 2446,39, | 2446,40, | 2446,41, | 2446,42, | 2446,43, | 2446,44, | 2446,45, | 2446,46, | 2446,47, | 2446,48, | 2446,49, | 2446,50, | 2446,51, | 2446,52, | 2446,53, | 2446,54, | 2446,55, | 2446,56, | 2446,57, | 2446,58, | 2446,59, | 2446,60, | 2446,61, | 2446,62, | 2446,63, | 2446,64, | 2446,65, | 2446,66, | 2446,67, | 2446,68, | 2446,69, | 2446,70, | 2446,71, | 2446,72, | 2446,73, | 2446,74, | 2446,75, | 2446,76, | 2446,77, | 2446,78, | 2446,79, | 2446,80, | 2446,81, | 2446,82, | 2446,83, | 2446,84, | 2446,85, | 2447,1, | 2447,2, | 2447,3, | 2447,4, | 2447,5, | 2447,6, | 2447,7, | 2447,8, | 2447,9, | 2447,10, | 2447,11, | 2447,12, | 2447,13, | 2447,14, | 2447,15, | 2447,16, | 2447,17, | 2447,18, | 2447,19, | 2447,20, | 2447,21, | 2447,22, | 2447,23, | 2447,24, | 2447,25, | 2447,26, | 2447,27, | 2447,28, | 2447,29, | 2447,30, | 2447,31, | 2447,32, | 2447,33, | 2447,34, | 2447,35, | 2447,36, | 2447,37, | 2447,38, | 2447,39, | 2447,40, | 2447,41, | 2447,42, | 2447,43, | 2447,44, | 2447,45, | 2447,46, | 2447,47, | 2447,48, | 2447,49, | 2447,50, | 2447,51, | 2447,52, | 2447,53, | 2447,54, | 2447,55, | 2447,56, | 2447,57, | 2447,58, | 2447,59, | 2447,60, | 2447,61, | 2447,62, | 2447,63, | 2447,64, | 2447,65, | 2447,66, | 2447,67, | 2447,68, | 2447,69, | 2447,70, | 2447,71, | 2447,72, | 2447,73, | 2447,74, | 2447,75, | 2447,76, | 2447,77, | 2447,78, | 2447,79, | 2447,80, | 2447,81, | 2447,82, | 2447,83, | 2447,84, | 2447,85, | 2448,1, | 2448,2, | 2448,3, | 2448,4, | 2448,5, | 2448,6, | 2448,7, | 2448,8, | 2448,9, | 2448,10, | 2448,11, | 2448,12, | 2448,13, | 2448,14, | 2448,15, | 2448,16, | 2448,17, | 2448,18, | 2448,19, | 2448,20, | 2448,21, | 2448,22, | 2448,23, | 2448,24, | 2448,25, | 2448,26, | 2448,27, | 2448,28, | 2448,29, | 2448,30, | 2448,31, | 2448,32, | 2448,33, | 2448,34, | 2448,35, | 2448,36, | 2448,37, | 2448,38, | 2448,39, | 2448,40, | 2448,41, | 2448,42, | 2448,43, | 2448,44, | 2448,45, | 2448,46, | 2448,47, | 2448,48, | 2448,49, | 2448,50, | 2448,51, | 2448,52, | 2448,53, | 2448,54, | 2448,55, | 2448,56, | 2448,57, | 2448,58, | 2448,59, | 2448,60, | 2448,61, | 2448,62, | 2448,63, | 2448,64, | 2448,65, | 2448,66, | 2448,67, | 2448,68, | 2448,69, | 2448,70, | 2448,71, | 2448,72, | 2448,73, | 2448,74, | 2448,75, | 2448,76, | 2448,77, | 2448,78, | 2448,79, | 2448,80, | 2448,81, | 2448,82, | 2448,83, | 2448,84, | 2448,85, | 2449,1, | 2449,2, | 2449,3, | 2449,4, | 2449,5, | 2449,6, | 2449,7, | 2449,8, | 2449,9, | 2449,10, | 2449,11, | 2449,12, | 2449,13, | 2449,14, | 2449,15, | 2449,16, | 2449,17, | 2449,18, | 2449,19, | 2449,20, | 2449,21, | 2449,22, | 2449,23, | 2449,24, | 2449,25, | 2449,26, | 2449,27, | 2449,28, | 2449,29, | 2449,30, | 2449,31, | 2449,32, | 2449,33, | 2449,34, | 2449,35, | 2449,36, | 2449,37, | 2449,38, | 2449,39, | 2449,40, | 2449,41, | 2449,42, | 2449,43, | 2449,44, | 2449,45, | 2449,46, | 2449,47, | 2449,48, | 2449,49, | 2449,50, | 2449,51, | 2449,52, | 2449,53, | 2449,54, | 2449,55, | 2449,56, | 2449,57, | 2449,58, | 2449,59, | 2449,60, | 2449,61, | 2449,62, | 2449,63, | 2449,64, | 2449,65, | 2449,66, | 2449,67, | 2449,68, | 2449,69, | 2449,70, | 2449,71, | 2449,72, | 2449,73, | 2449,74, | 2449,75, | 2449,76, | 2449,77, | 2449,78, | 2449,79, | 2449,80, | 2449,81, | 2449,82, | 2449,83, | 2449,84, | 2449,85, | 2450,1, | 2450,2, | 2450,3, | 2450,4, | 2450,5, | 2450,6, | 2450,7, | 2450,8, | 2450,9, | 2450,10, | 2450,11, | 2450,12, | 2450,13, | 2450,14, | 2450,15, | 2450,16, | 2450,17, | 2450,18, | 2450,19, | 2450,20, | 2450,21, | 2450,22, | 2450,23, | 2450,24, | 2450,25, | 2450,26, | 2450,27, | 2450,28, | 2450,29, | 2450,30, | 2450,31, | 2450,32, | 2450,33, | 2450,34, | 2450,35, | 2450,36, | 2450,37, | 2450,38, | 2450,39, | 2450,40, | 2450,41, | 2450,42, | 2450,43, | 2450,44, | 2450,45, | 2450,46, | 2450,47, | 2450,48, | 2450,49, | 2450,50, | 2450,51, | 2450,52, | 2450,53, | 2450,54, | 2450,55, | 2450,56, | 2450,57, | 2450,58, | 2450,59, | 2450,60, | 2450,61, | 2450,62, | 2450,63, | 2450,64, | 2450,65, | 2450,66, | 2450,67, | 2450,68, | 2450,69, | 2450,70, | 2450,71, | 2450,72, | 2450,73, | 2450,74, | 2450,75, | 2450,76, | 2450,77, | 2450,78, | 2450,79, | 2450,80, | 2450,81, | 2450,82, | 2450,83, | 2450,84, | 2450,85, | 2451,1, | 2451,2, | 2451,3, | 2451,4, | 2451,5, | 2451,6, | 2451,7, | 2451,8, | 2451,9, | 2451,10, | 2451,11, | 2451,12, | 2451,13, | 2451,14, | 2451,15, | 2451,16, | 2451,17, | 2451,18, | 2451,19, | 2451,20, | 2451,21, | 2451,22, | 2451,23, | 2451,24, | 2451,25, | 2451,26, | 2451,27, | 2451,28, | 2451,29, | 2451,30, | 2451,31, | 2451,32, | 2451,33, | 2451,34, | 2451,35, | 2451,36, | 2451,37, | 2451,38, | 2451,39, | 2451,40, | 2451,41, | 2451,42, | 2451,43, | 2451,44, | 2451,45, | 2451,46, | 2451,47, | 2451,48, | 2451,49, | 2451,50, | 2451,51, | 2451,52, | 2451,53, | 2451,54, | 2451,55, | 2451,56, | 2451,57, | 2451,58, | 2451,59, | 2451,60, | 2451,61, | 2451,62, | 2451,63, | 2451,64, | 2451,65, | 2451,66, | 2451,67, | 2451,68, | 2451,69, | 2451,70, | 2451,71, | 2451,72, | 2451,73, | 2451,74, | 2451,75, | 2451,76, | 2451,77, | 2451,78, | 2451,79, | 2451,80, | 2451,81, | 2451,82, | 2451,83, | 2451,84, | 2451,85, | 2452,1, | 2452,2, | 2452,3, | 2452,4, | 2452,5, | 2452,6, | 2452,7, | 2452,8, | 2452,9, | 2452,10, | 2452,11, | 2452,12, | 2452,13, | 2452,14, | 2452,15, | 2452,16, | 2452,17, | 2452,18, | 2452,19, | 2452,20, | 2452,21, | 2452,22, | 2452,23, | 2452,24, | 2452,25, | 2452,26, | 2452,27, | 2452,28, | 2452,29, | 2452,30, | 2452,31, | 2452,32, | 2452,33, | 2452,34, | 2452,35, | 2452,36, | 2452,37, | 2452,38, | 2452,39, | 2452,40, | 2452,41, | 2452,42, | 2452,43, | 2452,44, | 2452,45, | 2452,46, | 2452,47, | 2452,48, | 2452,49, | 2452,50, | 2452,51, | 2452,52, | 2452,53, | 2452,54, | 2452,55, | 2452,56, | 2452,57, | 2452,58, | 2452,59, | 2452,60, | 2452,61, | 2452,62, | 2452,63, | 2452,64, | 2452,65, | 2452,66, | 2452,67, | 2452,68, | 2452,69, | 2452,70, | 2452,71, | 2452,72, | 2452,73, | 2452,74, | 2452,75, | 2452,76, | 2452,77, | 2452,78, | 2452,79, | 2452,80, | 2452,81, | 2452,82, | 2452,83, | 2452,84, | 2452,85, | 2453,1, | 2453,2, | 2453,3, | 2453,4, | 2453,5, | 2453,6, | 2453,7, | 2453,8, | 2453,9, | 2453,10, | 2453,11, | 2453,12, | 2453,13, | 2453,14, | 2453,15, | 2453,16, | 2453,17, | 2453,18, | 2453,19, | 2453,20, | 2453,21, | 2453,22, | 2453,23, | 2453,24, | 2453,25, | 2453,26, | 2453,27, | 2453,28, | 2453,29, | 2453,30, | 2453,31, | 2453,32, | 2453,33, | 2453,34, | 2453,35, | 2453,36, | 2453,37, | 2453,38, | 2453,39, | 2453,40, | 2453,41, | 2453,42, | 2453,43, | 2453,44, | 2453,45, | 2453,46, | 2453,47, | 2453,48, | 2453,49, | 2453,50, | 2453,51, | 2453,52, | 2453,53, | 2453,54, | 2453,55, | 2453,56, | 2453,57, | 2453,58, | 2453,59, | 2453,60, | 2453,61, | 2453,62, | 2453,63, | 2453,64, | 2453,65, | 2453,66, | 2453,67, | 2453,68, | 2453,69, | 2453,70, | 2453,71, | 2453,72, | 2453,73, | 2453,74, | 2453,75, | 2453,76, | 2453,77, | 2453,78, | 2453,79, | 2453,80, | 2453,81, | 2453,82, | 2453,83, | 2453,84, | 2453,85, | 2454,1, | 2454,2, | 2454,3, | 2454,4, | 2454,5, | 2454,6, | 2454,7, | 2454,8, | 2454,9, | 2454,10, | 2454,11, | 2454,12, | 2454,13, | 2454,14, | 2454,15, | 2454,16, | 2454,17, | 2454,18, | 2454,19, | 2454,20, | 2454,21, | 2454,22, | 2454,23, | 2454,24, | 2454,25, | 2454,26, | 2454,27, | 2454,28, | 2454,29, | 2454,30, | 2454,31, | 2454,32, | 2454,33, | 2454,34, | 2454,35, | 2454,36, | 2454,37, | 2454,38, | 2454,39, | 2454,40, | 2454,41, | 2454,42, | 2454,43, | 2454,44, | 2454,45, | 2454,46, | 2454,47, | 2454,48, | 2454,49, | 2454,50, | 2454,51, | 2454,52, | 2454,53, | 2454,54, | 2454,55, | 2454,56, | 2454,57, | 2454,58, | 2454,59, | 2454,60, | 2454,61, | 2454,62, | 2454,63, | 2454,64, | 2454,65, | 2454,66, | 2454,67, | 2454,68, | 2454,69, | 2454,70, | 2454,71, | 2454,72, | 2454,73, | 2454,74, | 2454,75, | 2454,76, | 2454,77, | 2454,78, | 2454,79, | 2454,80, | 2454,81, | 2454,82, | 2454,83, | 2454,84, | 2454,85, | 2455,1, | 2455,2, | 2455,3, | 2455,4, | 2455,5, | 2455,6, | 2455,7, | 2455,8, | 2455,9, | 2455,10, | 2455,11, | 2455,12, | 2455,13, | 2455,14, | 2455,15, | 2455,16, | 2455,17, | 2455,18, | 2455,19, | 2455,20, | 2455,21, | 2455,22, | 2455,23, | 2455,24, | 2455,25, | 2455,26, | 2455,27, | 2455,28, | 2455,29, | 2455,30, | 2455,31, | 2455,32, | 2455,33, | 2455,34, | 2455,35, | 2455,36, | 2455,37, | 2455,38, | 2455,39, | 2455,40, | 2455,41, | 2455,42, | 2455,43, | 2455,44, | 2455,45, | 2455,46, | 2455,47, | 2455,48, | 2455,49, | 2455,50, | 2455,51, | 2455,52, | 2455,53, | 2455,54, | 2455,55, | 2455,56, | 2455,57, | 2455,58, | 2455,59, | 2455,60, | 2455,61, | 2455,62, | 2455,63, | 2455,64, | 2455,65, | 2455,66, | 2455,67, | 2455,68, | 2455,69, | 2455,70, | 2455,71, | 2455,72, | 2455,73, | 2455,74, | 2455,75, | 2455,76, | 2455,77, | 2455,78, | 2455,79, | 2455,80, | 2455,81, | 2455,82, | 2455,83, | 2455,84, | 2455,85, | 2456,1, | 2456,2, | 2456,3, | 2456,4, | 2456,5, | 2456,6, | 2456,7, | 2456,8, | 2456,9, | 2456,10, | 2456,11, | 2456,12, | 2456,13, | 2456,14, | 2456,15, | 2456,16, | 2456,17, | 2456,18, | 2456,19, | 2456,20, | 2456,21, | 2456,22, | 2456,23, | 2456,24, | 2456,25, | 2456,26, | 2456,27, | 2456,28, | 2456,29, | 2456,30, | 2456,31, | 2456,32, | 2456,33, | 2456,34, | 2456,35, | 2456,36, | 2456,37, | 2456,38, | 2456,39, | 2456,40, | 2456,41, | 2456,42, | 2456,43, | 2456,44, | 2456,45, | 2456,46, | 2456,47, | 2456,48, | 2456,49, | 2456,50, | 2456,51, | 2456,52, | 2456,53, | 2456,54, | 2456,55, | 2456,56, | 2456,57, | 2456,58, | 2456,59, | 2456,60, | 2456,61, | 2456,62, | 2456,63, | 2456,64, | 2456,65, | 2456,66, | 2456,67, | 2456,68, | 2456,69, | 2456,70, | 2456,71, | 2456,72, | 2456,73, | 2456,74, | 2456,75, | 2456,76, | 2456,77, | 2456,78, | 2456,79, | 2456,80, | 2456,81, | 2456,82, | 2456,83, | 2456,84, | 2456,85, | 2457,1, | 2457,2, | 2457,3, | 2457,4, | 2457,5, | 2457,6, | 2457,7, | 2457,8, | 2457,9, | 2457,10, | 2457,11, | 2457,12, | 2457,13, | 2457,14, | 2457,15, | 2457,16, | 2457,17, | 2457,18, | 2457,19, | 2457,20, | 2457,21, | 2457,22, | 2457,23, | 2457,24, | 2457,25, | 2457,26, | 2457,27, | 2457,28, | 2457,29, | 2457,30, | 2457,31, | 2457,32, | 2457,33, | 2457,34, | 2457,35, | 2457,36, | 2457,37, | 2457,38, | 2457,39, | 2457,40, | 2457,41, | 2457,42, | 2457,43, | 2457,44, | 2457,45, | 2457,46, | 2457,47, | 2457,48, | 2457,49, | 2457,50, | 2457,51, | 2457,52, | 2457,53, | 2457,54, | 2457,55, | 2457,56, | 2457,57, | 2457,58, | 2457,59, | 2457,60, | 2457,61, | 2457,62, | 2457,63, | 2457,64, | 2457,65, | 2457,66, | 2457,67, | 2457,68, | 2457,69, | 2457,70, | 2457,71, | 2457,72, | 2457,73, | 2457,74, | 2457,75, | 2457,76, | 2457,77, | 2457,78, | 2457,79, | 2457,80, | 2457,81, | 2457,82, | 2457,83, | 2457,84, | 2457,85, | 2458,1, | 2458,2, | 2458,3, | 2458,4, | 2458,5, | 2458,6, | 2458,7, | 2458,8, | 2458,9, | 2458,10, | 2458,11, | 2458,12, | 2458,13, | 2458,14, | 2458,15, | 2458,16, | 2458,17, | 2458,18, | 2458,19, | 2458,20, | 2458,21, | 2458,22, | 2458,23, | 2458,24, | 2458,25, | 2458,26, | 2458,27, | 2458,28, | 2458,29, | 2458,30, | 2458,31, | 2458,32, | 2458,33, | 2458,34, | 2458,35, | 2458,36, | 2458,37, | 2458,38, | 2458,39, | 2458,40, | 2458,41, | 2458,42, | 2458,43, | 2458,44, | 2458,45, | 2458,46, | 2458,47, | 2458,48, | 2458,49, | 2458,50, | 2458,51, | 2458,52, | 2458,53, | 2458,54, | 2458,55, | 2458,56, | 2458,57, | 2458,58, | 2458,59, | 2458,60, | 2458,61, | 2458,62, | 2458,63, | 2458,64, | 2458,65, | 2458,66, | 2458,67, | 2458,68, | 2458,69, | 2458,70, | 2458,71, | 2458,72, | 2458,73, | 2458,74, | 2458,75, | 2458,76, | 2458,77, | 2458,78, | 2458,79, | 2458,80, | 2458,81, | 2458,82, | 2458,83, | 2458,84, | 2458,85, | 2459,1, | 2459,2, | 2459,3, | 2459,4, | 2459,5, | 2459,6, | 2459,7, | 2459,8, | 2459,9, | 2459,10, | 2459,11, | 2459,12, | 2459,13, | 2459,14, | 2459,15, | 2459,16, | 2459,17, | 2459,18, | 2459,19, | 2459,20, | 2459,21, | 2459,22, | 2459,23, | 2459,24, | 2459,25, | 2459,26, | 2459,27, | 2459,28, | 2459,29, | 2459,30, | 2459,31, | 2459,32, | 2459,33, | 2459,34, | 2459,35, | 2459,36, | 2459,37, | 2459,38, | 2459,39, | 2459,40, | 2459,41, | 2459,42, | 2459,43, | 2459,44, | 2459,45, | 2459,46, | 2459,47, | 2459,48, | 2459,49, | 2459,50, | 2459,51, | 2459,52, | 2459,53, | 2459,54, | 2459,55, | 2459,56, | 2459,57, | 2459,58, | 2459,59, | 2459,60, | 2459,61, | 2459,62, | 2459,63, | 2459,64, | 2459,65, | 2459,66, | 2459,67, | 2459,68, | 2459,69, | 2459,70, | 2459,71, | 2459,72, | 2459,73, | 2459,74, | 2459,75, | 2459,76, | 2459,77, | 2459,78, | 2459,79, | 2459,80, | 2459,81, | 2459,82, | 2459,83, | 2459,84, | 2459,85, | 2460,1, | 2460,2, | 2460,3, | 2460,4, | 2460,5, | 2460,6, | 2460,7, | 2460,8, | 2460,9, | 2460,10, | 2460,11, | 2460,12, | 2460,13, | 2460,14, | 2460,15, | 2460,16, | 2460,17, | 2460,18, | 2460,19, | 2460,20, | 2460,21, | 2460,22, | 2460,23, | 2460,24, | 2460,25, | 2460,26, | 2460,27, | 2460,28, | 2460,29, | 2460,30, | 2460,31, | 2460,32, | 2460,33, | 2460,34, | 2460,35, | 2460,36, | 2460,37, | 2460,38, | 2460,39, | 2460,40, | 2460,41, | 2460,42, | 2460,43, | 2460,44, | 2460,45, | 2460,46, | 2460,47, | 2460,48, | 2460,49, | 2460,50, | 2460,51, | 2460,52, | 2460,53, | 2460,54, | 2460,55, | 2460,56, | 2460,57, | 2460,58, | 2460,59, | 2460,60, | 2460,61, | 2460,62, | 2460,63, | 2460,64, | 2460,65, | 2460,66, | 2460,67, | 2460,68, | 2460,69, | 2460,70, | 2460,71, | 2460,72, | 2460,73, | 2460,74, | 2460,75, | 2460,76, | 2460,77, | 2460,78, | 2460,79, | 2460,80, | 2460,81, | 2460,82, | 2460,83, | 2460,84, | 2460,85, | 2461,1, | 2461,2, | 2461,3, | 2461,4, | 2461,5, | 2461,6, | 2461,7, | 2461,8, | 2461,9, | 2461,10, | 2461,11, | 2461,12, | 2461,13, | 2461,14, | 2461,15, | 2461,16, | 2461,17, | 2461,18, | 2461,19, | 2461,20, | 2461,21, | 2461,22, | 2461,23, | 2461,24, | 2461,25, | 2461,26, | 2461,27, | 2461,28, | 2461,29, | 2461,30, | 2461,31, | 2461,32, | 2461,33, | 2461,34, | 2461,35, | 2461,36, | 2461,37, | 2461,38, | 2461,39, | 2461,40, | 2461,41, | 2461,42, | 2461,43, | 2461,44, | 2461,45, | 2461,46, | 2461,47, | 2461,48, | 2461,49, | 2461,50, | 2461,51, | 2461,52, | 2461,53, | 2461,54, | 2461,55, | 2461,56, | 2461,57, | 2461,58, | 2461,59, | 2461,60, | 2461,61, | 2461,62, | 2461,63, | 2461,64, | 2461,65, | 2461,66, | 2461,67, | 2461,68, | 2461,69, | 2461,70, | 2461,71, | 2461,72, | 2461,73, | 2461,74, | 2461,75, | 2461,76, | 2461,77, | 2461,78, | 2461,79, | 2461,80, | 2461,81, | 2461,82, | 2461,83, | 2461,84, | 2461,85, | 2462,1, | 2462,2, | 2462,3, | 2462,4, | 2462,5, | 2462,6, | 2462,7, | 2462,8, | 2462,9, | 2462,10, | 2462,11, | 2462,12, | 2462,13, | 2462,14, | 2462,15, | 2462,16, | 2462,17, | 2462,18, | 2462,19, | 2462,20, | 2462,21, | 2462,22, | 2462,23, | 2462,24, | 2462,25, | 2462,26, | 2462,27, | 2462,28, | 2462,29, | 2462,30, | 2462,31, | 2462,32, | 2462,33, | 2462,34, | 2462,35, | 2462,36, | 2462,37, | 2462,38, | 2462,39, | 2462,40, | 2462,41, | 2462,42, | 2462,43, | 2462,44, | 2462,45, | 2462,46, | 2462,47, | 2462,48, | 2462,49, | 2462,50, | 2462,51, | 2462,52, | 2462,53, | 2462,54, | 2462,55, | 2462,56, | 2462,57, | 2462,58, | 2462,59, | 2462,60, | 2462,61, | 2462,62, | 2462,63, | 2462,64, | 2462,65, | 2462,66, | 2462,67, | 2462,68, | 2462,69, | 2462,70, | 2462,71, | 2462,72, | 2462,73, | 2462,74, | 2462,75, | 2462,76, | 2462,77, | 2462,78, | 2462,79, | 2462,80, | 2462,81, | 2462,82, | 2462,83, | 2462,84, | 2462,85, | 2463,1, | 2463,2, | 2463,3, | 2463,4, | 2463,5, | 2463,6, | 2463,7, | 2463,8, | 2463,9, | 2463,10, | 2463,11, | 2463,12, | 2463,13, | 2463,14, | 2463,15, | 2463,16, | 2463,17, | 2463,18, | 2463,19, | 2463,20, | 2463,21, | 2463,22, | 2463,23, | 2463,24, | 2463,25, | 2463,26, | 2463,27, | 2463,28, | 2463,29, | 2463,30, | 2463,31, | 2463,32, | 2463,33, | 2463,34, | 2463,35, | 2463,36, | 2463,37, | 2463,38, | 2463,39, | 2463,40, | 2463,41, | 2463,42, | 2463,43, | 2463,44, | 2463,45, | 2463,46, | 2463,47, | 2463,48, | 2463,49, | 2463,50, | 2463,51, | 2463,52, | 2463,53, | 2463,54, | 2463,55, | 2463,56, | 2463,57, | 2463,58, | 2463,59, | 2463,60, | 2463,61, | 2463,62, | 2463,63, | 2463,64, | 2463,65, | 2463,66, | 2463,67, | 2463,68, | 2463,69, | 2463,70, | 2463,71, | 2463,72, | 2463,73, | 2463,74, | 2463,75, | 2463,76, | 2463,77, | 2463,78, | 2463,79, | 2463,80, | 2463,81, | 2463,82, | 2463,83, | 2463,84, | 2463,85, | 2464,1, | 2464,2, | 2464,3, | 2464,4, | 2464,5, | 2464,6, | 2464,7, | 2464,8, | 2464,9, | 2464,10, | 2464,11, | 2464,12, | 2464,13, | 2464,14, | 2464,15, | 2464,16, | 2464,17, | 2464,18, | 2464,19, | 2464,20, | 2464,21, | 2464,22, | 2464,23, | 2464,24, | 2464,25, | 2464,26, | 2464,27, | 2464,28, | 2464,29, | 2464,30, | 2464,31, | 2464,32, | 2464,33, | 2464,34, | 2464,35, | 2464,36, | 2464,37, | 2464,38, | 2464,39, | 2464,40, | 2464,41, | 2464,42, | 2464,43, | 2464,44, | 2464,45, | 2464,46, | 2464,47, | 2464,48, | 2464,49, | 2464,50, | 2464,51, | 2464,52, | 2464,53, | 2464,54, | 2464,55, | 2464,56, | 2464,57, | 2464,58, | 2464,59, | 2464,60, | 2464,61, | 2464,62, | 2464,63, | 2464,64, | 2464,65, | 2464,66, | 2464,67, | 2464,68, | 2464,69, | 2464,70, | 2464,71, | 2464,72, | 2464,73, | 2464,74, | 2464,75, | 2464,76, | 2464,77, | 2464,78, | 2464,79, | 2464,80, | 2464,81, | 2464,82, | 2464,83, | 2464,84, | 2464,85, | 2465,1, | 2465,2, | 2465,3, | 2465,4, | 2465,5, | 2465,6, | 2465,7, | 2465,8, | 2465,9, | 2465,10, | 2465,11, | 2465,12, | 2465,13, | 2465,14, | 2465,15, | 2465,16, | 2465,17, | 2465,18, | 2465,19, | 2465,20, | 2465,21, | 2465,22, | 2465,23, | 2465,24, | 2465,25, | 2465,26, | 2465,27, | 2465,28, | 2465,29, | 2465,30, | 2465,31, | 2465,32, | 2465,33, | 2465,34, | 2465,35, | 2465,36, | 2465,37, | 2465,38, | 2465,39, | 2465,40, | 2465,41, | 2465,42, | 2465,43, | 2465,44, | 2465,45, | 2465,46, | 2465,47, | 2465,48, | 2465,49, | 2465,50, | 2465,51, | 2465,52, | 2465,53, | 2465,54, | 2465,55, | 2465,56, | 2465,57, | 2465,58, | 2465,59, | 2465,60, | 2465,61, | 2465,62, | 2465,63, | 2465,64, | 2465,65, | 2465,66, | 2465,67, | 2465,68, | 2465,69, | 2465,70, | 2465,71, | 2465,72, | 2465,73, | 2465,74, | 2465,75, | 2465,76, | 2465,77, | 2465,78, | 2465,79, | 2465,80, | 2465,81, | 2465,82, | 2465,83, | 2465,84, | 2465,85, | 2466,1, | 2466,2, | 2466,3, | 2466,4, | 2466,5, | 2466,6, | 2466,7, | 2466,8, | 2466,9, | 2466,10, | 2466,11, | 2466,12, | 2466,13, | 2466,14, | 2466,15, | 2466,16, | 2466,17, | 2466,18, | 2466,19, | 2466,20, | 2466,21, | 2466,22, | 2466,23, | 2466,24, | 2466,25, | 2466,26, | 2466,27, | 2466,28, | 2466,29, | 2466,30, | 2466,31, | 2466,32, | 2466,33, | 2466,34, | 2466,35, | 2466,36, | 2466,37, | 2466,38, | 2466,39, | 2466,40, | 2466,41, | 2466,42, | 2466,43, | 2466,44, | 2466,45, | 2466,46, | 2466,47, | 2466,48, | 2466,49, | 2466,50, | 2466,51, | 2466,52, | 2466,53, | 2466,54, | 2466,55, | 2466,56, | 2466,57, | 2466,58, | 2466,59, | 2466,60, | 2466,61, | 2466,62, | 2466,63, | 2466,64, | 2466,65, | 2466,66, | 2466,67, | 2466,68, | 2466,69, | 2466,70, | 2466,71, | 2466,72, | 2466,73, | 2466,74, | 2466,75, | 2466,76, | 2466,77, | 2466,78, | 2466,79, | 2466,80, | 2466,81, | 2466,82, | 2466,83, | 2466,84, | 2466,85, | 2467,1, | 2467,2, | 2467,3, | 2467,4, | 2467,5, | 2467,6, | 2467,7, | 2467,8, | 2467,9, | 2467,10, | 2467,11, | 2467,12, | 2467,13, | 2467,14, | 2467,15, | 2467,16, | 2467,17, | 2467,18, | 2467,19, | 2467,20, | 2467,21, | 2467,22, | 2467,23, | 2467,24, | 2467,25, | 2467,26, | 2467,27, | 2467,28, | 2467,29, | 2467,30, | 2467,31, | 2467,32, | 2467,33, | 2467,34, | 2467,35, | 2467,36, | 2467,37, | 2467,38, | 2467,39, | 2467,40, | 2467,41, | 2467,42, | 2467,43, | 2467,44, | 2467,45, | 2467,46, | 2467,47, | 2467,48, | 2467,49, | 2467,50, | 2467,51, | 2467,52, | 2467,53, | 2467,54, | 2467,55, | 2467,56, | 2467,57, | 2467,58, | 2467,59, | 2467,60, | 2467,61, | 2467,62, | 2467,63, | 2467,64, | 2467,65, | 2467,66, | 2467,67, | 2467,68, | 2467,69, | 2467,70, | 2467,71, | 2467,72, | 2467,73, | 2467,74, | 2467,75, | 2467,76, | 2467,77, | 2467,78, | 2467,79, | 2467,80, | 2467,81, | 2467,82, | 2467,83, | 2467,84, | 2467,85, | 2468,1, | 2468,2, | 2468,3, | 2468,4, | 2468,5, | 2468,6, | 2468,7, | 2468,8, | 2468,9, | 2468,10, | 2468,11, | 2468,12, | 2468,13, | 2468,14, | 2468,15, | 2468,16, | 2468,17, | 2468,18, | 2468,19, | 2468,20, | 2468,21, | 2468,22, | 2468,23, | 2468,24, | 2468,25, | 2468,26, | 2468,27, | 2468,28, | 2468,29, | 2468,30, | 2468,31, | 2468,32, | 2468,33, | 2468,34, | 2468,35, | 2468,36, | 2468,37, | 2468,38, | 2468,39, | 2468,40, | 2468,41, | 2468,42, | 2468,43, | 2468,44, | 2468,45, | 2468,46, | 2468,47, | 2468,48, | 2468,49, | 2468,50, | 2468,51, | 2468,52, | 2468,53, | 2468,54, | 2468,55, | 2468,56, | 2468,57, | 2468,58, | 2468,59, | 2468,60, | 2468,61, | 2468,62, | 2468,63, | 2468,64, | 2468,65, | 2468,66, | 2468,67, | 2468,68, | 2468,69, | 2468,70, | 2468,71, | 2468,72, | 2468,73, | 2468,74, | 2468,75, | 2468,76, | 2468,77, | 2468,78, | 2468,79, | 2468,80, | 2468,81, | 2468,82, | 2468,83, | 2468,84, | 2468,85, | 2469,1, | 2469,2, | 2469,3, | 2469,4, | 2469,5, | 2469,6, | 2469,7, | 2469,8, | 2469,9, | 2469,10, | 2469,11, | 2469,12, | 2469,13, | 2469,14, | 2469,15, | 2469,16, | 2469,17, | 2469,18, | 2469,19, | 2469,20, | 2469,21, | 2469,22, | 2469,23, | 2469,24, | 2469,25, | 2469,26, | 2469,27, | 2469,28, | 2469,29, | 2469,30, | 2469,31, | 2469,32, | 2469,33, | 2469,34, | 2469,35, | 2469,36, | 2469,37, | 2469,38, | 2469,39, | 2469,40, | 2469,41, | 2469,42, | 2469,43, | 2469,44, | 2469,45, | 2469,46, | 2469,47, | 2469,48, | 2469,49, | 2469,50, | 2469,51, | 2469,52, | 2469,53, | 2469,54, | 2469,55, | 2469,56, | 2469,57, | 2469,58, | 2469,59, | 2469,60, | 2469,61, | 2469,62, | 2469,63, | 2469,64, | 2469,65, | 2469,66, | 2469,67, | 2469,68, | 2469,69, | 2469,70, | 2469,71, | 2469,72, | 2469,73, | 2469,74, | 2469,75, | 2469,76, | 2469,77, | 2469,78, | 2469,79, | 2469,80, | 2469,81, | 2469,82, | 2469,83, | 2469,84, | 2469,85, | 2470,1, | 2470,2, | 2470,3, | 2470,4, | 2470,5, | 2470,6, | 2470,7, | 2470,8, | 2470,9, | 2470,10, | 2470,11, | 2470,12, | 2470,13, | 2470,14, | 2470,15, | 2470,16, | 2470,17, | 2470,18, | 2470,19, | 2470,20, | 2470,21, | 2470,22, | 2470,23, | 2470,24, | 2470,25, | 2470,26, | 2470,27, | 2470,28, | 2470,29, | 2470,30, | 2470,31, | 2470,32, | 2470,33, | 2470,34, | 2470,35, | 2470,36, | 2470,37, | 2470,38, | 2470,39, | 2470,40, | 2470,41, | 2470,42, | 2470,43, | 2470,44, | 2470,45, | 2470,46, | 2470,47, | 2470,48, | 2470,49, | 2470,50, | 2470,51, | 2470,52, | 2470,53, | 2470,54, | 2470,55, | 2470,56, | 2470,57, | 2470,58, | 2470,59, | 2470,60, | 2470,61, | 2470,62, | 2470,63, | 2470,64, | 2470,65, | 2470,66, | 2470,67, | 2470,68, | 2470,69, | 2470,70, | 2470,71, | 2470,72, | 2470,73, | 2470,74, | 2470,75, | 2470,76, | 2470,77, | 2470,78, | 2470,79, | 2470,80, | 2470,81, | 2470,82, | 2470,83, | 2470,84, | 2470,85, | 2471,1, | 2471,2, | 2471,3, | 2471,4, | 2471,5, | 2471,6, | 2471,7, | 2471,8, | 2471,9, | 2471,10, | 2471,11, | 2471,12, | 2471,13, | 2471,14, | 2471,15, | 2471,16, | 2471,17, | 2471,18, | 2471,19, | 2471,20, | 2471,21, | 2471,22, | 2471,23, | 2471,24, | 2471,25, | 2471,26, | 2471,27, | 2471,28, | 2471,29, | 2471,30, | 2471,31, | 2471,32, | 2471,33, | 2471,34, | 2471,35, | 2471,36, | 2471,37, | 2471,38, | 2471,39, | 2471,40, | 2471,41, | 2471,42, | 2471,43, | 2471,44, | 2471,45, | 2471,46, | 2471,47, | 2471,48, | 2471,49, | 2471,50, | 2471,51, | 2471,52, | 2471,53, | 2471,54, | 2471,55, | 2471,56, | 2471,57, | 2471,58, | 2471,59, | 2471,60, | 2471,61, | 2471,62, | 2471,63, | 2471,64, | 2471,65, | 2471,66, | 2471,67, | 2471,68, | 2471,69, | 2471,70, | 2471,71, | 2471,72, | 2471,73, | 2471,74, | 2471,75, | 2471,76, | 2471,77, | 2471,78, | 2471,79, | 2471,80, | 2471,81, | 2471,82, | 2471,83, | 2471,84, | 2471,85, | 2472,1, | 2472,2, | 2472,3, | 2472,4, | 2472,5, | 2472,6, | 2472,7, | 2472,8, | 2472,9, | 2472,10, | 2472,11, | 2472,12, | 2472,13, | 2472,14, | 2472,15, | 2472,16, | 2472,17, | 2472,18, | 2472,19, | 2472,20, | 2472,21, | 2472,22, | 2472,23, | 2472,24, | 2472,25, | 2472,26, | 2472,27, | 2472,28, | 2472,29, | 2472,30, | 2472,31, | 2472,32, | 2472,33, | 2472,34, | 2472,35, | 2472,36, | 2472,37, | 2472,38, | 2472,39, | 2472,40, | 2472,41, | 2472,42, | 2472,43, | 2472,44, | 2472,45, | 2472,46, | 2472,47, | 2472,48, | 2472,49, | 2472,50, | 2472,51, | 2472,52, | 2472,53, | 2472,54, | 2472,55, | 2472,56, | 2472,57, | 2472,58, | 2472,59, | 2472,60, | 2472,61, | 2472,62, | 2472,63, | 2472,64, | 2472,65, | 2472,66, | 2472,67, | 2472,68, | 2472,69, | 2472,70, | 2472,71, | 2472,72, | 2472,73, | 2472,74, | 2472,75, | 2472,76, | 2472,77, | 2472,78, | 2472,79, | 2472,80, | 2472,81, | 2472,82, | 2472,83, | 2472,84, | 2472,85, | 2473,1, | 2473,2, | 2473,3, | 2473,4, | 2473,5, | 2473,6, | 2473,7, | 2473,8, | 2473,9, | 2473,10, | 2473,11, | 2473,12, | 2473,13, | 2473,14, | 2473,15, | 2473,16, | 2473,17, | 2473,18, | 2473,19, | 2473,20, | 2473,21, | 2473,22, | 2473,23, | 2473,24, | 2473,25, | 2473,26, | 2473,27, | 2473,28, | 2473,29, | 2473,30, | 2473,31, | 2473,32, | 2473,33, | 2473,34, | 2473,35, | 2473,36, | 2473,37, | 2473,38, | 2473,39, | 2473,40, | 2473,41, | 2473,42, | 2473,43, | 2473,44, | 2473,45, | 2473,46, | 2473,47, | 2473,48, | 2473,49, | 2473,50, | 2473,51, | 2473,52, | 2473,53, | 2473,54, | 2473,55, | 2473,56, | 2473,57, | 2473,58, | 2473,59, | 2473,60, | 2473,61, | 2473,62, | 2473,63, | 2473,64, | 2473,65, | 2473,66, | 2473,67, | 2473,68, | 2473,69, | 2473,70, | 2473,71, | 2473,72, | 2473,73, | 2473,74, | 2473,75, | 2473,76, | 2473,77, | 2473,78, | 2473,79, | 2473,80, | 2473,81, | 2473,82, | 2473,83, | 2473,84, | 2473,85, | 2474,1, | 2474,2, | 2474,3, | 2474,4, | 2474,5, | 2474,6, | 2474,7, | 2474,8, | 2474,9, | 2474,10, | 2474,11, | 2474,12, | 2474,13, | 2474,14, | 2474,15, | 2474,16, | 2474,17, | 2474,18, | 2474,19, | 2474,20, | 2474,21, | 2474,22, | 2474,23, | 2474,24, | 2474,25, | 2474,26, | 2474,27, | 2474,28, | 2474,29, | 2474,30, | 2474,31, | 2474,32, | 2474,33, | 2474,34, | 2474,35, | 2474,36, | 2474,37, | 2474,38, | 2474,39, | 2474,40, | 2474,41, | 2474,42, | 2474,43, | 2474,44, | 2474,45, | 2474,46, | 2474,47, | 2474,48, | 2474,49, | 2474,50, | 2474,51, | 2474,52, | 2474,53, | 2474,54, | 2474,55, | 2474,56, | 2474,57, | 2474,58, | 2474,59, | 2474,60, | 2474,61, | 2474,62, | 2474,63, | 2474,64, | 2474,65, | 2474,66, | 2474,67, | 2474,68, | 2474,69, | 2474,70, | 2474,71, | 2474,72, | 2474,73, | 2474,74, | 2474,75, | 2474,76, | 2474,77, | 2474,78, | 2474,79, | 2474,80, | 2474,81, | 2474,82, | 2474,83, | 2474,84, | 2474,85, | 2475,1, | 2475,2, | 2475,3, | 2475,4, | 2475,5, | 2475,6, | 2475,7, | 2475,8, | 2475,9, | 2475,10, | 2475,11, | 2475,12, | 2475,13, | 2475,14, | 2475,15, | 2475,16, | 2475,17, | 2475,18, | 2475,19, | 2475,20, | 2475,21, | 2475,22, | 2475,23, | 2475,24, | 2475,25, | 2475,26, | 2475,27, | 2475,28, | 2475,29, | 2475,30, | 2475,31, | 2475,32, | 2475,33, | 2475,34, | 2475,35, | 2475,36, | 2475,37, | 2475,38, | 2475,39, | 2475,40, | 2475,41, | 2475,42, | 2475,43, | 2475,44, | 2475,45, | 2475,46, | 2475,47, | 2475,48, | 2475,49, | 2475,50, | 2475,51, | 2475,52, | 2475,53, | 2475,54, | 2475,55, | 2475,56, | 2475,57, | 2475,58, | 2475,59, | 2475,60, | 2475,61, | 2475,62, | 2475,63, | 2475,64, | 2475,65, | 2475,66, | 2475,67, | 2475,68, | 2475,69, | 2475,70, | 2475,71, | 2475,72, | 2475,73, | 2475,74, | 2475,75, | 2475,76, | 2475,77, | 2475,78, | 2475,79, | 2475,80, | 2475,81, | 2475,82, | 2475,83, | 2475,84, | 2475,85, | 2476,1, | 2476,2, | 2476,3, | 2476,4, | 2476,5, | 2476,6, | 2476,7, | 2476,8, | 2476,9, | 2476,10, | 2476,11, | 2476,12, | 2476,13, | 2476,14, | 2476,15, | 2476,16, | 2476,17, | 2476,18, | 2476,19, | 2476,20, | 2476,21, | 2476,22, | 2476,23, | 2476,24, | 2476,25, | 2476,26, | 2476,27, | 2476,28, | 2476,29, | 2476,30, | 2476,31, | 2476,32, | 2476,33, | 2476,34, | 2476,35, | 2476,36, | 2476,37, | 2476,38, | 2476,39, | 2476,40, | 2476,41, | 2476,42, | 2476,43, | 2476,44, | 2476,45, | 2476,46, | 2476,47, | 2476,48, | 2476,49, | 2476,50, | 2476,51, | 2476,52, | 2476,53, | 2476,54, | 2476,55, | 2476,56, | 2476,57, | 2476,58, | 2476,59, | 2476,60, | 2476,61, | 2476,62, | 2476,63, | 2476,64, | 2476,65, | 2476,66, | 2476,67, | 2476,68, | 2476,69, | 2476,70, | 2476,71, | 2476,72, | 2476,73, | 2476,74, | 2476,75, | 2476,76, | 2476,77, | 2476,78, | 2476,79, | 2476,80, | 2476,81, | 2476,82, | 2476,83, | 2476,84, | 2476,85, | 2477,1, | 2477,2, | 2477,3, | 2477,4, | 2477,5, | 2477,6, | 2477,7, | 2477,8, | 2477,9, | 2477,10, | 2477,11, | 2477,12, | 2477,13, | 2477,14, | 2477,15, | 2477,16, | 2477,17, | 2477,18, | 2477,19, | 2477,20, | 2477,21, | 2477,22, | 2477,23, | 2477,24, | 2477,25, | 2477,26, | 2477,27, | 2477,28, | 2477,29, | 2477,30, | 2477,31, | 2477,32, | 2477,33, | 2477,34, | 2477,35, | 2477,36, | 2477,37, | 2477,38, | 2477,39, | 2477,40, | 2477,41, | 2477,42, | 2477,43, | 2477,44, | 2477,45, | 2477,46, | 2477,47, | 2477,48, | 2477,49, | 2477,50, | 2477,51, | 2477,52, | 2477,53, | 2477,54, | 2477,55, | 2477,56, | 2477,57, | 2477,58, | 2477,59, | 2477,60, | 2477,61, | 2477,62, | 2477,63, | 2477,64, | 2477,65, | 2477,66, | 2477,67, | 2477,68, | 2477,69, | 2477,70, | 2477,71, | 2477,72, | 2477,73, | 2477,74, | 2477,75, | 2477,76, | 2477,77, | 2477,78, | 2477,79, | 2477,80, | 2477,81, | 2477,82, | 2477,83, | 2477,84, | 2477,85, | 2478,1, | 2478,2, | 2478,3, | 2478,4, | 2478,5, | 2478,6, | 2478,7, | 2478,8, | 2478,9, | 2478,10, | 2478,11, | 2478,12, | 2478,13, | 2478,14, | 2478,15, | 2478,16, | 2478,17, | 2478,18, | 2478,19, | 2478,20, | 2478,21, | 2478,22, | 2478,23, | 2478,24, | 2478,25, | 2478,26, | 2478,27, | 2478,28, | 2478,29, | 2478,30, | 2478,31, | 2478,32, | 2478,33, | 2478,34, | 2478,35, | 2478,36, | 2478,37, | 2478,38, | 2478,39, | 2478,40, | 2478,41, | 2478,42, | 2478,43, | 2478,44, | 2478,45, | 2478,46, | 2478,47, | 2478,48, | 2478,49, | 2478,50, | 2478,51, | 2478,52, | 2478,53, | 2478,54, | 2478,55, | 2478,56, | 2478,57, | 2478,58, | 2478,59, | 2478,60, | 2478,61, | 2478,62, | 2478,63, | 2478,64, | 2478,65, | 2478,66, | 2478,67, | 2478,68, | 2478,69, | 2478,70, | 2478,71, | 2478,72, | 2478,73, | 2478,74, | 2478,75, | 2478,76, | 2478,77, | 2478,78, | 2478,79, | 2478,80, | 2478,81, | 2478,82, | 2478,83, | 2478,84, | 2478,85, | 2479,1, | 2479,2, | 2479,3, | 2479,4, | 2479,5, | 2479,6, | 2479,7, | 2479,8, | 2479,9, | 2479,10, | 2479,11, | 2479,12, | 2479,13, | 2479,14, | 2479,15, | 2479,16, | 2479,17, | 2479,18, | 2479,19, | 2479,20, | 2479,21, | 2479,22, | 2479,23, | 2479,24, | 2479,25, | 2479,26, | 2479,27, | 2479,28, | 2479,29, | 2479,30, | 2479,31, | 2479,32, | 2479,33, | 2479,34, | 2479,35, | 2479,36, | 2479,37, | 2479,38, | 2479,39, | 2479,40, | 2479,41, | 2479,42, | 2479,43, | 2479,44, | 2479,45, | 2479,46, | 2479,47, | 2479,48, | 2479,49, | 2479,50, | 2479,51, | 2479,52, | 2479,53, | 2479,54, | 2479,55, | 2479,56, | 2479,57, | 2479,58, | 2479,59, | 2479,60, | 2479,61, | 2479,62, | 2479,63, | 2479,64, | 2479,65, | 2479,66, | 2479,67, | 2479,68, | 2479,69, | 2479,70, | 2479,71, | 2479,72, | 2479,73, | 2479,74, | 2479,75, | 2479,76, | 2479,77, | 2479,78, | 2479,79, | 2479,80, | 2479,81, | 2479,82, | 2479,83, | 2479,84, | 2479,85, | 2480,1, | 2480,2, | 2480,3, | 2480,4, | 2480,5, | 2480,6, | 2480,7, | 2480,8, | 2480,9, | 2480,10, | 2480,11, | 2480,12, | 2480,13, | 2480,14, | 2480,15, | 2480,16, | 2480,17, | 2480,18, | 2480,19, | 2480,20, | 2480,21, | 2480,22, | 2480,23, | 2480,24, | 2480,25, | 2480,26, | 2480,27, | 2480,28, | 2480,29, | 2480,30, | 2480,31, | 2480,32, | 2480,33, | 2480,34, | 2480,35, | 2480,36, | 2480,37, | 2480,38, | 2480,39, | 2480,40, | 2480,41, | 2480,42, | 2480,43, | 2480,44, | 2480,45, | 2480,46, | 2480,47, | 2480,48, | 2480,49, | 2480,50, | 2480,51, | 2480,52, | 2480,53, | 2480,54, | 2480,55, | 2480,56, | 2480,57, | 2480,58, | 2480,59, | 2480,60, | 2480,61, | 2480,62, | 2480,63, | 2480,64, | 2480,65, | 2480,66, | 2480,67, | 2480,68, | 2480,69, | 2480,70, | 2480,71, | 2480,72, | 2480,73, | 2480,74, | 2480,75, | 2480,76, | 2480,77, | 2480,78, | 2480,79, | 2480,80, | 2480,81, | 2480,82, | 2480,83, | 2480,84, | 2480,85, | 2481,1, | 2481,2, | 2481,3, | 2481,4, | 2481,5, | 2481,6, | 2481,7, | 2481,8, | 2481,9, | 2481,10, | 2481,11, | 2481,12, | 2481,13, | 2481,14, | 2481,15, | 2481,16, | 2481,17, | 2481,18, | 2481,19, | 2481,20, | 2481,21, | 2481,22, | 2481,23, | 2481,24, | 2481,25, | 2481,26, | 2481,27, | 2481,28, | 2481,29, | 2481,30, | 2481,31, | 2481,32, | 2481,33, | 2481,34, | 2481,35, | 2481,36, | 2481,37, | 2481,38, | 2481,39, | 2481,40, | 2481,41, | 2481,42, | 2481,43, | 2481,44, | 2481,45, | 2481,46, | 2481,47, | 2481,48, | 2481,49, | 2481,50, | 2481,51, | 2481,52, | 2481,53, | 2481,54, | 2481,55, | 2481,56, | 2481,57, | 2481,58, | 2481,59, | 2481,60, | 2481,61, | 2481,62, | 2481,63, | 2481,64, | 2481,65, | 2481,66, | 2481,67, | 2481,68, | 2481,69, | 2481,70, | 2481,71, | 2481,72, | 2481,73, | 2481,74, | 2481,75, | 2481,76, | 2481,77, | 2481,78, | 2481,79, | 2481,80, | 2481,81, | 2481,82, | 2481,83, | 2481,84, | 2481,85, | 2482,1, | 2482,2, | 2482,3, | 2482,4, | 2482,5, | 2482,6, | 2482,7, | 2482,8, | 2482,9, | 2482,10, | 2482,11, | 2482,12, | 2482,13, | 2482,14, | 2482,15, | 2482,16, | 2482,17, | 2482,18, | 2482,19, | 2482,20, | 2482,21, | 2482,22, | 2482,23, | 2482,24, | 2482,25, | 2482,26, | 2482,27, | 2482,28, | 2482,29, | 2482,30, | 2482,31, | 2482,32, | 2482,33, | 2482,34, | 2482,35, | 2482,36, | 2482,37, | 2482,38, | 2482,39, | 2482,40, | 2482,41, | 2482,42, | 2482,43, | 2482,44, | 2482,45, | 2482,46, | 2482,47, | 2482,48, | 2482,49, | 2482,50, | 2482,51, | 2482,52, | 2482,53, | 2482,54, | 2482,55, | 2482,56, | 2482,57, | 2482,58, | 2482,59, | 2482,60, | 2482,61, | 2482,62, | 2482,63, | 2482,64, | 2482,65, | 2482,66, | 2482,67, | 2482,68, | 2482,69, | 2482,70, | 2482,71, | 2482,72, | 2482,73, | 2482,74, | 2482,75, | 2482,76, | 2482,77, | 2482,78, | 2482,79, | 2482,80, | 2482,81, | 2482,82, | 2482,83, | 2482,84, | 2482,85, | 2483,1, | 2483,2, | 2483,3, | 2483,4, | 2483,5, | 2483,6, | 2483,7, | 2483,8, | 2483,9, | 2483,10, | 2483,11, | 2483,12, | 2483,13, | 2483,14, | 2483,15, | 2483,16, | 2483,17, | 2483,18, | 2483,19, | 2483,20, | 2483,21, | 2483,22, | 2483,23, | 2483,24, | 2483,25, | 2483,26, | 2483,27, | 2483,28, | 2483,29, | 2483,30, | 2483,31, | 2483,32, | 2483,33, | 2483,34, | 2483,35, | 2483,36, | 2483,37, | 2483,38, | 2483,39, | 2483,40, | 2483,41, | 2483,42, | 2483,43, | 2483,44, | 2483,45, | 2483,46, | 2483,47, | 2483,48, | 2483,49, | 2483,50, | 2483,51, | 2483,52, | 2483,53, | 2483,54, | 2483,55, | 2483,56, | 2483,57, | 2483,58, | 2483,59, | 2483,60, | 2483,61, | 2483,62, | 2483,63, | 2483,64, | 2483,65, | 2483,66, | 2483,67, | 2483,68, | 2483,69, | 2483,70, | 2483,71, | 2483,72, | 2483,73, | 2483,74, | 2483,75, | 2483,76, | 2483,77, | 2483,78, | 2483,79, | 2483,80, | 2483,81, | 2483,82, | 2483,83, | 2483,84, | 2483,85, | 2484,1, | 2484,2, | 2484,3, | 2484,4, | 2484,5, | 2484,6, | 2484,7, | 2484,8, | 2484,9, | 2484,10, | 2484,11, | 2484,12, | 2484,13, | 2484,14, | 2484,15, | 2484,16, | 2484,17, | 2484,18, | 2484,19, | 2484,20, | 2484,21, | 2484,22, | 2484,23, | 2484,24, | 2484,25, | 2484,26, | 2484,27, | 2484,28, | 2484,29, | 2484,30, | 2484,31, | 2484,32, | 2484,33, | 2484,34, | 2484,35, | 2484,36, | 2484,37, | 2484,38, | 2484,39, | 2484,40, | 2484,41, | 2484,42, | 2484,43, | 2484,44, | 2484,45, | 2484,46, | 2484,47, | 2484,48, | 2484,49, | 2484,50, | 2484,51, | 2484,52, | 2484,53, | 2484,54, | 2484,55, | 2484,56, | 2484,57, | 2484,58, | 2484,59, | 2484,60, | 2484,61, | 2484,62, | 2484,63, | 2484,64, | 2484,65, | 2484,66, | 2484,67, | 2484,68, | 2484,69, | 2484,70, | 2484,71, | 2484,72, | 2484,73, | 2484,74, | 2484,75, | 2484,76, | 2484,77, | 2484,78, | 2484,79, | 2484,80, | 2484,81, | 2484,82, | 2484,83, | 2484,84, | 2484,85, | 2485,1, | 2485,2, | 2485,3, | 2485,4, | 2485,5, | 2485,6, | 2485,7, | 2485,8, | 2485,9, | 2485,10, | 2485,11, | 2485,12, | 2485,13, | 2485,14, | 2485,15, | 2485,16, | 2485,17, | 2485,18, | 2485,19, | 2485,20, | 2485,21, | 2485,22, | 2485,23, | 2485,24, | 2485,25, | 2485,26, | 2485,27, | 2485,28, | 2485,29, | 2485,30, | 2485,31, | 2485,32, | 2485,33, | 2485,34, | 2485,35, | 2485,36, | 2485,37, | 2485,38, | 2485,39, | 2485,40, | 2485,41, | 2485,42, | 2485,43, | 2485,44, | 2485,45, | 2485,46, | 2485,47, | 2485,48, | 2485,49, | 2485,50, | 2485,51, | 2485,52, | 2485,53, | 2485,54, | 2485,55, | 2485,56, | 2485,57, | 2485,58, | 2485,59, | 2485,60, | 2485,61, | 2485,62, | 2485,63, | 2485,64, | 2485,65, | 2485,66, | 2485,67, | 2485,68, | 2485,69, | 2485,70, | 2485,71, | 2485,72, | 2485,73, | 2485,74, | 2485,75, | 2485,76, | 2485,77, | 2485,78, | 2485,79, | 2485,80, | 2485,81, | 2485,82, | 2485,83, | 2485,84, | 2485,85, | 2486,1, | 2486,2, | 2486,3, | 2486,4, | 2486,5, | 2486,6, | 2486,7, | 2486,8, | 2486,9, | 2486,10, | 2486,11, | 2486,12, | 2486,13, | 2486,14, | 2486,15, | 2486,16, | 2486,17, | 2486,18, | 2486,19, | 2486,20, | 2486,21, | 2486,22, | 2486,23, | 2486,24, | 2486,25, | 2486,26, | 2486,27, | 2486,28, | 2486,29, | 2486,30, | 2486,31, | 2486,32, | 2486,33, | 2486,34, | 2486,35, | 2486,36, | 2486,37, | 2486,38, | 2486,39, | 2486,40, | 2486,41, | 2486,42, | 2486,43, | 2486,44, | 2486,45, | 2486,46, | 2486,47, | 2486,48, | 2486,49, | 2486,50, | 2486,51, | 2486,52, | 2486,53, | 2486,54, | 2486,55, | 2486,56, | 2486,57, | 2486,58, | 2486,59, | 2486,60, | 2486,61, | 2486,62, | 2486,63, | 2486,64, | 2486,65, | 2486,66, | 2486,67, | 2486,68, | 2486,69, | 2486,70, | 2486,71, | 2486,72, | 2486,73, | 2486,74, | 2486,75, | 2486,76, | 2486,77, | 2486,78, | 2486,79, | 2486,80, | 2486,81, | 2486,82, | 2486,83, | 2486,84, | 2486,85, | 2487,1, | 2487,2, | 2487,3, | 2487,4, | 2487,5, | 2487,6, | 2487,7, | 2487,8, | 2487,9, | 2487,10, | 2487,11, | 2487,12, | 2487,13, | 2487,14, | 2487,15, | 2487,16, | 2487,17, | 2487,18, | 2487,19, | 2487,20, | 2487,21, | 2487,22, | 2487,23, | 2487,24, | 2487,25, | 2487,26, | 2487,27, | 2487,28, | 2487,29, | 2487,30, | 2487,31, | 2487,32, | 2487,33, | 2487,34, | 2487,35, | 2487,36, | 2487,37, | 2487,38, | 2487,39, | 2487,40, | 2487,41, | 2487,42, | 2487,43, | 2487,44, | 2487,45, | 2487,46, | 2487,47, | 2487,48, | 2487,49, | 2487,50, | 2487,51, | 2487,52, | 2487,53, | 2487,54, | 2487,55, | 2487,56, | 2487,57, | 2487,58, | 2487,59, | 2487,60, | 2487,61, | 2487,62, | 2487,63, | 2487,64, | 2487,65, | 2487,66, | 2487,67, | 2487,68, | 2487,69, | 2487,70, | 2487,71, | 2487,72, | 2487,73, | 2487,74, | 2487,75, | 2487,76, | 2487,77, | 2487,78, | 2487,79, | 2487,80, | 2487,81, | 2487,82, | 2487,83, | 2487,84, | 2487,85, | 2488,1, | 2488,2, | 2488,3, | 2488,4, | 2488,5, | 2488,6, | 2488,7, | 2488,8, | 2488,9, | 2488,10, | 2488,11, | 2488,12, | 2488,13, | 2488,14, | 2488,15, | 2488,16, | 2488,17, | 2488,18, | 2488,19, | 2488,20, | 2488,21, | 2488,22, | 2488,23, | 2488,24, | 2488,25, | 2488,26, | 2488,27, | 2488,28, | 2488,29, | 2488,30, | 2488,31, | 2488,32, | 2488,33, | 2488,34, | 2488,35, | 2488,36, | 2488,37, | 2488,38, | 2488,39, | 2488,40, | 2488,41, | 2488,42, | 2488,43, | 2488,44, | 2488,45, | 2488,46, | 2488,47, | 2488,48, | 2488,49, | 2488,50, | 2488,51, | 2488,52, | 2488,53, | 2488,54, | 2488,55, | 2488,56, | 2488,57, | 2488,58, | 2488,59, | 2488,60, | 2488,61, | 2488,62, | 2488,63, | 2488,64, | 2488,65, | 2488,66, | 2488,67, | 2488,68, | 2488,69, | 2488,70, | 2488,71, | 2488,72, | 2488,73, | 2488,74, | 2488,75, | 2488,76, | 2488,77, | 2488,78, | 2488,79, | 2488,80, | 2488,81, | 2488,82, | 2488,83, | 2488,84, | 2488,85, | 2489,1, | 2489,2, | 2489,3, | 2489,4, | 2489,5, | 2489,6, | 2489,7, | 2489,8, | 2489,9, | 2489,10, | 2489,11, | 2489,12, | 2489,13, | 2489,14, | 2489,15, | 2489,16, | 2489,17, | 2489,18, | 2489,19, | 2489,20, | 2489,21, | 2489,22, | 2489,23, | 2489,24, | 2489,25, | 2489,26, | 2489,27, | 2489,28, | 2489,29, | 2489,30, | 2489,31, | 2489,32, | 2489,33, | 2489,34, | 2489,35, | 2489,36, | 2489,37, | 2489,38, | 2489,39, | 2489,40, | 2489,41, | 2489,42, | 2489,43, | 2489,44, | 2489,45, | 2489,46, | 2489,47, | 2489,48, | 2489,49, | 2489,50, | 2489,51, | 2489,52, | 2489,53, | 2489,54, | 2489,55, | 2489,56, | 2489,57, | 2489,58, | 2489,59, | 2489,60, | 2489,61, | 2489,62, | 2489,63, | 2489,64, | 2489,65, | 2489,66, | 2489,67, | 2489,68, | 2489,69, | 2489,70, | 2489,71, | 2489,72, | 2489,73, | 2489,74, | 2489,75, | 2489,76, | 2489,77, | 2489,78, | 2489,79, | 2489,80, | 2489,81, | 2489,82, | 2489,83, | 2489,84, | 2489,85, | 2490,1, | 2490,2, | 2490,3, | 2490,4, | 2490,5, | 2490,6, | 2490,7, | 2490,8, | 2490,9, | 2490,10, | 2490,11, | 2490,12, | 2490,13, | 2490,14, | 2490,15, | 2490,16, | 2490,17, | 2490,18, | 2490,19, | 2490,20, | 2490,21, | 2490,22, | 2490,23, | 2490,24, | 2490,25, | 2490,26, | 2490,27, | 2490,28, | 2490,29, | 2490,30, | 2490,31, | 2490,32, | 2490,33, | 2490,34, | 2490,35, | 2490,36, | 2490,37, | 2490,38, | 2490,39, | 2490,40, | 2490,41, | 2490,42, | 2490,43, | 2490,44, | 2490,45, | 2490,46, | 2490,47, | 2490,48, | 2490,49, | 2490,50, | 2490,51, | 2490,52, | 2490,53, | 2490,54, | 2490,55, | 2490,56, | 2490,57, | 2490,58, | 2490,59, | 2490,60, | 2490,61, | 2490,62, | 2490,63, | 2490,64, | 2490,65, | 2490,66, | 2490,67, | 2490,68, | 2490,69, | 2490,70, | 2490,71, | 2490,72, | 2490,73, | 2490,74, | 2490,75, | 2490,76, | 2490,77, | 2490,78, | 2490,79, | 2490,80, | 2490,81, | 2490,82, | 2490,83, | 2490,84, | 2490,85, | 2491,1, | 2491,2, | 2491,3, | 2491,4, | 2491,5, | 2491,6, | 2491,7, | 2491,8, | 2491,9, | 2491,10, | 2491,11, | 2491,12, | 2491,13, | 2491,14, | 2491,15, | 2491,16, | 2491,17, | 2491,18, | 2491,19, | 2491,20, | 2491,21, | 2491,22, | 2491,23, | 2491,24, | 2491,25, | 2491,26, | 2491,27, | 2491,28, | 2491,29, | 2491,30, | 2491,31, | 2491,32, | 2491,33, | 2491,34, | 2491,35, | 2491,36, | 2491,37, | 2491,38, | 2491,39, | 2491,40, | 2491,41, | 2491,42, | 2491,43, | 2491,44, | 2491,45, | 2491,46, | 2491,47, | 2491,48, | 2491,49, | 2491,50, | 2491,51, | 2491,52, | 2491,53, | 2491,54, | 2491,55, | 2491,56, | 2491,57, | 2491,58, | 2491,59, | 2491,60, | 2491,61, | 2491,62, | 2491,63, | 2491,64, | 2491,65, | 2491,66, | 2491,67, | 2491,68, | 2491,69, | 2491,70, | 2491,71, | 2491,72, | 2491,73, | 2491,74, | 2491,75, | 2491,76, | 2491,77, | 2491,78, | 2491,79, | 2491,80, | 2491,81, | 2491,82, | 2491,83, | 2491,84, | 2491,85, | 2492,1, | 2492,2, | 2492,3, | 2492,4, | 2492,5, | 2492,6, | 2492,7, | 2492,8, | 2492,9, | 2492,10, | 2492,11, | 2492,12, | 2492,13, | 2492,14, | 2492,15, | 2492,16, | 2492,17, | 2492,18, | 2492,19, | 2492,20, | 2492,21, | 2492,22, | 2492,23, | 2492,24, | 2492,25, | 2492,26, | 2492,27, | 2492,28, | 2492,29, | 2492,30, | 2492,31, | 2492,32, | 2492,33, | 2492,34, | 2492,35, | 2492,36, | 2492,37, | 2492,38, | 2492,39, | 2492,40, | 2492,41, | 2492,42, | 2492,43, | 2492,44, | 2492,45, | 2492,46, | 2492,47, | 2492,48, | 2492,49, | 2492,50, | 2492,51, | 2492,52, | 2492,53, | 2492,54, | 2492,55, | 2492,56, | 2492,57, | 2492,58, | 2492,59, | 2492,60, | 2492,61, | 2492,62, | 2492,63, | 2492,64, | 2492,65, | 2492,66, | 2492,67, | 2492,68, | 2492,69, | 2492,70, | 2492,71, | 2492,72, | 2492,73, | 2492,74, | 2492,75, | 2492,76, | 2492,77, | 2492,78, | 2492,79, | 2492,80, | 2492,81, | 2492,82, | 2492,83, | 2492,84, | 2492,85, | 2493,1, | 2493,2, | 2493,3, | 2493,4, | 2493,5, | 2493,6, | 2493,7, | 2493,8, | 2493,9, | 2493,10, | 2493,11, | 2493,12, | 2493,13, | 2493,14, | 2493,15, | 2493,16, | 2493,17, | 2493,18, | 2493,19, | 2493,20, | 2493,21, | 2493,22, | 2493,23, | 2493,24, | 2493,25, | 2493,26, | 2493,27, | 2493,28, | 2493,29, | 2493,30, | 2493,31, | 2493,32, | 2493,33, | 2493,34, | 2493,35, | 2493,36, | 2493,37, | 2493,38, | 2493,39, | 2493,40, | 2493,41, | 2493,42, | 2493,43, | 2493,44, | 2493,45, | 2493,46, | 2493,47, | 2493,48, | 2493,49, | 2493,50, | 2493,51, | 2493,52, | 2493,53, | 2493,54, | 2493,55, | 2493,56, | 2493,57, | 2493,58, | 2493,59, | 2493,60, | 2493,61, | 2493,62, | 2493,63, | 2493,64, | 2493,65, | 2493,66, | 2493,67, | 2493,68, | 2493,69, | 2493,70, | 2493,71, | 2493,72, | 2493,73, | 2493,74, | 2493,75, | 2493,76, | 2493,77, | 2493,78, | 2493,79, | 2493,80, | 2493,81, | 2493,82, | 2493,83, | 2493,84, | 2493,85, | 2494,1, | 2494,2, | 2494,3, | 2494,4, | 2494,5, | 2494,6, | 2494,7, | 2494,8, | 2494,9, | 2494,10, | 2494,11, | 2494,12, | 2494,13, | 2494,14, | 2494,15, | 2494,16, | 2494,17, | 2494,18, | 2494,19, | 2494,20, | 2494,21, | 2494,22, | 2494,23, | 2494,24, | 2494,25, | 2494,26, | 2494,27, | 2494,28, | 2494,29, | 2494,30, | 2494,31, | 2494,32, | 2494,33, | 2494,34, | 2494,35, | 2494,36, | 2494,37, | 2494,38, | 2494,39, | 2494,40, | 2494,41, | 2494,42, | 2494,43, | 2494,44, | 2494,45, | 2494,46, | 2494,47, | 2494,48, | 2494,49, | 2494,50, | 2494,51, | 2494,52, | 2494,53, | 2494,54, | 2494,55, | 2494,56, | 2494,57, | 2494,58, | 2494,59, | 2494,60, | 2494,61, | 2494,62, | 2494,63, | 2494,64, | 2494,65, | 2494,66, | 2494,67, | 2494,68, | 2494,69, | 2494,70, | 2494,71, | 2494,72, | 2494,73, | 2494,74, | 2494,75, | 2494,76, | 2494,77, | 2494,78, | 2494,79, | 2494,80, | 2494,81, | 2494,82, | 2494,83, | 2494,84, | 2494,85, | 2495,1, | 2495,2, | 2495,3, | 2495,4, | 2495,5, | 2495,6, | 2495,7, | 2495,8, | 2495,9, | 2495,10, | 2495,11, | 2495,12, | 2495,13, | 2495,14, | 2495,15, | 2495,16, | 2495,17, | 2495,18, | 2495,19, | 2495,20, | 2495,21, | 2495,22, | 2495,23, | 2495,24, | 2495,25, | 2495,26, | 2495,27, | 2495,28, | 2495,29, | 2495,30, | 2495,31, | 2495,32, | 2495,33, | 2495,34, | 2495,35, | 2495,36, | 2495,37, | 2495,38, | 2495,39, | 2495,40, | 2495,41, | 2495,42, | 2495,43, | 2495,44, | 2495,45, | 2495,46, | 2495,47, | 2495,48, | 2495,49, | 2495,50, | 2495,51, | 2495,52, | 2495,53, | 2495,54, | 2495,55, | 2495,56, | 2495,57, | 2495,58, | 2495,59, | 2495,60, | 2495,61, | 2495,62, | 2495,63, | 2495,64, | 2495,65, | 2495,66, | 2495,67, | 2495,68, | 2495,69, | 2495,70, | 2495,71, | 2495,72, | 2495,73, | 2495,74, | 2495,75, | 2495,76, | 2495,77, | 2495,78, | 2495,79, | 2495,80, | 2495,81, | 2495,82, | 2495,83, | 2495,84, | 2495,85, | 2496,1, | 2496,2, | 2496,3, | 2496,4, | 2496,5, | 2496,6, | 2496,7, | 2496,8, | 2496,9, | 2496,10, | 2496,11, | 2496,12, | 2496,13, | 2496,14, | 2496,15, | 2496,16, | 2496,17, | 2496,18, | 2496,19, | 2496,20, | 2496,21, | 2496,22, | 2496,23, | 2496,24, | 2496,25, | 2496,26, | 2496,27, | 2496,28, | 2496,29, | 2496,30, | 2496,31, | 2496,32, | 2496,33, | 2496,34, | 2496,35, | 2496,36, | 2496,37, | 2496,38, | 2496,39, | 2496,40, | 2496,41, | 2496,42, | 2496,43, | 2496,44, | 2496,45, | 2496,46, | 2496,47, | 2496,48, | 2496,49, | 2496,50, | 2496,51, | 2496,52, | 2496,53, | 2496,54, | 2496,55, | 2496,56, | 2496,57, | 2496,58, | 2496,59, | 2496,60, | 2496,61, | 2496,62, | 2496,63, | 2496,64, | 2496,65, | 2496,66, | 2496,67, | 2496,68, | 2496,69, | 2496,70, | 2496,71, | 2496,72, | 2496,73, | 2496,74, | 2496,75, | 2496,76, | 2496,77, | 2496,78, | 2496,79, | 2496,80, | 2496,81, | 2496,82, | 2496,83, | 2496,84, | 2496,85, | 2497,1, | 2497,2, | 2497,3, | 2497,4, | 2497,5, | 2497,6, | 2497,7, | 2497,8, | 2497,9, | 2497,10, | 2497,11, | 2497,12, | 2497,13, | 2497,14, | 2497,15, | 2497,16, | 2497,17, | 2497,18, | 2497,19, | 2497,20, | 2497,21, | 2497,22, | 2497,23, | 2497,24, | 2497,25, | 2497,26, | 2497,27, | 2497,28, | 2497,29, | 2497,30, | 2497,31, | 2497,32, | 2497,33, | 2497,34, | 2497,35, | 2497,36, | 2497,37, | 2497,38, | 2497,39, | 2497,40, | 2497,41, | 2497,42, | 2497,43, | 2497,44, | 2497,45, | 2497,46, | 2497,47, | 2497,48, | 2497,49, | 2497,50, | 2497,51, | 2497,52, | 2497,53, | 2497,54, | 2497,55, | 2497,56, | 2497,57, | 2497,58, | 2497,59, | 2497,60, | 2497,61, | 2497,62, | 2497,63, | 2497,64, | 2497,65, | 2497,66, | 2497,67, | 2497,68, | 2497,69, | 2497,70, | 2497,71, | 2497,72, | 2497,73, | 2497,74, | 2497,75, | 2497,76, | 2497,77, | 2497,78, | 2497,79, | 2497,80, | 2497,81, | 2497,82, | 2497,83, | 2497,84, | 2497,85, | 2498,1, | 2498,2, | 2498,3, | 2498,4, | 2498,5, | 2498,6, | 2498,7, | 2498,8, | 2498,9, | 2498,10, | 2498,11, | 2498,12, | 2498,13, | 2498,14, | 2498,15, | 2498,16, | 2498,17, | 2498,18, | 2498,19, | 2498,20, | 2498,21, | 2498,22, | 2498,23, | 2498,24, | 2498,25, | 2498,26, | 2498,27, | 2498,28, | 2498,29, | 2498,30, | 2498,31, | 2498,32, | 2498,33, | 2498,34, | 2498,35, | 2498,36, | 2498,37, | 2498,38, | 2498,39, | 2498,40, | 2498,41, | 2498,42, | 2498,43, | 2498,44, | 2498,45, | 2498,46, | 2498,47, | 2498,48, | 2498,49, | 2498,50, | 2498,51, | 2498,52, | 2498,53, | 2498,54, | 2498,55, | 2498,56, | 2498,57, | 2498,58, | 2498,59, | 2498,60, | 2498,61, | 2498,62, | 2498,63, | 2498,64, | 2498,65, | 2498,66, | 2498,67, | 2498,68, | 2498,69, | 2498,70, | 2498,71, | 2498,72, | 2498,73, | 2498,74, | 2498,75, | 2498,76, | 2498,77, | 2498,78, | 2498,79, | 2498,80, | 2498,81, | 2498,82, | 2498,83, | 2498,84, | 2498,85, | 2499,1, | 2499,2, | 2499,3, | 2499,4, | 2499,5, | 2499,6, | 2499,7, | 2499,8, | 2499,9, | 2499,10, | 2499,11, | 2499,12, | 2499,13, | 2499,14, | 2499,15, | 2499,16, | 2499,17, | 2499,18, | 2499,19, | 2499,20, | 2499,21, | 2499,22, | 2499,23, | 2499,24, | 2499,25, | 2499,26, | 2499,27, | 2499,28, | 2499,29, | 2499,30, | 2499,31, | 2499,32, | 2499,33, | 2499,34, | 2499,35, | 2499,36, | 2499,37, | 2499,38, | 2499,39, | 2499,40, | 2499,41, | 2499,42, | 2499,43, | 2499,44, | 2499,45, | 2499,46, | 2499,47, | 2499,48, | 2499,49, | 2499,50, | 2499,51, | 2499,52, | 2499,53, | 2499,54, | 2499,55, | 2499,56, | 2499,57, | 2499,58, | 2499,59, | 2499,60, | 2499,61, | 2499,62, | 2499,63, | 2499,64, | 2499,65, | 2499,66, | 2499,67, | 2499,68, | 2499,69, | 2499,70, | 2499,71, | 2499,72, | 2499,73, | 2499,74, | 2499,75, | 2499,76, | 2499,77, | 2499,78, | 2499,79, | 2499,80, | 2499,81, | 2499,82, | 2499,83, | 2499,84, | 2499,85, | 2500,1, | 2500,2, | 2500,3, | 2500,4, | 2500,5, | 2500,6, | 2500,7, | 2500,8, | 2500,9, | 2500,10, | 2500,11, | 2500,12, | 2500,13, | 2500,14, | 2500,15, | 2500,16, | 2500,17, | 2500,18, | 2500,19, | 2500,20, | 2500,21, | 2500,22, | 2500,23, | 2500,24, | 2500,25, | 2500,26, | 2500,27, | 2500,28, | 2500,29, | 2500,30, | 2500,31, | 2500,32, | 2500,33, | 2500,34, | 2500,35, | 2500,36, | 2500,37, | 2500,38, | 2500,39, | 2500,40, | 2500,41, | 2500,42, | 2500,43, | 2500,44, | 2500,45, | 2500,46, | 2500,47, | 2500,48, | 2500,49, | 2500,50, | 2500,51, | 2500,52, | 2500,53, | 2500,54, | 2500,55, | 2500,56, | 2500,57, | 2500,58, | 2500,59, | 2500,60, | 2500,61, | 2500,62, | 2500,63, | 2500,64, | 2500,65, | 2500,66, | 2500,67, | 2500,68, | 2500,69, | 2500,70, | 2500,71, | 2500,72, | 2500,73, | 2500,74, | 2500,75, | 2500,76, | 2500,77, | 2500,78, | 2500,79, | 2500,80, | 2500,81, | 2500,82, | 2500,83, | 2500,84, | 2500,85, | 2501,1, | 2501,2, | 2501,3, | 2501,4, | 2501,5, | 2501,6, | 2501,7, | 2501,8, | 2501,9, | 2501,10, | 2501,11, | 2501,12, | 2501,13, | 2501,14, | 2501,15, | 2501,16, | 2501,17, | 2501,18, | 2501,19, | 2501,20, | 2501,21, | 2501,22, | 2501,23, | 2501,24, | 2501,25, | 2501,26, | 2501,27, | 2501,28, | 2501,29, | 2501,30, | 2501,31, | 2501,32, | 2501,33, | 2501,34, | 2501,35, | 2501,36, | 2501,37, | 2501,38, | 2501,39, | 2501,40, | 2501,41, | 2501,42, | 2501,43, | 2501,44, | 2501,45, | 2501,46, | 2501,47, | 2501,48, | 2501,49, | 2501,50, | 2501,51, | 2501,52, | 2501,53, | 2501,54, | 2501,55, | 2501,56, | 2501,57, | 2501,58, | 2501,59, | 2501,60, | 2501,61, | 2501,62, | 2501,63, | 2501,64, | 2501,65, | 2501,66, | 2501,67, | 2501,68, | 2501,69, | 2501,70, | 2501,71, | 2501,72, | 2501,73, | 2501,74, | 2501,75, | 2501,76, | 2501,77, | 2501,78, | 2501,79, | 2501,80, | 2501,81, | 2501,82, | 2501,83, | 2501,84, | 2501,85, | 2502,1, | 2502,2, | 2502,3, | 2502,4, | 2502,5, | 2502,6, | 2502,7, | 2502,8, | 2502,9, | 2502,10, | 2502,11, | 2502,12, | 2502,13, | 2502,14, | 2502,15, | 2502,16, | 2502,17, | 2502,18, | 2502,19, | 2502,20, | 2502,21, | 2502,22, | 2502,23, | 2502,24, | 2502,25, | 2502,26, | 2502,27, | 2502,28, | 2502,29, | 2502,30, | 2502,31, | 2502,32, | 2502,33, | 2502,34, | 2502,35, | 2502,36, | 2502,37, | 2502,38, | 2502,39, | 2502,40, | 2502,41, | 2502,42, | 2502,43, | 2502,44, | 2502,45, | 2502,46, | 2502,47, | 2502,48, | 2502,49, | 2502,50, | 2502,51, | 2502,52, | 2502,53, | 2502,54, | 2502,55, | 2502,56, | 2502,57, | 2502,58, | 2502,59, | 2502,60, | 2502,61, | 2502,62, | 2502,63, | 2502,64, | 2502,65, | 2502,66, | 2502,67, | 2502,68, | 2502,69, | 2502,70, | 2502,71, | 2502,72, | 2502,73, | 2502,74, | 2502,75, | 2502,76, | 2502,77, | 2502,78, | 2502,79, | 2502,80, | 2502,81, | 2502,82, | 2502,83, | 2502,84, | 2502,85, | 2503,1, | 2503,2, | 2503,3, | 2503,4, | 2503,5, | 2503,6, | 2503,7, | 2503,8, | 2503,9, | 2503,10, | 2503,11, | 2503,12, | 2503,13, | 2503,14, | 2503,15, | 2503,16, | 2503,17, | 2503,18, | 2503,19, | 2503,20, | 2503,21, | 2503,22, | 2503,23, | 2503,24, | 2503,25, | 2503,26, | 2503,27, | 2503,28, | 2503,29, | 2503,30, | 2503,31, | 2503,32, | 2503,33, | 2503,34, | 2503,35, | 2503,36, | 2503,37, | 2503,38, | 2503,39, | 2503,40, | 2503,41, | 2503,42, | 2503,43, | 2503,44, | 2503,45, | 2503,46, | 2503,47, | 2503,48, | 2503,49, | 2503,50, | 2503,51, | 2503,52, | 2503,53, | 2503,54, | 2503,55, | 2503,56, | 2503,57, | 2503,58, | 2503,59, | 2503,60, | 2503,61, | 2503,62, | 2503,63, | 2503,64, | 2503,65, | 2503,66, | 2503,67, | 2503,68, | 2503,69, | 2503,70, | 2503,71, | 2503,72, | 2503,73, | 2503,74, | 2503,75, | 2503,76, | 2503,77, | 2503,78, | 2503,79, | 2503,80, | 2503,81, | 2503,82, | 2503,83, | 2503,84, | 2503,85, | 2504,1, | 2504,2, | 2504,3, | 2504,4, | 2504,5, | 2504,6, | 2504,7, | 2504,8, | 2504,9, | 2504,10, | 2504,11, | 2504,12, | 2504,13, | 2504,14, | 2504,15, | 2504,16, | 2504,17, | 2504,18, | 2504,19, | 2504,20, | 2504,21, | 2504,22, | 2504,23, | 2504,24, | 2504,25, | 2504,26, | 2504,27, | 2504,28, | 2504,29, | 2504,30, | 2504,31, | 2504,32, | 2504,33, | 2504,34, | 2504,35, | 2504,36, | 2504,37, | 2504,38, | 2504,39, | 2504,40, | 2504,41, | 2504,42, | 2504,43, | 2504,44, | 2504,45, | 2504,46, | 2504,47, | 2504,48, | 2504,49, | 2504,50, | 2504,51, | 2504,52, | 2504,53, | 2504,54, | 2504,55, | 2504,56, | 2504,57, | 2504,58, | 2504,59, | 2504,60, | 2504,61, | 2504,62, | 2504,63, | 2504,64, | 2504,65, | 2504,66, | 2504,67, | 2504,68, | 2504,69, | 2504,70, | 2504,71, | 2504,72, | 2504,73, | 2504,74, | 2504,75, | 2504,76, | 2504,77, | 2504,78, | 2504,79, | 2504,80, | 2504,81, | 2504,82, | 2504,83, | 2504,84, | 2504,85, | 2505,1, | 2505,2, | 2505,3, | 2505,4, | 2505,5, | 2505,6, | 2505,7, | 2505,8, | 2505,9, | 2505,10, | 2505,11, | 2505,12, | 2505,13, | 2505,14, | 2505,15, | 2505,16, | 2505,17, | 2505,18, | 2505,19, | 2505,20, | 2505,21, | 2505,22, | 2505,23, | 2505,24, | 2505,25, | 2505,26, | 2505,27, | 2505,28, | 2505,29, | 2505,30, | 2505,31, | 2505,32, | 2505,33, | 2505,34, | 2505,35, | 2505,36, | 2505,37, | 2505,38, | 2505,39, | 2505,40, | 2505,41, | 2505,42, | 2505,43, | 2505,44, | 2505,45, | 2505,46, | 2505,47, | 2505,48, | 2505,49, | 2505,50, | 2505,51, | 2505,52, | 2505,53, | 2505,54, | 2505,55, | 2505,56, | 2505,57, | 2505,58, | 2505,59, | 2505,60, | 2505,61, | 2505,62, | 2505,63, | 2505,64, | 2505,65, | 2505,66, | 2505,67, | 2505,68, | 2505,69, | 2505,70, | 2505,71, | 2505,72, | 2505,73, | 2505,74, | 2505,75, | 2505,76, | 2505,77, | 2505,78, | 2505,79, | 2505,80, | 2505,81, | 2505,82, | 2505,83, | 2505,84, | 2505,85, | 2506,1, | 2506,2, | 2506,3, | 2506,4, | 2506,5, | 2506,6, | 2506,7, | 2506,8, | 2506,9, | 2506,10, | 2506,11, | 2506,12, | 2506,13, | 2506,14, | 2506,15, | 2506,16, | 2506,17, | 2506,18, | 2506,19, | 2506,20, | 2506,21, | 2506,22, | 2506,23, | 2506,24, | 2506,25, | 2506,26, | 2506,27, | 2506,28, | 2506,29, | 2506,30, | 2506,31, | 2506,32, | 2506,33, | 2506,34, | 2506,35, | 2506,36, | 2506,37, | 2506,38, | 2506,39, | 2506,40, | 2506,41, | 2506,42, | 2506,43, | 2506,44, | 2506,45, | 2506,46, | 2506,47, | 2506,48, | 2506,49, | 2506,50, | 2506,51, | 2506,52, | 2506,53, | 2506,54, | 2506,55, | 2506,56, | 2506,57, | 2506,58, | 2506,59, | 2506,60, | 2506,61, | 2506,62, | 2506,63, | 2506,64, | 2506,65, | 2506,66, | 2506,67, | 2506,68, | 2506,69, | 2506,70, | 2506,71, | 2506,72, | 2506,73, | 2506,74, | 2506,75, | 2506,76, | 2506,77, | 2506,78, | 2506,79, | 2506,80, | 2506,81, | 2506,82, | 2506,83, | 2506,84, | 2506,85, | 2507,1, | 2507,2, | 2507,3, | 2507,4, | 2507,5, | 2507,6, | 2507,7, | 2507,8, | 2507,9, | 2507,10, | 2507,11, | 2507,12, | 2507,13, | 2507,14, | 2507,15, | 2507,16, | 2507,17, | 2507,18, | 2507,19, | 2507,20, | 2507,21, | 2507,22, | 2507,23, | 2507,24, | 2507,25, | 2507,26, | 2507,27, | 2507,28, | 2507,29, | 2507,30, | 2507,31, | 2507,32, | 2507,33, | 2507,34, | 2507,35, | 2507,36, | 2507,37, | 2507,38, | 2507,39, | 2507,40, | 2507,41, | 2507,42, | 2507,43, | 2507,44, | 2507,45, | 2507,46, | 2507,47, | 2507,48, | 2507,49, | 2507,50, | 2507,51, | 2507,52, | 2507,53, | 2507,54, | 2507,55, | 2507,56, | 2507,57, | 2507,58, | 2507,59, | 2507,60, | 2507,61, | 2507,62, | 2507,63, | 2507,64, | 2507,65, | 2507,66, | 2507,67, | 2507,68, | 2507,69, | 2507,70, | 2507,71, | 2507,72, | 2507,73, | 2507,74, | 2507,75, | 2507,76, | 2507,77, | 2507,78, | 2507,79, | 2507,80, | 2507,81, | 2507,82, | 2507,83, | 2507,84, | 2507,85, | 2508,1, | 2508,2, | 2508,3, | 2508,4, | 2508,5, | 2508,6, | 2508,7, | 2508,8, | 2508,9, | 2508,10, | 2508,11, | 2508,12, | 2508,13, | 2508,14, | 2508,15, | 2508,16, | 2508,17, | 2508,18, | 2508,19, | 2508,20, | 2508,21, | 2508,22, | 2508,23, | 2508,24, | 2508,25, | 2508,26, | 2508,27, | 2508,28, | 2508,29, | 2508,30, | 2508,31, | 2508,32, | 2508,33, | 2508,34, | 2508,35, | 2508,36, | 2508,37, | 2508,38, | 2508,39, | 2508,40, | 2508,41, | 2508,42, | 2508,43, | 2508,44, | 2508,45, | 2508,46, | 2508,47, | 2508,48, | 2508,49, | 2508,50, | 2508,51, | 2508,52, | 2508,53, | 2508,54, | 2508,55, | 2508,56, | 2508,57, | 2508,58, | 2508,59, | 2508,60, | 2508,61, | 2508,62, | 2508,63, | 2508,64, | 2508,65, | 2508,66, | 2508,67, | 2508,68, | 2508,69, | 2508,70, | 2508,71, | 2508,72, | 2508,73, | 2508,74, | 2508,75, | 2508,76, | 2508,77, | 2508,78, | 2508,79, | 2508,80, | 2508,81, | 2508,82, | 2508,83, | 2508,84, | 2508,85, | 2509,1, | 2509,2, | 2509,3, | 2509,4, | 2509,5, | 2509,6, | 2509,7, | 2509,8, | 2509,9, | 2509,10, | 2509,11, | 2509,12, | 2509,13, | 2509,14, | 2509,15, | 2509,16, | 2509,17, | 2509,18, | 2509,19, | 2509,20, | 2509,21, | 2509,22, | 2509,23, | 2509,24, | 2509,25, | 2509,26, | 2509,27, | 2509,28, | 2509,29, | 2509,30, | 2509,31, | 2509,32, | 2509,33, | 2509,34, | 2509,35, | 2509,36, | 2509,37, | 2509,38, | 2509,39, | 2509,40, | 2509,41, | 2509,42, | 2509,43, | 2509,44, | 2509,45, | 2509,46, | 2509,47, | 2509,48, | 2509,49, | 2509,50, | 2509,51, | 2509,52, | 2509,53, | 2509,54, | 2509,55, | 2509,56, | 2509,57, | 2509,58, | 2509,59, | 2509,60, | 2509,61, | 2509,62, | 2509,63, | 2509,64, | 2509,65, | 2509,66, | 2509,67, | 2509,68, | 2509,69, | 2509,70, | 2509,71, | 2509,72, | 2509,73, | 2509,74, | 2509,75, | 2509,76, | 2509,77, | 2509,78, | 2509,79, | 2509,80, | 2509,81, | 2509,82, | 2509,83, | 2509,84, | 2509,85, | 2510,1, | 2510,2, | 2510,3, | 2510,4, | 2510,5, | 2510,6, | 2510,7, | 2510,8, | 2510,9, | 2510,10, | 2510,11, | 2510,12, | 2510,13, | 2510,14, | 2510,15, | 2510,16, | 2510,17, | 2510,18, | 2510,19, | 2510,20, | 2510,21, | 2510,22, | 2510,23, | 2510,24, | 2510,25, | 2510,26, | 2510,27, | 2510,28, | 2510,29, | 2510,30, | 2510,31, | 2510,32, | 2510,33, | 2510,34, | 2510,35, | 2510,36, | 2510,37, | 2510,38, | 2510,39, | 2510,40, | 2510,41, | 2510,42, | 2510,43, | 2510,44, | 2510,45, | 2510,46, | 2510,47, | 2510,48, | 2510,49, | 2510,50, | 2510,51, | 2510,52, | 2510,53, | 2510,54, | 2510,55, | 2510,56, | 2510,57, | 2510,58, | 2510,59, | 2510,60, | 2510,61, | 2510,62, | 2510,63, | 2510,64, | 2510,65, | 2510,66, | 2510,67, | 2510,68, | 2510,69, | 2510,70, | 2510,71, | 2510,72, | 2510,73, | 2510,74, | 2510,75, | 2510,76, | 2510,77, | 2510,78, | 2510,79, | 2510,80, | 2510,81, | 2510,82, | 2510,83, | 2510,84, | 2510,85, | 2511,1, | 2511,2, | 2511,3, | 2511,4, | 2511,5, | 2511,6, | 2511,7, | 2511,8, | 2511,9, | 2511,10, | 2511,11, | 2511,12, | 2511,13, | 2511,14, | 2511,15, | 2511,16, | 2511,17, | 2511,18, | 2511,19, | 2511,20, | 2511,21, | 2511,22, | 2511,23, | 2511,24, | 2511,25, | 2511,26, | 2511,27, | 2511,28, | 2511,29, | 2511,30, | 2511,31, | 2511,32, | 2511,33, | 2511,34, | 2511,35, | 2511,36, | 2511,37, | 2511,38, | 2511,39, | 2511,40, | 2511,41, | 2511,42, | 2511,43, | 2511,44, | 2511,45, | 2511,46, | 2511,47, | 2511,48, | 2511,49, | 2511,50, | 2511,51, | 2511,52, | 2511,53, | 2511,54, | 2511,55, | 2511,56, | 2511,57, | 2511,58, | 2511,59, | 2511,60, | 2511,61, | 2511,62, | 2511,63, | 2511,64, | 2511,65, | 2511,66, | 2511,67, | 2511,68, | 2511,69, | 2511,70, | 2511,71, | 2511,72, | 2511,73, | 2511,74, | 2511,75, | 2511,76, | 2511,77, | 2511,78, | 2511,79, | 2511,80, | 2511,81, | 2511,82, | 2511,83, | 2511,84, | 2511,85, | 2512,1, | 2512,2, | 2512,3, | 2512,4, | 2512,5, | 2512,6, | 2512,7, | 2512,8, | 2512,9, | 2512,10, | 2512,11, | 2512,12, | 2512,13, | 2512,14, | 2512,15, | 2512,16, | 2512,17, | 2512,18, | 2512,19, | 2512,20, | 2512,21, | 2512,22, | 2512,23, | 2512,24, | 2512,25, | 2512,26, | 2512,27, | 2512,28, | 2512,29, | 2512,30, | 2512,31, | 2512,32, | 2512,33, | 2512,34, | 2512,35, | 2512,36, | 2512,37, | 2512,38, | 2512,39, | 2512,40, | 2512,41, | 2512,42, | 2512,43, | 2512,44, | 2512,45, | 2512,46, | 2512,47, | 2512,48, | 2512,49, | 2512,50, | 2512,51, | 2512,52, | 2512,53, | 2512,54, | 2512,55, | 2512,56, | 2512,57, | 2512,58, | 2512,59, | 2512,60, | 2512,61, | 2512,62, | 2512,63, | 2512,64, | 2512,65, | 2512,66, | 2512,67, | 2512,68, | 2512,69, | 2512,70, | 2512,71, | 2512,72, | 2512,73, | 2512,74, | 2512,75, | 2512,76, | 2512,77, | 2512,78, | 2512,79, | 2512,80, | 2512,81, | 2512,82, | 2512,83, | 2512,84, | 2512,85, | 2513,1, | 2513,2, | 2513,3, | 2513,4, | 2513,5, | 2513,6, | 2513,7, | 2513,8, | 2513,9, | 2513,10, | 2513,11, | 2513,12, | 2513,13, | 2513,14, | 2513,15, | 2513,16, | 2513,17, | 2513,18, | 2513,19, | 2513,20, | 2513,21, | 2513,22, | 2513,23, | 2513,24, | 2513,25, | 2513,26, | 2513,27, | 2513,28, | 2513,29, | 2513,30, | 2513,31, | 2513,32, | 2513,33, | 2513,34, | 2513,35, | 2513,36, | 2513,37, | 2513,38, | 2513,39, | 2513,40, | 2513,41, | 2513,42, | 2513,43, | 2513,44, | 2513,45, | 2513,46, | 2513,47, | 2513,48, | 2513,49, | 2513,50, | 2513,51, | 2513,52, | 2513,53, | 2513,54, | 2513,55, | 2513,56, | 2513,57, | 2513,58, | 2513,59, | 2513,60, | 2513,61, | 2513,62, | 2513,63, | 2513,64, | 2513,65, | 2513,66, | 2513,67, | 2513,68, | 2513,69, | 2513,70, | 2513,71, | 2513,72, | 2513,73, | 2513,74, | 2513,75, | 2513,76, | 2513,77, | 2513,78, | 2513,79, | 2513,80, | 2513,81, | 2513,82, | 2513,83, | 2513,84, | 2513,85, | 2514,1, | 2514,2, | 2514,3, | 2514,4, | 2514,5, | 2514,6, | 2514,7, | 2514,8, | 2514,9, | 2514,10, | 2514,11, | 2514,12, | 2514,13, | 2514,14, | 2514,15, | 2514,16, | 2514,17, | 2514,18, | 2514,19, | 2514,20, | 2514,21, | 2514,22, | 2514,23, | 2514,24, | 2514,25, | 2514,26, | 2514,27, | 2514,28, | 2514,29, | 2514,30, | 2514,31, | 2514,32, | 2514,33, | 2514,34, | 2514,35, | 2514,36, | 2514,37, | 2514,38, | 2514,39, | 2514,40, | 2514,41, | 2514,42, | 2514,43, | 2514,44, | 2514,45, | 2514,46, | 2514,47, | 2514,48, | 2514,49, | 2514,50, | 2514,51, | 2514,52, | 2514,53, | 2514,54, | 2514,55, | 2514,56, | 2514,57, | 2514,58, | 2514,59, | 2514,60, | 2514,61, | 2514,62, | 2514,63, | 2514,64, | 2514,65, | 2514,66, | 2514,67, | 2514,68, | 2514,69, | 2514,70, | 2514,71, | 2514,72, | 2514,73, | 2514,74, | 2514,75, | 2514,76, | 2514,77, | 2514,78, | 2514,79, | 2514,80, | 2514,81, | 2514,82, | 2514,83, | 2514,84, | 2514,85, | 2515,1, | 2515,2, | 2515,3, | 2515,4, | 2515,5, | 2515,6, | 2515,7, | 2515,8, | 2515,9, | 2515,10, | 2515,11, | 2515,12, | 2515,13, | 2515,14, | 2515,15, | 2515,16, | 2515,17, | 2515,18, | 2515,19, | 2515,20, | 2515,21, | 2515,22, | 2515,23, | 2515,24, | 2515,25, | 2515,26, | 2515,27, | 2515,28, | 2515,29, | 2515,30, | 2515,31, | 2515,32, | 2515,33, | 2515,34, | 2515,35, | 2515,36, | 2515,37, | 2515,38, | 2515,39, | 2515,40, | 2515,41, | 2515,42, | 2515,43, | 2515,44, | 2515,45, | 2515,46, | 2515,47, | 2515,48, | 2515,49, | 2515,50, | 2515,51, | 2515,52, | 2515,53, | 2515,54, | 2515,55, | 2515,56, | 2515,57, | 2515,58, | 2515,59, | 2515,60, | 2515,61, | 2515,62, | 2515,63, | 2515,64, | 2515,65, | 2515,66, | 2515,67, | 2515,68, | 2515,69, | 2515,70, | 2515,71, | 2515,72, | 2515,73, | 2515,74, | 2515,75, | 2515,76, | 2515,77, | 2515,78, | 2515,79, | 2515,80, | 2515,81, | 2515,82, | 2515,83, | 2515,84, | 2515,85, | 2516,1, | 2516,2, | 2516,3, | 2516,4, | 2516,5, | 2516,6, | 2516,7, | 2516,8, | 2516,9, | 2516,10, | 2516,11, | 2516,12, | 2516,13, | 2516,14, | 2516,15, | 2516,16, | 2516,17, | 2516,18, | 2516,19, | 2516,20, | 2516,21, | 2516,22, | 2516,23, | 2516,24, | 2516,25, | 2516,26, | 2516,27, | 2516,28, | 2516,29, | 2516,30, | 2516,31, | 2516,32, | 2516,33, | 2516,34, | 2516,35, | 2516,36, | 2516,37, | 2516,38, | 2516,39, | 2516,40, | 2516,41, | 2516,42, | 2516,43, | 2516,44, | 2516,45, | 2516,46, | 2516,47, | 2516,48, | 2516,49, | 2516,50, | 2516,51, | 2516,52, | 2516,53, | 2516,54, | 2516,55, | 2516,56, | 2516,57, | 2516,58, | 2516,59, | 2516,60, | 2516,61, | 2516,62, | 2516,63, | 2516,64, | 2516,65, | 2516,66, | 2516,67, | 2516,68, | 2516,69, | 2516,70, | 2516,71, | 2516,72, | 2516,73, | 2516,74, | 2516,75, | 2516,76, | 2516,77, | 2516,78, | 2516,79, | 2516,80, | 2516,81, | 2516,82, | 2516,83, | 2516,84, | 2516,85, | 2517,1, | 2517,2, | 2517,3, | 2517,4, | 2517,5, | 2517,6, | 2517,7, | 2517,8, | 2517,9, | 2517,10, | 2517,11, | 2517,12, | 2517,13, | 2517,14, | 2517,15, | 2517,16, | 2517,17, | 2517,18, | 2517,19, | 2517,20, | 2517,21, | 2517,22, | 2517,23, | 2517,24, | 2517,25, | 2517,26, | 2517,27, | 2517,28, | 2517,29, | 2517,30, | 2517,31, | 2517,32, | 2517,33, | 2517,34, | 2517,35, | 2517,36, | 2517,37, | 2517,38, | 2517,39, | 2517,40, | 2517,41, | 2517,42, | 2517,43, | 2517,44, | 2517,45, | 2517,46, | 2517,47, | 2517,48, | 2517,49, | 2517,50, | 2517,51, | 2517,52, | 2517,53, | 2517,54, | 2517,55, | 2517,56, | 2517,57, | 2517,58, | 2517,59, | 2517,60, | 2517,61, | 2517,62, | 2517,63, | 2517,64, | 2517,65, | 2517,66, | 2517,67, | 2517,68, | 2517,69, | 2517,70, | 2517,71, | 2517,72, | 2517,73, | 2517,74, | 2517,75, | 2517,76, | 2517,77, | 2517,78, | 2517,79, | 2517,80, | 2517,81, | 2517,82, | 2517,83, | 2517,84, | 2517,85, | 2518,1, | 2518,2, | 2518,3, | 2518,4, | 2518,5, | 2518,6, | 2518,7, | 2518,8, | 2518,9, | 2518,10, | 2518,11, | 2518,12, | 2518,13, | 2518,14, | 2518,15, | 2518,16, | 2518,17, | 2518,18, | 2518,19, | 2518,20, | 2518,21, | 2518,22, | 2518,23, | 2518,24, | 2518,25, | 2518,26, | 2518,27, | 2518,28, | 2518,29, | 2518,30, | 2518,31, | 2518,32, | 2518,33, | 2518,34, | 2518,35, | 2518,36, | 2518,37, | 2518,38, | 2518,39, | 2518,40, | 2518,41, | 2518,42, | 2518,43, | 2518,44, | 2518,45, | 2518,46, | 2518,47, | 2518,48, | 2518,49, | 2518,50, | 2518,51, | 2518,52, | 2518,53, | 2518,54, | 2518,55, | 2518,56, | 2518,57, | 2518,58, | 2518,59, | 2518,60, | 2518,61, | 2518,62, | 2518,63, | 2518,64, | 2518,65, | 2518,66, | 2518,67, | 2518,68, | 2518,69, | 2518,70, | 2518,71, | 2518,72, | 2518,73, | 2518,74, | 2518,75, | 2518,76, | 2518,77, | 2518,78, | 2518,79, | 2518,80, | 2518,81, | 2518,82, | 2518,83, | 2518,84, | 2518,85, | 2519,1, | 2519,2, | 2519,3, | 2519,4, | 2519,5, | 2519,6, | 2519,7, | 2519,8, | 2519,9, | 2519,10, | 2519,11, | 2519,12, | 2519,13, | 2519,14, | 2519,15, | 2519,16, | 2519,17, | 2519,18, | 2519,19, | 2519,20, | 2519,21, | 2519,22, | 2519,23, | 2519,24, | 2519,25, | 2519,26, | 2519,27, | 2519,28, | 2519,29, | 2519,30, | 2519,31, | 2519,32, | 2519,33, | 2519,34, | 2519,35, | 2519,36, | 2519,37, | 2519,38, | 2519,39, | 2519,40, | 2519,41, | 2519,42, | 2519,43, | 2519,44, | 2519,45, | 2519,46, | 2519,47, | 2519,48, | 2519,49, | 2519,50, | 2519,51, | 2519,52, | 2519,53, | 2519,54, | 2519,55, | 2519,56, | 2519,57, | 2519,58, | 2519,59, | 2519,60, | 2519,61, | 2519,62, | 2519,63, | 2519,64, | 2519,65, | 2519,66, | 2519,67, | 2519,68, | 2519,69, | 2519,70, | 2519,71, | 2519,72, | 2519,73, | 2519,74, | 2519,75, | 2519,76, | 2519,77, | 2519,78, | 2519,79, | 2519,80, | 2519,81, | 2519,82, | 2519,83, | 2519,84, | 2519,85, | 2520,1, | 2520,2, | 2520,3, | 2520,4, | 2520,5, | 2520,6, | 2520,7, | 2520,8, | 2520,9, | 2520,10, | 2520,11, | 2520,12, | 2520,13, | 2520,14, | 2520,15, | 2520,16, | 2520,17, | 2520,18, | 2520,19, | 2520,20, | 2520,21, | 2520,22, | 2520,23, | 2520,24, | 2520,25, | 2520,26, | 2520,27, | 2520,28, | 2520,29, | 2520,30, | 2520,31, | 2520,32, | 2520,33, | 2520,34, | 2520,35, | 2520,36, | 2520,37, | 2520,38, | 2520,39, | 2520,40, | 2520,41, | 2520,42, | 2520,43, | 2520,44, | 2520,45, | 2520,46, | 2520,47, | 2520,48, | 2520,49, | 2520,50, | 2520,51, | 2520,52, | 2520,53, | 2520,54, | 2520,55, | 2520,56, | 2520,57, | 2520,58, | 2520,59, | 2520,60, | 2520,61, | 2520,62, | 2520,63, | 2520,64, | 2520,65, | 2520,66, | 2520,67, | 2520,68, | 2520,69, | 2520,70, | 2520,71, | 2520,72, | 2520,73, | 2520,74, | 2520,75, | 2520,76, | 2520,77, | 2520,78, | 2520,79, | 2520,80, | 2520,81, | 2520,82, | 2520,83, | 2520,84, | 2520,85, | 2521,1, | 2521,2, | 2521,3, | 2521,4, | 2521,5, | 2521,6, | 2521,7, | 2521,8, | 2521,9, | 2521,10, | 2521,11, | 2521,12, | 2521,13, | 2521,14, | 2521,15, | 2521,16, | 2521,17, | 2521,18, | 2521,19, | 2521,20, | 2521,21, | 2521,22, | 2521,23, | 2521,24, | 2521,25, | 2521,26, | 2521,27, | 2521,28, | 2521,29, | 2521,30, | 2521,31, | 2521,32, | 2521,33, | 2521,34, | 2521,35, | 2521,36, | 2521,37, | 2521,38, | 2521,39, | 2521,40, | 2521,41, | 2521,42, | 2521,43, | 2521,44, | 2521,45, | 2521,46, | 2521,47, | 2521,48, | 2521,49, | 2521,50, | 2521,51, | 2521,52, | 2521,53, | 2521,54, | 2521,55, | 2521,56, | 2521,57, | 2521,58, | 2521,59, | 2521,60, | 2521,61, | 2521,62, | 2521,63, | 2521,64, | 2521,65, | 2521,66, | 2521,67, | 2521,68, | 2521,69, | 2521,70, | 2521,71, | 2521,72, | 2521,73, | 2521,74, | 2521,75, | 2521,76, | 2521,77, | 2521,78, | 2521,79, | 2521,80, | 2521,81, | 2521,82, | 2521,83, | 2521,84, | 2521,85, | 2522,1, | 2522,2, | 2522,3, | 2522,4, | 2522,5, | 2522,6, | 2522,7, | 2522,8, | 2522,9, | 2522,10, | 2522,11, | 2522,12, | 2522,13, | 2522,14, | 2522,15, | 2522,16, | 2522,17, | 2522,18, | 2522,19, | 2522,20, | 2522,21, | 2522,22, | 2522,23, | 2522,24, | 2522,25, | 2522,26, | 2522,27, | 2522,28, | 2522,29, | 2522,30, | 2522,31, | 2522,32, | 2522,33, | 2522,34, | 2522,35, | 2522,36, | 2522,37, | 2522,38, | 2522,39, | 2522,40, | 2522,41, | 2522,42, | 2522,43, | 2522,44, | 2522,45, | 2522,46, | 2522,47, | 2522,48, | 2522,49, | 2522,50, | 2522,51, | 2522,52, | 2522,53, | 2522,54, | 2522,55, | 2522,56, | 2522,57, | 2522,58, | 2522,59, | 2522,60, | 2522,61, | 2522,62, | 2522,63, | 2522,64, | 2522,65, | 2522,66, | 2522,67, | 2522,68, | 2522,69, | 2522,70, | 2522,71, | 2522,72, | 2522,73, | 2522,74, | 2522,75, | 2522,76, | 2522,77, | 2522,78, | 2522,79, | 2522,80, | 2522,81, | 2522,82, | 2522,83, | 2522,84, | 2522,85, | 2523,1, | 2523,2, | 2523,3, | 2523,4, | 2523,5, | 2523,6, | 2523,7, | 2523,8, | 2523,9, | 2523,10, | 2523,11, | 2523,12, | 2523,13, | 2523,14, | 2523,15, | 2523,16, | 2523,17, | 2523,18, | 2523,19, | 2523,20, | 2523,21, | 2523,22, | 2523,23, | 2523,24, | 2523,25, | 2523,26, | 2523,27, | 2523,28, | 2523,29, | 2523,30, | 2523,31, | 2523,32, | 2523,33, | 2523,34, | 2523,35, | 2523,36, | 2523,37, | 2523,38, | 2523,39, | 2523,40, | 2523,41, | 2523,42, | 2523,43, | 2523,44, | 2523,45, | 2523,46, | 2523,47, | 2523,48, | 2523,49, | 2523,50, | 2523,51, | 2523,52, | 2523,53, | 2523,54, | 2523,55, | 2523,56, | 2523,57, | 2523,58, | 2523,59, | 2523,60, | 2523,61, | 2523,62, | 2523,63, | 2523,64, | 2523,65, | 2523,66, | 2523,67, | 2523,68, | 2523,69, | 2523,70, | 2523,71, | 2523,72, | 2523,73, | 2523,74, | 2523,75, | 2523,76, | 2523,77, | 2523,78, | 2523,79, | 2523,80, | 2523,81, | 2523,82, | 2523,83, | 2523,84, | 2523,85, | 2524,1, | 2524,2, | 2524,3, | 2524,4, | 2524,5, | 2524,6, | 2524,7, | 2524,8, | 2524,9, | 2524,10, | 2524,11, | 2524,12, | 2524,13, | 2524,14, | 2524,15, | 2524,16, | 2524,17, | 2524,18, | 2524,19, | 2524,20, | 2524,21, | 2524,22, | 2524,23, | 2524,24, | 2524,25, | 2524,26, | 2524,27, | 2524,28, | 2524,29, | 2524,30, | 2524,31, | 2524,32, | 2524,33, | 2524,34, | 2524,35, | 2524,36, | 2524,37, | 2524,38, | 2524,39, | 2524,40, | 2524,41, | 2524,42, | 2524,43, | 2524,44, | 2524,45, | 2524,46, | 2524,47, | 2524,48, | 2524,49, | 2524,50, | 2524,51, | 2524,52, | 2524,53, | 2524,54, | 2524,55, | 2524,56, | 2524,57, | 2524,58, | 2524,59, | 2524,60, | 2524,61, | 2524,62, | 2524,63, | 2524,64, | 2524,65, | 2524,66, | 2524,67, | 2524,68, | 2524,69, | 2524,70, | 2524,71, | 2524,72, | 2524,73, | 2524,74, | 2524,75, | 2524,76, | 2524,77, | 2524,78, | 2524,79, | 2524,80, | 2524,81, | 2524,82, | 2524,83, | 2524,84, | 2524,85, | 2525,1, | 2525,2, | 2525,3, | 2525,4, | 2525,5, | 2525,6, | 2525,7, | 2525,8, | 2525,9, | 2525,10, | 2525,11, | 2525,12, | 2525,13, | 2525,14, | 2525,15, | 2525,16, | 2525,17, | 2525,18, | 2525,19, | 2525,20, | 2525,21, | 2525,22, | 2525,23, | 2525,24, | 2525,25, | 2525,26, | 2525,27, | 2525,28, | 2525,29, | 2525,30, | 2525,31, | 2525,32, | 2525,33, | 2525,34, | 2525,35, | 2525,36, | 2525,37, | 2525,38, | 2525,39, | 2525,40, | 2525,41, | 2525,42, | 2525,43, | 2525,44, | 2525,45, | 2525,46, | 2525,47, | 2525,48, | 2525,49, | 2525,50, | 2525,51, | 2525,52, | 2525,53, | 2525,54, | 2525,55, | 2525,56, | 2525,57, | 2525,58, | 2525,59, | 2525,60, | 2525,61, | 2525,62, | 2525,63, | 2525,64, | 2525,65, | 2525,66, | 2525,67, | 2525,68, | 2525,69, | 2525,70, | 2525,71, | 2525,72, | 2525,73, | 2525,74, | 2525,75, | 2525,76, | 2525,77, | 2525,78, | 2525,79, | 2525,80, | 2525,81, | 2525,82, | 2525,83, | 2525,84, | 2525,85, | 2526,1, | 2526,2, | 2526,3, | 2526,4, | 2526,5, | 2526,6, | 2526,7, | 2526,8, | 2526,9, | 2526,10, | 2526,11, | 2526,12, | 2526,13, | 2526,14, | 2526,15, | 2526,16, | 2526,17, | 2526,18, | 2526,19, | 2526,20, | 2526,21, | 2526,22, | 2526,23, | 2526,24, | 2526,25, | 2526,26, | 2526,27, | 2526,28, | 2526,29, | 2526,30, | 2526,31, | 2526,32, | 2526,33, | 2526,34, | 2526,35, | 2526,36, | 2526,37, | 2526,38, | 2526,39, | 2526,40, | 2526,41, | 2526,42, | 2526,43, | 2526,44, | 2526,45, | 2526,46, | 2526,47, | 2526,48, | 2526,49, | 2526,50, | 2526,51, | 2526,52, | 2526,53, | 2526,54, | 2526,55, | 2526,56, | 2526,57, | 2526,58, | 2526,59, | 2526,60, | 2526,61, | 2526,62, | 2526,63, | 2526,64, | 2526,65, | 2526,66, | 2526,67, | 2526,68, | 2526,69, | 2526,70, | 2526,71, | 2526,72, | 2526,73, | 2526,74, | 2526,75, | 2526,76, | 2526,77, | 2526,78, | 2526,79, | 2526,80, | 2526,81, | 2526,82, | 2526,83, | 2526,84, | 2526,85, | 2527,1, | 2527,2, | 2527,3, | 2527,4, | 2527,5, | 2527,6, | 2527,7, | 2527,8, | 2527,9, | 2527,10, | 2527,11, | 2527,12, | 2527,13, | 2527,14, | 2527,15, | 2527,16, | 2527,17, | 2527,18, | 2527,19, | 2527,20, | 2527,21, | 2527,22, | 2527,23, | 2527,24, | 2527,25, | 2527,26, | 2527,27, | 2527,28, | 2527,29, | 2527,30, | 2527,31, | 2527,32, | 2527,33, | 2527,34, | 2527,35, | 2527,36, | 2527,37, | 2527,38, | 2527,39, | 2527,40, | 2527,41, | 2527,42, | 2527,43, | 2527,44, | 2527,45, | 2527,46, | 2527,47, | 2527,48, | 2527,49, | 2527,50, | 2527,51, | 2527,52, | 2527,53, | 2527,54, | 2527,55, | 2527,56, | 2527,57, | 2527,58, | 2527,59, | 2527,60, | 2527,61, | 2527,62, | 2527,63, | 2527,64, | 2527,65, | 2527,66, | 2527,67, | 2527,68, | 2527,69, | 2527,70, | 2527,71, | 2527,72, | 2527,73, | 2527,74, | 2527,75, | 2527,76, | 2527,77, | 2527,78, | 2527,79, | 2527,80, | 2527,81, | 2527,82, | 2527,83, | 2527,84, | 2527,85, | 2528,1, | 2528,2, | 2528,3, | 2528,4, | 2528,5, | 2528,6, | 2528,7, | 2528,8, | 2528,9, | 2528,10, | 2528,11, | 2528,12, | 2528,13, | 2528,14, | 2528,15, | 2528,16, | 2528,17, | 2528,18, | 2528,19, | 2528,20, | 2528,21, | 2528,22, | 2528,23, | 2528,24, | 2528,25, | 2528,26, | 2528,27, | 2528,28, | 2528,29, | 2528,30, | 2528,31, | 2528,32, | 2528,33, | 2528,34, | 2528,35, | 2528,36, | 2528,37, | 2528,38, | 2528,39, | 2528,40, | 2528,41, | 2528,42, | 2528,43, | 2528,44, | 2528,45, | 2528,46, | 2528,47, | 2528,48, | 2528,49, | 2528,50, | 2528,51, | 2528,52, | 2528,53, | 2528,54, | 2528,55, | 2528,56, | 2528,57, | 2528,58, | 2528,59, | 2528,60, | 2528,61, | 2528,62, | 2528,63, | 2528,64, | 2528,65, | 2528,66, | 2528,67, | 2528,68, | 2528,69, | 2528,70, | 2528,71, | 2528,72, | 2528,73, | 2528,74, | 2528,75, | 2528,76, | 2528,77, | 2528,78, | 2528,79, | 2528,80, | 2528,81, | 2528,82, | 2528,83, | 2528,84, | 2528,85, | 2529,1, | 2529,2, | 2529,3, | 2529,4, | 2529,5, | 2529,6, | 2529,7, | 2529,8, | 2529,9, | 2529,10, | 2529,11, | 2529,12, | 2529,13, | 2529,14, | 2529,15, | 2529,16, | 2529,17, | 2529,18, | 2529,19, | 2529,20, | 2529,21, | 2529,22, | 2529,23, | 2529,24, | 2529,25, | 2529,26, | 2529,27, | 2529,28, | 2529,29, | 2529,30, | 2529,31, | 2529,32, | 2529,33, | 2529,34, | 2529,35, | 2529,36, | 2529,37, | 2529,38, | 2529,39, | 2529,40, | 2529,41, | 2529,42, | 2529,43, | 2529,44, | 2529,45, | 2529,46, | 2529,47, | 2529,48, | 2529,49, | 2529,50, | 2529,51, | 2529,52, | 2529,53, | 2529,54, | 2529,55, | 2529,56, | 2529,57, | 2529,58, | 2529,59, | 2529,60, | 2529,61, | 2529,62, | 2529,63, | 2529,64, | 2529,65, | 2529,66, | 2529,67, | 2529,68, | 2529,69, | 2529,70, | 2529,71, | 2529,72, | 2529,73, | 2529,74, | 2529,75, | 2529,76, | 2529,77, | 2529,78, | 2529,79, | 2529,80, | 2529,81, | 2529,82, | 2529,83, | 2529,84, | 2529,85, | 2530,1, | 2530,2, | 2530,3, | 2530,4, | 2530,5, | 2530,6, | 2530,7, | 2530,8, | 2530,9, | 2530,10, | 2530,11, | 2530,12, | 2530,13, | 2530,14, | 2530,15, | 2530,16, | 2530,17, | 2530,18, | 2530,19, | 2530,20, | 2530,21, | 2530,22, | 2530,23, | 2530,24, | 2530,25, | 2530,26, | 2530,27, | 2530,28, | 2530,29, | 2530,30, | 2530,31, | 2530,32, | 2530,33, | 2530,34, | 2530,35, | 2530,36, | 2530,37, | 2530,38, | 2530,39, | 2530,40, | 2530,41, | 2530,42, | 2530,43, | 2530,44, | 2530,45, | 2530,46, | 2530,47, | 2530,48, | 2530,49, | 2530,50, | 2530,51, | 2530,52, | 2530,53, | 2530,54, | 2530,55, | 2530,56, | 2530,57, | 2530,58, | 2530,59, | 2530,60, | 2530,61, | 2530,62, | 2530,63, | 2530,64, | 2530,65, | 2530,66, | 2530,67, | 2530,68, | 2530,69, | 2530,70, | 2530,71, | 2530,72, | 2530,73, | 2530,74, | 2530,75, | 2530,76, | 2530,77, | 2530,78, | 2530,79, | 2530,80, | 2530,81, | 2530,82, | 2530,83, | 2530,84, | 2530,85, | 2531,1, | 2531,2, | 2531,3, | 2531,4, | 2531,5, | 2531,6, | 2531,7, | 2531,8, | 2531,9, | 2531,10, | 2531,11, | 2531,12, | 2531,13, | 2531,14, | 2531,15, | 2531,16, | 2531,17, | 2531,18, | 2531,19, | 2531,20, | 2531,21, | 2531,22, | 2531,23, | 2531,24, | 2531,25, | 2531,26, | 2531,27, | 2531,28, | 2531,29, | 2531,30, | 2531,31, | 2531,32, | 2531,33, | 2531,34, | 2531,35, | 2531,36, | 2531,37, | 2531,38, | 2531,39, | 2531,40, | 2531,41, | 2531,42, | 2531,43, | 2531,44, | 2531,45, | 2531,46, | 2531,47, | 2531,48, | 2531,49, | 2531,50, | 2531,51, | 2531,52, | 2531,53, | 2531,54, | 2531,55, | 2531,56, | 2531,57, | 2531,58, | 2531,59, | 2531,60, | 2531,61, | 2531,62, | 2531,63, | 2531,64, | 2531,65, | 2531,66, | 2531,67, | 2531,68, | 2531,69, | 2531,70, | 2531,71, | 2531,72, | 2531,73, | 2531,74, | 2531,75, | 2531,76, | 2531,77, | 2531,78, | 2531,79, | 2531,80, | 2531,81, | 2531,82, | 2531,83, | 2531,84, | 2531,85, | 2532,1, | 2532,2, | 2532,3, | 2532,4, | 2532,5, | 2532,6, | 2532,7, | 2532,8, | 2532,9, | 2532,10, | 2532,11, | 2532,12, | 2532,13, | 2532,14, | 2532,15, | 2532,16, | 2532,17, | 2532,18, | 2532,19, | 2532,20, | 2532,21, | 2532,22, | 2532,23, | 2532,24, | 2532,25, | 2532,26, | 2532,27, | 2532,28, | 2532,29, | 2532,30, | 2532,31, | 2532,32, | 2532,33, | 2532,34, | 2532,35, | 2532,36, | 2532,37, | 2532,38, | 2532,39, | 2532,40, | 2532,41, | 2532,42, | 2532,43, | 2532,44, | 2532,45, | 2532,46, | 2532,47, | 2532,48, | 2532,49, | 2532,50, | 2532,51, | 2532,52, | 2532,53, | 2532,54, | 2532,55, | 2532,56, | 2532,57, | 2532,58, | 2532,59, | 2532,60, | 2532,61, | 2532,62, | 2532,63, | 2532,64, | 2532,65, | 2532,66, | 2532,67, | 2532,68, | 2532,69, | 2532,70, | 2532,71, | 2532,72, | 2532,73, | 2532,74, | 2532,75, | 2532,76, | 2532,77, | 2532,78, | 2532,79, | 2532,80, | 2532,81, | 2532,82, | 2532,83, | 2532,84, | 2532,85, | 2533,1, | 2533,2, | 2533,3, | 2533,4, | 2533,5, | 2533,6, | 2533,7, | 2533,8, | 2533,9, | 2533,10, | 2533,11, | 2533,12, | 2533,13, | 2533,14, | 2533,15, | 2533,16, | 2533,17, | 2533,18, | 2533,19, | 2533,20, | 2533,21, | 2533,22, | 2533,23, | 2533,24, | 2533,25, | 2533,26, | 2533,27, | 2533,28, | 2533,29, | 2533,30, | 2533,31, | 2533,32, | 2533,33, | 2533,34, | 2533,35, | 2533,36, | 2533,37, | 2533,38, | 2533,39, | 2533,40, | 2533,41, | 2533,42, | 2533,43, | 2533,44, | 2533,45, | 2533,46, | 2533,47, | 2533,48, | 2533,49, | 2533,50, | 2533,51, | 2533,52, | 2533,53, | 2533,54, | 2533,55, | 2533,56, | 2533,57, | 2533,58, | 2533,59, | 2533,60, | 2533,61, | 2533,62, | 2533,63, | 2533,64, | 2533,65, | 2533,66, | 2533,67, | 2533,68, | 2533,69, | 2533,70, | 2533,71, | 2533,72, | 2533,73, | 2533,74, | 2533,75, | 2533,76, | 2533,77, | 2533,78, | 2533,79, | 2533,80, | 2533,81, | 2533,82, | 2533,83, | 2533,84, | 2533,85, | 2534,1, | 2534,2, | 2534,3, | 2534,4, | 2534,5, | 2534,6, | 2534,7, | 2534,8, | 2534,9, | 2534,10, | 2534,11, | 2534,12, | 2534,13, | 2534,14, | 2534,15, | 2534,16, | 2534,17, | 2534,18, | 2534,19, | 2534,20, | 2534,21, | 2534,22, | 2534,23, | 2534,24, | 2534,25, | 2534,26, | 2534,27, | 2534,28, | 2534,29, | 2534,30, | 2534,31, | 2534,32, | 2534,33, | 2534,34, | 2534,35, | 2534,36, | 2534,37, | 2534,38, | 2534,39, | 2534,40, | 2534,41, | 2534,42, | 2534,43, | 2534,44, | 2534,45, | 2534,46, | 2534,47, | 2534,48, | 2534,49, | 2534,50, | 2534,51, | 2534,52, | 2534,53, | 2534,54, | 2534,55, | 2534,56, | 2534,57, | 2534,58, | 2534,59, | 2534,60, | 2534,61, | 2534,62, | 2534,63, | 2534,64, | 2534,65, | 2534,66, | 2534,67, | 2534,68, | 2534,69, | 2534,70, | 2534,71, | 2534,72, | 2534,73, | 2534,74, | 2534,75, | 2534,76, | 2534,77, | 2534,78, | 2534,79, | 2534,80, | 2534,81, | 2534,82, | 2534,83, | 2534,84, | 2534,85, | 2535,1, | 2535,2, | 2535,3, | 2535,4, | 2535,5, | 2535,6, | 2535,7, | 2535,8, | 2535,9, | 2535,10, | 2535,11, | 2535,12, | 2535,13, | 2535,14, | 2535,15, | 2535,16, | 2535,17, | 2535,18, | 2535,19, | 2535,20, | 2535,21, | 2535,22, | 2535,23, | 2535,24, | 2535,25, | 2535,26, | 2535,27, | 2535,28, | 2535,29, | 2535,30, | 2535,31, | 2535,32, | 2535,33, | 2535,34, | 2535,35, | 2535,36, | 2535,37, | 2535,38, | 2535,39, | 2535,40, | 2535,41, | 2535,42, | 2535,43, | 2535,44, | 2535,45, | 2535,46, | 2535,47, | 2535,48, | 2535,49, | 2535,50, | 2535,51, | 2535,52, | 2535,53, | 2535,54, | 2535,55, | 2535,56, | 2535,57, | 2535,58, | 2535,59, | 2535,60, | 2535,61, | 2535,62, | 2535,63, | 2535,64, | 2535,65, | 2535,66, | 2535,67, | 2535,68, | 2535,69, | 2535,70, | 2535,71, | 2535,72, | 2535,73, | 2535,74, | 2535,75, | 2535,76, | 2535,77, | 2535,78, | 2535,79, | 2535,80, | 2535,81, | 2535,82, | 2535,83, | 2535,84, | 2535,85, | 2536,1, | 2536,2, | 2536,3, | 2536,4, | 2536,5, | 2536,6, | 2536,7, | 2536,8, | 2536,9, | 2536,10, | 2536,11, | 2536,12, | 2536,13, | 2536,14, | 2536,15, | 2536,16, | 2536,17, | 2536,18, | 2536,19, | 2536,20, | 2536,21, | 2536,22, | 2536,23, | 2536,24, | 2536,25, | 2536,26, | 2536,27, | 2536,28, | 2536,29, | 2536,30, | 2536,31, | 2536,32, | 2536,33, | 2536,34, | 2536,35, | 2536,36, | 2536,37, | 2536,38, | 2536,39, | 2536,40, | 2536,41, | 2536,42, | 2536,43, | 2536,44, | 2536,45, | 2536,46, | 2536,47, | 2536,48, | 2536,49, | 2536,50, | 2536,51, | 2536,52, | 2536,53, | 2536,54, | 2536,55, | 2536,56, | 2536,57, | 2536,58, | 2536,59, | 2536,60, | 2536,61, | 2536,62, | 2536,63, | 2536,64, | 2536,65, | 2536,66, | 2536,67, | 2536,68, | 2536,69, | 2536,70, | 2536,71, | 2536,72, | 2536,73, | 2536,74, | 2536,75, | 2536,76, | 2536,77, | 2536,78, | 2536,79, | 2536,80, | 2536,81, | 2536,82, | 2536,83, | 2536,84, | 2536,85, | 2537,1, | 2537,2, | 2537,3, | 2537,4, | 2537,5, | 2537,6, | 2537,7, | 2537,8, | 2537,9, | 2537,10, | 2537,11, | 2537,12, | 2537,13, | 2537,14, | 2537,15, | 2537,16, | 2537,17, | 2537,18, | 2537,19, | 2537,20, | 2537,21, | 2537,22, | 2537,23, | 2537,24, | 2537,25, | 2537,26, | 2537,27, | 2537,28, | 2537,29, | 2537,30, | 2537,31, | 2537,32, | 2537,33, | 2537,34, | 2537,35, | 2537,36, | 2537,37, | 2537,38, | 2537,39, | 2537,40, | 2537,41, | 2537,42, | 2537,43, | 2537,44, | 2537,45, | 2537,46, | 2537,47, | 2537,48, | 2537,49, | 2537,50, | 2537,51, | 2537,52, | 2537,53, | 2537,54, | 2537,55, | 2537,56, | 2537,57, | 2537,58, | 2537,59, | 2537,60, | 2537,61, | 2537,62, | 2537,63, | 2537,64, | 2537,65, | 2537,66, | 2537,67, | 2537,68, | 2537,69, | 2537,70, | 2537,71, | 2537,72, | 2537,73, | 2537,74, | 2537,75, | 2537,76, | 2537,77, | 2537,78, | 2537,79, | 2537,80, | 2537,81, | 2537,82, | 2537,83, | 2537,84, | 2537,85, | 2538,1, | 2538,2, | 2538,3, | 2538,4, | 2538,5, | 2538,6, | 2538,7, | 2538,8, | 2538,9, | 2538,10, | 2538,11, | 2538,12, | 2538,13, | 2538,14, | 2538,15, | 2538,16, | 2538,17, | 2538,18, | 2538,19, | 2538,20, | 2538,21, | 2538,22, | 2538,23, | 2538,24, | 2538,25, | 2538,26, | 2538,27, | 2538,28, | 2538,29, | 2538,30, | 2538,31, | 2538,32, | 2538,33, | 2538,34, | 2538,35, | 2538,36, | 2538,37, | 2538,38, | 2538,39, | 2538,40, | 2538,41, | 2538,42, | 2538,43, | 2538,44, | 2538,45, | 2538,46, | 2538,47, | 2538,48, | 2538,49, | 2538,50, | 2538,51, | 2538,52, | 2538,53, | 2538,54, | 2538,55, | 2538,56, | 2538,57, | 2538,58, | 2538,59, | 2538,60, | 2538,61, | 2538,62, | 2538,63, | 2538,64, | 2538,65, | 2538,66, | 2538,67, | 2538,68, | 2538,69, | 2538,70, | 2538,71, | 2538,72, | 2538,73, | 2538,74, | 2538,75, | 2538,76, | 2538,77, | 2538,78, | 2538,79, | 2538,80, | 2538,81, | 2538,82, | 2538,83, | 2538,84, | 2538,85, | 2539,1, | 2539,2, | 2539,3, | 2539,4, | 2539,5, | 2539,6, | 2539,7, | 2539,8, | 2539,9, | 2539,10, | 2539,11, | 2539,12, | 2539,13, | 2539,14, | 2539,15, | 2539,16, | 2539,17, | 2539,18, | 2539,19, | 2539,20, | 2539,21, | 2539,22, | 2539,23, | 2539,24, | 2539,25, | 2539,26, | 2539,27, | 2539,28, | 2539,29, | 2539,30, | 2539,31, | 2539,32, | 2539,33, | 2539,34, | 2539,35, | 2539,36, | 2539,37, | 2539,38, | 2539,39, | 2539,40, | 2539,41, | 2539,42, | 2539,43, | 2539,44, | 2539,45, | 2539,46, | 2539,47, | 2539,48, | 2539,49, | 2539,50, | 2539,51, | 2539,52, | 2539,53, | 2539,54, | 2539,55, | 2539,56, | 2539,57, | 2539,58, | 2539,59, | 2539,60, | 2539,61, | 2539,62, | 2539,63, | 2539,64, | 2539,65, | 2539,66, | 2539,67, | 2539,68, | 2539,69, | 2539,70, | 2539,71, | 2539,72, | 2539,73, | 2539,74, | 2539,75, | 2539,76, | 2539,77, | 2539,78, | 2539,79, | 2539,80, | 2539,81, | 2539,82, | 2539,83, | 2539,84, | 2539,85, | 2540,1, | 2540,2, | 2540,3, | 2540,4, | 2540,5, | 2540,6, | 2540,7, | 2540,8, | 2540,9, | 2540,10, | 2540,11, | 2540,12, | 2540,13, | 2540,14, | 2540,15, | 2540,16, | 2540,17, | 2540,18, | 2540,19, | 2540,20, | 2540,21, | 2540,22, | 2540,23, | 2540,24, | 2540,25, | 2540,26, | 2540,27, | 2540,28, | 2540,29, | 2540,30, | 2540,31, | 2540,32, | 2540,33, | 2540,34, | 2540,35, | 2540,36, | 2540,37, | 2540,38, | 2540,39, | 2540,40, | 2540,41, | 2540,42, | 2540,43, | 2540,44, | 2540,45, | 2540,46, | 2540,47, | 2540,48, | 2540,49, | 2540,50, | 2540,51, | 2540,52, | 2540,53, | 2540,54, | 2540,55, | 2540,56, | 2540,57, | 2540,58, | 2540,59, | 2540,60, | 2540,61, | 2540,62, | 2540,63, | 2540,64, | 2540,65, | 2540,66, | 2540,67, | 2540,68, | 2540,69, | 2540,70, | 2540,71, | 2540,72, | 2540,73, | 2540,74, | 2540,75, | 2540,76, | 2540,77, | 2540,78, | 2540,79, | 2540,80, | 2540,81, | 2540,82, | 2540,83, | 2540,84, | 2540,85, | 2541,1, | 2541,2, | 2541,3, | 2541,4, | 2541,5, | 2541,6, | 2541,7, | 2541,8, | 2541,9, | 2541,10, | 2541,11, | 2541,12, | 2541,13, | 2541,14, | 2541,15, | 2541,16, | 2541,17, | 2541,18, | 2541,19, | 2541,20, | 2541,21, | 2541,22, | 2541,23, | 2541,24, | 2541,25, | 2541,26, | 2541,27, | 2541,28, | 2541,29, | 2541,30, | 2541,31, | 2541,32, | 2541,33, | 2541,34, | 2541,35, | 2541,36, | 2541,37, | 2541,38, | 2541,39, | 2541,40, | 2541,41, | 2541,42, | 2541,43, | 2541,44, | 2541,45, | 2541,46, | 2541,47, | 2541,48, | 2541,49, | 2541,50, | 2541,51, | 2541,52, | 2541,53, | 2541,54, | 2541,55, | 2541,56, | 2541,57, | 2541,58, | 2541,59, | 2541,60, | 2541,61, | 2541,62, | 2541,63, | 2541,64, | 2541,65, | 2541,66, | 2541,67, | 2541,68, | 2541,69, | 2541,70, | 2541,71, | 2541,72, | 2541,73, | 2541,74, | 2541,75, | 2541,76, | 2541,77, | 2541,78, | 2541,79, | 2541,80, | 2541,81, | 2541,82, | 2541,83, | 2541,84, | 2541,85, | 2542,1, | 2542,2, | 2542,3, | 2542,4, | 2542,5, | 2542,6, | 2542,7, | 2542,8, | 2542,9, | 2542,10, | 2542,11, | 2542,12, | 2542,13, | 2542,14, | 2542,15, | 2542,16, | 2542,17, | 2542,18, | 2542,19, | 2542,20, | 2542,21, | 2542,22, | 2542,23, | 2542,24, | 2542,25, | 2542,26, | 2542,27, | 2542,28, | 2542,29, | 2542,30, | 2542,31, | 2542,32, | 2542,33, | 2542,34, | 2542,35, | 2542,36, | 2542,37, | 2542,38, | 2542,39, | 2542,40, | 2542,41, | 2542,42, | 2542,43, | 2542,44, | 2542,45, | 2542,46, | 2542,47, | 2542,48, | 2542,49, | 2542,50, | 2542,51, | 2542,52, | 2542,53, | 2542,54, | 2542,55, | 2542,56, | 2542,57, | 2542,58, | 2542,59, | 2542,60, | 2542,61, | 2542,62, | 2542,63, | 2542,64, | 2542,65, | 2542,66, | 2542,67, | 2542,68, | 2542,69, | 2542,70, | 2542,71, | 2542,72, | 2542,73, | 2542,74, | 2542,75, | 2542,76, | 2542,77, | 2542,78, | 2542,79, | 2542,80, | 2542,81, | 2542,82, | 2542,83, | 2542,84, | 2542,85, | 2543,1, | 2543,2, | 2543,3, | 2543,4, | 2543,5, | 2543,6, | 2543,7, | 2543,8, | 2543,9, | 2543,10, | 2543,11, | 2543,12, | 2543,13, | 2543,14, | 2543,15, | 2543,16, | 2543,17, | 2543,18, | 2543,19, | 2543,20, | 2543,21, | 2543,22, | 2543,23, | 2543,24, | 2543,25, | 2543,26, | 2543,27, | 2543,28, | 2543,29, | 2543,30, | 2543,31, | 2543,32, | 2543,33, | 2543,34, | 2543,35, | 2543,36, | 2543,37, | 2543,38, | 2543,39, | 2543,40, | 2543,41, | 2543,42, | 2543,43, | 2543,44, | 2543,45, | 2543,46, | 2543,47, | 2543,48, | 2543,49, | 2543,50, | 2543,51, | 2543,52, | 2543,53, | 2543,54, | 2543,55, | 2543,56, | 2543,57, | 2543,58, | 2543,59, | 2543,60, | 2543,61, | 2543,62, | 2543,63, | 2543,64, | 2543,65, | 2543,66, | 2543,67, | 2543,68, | 2543,69, | 2543,70, | 2543,71, | 2543,72, | 2543,73, | 2543,74, | 2543,75, | 2543,76, | 2543,77, | 2543,78, | 2543,79, | 2543,80, | 2543,81, | 2543,82, | 2543,83, | 2543,84, | 2543,85, | 2544,1, | 2544,2, | 2544,3, | 2544,4, | 2544,5, | 2544,6, | 2544,7, | 2544,8, | 2544,9, | 2544,10, | 2544,11, | 2544,12, | 2544,13, | 2544,14, | 2544,15, | 2544,16, | 2544,17, | 2544,18, | 2544,19, | 2544,20, | 2544,21, | 2544,22, | 2544,23, | 2544,24, | 2544,25, | 2544,26, | 2544,27, | 2544,28, | 2544,29, | 2544,30, | 2544,31, | 2544,32, | 2544,33, | 2544,34, | 2544,35, | 2544,36, | 2544,37, | 2544,38, | 2544,39, | 2544,40, | 2544,41, | 2544,42, | 2544,43, | 2544,44, | 2544,45, | 2544,46, | 2544,47, | 2544,48, | 2544,49, | 2544,50, | 2544,51, | 2544,52, | 2544,53, | 2544,54, | 2544,55, | 2544,56, | 2544,57, | 2544,58, | 2544,59, | 2544,60, | 2544,61, | 2544,62, | 2544,63, | 2544,64, | 2544,65, | 2544,66, | 2544,67, | 2544,68, | 2544,69, | 2544,70, | 2544,71, | 2544,72, | 2544,73, | 2544,74, | 2544,75, | 2544,76, | 2544,77, | 2544,78, | 2544,79, | 2544,80, | 2544,81, | 2544,82, | 2544,83, | 2544,84, | 2544,85, | 2545,1, | 2545,2, | 2545,3, | 2545,4, | 2545,5, | 2545,6, | 2545,7, | 2545,8, | 2545,9, | 2545,10, | 2545,11, | 2545,12, | 2545,13, | 2545,14, | 2545,15, | 2545,16, | 2545,17, | 2545,18, | 2545,19, | 2545,20, | 2545,21, | 2545,22, | 2545,23, | 2545,24, | 2545,25, | 2545,26, | 2545,27, | 2545,28, | 2545,29, | 2545,30, | 2545,31, | 2545,32, | 2545,33, | 2545,34, | 2545,35, | 2545,36, | 2545,37, | 2545,38, | 2545,39, | 2545,40, | 2545,41, | 2545,42, | 2545,43, | 2545,44, | 2545,45, | 2545,46, | 2545,47, | 2545,48, | 2545,49, | 2545,50, | 2545,51, | 2545,52, | 2545,53, | 2545,54, | 2545,55, | 2545,56, | 2545,57, | 2545,58, | 2545,59, | 2545,60, | 2545,61, | 2545,62, | 2545,63, | 2545,64, | 2545,65, | 2545,66, | 2545,67, | 2545,68, | 2545,69, | 2545,70, | 2545,71, | 2545,72, | 2545,73, | 2545,74, | 2545,75, | 2545,76, | 2545,77, | 2545,78, | 2545,79, | 2545,80, | 2545,81, | 2545,82, | 2545,83, | 2545,84, | 2545,85, | 2546,1, | 2546,2, | 2546,3, | 2546,4, | 2546,5, | 2546,6, | 2546,7, | 2546,8, | 2546,9, | 2546,10, | 2546,11, | 2546,12, | 2546,13, | 2546,14, | 2546,15, | 2546,16, | 2546,17, | 2546,18, | 2546,19, | 2546,20, | 2546,21, | 2546,22, | 2546,23, | 2546,24, | 2546,25, | 2546,26, | 2546,27, | 2546,28, | 2546,29, | 2546,30, | 2546,31, | 2546,32, | 2546,33, | 2546,34, | 2546,35, | 2546,36, | 2546,37, | 2546,38, | 2546,39, | 2546,40, | 2546,41, | 2546,42, | 2546,43, | 2546,44, | 2546,45, | 2546,46, | 2546,47, | 2546,48, | 2546,49, | 2546,50, | 2546,51, | 2546,52, | 2546,53, | 2546,54, | 2546,55, | 2546,56, | 2546,57, | 2546,58, | 2546,59, | 2546,60, | 2546,61, | 2546,62, | 2546,63, | 2546,64, | 2546,65, | 2546,66, | 2546,67, | 2546,68, | 2546,69, | 2546,70, | 2546,71, | 2546,72, | 2546,73, | 2546,74, | 2546,75, | 2546,76, | 2546,77, | 2546,78, | 2546,79, | 2546,80, | 2546,81, | 2546,82, | 2546,83, | 2546,84, | 2546,85, | 2547,1, | 2547,2, | 2547,3, | 2547,4, | 2547,5, | 2547,6, | 2547,7, | 2547,8, | 2547,9, | 2547,10, | 2547,11, | 2547,12, | 2547,13, | 2547,14, | 2547,15, | 2547,16, | 2547,17, | 2547,18, | 2547,19, | 2547,20, | 2547,21, | 2547,22, | 2547,23, | 2547,24, | 2547,25, | 2547,26, | 2547,27, | 2547,28, | 2547,29, | 2547,30, | 2547,31, | 2547,32, | 2547,33, | 2547,34, | 2547,35, | 2547,36, | 2547,37, | 2547,38, | 2547,39, | 2547,40, | 2547,41, | 2547,42, | 2547,43, | 2547,44, | 2547,45, | 2547,46, | 2547,47, | 2547,48, | 2547,49, | 2547,50, | 2547,51, | 2547,52, | 2547,53, | 2547,54, | 2547,55, | 2547,56, | 2547,57, | 2547,58, | 2547,59, | 2547,60, | 2547,61, | 2547,62, | 2547,63, | 2547,64, | 2547,65, | 2547,66, | 2547,67, | 2547,68, | 2547,69, | 2547,70, | 2547,71, | 2547,72, | 2547,73, | 2547,74, | 2547,75, | 2547,76, | 2547,77, | 2547,78, | 2547,79, | 2547,80, | 2547,81, | 2547,82, | 2547,83, | 2547,84, | 2547,85, | 2548,1, | 2548,2, | 2548,3, | 2548,4, | 2548,5, | 2548,6, | 2548,7, | 2548,8, | 2548,9, | 2548,10, | 2548,11, | 2548,12, | 2548,13, | 2548,14, | 2548,15, | 2548,16, | 2548,17, | 2548,18, | 2548,19, | 2548,20, | 2548,21, | 2548,22, | 2548,23, | 2548,24, | 2548,25, | 2548,26, | 2548,27, | 2548,28, | 2548,29, | 2548,30, | 2548,31, | 2548,32, | 2548,33, | 2548,34, | 2548,35, | 2548,36, | 2548,37, | 2548,38, | 2548,39, | 2548,40, | 2548,41, | 2548,42, | 2548,43, | 2548,44, | 2548,45, | 2548,46, | 2548,47, | 2548,48, | 2548,49, | 2548,50, | 2548,51, | 2548,52, | 2548,53, | 2548,54, | 2548,55, | 2548,56, | 2548,57, | 2548,58, | 2548,59, | 2548,60, | 2548,61, | 2548,62, | 2548,63, | 2548,64, | 2548,65, | 2548,66, | 2548,67, | 2548,68, | 2548,69, | 2548,70, | 2548,71, | 2548,72, | 2548,73, | 2548,74, | 2548,75, | 2548,76, | 2548,77, | 2548,78, | 2548,79, | 2548,80, | 2548,81, | 2548,82, | 2548,83, | 2548,84, | 2548,85, | 2549,1, | 2549,2, | 2549,3, | 2549,4, | 2549,5, | 2549,6, | 2549,7, | 2549,8, | 2549,9, | 2549,10, | 2549,11, | 2549,12, | 2549,13, | 2549,14, | 2549,15, | 2549,16, | 2549,17, | 2549,18, | 2549,19, | 2549,20, | 2549,21, | 2549,22, | 2549,23, | 2549,24, | 2549,25, | 2549,26, | 2549,27, | 2549,28, | 2549,29, | 2549,30, | 2549,31, | 2549,32, | 2549,33, | 2549,34, | 2549,35, | 2549,36, | 2549,37, | 2549,38, | 2549,39, | 2549,40, | 2549,41, | 2549,42, | 2549,43, | 2549,44, | 2549,45, | 2549,46, | 2549,47, | 2549,48, | 2549,49, | 2549,50, | 2549,51, | 2549,52, | 2549,53, | 2549,54, | 2549,55, | 2549,56, | 2549,57, | 2549,58, | 2549,59, | 2549,60, | 2549,61, | 2549,62, | 2549,63, | 2549,64, | 2549,65, | 2549,66, | 2549,67, | 2549,68, | 2549,69, | 2549,70, | 2549,71, | 2549,72, | 2549,73, | 2549,74, | 2549,75, | 2549,76, | 2549,77, | 2549,78, | 2549,79, | 2549,80, | 2549,81, | 2549,82, | 2549,83, | 2549,84, | 2549,85, | 2550,1, | 2550,2, | 2550,3, | 2550,4, | 2550,5, | 2550,6, | 2550,7, | 2550,8, | 2550,9, | 2550,10, | 2550,11, | 2550,12, | 2550,13, | 2550,14, | 2550,15, | 2550,16, | 2550,17, | 2550,18, | 2550,19, | 2550,20, | 2550,21, | 2550,22, | 2550,23, | 2550,24, | 2550,25, | 2550,26, | 2550,27, | 2550,28, | 2550,29, | 2550,30, | 2550,31, | 2550,32, | 2550,33, | 2550,34, | 2550,35, | 2550,36, | 2550,37, | 2550,38, | 2550,39, | 2550,40, | 2550,41, | 2550,42, | 2550,43, | 2550,44, | 2550,45, | 2550,46, | 2550,47, | 2550,48, | 2550,49, | 2550,50, | 2550,51, | 2550,52, | 2550,53, | 2550,54, | 2550,55, | 2550,56, | 2550,57, | 2550,58, | 2550,59, | 2550,60, | 2550,61, | 2550,62, | 2550,63, | 2550,64, | 2550,65, | 2550,66, | 2550,67, | 2550,68, | 2550,69, | 2550,70, | 2550,71, | 2550,72, | 2550,73, | 2550,74, | 2550,75, | 2550,76, | 2550,77, | 2550,78, | 2550,79, | 2550,80, | 2550,81, | 2550,82, | 2550,83, | 2550,84, | 2550,85, | 2551,1, | 2551,2, | 2551,3, | 2551,4, | 2551,5, | 2551,6, | 2551,7, | 2551,8, | 2551,9, | 2551,10, | 2551,11, | 2551,12, | 2551,13, | 2551,14, | 2551,15, | 2551,16, | 2551,17, | 2551,18, | 2551,19, | 2551,20, | 2551,21, | 2551,22, | 2551,23, | 2551,24, | 2551,25, | 2551,26, | 2551,27, | 2551,28, | 2551,29, | 2551,30, | 2551,31, | 2551,32, | 2551,33, | 2551,34, | 2551,35, | 2551,36, | 2551,37, | 2551,38, | 2551,39, | 2551,40, | 2551,41, | 2551,42, | 2551,43, | 2551,44, | 2551,45, | 2551,46, | 2551,47, | 2551,48, | 2551,49, | 2551,50, | 2551,51, | 2551,52, | 2551,53, | 2551,54, | 2551,55, | 2551,56, | 2551,57, | 2551,58, | 2551,59, | 2551,60, | 2551,61, | 2551,62, | 2551,63, | 2551,64, | 2551,65, | 2551,66, | 2551,67, | 2551,68, | 2551,69, | 2551,70, | 2551,71, | 2551,72, | 2551,73, | 2551,74, | 2551,75, | 2551,76, | 2551,77, | 2551,78, | 2551,79, | 2551,80, | 2551,81, | 2551,82, | 2551,83, | 2551,84, | 2551,85, | 2552,1, | 2552,2, | 2552,3, | 2552,4, | 2552,5, | 2552,6, | 2552,7, | 2552,8, | 2552,9, | 2552,10, | 2552,11, | 2552,12, | 2552,13, | 2552,14, | 2552,15, | 2552,16, | 2552,17, | 2552,18, | 2552,19, | 2552,20, | 2552,21, | 2552,22, | 2552,23, | 2552,24, | 2552,25, | 2552,26, | 2552,27, | 2552,28, | 2552,29, | 2552,30, | 2552,31, | 2552,32, | 2552,33, | 2552,34, | 2552,35, | 2552,36, | 2552,37, | 2552,38, | 2552,39, | 2552,40, | 2552,41, | 2552,42, | 2552,43, | 2552,44, | 2552,45, | 2552,46, | 2552,47, | 2552,48, | 2552,49, | 2552,50, | 2552,51, | 2552,52, | 2552,53, | 2552,54, | 2552,55, | 2552,56, | 2552,57, | 2552,58, | 2552,59, | 2552,60, | 2552,61, | 2552,62, | 2552,63, | 2552,64, | 2552,65, | 2552,66, | 2552,67, | 2552,68, | 2552,69, | 2552,70, | 2552,71, | 2552,72, | 2552,73, | 2552,74, | 2552,75, | 2552,76, | 2552,77, | 2552,78, | 2552,79, | 2552,80, | 2552,81, | 2552,82, | 2552,83, | 2552,84, | 2552,85, | 2553,1, | 2553,2, | 2553,3, | 2553,4, | 2553,5, | 2553,6, | 2553,7, | 2553,8, | 2553,9, | 2553,10, | 2553,11, | 2553,12, | 2553,13, | 2553,14, | 2553,15, | 2553,16, | 2553,17, | 2553,18, | 2553,19, | 2553,20, | 2553,21, | 2553,22, | 2553,23, | 2553,24, | 2553,25, | 2553,26, | 2553,27, | 2553,28, | 2553,29, | 2553,30, | 2553,31, | 2553,32, | 2553,33, | 2553,34, | 2553,35, | 2553,36, | 2553,37, | 2553,38, | 2553,39, | 2553,40, | 2553,41, | 2553,42, | 2553,43, | 2553,44, | 2553,45, | 2553,46, | 2553,47, | 2553,48, | 2553,49, | 2553,50, | 2553,51, | 2553,52, | 2553,53, | 2553,54, | 2553,55, | 2553,56, | 2553,57, | 2553,58, | 2553,59, | 2553,60, | 2553,61, | 2553,62, | 2553,63, | 2553,64, | 2553,65, | 2553,66, | 2553,67, | 2553,68, | 2553,69, | 2553,70, | 2553,71, | 2553,72, | 2553,73, | 2553,74, | 2553,75, | 2553,76, | 2553,77, | 2553,78, | 2553,79, | 2553,80, | 2553,81, | 2553,82, | 2553,83, | 2553,84, | 2553,85, | 2554,1, | 2554,2, | 2554,3, | 2554,4, | 2554,5, | 2554,6, | 2554,7, | 2554,8, | 2554,9, | 2554,10, | 2554,11, | 2554,12, | 2554,13, | 2554,14, | 2554,15, | 2554,16, | 2554,17, | 2554,18, | 2554,19, | 2554,20, | 2554,21, | 2554,22, | 2554,23, | 2554,24, | 2554,25, | 2554,26, | 2554,27, | 2554,28, | 2554,29, | 2554,30, | 2554,31, | 2554,32, | 2554,33, | 2554,34, | 2554,35, | 2554,36, | 2554,37, | 2554,38, | 2554,39, | 2554,40, | 2554,41, | 2554,42, | 2554,43, | 2554,44, | 2554,45, | 2554,46, | 2554,47, | 2554,48, | 2554,49, | 2554,50, | 2554,51, | 2554,52, | 2554,53, | 2554,54, | 2554,55, | 2554,56, | 2554,57, | 2554,58, | 2554,59, | 2554,60, | 2554,61, | 2554,62, | 2554,63, | 2554,64, | 2554,65, | 2554,66, | 2554,67, | 2554,68, | 2554,69, | 2554,70, | 2554,71, | 2554,72, | 2554,73, | 2554,74, | 2554,75, | 2554,76, | 2554,77, | 2554,78, | 2554,79, | 2554,80, | 2554,81, | 2554,82, | 2554,83, | 2554,84, | 2554,85, | 2555,1, | 2555,2, | 2555,3, | 2555,4, | 2555,5, | 2555,6, | 2555,7, | 2555,8, | 2555,9, | 2555,10, | 2555,11, | 2555,12, | 2555,13, | 2555,14, | 2555,15, | 2555,16, | 2555,17, | 2555,18, | 2555,19, | 2555,20, | 2555,21, | 2555,22, | 2555,23, | 2555,24, | 2555,25, | 2555,26, | 2555,27, | 2555,28, | 2555,29, | 2555,30, | 2555,31, | 2555,32, | 2555,33, | 2555,34, | 2555,35, | 2555,36, | 2555,37, | 2555,38, | 2555,39, | 2555,40, | 2555,41, | 2555,42, | 2555,43, | 2555,44, | 2555,45, | 2555,46, | 2555,47, | 2555,48, | 2555,49, | 2555,50, | 2555,51, | 2555,52, | 2555,53, | 2555,54, | 2555,55, | 2555,56, | 2555,57, | 2555,58, | 2555,59, | 2555,60, | 2555,61, | 2555,62, | 2555,63, | 2555,64, | 2555,65, | 2555,66, | 2555,67, | 2555,68, | 2555,69, | 2555,70, | 2555,71, | 2555,72, | 2555,73, | 2555,74, | 2555,75, | 2555,76, | 2555,77, | 2555,78, | 2555,79, | 2555,80, | 2555,81, | 2555,82, | 2555,83, | 2555,84, | 2555,85, | 2556,1, | 2556,2, | 2556,3, | 2556,4, | 2556,5, | 2556,6, | 2556,7, | 2556,8, | 2556,9, | 2556,10, | 2556,11, | 2556,12, | 2556,13, | 2556,14, | 2556,15, | 2556,16, | 2556,17, | 2556,18, | 2556,19, | 2556,20, | 2556,21, | 2556,22, | 2556,23, | 2556,24, | 2556,25, | 2556,26, | 2556,27, | 2556,28, | 2556,29, | 2556,30, | 2556,31, | 2556,32, | 2556,33, | 2556,34, | 2556,35, | 2556,36, | 2556,37, | 2556,38, | 2556,39, | 2556,40, | 2556,41, | 2556,42, | 2556,43, | 2556,44, | 2556,45, | 2556,46, | 2556,47, | 2556,48, | 2556,49, | 2556,50, | 2556,51, | 2556,52, | 2556,53, | 2556,54, | 2556,55, | 2556,56, | 2556,57, | 2556,58, | 2556,59, | 2556,60, | 2556,61, | 2556,62, | 2556,63, | 2556,64, | 2556,65, | 2556,66, | 2556,67, | 2556,68, | 2556,69, | 2556,70, | 2556,71, | 2556,72, | 2556,73, | 2556,74, | 2556,75, | 2556,76, | 2556,77, | 2556,78, | 2556,79, | 2556,80, | 2556,81, | 2556,82, | 2556,83, | 2556,84, | 2556,85, | 2557,1, | 2557,2, | 2557,3, | 2557,4, | 2557,5, | 2557,6, | 2557,7, | 2557,8, | 2557,9, | 2557,10, | 2557,11, | 2557,12, | 2557,13, | 2557,14, | 2557,15, | 2557,16, | 2557,17, | 2557,18, | 2557,19, | 2557,20, | 2557,21, | 2557,22, | 2557,23, | 2557,24, | 2557,25, | 2557,26, | 2557,27, | 2557,28, | 2557,29, | 2557,30, | 2557,31, | 2557,32, | 2557,33, | 2557,34, | 2557,35, | 2557,36, | 2557,37, | 2557,38, | 2557,39, | 2557,40, | 2557,41, | 2557,42, | 2557,43, | 2557,44, | 2557,45, | 2557,46, | 2557,47, | 2557,48, | 2557,49, | 2557,50, | 2557,51, | 2557,52, | 2557,53, | 2557,54, | 2557,55, | 2557,56, | 2557,57, | 2557,58, | 2557,59, | 2557,60, | 2557,61, | 2557,62, | 2557,63, | 2557,64, | 2557,65, | 2557,66, | 2557,67, | 2557,68, | 2557,69, | 2557,70, | 2557,71, | 2557,72, | 2557,73, | 2557,74, | 2557,75, | 2557,76, | 2557,77, | 2557,78, | 2557,79, | 2557,80, | 2557,81, | 2557,82, | 2557,83, | 2557,84, | 2557,85, | 2558,1, | 2558,2, | 2558,3, | 2558,4, | 2558,5, | 2558,6, | 2558,7, | 2558,8, | 2558,9, | 2558,10, | 2558,11, | 2558,12, | 2558,13, | 2558,14, | 2558,15, | 2558,16, | 2558,17, | 2558,18, | 2558,19, | 2558,20, | 2558,21, | 2558,22, | 2558,23, | 2558,24, | 2558,25, | 2558,26, | 2558,27, | 2558,28, | 2558,29, | 2558,30, | 2558,31, | 2558,32, | 2558,33, | 2558,34, | 2558,35, | 2558,36, | 2558,37, | 2558,38, | 2558,39, | 2558,40, | 2558,41, | 2558,42, | 2558,43, | 2558,44, | 2558,45, | 2558,46, | 2558,47, | 2558,48, | 2558,49, | 2558,50, | 2558,51, | 2558,52, | 2558,53, | 2558,54, | 2558,55, | 2558,56, | 2558,57, | 2558,58, | 2558,59, | 2558,60, | 2558,61, | 2558,62, | 2558,63, | 2558,64, | 2558,65, | 2558,66, | 2558,67, | 2558,68, | 2558,69, | 2558,70, | 2558,71, | 2558,72, | 2558,73, | 2558,74, | 2558,75, | 2558,76, | 2558,77, | 2558,78, | 2558,79, | 2558,80, | 2558,81, | 2558,82, | 2558,83, | 2558,84, | 2558,85, | 2559,1, | 2559,2, | 2559,3, | 2559,4, | 2559,5, | 2559,6, | 2559,7, | 2559,8, | 2559,9, | 2559,10, | 2559,11, | 2559,12, | 2559,13, | 2559,14, | 2559,15, | 2559,16, | 2559,17, | 2559,18, | 2559,19, | 2559,20, | 2559,21, | 2559,22, | 2559,23, | 2559,24, | 2559,25, | 2559,26, | 2559,27, | 2559,28, | 2559,29, | 2559,30, | 2559,31, | 2559,32, | 2559,33, | 2559,34, | 2559,35, | 2559,36, | 2559,37, | 2559,38, | 2559,39, | 2559,40, | 2559,41, | 2559,42, | 2559,43, | 2559,44, | 2559,45, | 2559,46, | 2559,47, | 2559,48, | 2559,49, | 2559,50, | 2559,51, | 2559,52, | 2559,53, | 2559,54, | 2559,55, | 2559,56, | 2559,57, | 2559,58, | 2559,59, | 2559,60, | 2559,61, | 2559,62, | 2559,63, | 2559,64, | 2559,65, | 2559,66, | 2559,67, | 2559,68, | 2559,69, | 2559,70, | 2559,71, | 2559,72, | 2559,73, | 2559,74, | 2559,75, | 2559,76, | 2559,77, | 2559,78, | 2559,79, | 2559,80, | 2559,81, | 2559,82, | 2559,83, | 2559,84, | 2559,85, | 2560,1, | 2560,2, | 2560,3, | 2560,4, | 2560,5, | 2560,6, | 2560,7, | 2560,8, | 2560,9, | 2560,10, | 2560,11, | 2560,12, | 2560,13, | 2560,14, | 2560,15, | 2560,16, | 2560,17, | 2560,18, | 2560,19, | 2560,20, | 2560,21, | 2560,22, | 2560,23, | 2560,24, | 2560,25, | 2560,26, | 2560,27, | 2560,28, | 2560,29, | 2560,30, | 2560,31, | 2560,32, | 2560,33, | 2560,34, | 2560,35, | 2560,36, | 2560,37, | 2560,38, | 2560,39, | 2560,40, | 2560,41, | 2560,42, | 2560,43, | 2560,44, | 2560,45, | 2560,46, | 2560,47, | 2560,48, | 2560,49, | 2560,50, | 2560,51, | 2560,52, | 2560,53, | 2560,54, | 2560,55, | 2560,56, | 2560,57, | 2560,58, | 2560,59, | 2560,60, | 2560,61, | 2560,62, | 2560,63, | 2560,64, | 2560,65, | 2560,66, | 2560,67, | 2560,68, | 2560,69, | 2560,70, | 2560,71, | 2560,72, | 2560,73, | 2560,74, | 2560,75, | 2560,76, | 2560,77, | 2560,78, | 2560,79, | 2560,80, | 2560,81, | 2560,82, | 2560,83, | 2560,84, | 2560,85, | 2561,1, | 2561,2, | 2561,3, | 2561,4, | 2561,5, | 2561,6, | 2561,7, | 2561,8, | 2561,9, | 2561,10, | 2561,11, | 2561,12, | 2561,13, | 2561,14, | 2561,15, | 2561,16, | 2561,17, | 2561,18, | 2561,19, | 2561,20, | 2561,21, | 2561,22, | 2561,23, | 2561,24, | 2561,25, | 2561,26, | 2561,27, | 2561,28, | 2561,29, | 2561,30, | 2561,31, | 2561,32, | 2561,33, | 2561,34, | 2561,35, | 2561,36, | 2561,37, | 2561,38, | 2561,39, | 2561,40, | 2561,41, | 2561,42, | 2561,43, | 2561,44, | 2561,45, | 2561,46, | 2561,47, | 2561,48, | 2561,49, | 2561,50, | 2561,51, | 2561,52, | 2561,53, | 2561,54, | 2561,55, | 2561,56, | 2561,57, | 2561,58, | 2561,59, | 2561,60, | 2561,61, | 2561,62, | 2561,63, | 2561,64, | 2561,65, | 2561,66, | 2561,67, | 2561,68, | 2561,69, | 2561,70, | 2561,71, | 2561,72, | 2561,73, | 2561,74, | 2561,75, | 2561,76, | 2561,77, | 2561,78, | 2561,79, | 2561,80, | 2561,81, | 2561,82, | 2561,83, | 2561,84, | 2561,85, | 2562,1, | 2562,2, | 2562,3, | 2562,4, | 2562,5, | 2562,6, | 2562,7, | 2562,8, | 2562,9, | 2562,10, | 2562,11, | 2562,12, | 2562,13, | 2562,14, | 2562,15, | 2562,16, | 2562,17, | 2562,18, | 2562,19, | 2562,20, | 2562,21, | 2562,22, | 2562,23, | 2562,24, | 2562,25, | 2562,26, | 2562,27, | 2562,28, | 2562,29, | 2562,30, | 2562,31, | 2562,32, | 2562,33, | 2562,34, | 2562,35, | 2562,36, | 2562,37, | 2562,38, | 2562,39, | 2562,40, | 2562,41, | 2562,42, | 2562,43, | 2562,44, | 2562,45, | 2562,46, | 2562,47, | 2562,48, | 2562,49, | 2562,50, | 2562,51, | 2562,52, | 2562,53, | 2562,54, | 2562,55, | 2562,56, | 2562,57, | 2562,58, | 2562,59, | 2562,60, | 2562,61, | 2562,62, | 2562,63, | 2562,64, | 2562,65, | 2562,66, | 2562,67, | 2562,68, | 2562,69, | 2562,70, | 2562,71, | 2562,72, | 2562,73, | 2562,74, | 2562,75, | 2562,76, | 2562,77, | 2562,78, | 2562,79, | 2562,80, | 2562,81, | 2562,82, | 2562,83, | 2562,84, | 2562,85, | 2563,1, | 2563,2, | 2563,3, | 2563,4, | 2563,5, | 2563,6, | 2563,7, | 2563,8, | 2563,9, | 2563,10, | 2563,11, | 2563,12, | 2563,13, | 2563,14, | 2563,15, | 2563,16, | 2563,17, | 2563,18, | 2563,19, | 2563,20, | 2563,21, | 2563,22, | 2563,23, | 2563,24, | 2563,25, | 2563,26, | 2563,27, | 2563,28, | 2563,29, | 2563,30, | 2563,31, | 2563,32, | 2563,33, | 2563,34, | 2563,35, | 2563,36, | 2563,37, | 2563,38, | 2563,39, | 2563,40, | 2563,41, | 2563,42, | 2563,43, | 2563,44, | 2563,45, | 2563,46, | 2563,47, | 2563,48, | 2563,49, | 2563,50, | 2563,51, | 2563,52, | 2563,53, | 2563,54, | 2563,55, | 2563,56, | 2563,57, | 2563,58, | 2563,59, | 2563,60, | 2563,61, | 2563,62, | 2563,63, | 2563,64, | 2563,65, | 2563,66, | 2563,67, | 2563,68, | 2563,69, | 2563,70, | 2563,71, | 2563,72, | 2563,73, | 2563,74, | 2563,75, | 2563,76, | 2563,77, | 2563,78, | 2563,79, | 2563,80, | 2563,81, | 2563,82, | 2563,83, | 2563,84, | 2563,85, | 2564,1, | 2564,2, | 2564,3, | 2564,4, | 2564,5, | 2564,6, | 2564,7, | 2564,8, | 2564,9, | 2564,10, | 2564,11, | 2564,12, | 2564,13, | 2564,14, | 2564,15, | 2564,16, | 2564,17, | 2564,18, | 2564,19, | 2564,20, | 2564,21, | 2564,22, | 2564,23, | 2564,24, | 2564,25, | 2564,26, | 2564,27, | 2564,28, | 2564,29, | 2564,30, | 2564,31, | 2564,32, | 2564,33, | 2564,34, | 2564,35, | 2564,36, | 2564,37, | 2564,38, | 2564,39, | 2564,40, | 2564,41, | 2564,42, | 2564,43, | 2564,44, | 2564,45, | 2564,46, | 2564,47, | 2564,48, | 2564,49, | 2564,50, | 2564,51, | 2564,52, | 2564,53, | 2564,54, | 2564,55, | 2564,56, | 2564,57, | 2564,58, | 2564,59, | 2564,60, | 2564,61, | 2564,62, | 2564,63, | 2564,64, | 2564,65, | 2564,66, | 2564,67, | 2564,68, | 2564,69, | 2564,70, | 2564,71, | 2564,72, | 2564,73, | 2564,74, | 2564,75, | 2564,76, | 2564,77, | 2564,78, | 2564,79, | 2564,80, | 2564,81, | 2564,82, | 2564,83, | 2564,84, | 2564,85, | 2565,1, | 2565,2, | 2565,3, | 2565,4, | 2565,5, | 2565,6, | 2565,7, | 2565,8, | 2565,9, | 2565,10, | 2565,11, | 2565,12, | 2565,13, | 2565,14, | 2565,15, | 2565,16, | 2565,17, | 2565,18, | 2565,19, | 2565,20, | 2565,21, | 2565,22, | 2565,23, | 2565,24, | 2565,25, | 2565,26, | 2565,27, | 2565,28, | 2565,29, | 2565,30, | 2565,31, | 2565,32, | 2565,33, | 2565,34, | 2565,35, | 2565,36, | 2565,37, | 2565,38, | 2565,39, | 2565,40, | 2565,41, | 2565,42, | 2565,43, | 2565,44, | 2565,45, | 2565,46, | 2565,47, | 2565,48, | 2565,49, | 2565,50, | 2565,51, | 2565,52, | 2565,53, | 2565,54, | 2565,55, | 2565,56, | 2565,57, | 2565,58, | 2565,59, | 2565,60, | 2565,61, | 2565,62, | 2565,63, | 2565,64, | 2565,65, | 2565,66, | 2565,67, | 2565,68, | 2565,69, | 2565,70, | 2565,71, | 2565,72, | 2565,73, | 2565,74, | 2565,75, | 2565,76, | 2565,77, | 2565,78, | 2565,79, | 2565,80, | 2565,81, | 2565,82, | 2565,83, | 2565,84, | 2565,85, | 2566,1, | 2566,2, | 2566,3, | 2566,4, | 2566,5, | 2566,6, | 2566,7, | 2566,8, | 2566,9, | 2566,10, | 2566,11, | 2566,12, | 2566,13, | 2566,14, | 2566,15, | 2566,16, | 2566,17, | 2566,18, | 2566,19, | 2566,20, | 2566,21, | 2566,22, | 2566,23, | 2566,24, | 2566,25, | 2566,26, | 2566,27, | 2566,28, | 2566,29, | 2566,30, | 2566,31, | 2566,32, | 2566,33, | 2566,34, | 2566,35, | 2566,36, | 2566,37, | 2566,38, | 2566,39, | 2566,40, | 2566,41, | 2566,42, | 2566,43, | 2566,44, | 2566,45, | 2566,46, | 2566,47, | 2566,48, | 2566,49, | 2566,50, | 2566,51, | 2566,52, | 2566,53, | 2566,54, | 2566,55, | 2566,56, | 2566,57, | 2566,58, | 2566,59, | 2566,60, | 2566,61, | 2566,62, | 2566,63, | 2566,64, | 2566,65, | 2566,66, | 2566,67, | 2566,68, | 2566,69, | 2566,70, | 2566,71, | 2566,72, | 2566,73, | 2566,74, | 2566,75, | 2566,76, | 2566,77, | 2566,78, | 2566,79, | 2566,80, | 2566,81, | 2566,82, | 2566,83, | 2566,84, | 2566,85, | 2567,1, | 2567,2, | 2567,3, | 2567,4, | 2567,5, | 2567,6, | 2567,7, | 2567,8, | 2567,9, | 2567,10, | 2567,11, | 2567,12, | 2567,13, | 2567,14, | 2567,15, | 2567,16, | 2567,17, | 2567,18, | 2567,19, | 2567,20, | 2567,21, | 2567,22, | 2567,23, | 2567,24, | 2567,25, | 2567,26, | 2567,27, | 2567,28, | 2567,29, | 2567,30, | 2567,31, | 2567,32, | 2567,33, | 2567,34, | 2567,35, | 2567,36, | 2567,37, | 2567,38, | 2567,39, | 2567,40, | 2567,41, | 2567,42, | 2567,43, | 2567,44, | 2567,45, | 2567,46, | 2567,47, | 2567,48, | 2567,49, | 2567,50, | 2567,51, | 2567,52, | 2567,53, | 2567,54, | 2567,55, | 2567,56, | 2567,57, | 2567,58, | 2567,59, | 2567,60, | 2567,61, | 2567,62, | 2567,63, | 2567,64, | 2567,65, | 2567,66, | 2567,67, | 2567,68, | 2567,69, | 2567,70, | 2567,71, | 2567,72, | 2567,73, | 2567,74, | 2567,75, | 2567,76, | 2567,77, | 2567,78, | 2567,79, | 2567,80, | 2567,81, | 2567,82, | 2567,83, | 2567,84, | 2567,85, | 2568,1, | 2568,2, | 2568,3, | 2568,4, | 2568,5, | 2568,6, | 2568,7, | 2568,8, | 2568,9, | 2568,10, | 2568,11, | 2568,12, | 2568,13, | 2568,14, | 2568,15, | 2568,16, | 2568,17, | 2568,18, | 2568,19, | 2568,20, | 2568,21, | 2568,22, | 2568,23, | 2568,24, | 2568,25, | 2568,26, | 2568,27, | 2568,28, | 2568,29, | 2568,30, | 2568,31, | 2568,32, | 2568,33, | 2568,34, | 2568,35, | 2568,36, | 2568,37, | 2568,38, | 2568,39, | 2568,40, | 2568,41, | 2568,42, | 2568,43, | 2568,44, | 2568,45, | 2568,46, | 2568,47, | 2568,48, | 2568,49, | 2568,50, | 2568,51, | 2568,52, | 2568,53, | 2568,54, | 2568,55, | 2568,56, | 2568,57, | 2568,58, | 2568,59, | 2568,60, | 2568,61, | 2568,62, | 2568,63, | 2568,64, | 2568,65, | 2568,66, | 2568,67, | 2568,68, | 2568,69, | 2568,70, | 2568,71, | 2568,72, | 2568,73, | 2568,74, | 2568,75, | 2568,76, | 2568,77, | 2568,78, | 2568,79, | 2568,80, | 2568,81, | 2568,82, | 2568,83, | 2568,84, | 2568,85, | 2569,1, | 2569,2, | 2569,3, | 2569,4, | 2569,5, | 2569,6, | 2569,7, | 2569,8, | 2569,9, | 2569,10, | 2569,11, | 2569,12, | 2569,13, | 2569,14, | 2569,15, | 2569,16, | 2569,17, | 2569,18, | 2569,19, | 2569,20, | 2569,21, | 2569,22, | 2569,23, | 2569,24, | 2569,25, | 2569,26, | 2569,27, | 2569,28, | 2569,29, | 2569,30, | 2569,31, | 2569,32, | 2569,33, | 2569,34, | 2569,35, | 2569,36, | 2569,37, | 2569,38, | 2569,39, | 2569,40, | 2569,41, | 2569,42, | 2569,43, | 2569,44, | 2569,45, | 2569,46, | 2569,47, | 2569,48, | 2569,49, | 2569,50, | 2569,51, | 2569,52, | 2569,53, | 2569,54, | 2569,55, | 2569,56, | 2569,57, | 2569,58, | 2569,59, | 2569,60, | 2569,61, | 2569,62, | 2569,63, | 2569,64, | 2569,65, | 2569,66, | 2569,67, | 2569,68, | 2569,69, | 2569,70, | 2569,71, | 2569,72, | 2569,73, | 2569,74, | 2569,75, | 2569,76, | 2569,77, | 2569,78, | 2569,79, | 2569,80, | 2569,81, | 2569,82, | 2569,83, | 2569,84, | 2569,85, | 2570,1, | 2570,2, | 2570,3, | 2570,4, | 2570,5, | 2570,6, | 2570,7, | 2570,8, | 2570,9, | 2570,10, | 2570,11, | 2570,12, | 2570,13, | 2570,14, | 2570,15, | 2570,16, | 2570,17, | 2570,18, | 2570,19, | 2570,20, | 2570,21, | 2570,22, | 2570,23, | 2570,24, | 2570,25, | 2570,26, | 2570,27, | 2570,28, | 2570,29, | 2570,30, | 2570,31, | 2570,32, | 2570,33, | 2570,34, | 2570,35, | 2570,36, | 2570,37, | 2570,38, | 2570,39, | 2570,40, | 2570,41, | 2570,42, | 2570,43, | 2570,44, | 2570,45, | 2570,46, | 2570,47, | 2570,48, | 2570,49, | 2570,50, | 2570,51, | 2570,52, | 2570,53, | 2570,54, | 2570,55, | 2570,56, | 2570,57, | 2570,58, | 2570,59, | 2570,60, | 2570,61, | 2570,62, | 2570,63, | 2570,64, | 2570,65, | 2570,66, | 2570,67, | 2570,68, | 2570,69, | 2570,70, | 2570,71, | 2570,72, | 2570,73, | 2570,74, | 2570,75, | 2570,76, | 2570,77, | 2570,78, | 2570,79, | 2570,80, | 2570,81, | 2570,82, | 2570,83, | 2570,84, | 2570,85, | 2571,1, | 2571,2, | 2571,3, | 2571,4, | 2571,5, | 2571,6, | 2571,7, | 2571,8, | 2571,9, | 2571,10, | 2571,11, | 2571,12, | 2571,13, | 2571,14, | 2571,15, | 2571,16, | 2571,17, | 2571,18, | 2571,19, | 2571,20, | 2571,21, | 2571,22, | 2571,23, | 2571,24, | 2571,25, | 2571,26, | 2571,27, | 2571,28, | 2571,29, | 2571,30, | 2571,31, | 2571,32, | 2571,33, | 2571,34, | 2571,35, | 2571,36, | 2571,37, | 2571,38, | 2571,39, | 2571,40, | 2571,41, | 2571,42, | 2571,43, | 2571,44, | 2571,45, | 2571,46, | 2571,47, | 2571,48, | 2571,49, | 2571,50, | 2571,51, | 2571,52, | 2571,53, | 2571,54, | 2571,55, | 2571,56, | 2571,57, | 2571,58, | 2571,59, | 2571,60, | 2571,61, | 2571,62, | 2571,63, | 2571,64, | 2571,65, | 2571,66, | 2571,67, | 2571,68, | 2571,69, | 2571,70, | 2571,71, | 2571,72, | 2571,73, | 2571,74, | 2571,75, | 2571,76, | 2571,77, | 2571,78, | 2571,79, | 2571,80, | 2571,81, | 2571,82, | 2571,83, | 2571,84, | 2571,85, | 2572,1, | 2572,2, | 2572,3, | 2572,4, | 2572,5, | 2572,6, | 2572,7, | 2572,8, | 2572,9, | 2572,10, | 2572,11, | 2572,12, | 2572,13, | 2572,14, | 2572,15, | 2572,16, | 2572,17, | 2572,18, | 2572,19, | 2572,20, | 2572,21, | 2572,22, | 2572,23, | 2572,24, | 2572,25, | 2572,26, | 2572,27, | 2572,28, | 2572,29, | 2572,30, | 2572,31, | 2572,32, | 2572,33, | 2572,34, | 2572,35, | 2572,36, | 2572,37, | 2572,38, | 2572,39, | 2572,40, | 2572,41, | 2572,42, | 2572,43, | 2572,44, | 2572,45, | 2572,46, | 2572,47, | 2572,48, | 2572,49, | 2572,50, | 2572,51, | 2572,52, | 2572,53, | 2572,54, | 2572,55, | 2572,56, | 2572,57, | 2572,58, | 2572,59, | 2572,60, | 2572,61, | 2572,62, | 2572,63, | 2572,64, | 2572,65, | 2572,66, | 2572,67, | 2572,68, | 2572,69, | 2572,70, | 2572,71, | 2572,72, | 2572,73, | 2572,74, | 2572,75, | 2572,76, | 2572,77, | 2572,78, | 2572,79, | 2572,80, | 2572,81, | 2572,82, | 2572,83, | 2572,84, | 2572,85, | 2573,1, | 2573,2, | 2573,3, | 2573,4, | 2573,5, | 2573,6, | 2573,7, | 2573,8, | 2573,9, | 2573,10, | 2573,11, | 2573,12, | 2573,13, | 2573,14, | 2573,15, | 2573,16, | 2573,17, | 2573,18, | 2573,19, | 2573,20, | 2573,21, | 2573,22, | 2573,23, | 2573,24, | 2573,25, | 2573,26, | 2573,27, | 2573,28, | 2573,29, | 2573,30, | 2573,31, | 2573,32, | 2573,33, | 2573,34, | 2573,35, | 2573,36, | 2573,37, | 2573,38, | 2573,39, | 2573,40, | 2573,41, | 2573,42, | 2573,43, | 2573,44, | 2573,45, | 2573,46, | 2573,47, | 2573,48, | 2573,49, | 2573,50, | 2573,51, | 2573,52, | 2573,53, | 2573,54, | 2573,55, | 2573,56, | 2573,57, | 2573,58, | 2573,59, | 2573,60, | 2573,61, | 2573,62, | 2573,63, | 2573,64, | 2573,65, | 2573,66, | 2573,67, | 2573,68, | 2573,69, | 2573,70, | 2573,71, | 2573,72, | 2573,73, | 2573,74, | 2573,75, | 2573,76, | 2573,77, | 2573,78, | 2573,79, | 2573,80, | 2573,81, | 2573,82, | 2573,83, | 2573,84, | 2573,85, | 2574,1, | 2574,2, | 2574,3, | 2574,4, | 2574,5, | 2574,6, | 2574,7, | 2574,8, | 2574,9, | 2574,10, | 2574,11, | 2574,12, | 2574,13, | 2574,14, | 2574,15, | 2574,16, | 2574,17, | 2574,18, | 2574,19, | 2574,20, | 2574,21, | 2574,22, | 2574,23, | 2574,24, | 2574,25, | 2574,26, | 2574,27, | 2574,28, | 2574,29, | 2574,30, | 2574,31, | 2574,32, | 2574,33, | 2574,34, | 2574,35, | 2574,36, | 2574,37, | 2574,38, | 2574,39, | 2574,40, | 2574,41, | 2574,42, | 2574,43, | 2574,44, | 2574,45, | 2574,46, | 2574,47, | 2574,48, | 2574,49, | 2574,50, | 2574,51, | 2574,52, | 2574,53, | 2574,54, | 2574,55, | 2574,56, | 2574,57, | 2574,58, | 2574,59, | 2574,60, | 2574,61, | 2574,62, | 2574,63, | 2574,64, | 2574,65, | 2574,66, | 2574,67, | 2574,68, | 2574,69, | 2574,70, | 2574,71, | 2574,72, | 2574,73, | 2574,74, | 2574,75, | 2574,76, | 2574,77, | 2574,78, | 2574,79, | 2574,80, | 2574,81, | 2574,82, | 2574,83, | 2574,84, | 2574,85, | 2575,1, | 2575,2, | 2575,3, | 2575,4, | 2575,5, | 2575,6, | 2575,7, | 2575,8, | 2575,9, | 2575,10, | 2575,11, | 2575,12, | 2575,13, | 2575,14, | 2575,15, | 2575,16, | 2575,17, | 2575,18, | 2575,19, | 2575,20, | 2575,21, | 2575,22, | 2575,23, | 2575,24, | 2575,25, | 2575,26, | 2575,27, | 2575,28, | 2575,29, | 2575,30, | 2575,31, | 2575,32, | 2575,33, | 2575,34, | 2575,35, | 2575,36, | 2575,37, | 2575,38, | 2575,39, | 2575,40, | 2575,41, | 2575,42, | 2575,43, | 2575,44, | 2575,45, | 2575,46, | 2575,47, | 2575,48, | 2575,49, | 2575,50, | 2575,51, | 2575,52, | 2575,53, | 2575,54, | 2575,55, | 2575,56, | 2575,57, | 2575,58, | 2575,59, | 2575,60, | 2575,61, | 2575,62, | 2575,63, | 2575,64, | 2575,65, | 2575,66, | 2575,67, | 2575,68, | 2575,69, | 2575,70, | 2575,71, | 2575,72, | 2575,73, | 2575,74, | 2575,75, | 2575,76, | 2575,77, | 2575,78, | 2575,79, | 2575,80, | 2575,81, | 2575,82, | 2575,83, | 2575,84, | 2575,85, | 2576,1, | 2576,2, | 2576,3, | 2576,4, | 2576,5, | 2576,6, | 2576,7, | 2576,8, | 2576,9, | 2576,10, | 2576,11, | 2576,12, | 2576,13, | 2576,14, | 2576,15, | 2576,16, | 2576,17, | 2576,18, | 2576,19, | 2576,20, | 2576,21, | 2576,22, | 2576,23, | 2576,24, | 2576,25, | 2576,26, | 2576,27, | 2576,28, | 2576,29, | 2576,30, | 2576,31, | 2576,32, | 2576,33, | 2576,34, | 2576,35, | 2576,36, | 2576,37, | 2576,38, | 2576,39, | 2576,40, | 2576,41, | 2576,42, | 2576,43, | 2576,44, | 2576,45, | 2576,46, | 2576,47, | 2576,48, | 2576,49, | 2576,50, | 2576,51, | 2576,52, | 2576,53, | 2576,54, | 2576,55, | 2576,56, | 2576,57, | 2576,58, | 2576,59, | 2576,60, | 2576,61, | 2576,62, | 2576,63, | 2576,64, | 2576,65, | 2576,66, | 2576,67, | 2576,68, | 2576,69, | 2576,70, | 2576,71, | 2576,72, | 2576,73, | 2576,74, | 2576,75, | 2576,76, | 2576,77, | 2576,78, | 2576,79, | 2576,80, | 2576,81, | 2576,82, | 2576,83, | 2576,84, | 2576,85, | 2577,1, | 2577,2, | 2577,3, | 2577,4, | 2577,5, | 2577,6, | 2577,7, | 2577,8, | 2577,9, | 2577,10, | 2577,11, | 2577,12, | 2577,13, | 2577,14, | 2577,15, | 2577,16, | 2577,17, | 2577,18, | 2577,19, | 2577,20, | 2577,21, | 2577,22, | 2577,23, | 2577,24, | 2577,25, | 2577,26, | 2577,27, | 2577,28, | 2577,29, | 2577,30, | 2577,31, | 2577,32, | 2577,33, | 2577,34, | 2577,35, | 2577,36, | 2577,37, | 2577,38, | 2577,39, | 2577,40, | 2577,41, | 2577,42, | 2577,43, | 2577,44, | 2577,45, | 2577,46, | 2577,47, | 2577,48, | 2577,49, | 2577,50, | 2577,51, | 2577,52, | 2577,53, | 2577,54, | 2577,55, | 2577,56, | 2577,57, | 2577,58, | 2577,59, | 2577,60, | 2577,61, | 2577,62, | 2577,63, | 2577,64, | 2577,65, | 2577,66, | 2577,67, | 2577,68, | 2577,69, | 2577,70, | 2577,71, | 2577,72, | 2577,73, | 2577,74, | 2577,75, | 2577,76, | 2577,77, | 2577,78, | 2577,79, | 2577,80, | 2577,81, | 2577,82, | 2577,83, | 2577,84, | 2577,85, | 2578,1, | 2578,2, | 2578,3, | 2578,4, | 2578,5, | 2578,6, | 2578,7, | 2578,8, | 2578,9, | 2578,10, | 2578,11, | 2578,12, | 2578,13, | 2578,14, | 2578,15, | 2578,16, | 2578,17, | 2578,18, | 2578,19, | 2578,20, | 2578,21, | 2578,22, | 2578,23, | 2578,24, | 2578,25, | 2578,26, | 2578,27, | 2578,28, | 2578,29, | 2578,30, | 2578,31, | 2578,32, | 2578,33, | 2578,34, | 2578,35, | 2578,36, | 2578,37, | 2578,38, | 2578,39, | 2578,40, | 2578,41, | 2578,42, | 2578,43, | 2578,44, | 2578,45, | 2578,46, | 2578,47, | 2578,48, | 2578,49, | 2578,50, | 2578,51, | 2578,52, | 2578,53, | 2578,54, | 2578,55, | 2578,56, | 2578,57, | 2578,58, | 2578,59, | 2578,60, | 2578,61, | 2578,62, | 2578,63, | 2578,64, | 2578,65, | 2578,66, | 2578,67, | 2578,68, | 2578,69, | 2578,70, | 2578,71, | 2578,72, | 2578,73, | 2578,74, | 2578,75, | 2578,76, | 2578,77, | 2578,78, | 2578,79, | 2578,80, | 2578,81, | 2578,82, | 2578,83, | 2578,84, | 2578,85, | 2579,1, | 2579,2, | 2579,3, | 2579,4, | 2579,5, | 2579,6, | 2579,7, | 2579,8, | 2579,9, | 2579,10, | 2579,11, | 2579,12, | 2579,13, | 2579,14, | 2579,15, | 2579,16, | 2579,17, | 2579,18, | 2579,19, | 2579,20, | 2579,21, | 2579,22, | 2579,23, | 2579,24, | 2579,25, | 2579,26, | 2579,27, | 2579,28, | 2579,29, | 2579,30, | 2579,31, | 2579,32, | 2579,33, | 2579,34, | 2579,35, | 2579,36, | 2579,37, | 2579,38, | 2579,39, | 2579,40, | 2579,41, | 2579,42, | 2579,43, | 2579,44, | 2579,45, | 2579,46, | 2579,47, | 2579,48, | 2579,49, | 2579,50, | 2579,51, | 2579,52, | 2579,53, | 2579,54, | 2579,55, | 2579,56, | 2579,57, | 2579,58, | 2579,59, | 2579,60, | 2579,61, | 2579,62, | 2579,63, | 2579,64, | 2579,65, | 2579,66, | 2579,67, | 2579,68, | 2579,69, | 2579,70, | 2579,71, | 2579,72, | 2579,73, | 2579,74, | 2579,75, | 2579,76, | 2579,77, | 2579,78, | 2579,79, | 2579,80, | 2579,81, | 2579,82, | 2579,83, | 2579,84, | 2579,85, | 2580,1, | 2580,2, | 2580,3, | 2580,4, | 2580,5, | 2580,6, | 2580,7, | 2580,8, | 2580,9, | 2580,10, | 2580,11, | 2580,12, | 2580,13, | 2580,14, | 2580,15, | 2580,16, | 2580,17, | 2580,18, | 2580,19, | 2580,20, | 2580,21, | 2580,22, | 2580,23, | 2580,24, | 2580,25, | 2580,26, | 2580,27, | 2580,28, | 2580,29, | 2580,30, | 2580,31, | 2580,32, | 2580,33, | 2580,34, | 2580,35, | 2580,36, | 2580,37, | 2580,38, | 2580,39, | 2580,40, | 2580,41, | 2580,42, | 2580,43, | 2580,44, | 2580,45, | 2580,46, | 2580,47, | 2580,48, | 2580,49, | 2580,50, | 2580,51, | 2580,52, | 2580,53, | 2580,54, | 2580,55, | 2580,56, | 2580,57, | 2580,58, | 2580,59, | 2580,60, | 2580,61, | 2580,62, | 2580,63, | 2580,64, | 2580,65, | 2580,66, | 2580,67, | 2580,68, | 2580,69, | 2580,70, | 2580,71, | 2580,72, | 2580,73, | 2580,74, | 2580,75, | 2580,76, | 2580,77, | 2580,78, | 2580,79, | 2580,80, | 2580,81, | 2580,82, | 2580,83, | 2580,84, | 2580,85, | 2581,1, | 2581,2, | 2581,3, | 2581,4, | 2581,5, | 2581,6, | 2581,7, | 2581,8, | 2581,9, | 2581,10, | 2581,11, | 2581,12, | 2581,13, | 2581,14, | 2581,15, | 2581,16, | 2581,17, | 2581,18, | 2581,19, | 2581,20, | 2581,21, | 2581,22, | 2581,23, | 2581,24, | 2581,25, | 2581,26, | 2581,27, | 2581,28, | 2581,29, | 2581,30, | 2581,31, | 2581,32, | 2581,33, | 2581,34, | 2581,35, | 2581,36, | 2581,37, | 2581,38, | 2581,39, | 2581,40, | 2581,41, | 2581,42, | 2581,43, | 2581,44, | 2581,45, | 2581,46, | 2581,47, | 2581,48, | 2581,49, | 2581,50, | 2581,51, | 2581,52, | 2581,53, | 2581,54, | 2581,55, | 2581,56, | 2581,57, | 2581,58, | 2581,59, | 2581,60, | 2581,61, | 2581,62, | 2581,63, | 2581,64, | 2581,65, | 2581,66, | 2581,67, | 2581,68, | 2581,69, | 2581,70, | 2581,71, | 2581,72, | 2581,73, | 2581,74, | 2581,75, | 2581,76, | 2581,77, | 2581,78, | 2581,79, | 2581,80, | 2581,81, | 2581,82, | 2581,83, | 2581,84, | 2581,85, | 2582,1, | 2582,2, | 2582,3, | 2582,4, | 2582,5, | 2582,6, | 2582,7, | 2582,8, | 2582,9, | 2582,10, | 2582,11, | 2582,12, | 2582,13, | 2582,14, | 2582,15, | 2582,16, | 2582,17, | 2582,18, | 2582,19, | 2582,20, | 2582,21, | 2582,22, | 2582,23, | 2582,24, | 2582,25, | 2582,26, | 2582,27, | 2582,28, | 2582,29, | 2582,30, | 2582,31, | 2582,32, | 2582,33, | 2582,34, | 2582,35, | 2582,36, | 2582,37, | 2582,38, | 2582,39, | 2582,40, | 2582,41, | 2582,42, | 2582,43, | 2582,44, | 2582,45, | 2582,46, | 2582,47, | 2582,48, | 2582,49, | 2582,50, | 2582,51, | 2582,52, | 2582,53, | 2582,54, | 2582,55, | 2582,56, | 2582,57, | 2582,58, | 2582,59, | 2582,60, | 2582,61, | 2582,62, | 2582,63, | 2582,64, | 2582,65, | 2582,66, | 2582,67, | 2582,68, | 2582,69, | 2582,70, | 2582,71, | 2582,72, | 2582,73, | 2582,74, | 2582,75, | 2582,76, | 2582,77, | 2582,78, | 2582,79, | 2582,80, | 2582,81, | 2582,82, | 2582,83, | 2582,84, | 2582,85, | 2583,1, | 2583,2, | 2583,3, | 2583,4, | 2583,5, | 2583,6, | 2583,7, | 2583,8, | 2583,9, | 2583,10, | 2583,11, | 2583,12, | 2583,13, | 2583,14, | 2583,15, | 2583,16, | 2583,17, | 2583,18, | 2583,19, | 2583,20, | 2583,21, | 2583,22, | 2583,23, | 2583,24, | 2583,25, | 2583,26, | 2583,27, | 2583,28, | 2583,29, | 2583,30, | 2583,31, | 2583,32, | 2583,33, | 2583,34, | 2583,35, | 2583,36, | 2583,37, | 2583,38, | 2583,39, | 2583,40, | 2583,41, | 2583,42, | 2583,43, | 2583,44, | 2583,45, | 2583,46, | 2583,47, | 2583,48, | 2583,49, | 2583,50, | 2583,51, | 2583,52, | 2583,53, | 2583,54, | 2583,55, | 2583,56, | 2583,57, | 2583,58, | 2583,59, | 2583,60, | 2583,61, | 2583,62, | 2583,63, | 2583,64, | 2583,65, | 2583,66, | 2583,67, | 2583,68, | 2583,69, | 2583,70, | 2583,71, | 2583,72, | 2583,73, | 2583,74, | 2583,75, | 2583,76, | 2583,77, | 2583,78, | 2583,79, | 2583,80, | 2583,81, | 2583,82, | 2583,83, | 2583,84, | 2583,85, | 2584,1, | 2584,2, | 2584,3, | 2584,4, | 2584,5, | 2584,6, | 2584,7, | 2584,8, | 2584,9, | 2584,10, | 2584,11, | 2584,12, | 2584,13, | 2584,14, | 2584,15, | 2584,16, | 2584,17, | 2584,18, | 2584,19, | 2584,20, | 2584,21, | 2584,22, | 2584,23, | 2584,24, | 2584,25, | 2584,26, | 2584,27, | 2584,28, | 2584,29, | 2584,30, | 2584,31, | 2584,32, | 2584,33, | 2584,34, | 2584,35, | 2584,36, | 2584,37, | 2584,38, | 2584,39, | 2584,40, | 2584,41, | 2584,42, | 2584,43, | 2584,44, | 2584,45, | 2584,46, | 2584,47, | 2584,48, | 2584,49, | 2584,50, | 2584,51, | 2584,52, | 2584,53, | 2584,54, | 2584,55, | 2584,56, | 2584,57, | 2584,58, | 2584,59, | 2584,60, | 2584,61, | 2584,62, | 2584,63, | 2584,64, | 2584,65, | 2584,66, | 2584,67, | 2584,68, | 2584,69, | 2584,70, | 2584,71, | 2584,72, | 2584,73, | 2584,74, | 2584,75, | 2584,76, | 2584,77, | 2584,78, | 2584,79, | 2584,80, | 2584,81, | 2584,82, | 2584,83, | 2584,84, | 2584,85, | 2585,1, | 2585,2, | 2585,3, | 2585,4, | 2585,5, | 2585,6, | 2585,7, | 2585,8, | 2585,9, | 2585,10, | 2585,11, | 2585,12, | 2585,13, | 2585,14, | 2585,15, | 2585,16, | 2585,17, | 2585,18, | 2585,19, | 2585,20, | 2585,21, | 2585,22, | 2585,23, | 2585,24, | 2585,25, | 2585,26, | 2585,27, | 2585,28, | 2585,29, | 2585,30, | 2585,31, | 2585,32, | 2585,33, | 2585,34, | 2585,35, | 2585,36, | 2585,37, | 2585,38, | 2585,39, | 2585,40, | 2585,41, | 2585,42, | 2585,43, | 2585,44, | 2585,45, | 2585,46, | 2585,47, | 2585,48, | 2585,49, | 2585,50, | 2585,51, | 2585,52, | 2585,53, | 2585,54, | 2585,55, | 2585,56, | 2585,57, | 2585,58, | 2585,59, | 2585,60, | 2585,61, | 2585,62, | 2585,63, | 2585,64, | 2585,65, | 2585,66, | 2585,67, | 2585,68, | 2585,69, | 2585,70, | 2585,71, | 2585,72, | 2585,73, | 2585,74, | 2585,75, | 2585,76, | 2585,77, | 2585,78, | 2585,79, | 2585,80, | 2585,81, | 2585,82, | 2585,83, | 2585,84, | 2585,85, | 2586,1, | 2586,2, | 2586,3, | 2586,4, | 2586,5, | 2586,6, | 2586,7, | 2586,8, | 2586,9, | 2586,10, | 2586,11, | 2586,12, | 2586,13, | 2586,14, | 2586,15, | 2586,16, | 2586,17, | 2586,18, | 2586,19, | 2586,20, | 2586,21, | 2586,22, | 2586,23, | 2586,24, | 2586,25, | 2586,26, | 2586,27, | 2586,28, | 2586,29, | 2586,30, | 2586,31, | 2586,32, | 2586,33, | 2586,34, | 2586,35, | 2586,36, | 2586,37, | 2586,38, | 2586,39, | 2586,40, | 2586,41, | 2586,42, | 2586,43, | 2586,44, | 2586,45, | 2586,46, | 2586,47, | 2586,48, | 2586,49, | 2586,50, | 2586,51, | 2586,52, | 2586,53, | 2586,54, | 2586,55, | 2586,56, | 2586,57, | 2586,58, | 2586,59, | 2586,60, | 2586,61, | 2586,62, | 2586,63, | 2586,64, | 2586,65, | 2586,66, | 2586,67, | 2586,68, | 2586,69, | 2586,70, | 2586,71, | 2586,72, | 2586,73, | 2586,74, | 2586,75, | 2586,76, | 2586,77, | 2586,78, | 2586,79, | 2586,80, | 2586,81, | 2586,82, | 2586,83, | 2586,84, | 2586,85, | 2587,1, | 2587,2, | 2587,3, | 2587,4, | 2587,5, | 2587,6, | 2587,7, | 2587,8, | 2587,9, | 2587,10, | 2587,11, | 2587,12, | 2587,13, | 2587,14, | 2587,15, | 2587,16, | 2587,17, | 2587,18, | 2587,19, | 2587,20, | 2587,21, | 2587,22, | 2587,23, | 2587,24, | 2587,25, | 2587,26, | 2587,27, | 2587,28, | 2587,29, | 2587,30, | 2587,31, | 2587,32, | 2587,33, | 2587,34, | 2587,35, | 2587,36, | 2587,37, | 2587,38, | 2587,39, | 2587,40, | 2587,41, | 2587,42, | 2587,43, | 2587,44, | 2587,45, | 2587,46, | 2587,47, | 2587,48, | 2587,49, | 2587,50, | 2587,51, | 2587,52, | 2587,53, | 2587,54, | 2587,55, | 2587,56, | 2587,57, | 2587,58, | 2587,59, | 2587,60, | 2587,61, | 2587,62, | 2587,63, | 2587,64, | 2587,65, | 2587,66, | 2587,67, | 2587,68, | 2587,69, | 2587,70, | 2587,71, | 2587,72, | 2587,73, | 2587,74, | 2587,75, | 2587,76, | 2587,77, | 2587,78, | 2587,79, | 2587,80, | 2587,81, | 2587,82, | 2587,83, | 2587,84, | 2587,85, | 2588,1, | 2588,2, | 2588,3, | 2588,4, | 2588,5, | 2588,6, | 2588,7, | 2588,8, | 2588,9, | 2588,10, | 2588,11, | 2588,12, | 2588,13, | 2588,14, | 2588,15, | 2588,16, | 2588,17, | 2588,18, | 2588,19, | 2588,20, | 2588,21, | 2588,22, | 2588,23, | 2588,24, | 2588,25, | 2588,26, | 2588,27, | 2588,28, | 2588,29, | 2588,30, | 2588,31, | 2588,32, | 2588,33, | 2588,34, | 2588,35, | 2588,36, | 2588,37, | 2588,38, | 2588,39, | 2588,40, | 2588,41, | 2588,42, | 2588,43, | 2588,44, | 2588,45, | 2588,46, | 2588,47, | 2588,48, | 2588,49, | 2588,50, | 2588,51, | 2588,52, | 2588,53, | 2588,54, | 2588,55, | 2588,56, | 2588,57, | 2588,58, | 2588,59, | 2588,60, | 2588,61, | 2588,62, | 2588,63, | 2588,64, | 2588,65, | 2588,66, | 2588,67, | 2588,68, | 2588,69, | 2588,70, | 2588,71, | 2588,72, | 2588,73, | 2588,74, | 2588,75, | 2588,76, | 2588,77, | 2588,78, | 2588,79, | 2588,80, | 2588,81, | 2588,82, | 2588,83, | 2588,84, | 2588,85, | 2589,1, | 2589,2, | 2589,3, | 2589,4, | 2589,5, | 2589,6, | 2589,7, | 2589,8, | 2589,9, | 2589,10, | 2589,11, | 2589,12, | 2589,13, | 2589,14, | 2589,15, | 2589,16, | 2589,17, | 2589,18, | 2589,19, | 2589,20, | 2589,21, | 2589,22, | 2589,23, | 2589,24, | 2589,25, | 2589,26, | 2589,27, | 2589,28, | 2589,29, | 2589,30, | 2589,31, | 2589,32, | 2589,33, | 2589,34, | 2589,35, | 2589,36, | 2589,37, | 2589,38, | 2589,39, | 2589,40, | 2589,41, | 2589,42, | 2589,43, | 2589,44, | 2589,45, | 2589,46, | 2589,47, | 2589,48, | 2589,49, | 2589,50, | 2589,51, | 2589,52, | 2589,53, | 2589,54, | 2589,55, | 2589,56, | 2589,57, | 2589,58, | 2589,59, | 2589,60, | 2589,61, | 2589,62, | 2589,63, | 2589,64, | 2589,65, | 2589,66, | 2589,67, | 2589,68, | 2589,69, | 2589,70, | 2589,71, | 2589,72, | 2589,73, | 2589,74, | 2589,75, | 2589,76, | 2589,77, | 2589,78, | 2589,79, | 2589,80, | 2589,81, | 2589,82, | 2589,83, | 2589,84, | 2589,85, | 2590,1, | 2590,2, | 2590,3, | 2590,4, | 2590,5, | 2590,6, | 2590,7, | 2590,8, | 2590,9, | 2590,10, | 2590,11, | 2590,12, | 2590,13, | 2590,14, | 2590,15, | 2590,16, | 2590,17, | 2590,18, | 2590,19, | 2590,20, | 2590,21, | 2590,22, | 2590,23, | 2590,24, | 2590,25, | 2590,26, | 2590,27, | 2590,28, | 2590,29, | 2590,30, | 2590,31, | 2590,32, | 2590,33, | 2590,34, | 2590,35, | 2590,36, | 2590,37, | 2590,38, | 2590,39, | 2590,40, | 2590,41, | 2590,42, | 2590,43, | 2590,44, | 2590,45, | 2590,46, | 2590,47, | 2590,48, | 2590,49, | 2590,50, | 2590,51, | 2590,52, | 2590,53, | 2590,54, | 2590,55, | 2590,56, | 2590,57, | 2590,58, | 2590,59, | 2590,60, | 2590,61, | 2590,62, | 2590,63, | 2590,64, | 2590,65, | 2590,66, | 2590,67, | 2590,68, | 2590,69, | 2590,70, | 2590,71, | 2590,72, | 2590,73, | 2590,74, | 2590,75, | 2590,76, | 2590,77, | 2590,78, | 2590,79, | 2590,80, | 2590,81, | 2590,82, | 2590,83, | 2590,84, | 2590,85, | 2591,1, | 2591,2, | 2591,3, | 2591,4, | 2591,5, | 2591,6, | 2591,7, | 2591,8, | 2591,9, | 2591,10, | 2591,11, | 2591,12, | 2591,13, | 2591,14, | 2591,15, | 2591,16, | 2591,17, | 2591,18, | 2591,19, | 2591,20, | 2591,21, | 2591,22, | 2591,23, | 2591,24, | 2591,25, | 2591,26, | 2591,27, | 2591,28, | 2591,29, | 2591,30, | 2591,31, | 2591,32, | 2591,33, | 2591,34, | 2591,35, | 2591,36, | 2591,37, | 2591,38, | 2591,39, | 2591,40, | 2591,41, | 2591,42, | 2591,43, | 2591,44, | 2591,45, | 2591,46, | 2591,47, | 2591,48, | 2591,49, | 2591,50, | 2591,51, | 2591,52, | 2591,53, | 2591,54, | 2591,55, | 2591,56, | 2591,57, | 2591,58, | 2591,59, | 2591,60, | 2591,61, | 2591,62, | 2591,63, | 2591,64, | 2591,65, | 2591,66, | 2591,67, | 2591,68, | 2591,69, | 2591,70, | 2591,71, | 2591,72, | 2591,73, | 2591,74, | 2591,75, | 2591,76, | 2591,77, | 2591,78, | 2591,79, | 2591,80, | 2591,81, | 2591,82, | 2591,83, | 2591,84, | 2591,85, | 2592,1, | 2592,2, | 2592,3, | 2592,4, | 2592,5, | 2592,6, | 2592,7, | 2592,8, | 2592,9, | 2592,10, | 2592,11, | 2592,12, | 2592,13, | 2592,14, | 2592,15, | 2592,16, | 2592,17, | 2592,18, | 2592,19, | 2592,20, | 2592,21, | 2592,22, | 2592,23, | 2592,24, | 2592,25, | 2592,26, | 2592,27, | 2592,28, | 2592,29, | 2592,30, | 2592,31, | 2592,32, | 2592,33, | 2592,34, | 2592,35, | 2592,36, | 2592,37, | 2592,38, | 2592,39, | 2592,40, | 2592,41, | 2592,42, | 2592,43, | 2592,44, | 2592,45, | 2592,46, | 2592,47, | 2592,48, | 2592,49, | 2592,50, | 2592,51, | 2592,52, | 2592,53, | 2592,54, | 2592,55, | 2592,56, | 2592,57, | 2592,58, | 2592,59, | 2592,60, | 2592,61, | 2592,62, | 2592,63, | 2592,64, | 2592,65, | 2592,66, | 2592,67, | 2592,68, | 2592,69, | 2592,70, | 2592,71, | 2592,72, | 2592,73, | 2592,74, | 2592,75, | 2592,76, | 2592,77, | 2592,78, | 2592,79, | 2592,80, | 2592,81, | 2592,82, | 2592,83, | 2592,84, | 2592,85, | 2593,1, | 2593,2, | 2593,3, | 2593,4, | 2593,5, | 2593,6, | 2593,7, | 2593,8, | 2593,9, | 2593,10, | 2593,11, | 2593,12, | 2593,13, | 2593,14, | 2593,15, | 2593,16, | 2593,17, | 2593,18, | 2593,19, | 2593,20, | 2593,21, | 2593,22, | 2593,23, | 2593,24, | 2593,25, | 2593,26, | 2593,27, | 2593,28, | 2593,29, | 2593,30, | 2593,31, | 2593,32, | 2593,33, | 2593,34, | 2593,35, | 2593,36, | 2593,37, | 2593,38, | 2593,39, | 2593,40, | 2593,41, | 2593,42, | 2593,43, | 2593,44, | 2593,45, | 2593,46, | 2593,47, | 2593,48, | 2593,49, | 2593,50, | 2593,51, | 2593,52, | 2593,53, | 2593,54, | 2593,55, | 2593,56, | 2593,57, | 2593,58, | 2593,59, | 2593,60, | 2593,61, | 2593,62, | 2593,63, | 2593,64, | 2593,65, | 2593,66, | 2593,67, | 2593,68, | 2593,69, | 2593,70, | 2593,71, | 2593,72, | 2593,73, | 2593,74, | 2593,75, | 2593,76, | 2593,77, | 2593,78, | 2593,79, | 2593,80, | 2593,81, | 2593,82, | 2593,83, | 2593,84, | 2593,85, | 2594,1, | 2594,2, | 2594,3, | 2594,4, | 2594,5, | 2594,6, | 2594,7, | 2594,8, | 2594,9, | 2594,10, | 2594,11, | 2594,12, | 2594,13, | 2594,14, | 2594,15, | 2594,16, | 2594,17, | 2594,18, | 2594,19, | 2594,20, | 2594,21, | 2594,22, | 2594,23, | 2594,24, | 2594,25, | 2594,26, | 2594,27, | 2594,28, | 2594,29, | 2594,30, | 2594,31, | 2594,32, | 2594,33, | 2594,34, | 2594,35, | 2594,36, | 2594,37, | 2594,38, | 2594,39, | 2594,40, | 2594,41, | 2594,42, | 2594,43, | 2594,44, | 2594,45, | 2594,46, | 2594,47, | 2594,48, | 2594,49, | 2594,50, | 2594,51, | 2594,52, | 2594,53, | 2594,54, | 2594,55, | 2594,56, | 2594,57, | 2594,58, | 2594,59, | 2594,60, | 2594,61, | 2594,62, | 2594,63, | 2594,64, | 2594,65, | 2594,66, | 2594,67, | 2594,68, | 2594,69, | 2594,70, | 2594,71, | 2594,72, | 2594,73, | 2594,74, | 2594,75, | 2594,76, | 2594,77, | 2594,78, | 2594,79, | 2594,80, | 2594,81, | 2594,82, | 2594,83, | 2594,84, | 2594,85, | 2595,1, | 2595,2, | 2595,3, | 2595,4, | 2595,5, | 2595,6, | 2595,7, | 2595,8, | 2595,9, | 2595,10, | 2595,11, | 2595,12, | 2595,13, | 2595,14, | 2595,15, | 2595,16, | 2595,17, | 2595,18, | 2595,19, | 2595,20, | 2595,21, | 2595,22, | 2595,23, | 2595,24, | 2595,25, | 2595,26, | 2595,27, | 2595,28, | 2595,29, | 2595,30, | 2595,31, | 2595,32, | 2595,33, | 2595,34, | 2595,35, | 2595,36, | 2595,37, | 2595,38, | 2595,39, | 2595,40, | 2595,41, | 2595,42, | 2595,43, | 2595,44, | 2595,45, | 2595,46, | 2595,47, | 2595,48, | 2595,49, | 2595,50, | 2595,51, | 2595,52, | 2595,53, | 2595,54, | 2595,55, | 2595,56, | 2595,57, | 2595,58, | 2595,59, | 2595,60, | 2595,61, | 2595,62, | 2595,63, | 2595,64, | 2595,65, | 2595,66, | 2595,67, | 2595,68, | 2595,69, | 2595,70, | 2595,71, | 2595,72, | 2595,73, | 2595,74, | 2595,75, | 2595,76, | 2595,77, | 2595,78, | 2595,79, | 2595,80, | 2595,81, | 2595,82, | 2595,83, | 2595,84, | 2595,85, | 2596,1, | 2596,2, | 2596,3, | 2596,4, | 2596,5, | 2596,6, | 2596,7, | 2596,8, | 2596,9, | 2596,10, | 2596,11, | 2596,12, | 2596,13, | 2596,14, | 2596,15, | 2596,16, | 2596,17, | 2596,18, | 2596,19, | 2596,20, | 2596,21, | 2596,22, | 2596,23, | 2596,24, | 2596,25, | 2596,26, | 2596,27, | 2596,28, | 2596,29, | 2596,30, | 2596,31, | 2596,32, | 2596,33, | 2596,34, | 2596,35, | 2596,36, | 2596,37, | 2596,38, | 2596,39, | 2596,40, | 2596,41, | 2596,42, | 2596,43, | 2596,44, | 2596,45, | 2596,46, | 2596,47, | 2596,48, | 2596,49, | 2596,50, | 2596,51, | 2596,52, | 2596,53, | 2596,54, | 2596,55, | 2596,56, | 2596,57, | 2596,58, | 2596,59, | 2596,60, | 2596,61, | 2596,62, | 2596,63, | 2596,64, | 2596,65, | 2596,66, | 2596,67, | 2596,68, | 2596,69, | 2596,70, | 2596,71, | 2596,72, | 2596,73, | 2596,74, | 2596,75, | 2596,76, | 2596,77, | 2596,78, | 2596,79, | 2596,80, | 2596,81, | 2596,82, | 2596,83, | 2596,84, | 2596,85, | 2597,1, | 2597,2, | 2597,3, | 2597,4, | 2597,5, | 2597,6, | 2597,7, | 2597,8, | 2597,9, | 2597,10, | 2597,11, | 2597,12, | 2597,13, | 2597,14, | 2597,15, | 2597,16, | 2597,17, | 2597,18, | 2597,19, | 2597,20, | 2597,21, | 2597,22, | 2597,23, | 2597,24, | 2597,25, | 2597,26, | 2597,27, | 2597,28, | 2597,29, | 2597,30, | 2597,31, | 2597,32, | 2597,33, | 2597,34, | 2597,35, | 2597,36, | 2597,37, | 2597,38, | 2597,39, | 2597,40, | 2597,41, | 2597,42, | 2597,43, | 2597,44, | 2597,45, | 2597,46, | 2597,47, | 2597,48, | 2597,49, | 2597,50, | 2597,51, | 2597,52, | 2597,53, | 2597,54, | 2597,55, | 2597,56, | 2597,57, | 2597,58, | 2597,59, | 2597,60, | 2597,61, | 2597,62, | 2597,63, | 2597,64, | 2597,65, | 2597,66, | 2597,67, | 2597,68, | 2597,69, | 2597,70, | 2597,71, | 2597,72, | 2597,73, | 2597,74, | 2597,75, | 2597,76, | 2597,77, | 2597,78, | 2597,79, | 2597,80, | 2597,81, | 2597,82, | 2597,83, | 2597,84, | 2597,85, | 2598,1, | 2598,2, | 2598,3, | 2598,4, | 2598,5, | 2598,6, | 2598,7, | 2598,8, | 2598,9, | 2598,10, | 2598,11, | 2598,12, | 2598,13, | 2598,14, | 2598,15, | 2598,16, | 2598,17, | 2598,18, | 2598,19, | 2598,20, | 2598,21, | 2598,22, | 2598,23, | 2598,24, | 2598,25, | 2598,26, | 2598,27, | 2598,28, | 2598,29, | 2598,30, | 2598,31, | 2598,32, | 2598,33, | 2598,34, | 2598,35, | 2598,36, | 2598,37, | 2598,38, | 2598,39, | 2598,40, | 2598,41, | 2598,42, | 2598,43, | 2598,44, | 2598,45, | 2598,46, | 2598,47, | 2598,48, | 2598,49, | 2598,50, | 2598,51, | 2598,52, | 2598,53, | 2598,54, | 2598,55, | 2598,56, | 2598,57, | 2598,58, | 2598,59, | 2598,60, | 2598,61, | 2598,62, | 2598,63, | 2598,64, | 2598,65, | 2598,66, | 2598,67, | 2598,68, | 2598,69, | 2598,70, | 2598,71, | 2598,72, | 2598,73, | 2598,74, | 2598,75, | 2598,76, | 2598,77, | 2598,78, | 2598,79, | 2598,80, | 2598,81, | 2598,82, | 2598,83, | 2598,84, | 2598,85, | 2599,1, | 2599,2, | 2599,3, | 2599,4, | 2599,5, | 2599,6, | 2599,7, | 2599,8, | 2599,9, | 2599,10, | 2599,11, | 2599,12, | 2599,13, | 2599,14, | 2599,15, | 2599,16, | 2599,17, | 2599,18, | 2599,19, | 2599,20, | 2599,21, | 2599,22, | 2599,23, | 2599,24, | 2599,25, | 2599,26, | 2599,27, | 2599,28, | 2599,29, | 2599,30, | 2599,31, | 2599,32, | 2599,33, | 2599,34, | 2599,35, | 2599,36, | 2599,37, | 2599,38, | 2599,39, | 2599,40, | 2599,41, | 2599,42, | 2599,43, | 2599,44, | 2599,45, | 2599,46, | 2599,47, | 2599,48, | 2599,49, | 2599,50, | 2599,51, | 2599,52, | 2599,53, | 2599,54, | 2599,55, | 2599,56, | 2599,57, | 2599,58, | 2599,59, | 2599,60, | 2599,61, | 2599,62, | 2599,63, | 2599,64, | 2599,65, | 2599,66, | 2599,67, | 2599,68, | 2599,69, | 2599,70, | 2599,71, | 2599,72, | 2599,73, | 2599,74, | 2599,75, | 2599,76, | 2599,77, | 2599,78, | 2599,79, | 2599,80, | 2599,81, | 2599,82, | 2599,83, | 2599,84, | 2599,85, | 2600,1, | 2600,2, | 2600,3, | 2600,4, | 2600,5, | 2600,6, | 2600,7, | 2600,8, | 2600,9, | 2600,10, | 2600,11, | 2600,12, | 2600,13, | 2600,14, | 2600,15, | 2600,16, | 2600,17, | 2600,18, | 2600,19, | 2600,20, | 2600,21, | 2600,22, | 2600,23, | 2600,24, | 2600,25, | 2600,26, | 2600,27, | 2600,28, | 2600,29, | 2600,30, | 2600,31, | 2600,32, | 2600,33, | 2600,34, | 2600,35, | 2600,36, | 2600,37, | 2600,38, | 2600,39, | 2600,40, | 2600,41, | 2600,42, | 2600,43, | 2600,44, | 2600,45, | 2600,46, | 2600,47, | 2600,48, | 2600,49, | 2600,50, | 2600,51, | 2600,52, | 2600,53, | 2600,54, | 2600,55, | 2600,56, | 2600,57, | 2600,58, | 2600,59, | 2600,60, | 2600,61, | 2600,62, | 2600,63, | 2600,64, | 2600,65, | 2600,66, | 2600,67, | 2600,68, | 2600,69, | 2600,70, | 2600,71, | 2600,72, | 2600,73, | 2600,74, | 2600,75, | 2600,76, | 2600,77, | 2600,78, | 2600,79, | 2600,80, | 2600,81, | 2600,82, | 2600,83, | 2600,84, | 2600,85, | 2601,1, | 2601,2, | 2601,3, | 2601,4, | 2601,5, | 2601,6, | 2601,7, | 2601,8, | 2601,9, | 2601,10, | 2601,11, | 2601,12, | 2601,13, | 2601,14, | 2601,15, | 2601,16, | 2601,17, | 2601,18, | 2601,19, | 2601,20, | 2601,21, | 2601,22, | 2601,23, | 2601,24, | 2601,25, | 2601,26, | 2601,27, | 2601,28, | 2601,29, | 2601,30, | 2601,31, | 2601,32, | 2601,33, | 2601,34, | 2601,35, | 2601,36, | 2601,37, | 2601,38, | 2601,39, | 2601,40, | 2601,41, | 2601,42, | 2601,43, | 2601,44, | 2601,45, | 2601,46, | 2601,47, | 2601,48, | 2601,49, | 2601,50, | 2601,51, | 2601,52, | 2601,53, | 2601,54, | 2601,55, | 2601,56, | 2601,57, | 2601,58, | 2601,59, | 2601,60, | 2601,61, | 2601,62, | 2601,63, | 2601,64, | 2601,65, | 2601,66, | 2601,67, | 2601,68, | 2601,69, | 2601,70, | 2601,71, | 2601,72, | 2601,73, | 2601,74, | 2601,75, | 2601,76, | 2601,77, | 2601,78, | 2601,79, | 2601,80, | 2601,81, | 2601,82, | 2601,83, | 2601,84, | 2601,85, | 2602,1, | 2602,2, | 2602,3, | 2602,4, | 2602,5, | 2602,6, | 2602,7, | 2602,8, | 2602,9, | 2602,10, | 2602,11, | 2602,12, | 2602,13, | 2602,14, | 2602,15, | 2602,16, | 2602,17, | 2602,18, | 2602,19, | 2602,20, | 2602,21, | 2602,22, | 2602,23, | 2602,24, | 2602,25, | 2602,26, | 2602,27, | 2602,28, | 2602,29, | 2602,30, | 2602,31, | 2602,32, | 2602,33, | 2602,34, | 2602,35, | 2602,36, | 2602,37, | 2602,38, | 2602,39, | 2602,40, | 2602,41, | 2602,42, | 2602,43, | 2602,44, | 2602,45, | 2602,46, | 2602,47, | 2602,48, | 2602,49, | 2602,50, | 2602,51, | 2602,52, | 2602,53, | 2602,54, | 2602,55, | 2602,56, | 2602,57, | 2602,58, | 2602,59, | 2602,60, | 2602,61, | 2602,62, | 2602,63, | 2602,64, | 2602,65, | 2602,66, | 2602,67, | 2602,68, | 2602,69, | 2602,70, | 2602,71, | 2602,72, | 2602,73, | 2602,74, | 2602,75, | 2602,76, | 2602,77, | 2602,78, | 2602,79, | 2602,80, | 2602,81, | 2602,82, | 2602,83, | 2602,84, | 2602,85, | 2603,1, | 2603,2, | 2603,3, | 2603,4, | 2603,5, | 2603,6, | 2603,7, | 2603,8, | 2603,9, | 2603,10, | 2603,11, | 2603,12, | 2603,13, | 2603,14, | 2603,15, | 2603,16, | 2603,17, | 2603,18, | 2603,19, | 2603,20, | 2603,21, | 2603,22, | 2603,23, | 2603,24, | 2603,25, | 2603,26, | 2603,27, | 2603,28, | 2603,29, | 2603,30, | 2603,31, | 2603,32, | 2603,33, | 2603,34, | 2603,35, | 2603,36, | 2603,37, | 2603,38, | 2603,39, | 2603,40, | 2603,41, | 2603,42, | 2603,43, | 2603,44, | 2603,45, | 2603,46, | 2603,47, | 2603,48, | 2603,49, | 2603,50, | 2603,51, | 2603,52, | 2603,53, | 2603,54, | 2603,55, | 2603,56, | 2603,57, | 2603,58, | 2603,59, | 2603,60, | 2603,61, | 2603,62, | 2603,63, | 2603,64, | 2603,65, | 2603,66, | 2603,67, | 2603,68, | 2603,69, | 2603,70, | 2603,71, | 2603,72, | 2603,73, | 2603,74, | 2603,75, | 2603,76, | 2603,77, | 2603,78, | 2603,79, | 2603,80, | 2603,81, | 2603,82, | 2603,83, | 2603,84, | 2603,85, | 2604,1, | 2604,2, | 2604,3, | 2604,4, | 2604,5, | 2604,6, | 2604,7, | 2604,8, | 2604,9, | 2604,10, | 2604,11, | 2604,12, | 2604,13, | 2604,14, | 2604,15, | 2604,16, | 2604,17, | 2604,18, | 2604,19, | 2604,20, | 2604,21, | 2604,22, | 2604,23, | 2604,24, | 2604,25, | 2604,26, | 2604,27, | 2604,28, | 2604,29, | 2604,30, | 2604,31, | 2604,32, | 2604,33, | 2604,34, | 2604,35, | 2604,36, | 2604,37, | 2604,38, | 2604,39, | 2604,40, | 2604,41, | 2604,42, | 2604,43, | 2604,44, | 2604,45, | 2604,46, | 2604,47, | 2604,48, | 2604,49, | 2604,50, | 2604,51, | 2604,52, | 2604,53, | 2604,54, | 2604,55, | 2604,56, | 2604,57, | 2604,58, | 2604,59, | 2604,60, | 2604,61, | 2604,62, | 2604,63, | 2604,64, | 2604,65, | 2604,66, | 2604,67, | 2604,68, | 2604,69, | 2604,70, | 2604,71, | 2604,72, | 2604,73, | 2604,74, | 2604,75, | 2604,76, | 2604,77, | 2604,78, | 2604,79, | 2604,80, | 2604,81, | 2604,82, | 2604,83, | 2604,84, | 2604,85, | 2605,1, | 2605,2, | 2605,3, | 2605,4, | 2605,5, | 2605,6, | 2605,7, | 2605,8, | 2605,9, | 2605,10, | 2605,11, | 2605,12, | 2605,13, | 2605,14, | 2605,15, | 2605,16, | 2605,17, | 2605,18, | 2605,19, | 2605,20, | 2605,21, | 2605,22, | 2605,23, | 2605,24, | 2605,25, | 2605,26, | 2605,27, | 2605,28, | 2605,29, | 2605,30, | 2605,31, | 2605,32, | 2605,33, | 2605,34, | 2605,35, | 2605,36, | 2605,37, | 2605,38, | 2605,39, | 2605,40, | 2605,41, | 2605,42, | 2605,43, | 2605,44, | 2605,45, | 2605,46, | 2605,47, | 2605,48, | 2605,49, | 2605,50, | 2605,51, | 2605,52, | 2605,53, | 2605,54, | 2605,55, | 2605,56, | 2605,57, | 2605,58, | 2605,59, | 2605,60, | 2605,61, | 2605,62, | 2605,63, | 2605,64, | 2605,65, | 2605,66, | 2605,67, | 2605,68, | 2605,69, | 2605,70, | 2605,71, | 2605,72, | 2605,73, | 2605,74, | 2605,75, | 2605,76, | 2605,77, | 2605,78, | 2605,79, | 2605,80, | 2605,81, | 2605,82, | 2605,83, | 2605,84, | 2605,85, | 2606,1, | 2606,2, | 2606,3, | 2606,4, | 2606,5, | 2606,6, | 2606,7, | 2606,8, | 2606,9, | 2606,10, | 2606,11, | 2606,12, | 2606,13, | 2606,14, | 2606,15, | 2606,16, | 2606,17, | 2606,18, | 2606,19, | 2606,20, | 2606,21, | 2606,22, | 2606,23, | 2606,24, | 2606,25, | 2606,26, | 2606,27, | 2606,28, | 2606,29, | 2606,30, | 2606,31, | 2606,32, | 2606,33, | 2606,34, | 2606,35, | 2606,36, | 2606,37, | 2606,38, | 2606,39, | 2606,40, | 2606,41, | 2606,42, | 2606,43, | 2606,44, | 2606,45, | 2606,46, | 2606,47, | 2606,48, | 2606,49, | 2606,50, | 2606,51, | 2606,52, | 2606,53, | 2606,54, | 2606,55, | 2606,56, | 2606,57, | 2606,58, | 2606,59, | 2606,60, | 2606,61, | 2606,62, | 2606,63, | 2606,64, | 2606,65, | 2606,66, | 2606,67, | 2606,68, | 2606,69, | 2606,70, | 2606,71, | 2606,72, | 2606,73, | 2606,74, | 2606,75, | 2606,76, | 2606,77, | 2606,78, | 2606,79, | 2606,80, | 2606,81, | 2606,82, | 2606,83, | 2606,84, | 2606,85, | 2607,1, | 2607,2, | 2607,3, | 2607,4, | 2607,5, | 2607,6, | 2607,7, | 2607,8, | 2607,9, | 2607,10, | 2607,11, | 2607,12, | 2607,13, | 2607,14, | 2607,15, | 2607,16, | 2607,17, | 2607,18, | 2607,19, | 2607,20, | 2607,21, | 2607,22, | 2607,23, | 2607,24, | 2607,25, | 2607,26, | 2607,27, | 2607,28, | 2607,29, | 2607,30, | 2607,31, | 2607,32, | 2607,33, | 2607,34, | 2607,35, | 2607,36, | 2607,37, | 2607,38, | 2607,39, | 2607,40, | 2607,41, | 2607,42, | 2607,43, | 2607,44, | 2607,45, | 2607,46, | 2607,47, | 2607,48, | 2607,49, | 2607,50, | 2607,51, | 2607,52, | 2607,53, | 2607,54, | 2607,55, | 2607,56, | 2607,57, | 2607,58, | 2607,59, | 2607,60, | 2607,61, | 2607,62, | 2607,63, | 2607,64, | 2607,65, | 2607,66, | 2607,67, | 2607,68, | 2607,69, | 2607,70, | 2607,71, | 2607,72, | 2607,73, | 2607,74, | 2607,75, | 2607,76, | 2607,77, | 2607,78, | 2607,79, | 2607,80, | 2607,81, | 2607,82, | 2607,83, | 2607,84, | 2607,85, | 2608,1, | 2608,2, | 2608,3, | 2608,4, | 2608,5, | 2608,6, | 2608,7, | 2608,8, | 2608,9, | 2608,10, | 2608,11, | 2608,12, | 2608,13, | 2608,14, | 2608,15, | 2608,16, | 2608,17, | 2608,18, | 2608,19, | 2608,20, | 2608,21, | 2608,22, | 2608,23, | 2608,24, | 2608,25, | 2608,26, | 2608,27, | 2608,28, | 2608,29, | 2608,30, | 2608,31, | 2608,32, | 2608,33, | 2608,34, | 2608,35, | 2608,36, | 2608,37, | 2608,38, | 2608,39, | 2608,40, | 2608,41, | 2608,42, | 2608,43, | 2608,44, | 2608,45, | 2608,46, | 2608,47, | 2608,48, | 2608,49, | 2608,50, | 2608,51, | 2608,52, | 2608,53, | 2608,54, | 2608,55, | 2608,56, | 2608,57, | 2608,58, | 2608,59, | 2608,60, | 2608,61, | 2608,62, | 2608,63, | 2608,64, | 2608,65, | 2608,66, | 2608,67, | 2608,68, | 2608,69, | 2608,70, | 2608,71, | 2608,72, | 2608,73, | 2608,74, | 2608,75, | 2608,76, | 2608,77, | 2608,78, | 2608,79, | 2608,80, | 2608,81, | 2608,82, | 2608,83, | 2608,84, | 2608,85, | 2609,1, | 2609,2, | 2609,3, | 2609,4, | 2609,5, | 2609,6, | 2609,7, | 2609,8, | 2609,9, | 2609,10, | 2609,11, | 2609,12, | 2609,13, | 2609,14, | 2609,15, | 2609,16, | 2609,17, | 2609,18, | 2609,19, | 2609,20, | 2609,21, | 2609,22, | 2609,23, | 2609,24, | 2609,25, | 2609,26, | 2609,27, | 2609,28, | 2609,29, | 2609,30, | 2609,31, | 2609,32, | 2609,33, | 2609,34, | 2609,35, | 2609,36, | 2609,37, | 2609,38, | 2609,39, | 2609,40, | 2609,41, | 2609,42, | 2609,43, | 2609,44, | 2609,45, | 2609,46, | 2609,47, | 2609,48, | 2609,49, | 2609,50, | 2609,51, | 2609,52, | 2609,53, | 2609,54, | 2609,55, | 2609,56, | 2609,57, | 2609,58, | 2609,59, | 2609,60, | 2609,61, | 2609,62, | 2609,63, | 2609,64, | 2609,65, | 2609,66, | 2609,67, | 2609,68, | 2609,69, | 2609,70, | 2609,71, | 2609,72, | 2609,73, | 2609,74, | 2609,75, | 2609,76, | 2609,77, | 2609,78, | 2609,79, | 2609,80, | 2609,81, | 2609,82, | 2609,83, | 2609,84, | 2609,85, | 2610,1, | 2610,2, | 2610,3, | 2610,4, | 2610,5, | 2610,6, | 2610,7, | 2610,8, | 2610,9, | 2610,10, | 2610,11, | 2610,12, | 2610,13, | 2610,14, | 2610,15, | 2610,16, | 2610,17, | 2610,18, | 2610,19, | 2610,20, | 2610,21, | 2610,22, | 2610,23, | 2610,24, | 2610,25, | 2610,26, | 2610,27, | 2610,28, | 2610,29, | 2610,30, | 2610,31, | 2610,32, | 2610,33, | 2610,34, | 2610,35, | 2610,36, | 2610,37, | 2610,38, | 2610,39, | 2610,40, | 2610,41, | 2610,42, | 2610,43, | 2610,44, | 2610,45, | 2610,46, | 2610,47, | 2610,48, | 2610,49, | 2610,50, | 2610,51, | 2610,52, | 2610,53, | 2610,54, | 2610,55, | 2610,56, | 2610,57, | 2610,58, | 2610,59, | 2610,60, | 2610,61, | 2610,62, | 2610,63, | 2610,64, | 2610,65, | 2610,66, | 2610,67, | 2610,68, | 2610,69, | 2610,70, | 2610,71, | 2610,72, | 2610,73, | 2610,74, | 2610,75, | 2610,76, | 2610,77, | 2610,78, | 2610,79, | 2610,80, | 2610,81, | 2610,82, | 2610,83, | 2610,84, | 2610,85, | 2611,1, | 2611,2, | 2611,3, | 2611,4, | 2611,5, | 2611,6, | 2611,7, | 2611,8, | 2611,9, | 2611,10, | 2611,11, | 2611,12, | 2611,13, | 2611,14, | 2611,15, | 2611,16, | 2611,17, | 2611,18, | 2611,19, | 2611,20, | 2611,21, | 2611,22, | 2611,23, | 2611,24, | 2611,25, | 2611,26, | 2611,27, | 2611,28, | 2611,29, | 2611,30, | 2611,31, | 2611,32, | 2611,33, | 2611,34, | 2611,35, | 2611,36, | 2611,37, | 2611,38, | 2611,39, | 2611,40, | 2611,41, | 2611,42, | 2611,43, | 2611,44, | 2611,45, | 2611,46, | 2611,47, | 2611,48, | 2611,49, | 2611,50, | 2611,51, | 2611,52, | 2611,53, | 2611,54, | 2611,55, | 2611,56, | 2611,57, | 2611,58, | 2611,59, | 2611,60, | 2611,61, | 2611,62, | 2611,63, | 2611,64, | 2611,65, | 2611,66, | 2611,67, | 2611,68, | 2611,69, | 2611,70, | 2611,71, | 2611,72, | 2611,73, | 2611,74, | 2611,75, | 2611,76, | 2611,77, | 2611,78, | 2611,79, | 2611,80, | 2611,81, | 2611,82, | 2611,83, | 2611,84, | 2611,85, | 2612,1, | 2612,2, | 2612,3, | 2612,4, | 2612,5, | 2612,6, | 2612,7, | 2612,8, | 2612,9, | 2612,10, | 2612,11, | 2612,12, | 2612,13, | 2612,14, | 2612,15, | 2612,16, | 2612,17, | 2612,18, | 2612,19, | 2612,20, | 2612,21, | 2612,22, | 2612,23, | 2612,24, | 2612,25, | 2612,26, | 2612,27, | 2612,28, | 2612,29, | 2612,30, | 2612,31, | 2612,32, | 2612,33, | 2612,34, | 2612,35, | 2612,36, | 2612,37, | 2612,38, | 2612,39, | 2612,40, | 2612,41, | 2612,42, | 2612,43, | 2612,44, | 2612,45, | 2612,46, | 2612,47, | 2612,48, | 2612,49, | 2612,50, | 2612,51, | 2612,52, | 2612,53, | 2612,54, | 2612,55, | 2612,56, | 2612,57, | 2612,58, | 2612,59, | 2612,60, | 2612,61, | 2612,62, | 2612,63, | 2612,64, | 2612,65, | 2612,66, | 2612,67, | 2612,68, | 2612,69, | 2612,70, | 2612,71, | 2612,72, | 2612,73, | 2612,74, | 2612,75, | 2612,76, | 2612,77, | 2612,78, | 2612,79, | 2612,80, | 2612,81, | 2612,82, | 2612,83, | 2612,84, | 2612,85, | 2613,1, | 2613,2, | 2613,3, | 2613,4, | 2613,5, | 2613,6, | 2613,7, | 2613,8, | 2613,9, | 2613,10, | 2613,11, | 2613,12, | 2613,13, | 2613,14, | 2613,15, | 2613,16, | 2613,17, | 2613,18, | 2613,19, | 2613,20, | 2613,21, | 2613,22, | 2613,23, | 2613,24, | 2613,25, | 2613,26, | 2613,27, | 2613,28, | 2613,29, | 2613,30, | 2613,31, | 2613,32, | 2613,33, | 2613,34, | 2613,35, | 2613,36, | 2613,37, | 2613,38, | 2613,39, | 2613,40, | 2613,41, | 2613,42, | 2613,43, | 2613,44, | 2613,45, | 2613,46, | 2613,47, | 2613,48, | 2613,49, | 2613,50, | 2613,51, | 2613,52, | 2613,53, | 2613,54, | 2613,55, | 2613,56, | 2613,57, | 2613,58, | 2613,59, | 2613,60, | 2613,61, | 2613,62, | 2613,63, | 2613,64, | 2613,65, | 2613,66, | 2613,67, | 2613,68, | 2613,69, | 2613,70, | 2613,71, | 2613,72, | 2613,73, | 2613,74, | 2613,75, | 2613,76, | 2613,77, | 2613,78, | 2613,79, | 2613,80, | 2613,81, | 2613,82, | 2613,83, | 2613,84, | 2613,85, | 2614,1, | 2614,2, | 2614,3, | 2614,4, | 2614,5, | 2614,6, | 2614,7, | 2614,8, | 2614,9, | 2614,10, | 2614,11, | 2614,12, | 2614,13, | 2614,14, | 2614,15, | 2614,16, | 2614,17, | 2614,18, | 2614,19, | 2614,20, | 2614,21, | 2614,22, | 2614,23, | 2614,24, | 2614,25, | 2614,26, | 2614,27, | 2614,28, | 2614,29, | 2614,30, | 2614,31, | 2614,32, | 2614,33, | 2614,34, | 2614,35, | 2614,36, | 2614,37, | 2614,38, | 2614,39, | 2614,40, | 2614,41, | 2614,42, | 2614,43, | 2614,44, | 2614,45, | 2614,46, | 2614,47, | 2614,48, | 2614,49, | 2614,50, | 2614,51, | 2614,52, | 2614,53, | 2614,54, | 2614,55, | 2614,56, | 2614,57, | 2614,58, | 2614,59, | 2614,60, | 2614,61, | 2614,62, | 2614,63, | 2614,64, | 2614,65, | 2614,66, | 2614,67, | 2614,68, | 2614,69, | 2614,70, | 2614,71, | 2614,72, | 2614,73, | 2614,74, | 2614,75, | 2614,76, | 2614,77, | 2614,78, | 2614,79, | 2614,80, | 2614,81, | 2614,82, | 2614,83, | 2614,84, | 2614,85, | 2615,1, | 2615,2, | 2615,3, | 2615,4, | 2615,5, | 2615,6, | 2615,7, | 2615,8, | 2615,9, | 2615,10, | 2615,11, | 2615,12, | 2615,13, | 2615,14, | 2615,15, | 2615,16, | 2615,17, | 2615,18, | 2615,19, | 2615,20, | 2615,21, | 2615,22, | 2615,23, | 2615,24, | 2615,25, | 2615,26, | 2615,27, | 2615,28, | 2615,29, | 2615,30, | 2615,31, | 2615,32, | 2615,33, | 2615,34, | 2615,35, | 2615,36, | 2615,37, | 2615,38, | 2615,39, | 2615,40, | 2615,41, | 2615,42, | 2615,43, | 2615,44, | 2615,45, | 2615,46, | 2615,47, | 2615,48, | 2615,49, | 2615,50, | 2615,51, | 2615,52, | 2615,53, | 2615,54, | 2615,55, | 2615,56, | 2615,57, | 2615,58, | 2615,59, | 2615,60, | 2615,61, | 2615,62, | 2615,63, | 2615,64, | 2615,65, | 2615,66, | 2615,67, | 2615,68, | 2615,69, | 2615,70, | 2615,71, | 2615,72, | 2615,73, | 2615,74, | 2615,75, | 2615,76, | 2615,77, | 2615,78, | 2615,79, | 2615,80, | 2615,81, | 2615,82, | 2615,83, | 2615,84, | 2615,85, | 2616,1, | 2616,2, | 2616,3, | 2616,4, | 2616,5, | 2616,6, | 2616,7, | 2616,8, | 2616,9, | 2616,10, | 2616,11, | 2616,12, | 2616,13, | 2616,14, | 2616,15, | 2616,16, | 2616,17, | 2616,18, | 2616,19, | 2616,20, | 2616,21, | 2616,22, | 2616,23, | 2616,24, | 2616,25, | 2616,26, | 2616,27, | 2616,28, | 2616,29, | 2616,30, | 2616,31, | 2616,32, | 2616,33, | 2616,34, | 2616,35, | 2616,36, | 2616,37, | 2616,38, | 2616,39, | 2616,40, | 2616,41, | 2616,42, | 2616,43, | 2616,44, | 2616,45, | 2616,46, | 2616,47, | 2616,48, | 2616,49, | 2616,50, | 2616,51, | 2616,52, | 2616,53, | 2616,54, | 2616,55, | 2616,56, | 2616,57, | 2616,58, | 2616,59, | 2616,60, | 2616,61, | 2616,62, | 2616,63, | 2616,64, | 2616,65, | 2616,66, | 2616,67, | 2616,68, | 2616,69, | 2616,70, | 2616,71, | 2616,72, | 2616,73, | 2616,74, | 2616,75, | 2616,76, | 2616,77, | 2616,78, | 2616,79, | 2616,80, | 2616,81, | 2616,82, | 2616,83, | 2616,84, | 2616,85, | 2617,1, | 2617,2, | 2617,3, | 2617,4, | 2617,5, | 2617,6, | 2617,7, | 2617,8, | 2617,9, | 2617,10, | 2617,11, | 2617,12, | 2617,13, | 2617,14, | 2617,15, | 2617,16, | 2617,17, | 2617,18, | 2617,19, | 2617,20, | 2617,21, | 2617,22, | 2617,23, | 2617,24, | 2617,25, | 2617,26, | 2617,27, | 2617,28, | 2617,29, | 2617,30, | 2617,31, | 2617,32, | 2617,33, | 2617,34, | 2617,35, | 2617,36, | 2617,37, | 2617,38, | 2617,39, | 2617,40, | 2617,41, | 2617,42, | 2617,43, | 2617,44, | 2617,45, | 2617,46, | 2617,47, | 2617,48, | 2617,49, | 2617,50, | 2617,51, | 2617,52, | 2617,53, | 2617,54, | 2617,55, | 2617,56, | 2617,57, | 2617,58, | 2617,59, | 2617,60, | 2617,61, | 2617,62, | 2617,63, | 2617,64, | 2617,65, | 2617,66, | 2617,67, | 2617,68, | 2617,69, | 2617,70, | 2617,71, | 2617,72, | 2617,73, | 2617,74, | 2617,75, | 2617,76, | 2617,77, | 2617,78, | 2617,79, | 2617,80, | 2617,81, | 2617,82, | 2617,83, | 2617,84, | 2617,85, | 2618,1, | 2618,2, | 2618,3, | 2618,4, | 2618,5, | 2618,6, | 2618,7, | 2618,8, | 2618,9, | 2618,10, | 2618,11, | 2618,12, | 2618,13, | 2618,14, | 2618,15, | 2618,16, | 2618,17, | 2618,18, | 2618,19, | 2618,20, | 2618,21, | 2618,22, | 2618,23, | 2618,24, | 2618,25, | 2618,26, | 2618,27, | 2618,28, | 2618,29, | 2618,30, | 2618,31, | 2618,32, | 2618,33, | 2618,34, | 2618,35, | 2618,36, | 2618,37, | 2618,38, | 2618,39, | 2618,40, | 2618,41, | 2618,42, | 2618,43, | 2618,44, | 2618,45, | 2618,46, | 2618,47, | 2618,48, | 2618,49, | 2618,50, | 2618,51, | 2618,52, | 2618,53, | 2618,54, | 2618,55, | 2618,56, | 2618,57, | 2618,58, | 2618,59, | 2618,60, | 2618,61, | 2618,62, | 2618,63, | 2618,64, | 2618,65, | 2618,66, | 2618,67, | 2618,68, | 2618,69, | 2618,70, | 2618,71, | 2618,72, | 2618,73, | 2618,74, | 2618,75, | 2618,76, | 2618,77, | 2618,78, | 2618,79, | 2618,80, | 2618,81, | 2618,82, | 2618,83, | 2618,84, | 2618,85, | 2619,1, | 2619,2, | 2619,3, | 2619,4, | 2619,5, | 2619,6, | 2619,7, | 2619,8, | 2619,9, | 2619,10, | 2619,11, | 2619,12, | 2619,13, | 2619,14, | 2619,15, | 2619,16, | 2619,17, | 2619,18, | 2619,19, | 2619,20, | 2619,21, | 2619,22, | 2619,23, | 2619,24, | 2619,25, | 2619,26, | 2619,27, | 2619,28, | 2619,29, | 2619,30, | 2619,31, | 2619,32, | 2619,33, | 2619,34, | 2619,35, | 2619,36, | 2619,37, | 2619,38, | 2619,39, | 2619,40, | 2619,41, | 2619,42, | 2619,43, | 2619,44, | 2619,45, | 2619,46, | 2619,47, | 2619,48, | 2619,49, | 2619,50, | 2619,51, | 2619,52, | 2619,53, | 2619,54, | 2619,55, | 2619,56, | 2619,57, | 2619,58, | 2619,59, | 2619,60, | 2619,61, | 2619,62, | 2619,63, | 2619,64, | 2619,65, | 2619,66, | 2619,67, | 2619,68, | 2619,69, | 2619,70, | 2619,71, | 2619,72, | 2619,73, | 2619,74, | 2619,75, | 2619,76, | 2619,77, | 2619,78, | 2619,79, | 2619,80, | 2619,81, | 2619,82, | 2619,83, | 2619,84, | 2619,85, | 2620,1, | 2620,2, | 2620,3, | 2620,4, | 2620,5, | 2620,6, | 2620,7, | 2620,8, | 2620,9, | 2620,10, | 2620,11, | 2620,12, | 2620,13, | 2620,14, | 2620,15, | 2620,16, | 2620,17, | 2620,18, | 2620,19, | 2620,20, | 2620,21, | 2620,22, | 2620,23, | 2620,24, | 2620,25, | 2620,26, | 2620,27, | 2620,28, | 2620,29, | 2620,30, | 2620,31, | 2620,32, | 2620,33, | 2620,34, | 2620,35, | 2620,36, | 2620,37, | 2620,38, | 2620,39, | 2620,40, | 2620,41, | 2620,42, | 2620,43, | 2620,44, | 2620,45, | 2620,46, | 2620,47, | 2620,48, | 2620,49, | 2620,50, | 2620,51, | 2620,52, | 2620,53, | 2620,54, | 2620,55, | 2620,56, | 2620,57, | 2620,58, | 2620,59, | 2620,60, | 2620,61, | 2620,62, | 2620,63, | 2620,64, | 2620,65, | 2620,66, | 2620,67, | 2620,68, | 2620,69, | 2620,70, | 2620,71, | 2620,72, | 2620,73, | 2620,74, | 2620,75, | 2620,76, | 2620,77, | 2620,78, | 2620,79, | 2620,80, | 2620,81, | 2620,82, | 2620,83, | 2620,84, | 2620,85, | 2621,1, | 2621,2, | 2621,3, | 2621,4, | 2621,5, | 2621,6, | 2621,7, | 2621,8, | 2621,9, | 2621,10, | 2621,11, | 2621,12, | 2621,13, | 2621,14, | 2621,15, | 2621,16, | 2621,17, | 2621,18, | 2621,19, | 2621,20, | 2621,21, | 2621,22, | 2621,23, | 2621,24, | 2621,25, | 2621,26, | 2621,27, | 2621,28, | 2621,29, | 2621,30, | 2621,31, | 2621,32, | 2621,33, | 2621,34, | 2621,35, | 2621,36, | 2621,37, | 2621,38, | 2621,39, | 2621,40, | 2621,41, | 2621,42, | 2621,43, | 2621,44, | 2621,45, | 2621,46, | 2621,47, | 2621,48, | 2621,49, | 2621,50, | 2621,51, | 2621,52, | 2621,53, | 2621,54, | 2621,55, | 2621,56, | 2621,57, | 2621,58, | 2621,59, | 2621,60, | 2621,61, | 2621,62, | 2621,63, | 2621,64, | 2621,65, | 2621,66, | 2621,67, | 2621,68, | 2621,69, | 2621,70, | 2621,71, | 2621,72, | 2621,73, | 2621,74, | 2621,75, | 2621,76, | 2621,77, | 2621,78, | 2621,79, | 2621,80, | 2621,81, | 2621,82, | 2621,83, | 2621,84, | 2621,85, | 2622,1, | 2622,2, | 2622,3, | 2622,4, | 2622,5, | 2622,6, | 2622,7, | 2622,8, | 2622,9, | 2622,10, | 2622,11, | 2622,12, | 2622,13, | 2622,14, | 2622,15, | 2622,16, | 2622,17, | 2622,18, | 2622,19, | 2622,20, | 2622,21, | 2622,22, | 2622,23, | 2622,24, | 2622,25, | 2622,26, | 2622,27, | 2622,28, | 2622,29, | 2622,30, | 2622,31, | 2622,32, | 2622,33, | 2622,34, | 2622,35, | 2622,36, | 2622,37, | 2622,38, | 2622,39, | 2622,40, | 2622,41, | 2622,42, | 2622,43, | 2622,44, | 2622,45, | 2622,46, | 2622,47, | 2622,48, | 2622,49, | 2622,50, | 2622,51, | 2622,52, | 2622,53, | 2622,54, | 2622,55, | 2622,56, | 2622,57, | 2622,58, | 2622,59, | 2622,60, | 2622,61, | 2622,62, | 2622,63, | 2622,64, | 2622,65, | 2622,66, | 2622,67, | 2622,68, | 2622,69, | 2622,70, | 2622,71, | 2622,72, | 2622,73, | 2622,74, | 2622,75, | 2622,76, | 2622,77, | 2622,78, | 2622,79, | 2622,80, | 2622,81, | 2622,82, | 2622,83, | 2622,84, | 2622,85, | 2623,1, | 2623,2, | 2623,3, | 2623,4, | 2623,5, | 2623,6, | 2623,7, | 2623,8, | 2623,9, | 2623,10, | 2623,11, | 2623,12, | 2623,13, | 2623,14, | 2623,15, | 2623,16, | 2623,17, | 2623,18, | 2623,19, | 2623,20, | 2623,21, | 2623,22, | 2623,23, | 2623,24, | 2623,25, | 2623,26, | 2623,27, | 2623,28, | 2623,29, | 2623,30, | 2623,31, | 2623,32, | 2623,33, | 2623,34, | 2623,35, | 2623,36, | 2623,37, | 2623,38, | 2623,39, | 2623,40, | 2623,41, | 2623,42, | 2623,43, | 2623,44, | 2623,45, | 2623,46, | 2623,47, | 2623,48, | 2623,49, | 2623,50, | 2623,51, | 2623,52, | 2623,53, | 2623,54, | 2623,55, | 2623,56, | 2623,57, | 2623,58, | 2623,59, | 2623,60, | 2623,61, | 2623,62, | 2623,63, | 2623,64, | 2623,65, | 2623,66, | 2623,67, | 2623,68, | 2623,69, | 2623,70, | 2623,71, | 2623,72, | 2623,73, | 2623,74, | 2623,75, | 2623,76, | 2623,77, | 2623,78, | 2623,79, | 2623,80, | 2623,81, | 2623,82, | 2623,83, | 2623,84, | 2623,85, | 2624,1, | 2624,2, | 2624,3, | 2624,4, | 2624,5, | 2624,6, | 2624,7, | 2624,8, | 2624,9, | 2624,10, | 2624,11, | 2624,12, | 2624,13, | 2624,14, | 2624,15, | 2624,16, | 2624,17, | 2624,18, | 2624,19, | 2624,20, | 2624,21, | 2624,22, | 2624,23, | 2624,24, | 2624,25, | 2624,26, | 2624,27, | 2624,28, | 2624,29, | 2624,30, | 2624,31, | 2624,32, | 2624,33, | 2624,34, | 2624,35, | 2624,36, | 2624,37, | 2624,38, | 2624,39, | 2624,40, | 2624,41, | 2624,42, | 2624,43, | 2624,44, | 2624,45, | 2624,46, | 2624,47, | 2624,48, | 2624,49, | 2624,50, | 2624,51, | 2624,52, | 2624,53, | 2624,54, | 2624,55, | 2624,56, | 2624,57, | 2624,58, | 2624,59, | 2624,60, | 2624,61, | 2624,62, | 2624,63, | 2624,64, | 2624,65, | 2624,66, | 2624,67, | 2624,68, | 2624,69, | 2624,70, | 2624,71, | 2624,72, | 2624,73, | 2624,74, | 2624,75, | 2624,76, | 2624,77, | 2624,78, | 2624,79, | 2624,80, | 2624,81, | 2624,82, | 2624,83, | 2624,84, | 2624,85, | 2625,1, | 2625,2, | 2625,3, | 2625,4, | 2625,5, | 2625,6, | 2625,7, | 2625,8, | 2625,9, | 2625,10, | 2625,11, | 2625,12, | 2625,13, | 2625,14, | 2625,15, | 2625,16, | 2625,17, | 2625,18, | 2625,19, | 2625,20, | 2625,21, | 2625,22, | 2625,23, | 2625,24, | 2625,25, | 2625,26, | 2625,27, | 2625,28, | 2625,29, | 2625,30, | 2625,31, | 2625,32, | 2625,33, | 2625,34, | 2625,35, | 2625,36, | 2625,37, | 2625,38, | 2625,39, | 2625,40, | 2625,41, | 2625,42, | 2625,43, | 2625,44, | 2625,45, | 2625,46, | 2625,47, | 2625,48, | 2625,49, | 2625,50, | 2625,51, | 2625,52, | 2625,53, | 2625,54, | 2625,55, | 2625,56, | 2625,57, | 2625,58, | 2625,59, | 2625,60, | 2625,61, | 2625,62, | 2625,63, | 2625,64, | 2625,65, | 2625,66, | 2625,67, | 2625,68, | 2625,69, | 2625,70, | 2625,71, | 2625,72, | 2625,73, | 2625,74, | 2625,75, | 2625,76, | 2625,77, | 2625,78, | 2625,79, | 2625,80, | 2625,81, | 2625,82, | 2625,83, | 2625,84, | 2625,85, | 2626,1, | 2626,2, | 2626,3, | 2626,4, | 2626,5, | 2626,6, | 2626,7, | 2626,8, | 2626,9, | 2626,10, | 2626,11, | 2626,12, | 2626,13, | 2626,14, | 2626,15, | 2626,16, | 2626,17, | 2626,18, | 2626,19, | 2626,20, | 2626,21, | 2626,22, | 2626,23, | 2626,24, | 2626,25, | 2626,26, | 2626,27, | 2626,28, | 2626,29, | 2626,30, | 2626,31, | 2626,32, | 2626,33, | 2626,34, | 2626,35, | 2626,36, | 2626,37, | 2626,38, | 2626,39, | 2626,40, | 2626,41, | 2626,42, | 2626,43, | 2626,44, | 2626,45, | 2626,46, | 2626,47, | 2626,48, | 2626,49, | 2626,50, | 2626,51, | 2626,52, | 2626,53, | 2626,54, | 2626,55, | 2626,56, | 2626,57, | 2626,58, | 2626,59, | 2626,60, | 2626,61, | 2626,62, | 2626,63, | 2626,64, | 2626,65, | 2626,66, | 2626,67, | 2626,68, | 2626,69, | 2626,70, | 2626,71, | 2626,72, | 2626,73, | 2626,74, | 2626,75, | 2626,76, | 2626,77, | 2626,78, | 2626,79, | 2626,80, | 2626,81, | 2626,82, | 2626,83, | 2626,84, | 2626,85, | 2627,1, | 2627,2, | 2627,3, | 2627,4, | 2627,5, | 2627,6, | 2627,7, | 2627,8, | 2627,9, | 2627,10, | 2627,11, | 2627,12, | 2627,13, | 2627,14, | 2627,15, | 2627,16, | 2627,17, | 2627,18, | 2627,19, | 2627,20, | 2627,21, | 2627,22, | 2627,23, | 2627,24, | 2627,25, | 2627,26, | 2627,27, | 2627,28, | 2627,29, | 2627,30, | 2627,31, | 2627,32, | 2627,33, | 2627,34, | 2627,35, | 2627,36, | 2627,37, | 2627,38, | 2627,39, | 2627,40, | 2627,41, | 2627,42, | 2627,43, | 2627,44, | 2627,45, | 2627,46, | 2627,47, | 2627,48, | 2627,49, | 2627,50, | 2627,51, | 2627,52, | 2627,53, | 2627,54, | 2627,55, | 2627,56, | 2627,57, | 2627,58, | 2627,59, | 2627,60, | 2627,61, | 2627,62, | 2627,63, | 2627,64, | 2627,65, | 2627,66, | 2627,67, | 2627,68, | 2627,69, | 2627,70, | 2627,71, | 2627,72, | 2627,73, | 2627,74, | 2627,75, | 2627,76, | 2627,77, | 2627,78, | 2627,79, | 2627,80, | 2627,81, | 2627,82, | 2627,83, | 2627,84, | 2627,85, | 2628,1, | 2628,2, | 2628,3, | 2628,4, | 2628,5, | 2628,6, | 2628,7, | 2628,8, | 2628,9, | 2628,10, | 2628,11, | 2628,12, | 2628,13, | 2628,14, | 2628,15, | 2628,16, | 2628,17, | 2628,18, | 2628,19, | 2628,20, | 2628,21, | 2628,22, | 2628,23, | 2628,24, | 2628,25, | 2628,26, | 2628,27, | 2628,28, | 2628,29, | 2628,30, | 2628,31, | 2628,32, | 2628,33, | 2628,34, | 2628,35, | 2628,36, | 2628,37, | 2628,38, | 2628,39, | 2628,40, | 2628,41, | 2628,42, | 2628,43, | 2628,44, | 2628,45, | 2628,46, | 2628,47, | 2628,48, | 2628,49, | 2628,50, | 2628,51, | 2628,52, | 2628,53, | 2628,54, | 2628,55, | 2628,56, | 2628,57, | 2628,58, | 2628,59, | 2628,60, | 2628,61, | 2628,62, | 2628,63, | 2628,64, | 2628,65, | 2628,66, | 2628,67, | 2628,68, | 2628,69, | 2628,70, | 2628,71, | 2628,72, | 2628,73, | 2628,74, | 2628,75, | 2628,76, | 2628,77, | 2628,78, | 2628,79, | 2628,80, | 2628,81, | 2628,82, | 2628,83, | 2628,84, | 2628,85, | 2629,1, | 2629,2, | 2629,3, | 2629,4, | 2629,5, | 2629,6, | 2629,7, | 2629,8, | 2629,9, | 2629,10, | 2629,11, | 2629,12, | 2629,13, | 2629,14, | 2629,15, | 2629,16, | 2629,17, | 2629,18, | 2629,19, | 2629,20, | 2629,21, | 2629,22, | 2629,23, | 2629,24, | 2629,25, | 2629,26, | 2629,27, | 2629,28, | 2629,29, | 2629,30, | 2629,31, | 2629,32, | 2629,33, | 2629,34, | 2629,35, | 2629,36, | 2629,37, | 2629,38, | 2629,39, | 2629,40, | 2629,41, | 2629,42, | 2629,43, | 2629,44, | 2629,45, | 2629,46, | 2629,47, | 2629,48, | 2629,49, | 2629,50, | 2629,51, | 2629,52, | 2629,53, | 2629,54, | 2629,55, | 2629,56, | 2629,57, | 2629,58, | 2629,59, | 2629,60, | 2629,61, | 2629,62, | 2629,63, | 2629,64, | 2629,65, | 2629,66, | 2629,67, | 2629,68, | 2629,69, | 2629,70, | 2629,71, | 2629,72, | 2629,73, | 2629,74, | 2629,75, | 2629,76, | 2629,77, | 2629,78, | 2629,79, | 2629,80, | 2629,81, | 2629,82, | 2629,83, | 2629,84, | 2629,85, | 2630,1, | 2630,2, | 2630,3, | 2630,4, | 2630,5, | 2630,6, | 2630,7, | 2630,8, | 2630,9, | 2630,10, | 2630,11, | 2630,12, | 2630,13, | 2630,14, | 2630,15, | 2630,16, | 2630,17, | 2630,18, | 2630,19, | 2630,20, | 2630,21, | 2630,22, | 2630,23, | 2630,24, | 2630,25, | 2630,26, | 2630,27, | 2630,28, | 2630,29, | 2630,30, | 2630,31, | 2630,32, | 2630,33, | 2630,34, | 2630,35, | 2630,36, | 2630,37, | 2630,38, | 2630,39, | 2630,40, | 2630,41, | 2630,42, | 2630,43, | 2630,44, | 2630,45, | 2630,46, | 2630,47, | 2630,48, | 2630,49, | 2630,50, | 2630,51, | 2630,52, | 2630,53, | 2630,54, | 2630,55, | 2630,56, | 2630,57, | 2630,58, | 2630,59, | 2630,60, | 2630,61, | 2630,62, | 2630,63, | 2630,64, | 2630,65, | 2630,66, | 2630,67, | 2630,68, | 2630,69, | 2630,70, | 2630,71, | 2630,72, | 2630,73, | 2630,74, | 2630,75, | 2630,76, | 2630,77, | 2630,78, | 2630,79, | 2630,80, | 2630,81, | 2630,82, | 2630,83, | 2630,84, | 2630,85, | 2631,1, | 2631,2, | 2631,3, | 2631,4, | 2631,5, | 2631,6, | 2631,7, | 2631,8, | 2631,9, | 2631,10, | 2631,11, | 2631,12, | 2631,13, | 2631,14, | 2631,15, | 2631,16, | 2631,17, | 2631,18, | 2631,19, | 2631,20, | 2631,21, | 2631,22, | 2631,23, | 2631,24, | 2631,25, | 2631,26, | 2631,27, | 2631,28, | 2631,29, | 2631,30, | 2631,31, | 2631,32, | 2631,33, | 2631,34, | 2631,35, | 2631,36, | 2631,37, | 2631,38, | 2631,39, | 2631,40, | 2631,41, | 2631,42, | 2631,43, | 2631,44, | 2631,45, | 2631,46, | 2631,47, | 2631,48, | 2631,49, | 2631,50, | 2631,51, | 2631,52, | 2631,53, | 2631,54, | 2631,55, | 2631,56, | 2631,57, | 2631,58, | 2631,59, | 2631,60, | 2631,61, | 2631,62, | 2631,63, | 2631,64, | 2631,65, | 2631,66, | 2631,67, | 2631,68, | 2631,69, | 2631,70, | 2631,71, | 2631,72, | 2631,73, | 2631,74, | 2631,75, | 2631,76, | 2631,77, | 2631,78, | 2631,79, | 2631,80, | 2631,81, | 2631,82, | 2631,83, | 2631,84, | 2631,85, | 2632,1, | 2632,2, | 2632,3, | 2632,4, | 2632,5, | 2632,6, | 2632,7, | 2632,8, | 2632,9, | 2632,10, | 2632,11, | 2632,12, | 2632,13, | 2632,14, | 2632,15, | 2632,16, | 2632,17, | 2632,18, | 2632,19, | 2632,20, | 2632,21, | 2632,22, | 2632,23, | 2632,24, | 2632,25, | 2632,26, | 2632,27, | 2632,28, | 2632,29, | 2632,30, | 2632,31, | 2632,32, | 2632,33, | 2632,34, | 2632,35, | 2632,36, | 2632,37, | 2632,38, | 2632,39, | 2632,40, | 2632,41, | 2632,42, | 2632,43, | 2632,44, | 2632,45, | 2632,46, | 2632,47, | 2632,48, | 2632,49, | 2632,50, | 2632,51, | 2632,52, | 2632,53, | 2632,54, | 2632,55, | 2632,56, | 2632,57, | 2632,58, | 2632,59, | 2632,60, | 2632,61, | 2632,62, | 2632,63, | 2632,64, | 2632,65, | 2632,66, | 2632,67, | 2632,68, | 2632,69, | 2632,70, | 2632,71, | 2632,72, | 2632,73, | 2632,74, | 2632,75, | 2632,76, | 2632,77, | 2632,78, | 2632,79, | 2632,80, | 2632,81, | 2632,82, | 2632,83, | 2632,84, | 2632,85, | 2633,1, | 2633,2, | 2633,3, | 2633,4, | 2633,5, | 2633,6, | 2633,7, | 2633,8, | 2633,9, | 2633,10, | 2633,11, | 2633,12, | 2633,13, | 2633,14, | 2633,15, | 2633,16, | 2633,17, | 2633,18, | 2633,19, | 2633,20, | 2633,21, | 2633,22, | 2633,23, | 2633,24, | 2633,25, | 2633,26, | 2633,27, | 2633,28, | 2633,29, | 2633,30, | 2633,31, | 2633,32, | 2633,33, | 2633,34, | 2633,35, | 2633,36, | 2633,37, | 2633,38, | 2633,39, | 2633,40, | 2633,41, | 2633,42, | 2633,43, | 2633,44, | 2633,45, | 2633,46, | 2633,47, | 2633,48, | 2633,49, | 2633,50, | 2633,51, | 2633,52, | 2633,53, | 2633,54, | 2633,55, | 2633,56, | 2633,57, | 2633,58, | 2633,59, | 2633,60, | 2633,61, | 2633,62, | 2633,63, | 2633,64, | 2633,65, | 2633,66, | 2633,67, | 2633,68, | 2633,69, | 2633,70, | 2633,71, | 2633,72, | 2633,73, | 2633,74, | 2633,75, | 2633,76, | 2633,77, | 2633,78, | 2633,79, | 2633,80, | 2633,81, | 2633,82, | 2633,83, | 2633,84, | 2633,85, | 2634,1, | 2634,2, | 2634,3, | 2634,4, | 2634,5, | 2634,6, | 2634,7, | 2634,8, | 2634,9, | 2634,10, | 2634,11, | 2634,12, | 2634,13, | 2634,14, | 2634,15, | 2634,16, | 2634,17, | 2634,18, | 2634,19, | 2634,20, | 2634,21, | 2634,22, | 2634,23, | 2634,24, | 2634,25, | 2634,26, | 2634,27, | 2634,28, | 2634,29, | 2634,30, | 2634,31, | 2634,32, | 2634,33, | 2634,34, | 2634,35, | 2634,36, | 2634,37, | 2634,38, | 2634,39, | 2634,40, | 2634,41, | 2634,42, | 2634,43, | 2634,44, | 2634,45, | 2634,46, | 2634,47, | 2634,48, | 2634,49, | 2634,50, | 2634,51, | 2634,52, | 2634,53, | 2634,54, | 2634,55, | 2634,56, | 2634,57, | 2634,58, | 2634,59, | 2634,60, | 2634,61, | 2634,62, | 2634,63, | 2634,64, | 2634,65, | 2634,66, | 2634,67, | 2634,68, | 2634,69, | 2634,70, | 2634,71, | 2634,72, | 2634,73, | 2634,74, | 2634,75, | 2634,76, | 2634,77, | 2634,78, | 2634,79, | 2634,80, | 2634,81, | 2634,82, | 2634,83, | 2634,84, | 2634,85, | 2635,1, | 2635,2, | 2635,3, | 2635,4, | 2635,5, | 2635,6, | 2635,7, | 2635,8, | 2635,9, | 2635,10, | 2635,11, | 2635,12, | 2635,13, | 2635,14, | 2635,15, | 2635,16, | 2635,17, | 2635,18, | 2635,19, | 2635,20, | 2635,21, | 2635,22, | 2635,23, | 2635,24, | 2635,25, | 2635,26, | 2635,27, | 2635,28, | 2635,29, | 2635,30, | 2635,31, | 2635,32, | 2635,33, | 2635,34, | 2635,35, | 2635,36, | 2635,37, | 2635,38, | 2635,39, | 2635,40, | 2635,41, | 2635,42, | 2635,43, | 2635,44, | 2635,45, | 2635,46, | 2635,47, | 2635,48, | 2635,49, | 2635,50, | 2635,51, | 2635,52, | 2635,53, | 2635,54, | 2635,55, | 2635,56, | 2635,57, | 2635,58, | 2635,59, | 2635,60, | 2635,61, | 2635,62, | 2635,63, | 2635,64, | 2635,65, | 2635,66, | 2635,67, | 2635,68, | 2635,69, | 2635,70, | 2635,71, | 2635,72, | 2635,73, | 2635,74, | 2635,75, | 2635,76, | 2635,77, | 2635,78, | 2635,79, | 2635,80, | 2635,81, | 2635,82, | 2635,83, | 2635,84, | 2635,85, | 2636,1, | 2636,2, | 2636,3, | 2636,4, | 2636,5, | 2636,6, | 2636,7, | 2636,8, | 2636,9, | 2636,10, | 2636,11, | 2636,12, | 2636,13, | 2636,14, | 2636,15, | 2636,16, | 2636,17, | 2636,18, | 2636,19, | 2636,20, | 2636,21, | 2636,22, | 2636,23, | 2636,24, | 2636,25, | 2636,26, | 2636,27, | 2636,28, | 2636,29, | 2636,30, | 2636,31, | 2636,32, | 2636,33, | 2636,34, | 2636,35, | 2636,36, | 2636,37, | 2636,38, | 2636,39, | 2636,40, | 2636,41, | 2636,42, | 2636,43, | 2636,44, | 2636,45, | 2636,46, | 2636,47, | 2636,48, | 2636,49, | 2636,50, | 2636,51, | 2636,52, | 2636,53, | 2636,54, | 2636,55, | 2636,56, | 2636,57, | 2636,58, | 2636,59, | 2636,60, | 2636,61, | 2636,62, | 2636,63, | 2636,64, | 2636,65, | 2636,66, | 2636,67, | 2636,68, | 2636,69, | 2636,70, | 2636,71, | 2636,72, | 2636,73, | 2636,74, | 2636,75, | 2636,76, | 2636,77, | 2636,78, | 2636,79, | 2636,80, | 2636,81, | 2636,82, | 2636,83, | 2636,84, | 2636,85, | 2637,1, | 2637,2, | 2637,3, | 2637,4, | 2637,5, | 2637,6, | 2637,7, | 2637,8, | 2637,9, | 2637,10, | 2637,11, | 2637,12, | 2637,13, | 2637,14, | 2637,15, | 2637,16, | 2637,17, | 2637,18, | 2637,19, | 2637,20, | 2637,21, | 2637,22, | 2637,23, | 2637,24, | 2637,25, | 2637,26, | 2637,27, | 2637,28, | 2637,29, | 2637,30, | 2637,31, | 2637,32, | 2637,33, | 2637,34, | 2637,35, | 2637,36, | 2637,37, | 2637,38, | 2637,39, | 2637,40, | 2637,41, | 2637,42, | 2637,43, | 2637,44, | 2637,45, | 2637,46, | 2637,47, | 2637,48, | 2637,49, | 2637,50, | 2637,51, | 2637,52, | 2637,53, | 2637,54, | 2637,55, | 2637,56, | 2637,57, | 2637,58, | 2637,59, | 2637,60, | 2637,61, | 2637,62, | 2637,63, | 2637,64, | 2637,65, | 2637,66, | 2637,67, | 2637,68, | 2637,69, | 2637,70, | 2637,71, | 2637,72, | 2637,73, | 2637,74, | 2637,75, | 2637,76, | 2637,77, | 2637,78, | 2637,79, | 2637,80, | 2637,81, | 2637,82, | 2637,83, | 2637,84, | 2637,85, | 2638,1, | 2638,2, | 2638,3, | 2638,4, | 2638,5, | 2638,6, | 2638,7, | 2638,8, | 2638,9, | 2638,10, | 2638,11, | 2638,12, | 2638,13, | 2638,14, | 2638,15, | 2638,16, | 2638,17, | 2638,18, | 2638,19, | 2638,20, | 2638,21, | 2638,22, | 2638,23, | 2638,24, | 2638,25, | 2638,26, | 2638,27, | 2638,28, | 2638,29, | 2638,30, | 2638,31, | 2638,32, | 2638,33, | 2638,34, | 2638,35, | 2638,36, | 2638,37, | 2638,38, | 2638,39, | 2638,40, | 2638,41, | 2638,42, | 2638,43, | 2638,44, | 2638,45, | 2638,46, | 2638,47, | 2638,48, | 2638,49, | 2638,50, | 2638,51, | 2638,52, | 2638,53, | 2638,54, | 2638,55, | 2638,56, | 2638,57, | 2638,58, | 2638,59, | 2638,60, | 2638,61, | 2638,62, | 2638,63, | 2638,64, | 2638,65, | 2638,66, | 2638,67, | 2638,68, | 2638,69, | 2638,70, | 2638,71, | 2638,72, | 2638,73, | 2638,74, | 2638,75, | 2638,76, | 2638,77, | 2638,78, | 2638,79, | 2638,80, | 2638,81, | 2638,82, | 2638,83, | 2638,84, | 2638,85, | 2639,1, | 2639,2, | 2639,3, | 2639,4, | 2639,5, | 2639,6, | 2639,7, | 2639,8, | 2639,9, | 2639,10, | 2639,11, | 2639,12, | 2639,13, | 2639,14, | 2639,15, | 2639,16, | 2639,17, | 2639,18, | 2639,19, | 2639,20, | 2639,21, | 2639,22, | 2639,23, | 2639,24, | 2639,25, | 2639,26, | 2639,27, | 2639,28, | 2639,29, | 2639,30, | 2639,31, | 2639,32, | 2639,33, | 2639,34, | 2639,35, | 2639,36, | 2639,37, | 2639,38, | 2639,39, | 2639,40, | 2639,41, | 2639,42, | 2639,43, | 2639,44, | 2639,45, | 2639,46, | 2639,47, | 2639,48, | 2639,49, | 2639,50, | 2639,51, | 2639,52, | 2639,53, | 2639,54, | 2639,55, | 2639,56, | 2639,57, | 2639,58, | 2639,59, | 2639,60, | 2639,61, | 2639,62, | 2639,63, | 2639,64, | 2639,65, | 2639,66, | 2639,67, | 2639,68, | 2639,69, | 2639,70, | 2639,71, | 2639,72, | 2639,73, | 2639,74, | 2639,75, | 2639,76, | 2639,77, | 2639,78, | 2639,79, | 2639,80, | 2639,81, | 2639,82, | 2639,83, | 2639,84, | 2639,85, | 2640,1, | 2640,2, | 2640,3, | 2640,4, | 2640,5, | 2640,6, | 2640,7, | 2640,8, | 2640,9, | 2640,10, | 2640,11, | 2640,12, | 2640,13, | 2640,14, | 2640,15, | 2640,16, | 2640,17, | 2640,18, | 2640,19, | 2640,20, | 2640,21, | 2640,22, | 2640,23, | 2640,24, | 2640,25, | 2640,26, | 2640,27, | 2640,28, | 2640,29, | 2640,30, | 2640,31, | 2640,32, | 2640,33, | 2640,34, | 2640,35, | 2640,36, | 2640,37, | 2640,38, | 2640,39, | 2640,40, | 2640,41, | 2640,42, | 2640,43, | 2640,44, | 2640,45, | 2640,46, | 2640,47, | 2640,48, | 2640,49, | 2640,50, | 2640,51, | 2640,52, | 2640,53, | 2640,54, | 2640,55, | 2640,56, | 2640,57, | 2640,58, | 2640,59, | 2640,60, | 2640,61, | 2640,62, | 2640,63, | 2640,64, | 2640,65, | 2640,66, | 2640,67, | 2640,68, | 2640,69, | 2640,70, | 2640,71, | 2640,72, | 2640,73, | 2640,74, | 2640,75, | 2640,76, | 2640,77, | 2640,78, | 2640,79, | 2640,80, | 2640,81, | 2640,82, | 2640,83, | 2640,84, | 2640,85, | 2641,1, | 2641,2, | 2641,3, | 2641,4, | 2641,5, | 2641,6, | 2641,7, | 2641,8, | 2641,9, | 2641,10, | 2641,11, | 2641,12, | 2641,13, | 2641,14, | 2641,15, | 2641,16, | 2641,17, | 2641,18, | 2641,19, | 2641,20, | 2641,21, | 2641,22, | 2641,23, | 2641,24, | 2641,25, | 2641,26, | 2641,27, | 2641,28, | 2641,29, | 2641,30, | 2641,31, | 2641,32, | 2641,33, | 2641,34, | 2641,35, | 2641,36, | 2641,37, | 2641,38, | 2641,39, | 2641,40, | 2641,41, | 2641,42, | 2641,43, | 2641,44, | 2641,45, | 2641,46, | 2641,47, | 2641,48, | 2641,49, | 2641,50, | 2641,51, | 2641,52, | 2641,53, | 2641,54, | 2641,55, | 2641,56, | 2641,57, | 2641,58, | 2641,59, | 2641,60, | 2641,61, | 2641,62, | 2641,63, | 2641,64, | 2641,65, | 2641,66, | 2641,67, | 2641,68, | 2641,69, | 2641,70, | 2641,71, | 2641,72, | 2641,73, | 2641,74, | 2641,75, | 2641,76, | 2641,77, | 2641,78, | 2641,79, | 2641,80, | 2641,81, | 2641,82, | 2641,83, | 2641,84, | 2641,85, | 2642,1, | 2642,2, | 2642,3, | 2642,4, | 2642,5, | 2642,6, | 2642,7, | 2642,8, | 2642,9, | 2642,10, | 2642,11, | 2642,12, | 2642,13, | 2642,14, | 2642,15, | 2642,16, | 2642,17, | 2642,18, | 2642,19, | 2642,20, | 2642,21, | 2642,22, | 2642,23, | 2642,24, | 2642,25, | 2642,26, | 2642,27, | 2642,28, | 2642,29, | 2642,30, | 2642,31, | 2642,32, | 2642,33, | 2642,34, | 2642,35, | 2642,36, | 2642,37, | 2642,38, | 2642,39, | 2642,40, | 2642,41, | 2642,42, | 2642,43, | 2642,44, | 2642,45, | 2642,46, | 2642,47, | 2642,48, | 2642,49, | 2642,50, | 2642,51, | 2642,52, | 2642,53, | 2642,54, | 2642,55, | 2642,56, | 2642,57, | 2642,58, | 2642,59, | 2642,60, | 2642,61, | 2642,62, | 2642,63, | 2642,64, | 2642,65, | 2642,66, | 2642,67, | 2642,68, | 2642,69, | 2642,70, | 2642,71, | 2642,72, | 2642,73, | 2642,74, | 2642,75, | 2642,76, | 2642,77, | 2642,78, | 2642,79, | 2642,80, | 2642,81, | 2642,82, | 2642,83, | 2642,84, | 2642,85, | 2643,1, | 2643,2, | 2643,3, | 2643,4, | 2643,5, | 2643,6, | 2643,7, | 2643,8, | 2643,9, | 2643,10, | 2643,11, | 2643,12, | 2643,13, | 2643,14, | 2643,15, | 2643,16, | 2643,17, | 2643,18, | 2643,19, | 2643,20, | 2643,21, | 2643,22, | 2643,23, | 2643,24, | 2643,25, | 2643,26, | 2643,27, | 2643,28, | 2643,29, | 2643,30, | 2643,31, | 2643,32, | 2643,33, | 2643,34, | 2643,35, | 2643,36, | 2643,37, | 2643,38, | 2643,39, | 2643,40, | 2643,41, | 2643,42, | 2643,43, | 2643,44, | 2643,45, | 2643,46, | 2643,47, | 2643,48, | 2643,49, | 2643,50, | 2643,51, | 2643,52, | 2643,53, | 2643,54, | 2643,55, | 2643,56, | 2643,57, | 2643,58, | 2643,59, | 2643,60, | 2643,61, | 2643,62, | 2643,63, | 2643,64, | 2643,65, | 2643,66, | 2643,67, | 2643,68, | 2643,69, | 2643,70, | 2643,71, | 2643,72, | 2643,73, | 2643,74, | 2643,75, | 2643,76, | 2643,77, | 2643,78, | 2643,79, | 2643,80, | 2643,81, | 2643,82, | 2643,83, | 2643,84, | 2643,85, | 2644,1, | 2644,2, | 2644,3, | 2644,4, | 2644,5, | 2644,6, | 2644,7, | 2644,8, | 2644,9, | 2644,10, | 2644,11, | 2644,12, | 2644,13, | 2644,14, | 2644,15, | 2644,16, | 2644,17, | 2644,18, | 2644,19, | 2644,20, | 2644,21, | 2644,22, | 2644,23, | 2644,24, | 2644,25, | 2644,26, | 2644,27, | 2644,28, | 2644,29, | 2644,30, | 2644,31, | 2644,32, | 2644,33, | 2644,34, | 2644,35, | 2644,36, | 2644,37, | 2644,38, | 2644,39, | 2644,40, | 2644,41, | 2644,42, | 2644,43, | 2644,44, | 2644,45, | 2644,46, | 2644,47, | 2644,48, | 2644,49, | 2644,50, | 2644,51, | 2644,52, | 2644,53, | 2644,54, | 2644,55, | 2644,56, | 2644,57, | 2644,58, | 2644,59, | 2644,60, | 2644,61, | 2644,62, | 2644,63, | 2644,64, | 2644,65, | 2644,66, | 2644,67, | 2644,68, | 2644,69, | 2644,70, | 2644,71, | 2644,72, | 2644,73, | 2644,74, | 2644,75, | 2644,76, | 2644,77, | 2644,78, | 2644,79, | 2644,80, | 2644,81, | 2644,82, | 2644,83, | 2644,84, | 2644,85, | 2645,1, | 2645,2, | 2645,3, | 2645,4, | 2645,5, | 2645,6, | 2645,7, | 2645,8, | 2645,9, | 2645,10, | 2645,11, | 2645,12, | 2645,13, | 2645,14, | 2645,15, | 2645,16, | 2645,17, | 2645,18, | 2645,19, | 2645,20, | 2645,21, | 2645,22, | 2645,23, | 2645,24, | 2645,25, | 2645,26, | 2645,27, | 2645,28, | 2645,29, | 2645,30, | 2645,31, | 2645,32, | 2645,33, | 2645,34, | 2645,35, | 2645,36, | 2645,37, | 2645,38, | 2645,39, | 2645,40, | 2645,41, | 2645,42, | 2645,43, | 2645,44, | 2645,45, | 2645,46, | 2645,47, | 2645,48, | 2645,49, | 2645,50, | 2645,51, | 2645,52, | 2645,53, | 2645,54, | 2645,55, | 2645,56, | 2645,57, | 2645,58, | 2645,59, | 2645,60, | 2645,61, | 2645,62, | 2645,63, | 2645,64, | 2645,65, | 2645,66, | 2645,67, | 2645,68, | 2645,69, | 2645,70, | 2645,71, | 2645,72, | 2645,73, | 2645,74, | 2645,75, | 2645,76, | 2645,77, | 2645,78, | 2645,79, | 2645,80, | 2645,81, | 2645,82, | 2645,83, | 2645,84, | 2645,85, | 2646,1, | 2646,2, | 2646,3, | 2646,4, | 2646,5, | 2646,6, | 2646,7, | 2646,8, | 2646,9, | 2646,10, | 2646,11, | 2646,12, | 2646,13, | 2646,14, | 2646,15, | 2646,16, | 2646,17, | 2646,18, | 2646,19, | 2646,20, | 2646,21, | 2646,22, | 2646,23, | 2646,24, | 2646,25, | 2646,26, | 2646,27, | 2646,28, | 2646,29, | 2646,30, | 2646,31, | 2646,32, | 2646,33, | 2646,34, | 2646,35, | 2646,36, | 2646,37, | 2646,38, | 2646,39, | 2646,40, | 2646,41, | 2646,42, | 2646,43, | 2646,44, | 2646,45, | 2646,46, | 2646,47, | 2646,48, | 2646,49, | 2646,50, | 2646,51, | 2646,52, | 2646,53, | 2646,54, | 2646,55, | 2646,56, | 2646,57, | 2646,58, | 2646,59, | 2646,60, | 2646,61, | 2646,62, | 2646,63, | 2646,64, | 2646,65, | 2646,66, | 2646,67, | 2646,68, | 2646,69, | 2646,70, | 2646,71, | 2646,72, | 2646,73, | 2646,74, | 2646,75, | 2646,76, | 2646,77, | 2646,78, | 2646,79, | 2646,80, | 2646,81, | 2646,82, | 2646,83, | 2646,84, | 2646,85, | 2647,1, | 2647,2, | 2647,3, | 2647,4, | 2647,5, | 2647,6, | 2647,7, | 2647,8, | 2647,9, | 2647,10, | 2647,11, | 2647,12, | 2647,13, | 2647,14, | 2647,15, | 2647,16, | 2647,17, | 2647,18, | 2647,19, | 2647,20, | 2647,21, | 2647,22, | 2647,23, | 2647,24, | 2647,25, | 2647,26, | 2647,27, | 2647,28, | 2647,29, | 2647,30, | 2647,31, | 2647,32, | 2647,33, | 2647,34, | 2647,35, | 2647,36, | 2647,37, | 2647,38, | 2647,39, | 2647,40, | 2647,41, | 2647,42, | 2647,43, | 2647,44, | 2647,45, | 2647,46, | 2647,47, | 2647,48, | 2647,49, | 2647,50, | 2647,51, | 2647,52, | 2647,53, | 2647,54, | 2647,55, | 2647,56, | 2647,57, | 2647,58, | 2647,59, | 2647,60, | 2647,61, | 2647,62, | 2647,63, | 2647,64, | 2647,65, | 2647,66, | 2647,67, | 2647,68, | 2647,69, | 2647,70, | 2647,71, | 2647,72, | 2647,73, | 2647,74, | 2647,75, | 2647,76, | 2647,77, | 2647,78, | 2647,79, | 2647,80, | 2647,81, | 2647,82, | 2647,83, | 2647,84, | 2647,85, | 2648,1, | 2648,2, | 2648,3, | 2648,4, | 2648,5, | 2648,6, | 2648,7, | 2648,8, | 2648,9, | 2648,10, | 2648,11, | 2648,12, | 2648,13, | 2648,14, | 2648,15, | 2648,16, | 2648,17, | 2648,18, | 2648,19, | 2648,20, | 2648,21, | 2648,22, | 2648,23, | 2648,24, | 2648,25, | 2648,26, | 2648,27, | 2648,28, | 2648,29, | 2648,30, | 2648,31, | 2648,32, | 2648,33, | 2648,34, | 2648,35, | 2648,36, | 2648,37, | 2648,38, | 2648,39, | 2648,40, | 2648,41, | 2648,42, | 2648,43, | 2648,44, | 2648,45, | 2648,46, | 2648,47, | 2648,48, | 2648,49, | 2648,50, | 2648,51, | 2648,52, | 2648,53, | 2648,54, | 2648,55, | 2648,56, | 2648,57, | 2648,58, | 2648,59, | 2648,60, | 2648,61, | 2648,62, | 2648,63, | 2648,64, | 2648,65, | 2648,66, | 2648,67, | 2648,68, | 2648,69, | 2648,70, | 2648,71, | 2648,72, | 2648,73, | 2648,74, | 2648,75, | 2648,76, | 2648,77, | 2648,78, | 2648,79, | 2648,80, | 2648,81, | 2648,82, | 2648,83, | 2648,84, | 2648,85, | 2649,1, | 2649,2, | 2649,3, | 2649,4, | 2649,5, | 2649,6, | 2649,7, | 2649,8, | 2649,9, | 2649,10, | 2649,11, | 2649,12, | 2649,13, | 2649,14, | 2649,15, | 2649,16, | 2649,17, | 2649,18, | 2649,19, | 2649,20, | 2649,21, | 2649,22, | 2649,23, | 2649,24, | 2649,25, | 2649,26, | 2649,27, | 2649,28, | 2649,29, | 2649,30, | 2649,31, | 2649,32, | 2649,33, | 2649,34, | 2649,35, | 2649,36, | 2649,37, | 2649,38, | 2649,39, | 2649,40, | 2649,41, | 2649,42, | 2649,43, | 2649,44, | 2649,45, | 2649,46, | 2649,47, | 2649,48, | 2649,49, | 2649,50, | 2649,51, | 2649,52, | 2649,53, | 2649,54, | 2649,55, | 2649,56, | 2649,57, | 2649,58, | 2649,59, | 2649,60, | 2649,61, | 2649,62, | 2649,63, | 2649,64, | 2649,65, | 2649,66, | 2649,67, | 2649,68, | 2649,69, | 2649,70, | 2649,71, | 2649,72, | 2649,73, | 2649,74, | 2649,75, | 2649,76, | 2649,77, | 2649,78, | 2649,79, | 2649,80, | 2649,81, | 2649,82, | 2649,83, | 2649,84, | 2649,85, | 2650,1, | 2650,2, | 2650,3, | 2650,4, | 2650,5, | 2650,6, | 2650,7, | 2650,8, | 2650,9, | 2650,10, | 2650,11, | 2650,12, | 2650,13, | 2650,14, | 2650,15, | 2650,16, | 2650,17, | 2650,18, | 2650,19, | 2650,20, | 2650,21, | 2650,22, | 2650,23, | 2650,24, | 2650,25, | 2650,26, | 2650,27, | 2650,28, | 2650,29, | 2650,30, | 2650,31, | 2650,32, | 2650,33, | 2650,34, | 2650,35, | 2650,36, | 2650,37, | 2650,38, | 2650,39, | 2650,40, | 2650,41, | 2650,42, | 2650,43, | 2650,44, | 2650,45, | 2650,46, | 2650,47, | 2650,48, | 2650,49, | 2650,50, | 2650,51, | 2650,52, | 2650,53, | 2650,54, | 2650,55, | 2650,56, | 2650,57, | 2650,58, | 2650,59, | 2650,60, | 2650,61, | 2650,62, | 2650,63, | 2650,64, | 2650,65, | 2650,66, | 2650,67, | 2650,68, | 2650,69, | 2650,70, | 2650,71, | 2650,72, | 2650,73, | 2650,74, | 2650,75, | 2650,76, | 2650,77, | 2650,78, | 2650,79, | 2650,80, | 2650,81, | 2650,82, | 2650,83, | 2650,84, | 2650,85, | 2651,1, | 2651,2, | 2651,3, | 2651,4, | 2651,5, | 2651,6, | 2651,7, | 2651,8, | 2651,9, | 2651,10, | 2651,11, | 2651,12, | 2651,13, | 2651,14, | 2651,15, | 2651,16, | 2651,17, | 2651,18, | 2651,19, | 2651,20, | 2651,21, | 2651,22, | 2651,23, | 2651,24, | 2651,25, | 2651,26, | 2651,27, | 2651,28, | 2651,29, | 2651,30, | 2651,31, | 2651,32, | 2651,33, | 2651,34, | 2651,35, | 2651,36, | 2651,37, | 2651,38, | 2651,39, | 2651,40, | 2651,41, | 2651,42, | 2651,43, | 2651,44, | 2651,45, | 2651,46, | 2651,47, | 2651,48, | 2651,49, | 2651,50, | 2651,51, | 2651,52, | 2651,53, | 2651,54, | 2651,55, | 2651,56, | 2651,57, | 2651,58, | 2651,59, | 2651,60, | 2651,61, | 2651,62, | 2651,63, | 2651,64, | 2651,65, | 2651,66, | 2651,67, | 2651,68, | 2651,69, | 2651,70, | 2651,71, | 2651,72, | 2651,73, | 2651,74, | 2651,75, | 2651,76, | 2651,77, | 2651,78, | 2651,79, | 2651,80, | 2651,81, | 2651,82, | 2651,83, | 2651,84, | 2651,85, | 2652,1, | 2652,2, | 2652,3, | 2652,4, | 2652,5, | 2652,6, | 2652,7, | 2652,8, | 2652,9, | 2652,10, | 2652,11, | 2652,12, | 2652,13, | 2652,14, | 2652,15, | 2652,16, | 2652,17, | 2652,18, | 2652,19, | 2652,20, | 2652,21, | 2652,22, | 2652,23, | 2652,24, | 2652,25, | 2652,26, | 2652,27, | 2652,28, | 2652,29, | 2652,30, | 2652,31, | 2652,32, | 2652,33, | 2652,34, | 2652,35, | 2652,36, | 2652,37, | 2652,38, | 2652,39, | 2652,40, | 2652,41, | 2652,42, | 2652,43, | 2652,44, | 2652,45, | 2652,46, | 2652,47, | 2652,48, | 2652,49, | 2652,50, | 2652,51, | 2652,52, | 2652,53, | 2652,54, | 2652,55, | 2652,56, | 2652,57, | 2652,58, | 2652,59, | 2652,60, | 2652,61, | 2652,62, | 2652,63, | 2652,64, | 2652,65, | 2652,66, | 2652,67, | 2652,68, | 2652,69, | 2652,70, | 2652,71, | 2652,72, | 2652,73, | 2652,74, | 2652,75, | 2652,76, | 2652,77, | 2652,78, | 2652,79, | 2652,80, | 2652,81, | 2652,82, | 2652,83, | 2652,84, | 2652,85, | 2653,1, | 2653,2, | 2653,3, | 2653,4, | 2653,5, | 2653,6, | 2653,7, | 2653,8, | 2653,9, | 2653,10, | 2653,11, | 2653,12, | 2653,13, | 2653,14, | 2653,15, | 2653,16, | 2653,17, | 2653,18, | 2653,19, | 2653,20, | 2653,21, | 2653,22, | 2653,23, | 2653,24, | 2653,25, | 2653,26, | 2653,27, | 2653,28, | 2653,29, | 2653,30, | 2653,31, | 2653,32, | 2653,33, | 2653,34, | 2653,35, | 2653,36, | 2653,37, | 2653,38, | 2653,39, | 2653,40, | 2653,41, | 2653,42, | 2653,43, | 2653,44, | 2653,45, | 2653,46, | 2653,47, | 2653,48, | 2653,49, | 2653,50, | 2653,51, | 2653,52, | 2653,53, | 2653,54, | 2653,55, | 2653,56, | 2653,57, | 2653,58, | 2653,59, | 2653,60, | 2653,61, | 2653,62, | 2653,63, | 2653,64, | 2653,65, | 2653,66, | 2653,67, | 2653,68, | 2653,69, | 2653,70, | 2653,71, | 2653,72, | 2653,73, | 2653,74, | 2653,75, | 2653,76, | 2653,77, | 2653,78, | 2653,79, | 2653,80, | 2653,81, | 2653,82, | 2653,83, | 2653,84, | 2653,85, | 2654,1, | 2654,2, | 2654,3, | 2654,4, | 2654,5, | 2654,6, | 2654,7, | 2654,8, | 2654,9, | 2654,10, | 2654,11, | 2654,12, | 2654,13, | 2654,14, | 2654,15, | 2654,16, | 2654,17, | 2654,18, | 2654,19, | 2654,20, | 2654,21, | 2654,22, | 2654,23, | 2654,24, | 2654,25, | 2654,26, | 2654,27, | 2654,28, | 2654,29, | 2654,30, | 2654,31, | 2654,32, | 2654,33, | 2654,34, | 2654,35, | 2654,36, | 2654,37, | 2654,38, | 2654,39, | 2654,40, | 2654,41, | 2654,42, | 2654,43, | 2654,44, | 2654,45, | 2654,46, | 2654,47, | 2654,48, | 2654,49, | 2654,50, | 2654,51, | 2654,52, | 2654,53, | 2654,54, | 2654,55, | 2654,56, | 2654,57, | 2654,58, | 2654,59, | 2654,60, | 2654,61, | 2654,62, | 2654,63, | 2654,64, | 2654,65, | 2654,66, | 2654,67, | 2654,68, | 2654,69, | 2654,70, | 2654,71, | 2654,72, | 2654,73, | 2654,74, | 2654,75, | 2654,76, | 2654,77, | 2654,78, | 2654,79, | 2654,80, | 2654,81, | 2654,82, | 2654,83, | 2654,84, | 2654,85, | 2655,1, | 2655,2, | 2655,3, | 2655,4, | 2655,5, | 2655,6, | 2655,7, | 2655,8, | 2655,9, | 2655,10, | 2655,11, | 2655,12, | 2655,13, | 2655,14, | 2655,15, | 2655,16, | 2655,17, | 2655,18, | 2655,19, | 2655,20, | 2655,21, | 2655,22, | 2655,23, | 2655,24, | 2655,25, | 2655,26, | 2655,27, | 2655,28, | 2655,29, | 2655,30, | 2655,31, | 2655,32, | 2655,33, | 2655,34, | 2655,35, | 2655,36, | 2655,37, | 2655,38, | 2655,39, | 2655,40, | 2655,41, | 2655,42, | 2655,43, | 2655,44, | 2655,45, | 2655,46, | 2655,47, | 2655,48, | 2655,49, | 2655,50, | 2655,51, | 2655,52, | 2655,53, | 2655,54, | 2655,55, | 2655,56, | 2655,57, | 2655,58, | 2655,59, | 2655,60, | 2655,61, | 2655,62, | 2655,63, | 2655,64, | 2655,65, | 2655,66, | 2655,67, | 2655,68, | 2655,69, | 2655,70, | 2655,71, | 2655,72, | 2655,73, | 2655,74, | 2655,75, | 2655,76, | 2655,77, | 2655,78, | 2655,79, | 2655,80, | 2655,81, | 2655,82, | 2655,83, | 2655,84, | 2655,85, | 2656,1, | 2656,2, | 2656,3, | 2656,4, | 2656,5, | 2656,6, | 2656,7, | 2656,8, | 2656,9, | 2656,10, | 2656,11, | 2656,12, | 2656,13, | 2656,14, | 2656,15, | 2656,16, | 2656,17, | 2656,18, | 2656,19, | 2656,20, | 2656,21, | 2656,22, | 2656,23, | 2656,24, | 2656,25, | 2656,26, | 2656,27, | 2656,28, | 2656,29, | 2656,30, | 2656,31, | 2656,32, | 2656,33, | 2656,34, | 2656,35, | 2656,36, | 2656,37, | 2656,38, | 2656,39, | 2656,40, | 2656,41, | 2656,42, | 2656,43, | 2656,44, | 2656,45, | 2656,46, | 2656,47, | 2656,48, | 2656,49, | 2656,50, | 2656,51, | 2656,52, | 2656,53, | 2656,54, | 2656,55, | 2656,56, | 2656,57, | 2656,58, | 2656,59, | 2656,60, | 2656,61, | 2656,62, | 2656,63, | 2656,64, | 2656,65, | 2656,66, | 2656,67, | 2656,68, | 2656,69, | 2656,70, | 2656,71, | 2656,72, | 2656,73, | 2656,74, | 2656,75, | 2656,76, | 2656,77, | 2656,78, | 2656,79, | 2656,80, | 2656,81, | 2656,82, | 2656,83, | 2656,84, | 2656,85, | 2657,1, | 2657,2, | 2657,3, | 2657,4, | 2657,5, | 2657,6, | 2657,7, | 2657,8, | 2657,9, | 2657,10, | 2657,11, | 2657,12, | 2657,13, | 2657,14, | 2657,15, | 2657,16, | 2657,17, | 2657,18, | 2657,19, | 2657,20, | 2657,21, | 2657,22, | 2657,23, | 2657,24, | 2657,25, | 2657,26, | 2657,27, | 2657,28, | 2657,29, | 2657,30, | 2657,31, | 2657,32, | 2657,33, | 2657,34, | 2657,35, | 2657,36, | 2657,37, | 2657,38, | 2657,39, | 2657,40, | 2657,41, | 2657,42, | 2657,43, | 2657,44, | 2657,45, | 2657,46, | 2657,47, | 2657,48, | 2657,49, | 2657,50, | 2657,51, | 2657,52, | 2657,53, | 2657,54, | 2657,55, | 2657,56, | 2657,57, | 2657,58, | 2657,59, | 2657,60, | 2657,61, | 2657,62, | 2657,63, | 2657,64, | 2657,65, | 2657,66, | 2657,67, | 2657,68, | 2657,69, | 2657,70, | 2657,71, | 2657,72, | 2657,73, | 2657,74, | 2657,75, | 2657,76, | 2657,77, | 2657,78, | 2657,79, | 2657,80, | 2657,81, | 2657,82, | 2657,83, | 2657,84, | 2657,85, | 2658,1, | 2658,2, | 2658,3, | 2658,4, | 2658,5, | 2658,6, | 2658,7, | 2658,8, | 2658,9, | 2658,10, | 2658,11, | 2658,12, | 2658,13, | 2658,14, | 2658,15, | 2658,16, | 2658,17, | 2658,18, | 2658,19, | 2658,20, | 2658,21, | 2658,22, | 2658,23, | 2658,24, | 2658,25, | 2658,26, | 2658,27, | 2658,28, | 2658,29, | 2658,30, | 2658,31, | 2658,32, | 2658,33, | 2658,34, | 2658,35, | 2658,36, | 2658,37, | 2658,38, | 2658,39, | 2658,40, | 2658,41, | 2658,42, | 2658,43, | 2658,44, | 2658,45, | 2658,46, | 2658,47, | 2658,48, | 2658,49, | 2658,50, | 2658,51, | 2658,52, | 2658,53, | 2658,54, | 2658,55, | 2658,56, | 2658,57, | 2658,58, | 2658,59, | 2658,60, | 2658,61, | 2658,62, | 2658,63, | 2658,64, | 2658,65, | 2658,66, | 2658,67, | 2658,68, | 2658,69, | 2658,70, | 2658,71, | 2658,72, | 2658,73, | 2658,74, | 2658,75, | 2658,76, | 2658,77, | 2658,78, | 2658,79, | 2658,80, | 2658,81, | 2658,82, | 2658,83, | 2658,84, | 2658,85, | 2659,1, | 2659,2, | 2659,3, | 2659,4, | 2659,5, | 2659,6, | 2659,7, | 2659,8, | 2659,9, | 2659,10, | 2659,11, | 2659,12, | 2659,13, | 2659,14, | 2659,15, | 2659,16, | 2659,17, | 2659,18, | 2659,19, | 2659,20, | 2659,21, | 2659,22, | 2659,23, | 2659,24, | 2659,25, | 2659,26, | 2659,27, | 2659,28, | 2659,29, | 2659,30, | 2659,31, | 2659,32, | 2659,33, | 2659,34, | 2659,35, | 2659,36, | 2659,37, | 2659,38, | 2659,39, | 2659,40, | 2659,41, | 2659,42, | 2659,43, | 2659,44, | 2659,45, | 2659,46, | 2659,47, | 2659,48, | 2659,49, | 2659,50, | 2659,51, | 2659,52, | 2659,53, | 2659,54, | 2659,55, | 2659,56, | 2659,57, | 2659,58, | 2659,59, | 2659,60, | 2659,61, | 2659,62, | 2659,63, | 2659,64, | 2659,65, | 2659,66, | 2659,67, | 2659,68, | 2659,69, | 2659,70, | 2659,71, | 2659,72, | 2659,73, | 2659,74, | 2659,75, | 2659,76, | 2659,77, | 2659,78, | 2659,79, | 2659,80, | 2659,81, | 2659,82, | 2659,83, | 2659,84, | 2659,85, | 2660,1, | 2660,2, | 2660,3, | 2660,4, | 2660,5, | 2660,6, | 2660,7, | 2660,8, | 2660,9, | 2660,10, | 2660,11, | 2660,12, | 2660,13, | 2660,14, | 2660,15, | 2660,16, | 2660,17, | 2660,18, | 2660,19, | 2660,20, | 2660,21, | 2660,22, | 2660,23, | 2660,24, | 2660,25, | 2660,26, | 2660,27, | 2660,28, | 2660,29, | 2660,30, | 2660,31, | 2660,32, | 2660,33, | 2660,34, | 2660,35, | 2660,36, | 2660,37, | 2660,38, | 2660,39, | 2660,40, | 2660,41, | 2660,42, | 2660,43, | 2660,44, | 2660,45, | 2660,46, | 2660,47, | 2660,48, | 2660,49, | 2660,50, | 2660,51, | 2660,52, | 2660,53, | 2660,54, | 2660,55, | 2660,56, | 2660,57, | 2660,58, | 2660,59, | 2660,60, | 2660,61, | 2660,62, | 2660,63, | 2660,64, | 2660,65, | 2660,66, | 2660,67, | 2660,68, | 2660,69, | 2660,70, | 2660,71, | 2660,72, | 2660,73, | 2660,74, | 2660,75, | 2660,76, | 2660,77, | 2660,78, | 2660,79, | 2660,80, | 2660,81, | 2660,82, | 2660,83, | 2660,84, | 2660,85, | 2661,1, | 2661,2, | 2661,3, | 2661,4, | 2661,5, | 2661,6, | 2661,7, | 2661,8, | 2661,9, | 2661,10, | 2661,11, | 2661,12, | 2661,13, | 2661,14, | 2661,15, | 2661,16, | 2661,17, | 2661,18, | 2661,19, | 2661,20, | 2661,21, | 2661,22, | 2661,23, | 2661,24, | 2661,25, | 2661,26, | 2661,27, | 2661,28, | 2661,29, | 2661,30, | 2661,31, | 2661,32, | 2661,33, | 2661,34, | 2661,35, | 2661,36, | 2661,37, | 2661,38, | 2661,39, | 2661,40, | 2661,41, | 2661,42, | 2661,43, | 2661,44, | 2661,45, | 2661,46, | 2661,47, | 2661,48, | 2661,49, | 2661,50, | 2661,51, | 2661,52, | 2661,53, | 2661,54, | 2661,55, | 2661,56, | 2661,57, | 2661,58, | 2661,59, | 2661,60, | 2661,61, | 2661,62, | 2661,63, | 2661,64, | 2661,65, | 2661,66, | 2661,67, | 2661,68, | 2661,69, | 2661,70, | 2661,71, | 2661,72, | 2661,73, | 2661,74, | 2661,75, | 2661,76, | 2661,77, | 2661,78, | 2661,79, | 2661,80, | 2661,81, | 2661,82, | 2661,83, | 2661,84, | 2661,85, | 2662,1, | 2662,2, | 2662,3, | 2662,4, | 2662,5, | 2662,6, | 2662,7, | 2662,8, | 2662,9, | 2662,10, | 2662,11, | 2662,12, | 2662,13, | 2662,14, | 2662,15, | 2662,16, | 2662,17, | 2662,18, | 2662,19, | 2662,20, | 2662,21, | 2662,22, | 2662,23, | 2662,24, | 2662,25, | 2662,26, | 2662,27, | 2662,28, | 2662,29, | 2662,30, | 2662,31, | 2662,32, | 2662,33, | 2662,34, | 2662,35, | 2662,36, | 2662,37, | 2662,38, | 2662,39, | 2662,40, | 2662,41, | 2662,42, | 2662,43, | 2662,44, | 2662,45, | 2662,46, | 2662,47, | 2662,48, | 2662,49, | 2662,50, | 2662,51, | 2662,52, | 2662,53, | 2662,54, | 2662,55, | 2662,56, | 2662,57, | 2662,58, | 2662,59, | 2662,60, | 2662,61, | 2662,62, | 2662,63, | 2662,64, | 2662,65, | 2662,66, | 2662,67, | 2662,68, | 2662,69, | 2662,70, | 2662,71, | 2662,72, | 2662,73, | 2662,74, | 2662,75, | 2662,76, | 2662,77, | 2662,78, | 2662,79, | 2662,80, | 2662,81, | 2662,82, | 2662,83, | 2662,84, | 2662,85, | 2663,1, | 2663,2, | 2663,3, | 2663,4, | 2663,5, | 2663,6, | 2663,7, | 2663,8, | 2663,9, | 2663,10, | 2663,11, | 2663,12, | 2663,13, | 2663,14, | 2663,15, | 2663,16, | 2663,17, | 2663,18, | 2663,19, | 2663,20, | 2663,21, | 2663,22, | 2663,23, | 2663,24, | 2663,25, | 2663,26, | 2663,27, | 2663,28, | 2663,29, | 2663,30, | 2663,31, | 2663,32, | 2663,33, | 2663,34, | 2663,35, | 2663,36, | 2663,37, | 2663,38, | 2663,39, | 2663,40, | 2663,41, | 2663,42, | 2663,43, | 2663,44, | 2663,45, | 2663,46, | 2663,47, | 2663,48, | 2663,49, | 2663,50, | 2663,51, | 2663,52, | 2663,53, | 2663,54, | 2663,55, | 2663,56, | 2663,57, | 2663,58, | 2663,59, | 2663,60, | 2663,61, | 2663,62, | 2663,63, | 2663,64, | 2663,65, | 2663,66, | 2663,67, | 2663,68, | 2663,69, | 2663,70, | 2663,71, | 2663,72, | 2663,73, | 2663,74, | 2663,75, | 2663,76, | 2663,77, | 2663,78, | 2663,79, | 2663,80, | 2663,81, | 2663,82, | 2663,83, | 2663,84, | 2663,85, | 2664,1, | 2664,2, | 2664,3, | 2664,4, | 2664,5, | 2664,6, | 2664,7, | 2664,8, | 2664,9, | 2664,10, | 2664,11, | 2664,12, | 2664,13, | 2664,14, | 2664,15, | 2664,16, | 2664,17, | 2664,18, | 2664,19, | 2664,20, | 2664,21, | 2664,22, | 2664,23, | 2664,24, | 2664,25, | 2664,26, | 2664,27, | 2664,28, | 2664,29, | 2664,30, | 2664,31, | 2664,32, | 2664,33, | 2664,34, | 2664,35, | 2664,36, | 2664,37, | 2664,38, | 2664,39, | 2664,40, | 2664,41, | 2664,42, | 2664,43, | 2664,44, | 2664,45, | 2664,46, | 2664,47, | 2664,48, | 2664,49, | 2664,50, | 2664,51, | 2664,52, | 2664,53, | 2664,54, | 2664,55, | 2664,56, | 2664,57, | 2664,58, | 2664,59, | 2664,60, | 2664,61, | 2664,62, | 2664,63, | 2664,64, | 2664,65, | 2664,66, | 2664,67, | 2664,68, | 2664,69, | 2664,70, | 2664,71, | 2664,72, | 2664,73, | 2664,74, | 2664,75, | 2664,76, | 2664,77, | 2664,78, | 2664,79, | 2664,80, | 2664,81, | 2664,82, | 2664,83, | 2664,84, | 2664,85, | 2665,1, | 2665,2, | 2665,3, | 2665,4, | 2665,5, | 2665,6, | 2665,7, | 2665,8, | 2665,9, | 2665,10, | 2665,11, | 2665,12, | 2665,13, | 2665,14, | 2665,15, | 2665,16, | 2665,17, | 2665,18, | 2665,19, | 2665,20, | 2665,21, | 2665,22, | 2665,23, | 2665,24, | 2665,25, | 2665,26, | 2665,27, | 2665,28, | 2665,29, | 2665,30, | 2665,31, | 2665,32, | 2665,33, | 2665,34, | 2665,35, | 2665,36, | 2665,37, | 2665,38, | 2665,39, | 2665,40, | 2665,41, | 2665,42, | 2665,43, | 2665,44, | 2665,45, | 2665,46, | 2665,47, | 2665,48, | 2665,49, | 2665,50, | 2665,51, | 2665,52, | 2665,53, | 2665,54, | 2665,55, | 2665,56, | 2665,57, | 2665,58, | 2665,59, | 2665,60, | 2665,61, | 2665,62, | 2665,63, | 2665,64, | 2665,65, | 2665,66, | 2665,67, | 2665,68, | 2665,69, | 2665,70, | 2665,71, | 2665,72, | 2665,73, | 2665,74, | 2665,75, | 2665,76, | 2665,77, | 2665,78, | 2665,79, | 2665,80, | 2665,81, | 2665,82, | 2665,83, | 2665,84, | 2665,85, | 2666,1, | 2666,2, | 2666,3, | 2666,4, | 2666,5, | 2666,6, | 2666,7, | 2666,8, | 2666,9, | 2666,10, | 2666,11, | 2666,12, | 2666,13, | 2666,14, | 2666,15, | 2666,16, | 2666,17, | 2666,18, | 2666,19, | 2666,20, | 2666,21, | 2666,22, | 2666,23, | 2666,24, | 2666,25, | 2666,26, | 2666,27, | 2666,28, | 2666,29, | 2666,30, | 2666,31, | 2666,32, | 2666,33, | 2666,34, | 2666,35, | 2666,36, | 2666,37, | 2666,38, | 2666,39, | 2666,40, | 2666,41, | 2666,42, | 2666,43, | 2666,44, | 2666,45, | 2666,46, | 2666,47, | 2666,48, | 2666,49, | 2666,50, | 2666,51, | 2666,52, | 2666,53, | 2666,54, | 2666,55, | 2666,56, | 2666,57, | 2666,58, | 2666,59, | 2666,60, | 2666,61, | 2666,62, | 2666,63, | 2666,64, | 2666,65, | 2666,66, | 2666,67, | 2666,68, | 2666,69, | 2666,70, | 2666,71, | 2666,72, | 2666,73, | 2666,74, | 2666,75, | 2666,76, | 2666,77, | 2666,78, | 2666,79, | 2666,80, | 2666,81, | 2666,82, | 2666,83, | 2666,84, | 2666,85, | 2667,1, | 2667,2, | 2667,3, | 2667,4, | 2667,5, | 2667,6, | 2667,7, | 2667,8, | 2667,9, | 2667,10, | 2667,11, | 2667,12, | 2667,13, | 2667,14, | 2667,15, | 2667,16, | 2667,17, | 2667,18, | 2667,19, | 2667,20, | 2667,21, | 2667,22, | 2667,23, | 2667,24, | 2667,25, | 2667,26, | 2667,27, | 2667,28, | 2667,29, | 2667,30, | 2667,31, | 2667,32, | 2667,33, | 2667,34, | 2667,35, | 2667,36, | 2667,37, | 2667,38, | 2667,39, | 2667,40, | 2667,41, | 2667,42, | 2667,43, | 2667,44, | 2667,45, | 2667,46, | 2667,47, | 2667,48, | 2667,49, | 2667,50, | 2667,51, | 2667,52, | 2667,53, | 2667,54, | 2667,55, | 2667,56, | 2667,57, | 2667,58, | 2667,59, | 2667,60, | 2667,61, | 2667,62, | 2667,63, | 2667,64, | 2667,65, | 2667,66, | 2667,67, | 2667,68, | 2667,69, | 2667,70, | 2667,71, | 2667,72, | 2667,73, | 2667,74, | 2667,75, | 2667,76, | 2667,77, | 2667,78, | 2667,79, | 2667,80, | 2667,81, | 2667,82, | 2667,83, | 2667,84, | 2667,85, | 2668,1, | 2668,2, | 2668,3, | 2668,4, | 2668,5, | 2668,6, | 2668,7, | 2668,8, | 2668,9, | 2668,10, | 2668,11, | 2668,12, | 2668,13, | 2668,14, | 2668,15, | 2668,16, | 2668,17, | 2668,18, | 2668,19, | 2668,20, | 2668,21, | 2668,22, | 2668,23, | 2668,24, | 2668,25, | 2668,26, | 2668,27, | 2668,28, | 2668,29, | 2668,30, | 2668,31, | 2668,32, | 2668,33, | 2668,34, | 2668,35, | 2668,36, | 2668,37, | 2668,38, | 2668,39, | 2668,40, | 2668,41, | 2668,42, | 2668,43, | 2668,44, | 2668,45, | 2668,46, | 2668,47, | 2668,48, | 2668,49, | 2668,50, | 2668,51, | 2668,52, | 2668,53, | 2668,54, | 2668,55, | 2668,56, | 2668,57, | 2668,58, | 2668,59, | 2668,60, | 2668,61, | 2668,62, | 2668,63, | 2668,64, | 2668,65, | 2668,66, | 2668,67, | 2668,68, | 2668,69, | 2668,70, | 2668,71, | 2668,72, | 2668,73, | 2668,74, | 2668,75, | 2668,76, | 2668,77, | 2668,78, | 2668,79, | 2668,80, | 2668,81, | 2668,82, | 2668,83, | 2668,84, | 2668,85, | 2669,1, | 2669,2, | 2669,3, | 2669,4, | 2669,5, | 2669,6, | 2669,7, | 2669,8, | 2669,9, | 2669,10, | 2669,11, | 2669,12, | 2669,13, | 2669,14, | 2669,15, | 2669,16, | 2669,17, | 2669,18, | 2669,19, | 2669,20, | 2669,21, | 2669,22, | 2669,23, | 2669,24, | 2669,25, | 2669,26, | 2669,27, | 2669,28, | 2669,29, | 2669,30, | 2669,31, | 2669,32, | 2669,33, | 2669,34, | 2669,35, | 2669,36, | 2669,37, | 2669,38, | 2669,39, | 2669,40, | 2669,41, | 2669,42, | 2669,43, | 2669,44, | 2669,45, | 2669,46, | 2669,47, | 2669,48, | 2669,49, | 2669,50, | 2669,51, | 2669,52, | 2669,53, | 2669,54, | 2669,55, | 2669,56, | 2669,57, | 2669,58, | 2669,59, | 2669,60, | 2669,61, | 2669,62, | 2669,63, | 2669,64, | 2669,65, | 2669,66, | 2669,67, | 2669,68, | 2669,69, | 2669,70, | 2669,71, | 2669,72, | 2669,73, | 2669,74, | 2669,75, | 2669,76, | 2669,77, | 2669,78, | 2669,79, | 2669,80, | 2669,81, | 2669,82, | 2669,83, | 2669,84, | 2669,85, | 2670,1, | 2670,2, | 2670,3, | 2670,4, | 2670,5, | 2670,6, | 2670,7, | 2670,8, | 2670,9, | 2670,10, | 2670,11, | 2670,12, | 2670,13, | 2670,14, | 2670,15, | 2670,16, | 2670,17, | 2670,18, | 2670,19, | 2670,20, | 2670,21, | 2670,22, | 2670,23, | 2670,24, | 2670,25, | 2670,26, | 2670,27, | 2670,28, | 2670,29, | 2670,30, | 2670,31, | 2670,32, | 2670,33, | 2670,34, | 2670,35, | 2670,36, | 2670,37, | 2670,38, | 2670,39, | 2670,40, | 2670,41, | 2670,42, | 2670,43, | 2670,44, | 2670,45, | 2670,46, | 2670,47, | 2670,48, | 2670,49, | 2670,50, | 2670,51, | 2670,52, | 2670,53, | 2670,54, | 2670,55, | 2670,56, | 2670,57, | 2670,58, | 2670,59, | 2670,60, | 2670,61, | 2670,62, | 2670,63, | 2670,64, | 2670,65, | 2670,66, | 2670,67, | 2670,68, | 2670,69, | 2670,70, | 2670,71, | 2670,72, | 2670,73, | 2670,74, | 2670,75, | 2670,76, | 2670,77, | 2670,78, | 2670,79, | 2670,80, | 2670,81, | 2670,82, | 2670,83, | 2670,84, | 2670,85, | 2671,1, | 2671,2, | 2671,3, | 2671,4, | 2671,5, | 2671,6, | 2671,7, | 2671,8, | 2671,9, | 2671,10, | 2671,11, | 2671,12, | 2671,13, | 2671,14, | 2671,15, | 2671,16, | 2671,17, | 2671,18, | 2671,19, | 2671,20, | 2671,21, | 2671,22, | 2671,23, | 2671,24, | 2671,25, | 2671,26, | 2671,27, | 2671,28, | 2671,29, | 2671,30, | 2671,31, | 2671,32, | 2671,33, | 2671,34, | 2671,35, | 2671,36, | 2671,37, | 2671,38, | 2671,39, | 2671,40, | 2671,41, | 2671,42, | 2671,43, | 2671,44, | 2671,45, | 2671,46, | 2671,47, | 2671,48, | 2671,49, | 2671,50, | 2671,51, | 2671,52, | 2671,53, | 2671,54, | 2671,55, | 2671,56, | 2671,57, | 2671,58, | 2671,59, | 2671,60, | 2671,61, | 2671,62, | 2671,63, | 2671,64, | 2671,65, | 2671,66, | 2671,67, | 2671,68, | 2671,69, | 2671,70, | 2671,71, | 2671,72, | 2671,73, | 2671,74, | 2671,75, | 2671,76, | 2671,77, | 2671,78, | 2671,79, | 2671,80, | 2671,81, | 2671,82, | 2671,83, | 2671,84, | 2671,85, | 2672,1, | 2672,2, | 2672,3, | 2672,4, | 2672,5, | 2672,6, | 2672,7, | 2672,8, | 2672,9, | 2672,10, | 2672,11, | 2672,12, | 2672,13, | 2672,14, | 2672,15, | 2672,16, | 2672,17, | 2672,18, | 2672,19, | 2672,20, | 2672,21, | 2672,22, | 2672,23, | 2672,24, | 2672,25, | 2672,26, | 2672,27, | 2672,28, | 2672,29, | 2672,30, | 2672,31, | 2672,32, | 2672,33, | 2672,34, | 2672,35, | 2672,36, | 2672,37, | 2672,38, | 2672,39, | 2672,40, | 2672,41, | 2672,42, | 2672,43, | 2672,44, | 2672,45, | 2672,46, | 2672,47, | 2672,48, | 2672,49, | 2672,50, | 2672,51, | 2672,52, | 2672,53, | 2672,54, | 2672,55, | 2672,56, | 2672,57, | 2672,58, | 2672,59, | 2672,60, | 2672,61, | 2672,62, | 2672,63, | 2672,64, | 2672,65, | 2672,66, | 2672,67, | 2672,68, | 2672,69, | 2672,70, | 2672,71, | 2672,72, | 2672,73, | 2672,74, | 2672,75, | 2672,76, | 2672,77, | 2672,78, | 2672,79, | 2672,80, | 2672,81, | 2672,82, | 2672,83, | 2672,84, | 2672,85, | 2673,1, | 2673,2, | 2673,3, | 2673,4, | 2673,5, | 2673,6, | 2673,7, | 2673,8, | 2673,9, | 2673,10, | 2673,11, | 2673,12, | 2673,13, | 2673,14, | 2673,15, | 2673,16, | 2673,17, | 2673,18, | 2673,19, | 2673,20, | 2673,21, | 2673,22, | 2673,23, | 2673,24, | 2673,25, | 2673,26, | 2673,27, | 2673,28, | 2673,29, | 2673,30, | 2673,31, | 2673,32, | 2673,33, | 2673,34, | 2673,35, | 2673,36, | 2673,37, | 2673,38, | 2673,39, | 2673,40, | 2673,41, | 2673,42, | 2673,43, | 2673,44, | 2673,45, | 2673,46, | 2673,47, | 2673,48, | 2673,49, | 2673,50, | 2673,51, | 2673,52, | 2673,53, | 2673,54, | 2673,55, | 2673,56, | 2673,57, | 2673,58, | 2673,59, | 2673,60, | 2673,61, | 2673,62, | 2673,63, | 2673,64, | 2673,65, | 2673,66, | 2673,67, | 2673,68, | 2673,69, | 2673,70, | 2673,71, | 2673,72, | 2673,73, | 2673,74, | 2673,75, | 2673,76, | 2673,77, | 2673,78, | 2673,79, | 2673,80, | 2673,81, | 2673,82, | 2673,83, | 2673,84, | 2673,85, | 2674,1, | 2674,2, | 2674,3, | 2674,4, | 2674,5, | 2674,6, | 2674,7, | 2674,8, | 2674,9, | 2674,10, | 2674,11, | 2674,12, | 2674,13, | 2674,14, | 2674,15, | 2674,16, | 2674,17, | 2674,18, | 2674,19, | 2674,20, | 2674,21, | 2674,22, | 2674,23, | 2674,24, | 2674,25, | 2674,26, | 2674,27, | 2674,28, | 2674,29, | 2674,30, | 2674,31, | 2674,32, | 2674,33, | 2674,34, | 2674,35, | 2674,36, | 2674,37, | 2674,38, | 2674,39, | 2674,40, | 2674,41, | 2674,42, | 2674,43, | 2674,44, | 2674,45, | 2674,46, | 2674,47, | 2674,48, | 2674,49, | 2674,50, | 2674,51, | 2674,52, | 2674,53, | 2674,54, | 2674,55, | 2674,56, | 2674,57, | 2674,58, | 2674,59, | 2674,60, | 2674,61, | 2674,62, | 2674,63, | 2674,64, | 2674,65, | 2674,66, | 2674,67, | 2674,68, | 2674,69, | 2674,70, | 2674,71, | 2674,72, | 2674,73, | 2674,74, | 2674,75, | 2674,76, | 2674,77, | 2674,78, | 2674,79, | 2674,80, | 2674,81, | 2674,82, | 2674,83, | 2674,84, | 2674,85, | 2675,1, | 2675,2, | 2675,3, | 2675,4, | 2675,5, | 2675,6, | 2675,7, | 2675,8, | 2675,9, | 2675,10, | 2675,11, | 2675,12, | 2675,13, | 2675,14, | 2675,15, | 2675,16, | 2675,17, | 2675,18, | 2675,19, | 2675,20, | 2675,21, | 2675,22, | 2675,23, | 2675,24, | 2675,25, | 2675,26, | 2675,27, | 2675,28, | 2675,29, | 2675,30, | 2675,31, | 2675,32, | 2675,33, | 2675,34, | 2675,35, | 2675,36, | 2675,37, | 2675,38, | 2675,39, | 2675,40, | 2675,41, | 2675,42, | 2675,43, | 2675,44, | 2675,45, | 2675,46, | 2675,47, | 2675,48, | 2675,49, | 2675,50, | 2675,51, | 2675,52, | 2675,53, | 2675,54, | 2675,55, | 2675,56, | 2675,57, | 2675,58, | 2675,59, | 2675,60, | 2675,61, | 2675,62, | 2675,63, | 2675,64, | 2675,65, | 2675,66, | 2675,67, | 2675,68, | 2675,69, | 2675,70, | 2675,71, | 2675,72, | 2675,73, | 2675,74, | 2675,75, | 2675,76, | 2675,77, | 2675,78, | 2675,79, | 2675,80, | 2675,81, | 2675,82, | 2675,83, | 2675,84, | 2675,85, | 2676,1, | 2676,2, | 2676,3, | 2676,4, | 2676,5, | 2676,6, | 2676,7, | 2676,8, | 2676,9, | 2676,10, | 2676,11, | 2676,12, | 2676,13, | 2676,14, | 2676,15, | 2676,16, | 2676,17, | 2676,18, | 2676,19, | 2676,20, | 2676,21, | 2676,22, | 2676,23, | 2676,24, | 2676,25, | 2676,26, | 2676,27, | 2676,28, | 2676,29, | 2676,30, | 2676,31, | 2676,32, | 2676,33, | 2676,34, | 2676,35, | 2676,36, | 2676,37, | 2676,38, | 2676,39, | 2676,40, | 2676,41, | 2676,42, | 2676,43, | 2676,44, | 2676,45, | 2676,46, | 2676,47, | 2676,48, | 2676,49, | 2676,50, | 2676,51, | 2676,52, | 2676,53, | 2676,54, | 2676,55, | 2676,56, | 2676,57, | 2676,58, | 2676,59, | 2676,60, | 2676,61, | 2676,62, | 2676,63, | 2676,64, | 2676,65, | 2676,66, | 2676,67, | 2676,68, | 2676,69, | 2676,70, | 2676,71, | 2676,72, | 2676,73, | 2676,74, | 2676,75, | 2676,76, | 2676,77, | 2676,78, | 2676,79, | 2676,80, | 2676,81, | 2676,82, | 2676,83, | 2676,84, | 2676,85, | 2677,1, | 2677,2, | 2677,3, | 2677,4, | 2677,5, | 2677,6, | 2677,7, | 2677,8, | 2677,9, | 2677,10, | 2677,11, | 2677,12, | 2677,13, | 2677,14, | 2677,15, | 2677,16, | 2677,17, | 2677,18, | 2677,19, | 2677,20, | 2677,21, | 2677,22, | 2677,23, | 2677,24, | 2677,25, | 2677,26, | 2677,27, | 2677,28, | 2677,29, | 2677,30, | 2677,31, | 2677,32, | 2677,33, | 2677,34, | 2677,35, | 2677,36, | 2677,37, | 2677,38, | 2677,39, | 2677,40, | 2677,41, | 2677,42, | 2677,43, | 2677,44, | 2677,45, | 2677,46, | 2677,47, | 2677,48, | 2677,49, | 2677,50, | 2677,51, | 2677,52, | 2677,53, | 2677,54, | 2677,55, | 2677,56, | 2677,57, | 2677,58, | 2677,59, | 2677,60, | 2677,61, | 2677,62, | 2677,63, | 2677,64, | 2677,65, | 2677,66, | 2677,67, | 2677,68, | 2677,69, | 2677,70, | 2677,71, | 2677,72, | 2677,73, | 2677,74, | 2677,75, | 2677,76, | 2677,77, | 2677,78, | 2677,79, | 2677,80, | 2677,81, | 2677,82, | 2677,83, | 2677,84, | 2677,85, | 2678,1, | 2678,2, | 2678,3, | 2678,4, | 2678,5, | 2678,6, | 2678,7, | 2678,8, | 2678,9, | 2678,10, | 2678,11, | 2678,12, | 2678,13, | 2678,14, | 2678,15, | 2678,16, | 2678,17, | 2678,18, | 2678,19, | 2678,20, | 2678,21, | 2678,22, | 2678,23, | 2678,24, | 2678,25, | 2678,26, | 2678,27, | 2678,28, | 2678,29, | 2678,30, | 2678,31, | 2678,32, | 2678,33, | 2678,34, | 2678,35, | 2678,36, | 2678,37, | 2678,38, | 2678,39, | 2678,40, | 2678,41, | 2678,42, | 2678,43, | 2678,44, | 2678,45, | 2678,46, | 2678,47, | 2678,48, | 2678,49, | 2678,50, | 2678,51, | 2678,52, | 2678,53, | 2678,54, | 2678,55, | 2678,56, | 2678,57, | 2678,58, | 2678,59, | 2678,60, | 2678,61, | 2678,62, | 2678,63, | 2678,64, | 2678,65, | 2678,66, | 2678,67, | 2678,68, | 2678,69, | 2678,70, | 2678,71, | 2678,72, | 2678,73, | 2678,74, | 2678,75, | 2678,76, | 2678,77, | 2678,78, | 2678,79, | 2678,80, | 2678,81, | 2678,82, | 2678,83, | 2678,84, | 2678,85, | 2679,1, | 2679,2, | 2679,3, | 2679,4, | 2679,5, | 2679,6, | 2679,7, | 2679,8, | 2679,9, | 2679,10, | 2679,11, | 2679,12, | 2679,13, | 2679,14, | 2679,15, | 2679,16, | 2679,17, | 2679,18, | 2679,19, | 2679,20, | 2679,21, | 2679,22, | 2679,23, | 2679,24, | 2679,25, | 2679,26, | 2679,27, | 2679,28, | 2679,29, | 2679,30, | 2679,31, | 2679,32, | 2679,33, | 2679,34, | 2679,35, | 2679,36, | 2679,37, | 2679,38, | 2679,39, | 2679,40, | 2679,41, | 2679,42, | 2679,43, | 2679,44, | 2679,45, | 2679,46, | 2679,47, | 2679,48, | 2679,49, | 2679,50, | 2679,51, | 2679,52, | 2679,53, | 2679,54, | 2679,55, | 2679,56, | 2679,57, | 2679,58, | 2679,59, | 2679,60, | 2679,61, | 2679,62, | 2679,63, | 2679,64, | 2679,65, | 2679,66, | 2679,67, | 2679,68, | 2679,69, | 2679,70, | 2679,71, | 2679,72, | 2679,73, | 2679,74, | 2679,75, | 2679,76, | 2679,77, | 2679,78, | 2679,79, | 2679,80, | 2679,81, | 2679,82, | 2679,83, | 2679,84, | 2679,85, | 2680,1, | 2680,2, | 2680,3, | 2680,4, | 2680,5, | 2680,6, | 2680,7, | 2680,8, | 2680,9, | 2680,10, | 2680,11, | 2680,12, | 2680,13, | 2680,14, | 2680,15, | 2680,16, | 2680,17, | 2680,18, | 2680,19, | 2680,20, | 2680,21, | 2680,22, | 2680,23, | 2680,24, | 2680,25, | 2680,26, | 2680,27, | 2680,28, | 2680,29, | 2680,30, | 2680,31, | 2680,32, | 2680,33, | 2680,34, | 2680,35, | 2680,36, | 2680,37, | 2680,38, | 2680,39, | 2680,40, | 2680,41, | 2680,42, | 2680,43, | 2680,44, | 2680,45, | 2680,46, | 2680,47, | 2680,48, | 2680,49, | 2680,50, | 2680,51, | 2680,52, | 2680,53, | 2680,54, | 2680,55, | 2680,56, | 2680,57, | 2680,58, | 2680,59, | 2680,60, | 2680,61, | 2680,62, | 2680,63, | 2680,64, | 2680,65, | 2680,66, | 2680,67, | 2680,68, | 2680,69, | 2680,70, | 2680,71, | 2680,72, | 2680,73, | 2680,74, | 2680,75, | 2680,76, | 2680,77, | 2680,78, | 2680,79, | 2680,80, | 2680,81, | 2680,82, | 2680,83, | 2680,84, | 2680,85, | 2681,1, | 2681,2, | 2681,3, | 2681,4, | 2681,5, | 2681,6, | 2681,7, | 2681,8, | 2681,9, | 2681,10, | 2681,11, | 2681,12, | 2681,13, | 2681,14, | 2681,15, | 2681,16, | 2681,17, | 2681,18, | 2681,19, | 2681,20, | 2681,21, | 2681,22, | 2681,23, | 2681,24, | 2681,25, | 2681,26, | 2681,27, | 2681,28, | 2681,29, | 2681,30, | 2681,31, | 2681,32, | 2681,33, | 2681,34, | 2681,35, | 2681,36, | 2681,37, | 2681,38, | 2681,39, | 2681,40, | 2681,41, | 2681,42, | 2681,43, | 2681,44, | 2681,45, | 2681,46, | 2681,47, | 2681,48, | 2681,49, | 2681,50, | 2681,51, | 2681,52, | 2681,53, | 2681,54, | 2681,55, | 2681,56, | 2681,57, | 2681,58, | 2681,59, | 2681,60, | 2681,61, | 2681,62, | 2681,63, | 2681,64, | 2681,65, | 2681,66, | 2681,67, | 2681,68, | 2681,69, | 2681,70, | 2681,71, | 2681,72, | 2681,73, | 2681,74, | 2681,75, | 2681,76, | 2681,77, | 2681,78, | 2681,79, | 2681,80, | 2681,81, | 2681,82, | 2681,83, | 2681,84, | 2681,85, | 2682,1, | 2682,2, | 2682,3, | 2682,4, | 2682,5, | 2682,6, | 2682,7, | 2682,8, | 2682,9, | 2682,10, | 2682,11, | 2682,12, | 2682,13, | 2682,14, | 2682,15, | 2682,16, | 2682,17, | 2682,18, | 2682,19, | 2682,20, | 2682,21, | 2682,22, | 2682,23, | 2682,24, | 2682,25, | 2682,26, | 2682,27, | 2682,28, | 2682,29, | 2682,30, | 2682,31, | 2682,32, | 2682,33, | 2682,34, | 2682,35, | 2682,36, | 2682,37, | 2682,38, | 2682,39, | 2682,40, | 2682,41, | 2682,42, | 2682,43, | 2682,44, | 2682,45, | 2682,46, | 2682,47, | 2682,48, | 2682,49, | 2682,50, | 2682,51, | 2682,52, | 2682,53, | 2682,54, | 2682,55, | 2682,56, | 2682,57, | 2682,58, | 2682,59, | 2682,60, | 2682,61, | 2682,62, | 2682,63, | 2682,64, | 2682,65, | 2682,66, | 2682,67, | 2682,68, | 2682,69, | 2682,70, | 2682,71, | 2682,72, | 2682,73, | 2682,74, | 2682,75, | 2682,76, | 2682,77, | 2682,78, | 2682,79, | 2682,80, | 2682,81, | 2682,82, | 2682,83, | 2682,84, | 2682,85, | 2683,1, | 2683,2, | 2683,3, | 2683,4, | 2683,5, | 2683,6, | 2683,7, | 2683,8, | 2683,9, | 2683,10, | 2683,11, | 2683,12, | 2683,13, | 2683,14, | 2683,15, | 2683,16, | 2683,17, | 2683,18, | 2683,19, | 2683,20, | 2683,21, | 2683,22, | 2683,23, | 2683,24, | 2683,25, | 2683,26, | 2683,27, | 2683,28, | 2683,29, | 2683,30, | 2683,31, | 2683,32, | 2683,33, | 2683,34, | 2683,35, | 2683,36, | 2683,37, | 2683,38, | 2683,39, | 2683,40, | 2683,41, | 2683,42, | 2683,43, | 2683,44, | 2683,45, | 2683,46, | 2683,47, | 2683,48, | 2683,49, | 2683,50, | 2683,51, | 2683,52, | 2683,53, | 2683,54, | 2683,55, | 2683,56, | 2683,57, | 2683,58, | 2683,59, | 2683,60, | 2683,61, | 2683,62, | 2683,63, | 2683,64, | 2683,65, | 2683,66, | 2683,67, | 2683,68, | 2683,69, | 2683,70, | 2683,71, | 2683,72, | 2683,73, | 2683,74, | 2683,75, | 2683,76, | 2683,77, | 2683,78, | 2683,79, | 2683,80, | 2683,81, | 2683,82, | 2683,83, | 2683,84, | 2683,85, | 2684,1, | 2684,2, | 2684,3, | 2684,4, | 2684,5, | 2684,6, | 2684,7, | 2684,8, | 2684,9, | 2684,10, | 2684,11, | 2684,12, | 2684,13, | 2684,14, | 2684,15, | 2684,16, | 2684,17, | 2684,18, | 2684,19, | 2684,20, | 2684,21, | 2684,22, | 2684,23, | 2684,24, | 2684,25, | 2684,26, | 2684,27, | 2684,28, | 2684,29, | 2684,30, | 2684,31, | 2684,32, | 2684,33, | 2684,34, | 2684,35, | 2684,36, | 2684,37, | 2684,38, | 2684,39, | 2684,40, | 2684,41, | 2684,42, | 2684,43, | 2684,44, | 2684,45, | 2684,46, | 2684,47, | 2684,48, | 2684,49, | 2684,50, | 2684,51, | 2684,52, | 2684,53, | 2684,54, | 2684,55, | 2684,56, | 2684,57, | 2684,58, | 2684,59, | 2684,60, | 2684,61, | 2684,62, | 2684,63, | 2684,64, | 2684,65, | 2684,66, | 2684,67, | 2684,68, | 2684,69, | 2684,70, | 2684,71, | 2684,72, | 2684,73, | 2684,74, | 2684,75, | 2684,76, | 2684,77, | 2684,78, | 2684,79, | 2684,80, | 2684,81, | 2684,82, | 2684,83, | 2684,84, | 2684,85, | 2685,1, | 2685,2, | 2685,3, | 2685,4, | 2685,5, | 2685,6, | 2685,7, | 2685,8, | 2685,9, | 2685,10, | 2685,11, | 2685,12, | 2685,13, | 2685,14, | 2685,15, | 2685,16, | 2685,17, | 2685,18, | 2685,19, | 2685,20, | 2685,21, | 2685,22, | 2685,23, | 2685,24, | 2685,25, | 2685,26, | 2685,27, | 2685,28, | 2685,29, | 2685,30, | 2685,31, | 2685,32, | 2685,33, | 2685,34, | 2685,35, | 2685,36, | 2685,37, | 2685,38, | 2685,39, | 2685,40, | 2685,41, | 2685,42, | 2685,43, | 2685,44, | 2685,45, | 2685,46, | 2685,47, | 2685,48, | 2685,49, | 2685,50, | 2685,51, | 2685,52, | 2685,53, | 2685,54, | 2685,55, | 2685,56, | 2685,57, | 2685,58, | 2685,59, | 2685,60, | 2685,61, | 2685,62, | 2685,63, | 2685,64, | 2685,65, | 2685,66, | 2685,67, | 2685,68, | 2685,69, | 2685,70, | 2685,71, | 2685,72, | 2685,73, | 2685,74, | 2685,75, | 2685,76, | 2685,77, | 2685,78, | 2685,79, | 2685,80, | 2685,81, | 2685,82, | 2685,83, | 2685,84, | 2685,85, | 2686,1, | 2686,2, | 2686,3, | 2686,4, | 2686,5, | 2686,6, | 2686,7, | 2686,8, | 2686,9, | 2686,10, | 2686,11, | 2686,12, | 2686,13, | 2686,14, | 2686,15, | 2686,16, | 2686,17, | 2686,18, | 2686,19, | 2686,20, | 2686,21, | 2686,22, | 2686,23, | 2686,24, | 2686,25, | 2686,26, | 2686,27, | 2686,28, | 2686,29, | 2686,30, | 2686,31, | 2686,32, | 2686,33, | 2686,34, | 2686,35, | 2686,36, | 2686,37, | 2686,38, | 2686,39, | 2686,40, | 2686,41, | 2686,42, | 2686,43, | 2686,44, | 2686,45, | 2686,46, | 2686,47, | 2686,48, | 2686,49, | 2686,50, | 2686,51, | 2686,52, | 2686,53, | 2686,54, | 2686,55, | 2686,56, | 2686,57, | 2686,58, | 2686,59, | 2686,60, | 2686,61, | 2686,62, | 2686,63, | 2686,64, | 2686,65, | 2686,66, | 2686,67, | 2686,68, | 2686,69, | 2686,70, | 2686,71, | 2686,72, | 2686,73, | 2686,74, | 2686,75, | 2686,76, | 2686,77, | 2686,78, | 2686,79, | 2686,80, | 2686,81, | 2686,82, | 2686,83, | 2686,84, | 2686,85, | 2687,1, | 2687,2, | 2687,3, | 2687,4, | 2687,5, | 2687,6, | 2687,7, | 2687,8, | 2687,9, | 2687,10, | 2687,11, | 2687,12, | 2687,13, | 2687,14, | 2687,15, | 2687,16, | 2687,17, | 2687,18, | 2687,19, | 2687,20, | 2687,21, | 2687,22, | 2687,23, | 2687,24, | 2687,25, | 2687,26, | 2687,27, | 2687,28, | 2687,29, | 2687,30, | 2687,31, | 2687,32, | 2687,33, | 2687,34, | 2687,35, | 2687,36, | 2687,37, | 2687,38, | 2687,39, | 2687,40, | 2687,41, | 2687,42, | 2687,43, | 2687,44, | 2687,45, | 2687,46, | 2687,47, | 2687,48, | 2687,49, | 2687,50, | 2687,51, | 2687,52, | 2687,53, | 2687,54, | 2687,55, | 2687,56, | 2687,57, | 2687,58, | 2687,59, | 2687,60, | 2687,61, | 2687,62, | 2687,63, | 2687,64, | 2687,65, | 2687,66, | 2687,67, | 2687,68, | 2687,69, | 2687,70, | 2687,71, | 2687,72, | 2687,73, | 2687,74, | 2687,75, | 2687,76, | 2687,77, | 2687,78, | 2687,79, | 2687,80, | 2687,81, | 2687,82, | 2687,83, | 2687,84, | 2687,85, | 2688,1, | 2688,2, | 2688,3, | 2688,4, | 2688,5, | 2688,6, | 2688,7, | 2688,8, | 2688,9, | 2688,10, | 2688,11, | 2688,12, | 2688,13, | 2688,14, | 2688,15, | 2688,16, | 2688,17, | 2688,18, | 2688,19, | 2688,20, | 2688,21, | 2688,22, | 2688,23, | 2688,24, | 2688,25, | 2688,26, | 2688,27, | 2688,28, | 2688,29, | 2688,30, | 2688,31, | 2688,32, | 2688,33, | 2688,34, | 2688,35, | 2688,36, | 2688,37, | 2688,38, | 2688,39, | 2688,40, | 2688,41, | 2688,42, | 2688,43, | 2688,44, | 2688,45, | 2688,46, | 2688,47, | 2688,48, | 2688,49, | 2688,50, | 2688,51, | 2688,52, | 2688,53, | 2688,54, | 2688,55, | 2688,56, | 2688,57, | 2688,58, | 2688,59, | 2688,60, | 2688,61, | 2688,62, | 2688,63, | 2688,64, | 2688,65, | 2688,66, | 2688,67, | 2688,68, | 2688,69, | 2688,70, | 2688,71, | 2688,72, | 2688,73, | 2688,74, | 2688,75, | 2688,76, | 2688,77, | 2688,78, | 2688,79, | 2688,80, | 2688,81, | 2688,82, | 2688,83, | 2688,84, | 2688,85, | 2689,1, | 2689,2, | 2689,3, | 2689,4, | 2689,5, | 2689,6, | 2689,7, | 2689,8, | 2689,9, | 2689,10, | 2689,11, | 2689,12, | 2689,13, | 2689,14, | 2689,15, | 2689,16, | 2689,17, | 2689,18, | 2689,19, | 2689,20, | 2689,21, | 2689,22, | 2689,23, | 2689,24, | 2689,25, | 2689,26, | 2689,27, | 2689,28, | 2689,29, | 2689,30, | 2689,31, | 2689,32, | 2689,33, | 2689,34, | 2689,35, | 2689,36, | 2689,37, | 2689,38, | 2689,39, | 2689,40, | 2689,41, | 2689,42, | 2689,43, | 2689,44, | 2689,45, | 2689,46, | 2689,47, | 2689,48, | 2689,49, | 2689,50, | 2689,51, | 2689,52, | 2689,53, | 2689,54, | 2689,55, | 2689,56, | 2689,57, | 2689,58, | 2689,59, | 2689,60, | 2689,61, | 2689,62, | 2689,63, | 2689,64, | 2689,65, | 2689,66, | 2689,67, | 2689,68, | 2689,69, | 2689,70, | 2689,71, | 2689,72, | 2689,73, | 2689,74, | 2689,75, | 2689,76, | 2689,77, | 2689,78, | 2689,79, | 2689,80, | 2689,81, | 2689,82, | 2689,83, | 2689,84, | 2689,85, | 2690,1, | 2690,2, | 2690,3, | 2690,4, | 2690,5, | 2690,6, | 2690,7, | 2690,8, | 2690,9, | 2690,10, | 2690,11, | 2690,12, | 2690,13, | 2690,14, | 2690,15, | 2690,16, | 2690,17, | 2690,18, | 2690,19, | 2690,20, | 2690,21, | 2690,22, | 2690,23, | 2690,24, | 2690,25, | 2690,26, | 2690,27, | 2690,28, | 2690,29, | 2690,30, | 2690,31, | 2690,32, | 2690,33, | 2690,34, | 2690,35, | 2690,36, | 2690,37, | 2690,38, | 2690,39, | 2690,40, | 2690,41, | 2690,42, | 2690,43, | 2690,44, | 2690,45, | 2690,46, | 2690,47, | 2690,48, | 2690,49, | 2690,50, | 2690,51, | 2690,52, | 2690,53, | 2690,54, | 2690,55, | 2690,56, | 2690,57, | 2690,58, | 2690,59, | 2690,60, | 2690,61, | 2690,62, | 2690,63, | 2690,64, | 2690,65, | 2690,66, | 2690,67, | 2690,68, | 2690,69, | 2690,70, | 2690,71, | 2690,72, | 2690,73, | 2690,74, | 2690,75, | 2690,76, | 2690,77, | 2690,78, | 2690,79, | 2690,80, | 2690,81, | 2690,82, | 2690,83, | 2690,84, | 2690,85, | 2691,1, | 2691,2, | 2691,3, | 2691,4, | 2691,5, | 2691,6, | 2691,7, | 2691,8, | 2691,9, | 2691,10, | 2691,11, | 2691,12, | 2691,13, | 2691,14, | 2691,15, | 2691,16, | 2691,17, | 2691,18, | 2691,19, | 2691,20, | 2691,21, | 2691,22, | 2691,23, | 2691,24, | 2691,25, | 2691,26, | 2691,27, | 2691,28, | 2691,29, | 2691,30, | 2691,31, | 2691,32, | 2691,33, | 2691,34, | 2691,35, | 2691,36, | 2691,37, | 2691,38, | 2691,39, | 2691,40, | 2691,41, | 2691,42, | 2691,43, | 2691,44, | 2691,45, | 2691,46, | 2691,47, | 2691,48, | 2691,49, | 2691,50, | 2691,51, | 2691,52, | 2691,53, | 2691,54, | 2691,55, | 2691,56, | 2691,57, | 2691,58, | 2691,59, | 2691,60, | 2691,61, | 2691,62, | 2691,63, | 2691,64, | 2691,65, | 2691,66, | 2691,67, | 2691,68, | 2691,69, | 2691,70, | 2691,71, | 2691,72, | 2691,73, | 2691,74, | 2691,75, | 2691,76, | 2691,77, | 2691,78, | 2691,79, | 2691,80, | 2691,81, | 2691,82, | 2691,83, | 2691,84, | 2691,85, | 2692,1, | 2692,2, | 2692,3, | 2692,4, | 2692,5, | 2692,6, | 2692,7, | 2692,8, | 2692,9, | 2692,10, | 2692,11, | 2692,12, | 2692,13, | 2692,14, | 2692,15, | 2692,16, | 2692,17, | 2692,18, | 2692,19, | 2692,20, | 2692,21, | 2692,22, | 2692,23, | 2692,24, | 2692,25, | 2692,26, | 2692,27, | 2692,28, | 2692,29, | 2692,30, | 2692,31, | 2692,32, | 2692,33, | 2692,34, | 2692,35, | 2692,36, | 2692,37, | 2692,38, | 2692,39, | 2692,40, | 2692,41, | 2692,42, | 2692,43, | 2692,44, | 2692,45, | 2692,46, | 2692,47, | 2692,48, | 2692,49, | 2692,50, | 2692,51, | 2692,52, | 2692,53, | 2692,54, | 2692,55, | 2692,56, | 2692,57, | 2692,58, | 2692,59, | 2692,60, | 2692,61, | 2692,62, | 2692,63, | 2692,64, | 2692,65, | 2692,66, | 2692,67, | 2692,68, | 2692,69, | 2692,70, | 2692,71, | 2692,72, | 2692,73, | 2692,74, | 2692,75, | 2692,76, | 2692,77, | 2692,78, | 2692,79, | 2692,80, | 2692,81, | 2692,82, | 2692,83, | 2692,84, | 2692,85, | 2693,1, | 2693,2, | 2693,3, | 2693,4, | 2693,5, | 2693,6, | 2693,7, | 2693,8, | 2693,9, | 2693,10, | 2693,11, | 2693,12, | 2693,13, | 2693,14, | 2693,15, | 2693,16, | 2693,17, | 2693,18, | 2693,19, | 2693,20, | 2693,21, | 2693,22, | 2693,23, | 2693,24, | 2693,25, | 2693,26, | 2693,27, | 2693,28, | 2693,29, | 2693,30, | 2693,31, | 2693,32, | 2693,33, | 2693,34, | 2693,35, | 2693,36, | 2693,37, | 2693,38, | 2693,39, | 2693,40, | 2693,41, | 2693,42, | 2693,43, | 2693,44, | 2693,45, | 2693,46, | 2693,47, | 2693,48, | 2693,49, | 2693,50, | 2693,51, | 2693,52, | 2693,53, | 2693,54, | 2693,55, | 2693,56, | 2693,57, | 2693,58, | 2693,59, | 2693,60, | 2693,61, | 2693,62, | 2693,63, | 2693,64, | 2693,65, | 2693,66, | 2693,67, | 2693,68, | 2693,69, | 2693,70, | 2693,71, | 2693,72, | 2693,73, | 2693,74, | 2693,75, | 2693,76, | 2693,77, | 2693,78, | 2693,79, | 2693,80, | 2693,81, | 2693,82, | 2693,83, | 2693,84, | 2693,85, | 2694,1, | 2694,2, | 2694,3, | 2694,4, | 2694,5, | 2694,6, | 2694,7, | 2694,8, | 2694,9, | 2694,10, | 2694,11, | 2694,12, | 2694,13, | 2694,14, | 2694,15, | 2694,16, | 2694,17, | 2694,18, | 2694,19, | 2694,20, | 2694,21, | 2694,22, | 2694,23, | 2694,24, | 2694,25, | 2694,26, | 2694,27, | 2694,28, | 2694,29, | 2694,30, | 2694,31, | 2694,32, | 2694,33, | 2694,34, | 2694,35, | 2694,36, | 2694,37, | 2694,38, | 2694,39, | 2694,40, | 2694,41, | 2694,42, | 2694,43, | 2694,44, | 2694,45, | 2694,46, | 2694,47, | 2694,48, | 2694,49, | 2694,50, | 2694,51, | 2694,52, | 2694,53, | 2694,54, | 2694,55, | 2694,56, | 2694,57, | 2694,58, | 2694,59, | 2694,60, | 2694,61, | 2694,62, | 2694,63, | 2694,64, | 2694,65, | 2694,66, | 2694,67, | 2694,68, | 2694,69, | 2694,70, | 2694,71, | 2694,72, | 2694,73, | 2694,74, | 2694,75, | 2694,76, | 2694,77, | 2694,78, | 2694,79, | 2694,80, | 2694,81, | 2694,82, | 2694,83, | 2694,84, | 2694,85, | 2695,1, | 2695,2, | 2695,3, | 2695,4, | 2695,5, | 2695,6, | 2695,7, | 2695,8, | 2695,9, | 2695,10, | 2695,11, | 2695,12, | 2695,13, | 2695,14, | 2695,15, | 2695,16, | 2695,17, | 2695,18, | 2695,19, | 2695,20, | 2695,21, | 2695,22, | 2695,23, | 2695,24, | 2695,25, | 2695,26, | 2695,27, | 2695,28, | 2695,29, | 2695,30, | 2695,31, | 2695,32, | 2695,33, | 2695,34, | 2695,35, | 2695,36, | 2695,37, | 2695,38, | 2695,39, | 2695,40, | 2695,41, | 2695,42, | 2695,43, | 2695,44, | 2695,45, | 2695,46, | 2695,47, | 2695,48, | 2695,49, | 2695,50, | 2695,51, | 2695,52, | 2695,53, | 2695,54, | 2695,55, | 2695,56, | 2695,57, | 2695,58, | 2695,59, | 2695,60, | 2695,61, | 2695,62, | 2695,63, | 2695,64, | 2695,65, | 2695,66, | 2695,67, | 2695,68, | 2695,69, | 2695,70, | 2695,71, | 2695,72, | 2695,73, | 2695,74, | 2695,75, | 2695,76, | 2695,77, | 2695,78, | 2695,79, | 2695,80, | 2695,81, | 2695,82, | 2695,83, | 2695,84, | 2695,85, | 2696,1, | 2696,2, | 2696,3, | 2696,4, | 2696,5, | 2696,6, | 2696,7, | 2696,8, | 2696,9, | 2696,10, | 2696,11, | 2696,12, | 2696,13, | 2696,14, | 2696,15, | 2696,16, | 2696,17, | 2696,18, | 2696,19, | 2696,20, | 2696,21, | 2696,22, | 2696,23, | 2696,24, | 2696,25, | 2696,26, | 2696,27, | 2696,28, | 2696,29, | 2696,30, | 2696,31, | 2696,32, | 2696,33, | 2696,34, | 2696,35, | 2696,36, | 2696,37, | 2696,38, | 2696,39, | 2696,40, | 2696,41, | 2696,42, | 2696,43, | 2696,44, | 2696,45, | 2696,46, | 2696,47, | 2696,48, | 2696,49, | 2696,50, | 2696,51, | 2696,52, | 2696,53, | 2696,54, | 2696,55, | 2696,56, | 2696,57, | 2696,58, | 2696,59, | 2696,60, | 2696,61, | 2696,62, | 2696,63, | 2696,64, | 2696,65, | 2696,66, | 2696,67, | 2696,68, | 2696,69, | 2696,70, | 2696,71, | 2696,72, | 2696,73, | 2696,74, | 2696,75, | 2696,76, | 2696,77, | 2696,78, | 2696,79, | 2696,80, | 2696,81, | 2696,82, | 2696,83, | 2696,84, | 2696,85, | 2697,1, | 2697,2, | 2697,3, | 2697,4, | 2697,5, | 2697,6, | 2697,7, | 2697,8, | 2697,9, | 2697,10, | 2697,11, | 2697,12, | 2697,13, | 2697,14, | 2697,15, | 2697,16, | 2697,17, | 2697,18, | 2697,19, | 2697,20, | 2697,21, | 2697,22, | 2697,23, | 2697,24, | 2697,25, | 2697,26, | 2697,27, | 2697,28, | 2697,29, | 2697,30, | 2697,31, | 2697,32, | 2697,33, | 2697,34, | 2697,35, | 2697,36, | 2697,37, | 2697,38, | 2697,39, | 2697,40, | 2697,41, | 2697,42, | 2697,43, | 2697,44, | 2697,45, | 2697,46, | 2697,47, | 2697,48, | 2697,49, | 2697,50, | 2697,51, | 2697,52, | 2697,53, | 2697,54, | 2697,55, | 2697,56, | 2697,57, | 2697,58, | 2697,59, | 2697,60, | 2697,61, | 2697,62, | 2697,63, | 2697,64, | 2697,65, | 2697,66, | 2697,67, | 2697,68, | 2697,69, | 2697,70, | 2697,71, | 2697,72, | 2697,73, | 2697,74, | 2697,75, | 2697,76, | 2697,77, | 2697,78, | 2697,79, | 2697,80, | 2697,81, | 2697,82, | 2697,83, | 2697,84, | 2697,85, | 2698,1, | 2698,2, | 2698,3, | 2698,4, | 2698,5, | 2698,6, | 2698,7, | 2698,8, | 2698,9, | 2698,10, | 2698,11, | 2698,12, | 2698,13, | 2698,14, | 2698,15, | 2698,16, | 2698,17, | 2698,18, | 2698,19, | 2698,20, | 2698,21, | 2698,22, | 2698,23, | 2698,24, | 2698,25, | 2698,26, | 2698,27, | 2698,28, | 2698,29, | 2698,30, | 2698,31, | 2698,32, | 2698,33, | 2698,34, | 2698,35, | 2698,36, | 2698,37, | 2698,38, | 2698,39, | 2698,40, | 2698,41, | 2698,42, | 2698,43, | 2698,44, | 2698,45, | 2698,46, | 2698,47, | 2698,48, | 2698,49, | 2698,50, | 2698,51, | 2698,52, | 2698,53, | 2698,54, | 2698,55, | 2698,56, | 2698,57, | 2698,58, | 2698,59, | 2698,60, | 2698,61, | 2698,62, | 2698,63, | 2698,64, | 2698,65, | 2698,66, | 2698,67, | 2698,68, | 2698,69, | 2698,70, | 2698,71, | 2698,72, | 2698,73, | 2698,74, | 2698,75, | 2698,76, | 2698,77, | 2698,78, | 2698,79, | 2698,80, | 2698,81, | 2698,82, | 2698,83, | 2698,84, | 2698,85, | 2699,1, | 2699,2, | 2699,3, | 2699,4, | 2699,5, | 2699,6, | 2699,7, | 2699,8, | 2699,9, | 2699,10, | 2699,11, | 2699,12, | 2699,13, | 2699,14, | 2699,15, | 2699,16, | 2699,17, | 2699,18, | 2699,19, | 2699,20, | 2699,21, | 2699,22, | 2699,23, | 2699,24, | 2699,25, | 2699,26, | 2699,27, | 2699,28, | 2699,29, | 2699,30, | 2699,31, | 2699,32, | 2699,33, | 2699,34, | 2699,35, | 2699,36, | 2699,37, | 2699,38, | 2699,39, | 2699,40, | 2699,41, | 2699,42, | 2699,43, | 2699,44, | 2699,45, | 2699,46, | 2699,47, | 2699,48, | 2699,49, | 2699,50, | 2699,51, | 2699,52, | 2699,53, | 2699,54, | 2699,55, | 2699,56, | 2699,57, | 2699,58, | 2699,59, | 2699,60, | 2699,61, | 2699,62, | 2699,63, | 2699,64, | 2699,65, | 2699,66, | 2699,67, | 2699,68, | 2699,69, | 2699,70, | 2699,71, | 2699,72, | 2699,73, | 2699,74, | 2699,75, | 2699,76, | 2699,77, | 2699,78, | 2699,79, | 2699,80, | 2699,81, | 2699,82, | 2699,83, | 2699,84, | 2699,85, | 2700,1, | 2700,2, | 2700,3, | 2700,4, | 2700,5, | 2700,6, | 2700,7, | 2700,8, | 2700,9, | 2700,10, | 2700,11, | 2700,12, | 2700,13, | 2700,14, | 2700,15, | 2700,16, | 2700,17, | 2700,18, | 2700,19, | 2700,20, | 2700,21, | 2700,22, | 2700,23, | 2700,24, | 2700,25, | 2700,26, | 2700,27, | 2700,28, | 2700,29, | 2700,30, | 2700,31, | 2700,32, | 2700,33, | 2700,34, | 2700,35, | 2700,36, | 2700,37, | 2700,38, | 2700,39, | 2700,40, | 2700,41, | 2700,42, | 2700,43, | 2700,44, | 2700,45, | 2700,46, | 2700,47, | 2700,48, | 2700,49, | 2700,50, | 2700,51, | 2700,52, | 2700,53, | 2700,54, | 2700,55, | 2700,56, | 2700,57, | 2700,58, | 2700,59, | 2700,60, | 2700,61, | 2700,62, | 2700,63, | 2700,64, | 2700,65, | 2700,66, | 2700,67, | 2700,68, | 2700,69, | 2700,70, | 2700,71, | 2700,72, | 2700,73, | 2700,74, | 2700,75, | 2700,76, | 2700,77, | 2700,78, | 2700,79, | 2700,80, | 2700,81, | 2700,82, | 2700,83, | 2700,84, | 2700,85, | 2701,1, | 2701,2, | 2701,3, | 2701,4, | 2701,5, | 2701,6, | 2701,7, | 2701,8, | 2701,9, | 2701,10, | 2701,11, | 2701,12, | 2701,13, | 2701,14, | 2701,15, | 2701,16, | 2701,17, | 2701,18, | 2701,19, | 2701,20, | 2701,21, | 2701,22, | 2701,23, | 2701,24, | 2701,25, | 2701,26, | 2701,27, | 2701,28, | 2701,29, | 2701,30, | 2701,31, | 2701,32, | 2701,33, | 2701,34, | 2701,35, | 2701,36, | 2701,37, | 2701,38, | 2701,39, | 2701,40, | 2701,41, | 2701,42, | 2701,43, | 2701,44, | 2701,45, | 2701,46, | 2701,47, | 2701,48, | 2701,49, | 2701,50, | 2701,51, | 2701,52, | 2701,53, | 2701,54, | 2701,55, | 2701,56, | 2701,57, | 2701,58, | 2701,59, | 2701,60, | 2701,61, | 2701,62, | 2701,63, | 2701,64, | 2701,65, | 2701,66, | 2701,67, | 2701,68, | 2701,69, | 2701,70, | 2701,71, | 2701,72, | 2701,73, | 2701,74, | 2701,75, | 2701,76, | 2701,77, | 2701,78, | 2701,79, | 2701,80, | 2701,81, | 2701,82, | 2701,83, | 2701,84, | 2701,85, | 2702,1, | 2702,2, | 2702,3, | 2702,4, | 2702,5, | 2702,6, | 2702,7, | 2702,8, | 2702,9, | 2702,10, | 2702,11, | 2702,12, | 2702,13, | 2702,14, | 2702,15, | 2702,16, | 2702,17, | 2702,18, | 2702,19, | 2702,20, | 2702,21, | 2702,22, | 2702,23, | 2702,24, | 2702,25, | 2702,26, | 2702,27, | 2702,28, | 2702,29, | 2702,30, | 2702,31, | 2702,32, | 2702,33, | 2702,34, | 2702,35, | 2702,36, | 2702,37, | 2702,38, | 2702,39, | 2702,40, | 2702,41, | 2702,42, | 2702,43, | 2702,44, | 2702,45, | 2702,46, | 2702,47, | 2702,48, | 2702,49, | 2702,50, | 2702,51, | 2702,52, | 2702,53, | 2702,54, | 2702,55, | 2702,56, | 2702,57, | 2702,58, | 2702,59, | 2702,60, | 2702,61, | 2702,62, | 2702,63, | 2702,64, | 2702,65, | 2702,66, | 2702,67, | 2702,68, | 2702,69, | 2702,70, | 2702,71, | 2702,72, | 2702,73, | 2702,74, | 2702,75, | 2702,76, | 2702,77, | 2702,78, | 2702,79, | 2702,80, | 2702,81, | 2702,82, | 2702,83, | 2702,84, | 2702,85, | 2703,1, | 2703,2, | 2703,3, | 2703,4, | 2703,5, | 2703,6, | 2703,7, | 2703,8, | 2703,9, | 2703,10, | 2703,11, | 2703,12, | 2703,13, | 2703,14, | 2703,15, | 2703,16, | 2703,17, | 2703,18, | 2703,19, | 2703,20, | 2703,21, | 2703,22, | 2703,23, | 2703,24, | 2703,25, | 2703,26, | 2703,27, | 2703,28, | 2703,29, | 2703,30, | 2703,31, | 2703,32, | 2703,33, | 2703,34, | 2703,35, | 2703,36, | 2703,37, | 2703,38, | 2703,39, | 2703,40, | 2703,41, | 2703,42, | 2703,43, | 2703,44, | 2703,45, | 2703,46, | 2703,47, | 2703,48, | 2703,49, | 2703,50, | 2703,51, | 2703,52, | 2703,53, | 2703,54, | 2703,55, | 2703,56, | 2703,57, | 2703,58, | 2703,59, | 2703,60, | 2703,61, | 2703,62, | 2703,63, | 2703,64, | 2703,65, | 2703,66, | 2703,67, | 2703,68, | 2703,69, | 2703,70, | 2703,71, | 2703,72, | 2703,73, | 2703,74, | 2703,75, | 2703,76, | 2703,77, | 2703,78, | 2703,79, | 2703,80, | 2703,81, | 2703,82, | 2703,83, | 2703,84, | 2703,85, | 2704,1, | 2704,2, | 2704,3, | 2704,4, | 2704,5, | 2704,6, | 2704,7, | 2704,8, | 2704,9, | 2704,10, | 2704,11, | 2704,12, | 2704,13, | 2704,14, | 2704,15, | 2704,16, | 2704,17, | 2704,18, | 2704,19, | 2704,20, | 2704,21, | 2704,22, | 2704,23, | 2704,24, | 2704,25, | 2704,26, | 2704,27, | 2704,28, | 2704,29, | 2704,30, | 2704,31, | 2704,32, | 2704,33, | 2704,34, | 2704,35, | 2704,36, | 2704,37, | 2704,38, | 2704,39, | 2704,40, | 2704,41, | 2704,42, | 2704,43, | 2704,44, | 2704,45, | 2704,46, | 2704,47, | 2704,48, | 2704,49, | 2704,50, | 2704,51, | 2704,52, | 2704,53, | 2704,54, | 2704,55, | 2704,56, | 2704,57, | 2704,58, | 2704,59, | 2704,60, | 2704,61, | 2704,62, | 2704,63, | 2704,64, | 2704,65, | 2704,66, | 2704,67, | 2704,68, | 2704,69, | 2704,70, | 2704,71, | 2704,72, | 2704,73, | 2704,74, | 2704,75, | 2704,76, | 2704,77, | 2704,78, | 2704,79, | 2704,80, | 2704,81, | 2704,82, | 2704,83, | 2704,84, | 2704,85, | 2705,1, | 2705,2, | 2705,3, | 2705,4, | 2705,5, | 2705,6, | 2705,7, | 2705,8, | 2705,9, | 2705,10, | 2705,11, | 2705,12, | 2705,13, | 2705,14, | 2705,15, | 2705,16, | 2705,17, | 2705,18, | 2705,19, | 2705,20, | 2705,21, | 2705,22, | 2705,23, | 2705,24, | 2705,25, | 2705,26, | 2705,27, | 2705,28, | 2705,29, | 2705,30, | 2705,31, | 2705,32, | 2705,33, | 2705,34, | 2705,35, | 2705,36, | 2705,37, | 2705,38, | 2705,39, | 2705,40, | 2705,41, | 2705,42, | 2705,43, | 2705,44, | 2705,45, | 2705,46, | 2705,47, | 2705,48, | 2705,49, | 2705,50, | 2705,51, | 2705,52, | 2705,53, | 2705,54, | 2705,55, | 2705,56, | 2705,57, | 2705,58, | 2705,59, | 2705,60, | 2705,61, | 2705,62, | 2705,63, | 2705,64, | 2705,65, | 2705,66, | 2705,67, | 2705,68, | 2705,69, | 2705,70, | 2705,71, | 2705,72, | 2705,73, | 2705,74, | 2705,75, | 2705,76, | 2705,77, | 2705,78, | 2705,79, | 2705,80, | 2705,81, | 2705,82, | 2705,83, | 2705,84, | 2705,85, | 2706,1, | 2706,2, | 2706,3, | 2706,4, | 2706,5, | 2706,6, | 2706,7, | 2706,8, | 2706,9, | 2706,10, | 2706,11, | 2706,12, | 2706,13, | 2706,14, | 2706,15, | 2706,16, | 2706,17, | 2706,18, | 2706,19, | 2706,20, | 2706,21, | 2706,22, | 2706,23, | 2706,24, | 2706,25, | 2706,26, | 2706,27, | 2706,28, | 2706,29, | 2706,30, | 2706,31, | 2706,32, | 2706,33, | 2706,34, | 2706,35, | 2706,36, | 2706,37, | 2706,38, | 2706,39, | 2706,40, | 2706,41, | 2706,42, | 2706,43, | 2706,44, | 2706,45, | 2706,46, | 2706,47, | 2706,48, | 2706,49, | 2706,50, | 2706,51, | 2706,52, | 2706,53, | 2706,54, | 2706,55, | 2706,56, | 2706,57, | 2706,58, | 2706,59, | 2706,60, | 2706,61, | 2706,62, | 2706,63, | 2706,64, | 2706,65, | 2706,66, | 2706,67, | 2706,68, | 2706,69, | 2706,70, | 2706,71, | 2706,72, | 2706,73, | 2706,74, | 2706,75, | 2706,76, | 2706,77, | 2706,78, | 2706,79, | 2706,80, | 2706,81, | 2706,82, | 2706,83, | 2706,84, | 2706,85, | 2707,1, | 2707,2, | 2707,3, | 2707,4, | 2707,5, | 2707,6, | 2707,7, | 2707,8, | 2707,9, | 2707,10, | 2707,11, | 2707,12, | 2707,13, | 2707,14, | 2707,15, | 2707,16, | 2707,17, | 2707,18, | 2707,19, | 2707,20, | 2707,21, | 2707,22, | 2707,23, | 2707,24, | 2707,25, | 2707,26, | 2707,27, | 2707,28, | 2707,29, | 2707,30, | 2707,31, | 2707,32, | 2707,33, | 2707,34, | 2707,35, | 2707,36, | 2707,37, | 2707,38, | 2707,39, | 2707,40, | 2707,41, | 2707,42, | 2707,43, | 2707,44, | 2707,45, | 2707,46, | 2707,47, | 2707,48, | 2707,49, | 2707,50, | 2707,51, | 2707,52, | 2707,53, | 2707,54, | 2707,55, | 2707,56, | 2707,57, | 2707,58, | 2707,59, | 2707,60, | 2707,61, | 2707,62, | 2707,63, | 2707,64, | 2707,65, | 2707,66, | 2707,67, | 2707,68, | 2707,69, | 2707,70, | 2707,71, | 2707,72, | 2707,73, | 2707,74, | 2707,75, | 2707,76, | 2707,77, | 2707,78, | 2707,79, | 2707,80, | 2707,81, | 2707,82, | 2707,83, | 2707,84, | 2707,85, | 2708,1, | 2708,2, | 2708,3, | 2708,4, | 2708,5, | 2708,6, | 2708,7, | 2708,8, | 2708,9, | 2708,10, | 2708,11, | 2708,12, | 2708,13, | 2708,14, | 2708,15, | 2708,16, | 2708,17, | 2708,18, | 2708,19, | 2708,20, | 2708,21, | 2708,22, | 2708,23, | 2708,24, | 2708,25, | 2708,26, | 2708,27, | 2708,28, | 2708,29, | 2708,30, | 2708,31, | 2708,32, | 2708,33, | 2708,34, | 2708,35, | 2708,36, | 2708,37, | 2708,38, | 2708,39, | 2708,40, | 2708,41, | 2708,42, | 2708,43, | 2708,44, | 2708,45, | 2708,46, | 2708,47, | 2708,48, | 2708,49, | 2708,50, | 2708,51, | 2708,52, | 2708,53, | 2708,54, | 2708,55, | 2708,56, | 2708,57, | 2708,58, | 2708,59, | 2708,60, | 2708,61, | 2708,62, | 2708,63, | 2708,64, | 2708,65, | 2708,66, | 2708,67, | 2708,68, | 2708,69, | 2708,70, | 2708,71, | 2708,72, | 2708,73, | 2708,74, | 2708,75, | 2708,76, | 2708,77, | 2708,78, | 2708,79, | 2708,80, | 2708,81, | 2708,82, | 2708,83, | 2708,84, | 2708,85, | 2709,1, | 2709,2, | 2709,3, | 2709,4, | 2709,5, | 2709,6, | 2709,7, | 2709,8, | 2709,9, | 2709,10, | 2709,11, | 2709,12, | 2709,13, | 2709,14, | 2709,15, | 2709,16, | 2709,17, | 2709,18, | 2709,19, | 2709,20, | 2709,21, | 2709,22, | 2709,23, | 2709,24, | 2709,25, | 2709,26, | 2709,27, | 2709,28, | 2709,29, | 2709,30, | 2709,31, | 2709,32, | 2709,33, | 2709,34, | 2709,35, | 2709,36, | 2709,37, | 2709,38, | 2709,39, | 2709,40, | 2709,41, | 2709,42, | 2709,43, | 2709,44, | 2709,45, | 2709,46, | 2709,47, | 2709,48, | 2709,49, | 2709,50, | 2709,51, | 2709,52, | 2709,53, | 2709,54, | 2709,55, | 2709,56, | 2709,57, | 2709,58, | 2709,59, | 2709,60, | 2709,61, | 2709,62, | 2709,63, | 2709,64, | 2709,65, | 2709,66, | 2709,67, | 2709,68, | 2709,69, | 2709,70, | 2709,71, | 2709,72, | 2709,73, | 2709,74, | 2709,75, | 2709,76, | 2709,77, | 2709,78, | 2709,79, | 2709,80, | 2709,81, | 2709,82, | 2709,83, | 2709,84, | 2709,85, | 2710,1, | 2710,2, | 2710,3, | 2710,4, | 2710,5, | 2710,6, | 2710,7, | 2710,8, | 2710,9, | 2710,10, | 2710,11, | 2710,12, | 2710,13, | 2710,14, | 2710,15, | 2710,16, | 2710,17, | 2710,18, | 2710,19, | 2710,20, | 2710,21, | 2710,22, | 2710,23, | 2710,24, | 2710,25, | 2710,26, | 2710,27, | 2710,28, | 2710,29, | 2710,30, | 2710,31, | 2710,32, | 2710,33, | 2710,34, | 2710,35, | 2710,36, | 2710,37, | 2710,38, | 2710,39, | 2710,40, | 2710,41, | 2710,42, | 2710,43, | 2710,44, | 2710,45, | 2710,46, | 2710,47, | 2710,48, | 2710,49, | 2710,50, | 2710,51, | 2710,52, | 2710,53, | 2710,54, | 2710,55, | 2710,56, | 2710,57, | 2710,58, | 2710,59, | 2710,60, | 2710,61, | 2710,62, | 2710,63, | 2710,64, | 2710,65, | 2710,66, | 2710,67, | 2710,68, | 2710,69, | 2710,70, | 2710,71, | 2710,72, | 2710,73, | 2710,74, | 2710,75, | 2710,76, | 2710,77, | 2710,78, | 2710,79, | 2710,80, | 2710,81, | 2710,82, | 2710,83, | 2710,84, | 2710,85, | 2711,1, | 2711,2, | 2711,3, | 2711,4, | 2711,5, | 2711,6, | 2711,7, | 2711,8, | 2711,9, | 2711,10, | 2711,11, | 2711,12, | 2711,13, | 2711,14, | 2711,15, | 2711,16, | 2711,17, | 2711,18, | 2711,19, | 2711,20, | 2711,21, | 2711,22, | 2711,23, | 2711,24, | 2711,25, | 2711,26, | 2711,27, | 2711,28, | 2711,29, | 2711,30, | 2711,31, | 2711,32, | 2711,33, | 2711,34, | 2711,35, | 2711,36, | 2711,37, | 2711,38, | 2711,39, | 2711,40, | 2711,41, | 2711,42, | 2711,43, | 2711,44, | 2711,45, | 2711,46, | 2711,47, | 2711,48, | 2711,49, | 2711,50, | 2711,51, | 2711,52, | 2711,53, | 2711,54, | 2711,55, | 2711,56, | 2711,57, | 2711,58, | 2711,59, | 2711,60, | 2711,61, | 2711,62, | 2711,63, | 2711,64, | 2711,65, | 2711,66, | 2711,67, | 2711,68, | 2711,69, | 2711,70, | 2711,71, | 2711,72, | 2711,73, | 2711,74, | 2711,75, | 2711,76, | 2711,77, | 2711,78, | 2711,79, | 2711,80, | 2711,81, | 2711,82, | 2711,83, | 2711,84, | 2711,85, | 2712,1, | 2712,2, | 2712,3, | 2712,4, | 2712,5, | 2712,6, | 2712,7, | 2712,8, | 2712,9, | 2712,10, | 2712,11, | 2712,12, | 2712,13, | 2712,14, | 2712,15, | 2712,16, | 2712,17, | 2712,18, | 2712,19, | 2712,20, | 2712,21, | 2712,22, | 2712,23, | 2712,24, | 2712,25, | 2712,26, | 2712,27, | 2712,28, | 2712,29, | 2712,30, | 2712,31, | 2712,32, | 2712,33, | 2712,34, | 2712,35, | 2712,36, | 2712,37, | 2712,38, | 2712,39, | 2712,40, | 2712,41, | 2712,42, | 2712,43, | 2712,44, | 2712,45, | 2712,46, | 2712,47, | 2712,48, | 2712,49, | 2712,50, | 2712,51, | 2712,52, | 2712,53, | 2712,54, | 2712,55, | 2712,56, | 2712,57, | 2712,58, | 2712,59, | 2712,60, | 2712,61, | 2712,62, | 2712,63, | 2712,64, | 2712,65, | 2712,66, | 2712,67, | 2712,68, | 2712,69, | 2712,70, | 2712,71, | 2712,72, | 2712,73, | 2712,74, | 2712,75, | 2712,76, | 2712,77, | 2712,78, | 2712,79, | 2712,80, | 2712,81, | 2712,82, | 2712,83, | 2712,84, | 2712,85, | 2713,1, | 2713,2, | 2713,3, | 2713,4, | 2713,5, | 2713,6, | 2713,7, | 2713,8, | 2713,9, | 2713,10, | 2713,11, | 2713,12, | 2713,13, | 2713,14, | 2713,15, | 2713,16, | 2713,17, | 2713,18, | 2713,19, | 2713,20, | 2713,21, | 2713,22, | 2713,23, | 2713,24, | 2713,25, | 2713,26, | 2713,27, | 2713,28, | 2713,29, | 2713,30, | 2713,31, | 2713,32, | 2713,33, | 2713,34, | 2713,35, | 2713,36, | 2713,37, | 2713,38, | 2713,39, | 2713,40, | 2713,41, | 2713,42, | 2713,43, | 2713,44, | 2713,45, | 2713,46, | 2713,47, | 2713,48, | 2713,49, | 2713,50, | 2713,51, | 2713,52, | 2713,53, | 2713,54, | 2713,55, | 2713,56, | 2713,57, | 2713,58, | 2713,59, | 2713,60, | 2713,61, | 2713,62, | 2713,63, | 2713,64, | 2713,65, | 2713,66, | 2713,67, | 2713,68, | 2713,69, | 2713,70, | 2713,71, | 2713,72, | 2713,73, | 2713,74, | 2713,75, | 2713,76, | 2713,77, | 2713,78, | 2713,79, | 2713,80, | 2713,81, | 2713,82, | 2713,83, | 2713,84, | 2713,85, | 2714,1, | 2714,2, | 2714,3, | 2714,4, | 2714,5, | 2714,6, | 2714,7, | 2714,8, | 2714,9, | 2714,10, | 2714,11, | 2714,12, | 2714,13, | 2714,14, | 2714,15, | 2714,16, | 2714,17, | 2714,18, | 2714,19, | 2714,20, | 2714,21, | 2714,22, | 2714,23, | 2714,24, | 2714,25, | 2714,26, | 2714,27, | 2714,28, | 2714,29, | 2714,30, | 2714,31, | 2714,32, | 2714,33, | 2714,34, | 2714,35, | 2714,36, | 2714,37, | 2714,38, | 2714,39, | 2714,40, | 2714,41, | 2714,42, | 2714,43, | 2714,44, | 2714,45, | 2714,46, | 2714,47, | 2714,48, | 2714,49, | 2714,50, | 2714,51, | 2714,52, | 2714,53, | 2714,54, | 2714,55, | 2714,56, | 2714,57, | 2714,58, | 2714,59, | 2714,60, | 2714,61, | 2714,62, | 2714,63, | 2714,64, | 2714,65, | 2714,66, | 2714,67, | 2714,68, | 2714,69, | 2714,70, | 2714,71, | 2714,72, | 2714,73, | 2714,74, | 2714,75, | 2714,76, | 2714,77, | 2714,78, | 2714,79, | 2714,80, | 2714,81, | 2714,82, | 2714,83, | 2714,84, | 2714,85, | 2715,1, | 2715,2, | 2715,3, | 2715,4, | 2715,5, | 2715,6, | 2715,7, | 2715,8, | 2715,9, | 2715,10, | 2715,11, | 2715,12, | 2715,13, | 2715,14, | 2715,15, | 2715,16, | 2715,17, | 2715,18, | 2715,19, | 2715,20, | 2715,21, | 2715,22, | 2715,23, | 2715,24, | 2715,25, | 2715,26, | 2715,27, | 2715,28, | 2715,29, | 2715,30, | 2715,31, | 2715,32, | 2715,33, | 2715,34, | 2715,35, | 2715,36, | 2715,37, | 2715,38, | 2715,39, | 2715,40, | 2715,41, | 2715,42, | 2715,43, | 2715,44, | 2715,45, | 2715,46, | 2715,47, | 2715,48, | 2715,49, | 2715,50, | 2715,51, | 2715,52, | 2715,53, | 2715,54, | 2715,55, | 2715,56, | 2715,57, | 2715,58, | 2715,59, | 2715,60, | 2715,61, | 2715,62, | 2715,63, | 2715,64, | 2715,65, | 2715,66, | 2715,67, | 2715,68, | 2715,69, | 2715,70, | 2715,71, | 2715,72, | 2715,73, | 2715,74, | 2715,75, | 2715,76, | 2715,77, | 2715,78, | 2715,79, | 2715,80, | 2715,81, | 2715,82, | 2715,83, | 2715,84, | 2715,85, | 2716,1, | 2716,2, | 2716,3, | 2716,4, | 2716,5, | 2716,6, | 2716,7, | 2716,8, | 2716,9, | 2716,10, | 2716,11, | 2716,12, | 2716,13, | 2716,14, | 2716,15, | 2716,16, | 2716,17, | 2716,18, | 2716,19, | 2716,20, | 2716,21, | 2716,22, | 2716,23, | 2716,24, | 2716,25, | 2716,26, | 2716,27, | 2716,28, | 2716,29, | 2716,30, | 2716,31, | 2716,32, | 2716,33, | 2716,34, | 2716,35, | 2716,36, | 2716,37, | 2716,38, | 2716,39, | 2716,40, | 2716,41, | 2716,42, | 2716,43, | 2716,44, | 2716,45, | 2716,46, | 2716,47, | 2716,48, | 2716,49, | 2716,50, | 2716,51, | 2716,52, | 2716,53, | 2716,54, | 2716,55, | 2716,56, | 2716,57, | 2716,58, | 2716,59, | 2716,60, | 2716,61, | 2716,62, | 2716,63, | 2716,64, | 2716,65, | 2716,66, | 2716,67, | 2716,68, | 2716,69, | 2716,70, | 2716,71, | 2716,72, | 2716,73, | 2716,74, | 2716,75, | 2716,76, | 2716,77, | 2716,78, | 2716,79, | 2716,80, | 2716,81, | 2716,82, | 2716,83, | 2716,84, | 2716,85, | 2717,1, | 2717,2, | 2717,3, | 2717,4, | 2717,5, | 2717,6, | 2717,7, | 2717,8, | 2717,9, | 2717,10, | 2717,11, | 2717,12, | 2717,13, | 2717,14, | 2717,15, | 2717,16, | 2717,17, | 2717,18, | 2717,19, | 2717,20, | 2717,21, | 2717,22, | 2717,23, | 2717,24, | 2717,25, | 2717,26, | 2717,27, | 2717,28, | 2717,29, | 2717,30, | 2717,31, | 2717,32, | 2717,33, | 2717,34, | 2717,35, | 2717,36, | 2717,37, | 2717,38, | 2717,39, | 2717,40, | 2717,41, | 2717,42, | 2717,43, | 2717,44, | 2717,45, | 2717,46, | 2717,47, | 2717,48, | 2717,49, | 2717,50, | 2717,51, | 2717,52, | 2717,53, | 2717,54, | 2717,55, | 2717,56, | 2717,57, | 2717,58, | 2717,59, | 2717,60, | 2717,61, | 2717,62, | 2717,63, | 2717,64, | 2717,65, | 2717,66, | 2717,67, | 2717,68, | 2717,69, | 2717,70, | 2717,71, | 2717,72, | 2717,73, | 2717,74, | 2717,75, | 2717,76, | 2717,77, | 2717,78, | 2717,79, | 2717,80, | 2717,81, | 2717,82, | 2717,83, | 2717,84, | 2717,85, | 2718,1, | 2718,2, | 2718,3, | 2718,4, | 2718,5, | 2718,6, | 2718,7, | 2718,8, | 2718,9, | 2718,10, | 2718,11, | 2718,12, | 2718,13, | 2718,14, | 2718,15, | 2718,16, | 2718,17, | 2718,18, | 2718,19, | 2718,20, | 2718,21, | 2718,22, | 2718,23, | 2718,24, | 2718,25, | 2718,26, | 2718,27, | 2718,28, | 2718,29, | 2718,30, | 2718,31, | 2718,32, | 2718,33, | 2718,34, | 2718,35, | 2718,36, | 2718,37, | 2718,38, | 2718,39, | 2718,40, | 2718,41, | 2718,42, | 2718,43, | 2718,44, | 2718,45, | 2718,46, | 2718,47, | 2718,48, | 2718,49, | 2718,50, | 2718,51, | 2718,52, | 2718,53, | 2718,54, | 2718,55, | 2718,56, | 2718,57, | 2718,58, | 2718,59, | 2718,60, | 2718,61, | 2718,62, | 2718,63, | 2718,64, | 2718,65, | 2718,66, | 2718,67, | 2718,68, | 2718,69, | 2718,70, | 2718,71, | 2718,72, | 2718,73, | 2718,74, | 2718,75, | 2718,76, | 2718,77, | 2718,78, | 2718,79, | 2718,80, | 2718,81, | 2718,82, | 2718,83, | 2718,84, | 2718,85, | 2719,1, | 2719,2, | 2719,3, | 2719,4, | 2719,5, | 2719,6, | 2719,7, | 2719,8, | 2719,9, | 2719,10, | 2719,11, | 2719,12, | 2719,13, | 2719,14, | 2719,15, | 2719,16, | 2719,17, | 2719,18, | 2719,19, | 2719,20, | 2719,21, | 2719,22, | 2719,23, | 2719,24, | 2719,25, | 2719,26, | 2719,27, | 2719,28, | 2719,29, | 2719,30, | 2719,31, | 2719,32, | 2719,33, | 2719,34, | 2719,35, | 2719,36, | 2719,37, | 2719,38, | 2719,39, | 2719,40, | 2719,41, | 2719,42, | 2719,43, | 2719,44, | 2719,45, | 2719,46, | 2719,47, | 2719,48, | 2719,49, | 2719,50, | 2719,51, | 2719,52, | 2719,53, | 2719,54, | 2719,55, | 2719,56, | 2719,57, | 2719,58, | 2719,59, | 2719,60, | 2719,61, | 2719,62, | 2719,63, | 2719,64, | 2719,65, | 2719,66, | 2719,67, | 2719,68, | 2719,69, | 2719,70, | 2719,71, | 2719,72, | 2719,73, | 2719,74, | 2719,75, | 2719,76, | 2719,77, | 2719,78, | 2719,79, | 2719,80, | 2719,81, | 2719,82, | 2719,83, | 2719,84, | 2719,85, | 2720,1, | 2720,2, | 2720,3, | 2720,4, | 2720,5, | 2720,6, | 2720,7, | 2720,8, | 2720,9, | 2720,10, | 2720,11, | 2720,12, | 2720,13, | 2720,14, | 2720,15, | 2720,16, | 2720,17, | 2720,18, | 2720,19, | 2720,20, | 2720,21, | 2720,22, | 2720,23, | 2720,24, | 2720,25, | 2720,26, | 2720,27, | 2720,28, | 2720,29, | 2720,30, | 2720,31, | 2720,32, | 2720,33, | 2720,34, | 2720,35, | 2720,36, | 2720,37, | 2720,38, | 2720,39, | 2720,40, | 2720,41, | 2720,42, | 2720,43, | 2720,44, | 2720,45, | 2720,46, | 2720,47, | 2720,48, | 2720,49, | 2720,50, | 2720,51, | 2720,52, | 2720,53, | 2720,54, | 2720,55, | 2720,56, | 2720,57, | 2720,58, | 2720,59, | 2720,60, | 2720,61, | 2720,62, | 2720,63, | 2720,64, | 2720,65, | 2720,66, | 2720,67, | 2720,68, | 2720,69, | 2720,70, | 2720,71, | 2720,72, | 2720,73, | 2720,74, | 2720,75, | 2720,76, | 2720,77, | 2720,78, | 2720,79, | 2720,80, | 2720,81, | 2720,82, | 2720,83, | 2720,84, | 2720,85, | 2721,1, | 2721,2, | 2721,3, | 2721,4, | 2721,5, | 2721,6, | 2721,7, | 2721,8, | 2721,9, | 2721,10, | 2721,11, | 2721,12, | 2721,13, | 2721,14, | 2721,15, | 2721,16, | 2721,17, | 2721,18, | 2721,19, | 2721,20, | 2721,21, | 2721,22, | 2721,23, | 2721,24, | 2721,25, | 2721,26, | 2721,27, | 2721,28, | 2721,29, | 2721,30, | 2721,31, | 2721,32, | 2721,33, | 2721,34, | 2721,35, | 2721,36, | 2721,37, | 2721,38, | 2721,39, | 2721,40, | 2721,41, | 2721,42, | 2721,43, | 2721,44, | 2721,45, | 2721,46, | 2721,47, | 2721,48, | 2721,49, | 2721,50, | 2721,51, | 2721,52, | 2721,53, | 2721,54, | 2721,55, | 2721,56, | 2721,57, | 2721,58, | 2721,59, | 2721,60, | 2721,61, | 2721,62, | 2721,63, | 2721,64, | 2721,65, | 2721,66, | 2721,67, | 2721,68, | 2721,69, | 2721,70, | 2721,71, | 2721,72, | 2721,73, | 2721,74, | 2721,75, | 2721,76, | 2721,77, | 2721,78, | 2721,79, | 2721,80, | 2721,81, | 2721,82, | 2721,83, | 2721,84, | 2721,85, | 2722,1, | 2722,2, | 2722,3, | 2722,4, | 2722,5, | 2722,6, | 2722,7, | 2722,8, | 2722,9, | 2722,10, | 2722,11, | 2722,12, | 2722,13, | 2722,14, | 2722,15, | 2722,16, | 2722,17, | 2722,18, | 2722,19, | 2722,20, | 2722,21, | 2722,22, | 2722,23, | 2722,24, | 2722,25, | 2722,26, | 2722,27, | 2722,28, | 2722,29, | 2722,30, | 2722,31, | 2722,32, | 2722,33, | 2722,34, | 2722,35, | 2722,36, | 2722,37, | 2722,38, | 2722,39, | 2722,40, | 2722,41, | 2722,42, | 2722,43, | 2722,44, | 2722,45, | 2722,46, | 2722,47, | 2722,48, | 2722,49, | 2722,50, | 2722,51, | 2722,52, | 2722,53, | 2722,54, | 2722,55, | 2722,56, | 2722,57, | 2722,58, | 2722,59, | 2722,60, | 2722,61, | 2722,62, | 2722,63, | 2722,64, | 2722,65, | 2722,66, | 2722,67, | 2722,68, | 2722,69, | 2722,70, | 2722,71, | 2722,72, | 2722,73, | 2722,74, | 2722,75, | 2722,76, | 2722,77, | 2722,78, | 2722,79, | 2722,80, | 2722,81, | 2722,82, | 2722,83, | 2722,84, | 2722,85, | 2723,1, | 2723,2, | 2723,3, | 2723,4, | 2723,5, | 2723,6, | 2723,7, | 2723,8, | 2723,9, | 2723,10, | 2723,11, | 2723,12, | 2723,13, | 2723,14, | 2723,15, | 2723,16, | 2723,17, | 2723,18, | 2723,19, | 2723,20, | 2723,21, | 2723,22, | 2723,23, | 2723,24, | 2723,25, | 2723,26, | 2723,27, | 2723,28, | 2723,29, | 2723,30, | 2723,31, | 2723,32, | 2723,33, | 2723,34, | 2723,35, | 2723,36, | 2723,37, | 2723,38, | 2723,39, | 2723,40, | 2723,41, | 2723,42, | 2723,43, | 2723,44, | 2723,45, | 2723,46, | 2723,47, | 2723,48, | 2723,49, | 2723,50, | 2723,51, | 2723,52, | 2723,53, | 2723,54, | 2723,55, | 2723,56, | 2723,57, | 2723,58, | 2723,59, | 2723,60, | 2723,61, | 2723,62, | 2723,63, | 2723,64, | 2723,65, | 2723,66, | 2723,67, | 2723,68, | 2723,69, | 2723,70, | 2723,71, | 2723,72, | 2723,73, | 2723,74, | 2723,75, | 2723,76, | 2723,77, | 2723,78, | 2723,79, | 2723,80, | 2723,81, | 2723,82, | 2723,83, | 2723,84, | 2723,85, | 2724,1, | 2724,2, | 2724,3, | 2724,4, | 2724,5, | 2724,6, | 2724,7, | 2724,8, | 2724,9, | 2724,10, | 2724,11, | 2724,12, | 2724,13, | 2724,14, | 2724,15, | 2724,16, | 2724,17, | 2724,18, | 2724,19, | 2724,20, | 2724,21, | 2724,22, | 2724,23, | 2724,24, | 2724,25, | 2724,26, | 2724,27, | 2724,28, | 2724,29, | 2724,30, | 2724,31, | 2724,32, | 2724,33, | 2724,34, | 2724,35, | 2724,36, | 2724,37, | 2724,38, | 2724,39, | 2724,40, | 2724,41, | 2724,42, | 2724,43, | 2724,44, | 2724,45, | 2724,46, | 2724,47, | 2724,48, | 2724,49, | 2724,50, | 2724,51, | 2724,52, | 2724,53, | 2724,54, | 2724,55, | 2724,56, | 2724,57, | 2724,58, | 2724,59, | 2724,60, | 2724,61, | 2724,62, | 2724,63, | 2724,64, | 2724,65, | 2724,66, | 2724,67, | 2724,68, | 2724,69, | 2724,70, | 2724,71, | 2724,72, | 2724,73, | 2724,74, | 2724,75, | 2724,76, | 2724,77, | 2724,78, | 2724,79, | 2724,80, | 2724,81, | 2724,82, | 2724,83, | 2724,84, | 2724,85, | 2725,1, | 2725,2, | 2725,3, | 2725,4, | 2725,5, | 2725,6, | 2725,7, | 2725,8, | 2725,9, | 2725,10, | 2725,11, | 2725,12, | 2725,13, | 2725,14, | 2725,15, | 2725,16, | 2725,17, | 2725,18, | 2725,19, | 2725,20, | 2725,21, | 2725,22, | 2725,23, | 2725,24, | 2725,25, | 2725,26, | 2725,27, | 2725,28, | 2725,29, | 2725,30, | 2725,31, | 2725,32, | 2725,33, | 2725,34, | 2725,35, | 2725,36, | 2725,37, | 2725,38, | 2725,39, | 2725,40, | 2725,41, | 2725,42, | 2725,43, | 2725,44, | 2725,45, | 2725,46, | 2725,47, | 2725,48, | 2725,49, | 2725,50, | 2725,51, | 2725,52, | 2725,53, | 2725,54, | 2725,55, | 2725,56, | 2725,57, | 2725,58, | 2725,59, | 2725,60, | 2725,61, | 2725,62, | 2725,63, | 2725,64, | 2725,65, | 2725,66, | 2725,67, | 2725,68, | 2725,69, | 2725,70, | 2725,71, | 2725,72, | 2725,73, | 2725,74, | 2725,75, | 2725,76, | 2725,77, | 2725,78, | 2725,79, | 2725,80, | 2725,81, | 2725,82, | 2725,83, | 2725,84, | 2725,85, | 2726,1, | 2726,2, | 2726,3, | 2726,4, | 2726,5, | 2726,6, | 2726,7, | 2726,8, | 2726,9, | 2726,10, | 2726,11, | 2726,12, | 2726,13, | 2726,14, | 2726,15, | 2726,16, | 2726,17, | 2726,18, | 2726,19, | 2726,20, | 2726,21, | 2726,22, | 2726,23, | 2726,24, | 2726,25, | 2726,26, | 2726,27, | 2726,28, | 2726,29, | 2726,30, | 2726,31, | 2726,32, | 2726,33, | 2726,34, | 2726,35, | 2726,36, | 2726,37, | 2726,38, | 2726,39, | 2726,40, | 2726,41, | 2726,42, | 2726,43, | 2726,44, | 2726,45, | 2726,46, | 2726,47, | 2726,48, | 2726,49, | 2726,50, | 2726,51, | 2726,52, | 2726,53, | 2726,54, | 2726,55, | 2726,56, | 2726,57, | 2726,58, | 2726,59, | 2726,60, | 2726,61, | 2726,62, | 2726,63, | 2726,64, | 2726,65, | 2726,66, | 2726,67, | 2726,68, | 2726,69, | 2726,70, | 2726,71, | 2726,72, | 2726,73, | 2726,74, | 2726,75, | 2726,76, | 2726,77, | 2726,78, | 2726,79, | 2726,80, | 2726,81, | 2726,82, | 2726,83, | 2726,84, | 2726,85, | 2727,1, | 2727,2, | 2727,3, | 2727,4, | 2727,5, | 2727,6, | 2727,7, | 2727,8, | 2727,9, | 2727,10, | 2727,11, | 2727,12, | 2727,13, | 2727,14, | 2727,15, | 2727,16, | 2727,17, | 2727,18, | 2727,19, | 2727,20, | 2727,21, | 2727,22, | 2727,23, | 2727,24, | 2727,25, | 2727,26, | 2727,27, | 2727,28, | 2727,29, | 2727,30, | 2727,31, | 2727,32, | 2727,33, | 2727,34, | 2727,35, | 2727,36, | 2727,37, | 2727,38, | 2727,39, | 2727,40, | 2727,41, | 2727,42, | 2727,43, | 2727,44, | 2727,45, | 2727,46, | 2727,47, | 2727,48, | 2727,49, | 2727,50, | 2727,51, | 2727,52, | 2727,53, | 2727,54, | 2727,55, | 2727,56, | 2727,57, | 2727,58, | 2727,59, | 2727,60, | 2727,61, | 2727,62, | 2727,63, | 2727,64, | 2727,65, | 2727,66, | 2727,67, | 2727,68, | 2727,69, | 2727,70, | 2727,71, | 2727,72, | 2727,73, | 2727,74, | 2727,75, | 2727,76, | 2727,77, | 2727,78, | 2727,79, | 2727,80, | 2727,81, | 2727,82, | 2727,83, | 2727,84, | 2727,85, | 2728,1, | 2728,2, | 2728,3, | 2728,4, | 2728,5, | 2728,6, | 2728,7, | 2728,8, | 2728,9, | 2728,10, | 2728,11, | 2728,12, | 2728,13, | 2728,14, | 2728,15, | 2728,16, | 2728,17, | 2728,18, | 2728,19, | 2728,20, | 2728,21, | 2728,22, | 2728,23, | 2728,24, | 2728,25, | 2728,26, | 2728,27, | 2728,28, | 2728,29, | 2728,30, | 2728,31, | 2728,32, | 2728,33, | 2728,34, | 2728,35, | 2728,36, | 2728,37, | 2728,38, | 2728,39, | 2728,40, | 2728,41, | 2728,42, | 2728,43, | 2728,44, | 2728,45, | 2728,46, | 2728,47, | 2728,48, | 2728,49, | 2728,50, | 2728,51, | 2728,52, | 2728,53, | 2728,54, | 2728,55, | 2728,56, | 2728,57, | 2728,58, | 2728,59, | 2728,60, | 2728,61, | 2728,62, | 2728,63, | 2728,64, | 2728,65, | 2728,66, | 2728,67, | 2728,68, | 2728,69, | 2728,70, | 2728,71, | 2728,72, | 2728,73, | 2728,74, | 2728,75, | 2728,76, | 2728,77, | 2728,78, | 2728,79, | 2728,80, | 2728,81, | 2728,82, | 2728,83, | 2728,84, | 2728,85, | 2729,1, | 2729,2, | 2729,3, | 2729,4, | 2729,5, | 2729,6, | 2729,7, | 2729,8, | 2729,9, | 2729,10, | 2729,11, | 2729,12, | 2729,13, | 2729,14, | 2729,15, | 2729,16, | 2729,17, | 2729,18, | 2729,19, | 2729,20, | 2729,21, | 2729,22, | 2729,23, | 2729,24, | 2729,25, | 2729,26, | 2729,27, | 2729,28, | 2729,29, | 2729,30, | 2729,31, | 2729,32, | 2729,33, | 2729,34, | 2729,35, | 2729,36, | 2729,37, | 2729,38, | 2729,39, | 2729,40, | 2729,41, | 2729,42, | 2729,43, | 2729,44, | 2729,45, | 2729,46, | 2729,47, | 2729,48, | 2729,49, | 2729,50, | 2729,51, | 2729,52, | 2729,53, | 2729,54, | 2729,55, | 2729,56, | 2729,57, | 2729,58, | 2729,59, | 2729,60, | 2729,61, | 2729,62, | 2729,63, | 2729,64, | 2729,65, | 2729,66, | 2729,67, | 2729,68, | 2729,69, | 2729,70, | 2729,71, | 2729,72, | 2729,73, | 2729,74, | 2729,75, | 2729,76, | 2729,77, | 2729,78, | 2729,79, | 2729,80, | 2729,81, | 2729,82, | 2729,83, | 2729,84, | 2729,85, | 2730,1, | 2730,2, | 2730,3, | 2730,4, | 2730,5, | 2730,6, | 2730,7, | 2730,8, | 2730,9, | 2730,10, | 2730,11, | 2730,12, | 2730,13, | 2730,14, | 2730,15, | 2730,16, | 2730,17, | 2730,18, | 2730,19, | 2730,20, | 2730,21, | 2730,22, | 2730,23, | 2730,24, | 2730,25, | 2730,26, | 2730,27, | 2730,28, | 2730,29, | 2730,30, | 2730,31, | 2730,32, | 2730,33, | 2730,34, | 2730,35, | 2730,36, | 2730,37, | 2730,38, | 2730,39, | 2730,40, | 2730,41, | 2730,42, | 2730,43, | 2730,44, | 2730,45, | 2730,46, | 2730,47, | 2730,48, | 2730,49, | 2730,50, | 2730,51, | 2730,52, | 2730,53, | 2730,54, | 2730,55, | 2730,56, | 2730,57, | 2730,58, | 2730,59, | 2730,60, | 2730,61, | 2730,62, | 2730,63, | 2730,64, | 2730,65, | 2730,66, | 2730,67, | 2730,68, | 2730,69, | 2730,70, | 2730,71, | 2730,72, | 2730,73, | 2730,74, | 2730,75, | 2730,76, | 2730,77, | 2730,78, | 2730,79, | 2730,80, | 2730,81, | 2730,82, | 2730,83, | 2730,84, | 2730,85, | 2731,1, | 2731,2, | 2731,3, | 2731,4, | 2731,5, | 2731,6, | 2731,7, | 2731,8, | 2731,9, | 2731,10, | 2731,11, | 2731,12, | 2731,13, | 2731,14, | 2731,15, | 2731,16, | 2731,17, | 2731,18, | 2731,19, | 2731,20, | 2731,21, | 2731,22, | 2731,23, | 2731,24, | 2731,25, | 2731,26, | 2731,27, | 2731,28, | 2731,29, | 2731,30, | 2731,31, | 2731,32, | 2731,33, | 2731,34, | 2731,35, | 2731,36, | 2731,37, | 2731,38, | 2731,39, | 2731,40, | 2731,41, | 2731,42, | 2731,43, | 2731,44, | 2731,45, | 2731,46, | 2731,47, | 2731,48, | 2731,49, | 2731,50, | 2731,51, | 2731,52, | 2731,53, | 2731,54, | 2731,55, | 2731,56, | 2731,57, | 2731,58, | 2731,59, | 2731,60, | 2731,61, | 2731,62, | 2731,63, | 2731,64, | 2731,65, | 2731,66, | 2731,67, | 2731,68, | 2731,69, | 2731,70, | 2731,71, | 2731,72, | 2731,73, | 2731,74, | 2731,75, | 2731,76, | 2731,77, | 2731,78, | 2731,79, | 2731,80, | 2731,81, | 2731,82, | 2731,83, | 2731,84, | 2731,85, | 2732,1, | 2732,2, | 2732,3, | 2732,4, | 2732,5, | 2732,6, | 2732,7, | 2732,8, | 2732,9, | 2732,10, | 2732,11, | 2732,12, | 2732,13, | 2732,14, | 2732,15, | 2732,16, | 2732,17, | 2732,18, | 2732,19, | 2732,20, | 2732,21, | 2732,22, | 2732,23, | 2732,24, | 2732,25, | 2732,26, | 2732,27, | 2732,28, | 2732,29, | 2732,30, | 2732,31, | 2732,32, | 2732,33, | 2732,34, | 2732,35, | 2732,36, | 2732,37, | 2732,38, | 2732,39, | 2732,40, | 2732,41, | 2732,42, | 2732,43, | 2732,44, | 2732,45, | 2732,46, | 2732,47, | 2732,48, | 2732,49, | 2732,50, | 2732,51, | 2732,52, | 2732,53, | 2732,54, | 2732,55, | 2732,56, | 2732,57, | 2732,58, | 2732,59, | 2732,60, | 2732,61, | 2732,62, | 2732,63, | 2732,64, | 2732,65, | 2732,66, | 2732,67, | 2732,68, | 2732,69, | 2732,70, | 2732,71, | 2732,72, | 2732,73, | 2732,74, | 2732,75, | 2732,76, | 2732,77, | 2732,78, | 2732,79, | 2732,80, | 2732,81, | 2732,82, | 2732,83, | 2732,84, | 2732,85, | 2733,1, | 2733,2, | 2733,3, | 2733,4, | 2733,5, | 2733,6, | 2733,7, | 2733,8, | 2733,9, | 2733,10, | 2733,11, | 2733,12, | 2733,13, | 2733,14, | 2733,15, | 2733,16, | 2733,17, | 2733,18, | 2733,19, | 2733,20, | 2733,21, | 2733,22, | 2733,23, | 2733,24, | 2733,25, | 2733,26, | 2733,27, | 2733,28, | 2733,29, | 2733,30, | 2733,31, | 2733,32, | 2733,33, | 2733,34, | 2733,35, | 2733,36, | 2733,37, | 2733,38, | 2733,39, | 2733,40, | 2733,41, | 2733,42, | 2733,43, | 2733,44, | 2733,45, | 2733,46, | 2733,47, | 2733,48, | 2733,49, | 2733,50, | 2733,51, | 2733,52, | 2733,53, | 2733,54, | 2733,55, | 2733,56, | 2733,57, | 2733,58, | 2733,59, | 2733,60, | 2733,61, | 2733,62, | 2733,63, | 2733,64, | 2733,65, | 2733,66, | 2733,67, | 2733,68, | 2733,69, | 2733,70, | 2733,71, | 2733,72, | 2733,73, | 2733,74, | 2733,75, | 2733,76, | 2733,77, | 2733,78, | 2733,79, | 2733,80, | 2733,81, | 2733,82, | 2733,83, | 2733,84, | 2733,85, | 2734,1, | 2734,2, | 2734,3, | 2734,4, | 2734,5, | 2734,6, | 2734,7, | 2734,8, | 2734,9, | 2734,10, | 2734,11, | 2734,12, | 2734,13, | 2734,14, | 2734,15, | 2734,16, | 2734,17, | 2734,18, | 2734,19, | 2734,20, | 2734,21, | 2734,22, | 2734,23, | 2734,24, | 2734,25, | 2734,26, | 2734,27, | 2734,28, | 2734,29, | 2734,30, | 2734,31, | 2734,32, | 2734,33, | 2734,34, | 2734,35, | 2734,36, | 2734,37, | 2734,38, | 2734,39, | 2734,40, | 2734,41, | 2734,42, | 2734,43, | 2734,44, | 2734,45, | 2734,46, | 2734,47, | 2734,48, | 2734,49, | 2734,50, | 2734,51, | 2734,52, | 2734,53, | 2734,54, | 2734,55, | 2734,56, | 2734,57, | 2734,58, | 2734,59, | 2734,60, | 2734,61, | 2734,62, | 2734,63, | 2734,64, | 2734,65, | 2734,66, | 2734,67, | 2734,68, | 2734,69, | 2734,70, | 2734,71, | 2734,72, | 2734,73, | 2734,74, | 2734,75, | 2734,76, | 2734,77, | 2734,78, | 2734,79, | 2734,80, | 2734,81, | 2734,82, | 2734,83, | 2734,84, | 2734,85, | 2735,1, | 2735,2, | 2735,3, | 2735,4, | 2735,5, | 2735,6, | 2735,7, | 2735,8, | 2735,9, | 2735,10, | 2735,11, | 2735,12, | 2735,13, | 2735,14, | 2735,15, | 2735,16, | 2735,17, | 2735,18, | 2735,19, | 2735,20, | 2735,21, | 2735,22, | 2735,23, | 2735,24, | 2735,25, | 2735,26, | 2735,27, | 2735,28, | 2735,29, | 2735,30, | 2735,31, | 2735,32, | 2735,33, | 2735,34, | 2735,35, | 2735,36, | 2735,37, | 2735,38, | 2735,39, | 2735,40, | 2735,41, | 2735,42, | 2735,43, | 2735,44, | 2735,45, | 2735,46, | 2735,47, | 2735,48, | 2735,49, | 2735,50, | 2735,51, | 2735,52, | 2735,53, | 2735,54, | 2735,55, | 2735,56, | 2735,57, | 2735,58, | 2735,59, | 2735,60, | 2735,61, | 2735,62, | 2735,63, | 2735,64, | 2735,65, | 2735,66, | 2735,67, | 2735,68, | 2735,69, | 2735,70, | 2735,71, | 2735,72, | 2735,73, | 2735,74, | 2735,75, | 2735,76, | 2735,77, | 2735,78, | 2735,79, | 2735,80, | 2735,81, | 2735,82, | 2735,83, | 2735,84, | 2735,85, | 2736,1, | 2736,2, | 2736,3, | 2736,4, | 2736,5, | 2736,6, | 2736,7, | 2736,8, | 2736,9, | 2736,10, | 2736,11, | 2736,12, | 2736,13, | 2736,14, | 2736,15, | 2736,16, | 2736,17, | 2736,18, | 2736,19, | 2736,20, | 2736,21, | 2736,22, | 2736,23, | 2736,24, | 2736,25, | 2736,26, | 2736,27, | 2736,28, | 2736,29, | 2736,30, | 2736,31, | 2736,32, | 2736,33, | 2736,34, | 2736,35, | 2736,36, | 2736,37, | 2736,38, | 2736,39, | 2736,40, | 2736,41, | 2736,42, | 2736,43, | 2736,44, | 2736,45, | 2736,46, | 2736,47, | 2736,48, | 2736,49, | 2736,50, | 2736,51, | 2736,52, | 2736,53, | 2736,54, | 2736,55, | 2736,56, | 2736,57, | 2736,58, | 2736,59, | 2736,60, | 2736,61, | 2736,62, | 2736,63, | 2736,64, | 2736,65, | 2736,66, | 2736,67, | 2736,68, | 2736,69, | 2736,70, | 2736,71, | 2736,72, | 2736,73, | 2736,74, | 2736,75, | 2736,76, | 2736,77, | 2736,78, | 2736,79, | 2736,80, | 2736,81, | 2736,82, | 2736,83, | 2736,84, | 2736,85, | 2737,1, | 2737,2, | 2737,3, | 2737,4, | 2737,5, | 2737,6, | 2737,7, | 2737,8, | 2737,9, | 2737,10, | 2737,11, | 2737,12, | 2737,13, | 2737,14, | 2737,15, | 2737,16, | 2737,17, | 2737,18, | 2737,19, | 2737,20, | 2737,21, | 2737,22, | 2737,23, | 2737,24, | 2737,25, | 2737,26, | 2737,27, | 2737,28, | 2737,29, | 2737,30, | 2737,31, | 2737,32, | 2737,33, | 2737,34, | 2737,35, | 2737,36, | 2737,37, | 2737,38, | 2737,39, | 2737,40, | 2737,41, | 2737,42, | 2737,43, | 2737,44, | 2737,45, | 2737,46, | 2737,47, | 2737,48, | 2737,49, | 2737,50, | 2737,51, | 2737,52, | 2737,53, | 2737,54, | 2737,55, | 2737,56, | 2737,57, | 2737,58, | 2737,59, | 2737,60, | 2737,61, | 2737,62, | 2737,63, | 2737,64, | 2737,65, | 2737,66, | 2737,67, | 2737,68, | 2737,69, | 2737,70, | 2737,71, | 2737,72, | 2737,73, | 2737,74, | 2737,75, | 2737,76, | 2737,77, | 2737,78, | 2737,79, | 2737,80, | 2737,81, | 2737,82, | 2737,83, | 2737,84, | 2737,85, | 2738,1, | 2738,2, | 2738,3, | 2738,4, | 2738,5, | 2738,6, | 2738,7, | 2738,8, | 2738,9, | 2738,10, | 2738,11, | 2738,12, | 2738,13, | 2738,14, | 2738,15, | 2738,16, | 2738,17, | 2738,18, | 2738,19, | 2738,20, | 2738,21, | 2738,22, | 2738,23, | 2738,24, | 2738,25, | 2738,26, | 2738,27, | 2738,28, | 2738,29, | 2738,30, | 2738,31, | 2738,32, | 2738,33, | 2738,34, | 2738,35, | 2738,36, | 2738,37, | 2738,38, | 2738,39, | 2738,40, | 2738,41, | 2738,42, | 2738,43, | 2738,44, | 2738,45, | 2738,46, | 2738,47, | 2738,48, | 2738,49, | 2738,50, | 2738,51, | 2738,52, | 2738,53, | 2738,54, | 2738,55, | 2738,56, | 2738,57, | 2738,58, | 2738,59, | 2738,60, | 2738,61, | 2738,62, | 2738,63, | 2738,64, | 2738,65, | 2738,66, | 2738,67, | 2738,68, | 2738,69, | 2738,70, | 2738,71, | 2738,72, | 2738,73, | 2738,74, | 2738,75, | 2738,76, | 2738,77, | 2738,78, | 2738,79, | 2738,80, | 2738,81, | 2738,82, | 2738,83, | 2738,84, | 2738,85, | 2739,1, | 2739,2, | 2739,3, | 2739,4, | 2739,5, | 2739,6, | 2739,7, | 2739,8, | 2739,9, | 2739,10, | 2739,11, | 2739,12, | 2739,13, | 2739,14, | 2739,15, | 2739,16, | 2739,17, | 2739,18, | 2739,19, | 2739,20, | 2739,21, | 2739,22, | 2739,23, | 2739,24, | 2739,25, | 2739,26, | 2739,27, | 2739,28, | 2739,29, | 2739,30, | 2739,31, | 2739,32, | 2739,33, | 2739,34, | 2739,35, | 2739,36, | 2739,37, | 2739,38, | 2739,39, | 2739,40, | 2739,41, | 2739,42, | 2739,43, | 2739,44, | 2739,45, | 2739,46, | 2739,47, | 2739,48, | 2739,49, | 2739,50, | 2739,51, | 2739,52, | 2739,53, | 2739,54, | 2739,55, | 2739,56, | 2739,57, | 2739,58, | 2739,59, | 2739,60, | 2739,61, | 2739,62, | 2739,63, | 2739,64, | 2739,65, | 2739,66, | 2739,67, | 2739,68, | 2739,69, | 2739,70, | 2739,71, | 2739,72, | 2739,73, | 2739,74, | 2739,75, | 2739,76, | 2739,77, | 2739,78, | 2739,79, | 2739,80, | 2739,81, | 2739,82, | 2739,83, | 2739,84, | 2739,85, | 2740,1, | 2740,2, | 2740,3, | 2740,4, | 2740,5, | 2740,6, | 2740,7, | 2740,8, | 2740,9, | 2740,10, | 2740,11, | 2740,12, | 2740,13, | 2740,14, | 2740,15, | 2740,16, | 2740,17, | 2740,18, | 2740,19, | 2740,20, | 2740,21, | 2740,22, | 2740,23, | 2740,24, | 2740,25, | 2740,26, | 2740,27, | 2740,28, | 2740,29, | 2740,30, | 2740,31, | 2740,32, | 2740,33, | 2740,34, | 2740,35, | 2740,36, | 2740,37, | 2740,38, | 2740,39, | 2740,40, | 2740,41, | 2740,42, | 2740,43, | 2740,44, | 2740,45, | 2740,46, | 2740,47, | 2740,48, | 2740,49, | 2740,50, | 2740,51, | 2740,52, | 2740,53, | 2740,54, | 2740,55, | 2740,56, | 2740,57, | 2740,58, | 2740,59, | 2740,60, | 2740,61, | 2740,62, | 2740,63, | 2740,64, | 2740,65, | 2740,66, | 2740,67, | 2740,68, | 2740,69, | 2740,70, | 2740,71, | 2740,72, | 2740,73, | 2740,74, | 2740,75, | 2740,76, | 2740,77, | 2740,78, | 2740,79, | 2740,80, | 2740,81, | 2740,82, | 2740,83, | 2740,84, | 2740,85, | 2741,1, | 2741,2, | 2741,3, | 2741,4, | 2741,5, | 2741,6, | 2741,7, | 2741,8, | 2741,9, | 2741,10, | 2741,11, | 2741,12, | 2741,13, | 2741,14, | 2741,15, | 2741,16, | 2741,17, | 2741,18, | 2741,19, | 2741,20, | 2741,21, | 2741,22, | 2741,23, | 2741,24, | 2741,25, | 2741,26, | 2741,27, | 2741,28, | 2741,29, | 2741,30, | 2741,31, | 2741,32, | 2741,33, | 2741,34, | 2741,35, | 2741,36, | 2741,37, | 2741,38, | 2741,39, | 2741,40, | 2741,41, | 2741,42, | 2741,43, | 2741,44, | 2741,45, | 2741,46, | 2741,47, | 2741,48, | 2741,49, | 2741,50, | 2741,51, | 2741,52, | 2741,53, | 2741,54, | 2741,55, | 2741,56, | 2741,57, | 2741,58, | 2741,59, | 2741,60, | 2741,61, | 2741,62, | 2741,63, | 2741,64, | 2741,65, | 2741,66, | 2741,67, | 2741,68, | 2741,69, | 2741,70, | 2741,71, | 2741,72, | 2741,73, | 2741,74, | 2741,75, | 2741,76, | 2741,77, | 2741,78, | 2741,79, | 2741,80, | 2741,81, | 2741,82, | 2741,83, | 2741,84, | 2741,85, | 2742,1, | 2742,2, | 2742,3, | 2742,4, | 2742,5, | 2742,6, | 2742,7, | 2742,8, | 2742,9, | 2742,10, | 2742,11, | 2742,12, | 2742,13, | 2742,14, | 2742,15, | 2742,16, | 2742,17, | 2742,18, | 2742,19, | 2742,20, | 2742,21, | 2742,22, | 2742,23, | 2742,24, | 2742,25, | 2742,26, | 2742,27, | 2742,28, | 2742,29, | 2742,30, | 2742,31, | 2742,32, | 2742,33, | 2742,34, | 2742,35, | 2742,36, | 2742,37, | 2742,38, | 2742,39, | 2742,40, | 2742,41, | 2742,42, | 2742,43, | 2742,44, | 2742,45, | 2742,46, | 2742,47, | 2742,48, | 2742,49, | 2742,50, | 2742,51, | 2742,52, | 2742,53, | 2742,54, | 2742,55, | 2742,56, | 2742,57, | 2742,58, | 2742,59, | 2742,60, | 2742,61, | 2742,62, | 2742,63, | 2742,64, | 2742,65, | 2742,66, | 2742,67, | 2742,68, | 2742,69, | 2742,70, | 2742,71, | 2742,72, | 2742,73, | 2742,74, | 2742,75, | 2742,76, | 2742,77, | 2742,78, | 2742,79, | 2742,80, | 2742,81, | 2742,82, | 2742,83, | 2742,84, | 2742,85, | 2743,1, | 2743,2, | 2743,3, | 2743,4, | 2743,5, | 2743,6, | 2743,7, | 2743,8, | 2743,9, | 2743,10, | 2743,11, | 2743,12, | 2743,13, | 2743,14, | 2743,15, | 2743,16, | 2743,17, | 2743,18, | 2743,19, | 2743,20, | 2743,21, | 2743,22, | 2743,23, | 2743,24, | 2743,25, | 2743,26, | 2743,27, | 2743,28, | 2743,29, | 2743,30, | 2743,31, | 2743,32, | 2743,33, | 2743,34, | 2743,35, | 2743,36, | 2743,37, | 2743,38, | 2743,39, | 2743,40, | 2743,41, | 2743,42, | 2743,43, | 2743,44, | 2743,45, | 2743,46, | 2743,47, | 2743,48, | 2743,49, | 2743,50, | 2743,51, | 2743,52, | 2743,53, | 2743,54, | 2743,55, | 2743,56, | 2743,57, | 2743,58, | 2743,59, | 2743,60, | 2743,61, | 2743,62, | 2743,63, | 2743,64, | 2743,65, | 2743,66, | 2743,67, | 2743,68, | 2743,69, | 2743,70, | 2743,71, | 2743,72, | 2743,73, | 2743,74, | 2743,75, | 2743,76, | 2743,77, | 2743,78, | 2743,79, | 2743,80, | 2743,81, | 2743,82, | 2743,83, | 2743,84, | 2743,85, | 2744,1, | 2744,2, | 2744,3, | 2744,4, | 2744,5, | 2744,6, | 2744,7, | 2744,8, | 2744,9, | 2744,10, | 2744,11, | 2744,12, | 2744,13, | 2744,14, | 2744,15, | 2744,16, | 2744,17, | 2744,18, | 2744,19, | 2744,20, | 2744,21, | 2744,22, | 2744,23, | 2744,24, | 2744,25, | 2744,26, | 2744,27, | 2744,28, | 2744,29, | 2744,30, | 2744,31, | 2744,32, | 2744,33, | 2744,34, | 2744,35, | 2744,36, | 2744,37, | 2744,38, | 2744,39, | 2744,40, | 2744,41, | 2744,42, | 2744,43, | 2744,44, | 2744,45, | 2744,46, | 2744,47, | 2744,48, | 2744,49, | 2744,50, | 2744,51, | 2744,52, | 2744,53, | 2744,54, | 2744,55, | 2744,56, | 2744,57, | 2744,58, | 2744,59, | 2744,60, | 2744,61, | 2744,62, | 2744,63, | 2744,64, | 2744,65, | 2744,66, | 2744,67, | 2744,68, | 2744,69, | 2744,70, | 2744,71, | 2744,72, | 2744,73, | 2744,74, | 2744,75, | 2744,76, | 2744,77, | 2744,78, | 2744,79, | 2744,80, | 2744,81, | 2744,82, | 2744,83, | 2744,84, | 2744,85, | 2745,1, | 2745,2, | 2745,3, | 2745,4, | 2745,5, | 2745,6, | 2745,7, | 2745,8, | 2745,9, | 2745,10, | 2745,11, | 2745,12, | 2745,13, | 2745,14, | 2745,15, | 2745,16, | 2745,17, | 2745,18, | 2745,19, | 2745,20, | 2745,21, | 2745,22, | 2745,23, | 2745,24, | 2745,25, | 2745,26, | 2745,27, | 2745,28, | 2745,29, | 2745,30, | 2745,31, | 2745,32, | 2745,33, | 2745,34, | 2745,35, | 2745,36, | 2745,37, | 2745,38, | 2745,39, | 2745,40, | 2745,41, | 2745,42, | 2745,43, | 2745,44, | 2745,45, | 2745,46, | 2745,47, | 2745,48, | 2745,49, | 2745,50, | 2745,51, | 2745,52, | 2745,53, | 2745,54, | 2745,55, | 2745,56, | 2745,57, | 2745,58, | 2745,59, | 2745,60, | 2745,61, | 2745,62, | 2745,63, | 2745,64, | 2745,65, | 2745,66, | 2745,67, | 2745,68, | 2745,69, | 2745,70, | 2745,71, | 2745,72, | 2745,73, | 2745,74, | 2745,75, | 2745,76, | 2745,77, | 2745,78, | 2745,79, | 2745,80, | 2745,81, | 2745,82, | 2745,83, | 2745,84, | 2745,85, | 2746,1, | 2746,2, | 2746,3, | 2746,4, | 2746,5, | 2746,6, | 2746,7, | 2746,8, | 2746,9, | 2746,10, | 2746,11, | 2746,12, | 2746,13, | 2746,14, | 2746,15, | 2746,16, | 2746,17, | 2746,18, | 2746,19, | 2746,20, | 2746,21, | 2746,22, | 2746,23, | 2746,24, | 2746,25, | 2746,26, | 2746,27, | 2746,28, | 2746,29, | 2746,30, | 2746,31, | 2746,32, | 2746,33, | 2746,34, | 2746,35, | 2746,36, | 2746,37, | 2746,38, | 2746,39, | 2746,40, | 2746,41, | 2746,42, | 2746,43, | 2746,44, | 2746,45, | 2746,46, | 2746,47, | 2746,48, | 2746,49, | 2746,50, | 2746,51, | 2746,52, | 2746,53, | 2746,54, | 2746,55, | 2746,56, | 2746,57, | 2746,58, | 2746,59, | 2746,60, | 2746,61, | 2746,62, | 2746,63, | 2746,64, | 2746,65, | 2746,66, | 2746,67, | 2746,68, | 2746,69, | 2746,70, | 2746,71, | 2746,72, | 2746,73, | 2746,74, | 2746,75, | 2746,76, | 2746,77, | 2746,78, | 2746,79, | 2746,80, | 2746,81, | 2746,82, | 2746,83, | 2746,84, | 2746,85, | 2747,1, | 2747,2, | 2747,3, | 2747,4, | 2747,5, | 2747,6, | 2747,7, | 2747,8, | 2747,9, | 2747,10, | 2747,11, | 2747,12, | 2747,13, | 2747,14, | 2747,15, | 2747,16, | 2747,17, | 2747,18, | 2747,19, | 2747,20, | 2747,21, | 2747,22, | 2747,23, | 2747,24, | 2747,25, | 2747,26, | 2747,27, | 2747,28, | 2747,29, | 2747,30, | 2747,31, | 2747,32, | 2747,33, | 2747,34, | 2747,35, | 2747,36, | 2747,37, | 2747,38, | 2747,39, | 2747,40, | 2747,41, | 2747,42, | 2747,43, | 2747,44, | 2747,45, | 2747,46, | 2747,47, | 2747,48, | 2747,49, | 2747,50, | 2747,51, | 2747,52, | 2747,53, | 2747,54, | 2747,55, | 2747,56, | 2747,57, | 2747,58, | 2747,59, | 2747,60, | 2747,61, | 2747,62, | 2747,63, | 2747,64, | 2747,65, | 2747,66, | 2747,67, | 2747,68, | 2747,69, | 2747,70, | 2747,71, | 2747,72, | 2747,73, | 2747,74, | 2747,75, | 2747,76, | 2747,77, | 2747,78, | 2747,79, | 2747,80, | 2747,81, | 2747,82, | 2747,83, | 2747,84, | 2747,85, | 2748,1, | 2748,2, | 2748,3, | 2748,4, | 2748,5, | 2748,6, | 2748,7, | 2748,8, | 2748,9, | 2748,10, | 2748,11, | 2748,12, | 2748,13, | 2748,14, | 2748,15, | 2748,16, | 2748,17, | 2748,18, | 2748,19, | 2748,20, | 2748,21, | 2748,22, | 2748,23, | 2748,24, | 2748,25, | 2748,26, | 2748,27, | 2748,28, | 2748,29, | 2748,30, | 2748,31, | 2748,32, | 2748,33, | 2748,34, | 2748,35, | 2748,36, | 2748,37, | 2748,38, | 2748,39, | 2748,40, | 2748,41, | 2748,42, | 2748,43, | 2748,44, | 2748,45, | 2748,46, | 2748,47, | 2748,48, | 2748,49, | 2748,50, | 2748,51, | 2748,52, | 2748,53, | 2748,54, | 2748,55, | 2748,56, | 2748,57, | 2748,58, | 2748,59, | 2748,60, | 2748,61, | 2748,62, | 2748,63, | 2748,64, | 2748,65, | 2748,66, | 2748,67, | 2748,68, | 2748,69, | 2748,70, | 2748,71, | 2748,72, | 2748,73, | 2748,74, | 2748,75, | 2748,76, | 2748,77, | 2748,78, | 2748,79, | 2748,80, | 2748,81, | 2748,82, | 2748,83, | 2748,84, | 2748,85, | 2749,1, | 2749,2, | 2749,3, | 2749,4, | 2749,5, | 2749,6, | 2749,7, | 2749,8, | 2749,9, | 2749,10, | 2749,11, | 2749,12, | 2749,13, | 2749,14, | 2749,15, | 2749,16, | 2749,17, | 2749,18, | 2749,19, | 2749,20, | 2749,21, | 2749,22, | 2749,23, | 2749,24, | 2749,25, | 2749,26, | 2749,27, | 2749,28, | 2749,29, | 2749,30, | 2749,31, | 2749,32, | 2749,33, | 2749,34, | 2749,35, | 2749,36, | 2749,37, | 2749,38, | 2749,39, | 2749,40, | 2749,41, | 2749,42, | 2749,43, | 2749,44, | 2749,45, | 2749,46, | 2749,47, | 2749,48, | 2749,49, | 2749,50, | 2749,51, | 2749,52, | 2749,53, | 2749,54, | 2749,55, | 2749,56, | 2749,57, | 2749,58, | 2749,59, | 2749,60, | 2749,61, | 2749,62, | 2749,63, | 2749,64, | 2749,65, | 2749,66, | 2749,67, | 2749,68, | 2749,69, | 2749,70, | 2749,71, | 2749,72, | 2749,73, | 2749,74, | 2749,75, | 2749,76, | 2749,77, | 2749,78, | 2749,79, | 2749,80, | 2749,81, | 2749,82, | 2749,83, | 2749,84, | 2749,85, | 2750,1, | 2750,2, | 2750,3, | 2750,4, | 2750,5, | 2750,6, | 2750,7, | 2750,8, | 2750,9, | 2750,10, | 2750,11, | 2750,12, | 2750,13, | 2750,14, | 2750,15, | 2750,16, | 2750,17, | 2750,18, | 2750,19, | 2750,20, | 2750,21, | 2750,22, | 2750,23, | 2750,24, | 2750,25, | 2750,26, | 2750,27, | 2750,28, | 2750,29, | 2750,30, | 2750,31, | 2750,32, | 2750,33, | 2750,34, | 2750,35, | 2750,36, | 2750,37, | 2750,38, | 2750,39, | 2750,40, | 2750,41, | 2750,42, | 2750,43, | 2750,44, | 2750,45, | 2750,46, | 2750,47, | 2750,48, | 2750,49, | 2750,50, | 2750,51, | 2750,52, | 2750,53, | 2750,54, | 2750,55, | 2750,56, | 2750,57, | 2750,58, | 2750,59, | 2750,60, | 2750,61, | 2750,62, | 2750,63, | 2750,64, | 2750,65, | 2750,66, | 2750,67, | 2750,68, | 2750,69, | 2750,70, | 2750,71, | 2750,72, | 2750,73, | 2750,74, | 2750,75, | 2750,76, | 2750,77, | 2750,78, | 2750,79, | 2750,80, | 2750,81, | 2750,82, | 2750,83, | 2750,84, | 2750,85, | 2751,1, | 2751,2, | 2751,3, | 2751,4, | 2751,5, | 2751,6, | 2751,7, | 2751,8, | 2751,9, | 2751,10, | 2751,11, | 2751,12, | 2751,13, | 2751,14, | 2751,15, | 2751,16, | 2751,17, | 2751,18, | 2751,19, | 2751,20, | 2751,21, | 2751,22, | 2751,23, | 2751,24, | 2751,25, | 2751,26, | 2751,27, | 2751,28, | 2751,29, | 2751,30, | 2751,31, | 2751,32, | 2751,33, | 2751,34, | 2751,35, | 2751,36, | 2751,37, | 2751,38, | 2751,39, | 2751,40, | 2751,41, | 2751,42, | 2751,43, | 2751,44, | 2751,45, | 2751,46, | 2751,47, | 2751,48, | 2751,49, | 2751,50, | 2751,51, | 2751,52, | 2751,53, | 2751,54, | 2751,55, | 2751,56, | 2751,57, | 2751,58, | 2751,59, | 2751,60, | 2751,61, | 2751,62, | 2751,63, | 2751,64, | 2751,65, | 2751,66, | 2751,67, | 2751,68, | 2751,69, | 2751,70, | 2751,71, | 2751,72, | 2751,73, | 2751,74, | 2751,75, | 2751,76, | 2751,77, | 2751,78, | 2751,79, | 2751,80, | 2751,81, | 2751,82, | 2751,83, | 2751,84, | 2751,85, | 2752,1, | 2752,2, | 2752,3, | 2752,4, | 2752,5, | 2752,6, | 2752,7, | 2752,8, | 2752,9, | 2752,10, | 2752,11, | 2752,12, | 2752,13, | 2752,14, | 2752,15, | 2752,16, | 2752,17, | 2752,18, | 2752,19, | 2752,20, | 2752,21, | 2752,22, | 2752,23, | 2752,24, | 2752,25, | 2752,26, | 2752,27, | 2752,28, | 2752,29, | 2752,30, | 2752,31, | 2752,32, | 2752,33, | 2752,34, | 2752,35, | 2752,36, | 2752,37, | 2752,38, | 2752,39, | 2752,40, | 2752,41, | 2752,42, | 2752,43, | 2752,44, | 2752,45, | 2752,46, | 2752,47, | 2752,48, | 2752,49, | 2752,50, | 2752,51, | 2752,52, | 2752,53, | 2752,54, | 2752,55, | 2752,56, | 2752,57, | 2752,58, | 2752,59, | 2752,60, | 2752,61, | 2752,62, | 2752,63, | 2752,64, | 2752,65, | 2752,66, | 2752,67, | 2752,68, | 2752,69, | 2752,70, | 2752,71, | 2752,72, | 2752,73, | 2752,74, | 2752,75, | 2752,76, | 2752,77, | 2752,78, | 2752,79, | 2752,80, | 2752,81, | 2752,82, | 2752,83, | 2752,84, | 2752,85, | 2753,1, | 2753,2, | 2753,3, | 2753,4, | 2753,5, | 2753,6, | 2753,7, | 2753,8, | 2753,9, | 2753,10, | 2753,11, | 2753,12, | 2753,13, | 2753,14, | 2753,15, | 2753,16, | 2753,17, | 2753,18, | 2753,19, | 2753,20, | 2753,21, | 2753,22, | 2753,23, | 2753,24, | 2753,25, | 2753,26, | 2753,27, | 2753,28, | 2753,29, | 2753,30, | 2753,31, | 2753,32, | 2753,33, | 2753,34, | 2753,35, | 2753,36, | 2753,37, | 2753,38, | 2753,39, | 2753,40, | 2753,41, | 2753,42, | 2753,43, | 2753,44, | 2753,45, | 2753,46, | 2753,47, | 2753,48, | 2753,49, | 2753,50, | 2753,51, | 2753,52, | 2753,53, | 2753,54, | 2753,55, | 2753,56, | 2753,57, | 2753,58, | 2753,59, | 2753,60, | 2753,61, | 2753,62, | 2753,63, | 2753,64, | 2753,65, | 2753,66, | 2753,67, | 2753,68, | 2753,69, | 2753,70, | 2753,71, | 2753,72, | 2753,73, | 2753,74, | 2753,75, | 2753,76, | 2753,77, | 2753,78, | 2753,79, | 2753,80, | 2753,81, | 2753,82, | 2753,83, | 2753,84, | 2753,85, | 2754,1, | 2754,2, | 2754,3, | 2754,4, | 2754,5, | 2754,6, | 2754,7, | 2754,8, | 2754,9, | 2754,10, | 2754,11, | 2754,12, | 2754,13, | 2754,14, | 2754,15, | 2754,16, | 2754,17, | 2754,18, | 2754,19, | 2754,20, | 2754,21, | 2754,22, | 2754,23, | 2754,24, | 2754,25, | 2754,26, | 2754,27, | 2754,28, | 2754,29, | 2754,30, | 2754,31, | 2754,32, | 2754,33, | 2754,34, | 2754,35, | 2754,36, | 2754,37, | 2754,38, | 2754,39, | 2754,40, | 2754,41, | 2754,42, | 2754,43, | 2754,44, | 2754,45, | 2754,46, | 2754,47, | 2754,48, | 2754,49, | 2754,50, | 2754,51, | 2754,52, | 2754,53, | 2754,54, | 2754,55, | 2754,56, | 2754,57, | 2754,58, | 2754,59, | 2754,60, | 2754,61, | 2754,62, | 2754,63, | 2754,64, | 2754,65, | 2754,66, | 2754,67, | 2754,68, | 2754,69, | 2754,70, | 2754,71, | 2754,72, | 2754,73, | 2754,74, | 2754,75, | 2754,76, | 2754,77, | 2754,78, | 2754,79, | 2754,80, | 2754,81, | 2754,82, | 2754,83, | 2754,84, | 2754,85, | 2755,1, | 2755,2, | 2755,3, | 2755,4, | 2755,5, | 2755,6, | 2755,7, | 2755,8, | 2755,9, | 2755,10, | 2755,11, | 2755,12, | 2755,13, | 2755,14, | 2755,15, | 2755,16, | 2755,17, | 2755,18, | 2755,19, | 2755,20, | 2755,21, | 2755,22, | 2755,23, | 2755,24, | 2755,25, | 2755,26, | 2755,27, | 2755,28, | 2755,29, | 2755,30, | 2755,31, | 2755,32, | 2755,33, | 2755,34, | 2755,35, | 2755,36, | 2755,37, | 2755,38, | 2755,39, | 2755,40, | 2755,41, | 2755,42, | 2755,43, | 2755,44, | 2755,45, | 2755,46, | 2755,47, | 2755,48, | 2755,49, | 2755,50, | 2755,51, | 2755,52, | 2755,53, | 2755,54, | 2755,55, | 2755,56, | 2755,57, | 2755,58, | 2755,59, | 2755,60, | 2755,61, | 2755,62, | 2755,63, | 2755,64, | 2755,65, | 2755,66, | 2755,67, | 2755,68, | 2755,69, | 2755,70, | 2755,71, | 2755,72, | 2755,73, | 2755,74, | 2755,75, | 2755,76, | 2755,77, | 2755,78, | 2755,79, | 2755,80, | 2755,81, | 2755,82, | 2755,83, | 2755,84, | 2755,85, | 2756,1, | 2756,2, | 2756,3, | 2756,4, | 2756,5, | 2756,6, | 2756,7, | 2756,8, | 2756,9, | 2756,10, | 2756,11, | 2756,12, | 2756,13, | 2756,14, | 2756,15, | 2756,16, | 2756,17, | 2756,18, | 2756,19, | 2756,20, | 2756,21, | 2756,22, | 2756,23, | 2756,24, | 2756,25, | 2756,26, | 2756,27, | 2756,28, | 2756,29, | 2756,30, | 2756,31, | 2756,32, | 2756,33, | 2756,34, | 2756,35, | 2756,36, | 2756,37, | 2756,38, | 2756,39, | 2756,40, | 2756,41, | 2756,42, | 2756,43, | 2756,44, | 2756,45, | 2756,46, | 2756,47, | 2756,48, | 2756,49, | 2756,50, | 2756,51, | 2756,52, | 2756,53, | 2756,54, | 2756,55, | 2756,56, | 2756,57, | 2756,58, | 2756,59, | 2756,60, | 2756,61, | 2756,62, | 2756,63, | 2756,64, | 2756,65, | 2756,66, | 2756,67, | 2756,68, | 2756,69, | 2756,70, | 2756,71, | 2756,72, | 2756,73, | 2756,74, | 2756,75, | 2756,76, | 2756,77, | 2756,78, | 2756,79, | 2756,80, | 2756,81, | 2756,82, | 2756,83, | 2756,84, | 2756,85, | 2757,1, | 2757,2, | 2757,3, | 2757,4, | 2757,5, | 2757,6, | 2757,7, | 2757,8, | 2757,9, | 2757,10, | 2757,11, | 2757,12, | 2757,13, | 2757,14, | 2757,15, | 2757,16, | 2757,17, | 2757,18, | 2757,19, | 2757,20, | 2757,21, | 2757,22, | 2757,23, | 2757,24, | 2757,25, | 2757,26, | 2757,27, | 2757,28, | 2757,29, | 2757,30, | 2757,31, | 2757,32, | 2757,33, | 2757,34, | 2757,35, | 2757,36, | 2757,37, | 2757,38, | 2757,39, | 2757,40, | 2757,41, | 2757,42, | 2757,43, | 2757,44, | 2757,45, | 2757,46, | 2757,47, | 2757,48, | 2757,49, | 2757,50, | 2757,51, | 2757,52, | 2757,53, | 2757,54, | 2757,55, | 2757,56, | 2757,57, | 2757,58, | 2757,59, | 2757,60, | 2757,61, | 2757,62, | 2757,63, | 2757,64, | 2757,65, | 2757,66, | 2757,67, | 2757,68, | 2757,69, | 2757,70, | 2757,71, | 2757,72, | 2757,73, | 2757,74, | 2757,75, | 2757,76, | 2757,77, | 2757,78, | 2757,79, | 2757,80, | 2757,81, | 2757,82, | 2757,83, | 2757,84, | 2757,85, | 2758,1, | 2758,2, | 2758,3, | 2758,4, | 2758,5, | 2758,6, | 2758,7, | 2758,8, | 2758,9, | 2758,10, | 2758,11, | 2758,12, | 2758,13, | 2758,14, | 2758,15, | 2758,16, | 2758,17, | 2758,18, | 2758,19, | 2758,20, | 2758,21, | 2758,22, | 2758,23, | 2758,24, | 2758,25, | 2758,26, | 2758,27, | 2758,28, | 2758,29, | 2758,30, | 2758,31, | 2758,32, | 2758,33, | 2758,34, | 2758,35, | 2758,36, | 2758,37, | 2758,38, | 2758,39, | 2758,40, | 2758,41, | 2758,42, | 2758,43, | 2758,44, | 2758,45, | 2758,46, | 2758,47, | 2758,48, | 2758,49, | 2758,50, | 2758,51, | 2758,52, | 2758,53, | 2758,54, | 2758,55, | 2758,56, | 2758,57, | 2758,58, | 2758,59, | 2758,60, | 2758,61, | 2758,62, | 2758,63, | 2758,64, | 2758,65, | 2758,66, | 2758,67, | 2758,68, | 2758,69, | 2758,70, | 2758,71, | 2758,72, | 2758,73, | 2758,74, | 2758,75, | 2758,76, | 2758,77, | 2758,78, | 2758,79, | 2758,80, | 2758,81, | 2758,82, | 2758,83, | 2758,84, | 2758,85, | 2759,1, | 2759,2, | 2759,3, | 2759,4, | 2759,5, | 2759,6, | 2759,7, | 2759,8, | 2759,9, | 2759,10, | 2759,11, | 2759,12, | 2759,13, | 2759,14, | 2759,15, | 2759,16, | 2759,17, | 2759,18, | 2759,19, | 2759,20, | 2759,21, | 2759,22, | 2759,23, | 2759,24, | 2759,25, | 2759,26, | 2759,27, | 2759,28, | 2759,29, | 2759,30, | 2759,31, | 2759,32, | 2759,33, | 2759,34, | 2759,35, | 2759,36, | 2759,37, | 2759,38, | 2759,39, | 2759,40, | 2759,41, | 2759,42, | 2759,43, | 2759,44, | 2759,45, | 2759,46, | 2759,47, | 2759,48, | 2759,49, | 2759,50, | 2759,51, | 2759,52, | 2759,53, | 2759,54, | 2759,55, | 2759,56, | 2759,57, | 2759,58, | 2759,59, | 2759,60, | 2759,61, | 2759,62, | 2759,63, | 2759,64, | 2759,65, | 2759,66, | 2759,67, | 2759,68, | 2759,69, | 2759,70, | 2759,71, | 2759,72, | 2759,73, | 2759,74, | 2759,75, | 2759,76, | 2759,77, | 2759,78, | 2759,79, | 2759,80, | 2759,81, | 2759,82, | 2759,83, | 2759,84, | 2759,85, | 2760,1, | 2760,2, | 2760,3, | 2760,4, | 2760,5, | 2760,6, | 2760,7, | 2760,8, | 2760,9, | 2760,10, | 2760,11, | 2760,12, | 2760,13, | 2760,14, | 2760,15, | 2760,16, | 2760,17, | 2760,18, | 2760,19, | 2760,20, | 2760,21, | 2760,22, | 2760,23, | 2760,24, | 2760,25, | 2760,26, | 2760,27, | 2760,28, | 2760,29, | 2760,30, | 2760,31, | 2760,32, | 2760,33, | 2760,34, | 2760,35, | 2760,36, | 2760,37, | 2760,38, | 2760,39, | 2760,40, | 2760,41, | 2760,42, | 2760,43, | 2760,44, | 2760,45, | 2760,46, | 2760,47, | 2760,48, | 2760,49, | 2760,50, | 2760,51, | 2760,52, | 2760,53, | 2760,54, | 2760,55, | 2760,56, | 2760,57, | 2760,58, | 2760,59, | 2760,60, | 2760,61, | 2760,62, | 2760,63, | 2760,64, | 2760,65, | 2760,66, | 2760,67, | 2760,68, | 2760,69, | 2760,70, | 2760,71, | 2760,72, | 2760,73, | 2760,74, | 2760,75, | 2760,76, | 2760,77, | 2760,78, | 2760,79, | 2760,80, | 2760,81, | 2760,82, | 2760,83, | 2760,84, | 2760,85, | 2761,1, | 2761,2, | 2761,3, | 2761,4, | 2761,5, | 2761,6, | 2761,7, | 2761,8, | 2761,9, | 2761,10, | 2761,11, | 2761,12, | 2761,13, | 2761,14, | 2761,15, | 2761,16, | 2761,17, | 2761,18, | 2761,19, | 2761,20, | 2761,21, | 2761,22, | 2761,23, | 2761,24, | 2761,25, | 2761,26, | 2761,27, | 2761,28, | 2761,29, | 2761,30, | 2761,31, | 2761,32, | 2761,33, | 2761,34, | 2761,35, | 2761,36, | 2761,37, | 2761,38, | 2761,39, | 2761,40, | 2761,41, | 2761,42, | 2761,43, | 2761,44, | 2761,45, | 2761,46, | 2761,47, | 2761,48, | 2761,49, | 2761,50, | 2761,51, | 2761,52, | 2761,53, | 2761,54, | 2761,55, | 2761,56, | 2761,57, | 2761,58, | 2761,59, | 2761,60, | 2761,61, | 2761,62, | 2761,63, | 2761,64, | 2761,65, | 2761,66, | 2761,67, | 2761,68, | 2761,69, | 2761,70, | 2761,71, | 2761,72, | 2761,73, | 2761,74, | 2761,75, | 2761,76, | 2761,77, | 2761,78, | 2761,79, | 2761,80, | 2761,81, | 2761,82, | 2761,83, | 2761,84, | 2761,85, | 2762,1, | 2762,2, | 2762,3, | 2762,4, | 2762,5, | 2762,6, | 2762,7, | 2762,8, | 2762,9, | 2762,10, | 2762,11, | 2762,12, | 2762,13, | 2762,14, | 2762,15, | 2762,16, | 2762,17, | 2762,18, | 2762,19, | 2762,20, | 2762,21, | 2762,22, | 2762,23, | 2762,24, | 2762,25, | 2762,26, | 2762,27, | 2762,28, | 2762,29, | 2762,30, | 2762,31, | 2762,32, | 2762,33, | 2762,34, | 2762,35, | 2762,36, | 2762,37, | 2762,38, | 2762,39, | 2762,40, | 2762,41, | 2762,42, | 2762,43, | 2762,44, | 2762,45, | 2762,46, | 2762,47, | 2762,48, | 2762,49, | 2762,50, | 2762,51, | 2762,52, | 2762,53, | 2762,54, | 2762,55, | 2762,56, | 2762,57, | 2762,58, | 2762,59, | 2762,60, | 2762,61, | 2762,62, | 2762,63, | 2762,64, | 2762,65, | 2762,66, | 2762,67, | 2762,68, | 2762,69, | 2762,70, | 2762,71, | 2762,72, | 2762,73, | 2762,74, | 2762,75, | 2762,76, | 2762,77, | 2762,78, | 2762,79, | 2762,80, | 2762,81, | 2762,82, | 2762,83, | 2762,84, | 2762,85, | 2763,1, | 2763,2, | 2763,3, | 2763,4, | 2763,5, | 2763,6, | 2763,7, | 2763,8, | 2763,9, | 2763,10, | 2763,11, | 2763,12, | 2763,13, | 2763,14, | 2763,15, | 2763,16, | 2763,17, | 2763,18, | 2763,19, | 2763,20, | 2763,21, | 2763,22, | 2763,23, | 2763,24, | 2763,25, | 2763,26, | 2763,27, | 2763,28, | 2763,29, | 2763,30, | 2763,31, | 2763,32, | 2763,33, | 2763,34, | 2763,35, | 2763,36, | 2763,37, | 2763,38, | 2763,39, | 2763,40, | 2763,41, | 2763,42, | 2763,43, | 2763,44, | 2763,45, | 2763,46, | 2763,47, | 2763,48, | 2763,49, | 2763,50, | 2763,51, | 2763,52, | 2763,53, | 2763,54, | 2763,55, | 2763,56, | 2763,57, | 2763,58, | 2763,59, | 2763,60, | 2763,61, | 2763,62, | 2763,63, | 2763,64, | 2763,65, | 2763,66, | 2763,67, | 2763,68, | 2763,69, | 2763,70, | 2763,71, | 2763,72, | 2763,73, | 2763,74, | 2763,75, | 2763,76, | 2763,77, | 2763,78, | 2763,79, | 2763,80, | 2763,81, | 2763,82, | 2763,83, | 2763,84, | 2763,85, | 2764,1, | 2764,2, | 2764,3, | 2764,4, | 2764,5, | 2764,6, | 2764,7, | 2764,8, | 2764,9, | 2764,10, | 2764,11, | 2764,12, | 2764,13, | 2764,14, | 2764,15, | 2764,16, | 2764,17, | 2764,18, | 2764,19, | 2764,20, | 2764,21, | 2764,22, | 2764,23, | 2764,24, | 2764,25, | 2764,26, | 2764,27, | 2764,28, | 2764,29, | 2764,30, | 2764,31, | 2764,32, | 2764,33, | 2764,34, | 2764,35, | 2764,36, | 2764,37, | 2764,38, | 2764,39, | 2764,40, | 2764,41, | 2764,42, | 2764,43, | 2764,44, | 2764,45, | 2764,46, | 2764,47, | 2764,48, | 2764,49, | 2764,50, | 2764,51, | 2764,52, | 2764,53, | 2764,54, | 2764,55, | 2764,56, | 2764,57, | 2764,58, | 2764,59, | 2764,60, | 2764,61, | 2764,62, | 2764,63, | 2764,64, | 2764,65, | 2764,66, | 2764,67, | 2764,68, | 2764,69, | 2764,70, | 2764,71, | 2764,72, | 2764,73, | 2764,74, | 2764,75, | 2764,76, | 2764,77, | 2764,78, | 2764,79, | 2764,80, | 2764,81, | 2764,82, | 2764,83, | 2764,84, | 2764,85, | 2765,1, | 2765,2, | 2765,3, | 2765,4, | 2765,5, | 2765,6, | 2765,7, | 2765,8, | 2765,9, | 2765,10, | 2765,11, | 2765,12, | 2765,13, | 2765,14, | 2765,15, | 2765,16, | 2765,17, | 2765,18, | 2765,19, | 2765,20, | 2765,21, | 2765,22, | 2765,23, | 2765,24, | 2765,25, | 2765,26, | 2765,27, | 2765,28, | 2765,29, | 2765,30, | 2765,31, | 2765,32, | 2765,33, | 2765,34, | 2765,35, | 2765,36, | 2765,37, | 2765,38, | 2765,39, | 2765,40, | 2765,41, | 2765,42, | 2765,43, | 2765,44, | 2765,45, | 2765,46, | 2765,47, | 2765,48, | 2765,49, | 2765,50, | 2765,51, | 2765,52, | 2765,53, | 2765,54, | 2765,55, | 2765,56, | 2765,57, | 2765,58, | 2765,59, | 2765,60, | 2765,61, | 2765,62, | 2765,63, | 2765,64, | 2765,65, | 2765,66, | 2765,67, | 2765,68, | 2765,69, | 2765,70, | 2765,71, | 2765,72, | 2765,73, | 2765,74, | 2765,75, | 2765,76, | 2765,77, | 2765,78, | 2765,79, | 2765,80, | 2765,81, | 2765,82, | 2765,83, | 2765,84, | 2765,85, | 2766,1, | 2766,2, | 2766,3, | 2766,4, | 2766,5, | 2766,6, | 2766,7, | 2766,8, | 2766,9, | 2766,10, | 2766,11, | 2766,12, | 2766,13, | 2766,14, | 2766,15, | 2766,16, | 2766,17, | 2766,18, | 2766,19, | 2766,20, | 2766,21, | 2766,22, | 2766,23, | 2766,24, | 2766,25, | 2766,26, | 2766,27, | 2766,28, | 2766,29, | 2766,30, | 2766,31, | 2766,32, | 2766,33, | 2766,34, | 2766,35, | 2766,36, | 2766,37, | 2766,38, | 2766,39, | 2766,40, | 2766,41, | 2766,42, | 2766,43, | 2766,44, | 2766,45, | 2766,46, | 2766,47, | 2766,48, | 2766,49, | 2766,50, | 2766,51, | 2766,52, | 2766,53, | 2766,54, | 2766,55, | 2766,56, | 2766,57, | 2766,58, | 2766,59, | 2766,60, | 2766,61, | 2766,62, | 2766,63, | 2766,64, | 2766,65, | 2766,66, | 2766,67, | 2766,68, | 2766,69, | 2766,70, | 2766,71, | 2766,72, | 2766,73, | 2766,74, | 2766,75, | 2766,76, | 2766,77, | 2766,78, | 2766,79, | 2766,80, | 2766,81, | 2766,82, | 2766,83, | 2766,84, | 2766,85, | 2767,1, | 2767,2, | 2767,3, | 2767,4, | 2767,5, | 2767,6, | 2767,7, | 2767,8, | 2767,9, | 2767,10, | 2767,11, | 2767,12, | 2767,13, | 2767,14, | 2767,15, | 2767,16, | 2767,17, | 2767,18, | 2767,19, | 2767,20, | 2767,21, | 2767,22, | 2767,23, | 2767,24, | 2767,25, | 2767,26, | 2767,27, | 2767,28, | 2767,29, | 2767,30, | 2767,31, | 2767,32, | 2767,33, | 2767,34, | 2767,35, | 2767,36, | 2767,37, | 2767,38, | 2767,39, | 2767,40, | 2767,41, | 2767,42, | 2767,43, | 2767,44, | 2767,45, | 2767,46, | 2767,47, | 2767,48, | 2767,49, | 2767,50, | 2767,51, | 2767,52, | 2767,53, | 2767,54, | 2767,55, | 2767,56, | 2767,57, | 2767,58, | 2767,59, | 2767,60, | 2767,61, | 2767,62, | 2767,63, | 2767,64, | 2767,65, | 2767,66, | 2767,67, | 2767,68, | 2767,69, | 2767,70, | 2767,71, | 2767,72, | 2767,73, | 2767,74, | 2767,75, | 2767,76, | 2767,77, | 2767,78, | 2767,79, | 2767,80, | 2767,81, | 2767,82, | 2767,83, | 2767,84, | 2767,85, | 2768,1, | 2768,2, | 2768,3, | 2768,4, | 2768,5, | 2768,6, | 2768,7, | 2768,8, | 2768,9, | 2768,10, | 2768,11, | 2768,12, | 2768,13, | 2768,14, | 2768,15, | 2768,16, | 2768,17, | 2768,18, | 2768,19, | 2768,20, | 2768,21, | 2768,22, | 2768,23, | 2768,24, | 2768,25, | 2768,26, | 2768,27, | 2768,28, | 2768,29, | 2768,30, | 2768,31, | 2768,32, | 2768,33, | 2768,34, | 2768,35, | 2768,36, | 2768,37, | 2768,38, | 2768,39, | 2768,40, | 2768,41, | 2768,42, | 2768,43, | 2768,44, | 2768,45, | 2768,46, | 2768,47, | 2768,48, | 2768,49, | 2768,50, | 2768,51, | 2768,52, | 2768,53, | 2768,54, | 2768,55, | 2768,56, | 2768,57, | 2768,58, | 2768,59, | 2768,60, | 2768,61, | 2768,62, | 2768,63, | 2768,64, | 2768,65, | 2768,66, | 2768,67, | 2768,68, | 2768,69, | 2768,70, | 2768,71, | 2768,72, | 2768,73, | 2768,74, | 2768,75, | 2768,76, | 2768,77, | 2768,78, | 2768,79, | 2768,80, | 2768,81, | 2768,82, | 2768,83, | 2768,84, | 2768,85, | 2769,1, | 2769,2, | 2769,3, | 2769,4, | 2769,5, | 2769,6, | 2769,7, | 2769,8, | 2769,9, | 2769,10, | 2769,11, | 2769,12, | 2769,13, | 2769,14, | 2769,15, | 2769,16, | 2769,17, | 2769,18, | 2769,19, | 2769,20, | 2769,21, | 2769,22, | 2769,23, | 2769,24, | 2769,25, | 2769,26, | 2769,27, | 2769,28, | 2769,29, | 2769,30, | 2769,31, | 2769,32, | 2769,33, | 2769,34, | 2769,35, | 2769,36, | 2769,37, | 2769,38, | 2769,39, | 2769,40, | 2769,41, | 2769,42, | 2769,43, | 2769,44, | 2769,45, | 2769,46, | 2769,47, | 2769,48, | 2769,49, | 2769,50, | 2769,51, | 2769,52, | 2769,53, | 2769,54, | 2769,55, | 2769,56, | 2769,57, | 2769,58, | 2769,59, | 2769,60, | 2769,61, | 2769,62, | 2769,63, | 2769,64, | 2769,65, | 2769,66, | 2769,67, | 2769,68, | 2769,69, | 2769,70, | 2769,71, | 2769,72, | 2769,73, | 2769,74, | 2769,75, | 2769,76, | 2769,77, | 2769,78, | 2769,79, | 2769,80, | 2769,81, | 2769,82, | 2769,83, | 2769,84, | 2769,85, | 2770,1, | 2770,2, | 2770,3, | 2770,4, | 2770,5, | 2770,6, | 2770,7, | 2770,8, | 2770,9, | 2770,10, | 2770,11, | 2770,12, | 2770,13, | 2770,14, | 2770,15, | 2770,16, | 2770,17, | 2770,18, | 2770,19, | 2770,20, | 2770,21, | 2770,22, | 2770,23, | 2770,24, | 2770,25, | 2770,26, | 2770,27, | 2770,28, | 2770,29, | 2770,30, | 2770,31, | 2770,32, | 2770,33, | 2770,34, | 2770,35, | 2770,36, | 2770,37, | 2770,38, | 2770,39, | 2770,40, | 2770,41, | 2770,42, | 2770,43, | 2770,44, | 2770,45, | 2770,46, | 2770,47, | 2770,48, | 2770,49, | 2770,50, | 2770,51, | 2770,52, | 2770,53, | 2770,54, | 2770,55, | 2770,56, | 2770,57, | 2770,58, | 2770,59, | 2770,60, | 2770,61, | 2770,62, | 2770,63, | 2770,64, | 2770,65, | 2770,66, | 2770,67, | 2770,68, | 2770,69, | 2770,70, | 2770,71, | 2770,72, | 2770,73, | 2770,74, | 2770,75, | 2770,76, | 2770,77, | 2770,78, | 2770,79, | 2770,80, | 2770,81, | 2770,82, | 2770,83, | 2770,84, | 2770,85, | 2771,1, | 2771,2, | 2771,3, | 2771,4, | 2771,5, | 2771,6, | 2771,7, | 2771,8, | 2771,9, | 2771,10, | 2771,11, | 2771,12, | 2771,13, | 2771,14, | 2771,15, | 2771,16, | 2771,17, | 2771,18, | 2771,19, | 2771,20, | 2771,21, | 2771,22, | 2771,23, | 2771,24, | 2771,25, | 2771,26, | 2771,27, | 2771,28, | 2771,29, | 2771,30, | 2771,31, | 2771,32, | 2771,33, | 2771,34, | 2771,35, | 2771,36, | 2771,37, | 2771,38, | 2771,39, | 2771,40, | 2771,41, | 2771,42, | 2771,43, | 2771,44, | 2771,45, | 2771,46, | 2771,47, | 2771,48, | 2771,49, | 2771,50, | 2771,51, | 2771,52, | 2771,53, | 2771,54, | 2771,55, | 2771,56, | 2771,57, | 2771,58, | 2771,59, | 2771,60, | 2771,61, | 2771,62, | 2771,63, | 2771,64, | 2771,65, | 2771,66, | 2771,67, | 2771,68, | 2771,69, | 2771,70, | 2771,71, | 2771,72, | 2771,73, | 2771,74, | 2771,75, | 2771,76, | 2771,77, | 2771,78, | 2771,79, | 2771,80, | 2771,81, | 2771,82, | 2771,83, | 2771,84, | 2771,85, | 2772,1, | 2772,2, | 2772,3, | 2772,4, | 2772,5, | 2772,6, | 2772,7, | 2772,8, | 2772,9, | 2772,10, | 2772,11, | 2772,12, | 2772,13, | 2772,14, | 2772,15, | 2772,16, | 2772,17, | 2772,18, | 2772,19, | 2772,20, | 2772,21, | 2772,22, | 2772,23, | 2772,24, | 2772,25, | 2772,26, | 2772,27, | 2772,28, | 2772,29, | 2772,30, | 2772,31, | 2772,32, | 2772,33, | 2772,34, | 2772,35, | 2772,36, | 2772,37, | 2772,38, | 2772,39, | 2772,40, | 2772,41, | 2772,42, | 2772,43, | 2772,44, | 2772,45, | 2772,46, | 2772,47, | 2772,48, | 2772,49, | 2772,50, | 2772,51, | 2772,52, | 2772,53, | 2772,54, | 2772,55, | 2772,56, | 2772,57, | 2772,58, | 2772,59, | 2772,60, | 2772,61, | 2772,62, | 2772,63, | 2772,64, | 2772,65, | 2772,66, | 2772,67, | 2772,68, | 2772,69, | 2772,70, | 2772,71, | 2772,72, | 2772,73, | 2772,74, | 2772,75, | 2772,76, | 2772,77, | 2772,78, | 2772,79, | 2772,80, | 2772,81, | 2772,82, | 2772,83, | 2772,84, | 2772,85, | 2773,1, | 2773,2, | 2773,3, | 2773,4, | 2773,5, | 2773,6, | 2773,7, | 2773,8, | 2773,9, | 2773,10, | 2773,11, | 2773,12, | 2773,13, | 2773,14, | 2773,15, | 2773,16, | 2773,17, | 2773,18, | 2773,19, | 2773,20, | 2773,21, | 2773,22, | 2773,23, | 2773,24, | 2773,25, | 2773,26, | 2773,27, | 2773,28, | 2773,29, | 2773,30, | 2773,31, | 2773,32, | 2773,33, | 2773,34, | 2773,35, | 2773,36, | 2773,37, | 2773,38, | 2773,39, | 2773,40, | 2773,41, | 2773,42, | 2773,43, | 2773,44, | 2773,45, | 2773,46, | 2773,47, | 2773,48, | 2773,49, | 2773,50, | 2773,51, | 2773,52, | 2773,53, | 2773,54, | 2773,55, | 2773,56, | 2773,57, | 2773,58, | 2773,59, | 2773,60, | 2773,61, | 2773,62, | 2773,63, | 2773,64, | 2773,65, | 2773,66, | 2773,67, | 2773,68, | 2773,69, | 2773,70, | 2773,71, | 2773,72, | 2773,73, | 2773,74, | 2773,75, | 2773,76, | 2773,77, | 2773,78, | 2773,79, | 2773,80, | 2773,81, | 2773,82, | 2773,83, | 2773,84, | 2773,85, | 2774,1, | 2774,2, | 2774,3, | 2774,4, | 2774,5, | 2774,6, | 2774,7, | 2774,8, | 2774,9, | 2774,10, | 2774,11, | 2774,12, | 2774,13, | 2774,14, | 2774,15, | 2774,16, | 2774,17, | 2774,18, | 2774,19, | 2774,20, | 2774,21, | 2774,22, | 2774,23, | 2774,24, | 2774,25, | 2774,26, | 2774,27, | 2774,28, | 2774,29, | 2774,30, | 2774,31, | 2774,32, | 2774,33, | 2774,34, | 2774,35, | 2774,36, | 2774,37, | 2774,38, | 2774,39, | 2774,40, | 2774,41, | 2774,42, | 2774,43, | 2774,44, | 2774,45, | 2774,46, | 2774,47, | 2774,48, | 2774,49, | 2774,50, | 2774,51, | 2774,52, | 2774,53, | 2774,54, | 2774,55, | 2774,56, | 2774,57, | 2774,58, | 2774,59, | 2774,60, | 2774,61, | 2774,62, | 2774,63, | 2774,64, | 2774,65, | 2774,66, | 2774,67, | 2774,68, | 2774,69, | 2774,70, | 2774,71, | 2774,72, | 2774,73, | 2774,74, | 2774,75, | 2774,76, | 2774,77, | 2774,78, | 2774,79, | 2774,80, | 2774,81, | 2774,82, | 2774,83, | 2774,84, | 2774,85, | 2775,1, | 2775,2, | 2775,3, | 2775,4, | 2775,5, | 2775,6, | 2775,7, | 2775,8, | 2775,9, | 2775,10, | 2775,11, | 2775,12, | 2775,13, | 2775,14, | 2775,15, | 2775,16, | 2775,17, | 2775,18, | 2775,19, | 2775,20, | 2775,21, | 2775,22, | 2775,23, | 2775,24, | 2775,25, | 2775,26, | 2775,27, | 2775,28, | 2775,29, | 2775,30, | 2775,31, | 2775,32, | 2775,33, | 2775,34, | 2775,35, | 2775,36, | 2775,37, | 2775,38, | 2775,39, | 2775,40, | 2775,41, | 2775,42, | 2775,43, | 2775,44, | 2775,45, | 2775,46, | 2775,47, | 2775,48, | 2775,49, | 2775,50, | 2775,51, | 2775,52, | 2775,53, | 2775,54, | 2775,55, | 2775,56, | 2775,57, | 2775,58, | 2775,59, | 2775,60, | 2775,61, | 2775,62, | 2775,63, | 2775,64, | 2775,65, | 2775,66, | 2775,67, | 2775,68, | 2775,69, | 2775,70, | 2775,71, | 2775,72, | 2775,73, | 2775,74, | 2775,75, | 2775,76, | 2775,77, | 2775,78, | 2775,79, | 2775,80, | 2775,81, | 2775,82, | 2775,83, | 2775,84, | 2775,85, | 2776,1, | 2776,2, | 2776,3, | 2776,4, | 2776,5, | 2776,6, | 2776,7, | 2776,8, | 2776,9, | 2776,10, | 2776,11, | 2776,12, | 2776,13, | 2776,14, | 2776,15, | 2776,16, | 2776,17, | 2776,18, | 2776,19, | 2776,20, | 2776,21, | 2776,22, | 2776,23, | 2776,24, | 2776,25, | 2776,26, | 2776,27, | 2776,28, | 2776,29, | 2776,30, | 2776,31, | 2776,32, | 2776,33, | 2776,34, | 2776,35, | 2776,36, | 2776,37, | 2776,38, | 2776,39, | 2776,40, | 2776,41, | 2776,42, | 2776,43, | 2776,44, | 2776,45, | 2776,46, | 2776,47, | 2776,48, | 2776,49, | 2776,50, | 2776,51, | 2776,52, | 2776,53, | 2776,54, | 2776,55, | 2776,56, | 2776,57, | 2776,58, | 2776,59, | 2776,60, | 2776,61, | 2776,62, | 2776,63, | 2776,64, | 2776,65, | 2776,66, | 2776,67, | 2776,68, | 2776,69, | 2776,70, | 2776,71, | 2776,72, | 2776,73, | 2776,74, | 2776,75, | 2776,76, | 2776,77, | 2776,78, | 2776,79, | 2776,80, | 2776,81, | 2776,82, | 2776,83, | 2776,84, | 2776,85, | 2777,1, | 2777,2, | 2777,3, | 2777,4, | 2777,5, | 2777,6, | 2777,7, | 2777,8, | 2777,9, | 2777,10, | 2777,11, | 2777,12, | 2777,13, | 2777,14, | 2777,15, | 2777,16, | 2777,17, | 2777,18, | 2777,19, | 2777,20, | 2777,21, | 2777,22, | 2777,23, | 2777,24, | 2777,25, | 2777,26, | 2777,27, | 2777,28, | 2777,29, | 2777,30, | 2777,31, | 2777,32, | 2777,33, | 2777,34, | 2777,35, | 2777,36, | 2777,37, | 2777,38, | 2777,39, | 2777,40, | 2777,41, | 2777,42, | 2777,43, | 2777,44, | 2777,45, | 2777,46, | 2777,47, | 2777,48, | 2777,49, | 2777,50, | 2777,51, | 2777,52, | 2777,53, | 2777,54, | 2777,55, | 2777,56, | 2777,57, | 2777,58, | 2777,59, | 2777,60, | 2777,61, | 2777,62, | 2777,63, | 2777,64, | 2777,65, | 2777,66, | 2777,67, | 2777,68, | 2777,69, | 2777,70, | 2777,71, | 2777,72, | 2777,73, | 2777,74, | 2777,75, | 2777,76, | 2777,77, | 2777,78, | 2777,79, | 2777,80, | 2777,81, | 2777,82, | 2777,83, | 2777,84, | 2777,85, | 2778,1, | 2778,2, | 2778,3, | 2778,4, | 2778,5, | 2778,6, | 2778,7, | 2778,8, | 2778,9, | 2778,10, | 2778,11, | 2778,12, | 2778,13, | 2778,14, | 2778,15, | 2778,16, | 2778,17, | 2778,18, | 2778,19, | 2778,20, | 2778,21, | 2778,22, | 2778,23, | 2778,24, | 2778,25, | 2778,26, | 2778,27, | 2778,28, | 2778,29, | 2778,30, | 2778,31, | 2778,32, | 2778,33, | 2778,34, | 2778,35, | 2778,36, | 2778,37, | 2778,38, | 2778,39, | 2778,40, | 2778,41, | 2778,42, | 2778,43, | 2778,44, | 2778,45, | 2778,46, | 2778,47, | 2778,48, | 2778,49, | 2778,50, | 2778,51, | 2778,52, | 2778,53, | 2778,54, | 2778,55, | 2778,56, | 2778,57, | 2778,58, | 2778,59, | 2778,60, | 2778,61, | 2778,62, | 2778,63, | 2778,64, | 2778,65, | 2778,66, | 2778,67, | 2778,68, | 2778,69, | 2778,70, | 2778,71, | 2778,72, | 2778,73, | 2778,74, | 2778,75, | 2778,76, | 2778,77, | 2778,78, | 2778,79, | 2778,80, | 2778,81, | 2778,82, | 2778,83, | 2778,84, | 2778,85, | 2779,1, | 2779,2, | 2779,3, | 2779,4, | 2779,5, | 2779,6, | 2779,7, | 2779,8, | 2779,9, | 2779,10, | 2779,11, | 2779,12, | 2779,13, | 2779,14, | 2779,15, | 2779,16, | 2779,17, | 2779,18, | 2779,19, | 2779,20, | 2779,21, | 2779,22, | 2779,23, | 2779,24, | 2779,25, | 2779,26, | 2779,27, | 2779,28, | 2779,29, | 2779,30, | 2779,31, | 2779,32, | 2779,33, | 2779,34, | 2779,35, | 2779,36, | 2779,37, | 2779,38, | 2779,39, | 2779,40, | 2779,41, | 2779,42, | 2779,43, | 2779,44, | 2779,45, | 2779,46, | 2779,47, | 2779,48, | 2779,49, | 2779,50, | 2779,51, | 2779,52, | 2779,53, | 2779,54, | 2779,55, | 2779,56, | 2779,57, | 2779,58, | 2779,59, | 2779,60, | 2779,61, | 2779,62, | 2779,63, | 2779,64, | 2779,65, | 2779,66, | 2779,67, | 2779,68, | 2779,69, | 2779,70, | 2779,71, | 2779,72, | 2779,73, | 2779,74, | 2779,75, | 2779,76, | 2779,77, | 2779,78, | 2779,79, | 2779,80, | 2779,81, | 2779,82, | 2779,83, | 2779,84, | 2779,85, | 2780,1, | 2780,2, | 2780,3, | 2780,4, | 2780,5, | 2780,6, | 2780,7, | 2780,8, | 2780,9, | 2780,10, | 2780,11, | 2780,12, | 2780,13, | 2780,14, | 2780,15, | 2780,16, | 2780,17, | 2780,18, | 2780,19, | 2780,20, | 2780,21, | 2780,22, | 2780,23, | 2780,24, | 2780,25, | 2780,26, | 2780,27, | 2780,28, | 2780,29, | 2780,30, | 2780,31, | 2780,32, | 2780,33, | 2780,34, | 2780,35, | 2780,36, | 2780,37, | 2780,38, | 2780,39, | 2780,40, | 2780,41, | 2780,42, | 2780,43, | 2780,44, | 2780,45, | 2780,46, | 2780,47, | 2780,48, | 2780,49, | 2780,50, | 2780,51, | 2780,52, | 2780,53, | 2780,54, | 2780,55, | 2780,56, | 2780,57, | 2780,58, | 2780,59, | 2780,60, | 2780,61, | 2780,62, | 2780,63, | 2780,64, | 2780,65, | 2780,66, | 2780,67, | 2780,68, | 2780,69, | 2780,70, | 2780,71, | 2780,72, | 2780,73, | 2780,74, | 2780,75, | 2780,76, | 2780,77, | 2780,78, | 2780,79, | 2780,80, | 2780,81, | 2780,82, | 2780,83, | 2780,84, | 2780,85, | 2781,1, | 2781,2, | 2781,3, | 2781,4, | 2781,5, | 2781,6, | 2781,7, | 2781,8, | 2781,9, | 2781,10, | 2781,11, | 2781,12, | 2781,13, | 2781,14, | 2781,15, | 2781,16, | 2781,17, | 2781,18, | 2781,19, | 2781,20, | 2781,21, | 2781,22, | 2781,23, | 2781,24, | 2781,25, | 2781,26, | 2781,27, | 2781,28, | 2781,29, | 2781,30, | 2781,31, | 2781,32, | 2781,33, | 2781,34, | 2781,35, | 2781,36, | 2781,37, | 2781,38, | 2781,39, | 2781,40, | 2781,41, | 2781,42, | 2781,43, | 2781,44, | 2781,45, | 2781,46, | 2781,47, | 2781,48, | 2781,49, | 2781,50, | 2781,51, | 2781,52, | 2781,53, | 2781,54, | 2781,55, | 2781,56, | 2781,57, | 2781,58, | 2781,59, | 2781,60, | 2781,61, | 2781,62, | 2781,63, | 2781,64, | 2781,65, | 2781,66, | 2781,67, | 2781,68, | 2781,69, | 2781,70, | 2781,71, | 2781,72, | 2781,73, | 2781,74, | 2781,75, | 2781,76, | 2781,77, | 2781,78, | 2781,79, | 2781,80, | 2781,81, | 2781,82, | 2781,83, | 2781,84, | 2781,85, | 2782,1, | 2782,2, | 2782,3, | 2782,4, | 2782,5, | 2782,6, | 2782,7, | 2782,8, | 2782,9, | 2782,10, | 2782,11, | 2782,12, | 2782,13, | 2782,14, | 2782,15, | 2782,16, | 2782,17, | 2782,18, | 2782,19, | 2782,20, | 2782,21, | 2782,22, | 2782,23, | 2782,24, | 2782,25, | 2782,26, | 2782,27, | 2782,28, | 2782,29, | 2782,30, | 2782,31, | 2782,32, | 2782,33, | 2782,34, | 2782,35, | 2782,36, | 2782,37, | 2782,38, | 2782,39, | 2782,40, | 2782,41, | 2782,42, | 2782,43, | 2782,44, | 2782,45, | 2782,46, | 2782,47, | 2782,48, | 2782,49, | 2782,50, | 2782,51, | 2782,52, | 2782,53, | 2782,54, | 2782,55, | 2782,56, | 2782,57, | 2782,58, | 2782,59, | 2782,60, | 2782,61, | 2782,62, | 2782,63, | 2782,64, | 2782,65, | 2782,66, | 2782,67, | 2782,68, | 2782,69, | 2782,70, | 2782,71, | 2782,72, | 2782,73, | 2782,74, | 2782,75, | 2782,76, | 2782,77, | 2782,78, | 2782,79, | 2782,80, | 2782,81, | 2782,82, | 2782,83, | 2782,84, | 2782,85, | 2783,1, | 2783,2, | 2783,3, | 2783,4, | 2783,5, | 2783,6, | 2783,7, | 2783,8, | 2783,9, | 2783,10, | 2783,11, | 2783,12, | 2783,13, | 2783,14, | 2783,15, | 2783,16, | 2783,17, | 2783,18, | 2783,19, | 2783,20, | 2783,21, | 2783,22, | 2783,23, | 2783,24, | 2783,25, | 2783,26, | 2783,27, | 2783,28, | 2783,29, | 2783,30, | 2783,31, | 2783,32, | 2783,33, | 2783,34, | 2783,35, | 2783,36, | 2783,37, | 2783,38, | 2783,39, | 2783,40, | 2783,41, | 2783,42, | 2783,43, | 2783,44, | 2783,45, | 2783,46, | 2783,47, | 2783,48, | 2783,49, | 2783,50, | 2783,51, | 2783,52, | 2783,53, | 2783,54, | 2783,55, | 2783,56, | 2783,57, | 2783,58, | 2783,59, | 2783,60, | 2783,61, | 2783,62, | 2783,63, | 2783,64, | 2783,65, | 2783,66, | 2783,67, | 2783,68, | 2783,69, | 2783,70, | 2783,71, | 2783,72, | 2783,73, | 2783,74, | 2783,75, | 2783,76, | 2783,77, | 2783,78, | 2783,79, | 2783,80, | 2783,81, | 2783,82, | 2783,83, | 2783,84, | 2783,85, | 2784,1, | 2784,2, | 2784,3, | 2784,4, | 2784,5, | 2784,6, | 2784,7, | 2784,8, | 2784,9, | 2784,10, | 2784,11, | 2784,12, | 2784,13, | 2784,14, | 2784,15, | 2784,16, | 2784,17, | 2784,18, | 2784,19, | 2784,20, | 2784,21, | 2784,22, | 2784,23, | 2784,24, | 2784,25, | 2784,26, | 2784,27, | 2784,28, | 2784,29, | 2784,30, | 2784,31, | 2784,32, | 2784,33, | 2784,34, | 2784,35, | 2784,36, | 2784,37, | 2784,38, | 2784,39, | 2784,40, | 2784,41, | 2784,42, | 2784,43, | 2784,44, | 2784,45, | 2784,46, | 2784,47, | 2784,48, | 2784,49, | 2784,50, | 2784,51, | 2784,52, | 2784,53, | 2784,54, | 2784,55, | 2784,56, | 2784,57, | 2784,58, | 2784,59, | 2784,60, | 2784,61, | 2784,62, | 2784,63, | 2784,64, | 2784,65, | 2784,66, | 2784,67, | 2784,68, | 2784,69, | 2784,70, | 2784,71, | 2784,72, | 2784,73, | 2784,74, | 2784,75, | 2784,76, | 2784,77, | 2784,78, | 2784,79, | 2784,80, | 2784,81, | 2784,82, | 2784,83, | 2784,84, | 2784,85, | 2785,1, | 2785,2, | 2785,3, | 2785,4, | 2785,5, | 2785,6, | 2785,7, | 2785,8, | 2785,9, | 2785,10, | 2785,11, | 2785,12, | 2785,13, | 2785,14, | 2785,15, | 2785,16, | 2785,17, | 2785,18, | 2785,19, | 2785,20, | 2785,21, | 2785,22, | 2785,23, | 2785,24, | 2785,25, | 2785,26, | 2785,27, | 2785,28, | 2785,29, | 2785,30, | 2785,31, | 2785,32, | 2785,33, | 2785,34, | 2785,35, | 2785,36, | 2785,37, | 2785,38, | 2785,39, | 2785,40, | 2785,41, | 2785,42, | 2785,43, | 2785,44, | 2785,45, | 2785,46, | 2785,47, | 2785,48, | 2785,49, | 2785,50, | 2785,51, | 2785,52, | 2785,53, | 2785,54, | 2785,55, | 2785,56, | 2785,57, | 2785,58, | 2785,59, | 2785,60, | 2785,61, | 2785,62, | 2785,63, | 2785,64, | 2785,65, | 2785,66, | 2785,67, | 2785,68, | 2785,69, | 2785,70, | 2785,71, | 2785,72, | 2785,73, | 2785,74, | 2785,75, | 2785,76, | 2785,77, | 2785,78, | 2785,79, | 2785,80, | 2785,81, | 2785,82, | 2785,83, | 2785,84, | 2785,85, | 2786,1, | 2786,2, | 2786,3, | 2786,4, | 2786,5, | 2786,6, | 2786,7, | 2786,8, | 2786,9, | 2786,10, | 2786,11, | 2786,12, | 2786,13, | 2786,14, | 2786,15, | 2786,16, | 2786,17, | 2786,18, | 2786,19, | 2786,20, | 2786,21, | 2786,22, | 2786,23, | 2786,24, | 2786,25, | 2786,26, | 2786,27, | 2786,28, | 2786,29, | 2786,30, | 2786,31, | 2786,32, | 2786,33, | 2786,34, | 2786,35, | 2786,36, | 2786,37, | 2786,38, | 2786,39, | 2786,40, | 2786,41, | 2786,42, | 2786,43, | 2786,44, | 2786,45, | 2786,46, | 2786,47, | 2786,48, | 2786,49, | 2786,50, | 2786,51, | 2786,52, | 2786,53, | 2786,54, | 2786,55, | 2786,56, | 2786,57, | 2786,58, | 2786,59, | 2786,60, | 2786,61, | 2786,62, | 2786,63, | 2786,64, | 2786,65, | 2786,66, | 2786,67, | 2786,68, | 2786,69, | 2786,70, | 2786,71, | 2786,72, | 2786,73, | 2786,74, | 2786,75, | 2786,76, | 2786,77, | 2786,78, | 2786,79, | 2786,80, | 2786,81, | 2786,82, | 2786,83, | 2786,84, | 2786,85, | 2787,1, | 2787,2, | 2787,3, | 2787,4, | 2787,5, | 2787,6, | 2787,7, | 2787,8, | 2787,9, | 2787,10, | 2787,11, | 2787,12, | 2787,13, | 2787,14, | 2787,15, | 2787,16, | 2787,17, | 2787,18, | 2787,19, | 2787,20, | 2787,21, | 2787,22, | 2787,23, | 2787,24, | 2787,25, | 2787,26, | 2787,27, | 2787,28, | 2787,29, | 2787,30, | 2787,31, | 2787,32, | 2787,33, | 2787,34, | 2787,35, | 2787,36, | 2787,37, | 2787,38, | 2787,39, | 2787,40, | 2787,41, | 2787,42, | 2787,43, | 2787,44, | 2787,45, | 2787,46, | 2787,47, | 2787,48, | 2787,49, | 2787,50, | 2787,51, | 2787,52, | 2787,53, | 2787,54, | 2787,55, | 2787,56, | 2787,57, | 2787,58, | 2787,59, | 2787,60, | 2787,61, | 2787,62, | 2787,63, | 2787,64, | 2787,65, | 2787,66, | 2787,67, | 2787,68, | 2787,69, | 2787,70, | 2787,71, | 2787,72, | 2787,73, | 2787,74, | 2787,75, | 2787,76, | 2787,77, | 2787,78, | 2787,79, | 2787,80, | 2787,81, | 2787,82, | 2787,83, | 2787,84, | 2787,85, | 2788,1, | 2788,2, | 2788,3, | 2788,4, | 2788,5, | 2788,6, | 2788,7, | 2788,8, | 2788,9, | 2788,10, | 2788,11, | 2788,12, | 2788,13, | 2788,14, | 2788,15, | 2788,16, | 2788,17, | 2788,18, | 2788,19, | 2788,20, | 2788,21, | 2788,22, | 2788,23, | 2788,24, | 2788,25, | 2788,26, | 2788,27, | 2788,28, | 2788,29, | 2788,30, | 2788,31, | 2788,32, | 2788,33, | 2788,34, | 2788,35, | 2788,36, | 2788,37, | 2788,38, | 2788,39, | 2788,40, | 2788,41, | 2788,42, | 2788,43, | 2788,44, | 2788,45, | 2788,46, | 2788,47, | 2788,48, | 2788,49, | 2788,50, | 2788,51, | 2788,52, | 2788,53, | 2788,54, | 2788,55, | 2788,56, | 2788,57, | 2788,58, | 2788,59, | 2788,60, | 2788,61, | 2788,62, | 2788,63, | 2788,64, | 2788,65, | 2788,66, | 2788,67, | 2788,68, | 2788,69, | 2788,70, | 2788,71, | 2788,72, | 2788,73, | 2788,74, | 2788,75, | 2788,76, | 2788,77, | 2788,78, | 2788,79, | 2788,80, | 2788,81, | 2788,82, | 2788,83, | 2788,84, | 2788,85, | 2789,1, | 2789,2, | 2789,3, | 2789,4, | 2789,5, | 2789,6, | 2789,7, | 2789,8, | 2789,9, | 2789,10, | 2789,11, | 2789,12, | 2789,13, | 2789,14, | 2789,15, | 2789,16, | 2789,17, | 2789,18, | 2789,19, | 2789,20, | 2789,21, | 2789,22, | 2789,23, | 2789,24, | 2789,25, | 2789,26, | 2789,27, | 2789,28, | 2789,29, | 2789,30, | 2789,31, | 2789,32, | 2789,33, | 2789,34, | 2789,35, | 2789,36, | 2789,37, | 2789,38, | 2789,39, | 2789,40, | 2789,41, | 2789,42, | 2789,43, | 2789,44, | 2789,45, | 2789,46, | 2789,47, | 2789,48, | 2789,49, | 2789,50, | 2789,51, | 2789,52, | 2789,53, | 2789,54, | 2789,55, | 2789,56, | 2789,57, | 2789,58, | 2789,59, | 2789,60, | 2789,61, | 2789,62, | 2789,63, | 2789,64, | 2789,65, | 2789,66, | 2789,67, | 2789,68, | 2789,69, | 2789,70, | 2789,71, | 2789,72, | 2789,73, | 2789,74, | 2789,75, | 2789,76, | 2789,77, | 2789,78, | 2789,79, | 2789,80, | 2789,81, | 2789,82, | 2789,83, | 2789,84, | 2789,85, | 2790,1, | 2790,2, | 2790,3, | 2790,4, | 2790,5, | 2790,6, | 2790,7, | 2790,8, | 2790,9, | 2790,10, | 2790,11, | 2790,12, | 2790,13, | 2790,14, | 2790,15, | 2790,16, | 2790,17, | 2790,18, | 2790,19, | 2790,20, | 2790,21, | 2790,22, | 2790,23, | 2790,24, | 2790,25, | 2790,26, | 2790,27, | 2790,28, | 2790,29, | 2790,30, | 2790,31, | 2790,32, | 2790,33, | 2790,34, | 2790,35, | 2790,36, | 2790,37, | 2790,38, | 2790,39, | 2790,40, | 2790,41, | 2790,42, | 2790,43, | 2790,44, | 2790,45, | 2790,46, | 2790,47, | 2790,48, | 2790,49, | 2790,50, | 2790,51, | 2790,52, | 2790,53, | 2790,54, | 2790,55, | 2790,56, | 2790,57, | 2790,58, | 2790,59, | 2790,60, | 2790,61, | 2790,62, | 2790,63, | 2790,64, | 2790,65, | 2790,66, | 2790,67, | 2790,68, | 2790,69, | 2790,70, | 2790,71, | 2790,72, | 2790,73, | 2790,74, | 2790,75, | 2790,76, | 2790,77, | 2790,78, | 2790,79, | 2790,80, | 2790,81, | 2790,82, | 2790,83, | 2790,84, | 2790,85, | 2791,1, | 2791,2, | 2791,3, | 2791,4, | 2791,5, | 2791,6, | 2791,7, | 2791,8, | 2791,9, | 2791,10, | 2791,11, | 2791,12, | 2791,13, | 2791,14, | 2791,15, | 2791,16, | 2791,17, | 2791,18, | 2791,19, | 2791,20, | 2791,21, | 2791,22, | 2791,23, | 2791,24, | 2791,25, | 2791,26, | 2791,27, | 2791,28, | 2791,29, | 2791,30, | 2791,31, | 2791,32, | 2791,33, | 2791,34, | 2791,35, | 2791,36, | 2791,37, | 2791,38, | 2791,39, | 2791,40, | 2791,41, | 2791,42, | 2791,43, | 2791,44, | 2791,45, | 2791,46, | 2791,47, | 2791,48, | 2791,49, | 2791,50, | 2791,51, | 2791,52, | 2791,53, | 2791,54, | 2791,55, | 2791,56, | 2791,57, | 2791,58, | 2791,59, | 2791,60, | 2791,61, | 2791,62, | 2791,63, | 2791,64, | 2791,65, | 2791,66, | 2791,67, | 2791,68, | 2791,69, | 2791,70, | 2791,71, | 2791,72, | 2791,73, | 2791,74, | 2791,75, | 2791,76, | 2791,77, | 2791,78, | 2791,79, | 2791,80, | 2791,81, | 2791,82, | 2791,83, | 2791,84, | 2791,85, | 2792,1, | 2792,2, | 2792,3, | 2792,4, | 2792,5, | 2792,6, | 2792,7, | 2792,8, | 2792,9, | 2792,10, | 2792,11, | 2792,12, | 2792,13, | 2792,14, | 2792,15, | 2792,16, | 2792,17, | 2792,18, | 2792,19, | 2792,20, | 2792,21, | 2792,22, | 2792,23, | 2792,24, | 2792,25, | 2792,26, | 2792,27, | 2792,28, | 2792,29, | 2792,30, | 2792,31, | 2792,32, | 2792,33, | 2792,34, | 2792,35, | 2792,36, | 2792,37, | 2792,38, | 2792,39, | 2792,40, | 2792,41, | 2792,42, | 2792,43, | 2792,44, | 2792,45, | 2792,46, | 2792,47, | 2792,48, | 2792,49, | 2792,50, | 2792,51, | 2792,52, | 2792,53, | 2792,54, | 2792,55, | 2792,56, | 2792,57, | 2792,58, | 2792,59, | 2792,60, | 2792,61, | 2792,62, | 2792,63, | 2792,64, | 2792,65, | 2792,66, | 2792,67, | 2792,68, | 2792,69, | 2792,70, | 2792,71, | 2792,72, | 2792,73, | 2792,74, | 2792,75, | 2792,76, | 2792,77, | 2792,78, | 2792,79, | 2792,80, | 2792,81, | 2792,82, | 2792,83, | 2792,84, | 2792,85, | 2793,1, | 2793,2, | 2793,3, | 2793,4, | 2793,5, | 2793,6, | 2793,7, | 2793,8, | 2793,9, | 2793,10, | 2793,11, | 2793,12, | 2793,13, | 2793,14, | 2793,15, | 2793,16, | 2793,17, | 2793,18, | 2793,19, | 2793,20, | 2793,21, | 2793,22, | 2793,23, | 2793,24, | 2793,25, | 2793,26, | 2793,27, | 2793,28, | 2793,29, | 2793,30, | 2793,31, | 2793,32, | 2793,33, | 2793,34, | 2793,35, | 2793,36, | 2793,37, | 2793,38, | 2793,39, | 2793,40, | 2793,41, | 2793,42, | 2793,43, | 2793,44, | 2793,45, | 2793,46, | 2793,47, | 2793,48, | 2793,49, | 2793,50, | 2793,51, | 2793,52, | 2793,53, | 2793,54, | 2793,55, | 2793,56, | 2793,57, | 2793,58, | 2793,59, | 2793,60, | 2793,61, | 2793,62, | 2793,63, | 2793,64, | 2793,65, | 2793,66, | 2793,67, | 2793,68, | 2793,69, | 2793,70, | 2793,71, | 2793,72, | 2793,73, | 2793,74, | 2793,75, | 2793,76, | 2793,77, | 2793,78, | 2793,79, | 2793,80, | 2793,81, | 2793,82, | 2793,83, | 2793,84, | 2793,85, | 2794,1, | 2794,2, | 2794,3, | 2794,4, | 2794,5, | 2794,6, | 2794,7, | 2794,8, | 2794,9, | 2794,10, | 2794,11, | 2794,12, | 2794,13, | 2794,14, | 2794,15, | 2794,16, | 2794,17, | 2794,18, | 2794,19, | 2794,20, | 2794,21, | 2794,22, | 2794,23, | 2794,24, | 2794,25, | 2794,26, | 2794,27, | 2794,28, | 2794,29, | 2794,30, | 2794,31, | 2794,32, | 2794,33, | 2794,34, | 2794,35, | 2794,36, | 2794,37, | 2794,38, | 2794,39, | 2794,40, | 2794,41, | 2794,42, | 2794,43, | 2794,44, | 2794,45, | 2794,46, | 2794,47, | 2794,48, | 2794,49, | 2794,50, | 2794,51, | 2794,52, | 2794,53, | 2794,54, | 2794,55, | 2794,56, | 2794,57, | 2794,58, | 2794,59, | 2794,60, | 2794,61, | 2794,62, | 2794,63, | 2794,64, | 2794,65, | 2794,66, | 2794,67, | 2794,68, | 2794,69, | 2794,70, | 2794,71, | 2794,72, | 2794,73, | 2794,74, | 2794,75, | 2794,76, | 2794,77, | 2794,78, | 2794,79, | 2794,80, | 2794,81, | 2794,82, | 2794,83, | 2794,84, | 2794,85, | 2795,1, | 2795,2, | 2795,3, | 2795,4, | 2795,5, | 2795,6, | 2795,7, | 2795,8, | 2795,9, | 2795,10, | 2795,11, | 2795,12, | 2795,13, | 2795,14, | 2795,15, | 2795,16, | 2795,17, | 2795,18, | 2795,19, | 2795,20, | 2795,21, | 2795,22, | 2795,23, | 2795,24, | 2795,25, | 2795,26, | 2795,27, | 2795,28, | 2795,29, | 2795,30, | 2795,31, | 2795,32, | 2795,33, | 2795,34, | 2795,35, | 2795,36, | 2795,37, | 2795,38, | 2795,39, | 2795,40, | 2795,41, | 2795,42, | 2795,43, | 2795,44, | 2795,45, | 2795,46, | 2795,47, | 2795,48, | 2795,49, | 2795,50, | 2795,51, | 2795,52, | 2795,53, | 2795,54, | 2795,55, | 2795,56, | 2795,57, | 2795,58, | 2795,59, | 2795,60, | 2795,61, | 2795,62, | 2795,63, | 2795,64, | 2795,65, | 2795,66, | 2795,67, | 2795,68, | 2795,69, | 2795,70, | 2795,71, | 2795,72, | 2795,73, | 2795,74, | 2795,75, | 2795,76, | 2795,77, | 2795,78, | 2795,79, | 2795,80, | 2795,81, | 2795,82, | 2795,83, | 2795,84, | 2795,85, | 2796,1, | 2796,2, | 2796,3, | 2796,4, | 2796,5, | 2796,6, | 2796,7, | 2796,8, | 2796,9, | 2796,10, | 2796,11, | 2796,12, | 2796,13, | 2796,14, | 2796,15, | 2796,16, | 2796,17, | 2796,18, | 2796,19, | 2796,20, | 2796,21, | 2796,22, | 2796,23, | 2796,24, | 2796,25, | 2796,26, | 2796,27, | 2796,28, | 2796,29, | 2796,30, | 2796,31, | 2796,32, | 2796,33, | 2796,34, | 2796,35, | 2796,36, | 2796,37, | 2796,38, | 2796,39, | 2796,40, | 2796,41, | 2796,42, | 2796,43, | 2796,44, | 2796,45, | 2796,46, | 2796,47, | 2796,48, | 2796,49, | 2796,50, | 2796,51, | 2796,52, | 2796,53, | 2796,54, | 2796,55, | 2796,56, | 2796,57, | 2796,58, | 2796,59, | 2796,60, | 2796,61, | 2796,62, | 2796,63, | 2796,64, | 2796,65, | 2796,66, | 2796,67, | 2796,68, | 2796,69, | 2796,70, | 2796,71, | 2796,72, | 2796,73, | 2796,74, | 2796,75, | 2796,76, | 2796,77, | 2796,78, | 2796,79, | 2796,80, | 2796,81, | 2796,82, | 2796,83, | 2796,84, | 2796,85, | 2797,1, | 2797,2, | 2797,3, | 2797,4, | 2797,5, | 2797,6, | 2797,7, | 2797,8, | 2797,9, | 2797,10, | 2797,11, | 2797,12, | 2797,13, | 2797,14, | 2797,15, | 2797,16, | 2797,17, | 2797,18, | 2797,19, | 2797,20, | 2797,21, | 2797,22, | 2797,23, | 2797,24, | 2797,25, | 2797,26, | 2797,27, | 2797,28, | 2797,29, | 2797,30, | 2797,31, | 2797,32, | 2797,33, | 2797,34, | 2797,35, | 2797,36, | 2797,37, | 2797,38, | 2797,39, | 2797,40, | 2797,41, | 2797,42, | 2797,43, | 2797,44, | 2797,45, | 2797,46, | 2797,47, | 2797,48, | 2797,49, | 2797,50, | 2797,51, | 2797,52, | 2797,53, | 2797,54, | 2797,55, | 2797,56, | 2797,57, | 2797,58, | 2797,59, | 2797,60, | 2797,61, | 2797,62, | 2797,63, | 2797,64, | 2797,65, | 2797,66, | 2797,67, | 2797,68, | 2797,69, | 2797,70, | 2797,71, | 2797,72, | 2797,73, | 2797,74, | 2797,75, | 2797,76, | 2797,77, | 2797,78, | 2797,79, | 2797,80, | 2797,81, | 2797,82, | 2797,83, | 2797,84, | 2797,85, | 2798,1, | 2798,2, | 2798,3, | 2798,4, | 2798,5, | 2798,6, | 2798,7, | 2798,8, | 2798,9, | 2798,10, | 2798,11, | 2798,12, | 2798,13, | 2798,14, | 2798,15, | 2798,16, | 2798,17, | 2798,18, | 2798,19, | 2798,20, | 2798,21, | 2798,22, | 2798,23, | 2798,24, | 2798,25, | 2798,26, | 2798,27, | 2798,28, | 2798,29, | 2798,30, | 2798,31, | 2798,32, | 2798,33, | 2798,34, | 2798,35, | 2798,36, | 2798,37, | 2798,38, | 2798,39, | 2798,40, | 2798,41, | 2798,42, | 2798,43, | 2798,44, | 2798,45, | 2798,46, | 2798,47, | 2798,48, | 2798,49, | 2798,50, | 2798,51, | 2798,52, | 2798,53, | 2798,54, | 2798,55, | 2798,56, | 2798,57, | 2798,58, | 2798,59, | 2798,60, | 2798,61, | 2798,62, | 2798,63, | 2798,64, | 2798,65, | 2798,66, | 2798,67, | 2798,68, | 2798,69, | 2798,70, | 2798,71, | 2798,72, | 2798,73, | 2798,74, | 2798,75, | 2798,76, | 2798,77, | 2798,78, | 2798,79, | 2798,80, | 2798,81, | 2798,82, | 2798,83, | 2798,84, | 2798,85, | 2799,1, | 2799,2, | 2799,3, | 2799,4, | 2799,5, | 2799,6, | 2799,7, | 2799,8, | 2799,9, | 2799,10, | 2799,11, | 2799,12, | 2799,13, | 2799,14, | 2799,15, | 2799,16, | 2799,17, | 2799,18, | 2799,19, | 2799,20, | 2799,21, | 2799,22, | 2799,23, | 2799,24, | 2799,25, | 2799,26, | 2799,27, | 2799,28, | 2799,29, | 2799,30, | 2799,31, | 2799,32, | 2799,33, | 2799,34, | 2799,35, | 2799,36, | 2799,37, | 2799,38, | 2799,39, | 2799,40, | 2799,41, | 2799,42, | 2799,43, | 2799,44, | 2799,45, | 2799,46, | 2799,47, | 2799,48, | 2799,49, | 2799,50, | 2799,51, | 2799,52, | 2799,53, | 2799,54, | 2799,55, | 2799,56, | 2799,57, | 2799,58, | 2799,59, | 2799,60, | 2799,61, | 2799,62, | 2799,63, | 2799,64, | 2799,65, | 2799,66, | 2799,67, | 2799,68, | 2799,69, | 2799,70, | 2799,71, | 2799,72, | 2799,73, | 2799,74, | 2799,75, | 2799,76, | 2799,77, | 2799,78, | 2799,79, | 2799,80, | 2799,81, | 2799,82, | 2799,83, | 2799,84, | 2799,85, | 2800,1, | 2800,2, | 2800,3, | 2800,4, | 2800,5, | 2800,6, | 2800,7, | 2800,8, | 2800,9, | 2800,10, | 2800,11, | 2800,12, | 2800,13, | 2800,14, | 2800,15, | 2800,16, | 2800,17, | 2800,18, | 2800,19, | 2800,20, | 2800,21, | 2800,22, | 2800,23, | 2800,24, | 2800,25, | 2800,26, | 2800,27, | 2800,28, | 2800,29, | 2800,30, | 2800,31, | 2800,32, | 2800,33, | 2800,34, | 2800,35, | 2800,36, | 2800,37, | 2800,38, | 2800,39, | 2800,40, | 2800,41, | 2800,42, | 2800,43, | 2800,44, | 2800,45, | 2800,46, | 2800,47, | 2800,48, | 2800,49, | 2800,50, | 2800,51, | 2800,52, | 2800,53, | 2800,54, | 2800,55, | 2800,56, | 2800,57, | 2800,58, | 2800,59, | 2800,60, | 2800,61, | 2800,62, | 2800,63, | 2800,64, | 2800,65, | 2800,66, | 2800,67, | 2800,68, | 2800,69, | 2800,70, | 2800,71, | 2800,72, | 2800,73, | 2800,74, | 2800,75, | 2800,76, | 2800,77, | 2800,78, | 2800,79, | 2800,80, | 2800,81, | 2800,82, | 2800,83, | 2800,84, | 2800,85, | 2801,1, | 2801,2, | 2801,3, | 2801,4, | 2801,5, | 2801,6, | 2801,7, | 2801,8, | 2801,9, | 2801,10, | 2801,11, | 2801,12, | 2801,13, | 2801,14, | 2801,15, | 2801,16, | 2801,17, | 2801,18, | 2801,19, | 2801,20, | 2801,21, | 2801,22, | 2801,23, | 2801,24, | 2801,25, | 2801,26, | 2801,27, | 2801,28, | 2801,29, | 2801,30, | 2801,31, | 2801,32, | 2801,33, | 2801,34, | 2801,35, | 2801,36, | 2801,37, | 2801,38, | 2801,39, | 2801,40, | 2801,41, | 2801,42, | 2801,43, | 2801,44, | 2801,45, | 2801,46, | 2801,47, | 2801,48, | 2801,49, | 2801,50, | 2801,51, | 2801,52, | 2801,53, | 2801,54, | 2801,55, | 2801,56, | 2801,57, | 2801,58, | 2801,59, | 2801,60, | 2801,61, | 2801,62, | 2801,63, | 2801,64, | 2801,65, | 2801,66, | 2801,67, | 2801,68, | 2801,69, | 2801,70, | 2801,71, | 2801,72, | 2801,73, | 2801,74, | 2801,75, | 2801,76, | 2801,77, | 2801,78, | 2801,79, | 2801,80, | 2801,81, | 2801,82, | 2801,83, | 2801,84, | 2801,85, | 2802,1, | 2802,2, | 2802,3, | 2802,4, | 2802,5, | 2802,6, | 2802,7, | 2802,8, | 2802,9, | 2802,10, | 2802,11, | 2802,12, | 2802,13, | 2802,14, | 2802,15, | 2802,16, | 2802,17, | 2802,18, | 2802,19, | 2802,20, | 2802,21, | 2802,22, | 2802,23, | 2802,24, | 2802,25, | 2802,26, | 2802,27, | 2802,28, | 2802,29, | 2802,30, | 2802,31, | 2802,32, | 2802,33, | 2802,34, | 2802,35, | 2802,36, | 2802,37, | 2802,38, | 2802,39, | 2802,40, | 2802,41, | 2802,42, | 2802,43, | 2802,44, | 2802,45, | 2802,46, | 2802,47, | 2802,48, | 2802,49, | 2802,50, | 2802,51, | 2802,52, | 2802,53, | 2802,54, | 2802,55, | 2802,56, | 2802,57, | 2802,58, | 2802,59, | 2802,60, | 2802,61, | 2802,62, | 2802,63, | 2802,64, | 2802,65, | 2802,66, | 2802,67, | 2802,68, | 2802,69, | 2802,70, | 2802,71, | 2802,72, | 2802,73, | 2802,74, | 2802,75, | 2802,76, | 2802,77, | 2802,78, | 2802,79, | 2802,80, | 2802,81, | 2802,82, | 2802,83, | 2802,84, | 2802,85, | 2803,1, | 2803,2, | 2803,3, | 2803,4, | 2803,5, | 2803,6, | 2803,7, | 2803,8, | 2803,9, | 2803,10, | 2803,11, | 2803,12, | 2803,13, | 2803,14, | 2803,15, | 2803,16, | 2803,17, | 2803,18, | 2803,19, | 2803,20, | 2803,21, | 2803,22, | 2803,23, | 2803,24, | 2803,25, | 2803,26, | 2803,27, | 2803,28, | 2803,29, | 2803,30, | 2803,31, | 2803,32, | 2803,33, | 2803,34, | 2803,35, | 2803,36, | 2803,37, | 2803,38, | 2803,39, | 2803,40, | 2803,41, | 2803,42, | 2803,43, | 2803,44, | 2803,45, | 2803,46, | 2803,47, | 2803,48, | 2803,49, | 2803,50, | 2803,51, | 2803,52, | 2803,53, | 2803,54, | 2803,55, | 2803,56, | 2803,57, | 2803,58, | 2803,59, | 2803,60, | 2803,61, | 2803,62, | 2803,63, | 2803,64, | 2803,65, | 2803,66, | 2803,67, | 2803,68, | 2803,69, | 2803,70, | 2803,71, | 2803,72, | 2803,73, | 2803,74, | 2803,75, | 2803,76, | 2803,77, | 2803,78, | 2803,79, | 2803,80, | 2803,81, | 2803,82, | 2803,83, | 2803,84, | 2803,85, | 2804,1, | 2804,2, | 2804,3, | 2804,4, | 2804,5, | 2804,6, | 2804,7, | 2804,8, | 2804,9, | 2804,10, | 2804,11, | 2804,12, | 2804,13, | 2804,14, | 2804,15, | 2804,16, | 2804,17, | 2804,18, | 2804,19, | 2804,20, | 2804,21, | 2804,22, | 2804,23, | 2804,24, | 2804,25, | 2804,26, | 2804,27, | 2804,28, | 2804,29, | 2804,30, | 2804,31, | 2804,32, | 2804,33, | 2804,34, | 2804,35, | 2804,36, | 2804,37, | 2804,38, | 2804,39, | 2804,40, | 2804,41, | 2804,42, | 2804,43, | 2804,44, | 2804,45, | 2804,46, | 2804,47, | 2804,48, | 2804,49, | 2804,50, | 2804,51, | 2804,52, | 2804,53, | 2804,54, | 2804,55, | 2804,56, | 2804,57, | 2804,58, | 2804,59, | 2804,60, | 2804,61, | 2804,62, | 2804,63, | 2804,64, | 2804,65, | 2804,66, | 2804,67, | 2804,68, | 2804,69, | 2804,70, | 2804,71, | 2804,72, | 2804,73, | 2804,74, | 2804,75, | 2804,76, | 2804,77, | 2804,78, | 2804,79, | 2804,80, | 2804,81, | 2804,82, | 2804,83, | 2804,84, | 2804,85, | 2805,1, | 2805,2, | 2805,3, | 2805,4, | 2805,5, | 2805,6, | 2805,7, | 2805,8, | 2805,9, | 2805,10, | 2805,11, | 2805,12, | 2805,13, | 2805,14, | 2805,15, | 2805,16, | 2805,17, | 2805,18, | 2805,19, | 2805,20, | 2805,21, | 2805,22, | 2805,23, | 2805,24, | 2805,25, | 2805,26, | 2805,27, | 2805,28, | 2805,29, | 2805,30, | 2805,31, | 2805,32, | 2805,33, | 2805,34, | 2805,35, | 2805,36, | 2805,37, | 2805,38, | 2805,39, | 2805,40, | 2805,41, | 2805,42, | 2805,43, | 2805,44, | 2805,45, | 2805,46, | 2805,47, | 2805,48, | 2805,49, | 2805,50, | 2805,51, | 2805,52, | 2805,53, | 2805,54, | 2805,55, | 2805,56, | 2805,57, | 2805,58, | 2805,59, | 2805,60, | 2805,61, | 2805,62, | 2805,63, | 2805,64, | 2805,65, | 2805,66, | 2805,67, | 2805,68, | 2805,69, | 2805,70, | 2805,71, | 2805,72, | 2805,73, | 2805,74, | 2805,75, | 2805,76, | 2805,77, | 2805,78, | 2805,79, | 2805,80, | 2805,81, | 2805,82, | 2805,83, | 2805,84, | 2805,85, | 2806,1, | 2806,2, | 2806,3, | 2806,4, | 2806,5, | 2806,6, | 2806,7, | 2806,8, | 2806,9, | 2806,10, | 2806,11, | 2806,12, | 2806,13, | 2806,14, | 2806,15, | 2806,16, | 2806,17, | 2806,18, | 2806,19, | 2806,20, | 2806,21, | 2806,22, | 2806,23, | 2806,24, | 2806,25, | 2806,26, | 2806,27, | 2806,28, | 2806,29, | 2806,30, | 2806,31, | 2806,32, | 2806,33, | 2806,34, | 2806,35, | 2806,36, | 2806,37, | 2806,38, | 2806,39, | 2806,40, | 2806,41, | 2806,42, | 2806,43, | 2806,44, | 2806,45, | 2806,46, | 2806,47, | 2806,48, | 2806,49, | 2806,50, | 2806,51, | 2806,52, | 2806,53, | 2806,54, | 2806,55, | 2806,56, | 2806,57, | 2806,58, | 2806,59, | 2806,60, | 2806,61, | 2806,62, | 2806,63, | 2806,64, | 2806,65, | 2806,66, | 2806,67, | 2806,68, | 2806,69, | 2806,70, | 2806,71, | 2806,72, | 2806,73, | 2806,74, | 2806,75, | 2806,76, | 2806,77, | 2806,78, | 2806,79, | 2806,80, | 2806,81, | 2806,82, | 2806,83, | 2806,84, | 2806,85, | 2807,1, | 2807,2, | 2807,3, | 2807,4, | 2807,5, | 2807,6, | 2807,7, | 2807,8, | 2807,9, | 2807,10, | 2807,11, | 2807,12, | 2807,13, | 2807,14, | 2807,15, | 2807,16, | 2807,17, | 2807,18, | 2807,19, | 2807,20, | 2807,21, | 2807,22, | 2807,23, | 2807,24, | 2807,25, | 2807,26, | 2807,27, | 2807,28, | 2807,29, | 2807,30, | 2807,31, | 2807,32, | 2807,33, | 2807,34, | 2807,35, | 2807,36, | 2807,37, | 2807,38, | 2807,39, | 2807,40, | 2807,41, | 2807,42, | 2807,43, | 2807,44, | 2807,45, | 2807,46, | 2807,47, | 2807,48, | 2807,49, | 2807,50, | 2807,51, | 2807,52, | 2807,53, | 2807,54, | 2807,55, | 2807,56, | 2807,57, | 2807,58, | 2807,59, | 2807,60, | 2807,61, | 2807,62, | 2807,63, | 2807,64, | 2807,65, | 2807,66, | 2807,67, | 2807,68, | 2807,69, | 2807,70, | 2807,71, | 2807,72, | 2807,73, | 2807,74, | 2807,75, | 2807,76, | 2807,77, | 2807,78, | 2807,79, | 2807,80, | 2807,81, | 2807,82, | 2807,83, | 2807,84, | 2807,85, | 2808,1, | 2808,2, | 2808,3, | 2808,4, | 2808,5, | 2808,6, | 2808,7, | 2808,8, | 2808,9, | 2808,10, | 2808,11, | 2808,12, | 2808,13, | 2808,14, | 2808,15, | 2808,16, | 2808,17, | 2808,18, | 2808,19, | 2808,20, | 2808,21, | 2808,22, | 2808,23, | 2808,24, | 2808,25, | 2808,26, | 2808,27, | 2808,28, | 2808,29, | 2808,30, | 2808,31, | 2808,32, | 2808,33, | 2808,34, | 2808,35, | 2808,36, | 2808,37, | 2808,38, | 2808,39, | 2808,40, | 2808,41, | 2808,42, | 2808,43, | 2808,44, | 2808,45, | 2808,46, | 2808,47, | 2808,48, | 2808,49, | 2808,50, | 2808,51, | 2808,52, | 2808,53, | 2808,54, | 2808,55, | 2808,56, | 2808,57, | 2808,58, | 2808,59, | 2808,60, | 2808,61, | 2808,62, | 2808,63, | 2808,64, | 2808,65, | 2808,66, | 2808,67, | 2808,68, | 2808,69, | 2808,70, | 2808,71, | 2808,72, | 2808,73, | 2808,74, | 2808,75, | 2808,76, | 2808,77, | 2808,78, | 2808,79, | 2808,80, | 2808,81, | 2808,82, | 2808,83, | 2808,84, | 2808,85, | 2809,1, | 2809,2, | 2809,3, | 2809,4, | 2809,5, | 2809,6, | 2809,7, | 2809,8, | 2809,9, | 2809,10, | 2809,11, | 2809,12, | 2809,13, | 2809,14, | 2809,15, | 2809,16, | 2809,17, | 2809,18, | 2809,19, | 2809,20, | 2809,21, | 2809,22, | 2809,23, | 2809,24, | 2809,25, | 2809,26, | 2809,27, | 2809,28, | 2809,29, | 2809,30, | 2809,31, | 2809,32, | 2809,33, | 2809,34, | 2809,35, | 2809,36, | 2809,37, | 2809,38, | 2809,39, | 2809,40, | 2809,41, | 2809,42, | 2809,43, | 2809,44, | 2809,45, | 2809,46, | 2809,47, | 2809,48, | 2809,49, | 2809,50, | 2809,51, | 2809,52, | 2809,53, | 2809,54, | 2809,55, | 2809,56, | 2809,57, | 2809,58, | 2809,59, | 2809,60, | 2809,61, | 2809,62, | 2809,63, | 2809,64, | 2809,65, | 2809,66, | 2809,67, | 2809,68, | 2809,69, | 2809,70, | 2809,71, | 2809,72, | 2809,73, | 2809,74, | 2809,75, | 2809,76, | 2809,77, | 2809,78, | 2809,79, | 2809,80, | 2809,81, | 2809,82, | 2809,83, | 2809,84, | 2809,85, | 2810,1, | 2810,2, | 2810,3, | 2810,4, | 2810,5, | 2810,6, | 2810,7, | 2810,8, | 2810,9, | 2810,10, | 2810,11, | 2810,12, | 2810,13, | 2810,14, | 2810,15, | 2810,16, | 2810,17, | 2810,18, | 2810,19, | 2810,20, | 2810,21, | 2810,22, | 2810,23, | 2810,24, | 2810,25, | 2810,26, | 2810,27, | 2810,28, | 2810,29, | 2810,30, | 2810,31, | 2810,32, | 2810,33, | 2810,34, | 2810,35, | 2810,36, | 2810,37, | 2810,38, | 2810,39, | 2810,40, | 2810,41, | 2810,42, | 2810,43, | 2810,44, | 2810,45, | 2810,46, | 2810,47, | 2810,48, | 2810,49, | 2810,50, | 2810,51, | 2810,52, | 2810,53, | 2810,54, | 2810,55, | 2810,56, | 2810,57, | 2810,58, | 2810,59, | 2810,60, | 2810,61, | 2810,62, | 2810,63, | 2810,64, | 2810,65, | 2810,66, | 2810,67, | 2810,68, | 2810,69, | 2810,70, | 2810,71, | 2810,72, | 2810,73, | 2810,74, | 2810,75, | 2810,76, | 2810,77, | 2810,78, | 2810,79, | 2810,80, | 2810,81, | 2810,82, | 2810,83, | 2810,84, | 2810,85, | 2811,1, | 2811,2, | 2811,3, | 2811,4, | 2811,5, | 2811,6, | 2811,7, | 2811,8, | 2811,9, | 2811,10, | 2811,11, | 2811,12, | 2811,13, | 2811,14, | 2811,15, | 2811,16, | 2811,17, | 2811,18, | 2811,19, | 2811,20, | 2811,21, | 2811,22, | 2811,23, | 2811,24, | 2811,25, | 2811,26, | 2811,27, | 2811,28, | 2811,29, | 2811,30, | 2811,31, | 2811,32, | 2811,33, | 2811,34, | 2811,35, | 2811,36, | 2811,37, | 2811,38, | 2811,39, | 2811,40, | 2811,41, | 2811,42, | 2811,43, | 2811,44, | 2811,45, | 2811,46, | 2811,47, | 2811,48, | 2811,49, | 2811,50, | 2811,51, | 2811,52, | 2811,53, | 2811,54, | 2811,55, | 2811,56, | 2811,57, | 2811,58, | 2811,59, | 2811,60, | 2811,61, | 2811,62, | 2811,63, | 2811,64, | 2811,65, | 2811,66, | 2811,67, | 2811,68, | 2811,69, | 2811,70, | 2811,71, | 2811,72, | 2811,73, | 2811,74, | 2811,75, | 2811,76, | 2811,77, | 2811,78, | 2811,79, | 2811,80, | 2811,81, | 2811,82, | 2811,83, | 2811,84, | 2811,85, | 2812,1, | 2812,2, | 2812,3, | 2812,4, | 2812,5, | 2812,6, | 2812,7, | 2812,8, | 2812,9, | 2812,10, | 2812,11, | 2812,12, | 2812,13, | 2812,14, | 2812,15, | 2812,16, | 2812,17, | 2812,18, | 2812,19, | 2812,20, | 2812,21, | 2812,22, | 2812,23, | 2812,24, | 2812,25, | 2812,26, | 2812,27, | 2812,28, | 2812,29, | 2812,30, | 2812,31, | 2812,32, | 2812,33, | 2812,34, | 2812,35, | 2812,36, | 2812,37, | 2812,38, | 2812,39, | 2812,40, | 2812,41, | 2812,42, | 2812,43, | 2812,44, | 2812,45, | 2812,46, | 2812,47, | 2812,48, | 2812,49, | 2812,50, | 2812,51, | 2812,52, | 2812,53, | 2812,54, | 2812,55, | 2812,56, | 2812,57, | 2812,58, | 2812,59, | 2812,60, | 2812,61, | 2812,62, | 2812,63, | 2812,64, | 2812,65, | 2812,66, | 2812,67, | 2812,68, | 2812,69, | 2812,70, | 2812,71, | 2812,72, | 2812,73, | 2812,74, | 2812,75, | 2812,76, | 2812,77, | 2812,78, | 2812,79, | 2812,80, | 2812,81, | 2812,82, | 2812,83, | 2812,84, | 2812,85, | 2813,1, | 2813,2, | 2813,3, | 2813,4, | 2813,5, | 2813,6, | 2813,7, | 2813,8, | 2813,9, | 2813,10, | 2813,11, | 2813,12, | 2813,13, | 2813,14, | 2813,15, | 2813,16, | 2813,17, | 2813,18, | 2813,19, | 2813,20, | 2813,21, | 2813,22, | 2813,23, | 2813,24, | 2813,25, | 2813,26, | 2813,27, | 2813,28, | 2813,29, | 2813,30, | 2813,31, | 2813,32, | 2813,33, | 2813,34, | 2813,35, | 2813,36, | 2813,37, | 2813,38, | 2813,39, | 2813,40, | 2813,41, | 2813,42, | 2813,43, | 2813,44, | 2813,45, | 2813,46, | 2813,47, | 2813,48, | 2813,49, | 2813,50, | 2813,51, | 2813,52, | 2813,53, | 2813,54, | 2813,55, | 2813,56, | 2813,57, | 2813,58, | 2813,59, | 2813,60, | 2813,61, | 2813,62, | 2813,63, | 2813,64, | 2813,65, | 2813,66, | 2813,67, | 2813,68, | 2813,69, | 2813,70, | 2813,71, | 2813,72, | 2813,73, | 2813,74, | 2813,75, | 2813,76, | 2813,77, | 2813,78, | 2813,79, | 2813,80, | 2813,81, | 2813,82, | 2813,83, | 2813,84, | 2813,85, | 2814,1, | 2814,2, | 2814,3, | 2814,4, | 2814,5, | 2814,6, | 2814,7, | 2814,8, | 2814,9, | 2814,10, | 2814,11, | 2814,12, | 2814,13, | 2814,14, | 2814,15, | 2814,16, | 2814,17, | 2814,18, | 2814,19, | 2814,20, | 2814,21, | 2814,22, | 2814,23, | 2814,24, | 2814,25, | 2814,26, | 2814,27, | 2814,28, | 2814,29, | 2814,30, | 2814,31, | 2814,32, | 2814,33, | 2814,34, | 2814,35, | 2814,36, | 2814,37, | 2814,38, | 2814,39, | 2814,40, | 2814,41, | 2814,42, | 2814,43, | 2814,44, | 2814,45, | 2814,46, | 2814,47, | 2814,48, | 2814,49, | 2814,50, | 2814,51, | 2814,52, | 2814,53, | 2814,54, | 2814,55, | 2814,56, | 2814,57, | 2814,58, | 2814,59, | 2814,60, | 2814,61, | 2814,62, | 2814,63, | 2814,64, | 2814,65, | 2814,66, | 2814,67, | 2814,68, | 2814,69, | 2814,70, | 2814,71, | 2814,72, | 2814,73, | 2814,74, | 2814,75, | 2814,76, | 2814,77, | 2814,78, | 2814,79, | 2814,80, | 2814,81, | 2814,82, | 2814,83, | 2814,84, | 2814,85, | 2815,1, | 2815,2, | 2815,3, | 2815,4, | 2815,5, | 2815,6, | 2815,7, | 2815,8, | 2815,9, | 2815,10, | 2815,11, | 2815,12, | 2815,13, | 2815,14, | 2815,15, | 2815,16, | 2815,17, | 2815,18, | 2815,19, | 2815,20, | 2815,21, | 2815,22, | 2815,23, | 2815,24, | 2815,25, | 2815,26, | 2815,27, | 2815,28, | 2815,29, | 2815,30, | 2815,31, | 2815,32, | 2815,33, | 2815,34, | 2815,35, | 2815,36, | 2815,37, | 2815,38, | 2815,39, | 2815,40, | 2815,41, | 2815,42, | 2815,43, | 2815,44, | 2815,45, | 2815,46, | 2815,47, | 2815,48, | 2815,49, | 2815,50, | 2815,51, | 2815,52, | 2815,53, | 2815,54, | 2815,55, | 2815,56, | 2815,57, | 2815,58, | 2815,59, | 2815,60, | 2815,61, | 2815,62, | 2815,63, | 2815,64, | 2815,65, | 2815,66, | 2815,67, | 2815,68, | 2815,69, | 2815,70, | 2815,71, | 2815,72, | 2815,73, | 2815,74, | 2815,75, | 2815,76, | 2815,77, | 2815,78, | 2815,79, | 2815,80, | 2815,81, | 2815,82, | 2815,83, | 2815,84, | 2815,85, | 2816,1, | 2816,2, | 2816,3, | 2816,4, | 2816,5, | 2816,6, | 2816,7, | 2816,8, | 2816,9, | 2816,10, | 2816,11, | 2816,12, | 2816,13, | 2816,14, | 2816,15, | 2816,16, | 2816,17, | 2816,18, | 2816,19, | 2816,20, | 2816,21, | 2816,22, | 2816,23, | 2816,24, | 2816,25, | 2816,26, | 2816,27, | 2816,28, | 2816,29, | 2816,30, | 2816,31, | 2816,32, | 2816,33, | 2816,34, | 2816,35, | 2816,36, | 2816,37, | 2816,38, | 2816,39, | 2816,40, | 2816,41, | 2816,42, | 2816,43, | 2816,44, | 2816,45, | 2816,46, | 2816,47, | 2816,48, | 2816,49, | 2816,50, | 2816,51, | 2816,52, | 2816,53, | 2816,54, | 2816,55, | 2816,56, | 2816,57, | 2816,58, | 2816,59, | 2816,60, | 2816,61, | 2816,62, | 2816,63, | 2816,64, | 2816,65, | 2816,66, | 2816,67, | 2816,68, | 2816,69, | 2816,70, | 2816,71, | 2816,72, | 2816,73, | 2816,74, | 2816,75, | 2816,76, | 2816,77, | 2816,78, | 2816,79, | 2816,80, | 2816,81, | 2816,82, | 2816,83, | 2816,84, | 2816,85, | 2817,1, | 2817,2, | 2817,3, | 2817,4, | 2817,5, | 2817,6, | 2817,7, | 2817,8, | 2817,9, | 2817,10, | 2817,11, | 2817,12, | 2817,13, | 2817,14, | 2817,15, | 2817,16, | 2817,17, | 2817,18, | 2817,19, | 2817,20, | 2817,21, | 2817,22, | 2817,23, | 2817,24, | 2817,25, | 2817,26, | 2817,27, | 2817,28, | 2817,29, | 2817,30, | 2817,31, | 2817,32, | 2817,33, | 2817,34, | 2817,35, | 2817,36, | 2817,37, | 2817,38, | 2817,39, | 2817,40, | 2817,41, | 2817,42, | 2817,43, | 2817,44, | 2817,45, | 2817,46, | 2817,47, | 2817,48, | 2817,49, | 2817,50, | 2817,51, | 2817,52, | 2817,53, | 2817,54, | 2817,55, | 2817,56, | 2817,57, | 2817,58, | 2817,59, | 2817,60, | 2817,61, | 2817,62, | 2817,63, | 2817,64, | 2817,65, | 2817,66, | 2817,67, | 2817,68, | 2817,69, | 2817,70, | 2817,71, | 2817,72, | 2817,73, | 2817,74, | 2817,75, | 2817,76, | 2817,77, | 2817,78, | 2817,79, | 2817,80, | 2817,81, | 2817,82, | 2817,83, | 2817,84, | 2817,85, | 2818,1, | 2818,2, | 2818,3, | 2818,4, | 2818,5, | 2818,6, | 2818,7, | 2818,8, | 2818,9, | 2818,10, | 2818,11, | 2818,12, | 2818,13, | 2818,14, | 2818,15, | 2818,16, | 2818,17, | 2818,18, | 2818,19, | 2818,20, | 2818,21, | 2818,22, | 2818,23, | 2818,24, | 2818,25, | 2818,26, | 2818,27, | 2818,28, | 2818,29, | 2818,30, | 2818,31, | 2818,32, | 2818,33, | 2818,34, | 2818,35, | 2818,36, | 2818,37, | 2818,38, | 2818,39, | 2818,40, | 2818,41, | 2818,42, | 2818,43, | 2818,44, | 2818,45, | 2818,46, | 2818,47, | 2818,48, | 2818,49, | 2818,50, | 2818,51, | 2818,52, | 2818,53, | 2818,54, | 2818,55, | 2818,56, | 2818,57, | 2818,58, | 2818,59, | 2818,60, | 2818,61, | 2818,62, | 2818,63, | 2818,64, | 2818,65, | 2818,66, | 2818,67, | 2818,68, | 2818,69, | 2818,70, | 2818,71, | 2818,72, | 2818,73, | 2818,74, | 2818,75, | 2818,76, | 2818,77, | 2818,78, | 2818,79, | 2818,80, | 2818,81, | 2818,82, | 2818,83, | 2818,84, | 2818,85, | 2819,1, | 2819,2, | 2819,3, | 2819,4, | 2819,5, | 2819,6, | 2819,7, | 2819,8, | 2819,9, | 2819,10, | 2819,11, | 2819,12, | 2819,13, | 2819,14, | 2819,15, | 2819,16, | 2819,17, | 2819,18, | 2819,19, | 2819,20, | 2819,21, | 2819,22, | 2819,23, | 2819,24, | 2819,25, | 2819,26, | 2819,27, | 2819,28, | 2819,29, | 2819,30, | 2819,31, | 2819,32, | 2819,33, | 2819,34, | 2819,35, | 2819,36, | 2819,37, | 2819,38, | 2819,39, | 2819,40, | 2819,41, | 2819,42, | 2819,43, | 2819,44, | 2819,45, | 2819,46, | 2819,47, | 2819,48, | 2819,49, | 2819,50, | 2819,51, | 2819,52, | 2819,53, | 2819,54, | 2819,55, | 2819,56, | 2819,57, | 2819,58, | 2819,59, | 2819,60, | 2819,61, | 2819,62, | 2819,63, | 2819,64, | 2819,65, | 2819,66, | 2819,67, | 2819,68, | 2819,69, | 2819,70, | 2819,71, | 2819,72, | 2819,73, | 2819,74, | 2819,75, | 2819,76, | 2819,77, | 2819,78, | 2819,79, | 2819,80, | 2819,81, | 2819,82, | 2819,83, | 2819,84, | 2819,85, | 2820,1, | 2820,2, | 2820,3, | 2820,4, | 2820,5, | 2820,6, | 2820,7, | 2820,8, | 2820,9, | 2820,10, | 2820,11, | 2820,12, | 2820,13, | 2820,14, | 2820,15, | 2820,16, | 2820,17, | 2820,18, | 2820,19, | 2820,20, | 2820,21, | 2820,22, | 2820,23, | 2820,24, | 2820,25, | 2820,26, | 2820,27, | 2820,28, | 2820,29, | 2820,30, | 2820,31, | 2820,32, | 2820,33, | 2820,34, | 2820,35, | 2820,36, | 2820,37, | 2820,38, | 2820,39, | 2820,40, | 2820,41, | 2820,42, | 2820,43, | 2820,44, | 2820,45, | 2820,46, | 2820,47, | 2820,48, | 2820,49, | 2820,50, | 2820,51, | 2820,52, | 2820,53, | 2820,54, | 2820,55, | 2820,56, | 2820,57, | 2820,58, | 2820,59, | 2820,60, | 2820,61, | 2820,62, | 2820,63, | 2820,64, | 2820,65, | 2820,66, | 2820,67, | 2820,68, | 2820,69, | 2820,70, | 2820,71, | 2820,72, | 2820,73, | 2820,74, | 2820,75, | 2820,76, | 2820,77, | 2820,78, | 2820,79, | 2820,80, | 2820,81, | 2820,82, | 2820,83, | 2820,84, | 2820,85, | 2821,1, | 2821,2, | 2821,3, | 2821,4, | 2821,5, | 2821,6, | 2821,7, | 2821,8, | 2821,9, | 2821,10, | 2821,11, | 2821,12, | 2821,13, | 2821,14, | 2821,15, | 2821,16, | 2821,17, | 2821,18, | 2821,19, | 2821,20, | 2821,21, | 2821,22, | 2821,23, | 2821,24, | 2821,25, | 2821,26, | 2821,27, | 2821,28, | 2821,29, | 2821,30, | 2821,31, | 2821,32, | 2821,33, | 2821,34, | 2821,35, | 2821,36, | 2821,37, | 2821,38, | 2821,39, | 2821,40, | 2821,41, | 2821,42, | 2821,43, | 2821,44, | 2821,45, | 2821,46, | 2821,47, | 2821,48, | 2821,49, | 2821,50, | 2821,51, | 2821,52, | 2821,53, | 2821,54, | 2821,55, | 2821,56, | 2821,57, | 2821,58, | 2821,59, | 2821,60, | 2821,61, | 2821,62, | 2821,63, | 2821,64, | 2821,65, | 2821,66, | 2821,67, | 2821,68, | 2821,69, | 2821,70, | 2821,71, | 2821,72, | 2821,73, | 2821,74, | 2821,75, | 2821,76, | 2821,77, | 2821,78, | 2821,79, | 2821,80, | 2821,81, | 2821,82, | 2821,83, | 2821,84, | 2821,85, | 2822,1, | 2822,2, | 2822,3, | 2822,4, | 2822,5, | 2822,6, | 2822,7, | 2822,8, | 2822,9, | 2822,10, | 2822,11, | 2822,12, | 2822,13, | 2822,14, | 2822,15, | 2822,16, | 2822,17, | 2822,18, | 2822,19, | 2822,20, | 2822,21, | 2822,22, | 2822,23, | 2822,24, | 2822,25, | 2822,26, | 2822,27, | 2822,28, | 2822,29, | 2822,30, | 2822,31, | 2822,32, | 2822,33, | 2822,34, | 2822,35, | 2822,36, | 2822,37, | 2822,38, | 2822,39, | 2822,40, | 2822,41, | 2822,42, | 2822,43, | 2822,44, | 2822,45, | 2822,46, | 2822,47, | 2822,48, | 2822,49, | 2822,50, | 2822,51, | 2822,52, | 2822,53, | 2822,54, | 2822,55, | 2822,56, | 2822,57, | 2822,58, | 2822,59, | 2822,60, | 2822,61, | 2822,62, | 2822,63, | 2822,64, | 2822,65, | 2822,66, | 2822,67, | 2822,68, | 2822,69, | 2822,70, | 2822,71, | 2822,72, | 2822,73, | 2822,74, | 2822,75, | 2822,76, | 2822,77, | 2822,78, | 2822,79, | 2822,80, | 2822,81, | 2822,82, | 2822,83, | 2822,84, | 2822,85, | 2823,1, | 2823,2, | 2823,3, | 2823,4, | 2823,5, | 2823,6, | 2823,7, | 2823,8, | 2823,9, | 2823,10, | 2823,11, | 2823,12, | 2823,13, | 2823,14, | 2823,15, | 2823,16, | 2823,17, | 2823,18, | 2823,19, | 2823,20, | 2823,21, | 2823,22, | 2823,23, | 2823,24, | 2823,25, | 2823,26, | 2823,27, | 2823,28, | 2823,29, | 2823,30, | 2823,31, | 2823,32, | 2823,33, | 2823,34, | 2823,35, | 2823,36, | 2823,37, | 2823,38, | 2823,39, | 2823,40, | 2823,41, | 2823,42, | 2823,43, | 2823,44, | 2823,45, | 2823,46, | 2823,47, | 2823,48, | 2823,49, | 2823,50, | 2823,51, | 2823,52, | 2823,53, | 2823,54, | 2823,55, | 2823,56, | 2823,57, | 2823,58, | 2823,59, | 2823,60, | 2823,61, | 2823,62, | 2823,63, | 2823,64, | 2823,65, | 2823,66, | 2823,67, | 2823,68, | 2823,69, | 2823,70, | 2823,71, | 2823,72, | 2823,73, | 2823,74, | 2823,75, | 2823,76, | 2823,77, | 2823,78, | 2823,79, | 2823,80, | 2823,81, | 2823,82, | 2823,83, | 2823,84, | 2823,85, | 2824,1, | 2824,2, | 2824,3, | 2824,4, | 2824,5, | 2824,6, | 2824,7, | 2824,8, | 2824,9, | 2824,10, | 2824,11, | 2824,12, | 2824,13, | 2824,14, | 2824,15, | 2824,16, | 2824,17, | 2824,18, | 2824,19, | 2824,20, | 2824,21, | 2824,22, | 2824,23, | 2824,24, | 2824,25, | 2824,26, | 2824,27, | 2824,28, | 2824,29, | 2824,30, | 2824,31, | 2824,32, | 2824,33, | 2824,34, | 2824,35, | 2824,36, | 2824,37, | 2824,38, | 2824,39, | 2824,40, | 2824,41, | 2824,42, | 2824,43, | 2824,44, | 2824,45, | 2824,46, | 2824,47, | 2824,48, | 2824,49, | 2824,50, | 2824,51, | 2824,52, | 2824,53, | 2824,54, | 2824,55, | 2824,56, | 2824,57, | 2824,58, | 2824,59, | 2824,60, | 2824,61, | 2824,62, | 2824,63, | 2824,64, | 2824,65, | 2824,66, | 2824,67, | 2824,68, | 2824,69, | 2824,70, | 2824,71, | 2824,72, | 2824,73, | 2824,74, | 2824,75, | 2824,76, | 2824,77, | 2824,78, | 2824,79, | 2824,80, | 2824,81, | 2824,82, | 2824,83, | 2824,84, | 2824,85, | 2825,1, | 2825,2, | 2825,3, | 2825,4, | 2825,5, | 2825,6, | 2825,7, | 2825,8, | 2825,9, | 2825,10, | 2825,11, | 2825,12, | 2825,13, | 2825,14, | 2825,15, | 2825,16, | 2825,17, | 2825,18, | 2825,19, | 2825,20, | 2825,21, | 2825,22, | 2825,23, | 2825,24, | 2825,25, | 2825,26, | 2825,27, | 2825,28, | 2825,29, | 2825,30, | 2825,31, | 2825,32, | 2825,33, | 2825,34, | 2825,35, | 2825,36, | 2825,37, | 2825,38, | 2825,39, | 2825,40, | 2825,41, | 2825,42, | 2825,43, | 2825,44, | 2825,45, | 2825,46, | 2825,47, | 2825,48, | 2825,49, | 2825,50, | 2825,51, | 2825,52, | 2825,53, | 2825,54, | 2825,55, | 2825,56, | 2825,57, | 2825,58, | 2825,59, | 2825,60, | 2825,61, | 2825,62, | 2825,63, | 2825,64, | 2825,65, | 2825,66, | 2825,67, | 2825,68, | 2825,69, | 2825,70, | 2825,71, | 2825,72, | 2825,73, | 2825,74, | 2825,75, | 2825,76, | 2825,77, | 2825,78, | 2825,79, | 2825,80, | 2825,81, | 2825,82, | 2825,83, | 2825,84, | 2825,85, | 2826,1, | 2826,2, | 2826,3, | 2826,4, | 2826,5, | 2826,6, | 2826,7, | 2826,8, | 2826,9, | 2826,10, | 2826,11, | 2826,12, | 2826,13, | 2826,14, | 2826,15, | 2826,16, | 2826,17, | 2826,18, | 2826,19, | 2826,20, | 2826,21, | 2826,22, | 2826,23, | 2826,24, | 2826,25, | 2826,26, | 2826,27, | 2826,28, | 2826,29, | 2826,30, | 2826,31, | 2826,32, | 2826,33, | 2826,34, | 2826,35, | 2826,36, | 2826,37, | 2826,38, | 2826,39, | 2826,40, | 2826,41, | 2826,42, | 2826,43, | 2826,44, | 2826,45, | 2826,46, | 2826,47, | 2826,48, | 2826,49, | 2826,50, | 2826,51, | 2826,52, | 2826,53, | 2826,54, | 2826,55, | 2826,56, | 2826,57, | 2826,58, | 2826,59, | 2826,60, | 2826,61, | 2826,62, | 2826,63, | 2826,64, | 2826,65, | 2826,66, | 2826,67, | 2826,68, | 2826,69, | 2826,70, | 2826,71, | 2826,72, | 2826,73, | 2826,74, | 2826,75, | 2826,76, | 2826,77, | 2826,78, | 2826,79, | 2826,80, | 2826,81, | 2826,82, | 2826,83, | 2826,84, | 2826,85, | 2827,1, | 2827,2, | 2827,3, | 2827,4, | 2827,5, | 2827,6, | 2827,7, | 2827,8, | 2827,9, | 2827,10, | 2827,11, | 2827,12, | 2827,13, | 2827,14, | 2827,15, | 2827,16, | 2827,17, | 2827,18, | 2827,19, | 2827,20, | 2827,21, | 2827,22, | 2827,23, | 2827,24, | 2827,25, | 2827,26, | 2827,27, | 2827,28, | 2827,29, | 2827,30, | 2827,31, | 2827,32, | 2827,33, | 2827,34, | 2827,35, | 2827,36, | 2827,37, | 2827,38, | 2827,39, | 2827,40, | 2827,41, | 2827,42, | 2827,43, | 2827,44, | 2827,45, | 2827,46, | 2827,47, | 2827,48, | 2827,49, | 2827,50, | 2827,51, | 2827,52, | 2827,53, | 2827,54, | 2827,55, | 2827,56, | 2827,57, | 2827,58, | 2827,59, | 2827,60, | 2827,61, | 2827,62, | 2827,63, | 2827,64, | 2827,65, | 2827,66, | 2827,67, | 2827,68, | 2827,69, | 2827,70, | 2827,71, | 2827,72, | 2827,73, | 2827,74, | 2827,75, | 2827,76, | 2827,77, | 2827,78, | 2827,79, | 2827,80, | 2827,81, | 2827,82, | 2827,83, | 2827,84, | 2827,85, | 2828,1, | 2828,2, | 2828,3, | 2828,4, | 2828,5, | 2828,6, | 2828,7, | 2828,8, | 2828,9, | 2828,10, | 2828,11, | 2828,12, | 2828,13, | 2828,14, | 2828,15, | 2828,16, | 2828,17, | 2828,18, | 2828,19, | 2828,20, | 2828,21, | 2828,22, | 2828,23, | 2828,24, | 2828,25, | 2828,26, | 2828,27, | 2828,28, | 2828,29, | 2828,30, | 2828,31, | 2828,32, | 2828,33, | 2828,34, | 2828,35, | 2828,36, | 2828,37, | 2828,38, | 2828,39, | 2828,40, | 2828,41, | 2828,42, | 2828,43, | 2828,44, | 2828,45, | 2828,46, | 2828,47, | 2828,48, | 2828,49, | 2828,50, | 2828,51, | 2828,52, | 2828,53, | 2828,54, | 2828,55, | 2828,56, | 2828,57, | 2828,58, | 2828,59, | 2828,60, | 2828,61, | 2828,62, | 2828,63, | 2828,64, | 2828,65, | 2828,66, | 2828,67, | 2828,68, | 2828,69, | 2828,70, | 2828,71, | 2828,72, | 2828,73, | 2828,74, | 2828,75, | 2828,76, | 2828,77, | 2828,78, | 2828,79, | 2828,80, | 2828,81, | 2828,82, | 2828,83, | 2828,84, | 2828,85, | 2829,1, | 2829,2, | 2829,3, | 2829,4, | 2829,5, | 2829,6, | 2829,7, | 2829,8, | 2829,9, | 2829,10, | 2829,11, | 2829,12, | 2829,13, | 2829,14, | 2829,15, | 2829,16, | 2829,17, | 2829,18, | 2829,19, | 2829,20, | 2829,21, | 2829,22, | 2829,23, | 2829,24, | 2829,25, | 2829,26, | 2829,27, | 2829,28, | 2829,29, | 2829,30, | 2829,31, | 2829,32, | 2829,33, | 2829,34, | 2829,35, | 2829,36, | 2829,37, | 2829,38, | 2829,39, | 2829,40, | 2829,41, | 2829,42, | 2829,43, | 2829,44, | 2829,45, | 2829,46, | 2829,47, | 2829,48, | 2829,49, | 2829,50, | 2829,51, | 2829,52, | 2829,53, | 2829,54, | 2829,55, | 2829,56, | 2829,57, | 2829,58, | 2829,59, | 2829,60, | 2829,61, | 2829,62, | 2829,63, | 2829,64, | 2829,65, | 2829,66, | 2829,67, | 2829,68, | 2829,69, | 2829,70, | 2829,71, | 2829,72, | 2829,73, | 2829,74, | 2829,75, | 2829,76, | 2829,77, | 2829,78, | 2829,79, | 2829,80, | 2829,81, | 2829,82, | 2829,83, | 2829,84, | 2829,85, | 2830,1, | 2830,2, | 2830,3, | 2830,4, | 2830,5, | 2830,6, | 2830,7, | 2830,8, | 2830,9, | 2830,10, | 2830,11, | 2830,12, | 2830,13, | 2830,14, | 2830,15, | 2830,16, | 2830,17, | 2830,18, | 2830,19, | 2830,20, | 2830,21, | 2830,22, | 2830,23, | 2830,24, | 2830,25, | 2830,26, | 2830,27, | 2830,28, | 2830,29, | 2830,30, | 2830,31, | 2830,32, | 2830,33, | 2830,34, | 2830,35, | 2830,36, | 2830,37, | 2830,38, | 2830,39, | 2830,40, | 2830,41, | 2830,42, | 2830,43, | 2830,44, | 2830,45, | 2830,46, | 2830,47, | 2830,48, | 2830,49, | 2830,50, | 2830,51, | 2830,52, | 2830,53, | 2830,54, | 2830,55, | 2830,56, | 2830,57, | 2830,58, | 2830,59, | 2830,60, | 2830,61, | 2830,62, | 2830,63, | 2830,64, | 2830,65, | 2830,66, | 2830,67, | 2830,68, | 2830,69, | 2830,70, | 2830,71, | 2830,72, | 2830,73, | 2830,74, | 2830,75, | 2830,76, | 2830,77, | 2830,78, | 2830,79, | 2830,80, | 2830,81, | 2830,82, | 2830,83, | 2830,84, | 2830,85, | 2831,1, | 2831,2, | 2831,3, | 2831,4, | 2831,5, | 2831,6, | 2831,7, | 2831,8, | 2831,9, | 2831,10, | 2831,11, | 2831,12, | 2831,13, | 2831,14, | 2831,15, | 2831,16, | 2831,17, | 2831,18, | 2831,19, | 2831,20, | 2831,21, | 2831,22, | 2831,23, | 2831,24, | 2831,25, | 2831,26, | 2831,27, | 2831,28, | 2831,29, | 2831,30, | 2831,31, | 2831,32, | 2831,33, | 2831,34, | 2831,35, | 2831,36, | 2831,37, | 2831,38, | 2831,39, | 2831,40, | 2831,41, | 2831,42, | 2831,43, | 2831,44, | 2831,45, | 2831,46, | 2831,47, | 2831,48, | 2831,49, | 2831,50, | 2831,51, | 2831,52, | 2831,53, | 2831,54, | 2831,55, | 2831,56, | 2831,57, | 2831,58, | 2831,59, | 2831,60, | 2831,61, | 2831,62, | 2831,63, | 2831,64, | 2831,65, | 2831,66, | 2831,67, | 2831,68, | 2831,69, | 2831,70, | 2831,71, | 2831,72, | 2831,73, | 2831,74, | 2831,75, | 2831,76, | 2831,77, | 2831,78, | 2831,79, | 2831,80, | 2831,81, | 2831,82, | 2831,83, | 2831,84, | 2831,85, | 2832,1, | 2832,2, | 2832,3, | 2832,4, | 2832,5, | 2832,6, | 2832,7, | 2832,8, | 2832,9, | 2832,10, | 2832,11, | 2832,12, | 2832,13, | 2832,14, | 2832,15, | 2832,16, | 2832,17, | 2832,18, | 2832,19, | 2832,20, | 2832,21, | 2832,22, | 2832,23, | 2832,24, | 2832,25, | 2832,26, | 2832,27, | 2832,28, | 2832,29, | 2832,30, | 2832,31, | 2832,32, | 2832,33, | 2832,34, | 2832,35, | 2832,36, | 2832,37, | 2832,38, | 2832,39, | 2832,40, | 2832,41, | 2832,42, | 2832,43, | 2832,44, | 2832,45, | 2832,46, | 2832,47, | 2832,48, | 2832,49, | 2832,50, | 2832,51, | 2832,52, | 2832,53, | 2832,54, | 2832,55, | 2832,56, | 2832,57, | 2832,58, | 2832,59, | 2832,60, | 2832,61, | 2832,62, | 2832,63, | 2832,64, | 2832,65, | 2832,66, | 2832,67, | 2832,68, | 2832,69, | 2832,70, | 2832,71, | 2832,72, | 2832,73, | 2832,74, | 2832,75, | 2832,76, | 2832,77, | 2832,78, | 2832,79, | 2832,80, | 2832,81, | 2832,82, | 2832,83, | 2832,84, | 2832,85, | 2833,1, | 2833,2, | 2833,3, | 2833,4, | 2833,5, | 2833,6, | 2833,7, | 2833,8, | 2833,9, | 2833,10, | 2833,11, | 2833,12, | 2833,13, | 2833,14, | 2833,15, | 2833,16, | 2833,17, | 2833,18, | 2833,19, | 2833,20, | 2833,21, | 2833,22, | 2833,23, | 2833,24, | 2833,25, | 2833,26, | 2833,27, | 2833,28, | 2833,29, | 2833,30, | 2833,31, | 2833,32, | 2833,33, | 2833,34, | 2833,35, | 2833,36, | 2833,37, | 2833,38, | 2833,39, | 2833,40, | 2833,41, | 2833,42, | 2833,43, | 2833,44, | 2833,45, | 2833,46, | 2833,47, | 2833,48, | 2833,49, | 2833,50, | 2833,51, | 2833,52, | 2833,53, | 2833,54, | 2833,55, | 2833,56, | 2833,57, | 2833,58, | 2833,59, | 2833,60, | 2833,61, | 2833,62, | 2833,63, | 2833,64, | 2833,65, | 2833,66, | 2833,67, | 2833,68, | 2833,69, | 2833,70, | 2833,71, | 2833,72, | 2833,73, | 2833,74, | 2833,75, | 2833,76, | 2833,77, | 2833,78, | 2833,79, | 2833,80, | 2833,81, | 2833,82, | 2833,83, | 2833,84, | 2833,85, | 2834,1, | 2834,2, | 2834,3, | 2834,4, | 2834,5, | 2834,6, | 2834,7, | 2834,8, | 2834,9, | 2834,10, | 2834,11, | 2834,12, | 2834,13, | 2834,14, | 2834,15, | 2834,16, | 2834,17, | 2834,18, | 2834,19, | 2834,20, | 2834,21, | 2834,22, | 2834,23, | 2834,24, | 2834,25, | 2834,26, | 2834,27, | 2834,28, | 2834,29, | 2834,30, | 2834,31, | 2834,32, | 2834,33, | 2834,34, | 2834,35, | 2834,36, | 2834,37, | 2834,38, | 2834,39, | 2834,40, | 2834,41, | 2834,42, | 2834,43, | 2834,44, | 2834,45, | 2834,46, | 2834,47, | 2834,48, | 2834,49, | 2834,50, | 2834,51, | 2834,52, | 2834,53, | 2834,54, | 2834,55, | 2834,56, | 2834,57, | 2834,58, | 2834,59, | 2834,60, | 2834,61, | 2834,62, | 2834,63, | 2834,64, | 2834,65, | 2834,66, | 2834,67, | 2834,68, | 2834,69, | 2834,70, | 2834,71, | 2834,72, | 2834,73, | 2834,74, | 2834,75, | 2834,76, | 2834,77, | 2834,78, | 2834,79, | 2834,80, | 2834,81, | 2834,82, | 2834,83, | 2834,84, | 2834,85, | 2835,1, | 2835,2, | 2835,3, | 2835,4, | 2835,5, | 2835,6, | 2835,7, | 2835,8, | 2835,9, | 2835,10, | 2835,11, | 2835,12, | 2835,13, | 2835,14, | 2835,15, | 2835,16, | 2835,17, | 2835,18, | 2835,19, | 2835,20, | 2835,21, | 2835,22, | 2835,23, | 2835,24, | 2835,25, | 2835,26, | 2835,27, | 2835,28, | 2835,29, | 2835,30, | 2835,31, | 2835,32, | 2835,33, | 2835,34, | 2835,35, | 2835,36, | 2835,37, | 2835,38, | 2835,39, | 2835,40, | 2835,41, | 2835,42, | 2835,43, | 2835,44, | 2835,45, | 2835,46, | 2835,47, | 2835,48, | 2835,49, | 2835,50, | 2835,51, | 2835,52, | 2835,53, | 2835,54, | 2835,55, | 2835,56, | 2835,57, | 2835,58, | 2835,59, | 2835,60, | 2835,61, | 2835,62, | 2835,63, | 2835,64, | 2835,65, | 2835,66, | 2835,67, | 2835,68, | 2835,69, | 2835,70, | 2835,71, | 2835,72, | 2835,73, | 2835,74, | 2835,75, | 2835,76, | 2835,77, | 2835,78, | 2835,79, | 2835,80, | 2835,81, | 2835,82, | 2835,83, | 2835,84, | 2835,85, | 2836,1, | 2836,2, | 2836,3, | 2836,4, | 2836,5, | 2836,6, | 2836,7, | 2836,8, | 2836,9, | 2836,10, | 2836,11, | 2836,12, | 2836,13, | 2836,14, | 2836,15, | 2836,16, | 2836,17, | 2836,18, | 2836,19, | 2836,20, | 2836,21, | 2836,22, | 2836,23, | 2836,24, | 2836,25, | 2836,26, | 2836,27, | 2836,28, | 2836,29, | 2836,30, | 2836,31, | 2836,32, | 2836,33, | 2836,34, | 2836,35, | 2836,36, | 2836,37, | 2836,38, | 2836,39, | 2836,40, | 2836,41, | 2836,42, | 2836,43, | 2836,44, | 2836,45, | 2836,46, | 2836,47, | 2836,48, | 2836,49, | 2836,50, | 2836,51, | 2836,52, | 2836,53, | 2836,54, | 2836,55, | 2836,56, | 2836,57, | 2836,58, | 2836,59, | 2836,60, | 2836,61, | 2836,62, | 2836,63, | 2836,64, | 2836,65, | 2836,66, | 2836,67, | 2836,68, | 2836,69, | 2836,70, | 2836,71, | 2836,72, | 2836,73, | 2836,74, | 2836,75, | 2836,76, | 2836,77, | 2836,78, | 2836,79, | 2836,80, | 2836,81, | 2836,82, | 2836,83, | 2836,84, | 2836,85, | 2837,1, | 2837,2, | 2837,3, | 2837,4, | 2837,5, | 2837,6, | 2837,7, | 2837,8, | 2837,9, | 2837,10, | 2837,11, | 2837,12, | 2837,13, | 2837,14, | 2837,15, | 2837,16, | 2837,17, | 2837,18, | 2837,19, | 2837,20, | 2837,21, | 2837,22, | 2837,23, | 2837,24, | 2837,25, | 2837,26, | 2837,27, | 2837,28, | 2837,29, | 2837,30, | 2837,31, | 2837,32, | 2837,33, | 2837,34, | 2837,35, | 2837,36, | 2837,37, | 2837,38, | 2837,39, | 2837,40, | 2837,41, | 2837,42, | 2837,43, | 2837,44, | 2837,45, | 2837,46, | 2837,47, | 2837,48, | 2837,49, | 2837,50, | 2837,51, | 2837,52, | 2837,53, | 2837,54, | 2837,55, | 2837,56, | 2837,57, | 2837,58, | 2837,59, | 2837,60, | 2837,61, | 2837,62, | 2837,63, | 2837,64, | 2837,65, | 2837,66, | 2837,67, | 2837,68, | 2837,69, | 2837,70, | 2837,71, | 2837,72, | 2837,73, | 2837,74, | 2837,75, | 2837,76, | 2837,77, | 2837,78, | 2837,79, | 2837,80, | 2837,81, | 2837,82, | 2837,83, | 2837,84, | 2837,85, | 2838,1, | 2838,2, | 2838,3, | 2838,4, | 2838,5, | 2838,6, | 2838,7, | 2838,8, | 2838,9, | 2838,10, | 2838,11, | 2838,12, | 2838,13, | 2838,14, | 2838,15, | 2838,16, | 2838,17, | 2838,18, | 2838,19, | 2838,20, | 2838,21, | 2838,22, | 2838,23, | 2838,24, | 2838,25, | 2838,26, | 2838,27, | 2838,28, | 2838,29, | 2838,30, | 2838,31, | 2838,32, | 2838,33, | 2838,34, | 2838,35, | 2838,36, | 2838,37, | 2838,38, | 2838,39, | 2838,40, | 2838,41, | 2838,42, | 2838,43, | 2838,44, | 2838,45, | 2838,46, | 2838,47, | 2838,48, | 2838,49, | 2838,50, | 2838,51, | 2838,52, | 2838,53, | 2838,54, | 2838,55, | 2838,56, | 2838,57, | 2838,58, | 2838,59, | 2838,60, | 2838,61, | 2838,62, | 2838,63, | 2838,64, | 2838,65, | 2838,66, | 2838,67, | 2838,68, | 2838,69, | 2838,70, | 2838,71, | 2838,72, | 2838,73, | 2838,74, | 2838,75, | 2838,76, | 2838,77, | 2838,78, | 2838,79, | 2838,80, | 2838,81, | 2838,82, | 2838,83, | 2838,84, | 2838,85, | 2839,1, | 2839,2, | 2839,3, | 2839,4, | 2839,5, | 2839,6, | 2839,7, | 2839,8, | 2839,9, | 2839,10, | 2839,11, | 2839,12, | 2839,13, | 2839,14, | 2839,15, | 2839,16, | 2839,17, | 2839,18, | 2839,19, | 2839,20, | 2839,21, | 2839,22, | 2839,23, | 2839,24, | 2839,25, | 2839,26, | 2839,27, | 2839,28, | 2839,29, | 2839,30, | 2839,31, | 2839,32, | 2839,33, | 2839,34, | 2839,35, | 2839,36, | 2839,37, | 2839,38, | 2839,39, | 2839,40, | 2839,41, | 2839,42, | 2839,43, | 2839,44, | 2839,45, | 2839,46, | 2839,47, | 2839,48, | 2839,49, | 2839,50, | 2839,51, | 2839,52, | 2839,53, | 2839,54, | 2839,55, | 2839,56, | 2839,57, | 2839,58, | 2839,59, | 2839,60, | 2839,61, | 2839,62, | 2839,63, | 2839,64, | 2839,65, | 2839,66, | 2839,67, | 2839,68, | 2839,69, | 2839,70, | 2839,71, | 2839,72, | 2839,73, | 2839,74, | 2839,75, | 2839,76, | 2839,77, | 2839,78, | 2839,79, | 2839,80, | 2839,81, | 2839,82, | 2839,83, | 2839,84, | 2839,85, | 2840,1, | 2840,2, | 2840,3, | 2840,4, | 2840,5, | 2840,6, | 2840,7, | 2840,8, | 2840,9, | 2840,10, | 2840,11, | 2840,12, | 2840,13, | 2840,14, | 2840,15, | 2840,16, | 2840,17, | 2840,18, | 2840,19, | 2840,20, | 2840,21, | 2840,22, | 2840,23, | 2840,24, | 2840,25, | 2840,26, | 2840,27, | 2840,28, | 2840,29, | 2840,30, | 2840,31, | 2840,32, | 2840,33, | 2840,34, | 2840,35, | 2840,36, | 2840,37, | 2840,38, | 2840,39, | 2840,40, | 2840,41, | 2840,42, | 2840,43, | 2840,44, | 2840,45, | 2840,46, | 2840,47, | 2840,48, | 2840,49, | 2840,50, | 2840,51, | 2840,52, | 2840,53, | 2840,54, | 2840,55, | 2840,56, | 2840,57, | 2840,58, | 2840,59, | 2840,60, | 2840,61, | 2840,62, | 2840,63, | 2840,64, | 2840,65, | 2840,66, | 2840,67, | 2840,68, | 2840,69, | 2840,70, | 2840,71, | 2840,72, | 2840,73, | 2840,74, | 2840,75, | 2840,76, | 2840,77, | 2840,78, | 2840,79, | 2840,80, | 2840,81, | 2840,82, | 2840,83, | 2840,84, | 2840,85, | 2841,1, | 2841,2, | 2841,3, | 2841,4, | 2841,5, | 2841,6, | 2841,7, | 2841,8, | 2841,9, | 2841,10, | 2841,11, | 2841,12, | 2841,13, | 2841,14, | 2841,15, | 2841,16, | 2841,17, | 2841,18, | 2841,19, | 2841,20, | 2841,21, | 2841,22, | 2841,23, | 2841,24, | 2841,25, | 2841,26, | 2841,27, | 2841,28, | 2841,29, | 2841,30, | 2841,31, | 2841,32, | 2841,33, | 2841,34, | 2841,35, | 2841,36, | 2841,37, | 2841,38, | 2841,39, | 2841,40, | 2841,41, | 2841,42, | 2841,43, | 2841,44, | 2841,45, | 2841,46, | 2841,47, | 2841,48, | 2841,49, | 2841,50, | 2841,51, | 2841,52, | 2841,53, | 2841,54, | 2841,55, | 2841,56, | 2841,57, | 2841,58, | 2841,59, | 2841,60, | 2841,61, | 2841,62, | 2841,63, | 2841,64, | 2841,65, | 2841,66, | 2841,67, | 2841,68, | 2841,69, | 2841,70, | 2841,71, | 2841,72, | 2841,73, | 2841,74, | 2841,75, | 2841,76, | 2841,77, | 2841,78, | 2841,79, | 2841,80, | 2841,81, | 2841,82, | 2841,83, | 2841,84, | 2841,85, | 2842,1, | 2842,2, | 2842,3, | 2842,4, | 2842,5, | 2842,6, | 2842,7, | 2842,8, | 2842,9, | 2842,10, | 2842,11, | 2842,12, | 2842,13, | 2842,14, | 2842,15, | 2842,16, | 2842,17, | 2842,18, | 2842,19, | 2842,20, | 2842,21, | 2842,22, | 2842,23, | 2842,24, | 2842,25, | 2842,26, | 2842,27, | 2842,28, | 2842,29, | 2842,30, | 2842,31, | 2842,32, | 2842,33, | 2842,34, | 2842,35, | 2842,36, | 2842,37, | 2842,38, | 2842,39, | 2842,40, | 2842,41, | 2842,42, | 2842,43, | 2842,44, | 2842,45, | 2842,46, | 2842,47, | 2842,48, | 2842,49, | 2842,50, | 2842,51, | 2842,52, | 2842,53, | 2842,54, | 2842,55, | 2842,56, | 2842,57, | 2842,58, | 2842,59, | 2842,60, | 2842,61, | 2842,62, | 2842,63, | 2842,64, | 2842,65, | 2842,66, | 2842,67, | 2842,68, | 2842,69, | 2842,70, | 2842,71, | 2842,72, | 2842,73, | 2842,74, | 2842,75, | 2842,76, | 2842,77, | 2842,78, | 2842,79, | 2842,80, | 2842,81, | 2842,82, | 2842,83, | 2842,84, | 2842,85, | 2843,1, | 2843,2, | 2843,3, | 2843,4, | 2843,5, | 2843,6, | 2843,7, | 2843,8, | 2843,9, | 2843,10, | 2843,11, | 2843,12, | 2843,13, | 2843,14, | 2843,15, | 2843,16, | 2843,17, | 2843,18, | 2843,19, | 2843,20, | 2843,21, | 2843,22, | 2843,23, | 2843,24, | 2843,25, | 2843,26, | 2843,27, | 2843,28, | 2843,29, | 2843,30, | 2843,31, | 2843,32, | 2843,33, | 2843,34, | 2843,35, | 2843,36, | 2843,37, | 2843,38, | 2843,39, | 2843,40, | 2843,41, | 2843,42, | 2843,43, | 2843,44, | 2843,45, | 2843,46, | 2843,47, | 2843,48, | 2843,49, | 2843,50, | 2843,51, | 2843,52, | 2843,53, | 2843,54, | 2843,55, | 2843,56, | 2843,57, | 2843,58, | 2843,59, | 2843,60, | 2843,61, | 2843,62, | 2843,63, | 2843,64, | 2843,65, | 2843,66, | 2843,67, | 2843,68, | 2843,69, | 2843,70, | 2843,71, | 2843,72, | 2843,73, | 2843,74, | 2843,75, | 2843,76, | 2843,77, | 2843,78, | 2843,79, | 2843,80, | 2843,81, | 2843,82, | 2843,83, | 2843,84, | 2843,85, | 2844,1, | 2844,2, | 2844,3, | 2844,4, | 2844,5, | 2844,6, | 2844,7, | 2844,8, | 2844,9, | 2844,10, | 2844,11, | 2844,12, | 2844,13, | 2844,14, | 2844,15, | 2844,16, | 2844,17, | 2844,18, | 2844,19, | 2844,20, | 2844,21, | 2844,22, | 2844,23, | 2844,24, | 2844,25, | 2844,26, | 2844,27, | 2844,28, | 2844,29, | 2844,30, | 2844,31, | 2844,32, | 2844,33, | 2844,34, | 2844,35, | 2844,36, | 2844,37, | 2844,38, | 2844,39, | 2844,40, | 2844,41, | 2844,42, | 2844,43, | 2844,44, | 2844,45, | 2844,46, | 2844,47, | 2844,48, | 2844,49, | 2844,50, | 2844,51, | 2844,52, | 2844,53, | 2844,54, | 2844,55, | 2844,56, | 2844,57, | 2844,58, | 2844,59, | 2844,60, | 2844,61, | 2844,62, | 2844,63, | 2844,64, | 2844,65, | 2844,66, | 2844,67, | 2844,68, | 2844,69, | 2844,70, | 2844,71, | 2844,72, | 2844,73, | 2844,74, | 2844,75, | 2844,76, | 2844,77, | 2844,78, | 2844,79, | 2844,80, | 2844,81, | 2844,82, | 2844,83, | 2844,84, | 2844,85, | 2845,1, | 2845,2, | 2845,3, | 2845,4, | 2845,5, | 2845,6, | 2845,7, | 2845,8, | 2845,9, | 2845,10, | 2845,11, | 2845,12, | 2845,13, | 2845,14, | 2845,15, | 2845,16, | 2845,17, | 2845,18, | 2845,19, | 2845,20, | 2845,21, | 2845,22, | 2845,23, | 2845,24, | 2845,25, | 2845,26, | 2845,27, | 2845,28, | 2845,29, | 2845,30, | 2845,31, | 2845,32, | 2845,33, | 2845,34, | 2845,35, | 2845,36, | 2845,37, | 2845,38, | 2845,39, | 2845,40, | 2845,41, | 2845,42, | 2845,43, | 2845,44, | 2845,45, | 2845,46, | 2845,47, | 2845,48, | 2845,49, | 2845,50, | 2845,51, | 2845,52, | 2845,53, | 2845,54, | 2845,55, | 2845,56, | 2845,57, | 2845,58, | 2845,59, | 2845,60, | 2845,61, | 2845,62, | 2845,63, | 2845,64, | 2845,65, | 2845,66, | 2845,67, | 2845,68, | 2845,69, | 2845,70, | 2845,71, | 2845,72, | 2845,73, | 2845,74, | 2845,75, | 2845,76, | 2845,77, | 2845,78, | 2845,79, | 2845,80, | 2845,81, | 2845,82, | 2845,83, | 2845,84, | 2845,85, | 2846,1, | 2846,2, | 2846,3, | 2846,4, | 2846,5, | 2846,6, | 2846,7, | 2846,8, | 2846,9, | 2846,10, | 2846,11, | 2846,12, | 2846,13, | 2846,14, | 2846,15, | 2846,16, | 2846,17, | 2846,18, | 2846,19, | 2846,20, | 2846,21, | 2846,22, | 2846,23, | 2846,24, | 2846,25, | 2846,26, | 2846,27, | 2846,28, | 2846,29, | 2846,30, | 2846,31, | 2846,32, | 2846,33, | 2846,34, | 2846,35, | 2846,36, | 2846,37, | 2846,38, | 2846,39, | 2846,40, | 2846,41, | 2846,42, | 2846,43, | 2846,44, | 2846,45, | 2846,46, | 2846,47, | 2846,48, | 2846,49, | 2846,50, | 2846,51, | 2846,52, | 2846,53, | 2846,54, | 2846,55, | 2846,56, | 2846,57, | 2846,58, | 2846,59, | 2846,60, | 2846,61, | 2846,62, | 2846,63, | 2846,64, | 2846,65, | 2846,66, | 2846,67, | 2846,68, | 2846,69, | 2846,70, | 2846,71, | 2846,72, | 2846,73, | 2846,74, | 2846,75, | 2846,76, | 2846,77, | 2846,78, | 2846,79, | 2846,80, | 2846,81, | 2846,82, | 2846,83, | 2846,84, | 2846,85, | 2847,1, | 2847,2, | 2847,3, | 2847,4, | 2847,5, | 2847,6, | 2847,7, | 2847,8, | 2847,9, | 2847,10, | 2847,11, | 2847,12, | 2847,13, | 2847,14, | 2847,15, | 2847,16, | 2847,17, | 2847,18, | 2847,19, | 2847,20, | 2847,21, | 2847,22, | 2847,23, | 2847,24, | 2847,25, | 2847,26, | 2847,27, | 2847,28, | 2847,29, | 2847,30, | 2847,31, | 2847,32, | 2847,33, | 2847,34, | 2847,35, | 2847,36, | 2847,37, | 2847,38, | 2847,39, | 2847,40, | 2847,41, | 2847,42, | 2847,43, | 2847,44, | 2847,45, | 2847,46, | 2847,47, | 2847,48, | 2847,49, | 2847,50, | 2847,51, | 2847,52, | 2847,53, | 2847,54, | 2847,55, | 2847,56, | 2847,57, | 2847,58, | 2847,59, | 2847,60, | 2847,61, | 2847,62, | 2847,63, | 2847,64, | 2847,65, | 2847,66, | 2847,67, | 2847,68, | 2847,69, | 2847,70, | 2847,71, | 2847,72, | 2847,73, | 2847,74, | 2847,75, | 2847,76, | 2847,77, | 2847,78, | 2847,79, | 2847,80, | 2847,81, | 2847,82, | 2847,83, | 2847,84, | 2847,85, | 2848,1, | 2848,2, | 2848,3, | 2848,4, | 2848,5, | 2848,6, | 2848,7, | 2848,8, | 2848,9, | 2848,10, | 2848,11, | 2848,12, | 2848,13, | 2848,14, | 2848,15, | 2848,16, | 2848,17, | 2848,18, | 2848,19, | 2848,20, | 2848,21, | 2848,22, | 2848,23, | 2848,24, | 2848,25, | 2848,26, | 2848,27, | 2848,28, | 2848,29, | 2848,30, | 2848,31, | 2848,32, | 2848,33, | 2848,34, | 2848,35, | 2848,36, | 2848,37, | 2848,38, | 2848,39, | 2848,40, | 2848,41, | 2848,42, | 2848,43, | 2848,44, | 2848,45, | 2848,46, | 2848,47, | 2848,48, | 2848,49, | 2848,50, | 2848,51, | 2848,52, | 2848,53, | 2848,54, | 2848,55, | 2848,56, | 2848,57, | 2848,58, | 2848,59, | 2848,60, | 2848,61, | 2848,62, | 2848,63, | 2848,64, | 2848,65, | 2848,66, | 2848,67, | 2848,68, | 2848,69, | 2848,70, | 2848,71, | 2848,72, | 2848,73, | 2848,74, | 2848,75, | 2848,76, | 2848,77, | 2848,78, | 2848,79, | 2848,80, | 2848,81, | 2848,82, | 2848,83, | 2848,84, | 2848,85, | 2849,1, | 2849,2, | 2849,3, | 2849,4, | 2849,5, | 2849,6, | 2849,7, | 2849,8, | 2849,9, | 2849,10, | 2849,11, | 2849,12, | 2849,13, | 2849,14, | 2849,15, | 2849,16, | 2849,17, | 2849,18, | 2849,19, | 2849,20, | 2849,21, | 2849,22, | 2849,23, | 2849,24, | 2849,25, | 2849,26, | 2849,27, | 2849,28, | 2849,29, | 2849,30, | 2849,31, | 2849,32, | 2849,33, | 2849,34, | 2849,35, | 2849,36, | 2849,37, | 2849,38, | 2849,39, | 2849,40, | 2849,41, | 2849,42, | 2849,43, | 2849,44, | 2849,45, | 2849,46, | 2849,47, | 2849,48, | 2849,49, | 2849,50, | 2849,51, | 2849,52, | 2849,53, | 2849,54, | 2849,55, | 2849,56, | 2849,57, | 2849,58, | 2849,59, | 2849,60, | 2849,61, | 2849,62, | 2849,63, | 2849,64, | 2849,65, | 2849,66, | 2849,67, | 2849,68, | 2849,69, | 2849,70, | 2849,71, | 2849,72, | 2849,73, | 2849,74, | 2849,75, | 2849,76, | 2849,77, | 2849,78, | 2849,79, | 2849,80, | 2849,81, | 2849,82, | 2849,83, | 2849,84, | 2849,85, | 2850,1, | 2850,2, | 2850,3, | 2850,4, | 2850,5, | 2850,6, | 2850,7, | 2850,8, | 2850,9, | 2850,10, | 2850,11, | 2850,12, | 2850,13, | 2850,14, | 2850,15, | 2850,16, | 2850,17, | 2850,18, | 2850,19, | 2850,20, | 2850,21, | 2850,22, | 2850,23, | 2850,24, | 2850,25, | 2850,26, | 2850,27, | 2850,28, | 2850,29, | 2850,30, | 2850,31, | 2850,32, | 2850,33, | 2850,34, | 2850,35, | 2850,36, | 2850,37, | 2850,38, | 2850,39, | 2850,40, | 2850,41, | 2850,42, | 2850,43, | 2850,44, | 2850,45, | 2850,46, | 2850,47, | 2850,48, | 2850,49, | 2850,50, | 2850,51, | 2850,52, | 2850,53, | 2850,54, | 2850,55, | 2850,56, | 2850,57, | 2850,58, | 2850,59, | 2850,60, | 2850,61, | 2850,62, | 2850,63, | 2850,64, | 2850,65, | 2850,66, | 2850,67, | 2850,68, | 2850,69, | 2850,70, | 2850,71, | 2850,72, | 2850,73, | 2850,74, | 2850,75, | 2850,76, | 2850,77, | 2850,78, | 2850,79, | 2850,80, | 2850,81, | 2850,82, | 2850,83, | 2850,84, | 2850,85, | 2851,1, | 2851,2, | 2851,3, | 2851,4, | 2851,5, | 2851,6, | 2851,7, | 2851,8, | 2851,9, | 2851,10, | 2851,11, | 2851,12, | 2851,13, | 2851,14, | 2851,15, | 2851,16, | 2851,17, | 2851,18, | 2851,19, | 2851,20, | 2851,21, | 2851,22, | 2851,23, | 2851,24, | 2851,25, | 2851,26, | 2851,27, | 2851,28, | 2851,29, | 2851,30, | 2851,31, | 2851,32, | 2851,33, | 2851,34, | 2851,35, | 2851,36, | 2851,37, | 2851,38, | 2851,39, | 2851,40, | 2851,41, | 2851,42, | 2851,43, | 2851,44, | 2851,45, | 2851,46, | 2851,47, | 2851,48, | 2851,49, | 2851,50, | 2851,51, | 2851,52, | 2851,53, | 2851,54, | 2851,55, | 2851,56, | 2851,57, | 2851,58, | 2851,59, | 2851,60, | 2851,61, | 2851,62, | 2851,63, | 2851,64, | 2851,65, | 2851,66, | 2851,67, | 2851,68, | 2851,69, | 2851,70, | 2851,71, | 2851,72, | 2851,73, | 2851,74, | 2851,75, | 2851,76, | 2851,77, | 2851,78, | 2851,79, | 2851,80, | 2851,81, | 2851,82, | 2851,83, | 2851,84, | 2851,85, | 2852,1, | 2852,2, | 2852,3, | 2852,4, | 2852,5, | 2852,6, | 2852,7, | 2852,8, | 2852,9, | 2852,10, | 2852,11, | 2852,12, | 2852,13, | 2852,14, | 2852,15, | 2852,16, | 2852,17, | 2852,18, | 2852,19, | 2852,20, | 2852,21, | 2852,22, | 2852,23, | 2852,24, | 2852,25, | 2852,26, | 2852,27, | 2852,28, | 2852,29, | 2852,30, | 2852,31, | 2852,32, | 2852,33, | 2852,34, | 2852,35, | 2852,36, | 2852,37, | 2852,38, | 2852,39, | 2852,40, | 2852,41, | 2852,42, | 2852,43, | 2852,44, | 2852,45, | 2852,46, | 2852,47, | 2852,48, | 2852,49, | 2852,50, | 2852,51, | 2852,52, | 2852,53, | 2852,54, | 2852,55, | 2852,56, | 2852,57, | 2852,58, | 2852,59, | 2852,60, | 2852,61, | 2852,62, | 2852,63, | 2852,64, | 2852,65, | 2852,66, | 2852,67, | 2852,68, | 2852,69, | 2852,70, | 2852,71, | 2852,72, | 2852,73, | 2852,74, | 2852,75, | 2852,76, | 2852,77, | 2852,78, | 2852,79, | 2852,80, | 2852,81, | 2852,82, | 2852,83, | 2852,84, | 2852,85, | 2853,1, | 2853,2, | 2853,3, | 2853,4, | 2853,5, | 2853,6, | 2853,7, | 2853,8, | 2853,9, | 2853,10, | 2853,11, | 2853,12, | 2853,13, | 2853,14, | 2853,15, | 2853,16, | 2853,17, | 2853,18, | 2853,19, | 2853,20, | 2853,21, | 2853,22, | 2853,23, | 2853,24, | 2853,25, | 2853,26, | 2853,27, | 2853,28, | 2853,29, | 2853,30, | 2853,31, | 2853,32, | 2853,33, | 2853,34, | 2853,35, | 2853,36, | 2853,37, | 2853,38, | 2853,39, | 2853,40, | 2853,41, | 2853,42, | 2853,43, | 2853,44, | 2853,45, | 2853,46, | 2853,47, | 2853,48, | 2853,49, | 2853,50, | 2853,51, | 2853,52, | 2853,53, | 2853,54, | 2853,55, | 2853,56, | 2853,57, | 2853,58, | 2853,59, | 2853,60, | 2853,61, | 2853,62, | 2853,63, | 2853,64, | 2853,65, | 2853,66, | 2853,67, | 2853,68, | 2853,69, | 2853,70, | 2853,71, | 2853,72, | 2853,73, | 2853,74, | 2853,75, | 2853,76, | 2853,77, | 2853,78, | 2853,79, | 2853,80, | 2853,81, | 2853,82, | 2853,83, | 2853,84, | 2853,85, | 2854,1, | 2854,2, | 2854,3, | 2854,4, | 2854,5, | 2854,6, | 2854,7, | 2854,8, | 2854,9, | 2854,10, | 2854,11, | 2854,12, | 2854,13, | 2854,14, | 2854,15, | 2854,16, | 2854,17, | 2854,18, | 2854,19, | 2854,20, | 2854,21, | 2854,22, | 2854,23, | 2854,24, | 2854,25, | 2854,26, | 2854,27, | 2854,28, | 2854,29, | 2854,30, | 2854,31, | 2854,32, | 2854,33, | 2854,34, | 2854,35, | 2854,36, | 2854,37, | 2854,38, | 2854,39, | 2854,40, | 2854,41, | 2854,42, | 2854,43, | 2854,44, | 2854,45, | 2854,46, | 2854,47, | 2854,48, | 2854,49, | 2854,50, | 2854,51, | 2854,52, | 2854,53, | 2854,54, | 2854,55, | 2854,56, | 2854,57, | 2854,58, | 2854,59, | 2854,60, | 2854,61, | 2854,62, | 2854,63, | 2854,64, | 2854,65, | 2854,66, | 2854,67, | 2854,68, | 2854,69, | 2854,70, | 2854,71, | 2854,72, | 2854,73, | 2854,74, | 2854,75, | 2854,76, | 2854,77, | 2854,78, | 2854,79, | 2854,80, | 2854,81, | 2854,82, | 2854,83, | 2854,84, | 2854,85, | 2855,1, | 2855,2, | 2855,3, | 2855,4, | 2855,5, | 2855,6, | 2855,7, | 2855,8, | 2855,9, | 2855,10, | 2855,11, | 2855,12, | 2855,13, | 2855,14, | 2855,15, | 2855,16, | 2855,17, | 2855,18, | 2855,19, | 2855,20, | 2855,21, | 2855,22, | 2855,23, | 2855,24, | 2855,25, | 2855,26, | 2855,27, | 2855,28, | 2855,29, | 2855,30, | 2855,31, | 2855,32, | 2855,33, | 2855,34, | 2855,35, | 2855,36, | 2855,37, | 2855,38, | 2855,39, | 2855,40, | 2855,41, | 2855,42, | 2855,43, | 2855,44, | 2855,45, | 2855,46, | 2855,47, | 2855,48, | 2855,49, | 2855,50, | 2855,51, | 2855,52, | 2855,53, | 2855,54, | 2855,55, | 2855,56, | 2855,57, | 2855,58, | 2855,59, | 2855,60, | 2855,61, | 2855,62, | 2855,63, | 2855,64, | 2855,65, | 2855,66, | 2855,67, | 2855,68, | 2855,69, | 2855,70, | 2855,71, | 2855,72, | 2855,73, | 2855,74, | 2855,75, | 2855,76, | 2855,77, | 2855,78, | 2855,79, | 2855,80, | 2855,81, | 2855,82, | 2855,83, | 2855,84, | 2855,85, | 2856,1, | 2856,2, | 2856,3, | 2856,4, | 2856,5, | 2856,6, | 2856,7, | 2856,8, | 2856,9, | 2856,10, | 2856,11, | 2856,12, | 2856,13, | 2856,14, | 2856,15, | 2856,16, | 2856,17, | 2856,18, | 2856,19, | 2856,20, | 2856,21, | 2856,22, | 2856,23, | 2856,24, | 2856,25, | 2856,26, | 2856,27, | 2856,28, | 2856,29, | 2856,30, | 2856,31, | 2856,32, | 2856,33, | 2856,34, | 2856,35, | 2856,36, | 2856,37, | 2856,38, | 2856,39, | 2856,40, | 2856,41, | 2856,42, | 2856,43, | 2856,44, | 2856,45, | 2856,46, | 2856,47, | 2856,48, | 2856,49, | 2856,50, | 2856,51, | 2856,52, | 2856,53, | 2856,54, | 2856,55, | 2856,56, | 2856,57, | 2856,58, | 2856,59, | 2856,60, | 2856,61, | 2856,62, | 2856,63, | 2856,64, | 2856,65, | 2856,66, | 2856,67, | 2856,68, | 2856,69, | 2856,70, | 2856,71, | 2856,72, | 2856,73, | 2856,74, | 2856,75, | 2856,76, | 2856,77, | 2856,78, | 2856,79, | 2856,80, | 2856,81, | 2856,82, | 2856,83, | 2856,84, | 2856,85, | 2857,1, | 2857,2, | 2857,3, | 2857,4, | 2857,5, | 2857,6, | 2857,7, | 2857,8, | 2857,9, | 2857,10, | 2857,11, | 2857,12, | 2857,13, | 2857,14, | 2857,15, | 2857,16, | 2857,17, | 2857,18, | 2857,19, | 2857,20, | 2857,21, | 2857,22, | 2857,23, | 2857,24, | 2857,25, | 2857,26, | 2857,27, | 2857,28, | 2857,29, | 2857,30, | 2857,31, | 2857,32, | 2857,33, | 2857,34, | 2857,35, | 2857,36, | 2857,37, | 2857,38, | 2857,39, | 2857,40, | 2857,41, | 2857,42, | 2857,43, | 2857,44, | 2857,45, | 2857,46, | 2857,47, | 2857,48, | 2857,49, | 2857,50, | 2857,51, | 2857,52, | 2857,53, | 2857,54, | 2857,55, | 2857,56, | 2857,57, | 2857,58, | 2857,59, | 2857,60, | 2857,61, | 2857,62, | 2857,63, | 2857,64, | 2857,65, | 2857,66, | 2857,67, | 2857,68, | 2857,69, | 2857,70, | 2857,71, | 2857,72, | 2857,73, | 2857,74, | 2857,75, | 2857,76, | 2857,77, | 2857,78, | 2857,79, | 2857,80, | 2857,81, | 2857,82, | 2857,83, | 2857,84, | 2857,85, | 2858,1, | 2858,2, | 2858,3, | 2858,4, | 2858,5, | 2858,6, | 2858,7, | 2858,8, | 2858,9, | 2858,10, | 2858,11, | 2858,12, | 2858,13, | 2858,14, | 2858,15, | 2858,16, | 2858,17, | 2858,18, | 2858,19, | 2858,20, | 2858,21, | 2858,22, | 2858,23, | 2858,24, | 2858,25, | 2858,26, | 2858,27, | 2858,28, | 2858,29, | 2858,30, | 2858,31, | 2858,32, | 2858,33, | 2858,34, | 2858,35, | 2858,36, | 2858,37, | 2858,38, | 2858,39, | 2858,40, | 2858,41, | 2858,42, | 2858,43, | 2858,44, | 2858,45, | 2858,46, | 2858,47, | 2858,48, | 2858,49, | 2858,50, | 2858,51, | 2858,52, | 2858,53, | 2858,54, | 2858,55, | 2858,56, | 2858,57, | 2858,58, | 2858,59, | 2858,60, | 2858,61, | 2858,62, | 2858,63, | 2858,64, | 2858,65, | 2858,66, | 2858,67, | 2858,68, | 2858,69, | 2858,70, | 2858,71, | 2858,72, | 2858,73, | 2858,74, | 2858,75, | 2858,76, | 2858,77, | 2858,78, | 2858,79, | 2858,80, | 2858,81, | 2858,82, | 2858,83, | 2858,84, | 2858,85, | 2859,1, | 2859,2, | 2859,3, | 2859,4, | 2859,5, | 2859,6, | 2859,7, | 2859,8, | 2859,9, | 2859,10, | 2859,11, | 2859,12, | 2859,13, | 2859,14, | 2859,15, | 2859,16, | 2859,17, | 2859,18, | 2859,19, | 2859,20, | 2859,21, | 2859,22, | 2859,23, | 2859,24, | 2859,25, | 2859,26, | 2859,27, | 2859,28, | 2859,29, | 2859,30, | 2859,31, | 2859,32, | 2859,33, | 2859,34, | 2859,35, | 2859,36, | 2859,37, | 2859,38, | 2859,39, | 2859,40, | 2859,41, | 2859,42, | 2859,43, | 2859,44, | 2859,45, | 2859,46, | 2859,47, | 2859,48, | 2859,49, | 2859,50, | 2859,51, | 2859,52, | 2859,53, | 2859,54, | 2859,55, | 2859,56, | 2859,57, | 2859,58, | 2859,59, | 2859,60, | 2859,61, | 2859,62, | 2859,63, | 2859,64, | 2859,65, | 2859,66, | 2859,67, | 2859,68, | 2859,69, | 2859,70, | 2859,71, | 2859,72, | 2859,73, | 2859,74, | 2859,75, | 2859,76, | 2859,77, | 2859,78, | 2859,79, | 2859,80, | 2859,81, | 2859,82, | 2859,83, | 2859,84, | 2859,85, | 2860,1, | 2860,2, | 2860,3, | 2860,4, | 2860,5, | 2860,6, | 2860,7, | 2860,8, | 2860,9, | 2860,10, | 2860,11, | 2860,12, | 2860,13, | 2860,14, | 2860,15, | 2860,16, | 2860,17, | 2860,18, | 2860,19, | 2860,20, | 2860,21, | 2860,22, | 2860,23, | 2860,24, | 2860,25, | 2860,26, | 2860,27, | 2860,28, | 2860,29, | 2860,30, | 2860,31, | 2860,32, | 2860,33, | 2860,34, | 2860,35, | 2860,36, | 2860,37, | 2860,38, | 2860,39, | 2860,40, | 2860,41, | 2860,42, | 2860,43, | 2860,44, | 2860,45, | 2860,46, | 2860,47, | 2860,48, | 2860,49, | 2860,50, | 2860,51, | 2860,52, | 2860,53, | 2860,54, | 2860,55, | 2860,56, | 2860,57, | 2860,58, | 2860,59, | 2860,60, | 2860,61, | 2860,62, | 2860,63, | 2860,64, | 2860,65, | 2860,66, | 2860,67, | 2860,68, | 2860,69, | 2860,70, | 2860,71, | 2860,72, | 2860,73, | 2860,74, | 2860,75, | 2860,76, | 2860,77, | 2860,78, | 2860,79, | 2860,80, | 2860,81, | 2860,82, | 2860,83, | 2860,84, | 2860,85, | 2861,1, | 2861,2, | 2861,3, | 2861,4, | 2861,5, | 2861,6, | 2861,7, | 2861,8, | 2861,9, | 2861,10, | 2861,11, | 2861,12, | 2861,13, | 2861,14, | 2861,15, | 2861,16, | 2861,17, | 2861,18, | 2861,19, | 2861,20, | 2861,21, | 2861,22, | 2861,23, | 2861,24, | 2861,25, | 2861,26, | 2861,27, | 2861,28, | 2861,29, | 2861,30, | 2861,31, | 2861,32, | 2861,33, | 2861,34, | 2861,35, | 2861,36, | 2861,37, | 2861,38, | 2861,39, | 2861,40, | 2861,41, | 2861,42, | 2861,43, | 2861,44, | 2861,45, | 2861,46, | 2861,47, | 2861,48, | 2861,49, | 2861,50, | 2861,51, | 2861,52, | 2861,53, | 2861,54, | 2861,55, | 2861,56, | 2861,57, | 2861,58, | 2861,59, | 2861,60, | 2861,61, | 2861,62, | 2861,63, | 2861,64, | 2861,65, | 2861,66, | 2861,67, | 2861,68, | 2861,69, | 2861,70, | 2861,71, | 2861,72, | 2861,73, | 2861,74, | 2861,75, | 2861,76, | 2861,77, | 2861,78, | 2861,79, | 2861,80, | 2861,81, | 2861,82, | 2861,83, | 2861,84, | 2861,85, | 2862,1, | 2862,2, | 2862,3, | 2862,4, | 2862,5, | 2862,6, | 2862,7, | 2862,8, | 2862,9, | 2862,10, | 2862,11, | 2862,12, | 2862,13, | 2862,14, | 2862,15, | 2862,16, | 2862,17, | 2862,18, | 2862,19, | 2862,20, | 2862,21, | 2862,22, | 2862,23, | 2862,24, | 2862,25, | 2862,26, | 2862,27, | 2862,28, | 2862,29, | 2862,30, | 2862,31, | 2862,32, | 2862,33, | 2862,34, | 2862,35, | 2862,36, | 2862,37, | 2862,38, | 2862,39, | 2862,40, | 2862,41, | 2862,42, | 2862,43, | 2862,44, | 2862,45, | 2862,46, | 2862,47, | 2862,48, | 2862,49, | 2862,50, | 2862,51, | 2862,52, | 2862,53, | 2862,54, | 2862,55, | 2862,56, | 2862,57, | 2862,58, | 2862,59, | 2862,60, | 2862,61, | 2862,62, | 2862,63, | 2862,64, | 2862,65, | 2862,66, | 2862,67, | 2862,68, | 2862,69, | 2862,70, | 2862,71, | 2862,72, | 2862,73, | 2862,74, | 2862,75, | 2862,76, | 2862,77, | 2862,78, | 2862,79, | 2862,80, | 2862,81, | 2862,82, | 2862,83, | 2862,84, | 2862,85, | 2863,1, | 2863,2, | 2863,3, | 2863,4, | 2863,5, | 2863,6, | 2863,7, | 2863,8, | 2863,9, | 2863,10, | 2863,11, | 2863,12, | 2863,13, | 2863,14, | 2863,15, | 2863,16, | 2863,17, | 2863,18, | 2863,19, | 2863,20, | 2863,21, | 2863,22, | 2863,23, | 2863,24, | 2863,25, | 2863,26, | 2863,27, | 2863,28, | 2863,29, | 2863,30, | 2863,31, | 2863,32, | 2863,33, | 2863,34, | 2863,35, | 2863,36, | 2863,37, | 2863,38, | 2863,39, | 2863,40, | 2863,41, | 2863,42, | 2863,43, | 2863,44, | 2863,45, | 2863,46, | 2863,47, | 2863,48, | 2863,49, | 2863,50, | 2863,51, | 2863,52, | 2863,53, | 2863,54, | 2863,55, | 2863,56, | 2863,57, | 2863,58, | 2863,59, | 2863,60, | 2863,61, | 2863,62, | 2863,63, | 2863,64, | 2863,65, | 2863,66, | 2863,67, | 2863,68, | 2863,69, | 2863,70, | 2863,71, | 2863,72, | 2863,73, | 2863,74, | 2863,75, | 2863,76, | 2863,77, | 2863,78, | 2863,79, | 2863,80, | 2863,81, | 2863,82, | 2863,83, | 2863,84, | 2863,85, | 2864,1, | 2864,2, | 2864,3, | 2864,4, | 2864,5, | 2864,6, | 2864,7, | 2864,8, | 2864,9, | 2864,10, | 2864,11, | 2864,12, | 2864,13, | 2864,14, | 2864,15, | 2864,16, | 2864,17, | 2864,18, | 2864,19, | 2864,20, | 2864,21, | 2864,22, | 2864,23, | 2864,24, | 2864,25, | 2864,26, | 2864,27, | 2864,28, | 2864,29, | 2864,30, | 2864,31, | 2864,32, | 2864,33, | 2864,34, | 2864,35, | 2864,36, | 2864,37, | 2864,38, | 2864,39, | 2864,40, | 2864,41, | 2864,42, | 2864,43, | 2864,44, | 2864,45, | 2864,46, | 2864,47, | 2864,48, | 2864,49, | 2864,50, | 2864,51, | 2864,52, | 2864,53, | 2864,54, | 2864,55, | 2864,56, | 2864,57, | 2864,58, | 2864,59, | 2864,60, | 2864,61, | 2864,62, | 2864,63, | 2864,64, | 2864,65, | 2864,66, | 2864,67, | 2864,68, | 2864,69, | 2864,70, | 2864,71, | 2864,72, | 2864,73, | 2864,74, | 2864,75, | 2864,76, | 2864,77, | 2864,78, | 2864,79, | 2864,80, | 2864,81, | 2864,82, | 2864,83, | 2864,84, | 2864,85, | 2865,1, | 2865,2, | 2865,3, | 2865,4, | 2865,5, | 2865,6, | 2865,7, | 2865,8, | 2865,9, | 2865,10, | 2865,11, | 2865,12, | 2865,13, | 2865,14, | 2865,15, | 2865,16, | 2865,17, | 2865,18, | 2865,19, | 2865,20, | 2865,21, | 2865,22, | 2865,23, | 2865,24, | 2865,25, | 2865,26, | 2865,27, | 2865,28, | 2865,29, | 2865,30, | 2865,31, | 2865,32, | 2865,33, | 2865,34, | 2865,35, | 2865,36, | 2865,37, | 2865,38, | 2865,39, | 2865,40, | 2865,41, | 2865,42, | 2865,43, | 2865,44, | 2865,45, | 2865,46, | 2865,47, | 2865,48, | 2865,49, | 2865,50, | 2865,51, | 2865,52, | 2865,53, | 2865,54, | 2865,55, | 2865,56, | 2865,57, | 2865,58, | 2865,59, | 2865,60, | 2865,61, | 2865,62, | 2865,63, | 2865,64, | 2865,65, | 2865,66, | 2865,67, | 2865,68, | 2865,69, | 2865,70, | 2865,71, | 2865,72, | 2865,73, | 2865,74, | 2865,75, | 2865,76, | 2865,77, | 2865,78, | 2865,79, | 2865,80, | 2865,81, | 2865,82, | 2865,83, | 2865,84, | 2865,85, | 2866,1, | 2866,2, | 2866,3, | 2866,4, | 2866,5, | 2866,6, | 2866,7, | 2866,8, | 2866,9, | 2866,10, | 2866,11, | 2866,12, | 2866,13, | 2866,14, | 2866,15, | 2866,16, | 2866,17, | 2866,18, | 2866,19, | 2866,20, | 2866,21, | 2866,22, | 2866,23, | 2866,24, | 2866,25, | 2866,26, | 2866,27, | 2866,28, | 2866,29, | 2866,30, | 2866,31, | 2866,32, | 2866,33, | 2866,34, | 2866,35, | 2866,36, | 2866,37, | 2866,38, | 2866,39, | 2866,40, | 2866,41, | 2866,42, | 2866,43, | 2866,44, | 2866,45, | 2866,46, | 2866,47, | 2866,48, | 2866,49, | 2866,50, | 2866,51, | 2866,52, | 2866,53, | 2866,54, | 2866,55, | 2866,56, | 2866,57, | 2866,58, | 2866,59, | 2866,60, | 2866,61, | 2866,62, | 2866,63, | 2866,64, | 2866,65, | 2866,66, | 2866,67, | 2866,68, | 2866,69, | 2866,70, | 2866,71, | 2866,72, | 2866,73, | 2866,74, | 2866,75, | 2866,76, | 2866,77, | 2866,78, | 2866,79, | 2866,80, | 2866,81, | 2866,82, | 2866,83, | 2866,84, | 2866,85, | 2867,1, | 2867,2, | 2867,3, | 2867,4, | 2867,5, | 2867,6, | 2867,7, | 2867,8, | 2867,9, | 2867,10, | 2867,11, | 2867,12, | 2867,13, | 2867,14, | 2867,15, | 2867,16, | 2867,17, | 2867,18, | 2867,19, | 2867,20, | 2867,21, | 2867,22, | 2867,23, | 2867,24, | 2867,25, | 2867,26, | 2867,27, | 2867,28, | 2867,29, | 2867,30, | 2867,31, | 2867,32, | 2867,33, | 2867,34, | 2867,35, | 2867,36, | 2867,37, | 2867,38, | 2867,39, | 2867,40, | 2867,41, | 2867,42, | 2867,43, | 2867,44, | 2867,45, | 2867,46, | 2867,47, | 2867,48, | 2867,49, | 2867,50, | 2867,51, | 2867,52, | 2867,53, | 2867,54, | 2867,55, | 2867,56, | 2867,57, | 2867,58, | 2867,59, | 2867,60, | 2867,61, | 2867,62, | 2867,63, | 2867,64, | 2867,65, | 2867,66, | 2867,67, | 2867,68, | 2867,69, | 2867,70, | 2867,71, | 2867,72, | 2867,73, | 2867,74, | 2867,75, | 2867,76, | 2867,77, | 2867,78, | 2867,79, | 2867,80, | 2867,81, | 2867,82, | 2867,83, | 2867,84, | 2867,85, | 2868,1, | 2868,2, | 2868,3, | 2868,4, | 2868,5, | 2868,6, | 2868,7, | 2868,8, | 2868,9, | 2868,10, | 2868,11, | 2868,12, | 2868,13, | 2868,14, | 2868,15, | 2868,16, | 2868,17, | 2868,18, | 2868,19, | 2868,20, | 2868,21, | 2868,22, | 2868,23, | 2868,24, | 2868,25, | 2868,26, | 2868,27, | 2868,28, | 2868,29, | 2868,30, | 2868,31, | 2868,32, | 2868,33, | 2868,34, | 2868,35, | 2868,36, | 2868,37, | 2868,38, | 2868,39, | 2868,40, | 2868,41, | 2868,42, | 2868,43, | 2868,44, | 2868,45, | 2868,46, | 2868,47, | 2868,48, | 2868,49, | 2868,50, | 2868,51, | 2868,52, | 2868,53, | 2868,54, | 2868,55, | 2868,56, | 2868,57, | 2868,58, | 2868,59, | 2868,60, | 2868,61, | 2868,62, | 2868,63, | 2868,64, | 2868,65, | 2868,66, | 2868,67, | 2868,68, | 2868,69, | 2868,70, | 2868,71, | 2868,72, | 2868,73, | 2868,74, | 2868,75, | 2868,76, | 2868,77, | 2868,78, | 2868,79, | 2868,80, | 2868,81, | 2868,82, | 2868,83, | 2868,84, | 2868,85, | 2869,1, | 2869,2, | 2869,3, | 2869,4, | 2869,5, | 2869,6, | 2869,7, | 2869,8, | 2869,9, | 2869,10, | 2869,11, | 2869,12, | 2869,13, | 2869,14, | 2869,15, | 2869,16, | 2869,17, | 2869,18, | 2869,19, | 2869,20, | 2869,21, | 2869,22, | 2869,23, | 2869,24, | 2869,25, | 2869,26, | 2869,27, | 2869,28, | 2869,29, | 2869,30, | 2869,31, | 2869,32, | 2869,33, | 2869,34, | 2869,35, | 2869,36, | 2869,37, | 2869,38, | 2869,39, | 2869,40, | 2869,41, | 2869,42, | 2869,43, | 2869,44, | 2869,45, | 2869,46, | 2869,47, | 2869,48, | 2869,49, | 2869,50, | 2869,51, | 2869,52, | 2869,53, | 2869,54, | 2869,55, | 2869,56, | 2869,57, | 2869,58, | 2869,59, | 2869,60, | 2869,61, | 2869,62, | 2869,63, | 2869,64, | 2869,65, | 2869,66, | 2869,67, | 2869,68, | 2869,69, | 2869,70, | 2869,71, | 2869,72, | 2869,73, | 2869,74, | 2869,75, | 2869,76, | 2869,77, | 2869,78, | 2869,79, | 2869,80, | 2869,81, | 2869,82, | 2869,83, | 2869,84, | 2869,85, | 2870,1, | 2870,2, | 2870,3, | 2870,4, | 2870,5, | 2870,6, | 2870,7, | 2870,8, | 2870,9, | 2870,10, | 2870,11, | 2870,12, | 2870,13, | 2870,14, | 2870,15, | 2870,16, | 2870,17, | 2870,18, | 2870,19, | 2870,20, | 2870,21, | 2870,22, | 2870,23, | 2870,24, | 2870,25, | 2870,26, | 2870,27, | 2870,28, | 2870,29, | 2870,30, | 2870,31, | 2870,32, | 2870,33, | 2870,34, | 2870,35, | 2870,36, | 2870,37, | 2870,38, | 2870,39, | 2870,40, | 2870,41, | 2870,42, | 2870,43, | 2870,44, | 2870,45, | 2870,46, | 2870,47, | 2870,48, | 2870,49, | 2870,50, | 2870,51, | 2870,52, | 2870,53, | 2870,54, | 2870,55, | 2870,56, | 2870,57, | 2870,58, | 2870,59, | 2870,60, | 2870,61, | 2870,62, | 2870,63, | 2870,64, | 2870,65, | 2870,66, | 2870,67, | 2870,68, | 2870,69, | 2870,70, | 2870,71, | 2870,72, | 2870,73, | 2870,74, | 2870,75, | 2870,76, | 2870,77, | 2870,78, | 2870,79, | 2870,80, | 2870,81, | 2870,82, | 2870,83, | 2870,84, | 2870,85, | 2871,1, | 2871,2, | 2871,3, | 2871,4, | 2871,5, | 2871,6, | 2871,7, | 2871,8, | 2871,9, | 2871,10, | 2871,11, | 2871,12, | 2871,13, | 2871,14, | 2871,15, | 2871,16, | 2871,17, | 2871,18, | 2871,19, | 2871,20, | 2871,21, | 2871,22, | 2871,23, | 2871,24, | 2871,25, | 2871,26, | 2871,27, | 2871,28, | 2871,29, | 2871,30, | 2871,31, | 2871,32, | 2871,33, | 2871,34, | 2871,35, | 2871,36, | 2871,37, | 2871,38, | 2871,39, | 2871,40, | 2871,41, | 2871,42, | 2871,43, | 2871,44, | 2871,45, | 2871,46, | 2871,47, | 2871,48, | 2871,49, | 2871,50, | 2871,51, | 2871,52, | 2871,53, | 2871,54, | 2871,55, | 2871,56, | 2871,57, | 2871,58, | 2871,59, | 2871,60, | 2871,61, | 2871,62, | 2871,63, | 2871,64, | 2871,65, | 2871,66, | 2871,67, | 2871,68, | 2871,69, | 2871,70, | 2871,71, | 2871,72, | 2871,73, | 2871,74, | 2871,75, | 2871,76, | 2871,77, | 2871,78, | 2871,79, | 2871,80, | 2871,81, | 2871,82, | 2871,83, | 2871,84, | 2871,85, | 2872,1, | 2872,2, | 2872,3, | 2872,4, | 2872,5, | 2872,6, | 2872,7, | 2872,8, | 2872,9, | 2872,10, | 2872,11, | 2872,12, | 2872,13, | 2872,14, | 2872,15, | 2872,16, | 2872,17, | 2872,18, | 2872,19, | 2872,20, | 2872,21, | 2872,22, | 2872,23, | 2872,24, | 2872,25, | 2872,26, | 2872,27, | 2872,28, | 2872,29, | 2872,30, | 2872,31, | 2872,32, | 2872,33, | 2872,34, | 2872,35, | 2872,36, | 2872,37, | 2872,38, | 2872,39, | 2872,40, | 2872,41, | 2872,42, | 2872,43, | 2872,44, | 2872,45, | 2872,46, | 2872,47, | 2872,48, | 2872,49, | 2872,50, | 2872,51, | 2872,52, | 2872,53, | 2872,54, | 2872,55, | 2872,56, | 2872,57, | 2872,58, | 2872,59, | 2872,60, | 2872,61, | 2872,62, | 2872,63, | 2872,64, | 2872,65, | 2872,66, | 2872,67, | 2872,68, | 2872,69, | 2872,70, | 2872,71, | 2872,72, | 2872,73, | 2872,74, | 2872,75, | 2872,76, | 2872,77, | 2872,78, | 2872,79, | 2872,80, | 2872,81, | 2872,82, | 2872,83, | 2872,84, | 2872,85, | 2873,1, | 2873,2, | 2873,3, | 2873,4, | 2873,5, | 2873,6, | 2873,7, | 2873,8, | 2873,9, | 2873,10, | 2873,11, | 2873,12, | 2873,13, | 2873,14, | 2873,15, | 2873,16, | 2873,17, | 2873,18, | 2873,19, | 2873,20, | 2873,21, | 2873,22, | 2873,23, | 2873,24, | 2873,25, | 2873,26, | 2873,27, | 2873,28, | 2873,29, | 2873,30, | 2873,31, | 2873,32, | 2873,33, | 2873,34, | 2873,35, | 2873,36, | 2873,37, | 2873,38, | 2873,39, | 2873,40, | 2873,41, | 2873,42, | 2873,43, | 2873,44, | 2873,45, | 2873,46, | 2873,47, | 2873,48, | 2873,49, | 2873,50, | 2873,51, | 2873,52, | 2873,53, | 2873,54, | 2873,55, | 2873,56, | 2873,57, | 2873,58, | 2873,59, | 2873,60, | 2873,61, | 2873,62, | 2873,63, | 2873,64, | 2873,65, | 2873,66, | 2873,67, | 2873,68, | 2873,69, | 2873,70, | 2873,71, | 2873,72, | 2873,73, | 2873,74, | 2873,75, | 2873,76, | 2873,77, | 2873,78, | 2873,79, | 2873,80, | 2873,81, | 2873,82, | 2873,83, | 2873,84, | 2873,85, | 2874,1, | 2874,2, | 2874,3, | 2874,4, | 2874,5, | 2874,6, | 2874,7, | 2874,8, | 2874,9, | 2874,10, | 2874,11, | 2874,12, | 2874,13, | 2874,14, | 2874,15, | 2874,16, | 2874,17, | 2874,18, | 2874,19, | 2874,20, | 2874,21, | 2874,22, | 2874,23, | 2874,24, | 2874,25, | 2874,26, | 2874,27, | 2874,28, | 2874,29, | 2874,30, | 2874,31, | 2874,32, | 2874,33, | 2874,34, | 2874,35, | 2874,36, | 2874,37, | 2874,38, | 2874,39, | 2874,40, | 2874,41, | 2874,42, | 2874,43, | 2874,44, | 2874,45, | 2874,46, | 2874,47, | 2874,48, | 2874,49, | 2874,50, | 2874,51, | 2874,52, | 2874,53, | 2874,54, | 2874,55, | 2874,56, | 2874,57, | 2874,58, | 2874,59, | 2874,60, | 2874,61, | 2874,62, | 2874,63, | 2874,64, | 2874,65, | 2874,66, | 2874,67, | 2874,68, | 2874,69, | 2874,70, | 2874,71, | 2874,72, | 2874,73, | 2874,74, | 2874,75, | 2874,76, | 2874,77, | 2874,78, | 2874,79, | 2874,80, | 2874,81, | 2874,82, | 2874,83, | 2874,84, | 2874,85, | 2875,1, | 2875,2, | 2875,3, | 2875,4, | 2875,5, | 2875,6, | 2875,7, | 2875,8, | 2875,9, | 2875,10, | 2875,11, | 2875,12, | 2875,13, | 2875,14, | 2875,15, | 2875,16, | 2875,17, | 2875,18, | 2875,19, | 2875,20, | 2875,21, | 2875,22, | 2875,23, | 2875,24, | 2875,25, | 2875,26, | 2875,27, | 2875,28, | 2875,29, | 2875,30, | 2875,31, | 2875,32, | 2875,33, | 2875,34, | 2875,35, | 2875,36, | 2875,37, | 2875,38, | 2875,39, | 2875,40, | 2875,41, | 2875,42, | 2875,43, | 2875,44, | 2875,45, | 2875,46, | 2875,47, | 2875,48, | 2875,49, | 2875,50, | 2875,51, | 2875,52, | 2875,53, | 2875,54, | 2875,55, | 2875,56, | 2875,57, | 2875,58, | 2875,59, | 2875,60, | 2875,61, | 2875,62, | 2875,63, | 2875,64, | 2875,65, | 2875,66, | 2875,67, | 2875,68, | 2875,69, | 2875,70, | 2875,71, | 2875,72, | 2875,73, | 2875,74, | 2875,75, | 2875,76, | 2875,77, | 2875,78, | 2875,79, | 2875,80, | 2875,81, | 2875,82, | 2875,83, | 2875,84, | 2875,85, | 2876,1, | 2876,2, | 2876,3, | 2876,4, | 2876,5, | 2876,6, | 2876,7, | 2876,8, | 2876,9, | 2876,10, | 2876,11, | 2876,12, | 2876,13, | 2876,14, | 2876,15, | 2876,16, | 2876,17, | 2876,18, | 2876,19, | 2876,20, | 2876,21, | 2876,22, | 2876,23, | 2876,24, | 2876,25, | 2876,26, | 2876,27, | 2876,28, | 2876,29, | 2876,30, | 2876,31, | 2876,32, | 2876,33, | 2876,34, | 2876,35, | 2876,36, | 2876,37, | 2876,38, | 2876,39, | 2876,40, | 2876,41, | 2876,42, | 2876,43, | 2876,44, | 2876,45, | 2876,46, | 2876,47, | 2876,48, | 2876,49, | 2876,50, | 2876,51, | 2876,52, | 2876,53, | 2876,54, | 2876,55, | 2876,56, | 2876,57, | 2876,58, | 2876,59, | 2876,60, | 2876,61, | 2876,62, | 2876,63, | 2876,64, | 2876,65, | 2876,66, | 2876,67, | 2876,68, | 2876,69, | 2876,70, | 2876,71, | 2876,72, | 2876,73, | 2876,74, | 2876,75, | 2876,76, | 2876,77, | 2876,78, | 2876,79, | 2876,80, | 2876,81, | 2876,82, | 2876,83, | 2876,84, | 2876,85, | 2877,1, | 2877,2, | 2877,3, | 2877,4, | 2877,5, | 2877,6, | 2877,7, | 2877,8, | 2877,9, | 2877,10, | 2877,11, | 2877,12, | 2877,13, | 2877,14, | 2877,15, | 2877,16, | 2877,17, | 2877,18, | 2877,19, | 2877,20, | 2877,21, | 2877,22, | 2877,23, | 2877,24, | 2877,25, | 2877,26, | 2877,27, | 2877,28, | 2877,29, | 2877,30, | 2877,31, | 2877,32, | 2877,33, | 2877,34, | 2877,35, | 2877,36, | 2877,37, | 2877,38, | 2877,39, | 2877,40, | 2877,41, | 2877,42, | 2877,43, | 2877,44, | 2877,45, | 2877,46, | 2877,47, | 2877,48, | 2877,49, | 2877,50, | 2877,51, | 2877,52, | 2877,53, | 2877,54, | 2877,55, | 2877,56, | 2877,57, | 2877,58, | 2877,59, | 2877,60, | 2877,61, | 2877,62, | 2877,63, | 2877,64, | 2877,65, | 2877,66, | 2877,67, | 2877,68, | 2877,69, | 2877,70, | 2877,71, | 2877,72, | 2877,73, | 2877,74, | 2877,75, | 2877,76, | 2877,77, | 2877,78, | 2877,79, | 2877,80, | 2877,81, | 2877,82, | 2877,83, | 2877,84, | 2877,85, | 2878,1, | 2878,2, | 2878,3, | 2878,4, | 2878,5, | 2878,6, | 2878,7, | 2878,8, | 2878,9, | 2878,10, | 2878,11, | 2878,12, | 2878,13, | 2878,14, | 2878,15, | 2878,16, | 2878,17, | 2878,18, | 2878,19, | 2878,20, | 2878,21, | 2878,22, | 2878,23, | 2878,24, | 2878,25, | 2878,26, | 2878,27, | 2878,28, | 2878,29, | 2878,30, | 2878,31, | 2878,32, | 2878,33, | 2878,34, | 2878,35, | 2878,36, | 2878,37, | 2878,38, | 2878,39, | 2878,40, | 2878,41, | 2878,42, | 2878,43, | 2878,44, | 2878,45, | 2878,46, | 2878,47, | 2878,48, | 2878,49, | 2878,50, | 2878,51, | 2878,52, | 2878,53, | 2878,54, | 2878,55, | 2878,56, | 2878,57, | 2878,58, | 2878,59, | 2878,60, | 2878,61, | 2878,62, | 2878,63, | 2878,64, | 2878,65, | 2878,66, | 2878,67, | 2878,68, | 2878,69, | 2878,70, | 2878,71, | 2878,72, | 2878,73, | 2878,74, | 2878,75, | 2878,76, | 2878,77, | 2878,78, | 2878,79, | 2878,80, | 2878,81, | 2878,82, | 2878,83, | 2878,84, | 2878,85, | 2879,1, | 2879,2, | 2879,3, | 2879,4, | 2879,5, | 2879,6, | 2879,7, | 2879,8, | 2879,9, | 2879,10, | 2879,11, | 2879,12, | 2879,13, | 2879,14, | 2879,15, | 2879,16, | 2879,17, | 2879,18, | 2879,19, | 2879,20, | 2879,21, | 2879,22, | 2879,23, | 2879,24, | 2879,25, | 2879,26, | 2879,27, | 2879,28, | 2879,29, | 2879,30, | 2879,31, | 2879,32, | 2879,33, | 2879,34, | 2879,35, | 2879,36, | 2879,37, | 2879,38, | 2879,39, | 2879,40, | 2879,41, | 2879,42, | 2879,43, | 2879,44, | 2879,45, | 2879,46, | 2879,47, | 2879,48, | 2879,49, | 2879,50, | 2879,51, | 2879,52, | 2879,53, | 2879,54, | 2879,55, | 2879,56, | 2879,57, | 2879,58, | 2879,59, | 2879,60, | 2879,61, | 2879,62, | 2879,63, | 2879,64, | 2879,65, | 2879,66, | 2879,67, | 2879,68, | 2879,69, | 2879,70, | 2879,71, | 2879,72, | 2879,73, | 2879,74, | 2879,75, | 2879,76, | 2879,77, | 2879,78, | 2879,79, | 2879,80, | 2879,81, | 2879,82, | 2879,83, | 2879,84, | 2879,85, | 2880,1, | 2880,2, | 2880,3, | 2880,4, | 2880,5, | 2880,6, | 2880,7, | 2880,8, | 2880,9, | 2880,10, | 2880,11, | 2880,12, | 2880,13, | 2880,14, | 2880,15, | 2880,16, | 2880,17, | 2880,18, | 2880,19, | 2880,20, | 2880,21, | 2880,22, | 2880,23, | 2880,24, | 2880,25, | 2880,26, | 2880,27, | 2880,28, | 2880,29, | 2880,30, | 2880,31, | 2880,32, | 2880,33, | 2880,34, | 2880,35, | 2880,36, | 2880,37, | 2880,38, | 2880,39, | 2880,40, | 2880,41, | 2880,42, | 2880,43, | 2880,44, | 2880,45, | 2880,46, | 2880,47, | 2880,48, | 2880,49, | 2880,50, | 2880,51, | 2880,52, | 2880,53, | 2880,54, | 2880,55, | 2880,56, | 2880,57, | 2880,58, | 2880,59, | 2880,60, | 2880,61, | 2880,62, | 2880,63, | 2880,64, | 2880,65, | 2880,66, | 2880,67, | 2880,68, | 2880,69, | 2880,70, | 2880,71, | 2880,72, | 2880,73, | 2880,74, | 2880,75, | 2880,76, | 2880,77, | 2880,78, | 2880,79, | 2880,80, | 2880,81, | 2880,82, | 2880,83, | 2880,84, | 2880,85, | 2881,1, | 2881,2, | 2881,3, | 2881,4, | 2881,5, | 2881,6, | 2881,7, | 2881,8, | 2881,9, | 2881,10, | 2881,11, | 2881,12, | 2881,13, | 2881,14, | 2881,15, | 2881,16, | 2881,17, | 2881,18, | 2881,19, | 2881,20, | 2881,21, | 2881,22, | 2881,23, | 2881,24, | 2881,25, | 2881,26, | 2881,27, | 2881,28, | 2881,29, | 2881,30, | 2881,31, | 2881,32, | 2881,33, | 2881,34, | 2881,35, | 2881,36, | 2881,37, | 2881,38, | 2881,39, | 2881,40, | 2881,41, | 2881,42, | 2881,43, | 2881,44, | 2881,45, | 2881,46, | 2881,47, | 2881,48, | 2881,49, | 2881,50, | 2881,51, | 2881,52, | 2881,53, | 2881,54, | 2881,55, | 2881,56, | 2881,57, | 2881,58, | 2881,59, | 2881,60, | 2881,61, | 2881,62, | 2881,63, | 2881,64, | 2881,65, | 2881,66, | 2881,67, | 2881,68, | 2881,69, | 2881,70, | 2881,71, | 2881,72, | 2881,73, | 2881,74, | 2881,75, | 2881,76, | 2881,77, | 2881,78, | 2881,79, | 2881,80, | 2881,81, | 2881,82, | 2881,83, | 2881,84, | 2881,85, | 2882,1, | 2882,2, | 2882,3, | 2882,4, | 2882,5, | 2882,6, | 2882,7, | 2882,8, | 2882,9, | 2882,10, | 2882,11, | 2882,12, | 2882,13, | 2882,14, | 2882,15, | 2882,16, | 2882,17, | 2882,18, | 2882,19, | 2882,20, | 2882,21, | 2882,22, | 2882,23, | 2882,24, | 2882,25, | 2882,26, | 2882,27, | 2882,28, | 2882,29, | 2882,30, | 2882,31, | 2882,32, | 2882,33, | 2882,34, | 2882,35, | 2882,36, | 2882,37, | 2882,38, | 2882,39, | 2882,40, | 2882,41, | 2882,42, | 2882,43, | 2882,44, | 2882,45, | 2882,46, | 2882,47, | 2882,48, | 2882,49, | 2882,50, | 2882,51, | 2882,52, | 2882,53, | 2882,54, | 2882,55, | 2882,56, | 2882,57, | 2882,58, | 2882,59, | 2882,60, | 2882,61, | 2882,62, | 2882,63, | 2882,64, | 2882,65, | 2882,66, | 2882,67, | 2882,68, | 2882,69, | 2882,70, | 2882,71, | 2882,72, | 2882,73, | 2882,74, | 2882,75, | 2882,76, | 2882,77, | 2882,78, | 2882,79, | 2882,80, | 2882,81, | 2882,82, | 2882,83, | 2882,84, | 2882,85, | 2883,1, | 2883,2, | 2883,3, | 2883,4, | 2883,5, | 2883,6, | 2883,7, | 2883,8, | 2883,9, | 2883,10, | 2883,11, | 2883,12, | 2883,13, | 2883,14, | 2883,15, | 2883,16, | 2883,17, | 2883,18, | 2883,19, | 2883,20, | 2883,21, | 2883,22, | 2883,23, | 2883,24, | 2883,25, | 2883,26, | 2883,27, | 2883,28, | 2883,29, | 2883,30, | 2883,31, | 2883,32, | 2883,33, | 2883,34, | 2883,35, | 2883,36, | 2883,37, | 2883,38, | 2883,39, | 2883,40, | 2883,41, | 2883,42, | 2883,43, | 2883,44, | 2883,45, | 2883,46, | 2883,47, | 2883,48, | 2883,49, | 2883,50, | 2883,51, | 2883,52, | 2883,53, | 2883,54, | 2883,55, | 2883,56, | 2883,57, | 2883,58, | 2883,59, | 2883,60, | 2883,61, | 2883,62, | 2883,63, | 2883,64, | 2883,65, | 2883,66, | 2883,67, | 2883,68, | 2883,69, | 2883,70, | 2883,71, | 2883,72, | 2883,73, | 2883,74, | 2883,75, | 2883,76, | 2883,77, | 2883,78, | 2883,79, | 2883,80, | 2883,81, | 2883,82, | 2883,83, | 2883,84, | 2883,85, | 2884,1, | 2884,2, | 2884,3, | 2884,4, | 2884,5, | 2884,6, | 2884,7, | 2884,8, | 2884,9, | 2884,10, | 2884,11, | 2884,12, | 2884,13, | 2884,14, | 2884,15, | 2884,16, | 2884,17, | 2884,18, | 2884,19, | 2884,20, | 2884,21, | 2884,22, | 2884,23, | 2884,24, | 2884,25, | 2884,26, | 2884,27, | 2884,28, | 2884,29, | 2884,30, | 2884,31, | 2884,32, | 2884,33, | 2884,34, | 2884,35, | 2884,36, | 2884,37, | 2884,38, | 2884,39, | 2884,40, | 2884,41, | 2884,42, | 2884,43, | 2884,44, | 2884,45, | 2884,46, | 2884,47, | 2884,48, | 2884,49, | 2884,50, | 2884,51, | 2884,52, | 2884,53, | 2884,54, | 2884,55, | 2884,56, | 2884,57, | 2884,58, | 2884,59, | 2884,60, | 2884,61, | 2884,62, | 2884,63, | 2884,64, | 2884,65, | 2884,66, | 2884,67, | 2884,68, | 2884,69, | 2884,70, | 2884,71, | 2884,72, | 2884,73, | 2884,74, | 2884,75, | 2884,76, | 2884,77, | 2884,78, | 2884,79, | 2884,80, | 2884,81, | 2884,82, | 2884,83, | 2884,84, | 2884,85, | 2885,1, | 2885,2, | 2885,3, | 2885,4, | 2885,5, | 2885,6, | 2885,7, | 2885,8, | 2885,9, | 2885,10, | 2885,11, | 2885,12, | 2885,13, | 2885,14, | 2885,15, | 2885,16, | 2885,17, | 2885,18, | 2885,19, | 2885,20, | 2885,21, | 2885,22, | 2885,23, | 2885,24, | 2885,25, | 2885,26, | 2885,27, | 2885,28, | 2885,29, | 2885,30, | 2885,31, | 2885,32, | 2885,33, | 2885,34, | 2885,35, | 2885,36, | 2885,37, | 2885,38, | 2885,39, | 2885,40, | 2885,41, | 2885,42, | 2885,43, | 2885,44, | 2885,45, | 2885,46, | 2885,47, | 2885,48, | 2885,49, | 2885,50, | 2885,51, | 2885,52, | 2885,53, | 2885,54, | 2885,55, | 2885,56, | 2885,57, | 2885,58, | 2885,59, | 2885,60, | 2885,61, | 2885,62, | 2885,63, | 2885,64, | 2885,65, | 2885,66, | 2885,67, | 2885,68, | 2885,69, | 2885,70, | 2885,71, | 2885,72, | 2885,73, | 2885,74, | 2885,75, | 2885,76, | 2885,77, | 2885,78, | 2885,79, | 2885,80, | 2885,81, | 2885,82, | 2885,83, | 2885,84, | 2885,85, | 2886,1, | 2886,2, | 2886,3, | 2886,4, | 2886,5, | 2886,6, | 2886,7, | 2886,8, | 2886,9, | 2886,10, | 2886,11, | 2886,12, | 2886,13, | 2886,14, | 2886,15, | 2886,16, | 2886,17, | 2886,18, | 2886,19, | 2886,20, | 2886,21, | 2886,22, | 2886,23, | 2886,24, | 2886,25, | 2886,26, | 2886,27, | 2886,28, | 2886,29, | 2886,30, | 2886,31, | 2886,32, | 2886,33, | 2886,34, | 2886,35, | 2886,36, | 2886,37, | 2886,38, | 2886,39, | 2886,40, | 2886,41, | 2886,42, | 2886,43, | 2886,44, | 2886,45, | 2886,46, | 2886,47, | 2886,48, | 2886,49, | 2886,50, | 2886,51, | 2886,52, | 2886,53, | 2886,54, | 2886,55, | 2886,56, | 2886,57, | 2886,58, | 2886,59, | 2886,60, | 2886,61, | 2886,62, | 2886,63, | 2886,64, | 2886,65, | 2886,66, | 2886,67, | 2886,68, | 2886,69, | 2886,70, | 2886,71, | 2886,72, | 2886,73, | 2886,74, | 2886,75, | 2886,76, | 2886,77, | 2886,78, | 2886,79, | 2886,80, | 2886,81, | 2886,82, | 2886,83, | 2886,84, | 2886,85, | 2887,1, | 2887,2, | 2887,3, | 2887,4, | 2887,5, | 2887,6, | 2887,7, | 2887,8, | 2887,9, | 2887,10, | 2887,11, | 2887,12, | 2887,13, | 2887,14, | 2887,15, | 2887,16, | 2887,17, | 2887,18, | 2887,19, | 2887,20, | 2887,21, | 2887,22, | 2887,23, | 2887,24, | 2887,25, | 2887,26, | 2887,27, | 2887,28, | 2887,29, | 2887,30, | 2887,31, | 2887,32, | 2887,33, | 2887,34, | 2887,35, | 2887,36, | 2887,37, | 2887,38, | 2887,39, | 2887,40, | 2887,41, | 2887,42, | 2887,43, | 2887,44, | 2887,45, | 2887,46, | 2887,47, | 2887,48, | 2887,49, | 2887,50, | 2887,51, | 2887,52, | 2887,53, | 2887,54, | 2887,55, | 2887,56, | 2887,57, | 2887,58, | 2887,59, | 2887,60, | 2887,61, | 2887,62, | 2887,63, | 2887,64, | 2887,65, | 2887,66, | 2887,67, | 2887,68, | 2887,69, | 2887,70, | 2887,71, | 2887,72, | 2887,73, | 2887,74, | 2887,75, | 2887,76, | 2887,77, | 2887,78, | 2887,79, | 2887,80, | 2887,81, | 2887,82, | 2887,83, | 2887,84, | 2887,85, | 2888,1, | 2888,2, | 2888,3, | 2888,4, | 2888,5, | 2888,6, | 2888,7, | 2888,8, | 2888,9, | 2888,10, | 2888,11, | 2888,12, | 2888,13, | 2888,14, | 2888,15, | 2888,16, | 2888,17, | 2888,18, | 2888,19, | 2888,20, | 2888,21, | 2888,22, | 2888,23, | 2888,24, | 2888,25, | 2888,26, | 2888,27, | 2888,28, | 2888,29, | 2888,30, | 2888,31, | 2888,32, | 2888,33, | 2888,34, | 2888,35, | 2888,36, | 2888,37, | 2888,38, | 2888,39, | 2888,40, | 2888,41, | 2888,42, | 2888,43, | 2888,44, | 2888,45, | 2888,46, | 2888,47, | 2888,48, | 2888,49, | 2888,50, | 2888,51, | 2888,52, | 2888,53, | 2888,54, | 2888,55, | 2888,56, | 2888,57, | 2888,58, | 2888,59, | 2888,60, | 2888,61, | 2888,62, | 2888,63, | 2888,64, | 2888,65, | 2888,66, | 2888,67, | 2888,68, | 2888,69, | 2888,70, | 2888,71, | 2888,72, | 2888,73, | 2888,74, | 2888,75, | 2888,76, | 2888,77, | 2888,78, | 2888,79, | 2888,80, | 2888,81, | 2888,82, | 2888,83, | 2888,84, | 2888,85, | 2889,1, | 2889,2, | 2889,3, | 2889,4, | 2889,5, | 2889,6, | 2889,7, | 2889,8, | 2889,9, | 2889,10, | 2889,11, | 2889,12, | 2889,13, | 2889,14, | 2889,15, | 2889,16, | 2889,17, | 2889,18, | 2889,19, | 2889,20, | 2889,21, | 2889,22, | 2889,23, | 2889,24, | 2889,25, | 2889,26, | 2889,27, | 2889,28, | 2889,29, | 2889,30, | 2889,31, | 2889,32, | 2889,33, | 2889,34, | 2889,35, | 2889,36, | 2889,37, | 2889,38, | 2889,39, | 2889,40, | 2889,41, | 2889,42, | 2889,43, | 2889,44, | 2889,45, | 2889,46, | 2889,47, | 2889,48, | 2889,49, | 2889,50, | 2889,51, | 2889,52, | 2889,53, | 2889,54, | 2889,55, | 2889,56, | 2889,57, | 2889,58, | 2889,59, | 2889,60, | 2889,61, | 2889,62, | 2889,63, | 2889,64, | 2889,65, | 2889,66, | 2889,67, | 2889,68, | 2889,69, | 2889,70, | 2889,71, | 2889,72, | 2889,73, | 2889,74, | 2889,75, | 2889,76, | 2889,77, | 2889,78, | 2889,79, | 2889,80, | 2889,81, | 2889,82, | 2889,83, | 2889,84, | 2889,85, | 2890,1, | 2890,2, | 2890,3, | 2890,4, | 2890,5, | 2890,6, | 2890,7, | 2890,8, | 2890,9, | 2890,10, | 2890,11, | 2890,12, | 2890,13, | 2890,14, | 2890,15, | 2890,16, | 2890,17, | 2890,18, | 2890,19, | 2890,20, | 2890,21, | 2890,22, | 2890,23, | 2890,24, | 2890,25, | 2890,26, | 2890,27, | 2890,28, | 2890,29, | 2890,30, | 2890,31, | 2890,32, | 2890,33, | 2890,34, | 2890,35, | 2890,36, | 2890,37, | 2890,38, | 2890,39, | 2890,40, | 2890,41, | 2890,42, | 2890,43, | 2890,44, | 2890,45, | 2890,46, | 2890,47, | 2890,48, | 2890,49, | 2890,50, | 2890,51, | 2890,52, | 2890,53, | 2890,54, | 2890,55, | 2890,56, | 2890,57, | 2890,58, | 2890,59, | 2890,60, | 2890,61, | 2890,62, | 2890,63, | 2890,64, | 2890,65, | 2890,66, | 2890,67, | 2890,68, | 2890,69, | 2890,70, | 2890,71, | 2890,72, | 2890,73, | 2890,74, | 2890,75, | 2890,76, | 2890,77, | 2890,78, | 2890,79, | 2890,80, | 2890,81, | 2890,82, | 2890,83, | 2890,84, | 2890,85, | 2891,1, | 2891,2, | 2891,3, | 2891,4, | 2891,5, | 2891,6, | 2891,7, | 2891,8, | 2891,9, | 2891,10, | 2891,11, | 2891,12, | 2891,13, | 2891,14, | 2891,15, | 2891,16, | 2891,17, | 2891,18, | 2891,19, | 2891,20, | 2891,21, | 2891,22, | 2891,23, | 2891,24, | 2891,25, | 2891,26, | 2891,27, | 2891,28, | 2891,29, | 2891,30, | 2891,31, | 2891,32, | 2891,33, | 2891,34, | 2891,35, | 2891,36, | 2891,37, | 2891,38, | 2891,39, | 2891,40, | 2891,41, | 2891,42, | 2891,43, | 2891,44, | 2891,45, | 2891,46, | 2891,47, | 2891,48, | 2891,49, | 2891,50, | 2891,51, | 2891,52, | 2891,53, | 2891,54, | 2891,55, | 2891,56, | 2891,57, | 2891,58, | 2891,59, | 2891,60, | 2891,61, | 2891,62, | 2891,63, | 2891,64, | 2891,65, | 2891,66, | 2891,67, | 2891,68, | 2891,69, | 2891,70, | 2891,71, | 2891,72, | 2891,73, | 2891,74, | 2891,75, | 2891,76, | 2891,77, | 2891,78, | 2891,79, | 2891,80, | 2891,81, | 2891,82, | 2891,83, | 2891,84, | 2891,85, | 2892,1, | 2892,2, | 2892,3, | 2892,4, | 2892,5, | 2892,6, | 2892,7, | 2892,8, | 2892,9, | 2892,10, | 2892,11, | 2892,12, | 2892,13, | 2892,14, | 2892,15, | 2892,16, | 2892,17, | 2892,18, | 2892,19, | 2892,20, | 2892,21, | 2892,22, | 2892,23, | 2892,24, | 2892,25, | 2892,26, | 2892,27, | 2892,28, | 2892,29, | 2892,30, | 2892,31, | 2892,32, | 2892,33, | 2892,34, | 2892,35, | 2892,36, | 2892,37, | 2892,38, | 2892,39, | 2892,40, | 2892,41, | 2892,42, | 2892,43, | 2892,44, | 2892,45, | 2892,46, | 2892,47, | 2892,48, | 2892,49, | 2892,50, | 2892,51, | 2892,52, | 2892,53, | 2892,54, | 2892,55, | 2892,56, | 2892,57, | 2892,58, | 2892,59, | 2892,60, | 2892,61, | 2892,62, | 2892,63, | 2892,64, | 2892,65, | 2892,66, | 2892,67, | 2892,68, | 2892,69, | 2892,70, | 2892,71, | 2892,72, | 2892,73, | 2892,74, | 2892,75, | 2892,76, | 2892,77, | 2892,78, | 2892,79, | 2892,80, | 2892,81, | 2892,82, | 2892,83, | 2892,84, | 2892,85, | 2893,1, | 2893,2, | 2893,3, | 2893,4, | 2893,5, | 2893,6, | 2893,7, | 2893,8, | 2893,9, | 2893,10, | 2893,11, | 2893,12, | 2893,13, | 2893,14, | 2893,15, | 2893,16, | 2893,17, | 2893,18, | 2893,19, | 2893,20, | 2893,21, | 2893,22, | 2893,23, | 2893,24, | 2893,25, | 2893,26, | 2893,27, | 2893,28, | 2893,29, | 2893,30, | 2893,31, | 2893,32, | 2893,33, | 2893,34, | 2893,35, | 2893,36, | 2893,37, | 2893,38, | 2893,39, | 2893,40, | 2893,41, | 2893,42, | 2893,43, | 2893,44, | 2893,45, | 2893,46, | 2893,47, | 2893,48, | 2893,49, | 2893,50, | 2893,51, | 2893,52, | 2893,53, | 2893,54, | 2893,55, | 2893,56, | 2893,57, | 2893,58, | 2893,59, | 2893,60, | 2893,61, | 2893,62, | 2893,63, | 2893,64, | 2893,65, | 2893,66, | 2893,67, | 2893,68, | 2893,69, | 2893,70, | 2893,71, | 2893,72, | 2893,73, | 2893,74, | 2893,75, | 2893,76, | 2893,77, | 2893,78, | 2893,79, | 2893,80, | 2893,81, | 2893,82, | 2893,83, | 2893,84, | 2893,85, | 2894,1, | 2894,2, | 2894,3, | 2894,4, | 2894,5, | 2894,6, | 2894,7, | 2894,8, | 2894,9, | 2894,10, | 2894,11, | 2894,12, | 2894,13, | 2894,14, | 2894,15, | 2894,16, | 2894,17, | 2894,18, | 2894,19, | 2894,20, | 2894,21, | 2894,22, | 2894,23, | 2894,24, | 2894,25, | 2894,26, | 2894,27, | 2894,28, | 2894,29, | 2894,30, | 2894,31, | 2894,32, | 2894,33, | 2894,34, | 2894,35, | 2894,36, | 2894,37, | 2894,38, | 2894,39, | 2894,40, | 2894,41, | 2894,42, | 2894,43, | 2894,44, | 2894,45, | 2894,46, | 2894,47, | 2894,48, | 2894,49, | 2894,50, | 2894,51, | 2894,52, | 2894,53, | 2894,54, | 2894,55, | 2894,56, | 2894,57, | 2894,58, | 2894,59, | 2894,60, | 2894,61, | 2894,62, | 2894,63, | 2894,64, | 2894,65, | 2894,66, | 2894,67, | 2894,68, | 2894,69, | 2894,70, | 2894,71, | 2894,72, | 2894,73, | 2894,74, | 2894,75, | 2894,76, | 2894,77, | 2894,78, | 2894,79, | 2894,80, | 2894,81, | 2894,82, | 2894,83, | 2894,84, | 2894,85, | 2895,1, | 2895,2, | 2895,3, | 2895,4, | 2895,5, | 2895,6, | 2895,7, | 2895,8, | 2895,9, | 2895,10, | 2895,11, | 2895,12, | 2895,13, | 2895,14, | 2895,15, | 2895,16, | 2895,17, | 2895,18, | 2895,19, | 2895,20, | 2895,21, | 2895,22, | 2895,23, | 2895,24, | 2895,25, | 2895,26, | 2895,27, | 2895,28, | 2895,29, | 2895,30, | 2895,31, | 2895,32, | 2895,33, | 2895,34, | 2895,35, | 2895,36, | 2895,37, | 2895,38, | 2895,39, | 2895,40, | 2895,41, | 2895,42, | 2895,43, | 2895,44, | 2895,45, | 2895,46, | 2895,47, | 2895,48, | 2895,49, | 2895,50, | 2895,51, | 2895,52, | 2895,53, | 2895,54, | 2895,55, | 2895,56, | 2895,57, | 2895,58, | 2895,59, | 2895,60, | 2895,61, | 2895,62, | 2895,63, | 2895,64, | 2895,65, | 2895,66, | 2895,67, | 2895,68, | 2895,69, | 2895,70, | 2895,71, | 2895,72, | 2895,73, | 2895,74, | 2895,75, | 2895,76, | 2895,77, | 2895,78, | 2895,79, | 2895,80, | 2895,81, | 2895,82, | 2895,83, | 2895,84, | 2895,85, | 2896,1, | 2896,2, | 2896,3, | 2896,4, | 2896,5, | 2896,6, | 2896,7, | 2896,8, | 2896,9, | 2896,10, | 2896,11, | 2896,12, | 2896,13, | 2896,14, | 2896,15, | 2896,16, | 2896,17, | 2896,18, | 2896,19, | 2896,20, | 2896,21, | 2896,22, | 2896,23, | 2896,24, | 2896,25, | 2896,26, | 2896,27, | 2896,28, | 2896,29, | 2896,30, | 2896,31, | 2896,32, | 2896,33, | 2896,34, | 2896,35, | 2896,36, | 2896,37, | 2896,38, | 2896,39, | 2896,40, | 2896,41, | 2896,42, | 2896,43, | 2896,44, | 2896,45, | 2896,46, | 2896,47, | 2896,48, | 2896,49, | 2896,50, | 2896,51, | 2896,52, | 2896,53, | 2896,54, | 2896,55, | 2896,56, | 2896,57, | 2896,58, | 2896,59, | 2896,60, | 2896,61, | 2896,62, | 2896,63, | 2896,64, | 2896,65, | 2896,66, | 2896,67, | 2896,68, | 2896,69, | 2896,70, | 2896,71, | 2896,72, | 2896,73, | 2896,74, | 2896,75, | 2896,76, | 2896,77, | 2896,78, | 2896,79, | 2896,80, | 2896,81, | 2896,82, | 2896,83, | 2896,84, | 2896,85, | 2897,1, | 2897,2, | 2897,3, | 2897,4, | 2897,5, | 2897,6, | 2897,7, | 2897,8, | 2897,9, | 2897,10, | 2897,11, | 2897,12, | 2897,13, | 2897,14, | 2897,15, | 2897,16, | 2897,17, | 2897,18, | 2897,19, | 2897,20, | 2897,21, | 2897,22, | 2897,23, | 2897,24, | 2897,25, | 2897,26, | 2897,27, | 2897,28, | 2897,29, | 2897,30, | 2897,31, | 2897,32, | 2897,33, | 2897,34, | 2897,35, | 2897,36, | 2897,37, | 2897,38, | 2897,39, | 2897,40, | 2897,41, | 2897,42, | 2897,43, | 2897,44, | 2897,45, | 2897,46, | 2897,47, | 2897,48, | 2897,49, | 2897,50, | 2897,51, | 2897,52, | 2897,53, | 2897,54, | 2897,55, | 2897,56, | 2897,57, | 2897,58, | 2897,59, | 2897,60, | 2897,61, | 2897,62, | 2897,63, | 2897,64, | 2897,65, | 2897,66, | 2897,67, | 2897,68, | 2897,69, | 2897,70, | 2897,71, | 2897,72, | 2897,73, | 2897,74, | 2897,75, | 2897,76, | 2897,77, | 2897,78, | 2897,79, | 2897,80, | 2897,81, | 2897,82, | 2897,83, | 2897,84, | 2897,85, | 2898,1, | 2898,2, | 2898,3, | 2898,4, | 2898,5, | 2898,6, | 2898,7, | 2898,8, | 2898,9, | 2898,10, | 2898,11, | 2898,12, | 2898,13, | 2898,14, | 2898,15, | 2898,16, | 2898,17, | 2898,18, | 2898,19, | 2898,20, | 2898,21, | 2898,22, | 2898,23, | 2898,24, | 2898,25, | 2898,26, | 2898,27, | 2898,28, | 2898,29, | 2898,30, | 2898,31, | 2898,32, | 2898,33, | 2898,34, | 2898,35, | 2898,36, | 2898,37, | 2898,38, | 2898,39, | 2898,40, | 2898,41, | 2898,42, | 2898,43, | 2898,44, | 2898,45, | 2898,46, | 2898,47, | 2898,48, | 2898,49, | 2898,50, | 2898,51, | 2898,52, | 2898,53, | 2898,54, | 2898,55, | 2898,56, | 2898,57, | 2898,58, | 2898,59, | 2898,60, | 2898,61, | 2898,62, | 2898,63, | 2898,64, | 2898,65, | 2898,66, | 2898,67, | 2898,68, | 2898,69, | 2898,70, | 2898,71, | 2898,72, | 2898,73, | 2898,74, | 2898,75, | 2898,76, | 2898,77, | 2898,78, | 2898,79, | 2898,80, | 2898,81, | 2898,82, | 2898,83, | 2898,84, | 2898,85, | 2899,1, | 2899,2, | 2899,3, | 2899,4, | 2899,5, | 2899,6, | 2899,7, | 2899,8, | 2899,9, | 2899,10, | 2899,11, | 2899,12, | 2899,13, | 2899,14, | 2899,15, | 2899,16, | 2899,17, | 2899,18, | 2899,19, | 2899,20, | 2899,21, | 2899,22, | 2899,23, | 2899,24, | 2899,25, | 2899,26, | 2899,27, | 2899,28, | 2899,29, | 2899,30, | 2899,31, | 2899,32, | 2899,33, | 2899,34, | 2899,35, | 2899,36, | 2899,37, | 2899,38, | 2899,39, | 2899,40, | 2899,41, | 2899,42, | 2899,43, | 2899,44, | 2899,45, | 2899,46, | 2899,47, | 2899,48, | 2899,49, | 2899,50, | 2899,51, | 2899,52, | 2899,53, | 2899,54, | 2899,55, | 2899,56, | 2899,57, | 2899,58, | 2899,59, | 2899,60, | 2899,61, | 2899,62, | 2899,63, | 2899,64, | 2899,65, | 2899,66, | 2899,67, | 2899,68, | 2899,69, | 2899,70, | 2899,71, | 2899,72, | 2899,73, | 2899,74, | 2899,75, | 2899,76, | 2899,77, | 2899,78, | 2899,79, | 2899,80, | 2899,81, | 2899,82, | 2899,83, | 2899,84, | 2899,85, | 2900,1, | 2900,2, | 2900,3, | 2900,4, | 2900,5, | 2900,6, | 2900,7, | 2900,8, | 2900,9, | 2900,10, | 2900,11, | 2900,12, | 2900,13, | 2900,14, | 2900,15, | 2900,16, | 2900,17, | 2900,18, | 2900,19, | 2900,20, | 2900,21, | 2900,22, | 2900,23, | 2900,24, | 2900,25, | 2900,26, | 2900,27, | 2900,28, | 2900,29, | 2900,30, | 2900,31, | 2900,32, | 2900,33, | 2900,34, | 2900,35, | 2900,36, | 2900,37, | 2900,38, | 2900,39, | 2900,40, | 2900,41, | 2900,42, | 2900,43, | 2900,44, | 2900,45, | 2900,46, | 2900,47, | 2900,48, | 2900,49, | 2900,50, | 2900,51, | 2900,52, | 2900,53, | 2900,54, | 2900,55, | 2900,56, | 2900,57, | 2900,58, | 2900,59, | 2900,60, | 2900,61, | 2900,62, | 2900,63, | 2900,64, | 2900,65, | 2900,66, | 2900,67, | 2900,68, | 2900,69, | 2900,70, | 2900,71, | 2900,72, | 2900,73, | 2900,74, | 2900,75, | 2900,76, | 2900,77, | 2900,78, | 2900,79, | 2900,80, | 2900,81, | 2900,82, | 2900,83, | 2900,84, | 2900,85, | 2901,1, | 2901,2, | 2901,3, | 2901,4, | 2901,5, | 2901,6, | 2901,7, | 2901,8, | 2901,9, | 2901,10, | 2901,11, | 2901,12, | 2901,13, | 2901,14, | 2901,15, | 2901,16, | 2901,17, | 2901,18, | 2901,19, | 2901,20, | 2901,21, | 2901,22, | 2901,23, | 2901,24, | 2901,25, | 2901,26, | 2901,27, | 2901,28, | 2901,29, | 2901,30, | 2901,31, | 2901,32, | 2901,33, | 2901,34, | 2901,35, | 2901,36, | 2901,37, | 2901,38, | 2901,39, | 2901,40, | 2901,41, | 2901,42, | 2901,43, | 2901,44, | 2901,45, | 2901,46, | 2901,47, | 2901,48, | 2901,49, | 2901,50, | 2901,51, | 2901,52, | 2901,53, | 2901,54, | 2901,55, | 2901,56, | 2901,57, | 2901,58, | 2901,59, | 2901,60, | 2901,61, | 2901,62, | 2901,63, | 2901,64, | 2901,65, | 2901,66, | 2901,67, | 2901,68, | 2901,69, | 2901,70, | 2901,71, | 2901,72, | 2901,73, | 2901,74, | 2901,75, | 2901,76, | 2901,77, | 2901,78, | 2901,79, | 2901,80, | 2901,81, | 2901,82, | 2901,83, | 2901,84, | 2901,85, | 2902,1, | 2902,2, | 2902,3, | 2902,4, | 2902,5, | 2902,6, | 2902,7, | 2902,8, | 2902,9, | 2902,10, | 2902,11, | 2902,12, | 2902,13, | 2902,14, | 2902,15, | 2902,16, | 2902,17, | 2902,18, | 2902,19, | 2902,20, | 2902,21, | 2902,22, | 2902,23, | 2902,24, | 2902,25, | 2902,26, | 2902,27, | 2902,28, | 2902,29, | 2902,30, | 2902,31, | 2902,32, | 2902,33, | 2902,34, | 2902,35, | 2902,36, | 2902,37, | 2902,38, | 2902,39, | 2902,40, | 2902,41, | 2902,42, | 2902,43, | 2902,44, | 2902,45, | 2902,46, | 2902,47, | 2902,48, | 2902,49, | 2902,50, | 2902,51, | 2902,52, | 2902,53, | 2902,54, | 2902,55, | 2902,56, | 2902,57, | 2902,58, | 2902,59, | 2902,60, | 2902,61, | 2902,62, | 2902,63, | 2902,64, | 2902,65, | 2902,66, | 2902,67, | 2902,68, | 2902,69, | 2902,70, | 2902,71, | 2902,72, | 2902,73, | 2902,74, | 2902,75, | 2902,76, | 2902,77, | 2902,78, | 2902,79, | 2902,80, | 2902,81, | 2902,82, | 2902,83, | 2902,84, | 2902,85, | 2903,1, | 2903,2, | 2903,3, | 2903,4, | 2903,5, | 2903,6, | 2903,7, | 2903,8, | 2903,9, | 2903,10, | 2903,11, | 2903,12, | 2903,13, | 2903,14, | 2903,15, | 2903,16, | 2903,17, | 2903,18, | 2903,19, | 2903,20, | 2903,21, | 2903,22, | 2903,23, | 2903,24, | 2903,25, | 2903,26, | 2903,27, | 2903,28, | 2903,29, | 2903,30, | 2903,31, | 2903,32, | 2903,33, | 2903,34, | 2903,35, | 2903,36, | 2903,37, | 2903,38, | 2903,39, | 2903,40, | 2903,41, | 2903,42, | 2903,43, | 2903,44, | 2903,45, | 2903,46, | 2903,47, | 2903,48, | 2903,49, | 2903,50, | 2903,51, | 2903,52, | 2903,53, | 2903,54, | 2903,55, | 2903,56, | 2903,57, | 2903,58, | 2903,59, | 2903,60, | 2903,61, | 2903,62, | 2903,63, | 2903,64, | 2903,65, | 2903,66, | 2903,67, | 2903,68, | 2903,69, | 2903,70, | 2903,71, | 2903,72, | 2903,73, | 2903,74, | 2903,75, | 2903,76, | 2903,77, | 2903,78, | 2903,79, | 2903,80, | 2903,81, | 2903,82, | 2903,83, | 2903,84, | 2903,85, | 2904,1, | 2904,2, | 2904,3, | 2904,4, | 2904,5, | 2904,6, | 2904,7, | 2904,8, | 2904,9, | 2904,10, | 2904,11, | 2904,12, | 2904,13, | 2904,14, | 2904,15, | 2904,16, | 2904,17, | 2904,18, | 2904,19, | 2904,20, | 2904,21, | 2904,22, | 2904,23, | 2904,24, | 2904,25, | 2904,26, | 2904,27, | 2904,28, | 2904,29, | 2904,30, | 2904,31, | 2904,32, | 2904,33, | 2904,34, | 2904,35, | 2904,36, | 2904,37, | 2904,38, | 2904,39, | 2904,40, | 2904,41, | 2904,42, | 2904,43, | 2904,44, | 2904,45, | 2904,46, | 2904,47, | 2904,48, | 2904,49, | 2904,50, | 2904,51, | 2904,52, | 2904,53, | 2904,54, | 2904,55, | 2904,56, | 2904,57, | 2904,58, | 2904,59, | 2904,60, | 2904,61, | 2904,62, | 2904,63, | 2904,64, | 2904,65, | 2904,66, | 2904,67, | 2904,68, | 2904,69, | 2904,70, | 2904,71, | 2904,72, | 2904,73, | 2904,74, | 2904,75, | 2904,76, | 2904,77, | 2904,78, | 2904,79, | 2904,80, | 2904,81, | 2904,82, | 2904,83, | 2904,84, | 2904,85, | 2905,1, | 2905,2, | 2905,3, | 2905,4, | 2905,5, | 2905,6, | 2905,7, | 2905,8, | 2905,9, | 2905,10, | 2905,11, | 2905,12, | 2905,13, | 2905,14, | 2905,15, | 2905,16, | 2905,17, | 2905,18, | 2905,19, | 2905,20, | 2905,21, | 2905,22, | 2905,23, | 2905,24, | 2905,25, | 2905,26, | 2905,27, | 2905,28, | 2905,29, | 2905,30, | 2905,31, | 2905,32, | 2905,33, | 2905,34, | 2905,35, | 2905,36, | 2905,37, | 2905,38, | 2905,39, | 2905,40, | 2905,41, | 2905,42, | 2905,43, | 2905,44, | 2905,45, | 2905,46, | 2905,47, | 2905,48, | 2905,49, | 2905,50, | 2905,51, | 2905,52, | 2905,53, | 2905,54, | 2905,55, | 2905,56, | 2905,57, | 2905,58, | 2905,59, | 2905,60, | 2905,61, | 2905,62, | 2905,63, | 2905,64, | 2905,65, | 2905,66, | 2905,67, | 2905,68, | 2905,69, | 2905,70, | 2905,71, | 2905,72, | 2905,73, | 2905,74, | 2905,75, | 2905,76, | 2905,77, | 2905,78, | 2905,79, | 2905,80, | 2905,81, | 2905,82, | 2905,83, | 2905,84, | 2905,85, | 2906,1, | 2906,2, | 2906,3, | 2906,4, | 2906,5, | 2906,6, | 2906,7, | 2906,8, | 2906,9, | 2906,10, | 2906,11, | 2906,12, | 2906,13, | 2906,14, | 2906,15, | 2906,16, | 2906,17, | 2906,18, | 2906,19, | 2906,20, | 2906,21, | 2906,22, | 2906,23, | 2906,24, | 2906,25, | 2906,26, | 2906,27, | 2906,28, | 2906,29, | 2906,30, | 2906,31, | 2906,32, | 2906,33, | 2906,34, | 2906,35, | 2906,36, | 2906,37, | 2906,38, | 2906,39, | 2906,40, | 2906,41, | 2906,42, | 2906,43, | 2906,44, | 2906,45, | 2906,46, | 2906,47, | 2906,48, | 2906,49, | 2906,50, | 2906,51, | 2906,52, | 2906,53, | 2906,54, | 2906,55, | 2906,56, | 2906,57, | 2906,58, | 2906,59, | 2906,60, | 2906,61, | 2906,62, | 2906,63, | 2906,64, | 2906,65, | 2906,66, | 2906,67, | 2906,68, | 2906,69, | 2906,70, | 2906,71, | 2906,72, | 2906,73, | 2906,74, | 2906,75, | 2906,76, | 2906,77, | 2906,78, | 2906,79, | 2906,80, | 2906,81, | 2906,82, | 2906,83, | 2906,84, | 2906,85, | 2907,1, | 2907,2, | 2907,3, | 2907,4, | 2907,5, | 2907,6, | 2907,7, | 2907,8, | 2907,9, | 2907,10, | 2907,11, | 2907,12, | 2907,13, | 2907,14, | 2907,15, | 2907,16, | 2907,17, | 2907,18, | 2907,19, | 2907,20, | 2907,21, | 2907,22, | 2907,23, | 2907,24, | 2907,25, | 2907,26, | 2907,27, | 2907,28, | 2907,29, | 2907,30, | 2907,31, | 2907,32, | 2907,33, | 2907,34, | 2907,35, | 2907,36, | 2907,37, | 2907,38, | 2907,39, | 2907,40, | 2907,41, | 2907,42, | 2907,43, | 2907,44, | 2907,45, | 2907,46, | 2907,47, | 2907,48, | 2907,49, | 2907,50, | 2907,51, | 2907,52, | 2907,53, | 2907,54, | 2907,55, | 2907,56, | 2907,57, | 2907,58, | 2907,59, | 2907,60, | 2907,61, | 2907,62, | 2907,63, | 2907,64, | 2907,65, | 2907,66, | 2907,67, | 2907,68, | 2907,69, | 2907,70, | 2907,71, | 2907,72, | 2907,73, | 2907,74, | 2907,75, | 2907,76, | 2907,77, | 2907,78, | 2907,79, | 2907,80, | 2907,81, | 2907,82, | 2907,83, | 2907,84, | 2907,85, | 2908,1, | 2908,2, | 2908,3, | 2908,4, | 2908,5, | 2908,6, | 2908,7, | 2908,8, | 2908,9, | 2908,10, | 2908,11, | 2908,12, | 2908,13, | 2908,14, | 2908,15, | 2908,16, | 2908,17, | 2908,18, | 2908,19, | 2908,20, | 2908,21, | 2908,22, | 2908,23, | 2908,24, | 2908,25, | 2908,26, | 2908,27, | 2908,28, | 2908,29, | 2908,30, | 2908,31, | 2908,32, | 2908,33, | 2908,34, | 2908,35, | 2908,36, | 2908,37, | 2908,38, | 2908,39, | 2908,40, | 2908,41, | 2908,42, | 2908,43, | 2908,44, | 2908,45, | 2908,46, | 2908,47, | 2908,48, | 2908,49, | 2908,50, | 2908,51, | 2908,52, | 2908,53, | 2908,54, | 2908,55, | 2908,56, | 2908,57, | 2908,58, | 2908,59, | 2908,60, | 2908,61, | 2908,62, | 2908,63, | 2908,64, | 2908,65, | 2908,66, | 2908,67, | 2908,68, | 2908,69, | 2908,70, | 2908,71, | 2908,72, | 2908,73, | 2908,74, | 2908,75, | 2908,76, | 2908,77, | 2908,78, | 2908,79, | 2908,80, | 2908,81, | 2908,82, | 2908,83, | 2908,84, | 2908,85, | 2909,1, | 2909,2, | 2909,3, | 2909,4, | 2909,5, | 2909,6, | 2909,7, | 2909,8, | 2909,9, | 2909,10, | 2909,11, | 2909,12, | 2909,13, | 2909,14, | 2909,15, | 2909,16, | 2909,17, | 2909,18, | 2909,19, | 2909,20, | 2909,21, | 2909,22, | 2909,23, | 2909,24, | 2909,25, | 2909,26, | 2909,27, | 2909,28, | 2909,29, | 2909,30, | 2909,31, | 2909,32, | 2909,33, | 2909,34, | 2909,35, | 2909,36, | 2909,37, | 2909,38, | 2909,39, | 2909,40, | 2909,41, | 2909,42, | 2909,43, | 2909,44, | 2909,45, | 2909,46, | 2909,47, | 2909,48, | 2909,49, | 2909,50, | 2909,51, | 2909,52, | 2909,53, | 2909,54, | 2909,55, | 2909,56, | 2909,57, | 2909,58, | 2909,59, | 2909,60, | 2909,61, | 2909,62, | 2909,63, | 2909,64, | 2909,65, | 2909,66, | 2909,67, | 2909,68, | 2909,69, | 2909,70, | 2909,71, | 2909,72, | 2909,73, | 2909,74, | 2909,75, | 2909,76, | 2909,77, | 2909,78, | 2909,79, | 2909,80, | 2909,81, | 2909,82, | 2909,83, | 2909,84, | 2909,85, | 2910,1, | 2910,2, | 2910,3, | 2910,4, | 2910,5, | 2910,6, | 2910,7, | 2910,8, | 2910,9, | 2910,10, | 2910,11, | 2910,12, | 2910,13, | 2910,14, | 2910,15, | 2910,16, | 2910,17, | 2910,18, | 2910,19, | 2910,20, | 2910,21, | 2910,22, | 2910,23, | 2910,24, | 2910,25, | 2910,26, | 2910,27, | 2910,28, | 2910,29, | 2910,30, | 2910,31, | 2910,32, | 2910,33, | 2910,34, | 2910,35, | 2910,36, | 2910,37, | 2910,38, | 2910,39, | 2910,40, | 2910,41, | 2910,42, | 2910,43, | 2910,44, | 2910,45, | 2910,46, | 2910,47, | 2910,48, | 2910,49, | 2910,50, | 2910,51, | 2910,52, | 2910,53, | 2910,54, | 2910,55, | 2910,56, | 2910,57, | 2910,58, | 2910,59, | 2910,60, | 2910,61, | 2910,62, | 2910,63, | 2910,64, | 2910,65, | 2910,66, | 2910,67, | 2910,68, | 2910,69, | 2910,70, | 2910,71, | 2910,72, | 2910,73, | 2910,74, | 2910,75, | 2910,76, | 2910,77, | 2910,78, | 2910,79, | 2910,80, | 2910,81, | 2910,82, | 2910,83, | 2910,84, | 2910,85, | 2911,1, | 2911,2, | 2911,3, | 2911,4, | 2911,5, | 2911,6, | 2911,7, | 2911,8, | 2911,9, | 2911,10, | 2911,11, | 2911,12, | 2911,13, | 2911,14, | 2911,15, | 2911,16, | 2911,17, | 2911,18, | 2911,19, | 2911,20, | 2911,21, | 2911,22, | 2911,23, | 2911,24, | 2911,25, | 2911,26, | 2911,27, | 2911,28, | 2911,29, | 2911,30, | 2911,31, | 2911,32, | 2911,33, | 2911,34, | 2911,35, | 2911,36, | 2911,37, | 2911,38, | 2911,39, | 2911,40, | 2911,41, | 2911,42, | 2911,43, | 2911,44, | 2911,45, | 2911,46, | 2911,47, | 2911,48, | 2911,49, | 2911,50, | 2911,51, | 2911,52, | 2911,53, | 2911,54, | 2911,55, | 2911,56, | 2911,57, | 2911,58, | 2911,59, | 2911,60, | 2911,61, | 2911,62, | 2911,63, | 2911,64, | 2911,65, | 2911,66, | 2911,67, | 2911,68, | 2911,69, | 2911,70, | 2911,71, | 2911,72, | 2911,73, | 2911,74, | 2911,75, | 2911,76, | 2911,77, | 2911,78, | 2911,79, | 2911,80, | 2911,81, | 2911,82, | 2911,83, | 2911,84, | 2911,85, | 2912,1, | 2912,2, | 2912,3, | 2912,4, | 2912,5, | 2912,6, | 2912,7, | 2912,8, | 2912,9, | 2912,10, | 2912,11, | 2912,12, | 2912,13, | 2912,14, | 2912,15, | 2912,16, | 2912,17, | 2912,18, | 2912,19, | 2912,20, | 2912,21, | 2912,22, | 2912,23, | 2912,24, | 2912,25, | 2912,26, | 2912,27, | 2912,28, | 2912,29, | 2912,30, | 2912,31, | 2912,32, | 2912,33, | 2912,34, | 2912,35, | 2912,36, | 2912,37, | 2912,38, | 2912,39, | 2912,40, | 2912,41, | 2912,42, | 2912,43, | 2912,44, | 2912,45, | 2912,46, | 2912,47, | 2912,48, | 2912,49, | 2912,50, | 2912,51, | 2912,52, | 2912,53, | 2912,54, | 2912,55, | 2912,56, | 2912,57, | 2912,58, | 2912,59, | 2912,60, | 2912,61, | 2912,62, | 2912,63, | 2912,64, | 2912,65, | 2912,66, | 2912,67, | 2912,68, | 2912,69, | 2912,70, | 2912,71, | 2912,72, | 2912,73, | 2912,74, | 2912,75, | 2912,76, | 2912,77, | 2912,78, | 2912,79, | 2912,80, | 2912,81, | 2912,82, | 2912,83, | 2912,84, | 2912,85, | 2913,1, | 2913,2, | 2913,3, | 2913,4, | 2913,5, | 2913,6, | 2913,7, | 2913,8, | 2913,9, | 2913,10, | 2913,11, | 2913,12, | 2913,13, | 2913,14, | 2913,15, | 2913,16, | 2913,17, | 2913,18, | 2913,19, | 2913,20, | 2913,21, | 2913,22, | 2913,23, | 2913,24, | 2913,25, | 2913,26, | 2913,27, | 2913,28, | 2913,29, | 2913,30, | 2913,31, | 2913,32, | 2913,33, | 2913,34, | 2913,35, | 2913,36, | 2913,37, | 2913,38, | 2913,39, | 2913,40, | 2913,41, | 2913,42, | 2913,43, | 2913,44, | 2913,45, | 2913,46, | 2913,47, | 2913,48, | 2913,49, | 2913,50, | 2913,51, | 2913,52, | 2913,53, | 2913,54, | 2913,55, | 2913,56, | 2913,57, | 2913,58, | 2913,59, | 2913,60, | 2913,61, | 2913,62, | 2913,63, | 2913,64, | 2913,65, | 2913,66, | 2913,67, | 2913,68, | 2913,69, | 2913,70, | 2913,71, | 2913,72, | 2913,73, | 2913,74, | 2913,75, | 2913,76, | 2913,77, | 2913,78, | 2913,79, | 2913,80, | 2913,81, | 2913,82, | 2913,83, | 2913,84, | 2913,85, | 2914,1, | 2914,2, | 2914,3, | 2914,4, | 2914,5, | 2914,6, | 2914,7, | 2914,8, | 2914,9, | 2914,10, | 2914,11, | 2914,12, | 2914,13, | 2914,14, | 2914,15, | 2914,16, | 2914,17, | 2914,18, | 2914,19, | 2914,20, | 2914,21, | 2914,22, | 2914,23, | 2914,24, | 2914,25, | 2914,26, | 2914,27, | 2914,28, | 2914,29, | 2914,30, | 2914,31, | 2914,32, | 2914,33, | 2914,34, | 2914,35, | 2914,36, | 2914,37, | 2914,38, | 2914,39, | 2914,40, | 2914,41, | 2914,42, | 2914,43, | 2914,44, | 2914,45, | 2914,46, | 2914,47, | 2914,48, | 2914,49, | 2914,50, | 2914,51, | 2914,52, | 2914,53, | 2914,54, | 2914,55, | 2914,56, | 2914,57, | 2914,58, | 2914,59, | 2914,60, | 2914,61, | 2914,62, | 2914,63, | 2914,64, | 2914,65, | 2914,66, | 2914,67, | 2914,68, | 2914,69, | 2914,70, | 2914,71, | 2914,72, | 2914,73, | 2914,74, | 2914,75, | 2914,76, | 2914,77, | 2914,78, | 2914,79, | 2914,80, | 2914,81, | 2914,82, | 2914,83, | 2914,84, | 2914,85, | 2915,1, | 2915,2, | 2915,3, | 2915,4, | 2915,5, | 2915,6, | 2915,7, | 2915,8, | 2915,9, | 2915,10, | 2915,11, | 2915,12, | 2915,13, | 2915,14, | 2915,15, | 2915,16, | 2915,17, | 2915,18, | 2915,19, | 2915,20, | 2915,21, | 2915,22, | 2915,23, | 2915,24, | 2915,25, | 2915,26, | 2915,27, | 2915,28, | 2915,29, | 2915,30, | 2915,31, | 2915,32, | 2915,33, | 2915,34, | 2915,35, | 2915,36, | 2915,37, | 2915,38, | 2915,39, | 2915,40, | 2915,41, | 2915,42, | 2915,43, | 2915,44, | 2915,45, | 2915,46, | 2915,47, | 2915,48, | 2915,49, | 2915,50, | 2915,51, | 2915,52, | 2915,53, | 2915,54, | 2915,55, | 2915,56, | 2915,57, | 2915,58, | 2915,59, | 2915,60, | 2915,61, | 2915,62, | 2915,63, | 2915,64, | 2915,65, | 2915,66, | 2915,67, | 2915,68, | 2915,69, | 2915,70, | 2915,71, | 2915,72, | 2915,73, | 2915,74, | 2915,75, | 2915,76, | 2915,77, | 2915,78, | 2915,79, | 2915,80, | 2915,81, | 2915,82, | 2915,83, | 2915,84, | 2915,85, | 2916,1, | 2916,2, | 2916,3, | 2916,4, | 2916,5, | 2916,6, | 2916,7, | 2916,8, | 2916,9, | 2916,10, | 2916,11, | 2916,12, | 2916,13, | 2916,14, | 2916,15, | 2916,16, | 2916,17, | 2916,18, | 2916,19, | 2916,20, | 2916,21, | 2916,22, | 2916,23, | 2916,24, | 2916,25, | 2916,26, | 2916,27, | 2916,28, | 2916,29, | 2916,30, | 2916,31, | 2916,32, | 2916,33, | 2916,34, | 2916,35, | 2916,36, | 2916,37, | 2916,38, | 2916,39, | 2916,40, | 2916,41, | 2916,42, | 2916,43, | 2916,44, | 2916,45, | 2916,46, | 2916,47, | 2916,48, | 2916,49, | 2916,50, | 2916,51, | 2916,52, | 2916,53, | 2916,54, | 2916,55, | 2916,56, | 2916,57, | 2916,58, | 2916,59, | 2916,60, | 2916,61, | 2916,62, | 2916,63, | 2916,64, | 2916,65, | 2916,66, | 2916,67, | 2916,68, | 2916,69, | 2916,70, | 2916,71, | 2916,72, | 2916,73, | 2916,74, | 2916,75, | 2916,76, | 2916,77, | 2916,78, | 2916,79, | 2916,80, | 2916,81, | 2916,82, | 2916,83, | 2916,84, | 2916,85, | 2917,1, | 2917,2, | 2917,3, | 2917,4, | 2917,5, | 2917,6, | 2917,7, | 2917,8, | 2917,9, | 2917,10, | 2917,11, | 2917,12, | 2917,13, | 2917,14, | 2917,15, | 2917,16, | 2917,17, | 2917,18, | 2917,19, | 2917,20, | 2917,21, | 2917,22, | 2917,23, | 2917,24, | 2917,25, | 2917,26, | 2917,27, | 2917,28, | 2917,29, | 2917,30, | 2917,31, | 2917,32, | 2917,33, | 2917,34, | 2917,35, | 2917,36, | 2917,37, | 2917,38, | 2917,39, | 2917,40, | 2917,41, | 2917,42, | 2917,43, | 2917,44, | 2917,45, | 2917,46, | 2917,47, | 2917,48, | 2917,49, | 2917,50, | 2917,51, | 2917,52, | 2917,53, | 2917,54, | 2917,55, | 2917,56, | 2917,57, | 2917,58, | 2917,59, | 2917,60, | 2917,61, | 2917,62, | 2917,63, | 2917,64, | 2917,65, | 2917,66, | 2917,67, | 2917,68, | 2917,69, | 2917,70, | 2917,71, | 2917,72, | 2917,73, | 2917,74, | 2917,75, | 2917,76, | 2917,77, | 2917,78, | 2917,79, | 2917,80, | 2917,81, | 2917,82, | 2917,83, | 2917,84, | 2917,85, | 2918,1, | 2918,2, | 2918,3, | 2918,4, | 2918,5, | 2918,6, | 2918,7, | 2918,8, | 2918,9, | 2918,10, | 2918,11, | 2918,12, | 2918,13, | 2918,14, | 2918,15, | 2918,16, | 2918,17, | 2918,18, | 2918,19, | 2918,20, | 2918,21, | 2918,22, | 2918,23, | 2918,24, | 2918,25, | 2918,26, | 2918,27, | 2918,28, | 2918,29, | 2918,30, | 2918,31, | 2918,32, | 2918,33, | 2918,34, | 2918,35, | 2918,36, | 2918,37, | 2918,38, | 2918,39, | 2918,40, | 2918,41, | 2918,42, | 2918,43, | 2918,44, | 2918,45, | 2918,46, | 2918,47, | 2918,48, | 2918,49, | 2918,50, | 2918,51, | 2918,52, | 2918,53, | 2918,54, | 2918,55, | 2918,56, | 2918,57, | 2918,58, | 2918,59, | 2918,60, | 2918,61, | 2918,62, | 2918,63, | 2918,64, | 2918,65, | 2918,66, | 2918,67, | 2918,68, | 2918,69, | 2918,70, | 2918,71, | 2918,72, | 2918,73, | 2918,74, | 2918,75, | 2918,76, | 2918,77, | 2918,78, | 2918,79, | 2918,80, | 2918,81, | 2918,82, | 2918,83, | 2918,84, | 2918,85, | 2919,1, | 2919,2, | 2919,3, | 2919,4, | 2919,5, | 2919,6, | 2919,7, | 2919,8, | 2919,9, | 2919,10, | 2919,11, | 2919,12, | 2919,13, | 2919,14, | 2919,15, | 2919,16, | 2919,17, | 2919,18, | 2919,19, | 2919,20, | 2919,21, | 2919,22, | 2919,23, | 2919,24, | 2919,25, | 2919,26, | 2919,27, | 2919,28, | 2919,29, | 2919,30, | 2919,31, | 2919,32, | 2919,33, | 2919,34, | 2919,35, | 2919,36, | 2919,37, | 2919,38, | 2919,39, | 2919,40, | 2919,41, | 2919,42, | 2919,43, | 2919,44, | 2919,45, | 2919,46, | 2919,47, | 2919,48, | 2919,49, | 2919,50, | 2919,51, | 2919,52, | 2919,53, | 2919,54, | 2919,55, | 2919,56, | 2919,57, | 2919,58, | 2919,59, | 2919,60, | 2919,61, | 2919,62, | 2919,63, | 2919,64, | 2919,65, | 2919,66, | 2919,67, | 2919,68, | 2919,69, | 2919,70, | 2919,71, | 2919,72, | 2919,73, | 2919,74, | 2919,75, | 2919,76, | 2919,77, | 2919,78, | 2919,79, | 2919,80, | 2919,81, | 2919,82, | 2919,83, | 2919,84, | 2919,85, | 2920,1, | 2920,2, | 2920,3, | 2920,4, | 2920,5, | 2920,6, | 2920,7, | 2920,8, | 2920,9, | 2920,10, | 2920,11, | 2920,12, | 2920,13, | 2920,14, | 2920,15, | 2920,16, | 2920,17, | 2920,18, | 2920,19, | 2920,20, | 2920,21, | 2920,22, | 2920,23, | 2920,24, | 2920,25, | 2920,26, | 2920,27, | 2920,28, | 2920,29, | 2920,30, | 2920,31, | 2920,32, | 2920,33, | 2920,34, | 2920,35, | 2920,36, | 2920,37, | 2920,38, | 2920,39, | 2920,40, | 2920,41, | 2920,42, | 2920,43, | 2920,44, | 2920,45, | 2920,46, | 2920,47, | 2920,48, | 2920,49, | 2920,50, | 2920,51, | 2920,52, | 2920,53, | 2920,54, | 2920,55, | 2920,56, | 2920,57, | 2920,58, | 2920,59, | 2920,60, | 2920,61, | 2920,62, | 2920,63, | 2920,64, | 2920,65, | 2920,66, | 2920,67, | 2920,68, | 2920,69, | 2920,70, | 2920,71, | 2920,72, | 2920,73, | 2920,74, | 2920,75, | 2920,76, | 2920,77, | 2920,78, | 2920,79, | 2920,80, | 2920,81, | 2920,82, | 2920,83, | 2920,84, | 2920,85, | 2921,1, | 2921,2, | 2921,3, | 2921,4, | 2921,5, | 2921,6, | 2921,7, | 2921,8, | 2921,9, | 2921,10, | 2921,11, | 2921,12, | 2921,13, | 2921,14, | 2921,15, | 2921,16, | 2921,17, | 2921,18, | 2921,19, | 2921,20, | 2921,21, | 2921,22, | 2921,23, | 2921,24, | 2921,25, | 2921,26, | 2921,27, | 2921,28, | 2921,29, | 2921,30, | 2921,31, | 2921,32, | 2921,33, | 2921,34, | 2921,35, | 2921,36, | 2921,37, | 2921,38, | 2921,39, | 2921,40, | 2921,41, | 2921,42, | 2921,43, | 2921,44, | 2921,45, | 2921,46, | 2921,47, | 2921,48, | 2921,49, | 2921,50, | 2921,51, | 2921,52, | 2921,53, | 2921,54, | 2921,55, | 2921,56, | 2921,57, | 2921,58, | 2921,59, | 2921,60, | 2921,61, | 2921,62, | 2921,63, | 2921,64, | 2921,65, | 2921,66, | 2921,67, | 2921,68, | 2921,69, | 2921,70, | 2921,71, | 2921,72, | 2921,73, | 2921,74, | 2921,75, | 2921,76, | 2921,77, | 2921,78, | 2921,79, | 2921,80, | 2921,81, | 2921,82, | 2921,83, | 2921,84, | 2921,85, | 2922,1, | 2922,2, | 2922,3, | 2922,4, | 2922,5, | 2922,6, | 2922,7, | 2922,8, | 2922,9, | 2922,10, | 2922,11, | 2922,12, | 2922,13, | 2922,14, | 2922,15, | 2922,16, | 2922,17, | 2922,18, | 2922,19, | 2922,20, | 2922,21, | 2922,22, | 2922,23, | 2922,24, | 2922,25, | 2922,26, | 2922,27, | 2922,28, | 2922,29, | 2922,30, | 2922,31, | 2922,32, | 2922,33, | 2922,34, | 2922,35, | 2922,36, | 2922,37, | 2922,38, | 2922,39, | 2922,40, | 2922,41, | 2922,42, | 2922,43, | 2922,44, | 2922,45, | 2922,46, | 2922,47, | 2922,48, | 2922,49, | 2922,50, | 2922,51, | 2922,52, | 2922,53, | 2922,54, | 2922,55, | 2922,56, | 2922,57, | 2922,58, | 2922,59, | 2922,60, | 2922,61, | 2922,62, | 2922,63, | 2922,64, | 2922,65, | 2922,66, | 2922,67, | 2922,68, | 2922,69, | 2922,70, | 2922,71, | 2922,72, | 2922,73, | 2922,74, | 2922,75, | 2922,76, | 2922,77, | 2922,78, | 2922,79, | 2922,80, | 2922,81, | 2922,82, | 2922,83, | 2922,84, | 2922,85, | 2923,1, | 2923,2, | 2923,3, | 2923,4, | 2923,5, | 2923,6, | 2923,7, | 2923,8, | 2923,9, | 2923,10, | 2923,11, | 2923,12, | 2923,13, | 2923,14, | 2923,15, | 2923,16, | 2923,17, | 2923,18, | 2923,19, | 2923,20, | 2923,21, | 2923,22, | 2923,23, | 2923,24, | 2923,25, | 2923,26, | 2923,27, | 2923,28, | 2923,29, | 2923,30, | 2923,31, | 2923,32, | 2923,33, | 2923,34, | 2923,35, | 2923,36, | 2923,37, | 2923,38, | 2923,39, | 2923,40, | 2923,41, | 2923,42, | 2923,43, | 2923,44, | 2923,45, | 2923,46, | 2923,47, | 2923,48, | 2923,49, | 2923,50, | 2923,51, | 2923,52, | 2923,53, | 2923,54, | 2923,55, | 2923,56, | 2923,57, | 2923,58, | 2923,59, | 2923,60, | 2923,61, | 2923,62, | 2923,63, | 2923,64, | 2923,65, | 2923,66, | 2923,67, | 2923,68, | 2923,69, | 2923,70, | 2923,71, | 2923,72, | 2923,73, | 2923,74, | 2923,75, | 2923,76, | 2923,77, | 2923,78, | 2923,79, | 2923,80, | 2923,81, | 2923,82, | 2923,83, | 2923,84, | 2923,85, | 2924,1, | 2924,2, | 2924,3, | 2924,4, | 2924,5, | 2924,6, | 2924,7, | 2924,8, | 2924,9, | 2924,10, | 2924,11, | 2924,12, | 2924,13, | 2924,14, | 2924,15, | 2924,16, | 2924,17, | 2924,18, | 2924,19, | 2924,20, | 2924,21, | 2924,22, | 2924,23, | 2924,24, | 2924,25, | 2924,26, | 2924,27, | 2924,28, | 2924,29, | 2924,30, | 2924,31, | 2924,32, | 2924,33, | 2924,34, | 2924,35, | 2924,36, | 2924,37, | 2924,38, | 2924,39, | 2924,40, | 2924,41, | 2924,42, | 2924,43, | 2924,44, | 2924,45, | 2924,46, | 2924,47, | 2924,48, | 2924,49, | 2924,50, | 2924,51, | 2924,52, | 2924,53, | 2924,54, | 2924,55, | 2924,56, | 2924,57, | 2924,58, | 2924,59, | 2924,60, | 2924,61, | 2924,62, | 2924,63, | 2924,64, | 2924,65, | 2924,66, | 2924,67, | 2924,68, | 2924,69, | 2924,70, | 2924,71, | 2924,72, | 2924,73, | 2924,74, | 2924,75, | 2924,76, | 2924,77, | 2924,78, | 2924,79, | 2924,80, | 2924,81, | 2924,82, | 2924,83, | 2924,84, | 2924,85, | 2925,1, | 2925,2, | 2925,3, | 2925,4, | 2925,5, | 2925,6, | 2925,7, | 2925,8, | 2925,9, | 2925,10, | 2925,11, | 2925,12, | 2925,13, | 2925,14, | 2925,15, | 2925,16, | 2925,17, | 2925,18, | 2925,19, | 2925,20, | 2925,21, | 2925,22, | 2925,23, | 2925,24, | 2925,25, | 2925,26, | 2925,27, | 2925,28, | 2925,29, | 2925,30, | 2925,31, | 2925,32, | 2925,33, | 2925,34, | 2925,35, | 2925,36, | 2925,37, | 2925,38, | 2925,39, | 2925,40, | 2925,41, | 2925,42, | 2925,43, | 2925,44, | 2925,45, | 2925,46, | 2925,47, | 2925,48, | 2925,49, | 2925,50, | 2925,51, | 2925,52, | 2925,53, | 2925,54, | 2925,55, | 2925,56, | 2925,57, | 2925,58, | 2925,59, | 2925,60, | 2925,61, | 2925,62, | 2925,63, | 2925,64, | 2925,65, | 2925,66, | 2925,67, | 2925,68, | 2925,69, | 2925,70, | 2925,71, | 2925,72, | 2925,73, | 2925,74, | 2925,75, | 2925,76, | 2925,77, | 2925,78, | 2925,79, | 2925,80, | 2925,81, | 2925,82, | 2925,83, | 2925,84, | 2925,85, | 2926,1, | 2926,2, | 2926,3, | 2926,4, | 2926,5, | 2926,6, | 2926,7, | 2926,8, | 2926,9, | 2926,10, | 2926,11, | 2926,12, | 2926,13, | 2926,14, | 2926,15, | 2926,16, | 2926,17, | 2926,18, | 2926,19, | 2926,20, | 2926,21, | 2926,22, | 2926,23, | 2926,24, | 2926,25, | 2926,26, | 2926,27, | 2926,28, | 2926,29, | 2926,30, | 2926,31, | 2926,32, | 2926,33, | 2926,34, | 2926,35, | 2926,36, | 2926,37, | 2926,38, | 2926,39, | 2926,40, | 2926,41, | 2926,42, | 2926,43, | 2926,44, | 2926,45, | 2926,46, | 2926,47, | 2926,48, | 2926,49, | 2926,50, | 2926,51, | 2926,52, | 2926,53, | 2926,54, | 2926,55, | 2926,56, | 2926,57, | 2926,58, | 2926,59, | 2926,60, | 2926,61, | 2926,62, | 2926,63, | 2926,64, | 2926,65, | 2926,66, | 2926,67, | 2926,68, | 2926,69, | 2926,70, | 2926,71, | 2926,72, | 2926,73, | 2926,74, | 2926,75, | 2926,76, | 2926,77, | 2926,78, | 2926,79, | 2926,80, | 2926,81, | 2926,82, | 2926,83, | 2926,84, | 2926,85, | 2927,1, | 2927,2, | 2927,3, | 2927,4, | 2927,5, | 2927,6, | 2927,7, | 2927,8, | 2927,9, | 2927,10, | 2927,11, | 2927,12, | 2927,13, | 2927,14, | 2927,15, | 2927,16, | 2927,17, | 2927,18, | 2927,19, | 2927,20, | 2927,21, | 2927,22, | 2927,23, | 2927,24, | 2927,25, | 2927,26, | 2927,27, | 2927,28, | 2927,29, | 2927,30, | 2927,31, | 2927,32, | 2927,33, | 2927,34, | 2927,35, | 2927,36, | 2927,37, | 2927,38, | 2927,39, | 2927,40, | 2927,41, | 2927,42, | 2927,43, | 2927,44, | 2927,45, | 2927,46, | 2927,47, | 2927,48, | 2927,49, | 2927,50, | 2927,51, | 2927,52, | 2927,53, | 2927,54, | 2927,55, | 2927,56, | 2927,57, | 2927,58, | 2927,59, | 2927,60, | 2927,61, | 2927,62, | 2927,63, | 2927,64, | 2927,65, | 2927,66, | 2927,67, | 2927,68, | 2927,69, | 2927,70, | 2927,71, | 2927,72, | 2927,73, | 2927,74, | 2927,75, | 2927,76, | 2927,77, | 2927,78, | 2927,79, | 2927,80, | 2927,81, | 2927,82, | 2927,83, | 2927,84, | 2927,85, | 2928,1, | 2928,2, | 2928,3, | 2928,4, | 2928,5, | 2928,6, | 2928,7, | 2928,8, | 2928,9, | 2928,10, | 2928,11, | 2928,12, | 2928,13, | 2928,14, | 2928,15, | 2928,16, | 2928,17, | 2928,18, | 2928,19, | 2928,20, | 2928,21, | 2928,22, | 2928,23, | 2928,24, | 2928,25, | 2928,26, | 2928,27, | 2928,28, | 2928,29, | 2928,30, | 2928,31, | 2928,32, | 2928,33, | 2928,34, | 2928,35, | 2928,36, | 2928,37, | 2928,38, | 2928,39, | 2928,40, | 2928,41, | 2928,42, | 2928,43, | 2928,44, | 2928,45, | 2928,46, | 2928,47, | 2928,48, | 2928,49, | 2928,50, | 2928,51, | 2928,52, | 2928,53, | 2928,54, | 2928,55, | 2928,56, | 2928,57, | 2928,58, | 2928,59, | 2928,60, | 2928,61, | 2928,62, | 2928,63, | 2928,64, | 2928,65, | 2928,66, | 2928,67, | 2928,68, | 2928,69, | 2928,70, | 2928,71, | 2928,72, | 2928,73, | 2928,74, | 2928,75, | 2928,76, | 2928,77, | 2928,78, | 2928,79, | 2928,80, | 2928,81, | 2928,82, | 2928,83, | 2928,84, | 2928,85, | 2929,1, | 2929,2, | 2929,3, | 2929,4, | 2929,5, | 2929,6, | 2929,7, | 2929,8, | 2929,9, | 2929,10, | 2929,11, | 2929,12, | 2929,13, | 2929,14, | 2929,15, | 2929,16, | 2929,17, | 2929,18, | 2929,19, | 2929,20, | 2929,21, | 2929,22, | 2929,23, | 2929,24, | 2929,25, | 2929,26, | 2929,27, | 2929,28, | 2929,29, | 2929,30, | 2929,31, | 2929,32, | 2929,33, | 2929,34, | 2929,35, | 2929,36, | 2929,37, | 2929,38, | 2929,39, | 2929,40, | 2929,41, | 2929,42, | 2929,43, | 2929,44, | 2929,45, | 2929,46, | 2929,47, | 2929,48, | 2929,49, | 2929,50, | 2929,51, | 2929,52, | 2929,53, | 2929,54, | 2929,55, | 2929,56, | 2929,57, | 2929,58, | 2929,59, | 2929,60, | 2929,61, | 2929,62, | 2929,63, | 2929,64, | 2929,65, | 2929,66, | 2929,67, | 2929,68, | 2929,69, | 2929,70, | 2929,71, | 2929,72, | 2929,73, | 2929,74, | 2929,75, | 2929,76, | 2929,77, | 2929,78, | 2929,79, | 2929,80, | 2929,81, | 2929,82, | 2929,83, | 2929,84, | 2929,85, | 2930,1, | 2930,2, | 2930,3, | 2930,4, | 2930,5, | 2930,6, | 2930,7, | 2930,8, | 2930,9, | 2930,10, | 2930,11, | 2930,12, | 2930,13, | 2930,14, | 2930,15, | 2930,16, | 2930,17, | 2930,18, | 2930,19, | 2930,20, | 2930,21, | 2930,22, | 2930,23, | 2930,24, | 2930,25, | 2930,26, | 2930,27, | 2930,28, | 2930,29, | 2930,30, | 2930,31, | 2930,32, | 2930,33, | 2930,34, | 2930,35, | 2930,36, | 2930,37, | 2930,38, | 2930,39, | 2930,40, | 2930,41, | 2930,42, | 2930,43, | 2930,44, | 2930,45, | 2930,46, | 2930,47, | 2930,48, | 2930,49, | 2930,50, | 2930,51, | 2930,52, | 2930,53, | 2930,54, | 2930,55, | 2930,56, | 2930,57, | 2930,58, | 2930,59, | 2930,60, | 2930,61, | 2930,62, | 2930,63, | 2930,64, | 2930,65, | 2930,66, | 2930,67, | 2930,68, | 2930,69, | 2930,70, | 2930,71, | 2930,72, | 2930,73, | 2930,74, | 2930,75, | 2930,76, | 2930,77, | 2930,78, | 2930,79, | 2930,80, | 2930,81, | 2930,82, | 2930,83, | 2930,84, | 2930,85, | 2931,1, | 2931,2, | 2931,3, | 2931,4, | 2931,5, | 2931,6, | 2931,7, | 2931,8, | 2931,9, | 2931,10, | 2931,11, | 2931,12, | 2931,13, | 2931,14, | 2931,15, | 2931,16, | 2931,17, | 2931,18, | 2931,19, | 2931,20, | 2931,21, | 2931,22, | 2931,23, | 2931,24, | 2931,25, | 2931,26, | 2931,27, | 2931,28, | 2931,29, | 2931,30, | 2931,31, | 2931,32, | 2931,33, | 2931,34, | 2931,35, | 2931,36, | 2931,37, | 2931,38, | 2931,39, | 2931,40, | 2931,41, | 2931,42, | 2931,43, | 2931,44, | 2931,45, | 2931,46, | 2931,47, | 2931,48, | 2931,49, | 2931,50, | 2931,51, | 2931,52, | 2931,53, | 2931,54, | 2931,55, | 2931,56, | 2931,57, | 2931,58, | 2931,59, | 2931,60, | 2931,61, | 2931,62, | 2931,63, | 2931,64, | 2931,65, | 2931,66, | 2931,67, | 2931,68, | 2931,69, | 2931,70, | 2931,71, | 2931,72, | 2931,73, | 2931,74, | 2931,75, | 2931,76, | 2931,77, | 2931,78, | 2931,79, | 2931,80, | 2931,81, | 2931,82, | 2931,83, | 2931,84, | 2931,85, | 2932,1, | 2932,2, | 2932,3, | 2932,4, | 2932,5, | 2932,6, | 2932,7, | 2932,8, | 2932,9, | 2932,10, | 2932,11, | 2932,12, | 2932,13, | 2932,14, | 2932,15, | 2932,16, | 2932,17, | 2932,18, | 2932,19, | 2932,20, | 2932,21, | 2932,22, | 2932,23, | 2932,24, | 2932,25, | 2932,26, | 2932,27, | 2932,28, | 2932,29, | 2932,30, | 2932,31, | 2932,32, | 2932,33, | 2932,34, | 2932,35, | 2932,36, | 2932,37, | 2932,38, | 2932,39, | 2932,40, | 2932,41, | 2932,42, | 2932,43, | 2932,44, | 2932,45, | 2932,46, | 2932,47, | 2932,48, | 2932,49, | 2932,50, | 2932,51, | 2932,52, | 2932,53, | 2932,54, | 2932,55, | 2932,56, | 2932,57, | 2932,58, | 2932,59, | 2932,60, | 2932,61, | 2932,62, | 2932,63, | 2932,64, | 2932,65, | 2932,66, | 2932,67, | 2932,68, | 2932,69, | 2932,70, | 2932,71, | 2932,72, | 2932,73, | 2932,74, | 2932,75, | 2932,76, | 2932,77, | 2932,78, | 2932,79, | 2932,80, | 2932,81, | 2932,82, | 2932,83, | 2932,84, | 2932,85, | 2933,1, | 2933,2, | 2933,3, | 2933,4, | 2933,5, | 2933,6, | 2933,7, | 2933,8, | 2933,9, | 2933,10, | 2933,11, | 2933,12, | 2933,13, | 2933,14, | 2933,15, | 2933,16, | 2933,17, | 2933,18, | 2933,19, | 2933,20, | 2933,21, | 2933,22, | 2933,23, | 2933,24, | 2933,25, | 2933,26, | 2933,27, | 2933,28, | 2933,29, | 2933,30, | 2933,31, | 2933,32, | 2933,33, | 2933,34, | 2933,35, | 2933,36, | 2933,37, | 2933,38, | 2933,39, | 2933,40, | 2933,41, | 2933,42, | 2933,43, | 2933,44, | 2933,45, | 2933,46, | 2933,47, | 2933,48, | 2933,49, | 2933,50, | 2933,51, | 2933,52, | 2933,53, | 2933,54, | 2933,55, | 2933,56, | 2933,57, | 2933,58, | 2933,59, | 2933,60, | 2933,61, | 2933,62, | 2933,63, | 2933,64, | 2933,65, | 2933,66, | 2933,67, | 2933,68, | 2933,69, | 2933,70, | 2933,71, | 2933,72, | 2933,73, | 2933,74, | 2933,75, | 2933,76, | 2933,77, | 2933,78, | 2933,79, | 2933,80, | 2933,81, | 2933,82, | 2933,83, | 2933,84, | 2933,85, | 2934,1, | 2934,2, | 2934,3, | 2934,4, | 2934,5, | 2934,6, | 2934,7, | 2934,8, | 2934,9, | 2934,10, | 2934,11, | 2934,12, | 2934,13, | 2934,14, | 2934,15, | 2934,16, | 2934,17, | 2934,18, | 2934,19, | 2934,20, | 2934,21, | 2934,22, | 2934,23, | 2934,24, | 2934,25, | 2934,26, | 2934,27, | 2934,28, | 2934,29, | 2934,30, | 2934,31, | 2934,32, | 2934,33, | 2934,34, | 2934,35, | 2934,36, | 2934,37, | 2934,38, | 2934,39, | 2934,40, | 2934,41, | 2934,42, | 2934,43, | 2934,44, | 2934,45, | 2934,46, | 2934,47, | 2934,48, | 2934,49, | 2934,50, | 2934,51, | 2934,52, | 2934,53, | 2934,54, | 2934,55, | 2934,56, | 2934,57, | 2934,58, | 2934,59, | 2934,60, | 2934,61, | 2934,62, | 2934,63, | 2934,64, | 2934,65, | 2934,66, | 2934,67, | 2934,68, | 2934,69, | 2934,70, | 2934,71, | 2934,72, | 2934,73, | 2934,74, | 2934,75, | 2934,76, | 2934,77, | 2934,78, | 2934,79, | 2934,80, | 2934,81, | 2934,82, | 2934,83, | 2934,84, | 2934,85, | 2935,1, | 2935,2, | 2935,3, | 2935,4, | 2935,5, | 2935,6, | 2935,7, | 2935,8, | 2935,9, | 2935,10, | 2935,11, | 2935,12, | 2935,13, | 2935,14, | 2935,15, | 2935,16, | 2935,17, | 2935,18, | 2935,19, | 2935,20, | 2935,21, | 2935,22, | 2935,23, | 2935,24, | 2935,25, | 2935,26, | 2935,27, | 2935,28, | 2935,29, | 2935,30, | 2935,31, | 2935,32, | 2935,33, | 2935,34, | 2935,35, | 2935,36, | 2935,37, | 2935,38, | 2935,39, | 2935,40, | 2935,41, | 2935,42, | 2935,43, | 2935,44, | 2935,45, | 2935,46, | 2935,47, | 2935,48, | 2935,49, | 2935,50, | 2935,51, | 2935,52, | 2935,53, | 2935,54, | 2935,55, | 2935,56, | 2935,57, | 2935,58, | 2935,59, | 2935,60, | 2935,61, | 2935,62, | 2935,63, | 2935,64, | 2935,65, | 2935,66, | 2935,67, | 2935,68, | 2935,69, | 2935,70, | 2935,71, | 2935,72, | 2935,73, | 2935,74, | 2935,75, | 2935,76, | 2935,77, | 2935,78, | 2935,79, | 2935,80, | 2935,81, | 2935,82, | 2935,83, | 2935,84, | 2935,85, | 2936,1, | 2936,2, | 2936,3, | 2936,4, | 2936,5, | 2936,6, | 2936,7, | 2936,8, | 2936,9, | 2936,10, | 2936,11, | 2936,12, | 2936,13, | 2936,14, | 2936,15, | 2936,16, | 2936,17, | 2936,18, | 2936,19, | 2936,20, | 2936,21, | 2936,22, | 2936,23, | 2936,24, | 2936,25, | 2936,26, | 2936,27, | 2936,28, | 2936,29, | 2936,30, | 2936,31, | 2936,32, | 2936,33, | 2936,34, | 2936,35, | 2936,36, | 2936,37, | 2936,38, | 2936,39, | 2936,40, | 2936,41, | 2936,42, | 2936,43, | 2936,44, | 2936,45, | 2936,46, | 2936,47, | 2936,48, | 2936,49, | 2936,50, | 2936,51, | 2936,52, | 2936,53, | 2936,54, | 2936,55, | 2936,56, | 2936,57, | 2936,58, | 2936,59, | 2936,60, | 2936,61, | 2936,62, | 2936,63, | 2936,64, | 2936,65, | 2936,66, | 2936,67, | 2936,68, | 2936,69, | 2936,70, | 2936,71, | 2936,72, | 2936,73, | 2936,74, | 2936,75, | 2936,76, | 2936,77, | 2936,78, | 2936,79, | 2936,80, | 2936,81, | 2936,82, | 2936,83, | 2936,84, | 2936,85, | 2937,1, | 2937,2, | 2937,3, | 2937,4, | 2937,5, | 2937,6, | 2937,7, | 2937,8, | 2937,9, | 2937,10, | 2937,11, | 2937,12, | 2937,13, | 2937,14, | 2937,15, | 2937,16, | 2937,17, | 2937,18, | 2937,19, | 2937,20, | 2937,21, | 2937,22, | 2937,23, | 2937,24, | 2937,25, | 2937,26, | 2937,27, | 2937,28, | 2937,29, | 2937,30, | 2937,31, | 2937,32, | 2937,33, | 2937,34, | 2937,35, | 2937,36, | 2937,37, | 2937,38, | 2937,39, | 2937,40, | 2937,41, | 2937,42, | 2937,43, | 2937,44, | 2937,45, | 2937,46, | 2937,47, | 2937,48, | 2937,49, | 2937,50, | 2937,51, | 2937,52, | 2937,53, | 2937,54, | 2937,55, | 2937,56, | 2937,57, | 2937,58, | 2937,59, | 2937,60, | 2937,61, | 2937,62, | 2937,63, | 2937,64, | 2937,65, | 2937,66, | 2937,67, | 2937,68, | 2937,69, | 2937,70, | 2937,71, | 2937,72, | 2937,73, | 2937,74, | 2937,75, | 2937,76, | 2937,77, | 2937,78, | 2937,79, | 2937,80, | 2937,81, | 2937,82, | 2937,83, | 2937,84, | 2937,85, | 2938,1, | 2938,2, | 2938,3, | 2938,4, | 2938,5, | 2938,6, | 2938,7, | 2938,8, | 2938,9, | 2938,10, | 2938,11, | 2938,12, | 2938,13, | 2938,14, | 2938,15, | 2938,16, | 2938,17, | 2938,18, | 2938,19, | 2938,20, | 2938,21, | 2938,22, | 2938,23, | 2938,24, | 2938,25, | 2938,26, | 2938,27, | 2938,28, | 2938,29, | 2938,30, | 2938,31, | 2938,32, | 2938,33, | 2938,34, | 2938,35, | 2938,36, | 2938,37, | 2938,38, | 2938,39, | 2938,40, | 2938,41, | 2938,42, | 2938,43, | 2938,44, | 2938,45, | 2938,46, | 2938,47, | 2938,48, | 2938,49, | 2938,50, | 2938,51, | 2938,52, | 2938,53, | 2938,54, | 2938,55, | 2938,56, | 2938,57, | 2938,58, | 2938,59, | 2938,60, | 2938,61, | 2938,62, | 2938,63, | 2938,64, | 2938,65, | 2938,66, | 2938,67, | 2938,68, | 2938,69, | 2938,70, | 2938,71, | 2938,72, | 2938,73, | 2938,74, | 2938,75, | 2938,76, | 2938,77, | 2938,78, | 2938,79, | 2938,80, | 2938,81, | 2938,82, | 2938,83, | 2938,84, | 2938,85, | 2939,1, | 2939,2, | 2939,3, | 2939,4, | 2939,5, | 2939,6, | 2939,7, | 2939,8, | 2939,9, | 2939,10, | 2939,11, | 2939,12, | 2939,13, | 2939,14, | 2939,15, | 2939,16, | 2939,17, | 2939,18, | 2939,19, | 2939,20, | 2939,21, | 2939,22, | 2939,23, | 2939,24, | 2939,25, | 2939,26, | 2939,27, | 2939,28, | 2939,29, | 2939,30, | 2939,31, | 2939,32, | 2939,33, | 2939,34, | 2939,35, | 2939,36, | 2939,37, | 2939,38, | 2939,39, | 2939,40, | 2939,41, | 2939,42, | 2939,43, | 2939,44, | 2939,45, | 2939,46, | 2939,47, | 2939,48, | 2939,49, | 2939,50, | 2939,51, | 2939,52, | 2939,53, | 2939,54, | 2939,55, | 2939,56, | 2939,57, | 2939,58, | 2939,59, | 2939,60, | 2939,61, | 2939,62, | 2939,63, | 2939,64, | 2939,65, | 2939,66, | 2939,67, | 2939,68, | 2939,69, | 2939,70, | 2939,71, | 2939,72, | 2939,73, | 2939,74, | 2939,75, | 2939,76, | 2939,77, | 2939,78, | 2939,79, | 2939,80, | 2939,81, | 2939,82, | 2939,83, | 2939,84, | 2939,85, | 2940,1, | 2940,2, | 2940,3, | 2940,4, | 2940,5, | 2940,6, | 2940,7, | 2940,8, | 2940,9, | 2940,10, | 2940,11, | 2940,12, | 2940,13, | 2940,14, | 2940,15, | 2940,16, | 2940,17, | 2940,18, | 2940,19, | 2940,20, | 2940,21, | 2940,22, | 2940,23, | 2940,24, | 2940,25, | 2940,26, | 2940,27, | 2940,28, | 2940,29, | 2940,30, | 2940,31, | 2940,32, | 2940,33, | 2940,34, | 2940,35, | 2940,36, | 2940,37, | 2940,38, | 2940,39, | 2940,40, | 2940,41, | 2940,42, | 2940,43, | 2940,44, | 2940,45, | 2940,46, | 2940,47, | 2940,48, | 2940,49, | 2940,50, | 2940,51, | 2940,52, | 2940,53, | 2940,54, | 2940,55, | 2940,56, | 2940,57, | 2940,58, | 2940,59, | 2940,60, | 2940,61, | 2940,62, | 2940,63, | 2940,64, | 2940,65, | 2940,66, | 2940,67, | 2940,68, | 2940,69, | 2940,70, | 2940,71, | 2940,72, | 2940,73, | 2940,74, | 2940,75, | 2940,76, | 2940,77, | 2940,78, | 2940,79, | 2940,80, | 2940,81, | 2940,82, | 2940,83, | 2940,84, | 2940,85, | 2941,1, | 2941,2, | 2941,3, | 2941,4, | 2941,5, | 2941,6, | 2941,7, | 2941,8, | 2941,9, | 2941,10, | 2941,11, | 2941,12, | 2941,13, | 2941,14, | 2941,15, | 2941,16, | 2941,17, | 2941,18, | 2941,19, | 2941,20, | 2941,21, | 2941,22, | 2941,23, | 2941,24, | 2941,25, | 2941,26, | 2941,27, | 2941,28, | 2941,29, | 2941,30, | 2941,31, | 2941,32, | 2941,33, | 2941,34, | 2941,35, | 2941,36, | 2941,37, | 2941,38, | 2941,39, | 2941,40, | 2941,41, | 2941,42, | 2941,43, | 2941,44, | 2941,45, | 2941,46, | 2941,47, | 2941,48, | 2941,49, | 2941,50, | 2941,51, | 2941,52, | 2941,53, | 2941,54, | 2941,55, | 2941,56, | 2941,57, | 2941,58, | 2941,59, | 2941,60, | 2941,61, | 2941,62, | 2941,63, | 2941,64, | 2941,65, | 2941,66, | 2941,67, | 2941,68, | 2941,69, | 2941,70, | 2941,71, | 2941,72, | 2941,73, | 2941,74, | 2941,75, | 2941,76, | 2941,77, | 2941,78, | 2941,79, | 2941,80, | 2941,81, | 2941,82, | 2941,83, | 2941,84, | 2941,85, | 2942,1, | 2942,2, | 2942,3, | 2942,4, | 2942,5, | 2942,6, | 2942,7, | 2942,8, | 2942,9, | 2942,10, | 2942,11, | 2942,12, | 2942,13, | 2942,14, | 2942,15, | 2942,16, | 2942,17, | 2942,18, | 2942,19, | 2942,20, | 2942,21, | 2942,22, | 2942,23, | 2942,24, | 2942,25, | 2942,26, | 2942,27, | 2942,28, | 2942,29, | 2942,30, | 2942,31, | 2942,32, | 2942,33, | 2942,34, | 2942,35, | 2942,36, | 2942,37, | 2942,38, | 2942,39, | 2942,40, | 2942,41, | 2942,42, | 2942,43, | 2942,44, | 2942,45, | 2942,46, | 2942,47, | 2942,48, | 2942,49, | 2942,50, | 2942,51, | 2942,52, | 2942,53, | 2942,54, | 2942,55, | 2942,56, | 2942,57, | 2942,58, | 2942,59, | 2942,60, | 2942,61, | 2942,62, | 2942,63, | 2942,64, | 2942,65, | 2942,66, | 2942,67, | 2942,68, | 2942,69, | 2942,70, | 2942,71, | 2942,72, | 2942,73, | 2942,74, | 2942,75, | 2942,76, | 2942,77, | 2942,78, | 2942,79, | 2942,80, | 2942,81, | 2942,82, | 2942,83, | 2942,84, | 2942,85, | 2943,1, | 2943,2, | 2943,3, | 2943,4, | 2943,5, | 2943,6, | 2943,7, | 2943,8, | 2943,9, | 2943,10, | 2943,11, | 2943,12, | 2943,13, | 2943,14, | 2943,15, | 2943,16, | 2943,17, | 2943,18, | 2943,19, | 2943,20, | 2943,21, | 2943,22, | 2943,23, | 2943,24, | 2943,25, | 2943,26, | 2943,27, | 2943,28, | 2943,29, | 2943,30, | 2943,31, | 2943,32, | 2943,33, | 2943,34, | 2943,35, | 2943,36, | 2943,37, | 2943,38, | 2943,39, | 2943,40, | 2943,41, | 2943,42, | 2943,43, | 2943,44, | 2943,45, | 2943,46, | 2943,47, | 2943,48, | 2943,49, | 2943,50, | 2943,51, | 2943,52, | 2943,53, | 2943,54, | 2943,55, | 2943,56, | 2943,57, | 2943,58, | 2943,59, | 2943,60, | 2943,61, | 2943,62, | 2943,63, | 2943,64, | 2943,65, | 2943,66, | 2943,67, | 2943,68, | 2943,69, | 2943,70, | 2943,71, | 2943,72, | 2943,73, | 2943,74, | 2943,75, | 2943,76, | 2943,77, | 2943,78, | 2943,79, | 2943,80, | 2943,81, | 2943,82, | 2943,83, | 2943,84, | 2943,85, | 2944,1, | 2944,2, | 2944,3, | 2944,4, | 2944,5, | 2944,6, | 2944,7, | 2944,8, | 2944,9, | 2944,10, | 2944,11, | 2944,12, | 2944,13, | 2944,14, | 2944,15, | 2944,16, | 2944,17, | 2944,18, | 2944,19, | 2944,20, | 2944,21, | 2944,22, | 2944,23, | 2944,24, | 2944,25, | 2944,26, | 2944,27, | 2944,28, | 2944,29, | 2944,30, | 2944,31, | 2944,32, | 2944,33, | 2944,34, | 2944,35, | 2944,36, | 2944,37, | 2944,38, | 2944,39, | 2944,40, | 2944,41, | 2944,42, | 2944,43, | 2944,44, | 2944,45, | 2944,46, | 2944,47, | 2944,48, | 2944,49, | 2944,50, | 2944,51, | 2944,52, | 2944,53, | 2944,54, | 2944,55, | 2944,56, | 2944,57, | 2944,58, | 2944,59, | 2944,60, | 2944,61, | 2944,62, | 2944,63, | 2944,64, | 2944,65, | 2944,66, | 2944,67, | 2944,68, | 2944,69, | 2944,70, | 2944,71, | 2944,72, | 2944,73, | 2944,74, | 2944,75, | 2944,76, | 2944,77, | 2944,78, | 2944,79, | 2944,80, | 2944,81, | 2944,82, | 2944,83, | 2944,84, | 2944,85, | 2945,1, | 2945,2, | 2945,3, | 2945,4, | 2945,5, | 2945,6, | 2945,7, | 2945,8, | 2945,9, | 2945,10, | 2945,11, | 2945,12, | 2945,13, | 2945,14, | 2945,15, | 2945,16, | 2945,17, | 2945,18, | 2945,19, | 2945,20, | 2945,21, | 2945,22, | 2945,23, | 2945,24, | 2945,25, | 2945,26, | 2945,27, | 2945,28, | 2945,29, | 2945,30, | 2945,31, | 2945,32, | 2945,33, | 2945,34, | 2945,35, | 2945,36, | 2945,37, | 2945,38, | 2945,39, | 2945,40, | 2945,41, | 2945,42, | 2945,43, | 2945,44, | 2945,45, | 2945,46, | 2945,47, | 2945,48, | 2945,49, | 2945,50, | 2945,51, | 2945,52, | 2945,53, | 2945,54, | 2945,55, | 2945,56, | 2945,57, | 2945,58, | 2945,59, | 2945,60, | 2945,61, | 2945,62, | 2945,63, | 2945,64, | 2945,65, | 2945,66, | 2945,67, | 2945,68, | 2945,69, | 2945,70, | 2945,71, | 2945,72, | 2945,73, | 2945,74, | 2945,75, | 2945,76, | 2945,77, | 2945,78, | 2945,79, | 2945,80, | 2945,81, | 2945,82, | 2945,83, | 2945,84, | 2945,85, | 2946,1, | 2946,2, | 2946,3, | 2946,4, | 2946,5, | 2946,6, | 2946,7, | 2946,8, | 2946,9, | 2946,10, | 2946,11, | 2946,12, | 2946,13, | 2946,14, | 2946,15, | 2946,16, | 2946,17, | 2946,18, | 2946,19, | 2946,20, | 2946,21, | 2946,22, | 2946,23, | 2946,24, | 2946,25, | 2946,26, | 2946,27, | 2946,28, | 2946,29, | 2946,30, | 2946,31, | 2946,32, | 2946,33, | 2946,34, | 2946,35, | 2946,36, | 2946,37, | 2946,38, | 2946,39, | 2946,40, | 2946,41, | 2946,42, | 2946,43, | 2946,44, | 2946,45, | 2946,46, | 2946,47, | 2946,48, | 2946,49, | 2946,50, | 2946,51, | 2946,52, | 2946,53, | 2946,54, | 2946,55, | 2946,56, | 2946,57, | 2946,58, | 2946,59, | 2946,60, | 2946,61, | 2946,62, | 2946,63, | 2946,64, | 2946,65, | 2946,66, | 2946,67, | 2946,68, | 2946,69, | 2946,70, | 2946,71, | 2946,72, | 2946,73, | 2946,74, | 2946,75, | 2946,76, | 2946,77, | 2946,78, | 2946,79, | 2946,80, | 2946,81, | 2946,82, | 2946,83, | 2946,84, | 2946,85, | 2947,1, | 2947,2, | 2947,3, | 2947,4, | 2947,5, | 2947,6, | 2947,7, | 2947,8, | 2947,9, | 2947,10, | 2947,11, | 2947,12, | 2947,13, | 2947,14, | 2947,15, | 2947,16, | 2947,17, | 2947,18, | 2947,19, | 2947,20, | 2947,21, | 2947,22, | 2947,23, | 2947,24, | 2947,25, | 2947,26, | 2947,27, | 2947,28, | 2947,29, | 2947,30, | 2947,31, | 2947,32, | 2947,33, | 2947,34, | 2947,35, | 2947,36, | 2947,37, | 2947,38, | 2947,39, | 2947,40, | 2947,41, | 2947,42, | 2947,43, | 2947,44, | 2947,45, | 2947,46, | 2947,47, | 2947,48, | 2947,49, | 2947,50, | 2947,51, | 2947,52, | 2947,53, | 2947,54, | 2947,55, | 2947,56, | 2947,57, | 2947,58, | 2947,59, | 2947,60, | 2947,61, | 2947,62, | 2947,63, | 2947,64, | 2947,65, | 2947,66, | 2947,67, | 2947,68, | 2947,69, | 2947,70, | 2947,71, | 2947,72, | 2947,73, | 2947,74, | 2947,75, | 2947,76, | 2947,77, | 2947,78, | 2947,79, | 2947,80, | 2947,81, | 2947,82, | 2947,83, | 2947,84, | 2947,85, | 2948,1, | 2948,2, | 2948,3, | 2948,4, | 2948,5, | 2948,6, | 2948,7, | 2948,8, | 2948,9, | 2948,10, | 2948,11, | 2948,12, | 2948,13, | 2948,14, | 2948,15, | 2948,16, | 2948,17, | 2948,18, | 2948,19, | 2948,20, | 2948,21, | 2948,22, | 2948,23, | 2948,24, | 2948,25, | 2948,26, | 2948,27, | 2948,28, | 2948,29, | 2948,30, | 2948,31, | 2948,32, | 2948,33, | 2948,34, | 2948,35, | 2948,36, | 2948,37, | 2948,38, | 2948,39, | 2948,40, | 2948,41, | 2948,42, | 2948,43, | 2948,44, | 2948,45, | 2948,46, | 2948,47, | 2948,48, | 2948,49, | 2948,50, | 2948,51, | 2948,52, | 2948,53, | 2948,54, | 2948,55, | 2948,56, | 2948,57, | 2948,58, | 2948,59, | 2948,60, | 2948,61, | 2948,62, | 2948,63, | 2948,64, | 2948,65, | 2948,66, | 2948,67, | 2948,68, | 2948,69, | 2948,70, | 2948,71, | 2948,72, | 2948,73, | 2948,74, | 2948,75, | 2948,76, | 2948,77, | 2948,78, | 2948,79, | 2948,80, | 2948,81, | 2948,82, | 2948,83, | 2948,84, | 2948,85, | 2949,1, | 2949,2, | 2949,3, | 2949,4, | 2949,5, | 2949,6, | 2949,7, | 2949,8, | 2949,9, | 2949,10, | 2949,11, | 2949,12, | 2949,13, | 2949,14, | 2949,15, | 2949,16, | 2949,17, | 2949,18, | 2949,19, | 2949,20, | 2949,21, | 2949,22, | 2949,23, | 2949,24, | 2949,25, | 2949,26, | 2949,27, | 2949,28, | 2949,29, | 2949,30, | 2949,31, | 2949,32, | 2949,33, | 2949,34, | 2949,35, | 2949,36, | 2949,37, | 2949,38, | 2949,39, | 2949,40, | 2949,41, | 2949,42, | 2949,43, | 2949,44, | 2949,45, | 2949,46, | 2949,47, | 2949,48, | 2949,49, | 2949,50, | 2949,51, | 2949,52, | 2949,53, | 2949,54, | 2949,55, | 2949,56, | 2949,57, | 2949,58, | 2949,59, | 2949,60, | 2949,61, | 2949,62, | 2949,63, | 2949,64, | 2949,65, | 2949,66, | 2949,67, | 2949,68, | 2949,69, | 2949,70, | 2949,71, | 2949,72, | 2949,73, | 2949,74, | 2949,75, | 2949,76, | 2949,77, | 2949,78, | 2949,79, | 2949,80, | 2949,81, | 2949,82, | 2949,83, | 2949,84, | 2949,85, | 2950,1, | 2950,2, | 2950,3, | 2950,4, | 2950,5, | 2950,6, | 2950,7, | 2950,8, | 2950,9, | 2950,10, | 2950,11, | 2950,12, | 2950,13, | 2950,14, | 2950,15, | 2950,16, | 2950,17, | 2950,18, | 2950,19, | 2950,20, | 2950,21, | 2950,22, | 2950,23, | 2950,24, | 2950,25, | 2950,26, | 2950,27, | 2950,28, | 2950,29, | 2950,30, | 2950,31, | 2950,32, | 2950,33, | 2950,34, | 2950,35, | 2950,36, | 2950,37, | 2950,38, | 2950,39, | 2950,40, | 2950,41, | 2950,42, | 2950,43, | 2950,44, | 2950,45, | 2950,46, | 2950,47, | 2950,48, | 2950,49, | 2950,50, | 2950,51, | 2950,52, | 2950,53, | 2950,54, | 2950,55, | 2950,56, | 2950,57, | 2950,58, | 2950,59, | 2950,60, | 2950,61, | 2950,62, | 2950,63, | 2950,64, | 2950,65, | 2950,66, | 2950,67, | 2950,68, | 2950,69, | 2950,70, | 2950,71, | 2950,72, | 2950,73, | 2950,74, | 2950,75, | 2950,76, | 2950,77, | 2950,78, | 2950,79, | 2950,80, | 2950,81, | 2950,82, | 2950,83, | 2950,84, | 2950,85, | 2951,1, | 2951,2, | 2951,3, | 2951,4, | 2951,5, | 2951,6, | 2951,7, | 2951,8, | 2951,9, | 2951,10, | 2951,11, | 2951,12, | 2951,13, | 2951,14, | 2951,15, | 2951,16, | 2951,17, | 2951,18, | 2951,19, | 2951,20, | 2951,21, | 2951,22, | 2951,23, | 2951,24, | 2951,25, | 2951,26, | 2951,27, | 2951,28, | 2951,29, | 2951,30, | 2951,31, | 2951,32, | 2951,33, | 2951,34, | 2951,35, | 2951,36, | 2951,37, | 2951,38, | 2951,39, | 2951,40, | 2951,41, | 2951,42, | 2951,43, | 2951,44, | 2951,45, | 2951,46, | 2951,47, | 2951,48, | 2951,49, | 2951,50, | 2951,51, | 2951,52, | 2951,53, | 2951,54, | 2951,55, | 2951,56, | 2951,57, | 2951,58, | 2951,59, | 2951,60, | 2951,61, | 2951,62, | 2951,63, | 2951,64, | 2951,65, | 2951,66, | 2951,67, | 2951,68, | 2951,69, | 2951,70, | 2951,71, | 2951,72, | 2951,73, | 2951,74, | 2951,75, | 2951,76, | 2951,77, | 2951,78, | 2951,79, | 2951,80, | 2951,81, | 2951,82, | 2951,83, | 2951,84, | 2951,85, | 2952,1, | 2952,2, | 2952,3, | 2952,4, | 2952,5, | 2952,6, | 2952,7, | 2952,8, | 2952,9, | 2952,10, | 2952,11, | 2952,12, | 2952,13, | 2952,14, | 2952,15, | 2952,16, | 2952,17, | 2952,18, | 2952,19, | 2952,20, | 2952,21, | 2952,22, | 2952,23, | 2952,24, | 2952,25, | 2952,26, | 2952,27, | 2952,28, | 2952,29, | 2952,30, | 2952,31, | 2952,32, | 2952,33, | 2952,34, | 2952,35, | 2952,36, | 2952,37, | 2952,38, | 2952,39, | 2952,40, | 2952,41, | 2952,42, | 2952,43, | 2952,44, | 2952,45, | 2952,46, | 2952,47, | 2952,48, | 2952,49, | 2952,50, | 2952,51, | 2952,52, | 2952,53, | 2952,54, | 2952,55, | 2952,56, | 2952,57, | 2952,58, | 2952,59, | 2952,60, | 2952,61, | 2952,62, | 2952,63, | 2952,64, | 2952,65, | 2952,66, | 2952,67, | 2952,68, | 2952,69, | 2952,70, | 2952,71, | 2952,72, | 2952,73, | 2952,74, | 2952,75, | 2952,76, | 2952,77, | 2952,78, | 2952,79, | 2952,80, | 2952,81, | 2952,82, | 2952,83, | 2952,84, | 2952,85, | 2953,1, | 2953,2, | 2953,3, | 2953,4, | 2953,5, | 2953,6, | 2953,7, | 2953,8, | 2953,9, | 2953,10, | 2953,11, | 2953,12, | 2953,13, | 2953,14, | 2953,15, | 2953,16, | 2953,17, | 2953,18, | 2953,19, | 2953,20, | 2953,21, | 2953,22, | 2953,23, | 2953,24, | 2953,25, | 2953,26, | 2953,27, | 2953,28, | 2953,29, | 2953,30, | 2953,31, | 2953,32, | 2953,33, | 2953,34, | 2953,35, | 2953,36, | 2953,37, | 2953,38, | 2953,39, | 2953,40, | 2953,41, | 2953,42, | 2953,43, | 2953,44, | 2953,45, | 2953,46, | 2953,47, | 2953,48, | 2953,49, | 2953,50, | 2953,51, | 2953,52, | 2953,53, | 2953,54, | 2953,55, | 2953,56, | 2953,57, | 2953,58, | 2953,59, | 2953,60, | 2953,61, | 2953,62, | 2953,63, | 2953,64, | 2953,65, | 2953,66, | 2953,67, | 2953,68, | 2953,69, | 2953,70, | 2953,71, | 2953,72, | 2953,73, | 2953,74, | 2953,75, | 2953,76, | 2953,77, | 2953,78, | 2953,79, | 2953,80, | 2953,81, | 2953,82, | 2953,83, | 2953,84, | 2953,85, | 2954,1, | 2954,2, | 2954,3, | 2954,4, | 2954,5, | 2954,6, | 2954,7, | 2954,8, | 2954,9, | 2954,10, | 2954,11, | 2954,12, | 2954,13, | 2954,14, | 2954,15, | 2954,16, | 2954,17, | 2954,18, | 2954,19, | 2954,20, | 2954,21, | 2954,22, | 2954,23, | 2954,24, | 2954,25, | 2954,26, | 2954,27, | 2954,28, | 2954,29, | 2954,30, | 2954,31, | 2954,32, | 2954,33, | 2954,34, | 2954,35, | 2954,36, | 2954,37, | 2954,38, | 2954,39, | 2954,40, | 2954,41, | 2954,42, | 2954,43, | 2954,44, | 2954,45, | 2954,46, | 2954,47, | 2954,48, | 2954,49, | 2954,50, | 2954,51, | 2954,52, | 2954,53, | 2954,54, | 2954,55, | 2954,56, | 2954,57, | 2954,58, | 2954,59, | 2954,60, | 2954,61, | 2954,62, | 2954,63, | 2954,64, | 2954,65, | 2954,66, | 2954,67, | 2954,68, | 2954,69, | 2954,70, | 2954,71, | 2954,72, | 2954,73, | 2954,74, | 2954,75, | 2954,76, | 2954,77, | 2954,78, | 2954,79, | 2954,80, | 2954,81, | 2954,82, | 2954,83, | 2954,84, | 2954,85, | 2955,1, | 2955,2, | 2955,3, | 2955,4, | 2955,5, | 2955,6, | 2955,7, | 2955,8, | 2955,9, | 2955,10, | 2955,11, | 2955,12, | 2955,13, | 2955,14, | 2955,15, | 2955,16, | 2955,17, | 2955,18, | 2955,19, | 2955,20, | 2955,21, | 2955,22, | 2955,23, | 2955,24, | 2955,25, | 2955,26, | 2955,27, | 2955,28, | 2955,29, | 2955,30, | 2955,31, | 2955,32, | 2955,33, | 2955,34, | 2955,35, | 2955,36, | 2955,37, | 2955,38, | 2955,39, | 2955,40, | 2955,41, | 2955,42, | 2955,43, | 2955,44, | 2955,45, | 2955,46, | 2955,47, | 2955,48, | 2955,49, | 2955,50, | 2955,51, | 2955,52, | 2955,53, | 2955,54, | 2955,55, | 2955,56, | 2955,57, | 2955,58, | 2955,59, | 2955,60, | 2955,61, | 2955,62, | 2955,63, | 2955,64, | 2955,65, | 2955,66, | 2955,67, | 2955,68, | 2955,69, | 2955,70, | 2955,71, | 2955,72, | 2955,73, | 2955,74, | 2955,75, | 2955,76, | 2955,77, | 2955,78, | 2955,79, | 2955,80, | 2955,81, | 2955,82, | 2955,83, | 2955,84, | 2955,85, | 2956,1, | 2956,2, | 2956,3, | 2956,4, | 2956,5, | 2956,6, | 2956,7, | 2956,8, | 2956,9, | 2956,10, | 2956,11, | 2956,12, | 2956,13, | 2956,14, | 2956,15, | 2956,16, | 2956,17, | 2956,18, | 2956,19, | 2956,20, | 2956,21, | 2956,22, | 2956,23, | 2956,24, | 2956,25, | 2956,26, | 2956,27, | 2956,28, | 2956,29, | 2956,30, | 2956,31, | 2956,32, | 2956,33, | 2956,34, | 2956,35, | 2956,36, | 2956,37, | 2956,38, | 2956,39, | 2956,40, | 2956,41, | 2956,42, | 2956,43, | 2956,44, | 2956,45, | 2956,46, | 2956,47, | 2956,48, | 2956,49, | 2956,50, | 2956,51, | 2956,52, | 2956,53, | 2956,54, | 2956,55, | 2956,56, | 2956,57, | 2956,58, | 2956,59, | 2956,60, | 2956,61, | 2956,62, | 2956,63, | 2956,64, | 2956,65, | 2956,66, | 2956,67, | 2956,68, | 2956,69, | 2956,70, | 2956,71, | 2956,72, | 2956,73, | 2956,74, | 2956,75, | 2956,76, | 2956,77, | 2956,78, | 2956,79, | 2956,80, | 2956,81, | 2956,82, | 2956,83, | 2956,84, | 2956,85, | 2957,1, | 2957,2, | 2957,3, | 2957,4, | 2957,5, | 2957,6, | 2957,7, | 2957,8, | 2957,9, | 2957,10, | 2957,11, | 2957,12, | 2957,13, | 2957,14, | 2957,15, | 2957,16, | 2957,17, | 2957,18, | 2957,19, | 2957,20, | 2957,21, | 2957,22, | 2957,23, | 2957,24, | 2957,25, | 2957,26, | 2957,27, | 2957,28, | 2957,29, | 2957,30, | 2957,31, | 2957,32, | 2957,33, | 2957,34, | 2957,35, | 2957,36, | 2957,37, | 2957,38, | 2957,39, | 2957,40, | 2957,41, | 2957,42, | 2957,43, | 2957,44, | 2957,45, | 2957,46, | 2957,47, | 2957,48, | 2957,49, | 2957,50, | 2957,51, | 2957,52, | 2957,53, | 2957,54, | 2957,55, | 2957,56, | 2957,57, | 2957,58, | 2957,59, | 2957,60, | 2957,61, | 2957,62, | 2957,63, | 2957,64, | 2957,65, | 2957,66, | 2957,67, | 2957,68, | 2957,69, | 2957,70, | 2957,71, | 2957,72, | 2957,73, | 2957,74, | 2957,75, | 2957,76, | 2957,77, | 2957,78, | 2957,79, | 2957,80, | 2957,81, | 2957,82, | 2957,83, | 2957,84, | 2957,85, | 2958,1, | 2958,2, | 2958,3, | 2958,4, | 2958,5, | 2958,6, | 2958,7, | 2958,8, | 2958,9, | 2958,10, | 2958,11, | 2958,12, | 2958,13, | 2958,14, | 2958,15, | 2958,16, | 2958,17, | 2958,18, | 2958,19, | 2958,20, | 2958,21, | 2958,22, | 2958,23, | 2958,24, | 2958,25, | 2958,26, | 2958,27, | 2958,28, | 2958,29, | 2958,30, | 2958,31, | 2958,32, | 2958,33, | 2958,34, | 2958,35, | 2958,36, | 2958,37, | 2958,38, | 2958,39, | 2958,40, | 2958,41, | 2958,42, | 2958,43, | 2958,44, | 2958,45, | 2958,46, | 2958,47, | 2958,48, | 2958,49, | 2958,50, | 2958,51, | 2958,52, | 2958,53, | 2958,54, | 2958,55, | 2958,56, | 2958,57, | 2958,58, | 2958,59, | 2958,60, | 2958,61, | 2958,62, | 2958,63, | 2958,64, | 2958,65, | 2958,66, | 2958,67, | 2958,68, | 2958,69, | 2958,70, | 2958,71, | 2958,72, | 2958,73, | 2958,74, | 2958,75, | 2958,76, | 2958,77, | 2958,78, | 2958,79, | 2958,80, | 2958,81, | 2958,82, | 2958,83, | 2958,84, | 2958,85, | 2959,1, | 2959,2, | 2959,3, | 2959,4, | 2959,5, | 2959,6, | 2959,7, | 2959,8, | 2959,9, | 2959,10, | 2959,11, | 2959,12, | 2959,13, | 2959,14, | 2959,15, | 2959,16, | 2959,17, | 2959,18, | 2959,19, | 2959,20, | 2959,21, | 2959,22, | 2959,23, | 2959,24, | 2959,25, | 2959,26, | 2959,27, | 2959,28, | 2959,29, | 2959,30, | 2959,31, | 2959,32, | 2959,33, | 2959,34, | 2959,35, | 2959,36, | 2959,37, | 2959,38, | 2959,39, | 2959,40, | 2959,41, | 2959,42, | 2959,43, | 2959,44, | 2959,45, | 2959,46, | 2959,47, | 2959,48, | 2959,49, | 2959,50, | 2959,51, | 2959,52, | 2959,53, | 2959,54, | 2959,55, | 2959,56, | 2959,57, | 2959,58, | 2959,59, | 2959,60, | 2959,61, | 2959,62, | 2959,63, | 2959,64, | 2959,65, | 2959,66, | 2959,67, | 2959,68, | 2959,69, | 2959,70, | 2959,71, | 2959,72, | 2959,73, | 2959,74, | 2959,75, | 2959,76, | 2959,77, | 2959,78, | 2959,79, | 2959,80, | 2959,81, | 2959,82, | 2959,83, | 2959,84, | 2959,85, | 2960,1, | 2960,2, | 2960,3, | 2960,4, | 2960,5, | 2960,6, | 2960,7, | 2960,8, | 2960,9, | 2960,10, | 2960,11, | 2960,12, | 2960,13, | 2960,14, | 2960,15, | 2960,16, | 2960,17, | 2960,18, | 2960,19, | 2960,20, | 2960,21, | 2960,22, | 2960,23, | 2960,24, | 2960,25, | 2960,26, | 2960,27, | 2960,28, | 2960,29, | 2960,30, | 2960,31, | 2960,32, | 2960,33, | 2960,34, | 2960,35, | 2960,36, | 2960,37, | 2960,38, | 2960,39, | 2960,40, | 2960,41, | 2960,42, | 2960,43, | 2960,44, | 2960,45, | 2960,46, | 2960,47, | 2960,48, | 2960,49, | 2960,50, | 2960,51, | 2960,52, | 2960,53, | 2960,54, | 2960,55, | 2960,56, | 2960,57, | 2960,58, | 2960,59, | 2960,60, | 2960,61, | 2960,62, | 2960,63, | 2960,64, | 2960,65, | 2960,66, | 2960,67, | 2960,68, | 2960,69, | 2960,70, | 2960,71, | 2960,72, | 2960,73, | 2960,74, | 2960,75, | 2960,76, | 2960,77, | 2960,78, | 2960,79, | 2960,80, | 2960,81, | 2960,82, | 2960,83, | 2960,84, | 2960,85, | 2961,1, | 2961,2, | 2961,3, | 2961,4, | 2961,5, | 2961,6, | 2961,7, | 2961,8, | 2961,9, | 2961,10, | 2961,11, | 2961,12, | 2961,13, | 2961,14, | 2961,15, | 2961,16, | 2961,17, | 2961,18, | 2961,19, | 2961,20, | 2961,21, | 2961,22, | 2961,23, | 2961,24, | 2961,25, | 2961,26, | 2961,27, | 2961,28, | 2961,29, | 2961,30, | 2961,31, | 2961,32, | 2961,33, | 2961,34, | 2961,35, | 2961,36, | 2961,37, | 2961,38, | 2961,39, | 2961,40, | 2961,41, | 2961,42, | 2961,43, | 2961,44, | 2961,45, | 2961,46, | 2961,47, | 2961,48, | 2961,49, | 2961,50, | 2961,51, | 2961,52, | 2961,53, | 2961,54, | 2961,55, | 2961,56, | 2961,57, | 2961,58, | 2961,59, | 2961,60, | 2961,61, | 2961,62, | 2961,63, | 2961,64, | 2961,65, | 2961,66, | 2961,67, | 2961,68, | 2961,69, | 2961,70, | 2961,71, | 2961,72, | 2961,73, | 2961,74, | 2961,75, | 2961,76, | 2961,77, | 2961,78, | 2961,79, | 2961,80, | 2961,81, | 2961,82, | 2961,83, | 2961,84, | 2961,85, | 2962,1, | 2962,2, | 2962,3, | 2962,4, | 2962,5, | 2962,6, | 2962,7, | 2962,8, | 2962,9, | 2962,10, | 2962,11, | 2962,12, | 2962,13, | 2962,14, | 2962,15, | 2962,16, | 2962,17, | 2962,18, | 2962,19, | 2962,20, | 2962,21, | 2962,22, | 2962,23, | 2962,24, | 2962,25, | 2962,26, | 2962,27, | 2962,28, | 2962,29, | 2962,30, | 2962,31, | 2962,32, | 2962,33, | 2962,34, | 2962,35, | 2962,36, | 2962,37, | 2962,38, | 2962,39, | 2962,40, | 2962,41, | 2962,42, | 2962,43, | 2962,44, | 2962,45, | 2962,46, | 2962,47, | 2962,48, | 2962,49, | 2962,50, | 2962,51, | 2962,52, | 2962,53, | 2962,54, | 2962,55, | 2962,56, | 2962,57, | 2962,58, | 2962,59, | 2962,60, | 2962,61, | 2962,62, | 2962,63, | 2962,64, | 2962,65, | 2962,66, | 2962,67, | 2962,68, | 2962,69, | 2962,70, | 2962,71, | 2962,72, | 2962,73, | 2962,74, | 2962,75, | 2962,76, | 2962,77, | 2962,78, | 2962,79, | 2962,80, | 2962,81, | 2962,82, | 2962,83, | 2962,84, | 2962,85, | 2963,1, | 2963,2, | 2963,3, | 2963,4, | 2963,5, | 2963,6, | 2963,7, | 2963,8, | 2963,9, | 2963,10, | 2963,11, | 2963,12, | 2963,13, | 2963,14, | 2963,15, | 2963,16, | 2963,17, | 2963,18, | 2963,19, | 2963,20, | 2963,21, | 2963,22, | 2963,23, | 2963,24, | 2963,25, | 2963,26, | 2963,27, | 2963,28, | 2963,29, | 2963,30, | 2963,31, | 2963,32, | 2963,33, | 2963,34, | 2963,35, | 2963,36, | 2963,37, | 2963,38, | 2963,39, | 2963,40, | 2963,41, | 2963,42, | 2963,43, | 2963,44, | 2963,45, | 2963,46, | 2963,47, | 2963,48, | 2963,49, | 2963,50, | 2963,51, | 2963,52, | 2963,53, | 2963,54, | 2963,55, | 2963,56, | 2963,57, | 2963,58, | 2963,59, | 2963,60, | 2963,61, | 2963,62, | 2963,63, | 2963,64, | 2963,65, | 2963,66, | 2963,67, | 2963,68, | 2963,69, | 2963,70, | 2963,71, | 2963,72, | 2963,73, | 2963,74, | 2963,75, | 2963,76, | 2963,77, | 2963,78, | 2963,79, | 2963,80, | 2963,81, | 2963,82, | 2963,83, | 2963,84, | 2963,85, | 2964,1, | 2964,2, | 2964,3, | 2964,4, | 2964,5, | 2964,6, | 2964,7, | 2964,8, | 2964,9, | 2964,10, | 2964,11, | 2964,12, | 2964,13, | 2964,14, | 2964,15, | 2964,16, | 2964,17, | 2964,18, | 2964,19, | 2964,20, | 2964,21, | 2964,22, | 2964,23, | 2964,24, | 2964,25, | 2964,26, | 2964,27, | 2964,28, | 2964,29, | 2964,30, | 2964,31, | 2964,32, | 2964,33, | 2964,34, | 2964,35, | 2964,36, | 2964,37, | 2964,38, | 2964,39, | 2964,40, | 2964,41, | 2964,42, | 2964,43, | 2964,44, | 2964,45, | 2964,46, | 2964,47, | 2964,48, | 2964,49, | 2964,50, | 2964,51, | 2964,52, | 2964,53, | 2964,54, | 2964,55, | 2964,56, | 2964,57, | 2964,58, | 2964,59, | 2964,60, | 2964,61, | 2964,62, | 2964,63, | 2964,64, | 2964,65, | 2964,66, | 2964,67, | 2964,68, | 2964,69, | 2964,70, | 2964,71, | 2964,72, | 2964,73, | 2964,74, | 2964,75, | 2964,76, | 2964,77, | 2964,78, | 2964,79, | 2964,80, | 2964,81, | 2964,82, | 2964,83, | 2964,84, | 2964,85, | 2965,1, | 2965,2, | 2965,3, | 2965,4, | 2965,5, | 2965,6, | 2965,7, | 2965,8, | 2965,9, | 2965,10, | 2965,11, | 2965,12, | 2965,13, | 2965,14, | 2965,15, | 2965,16, | 2965,17, | 2965,18, | 2965,19, | 2965,20, | 2965,21, | 2965,22, | 2965,23, | 2965,24, | 2965,25, | 2965,26, | 2965,27, | 2965,28, | 2965,29, | 2965,30, | 2965,31, | 2965,32, | 2965,33, | 2965,34, | 2965,35, | 2965,36, | 2965,37, | 2965,38, | 2965,39, | 2965,40, | 2965,41, | 2965,42, | 2965,43, | 2965,44, | 2965,45, | 2965,46, | 2965,47, | 2965,48, | 2965,49, | 2965,50, | 2965,51, | 2965,52, | 2965,53, | 2965,54, | 2965,55, | 2965,56, | 2965,57, | 2965,58, | 2965,59, | 2965,60, | 2965,61, | 2965,62, | 2965,63, | 2965,64, | 2965,65, | 2965,66, | 2965,67, | 2965,68, | 2965,69, | 2965,70, | 2965,71, | 2965,72, | 2965,73, | 2965,74, | 2965,75, | 2965,76, | 2965,77, | 2965,78, | 2965,79, | 2965,80, | 2965,81, | 2965,82, | 2965,83, | 2965,84, | 2965,85, | 2966,1, | 2966,2, | 2966,3, | 2966,4, | 2966,5, | 2966,6, | 2966,7, | 2966,8, | 2966,9, | 2966,10, | 2966,11, | 2966,12, | 2966,13, | 2966,14, | 2966,15, | 2966,16, | 2966,17, | 2966,18, | 2966,19, | 2966,20, | 2966,21, | 2966,22, | 2966,23, | 2966,24, | 2966,25, | 2966,26, | 2966,27, | 2966,28, | 2966,29, | 2966,30, | 2966,31, | 2966,32, | 2966,33, | 2966,34, | 2966,35, | 2966,36, | 2966,37, | 2966,38, | 2966,39, | 2966,40, | 2966,41, | 2966,42, | 2966,43, | 2966,44, | 2966,45, | 2966,46, | 2966,47, | 2966,48, | 2966,49, | 2966,50, | 2966,51, | 2966,52, | 2966,53, | 2966,54, | 2966,55, | 2966,56, | 2966,57, | 2966,58, | 2966,59, | 2966,60, | 2966,61, | 2966,62, | 2966,63, | 2966,64, | 2966,65, | 2966,66, | 2966,67, | 2966,68, | 2966,69, | 2966,70, | 2966,71, | 2966,72, | 2966,73, | 2966,74, | 2966,75, | 2966,76, | 2966,77, | 2966,78, | 2966,79, | 2966,80, | 2966,81, | 2966,82, | 2966,83, | 2966,84, | 2966,85, | 2967,1, | 2967,2, | 2967,3, | 2967,4, | 2967,5, | 2967,6, | 2967,7, | 2967,8, | 2967,9, | 2967,10, | 2967,11, | 2967,12, | 2967,13, | 2967,14, | 2967,15, | 2967,16, | 2967,17, | 2967,18, | 2967,19, | 2967,20, | 2967,21, | 2967,22, | 2967,23, | 2967,24, | 2967,25, | 2967,26, | 2967,27, | 2967,28, | 2967,29, | 2967,30, | 2967,31, | 2967,32, | 2967,33, | 2967,34, | 2967,35, | 2967,36, | 2967,37, | 2967,38, | 2967,39, | 2967,40, | 2967,41, | 2967,42, | 2967,43, | 2967,44, | 2967,45, | 2967,46, | 2967,47, | 2967,48, | 2967,49, | 2967,50, | 2967,51, | 2967,52, | 2967,53, | 2967,54, | 2967,55, | 2967,56, | 2967,57, | 2967,58, | 2967,59, | 2967,60, | 2967,61, | 2967,62, | 2967,63, | 2967,64, | 2967,65, | 2967,66, | 2967,67, | 2967,68, | 2967,69, | 2967,70, | 2967,71, | 2967,72, | 2967,73, | 2967,74, | 2967,75, | 2967,76, | 2967,77, | 2967,78, | 2967,79, | 2967,80, | 2967,81, | 2967,82, | 2967,83, | 2967,84, | 2967,85, | 2968,1, | 2968,2, | 2968,3, | 2968,4, | 2968,5, | 2968,6, | 2968,7, | 2968,8, | 2968,9, | 2968,10, | 2968,11, | 2968,12, | 2968,13, | 2968,14, | 2968,15, | 2968,16, | 2968,17, | 2968,18, | 2968,19, | 2968,20, | 2968,21, | 2968,22, | 2968,23, | 2968,24, | 2968,25, | 2968,26, | 2968,27, | 2968,28, | 2968,29, | 2968,30, | 2968,31, | 2968,32, | 2968,33, | 2968,34, | 2968,35, | 2968,36, | 2968,37, | 2968,38, | 2968,39, | 2968,40, | 2968,41, | 2968,42, | 2968,43, | 2968,44, | 2968,45, | 2968,46, | 2968,47, | 2968,48, | 2968,49, | 2968,50, | 2968,51, | 2968,52, | 2968,53, | 2968,54, | 2968,55, | 2968,56, | 2968,57, | 2968,58, | 2968,59, | 2968,60, | 2968,61, | 2968,62, | 2968,63, | 2968,64, | 2968,65, | 2968,66, | 2968,67, | 2968,68, | 2968,69, | 2968,70, | 2968,71, | 2968,72, | 2968,73, | 2968,74, | 2968,75, | 2968,76, | 2968,77, | 2968,78, | 2968,79, | 2968,80, | 2968,81, | 2968,82, | 2968,83, | 2968,84, | 2968,85, | 2969,1, | 2969,2, | 2969,3, | 2969,4, | 2969,5, | 2969,6, | 2969,7, | 2969,8, | 2969,9, | 2969,10, | 2969,11, | 2969,12, | 2969,13, | 2969,14, | 2969,15, | 2969,16, | 2969,17, | 2969,18, | 2969,19, | 2969,20, | 2969,21, | 2969,22, | 2969,23, | 2969,24, | 2969,25, | 2969,26, | 2969,27, | 2969,28, | 2969,29, | 2969,30, | 2969,31, | 2969,32, | 2969,33, | 2969,34, | 2969,35, | 2969,36, | 2969,37, | 2969,38, | 2969,39, | 2969,40, | 2969,41, | 2969,42, | 2969,43, | 2969,44, | 2969,45, | 2969,46, | 2969,47, | 2969,48, | 2969,49, | 2969,50, | 2969,51, | 2969,52, | 2969,53, | 2969,54, | 2969,55, | 2969,56, | 2969,57, | 2969,58, | 2969,59, | 2969,60, | 2969,61, | 2969,62, | 2969,63, | 2969,64, | 2969,65, | 2969,66, | 2969,67, | 2969,68, | 2969,69, | 2969,70, | 2969,71, | 2969,72, | 2969,73, | 2969,74, | 2969,75, | 2969,76, | 2969,77, | 2969,78, | 2969,79, | 2969,80, | 2969,81, | 2969,82, | 2969,83, | 2969,84, | 2969,85, | 2970,1, | 2970,2, | 2970,3, | 2970,4, | 2970,5, | 2970,6, | 2970,7, | 2970,8, | 2970,9, | 2970,10, | 2970,11, | 2970,12, | 2970,13, | 2970,14, | 2970,15, | 2970,16, | 2970,17, | 2970,18, | 2970,19, | 2970,20, | 2970,21, | 2970,22, | 2970,23, | 2970,24, | 2970,25, | 2970,26, | 2970,27, | 2970,28, | 2970,29, | 2970,30, | 2970,31, | 2970,32, | 2970,33, | 2970,34, | 2970,35, | 2970,36, | 2970,37, | 2970,38, | 2970,39, | 2970,40, | 2970,41, | 2970,42, | 2970,43, | 2970,44, | 2970,45, | 2970,46, | 2970,47, | 2970,48, | 2970,49, | 2970,50, | 2970,51, | 2970,52, | 2970,53, | 2970,54, | 2970,55, | 2970,56, | 2970,57, | 2970,58, | 2970,59, | 2970,60, | 2970,61, | 2970,62, | 2970,63, | 2970,64, | 2970,65, | 2970,66, | 2970,67, | 2970,68, | 2970,69, | 2970,70, | 2970,71, | 2970,72, | 2970,73, | 2970,74, | 2970,75, | 2970,76, | 2970,77, | 2970,78, | 2970,79, | 2970,80, | 2970,81, | 2970,82, | 2970,83, | 2970,84, | 2970,85, | 2971,1, | 2971,2, | 2971,3, | 2971,4, | 2971,5, | 2971,6, | 2971,7, | 2971,8, | 2971,9, | 2971,10, | 2971,11, | 2971,12, | 2971,13, | 2971,14, | 2971,15, | 2971,16, | 2971,17, | 2971,18, | 2971,19, | 2971,20, | 2971,21, | 2971,22, | 2971,23, | 2971,24, | 2971,25, | 2971,26, | 2971,27, | 2971,28, | 2971,29, | 2971,30, | 2971,31, | 2971,32, | 2971,33, | 2971,34, | 2971,35, | 2971,36, | 2971,37, | 2971,38, | 2971,39, | 2971,40, | 2971,41, | 2971,42, | 2971,43, | 2971,44, | 2971,45, | 2971,46, | 2971,47, | 2971,48, | 2971,49, | 2971,50, | 2971,51, | 2971,52, | 2971,53, | 2971,54, | 2971,55, | 2971,56, | 2971,57, | 2971,58, | 2971,59, | 2971,60, | 2971,61, | 2971,62, | 2971,63, | 2971,64, | 2971,65, | 2971,66, | 2971,67, | 2971,68, | 2971,69, | 2971,70, | 2971,71, | 2971,72, | 2971,73, | 2971,74, | 2971,75, | 2971,76, | 2971,77, | 2971,78, | 2971,79, | 2971,80, | 2971,81, | 2971,82, | 2971,83, | 2971,84, | 2971,85, | 2972,1, | 2972,2, | 2972,3, | 2972,4, | 2972,5, | 2972,6, | 2972,7, | 2972,8, | 2972,9, | 2972,10, | 2972,11, | 2972,12, | 2972,13, | 2972,14, | 2972,15, | 2972,16, | 2972,17, | 2972,18, | 2972,19, | 2972,20, | 2972,21, | 2972,22, | 2972,23, | 2972,24, | 2972,25, | 2972,26, | 2972,27, | 2972,28, | 2972,29, | 2972,30, | 2972,31, | 2972,32, | 2972,33, | 2972,34, | 2972,35, | 2972,36, | 2972,37, | 2972,38, | 2972,39, | 2972,40, | 2972,41, | 2972,42, | 2972,43, | 2972,44, | 2972,45, | 2972,46, | 2972,47, | 2972,48, | 2972,49, | 2972,50, | 2972,51, | 2972,52, | 2972,53, | 2972,54, | 2972,55, | 2972,56, | 2972,57, | 2972,58, | 2972,59, | 2972,60, | 2972,61, | 2972,62, | 2972,63, | 2972,64, | 2972,65, | 2972,66, | 2972,67, | 2972,68, | 2972,69, | 2972,70, | 2972,71, | 2972,72, | 2972,73, | 2972,74, | 2972,75, | 2972,76, | 2972,77, | 2972,78, | 2972,79, | 2972,80, | 2972,81, | 2972,82, | 2972,83, | 2972,84, | 2972,85, | 2973,1, | 2973,2, | 2973,3, | 2973,4, | 2973,5, | 2973,6, | 2973,7, | 2973,8, | 2973,9, | 2973,10, | 2973,11, | 2973,12, | 2973,13, | 2973,14, | 2973,15, | 2973,16, | 2973,17, | 2973,18, | 2973,19, | 2973,20, | 2973,21, | 2973,22, | 2973,23, | 2973,24, | 2973,25, | 2973,26, | 2973,27, | 2973,28, | 2973,29, | 2973,30, | 2973,31, | 2973,32, | 2973,33, | 2973,34, | 2973,35, | 2973,36, | 2973,37, | 2973,38, | 2973,39, | 2973,40, | 2973,41, | 2973,42, | 2973,43, | 2973,44, | 2973,45, | 2973,46, | 2973,47, | 2973,48, | 2973,49, | 2973,50, | 2973,51, | 2973,52, | 2973,53, | 2973,54, | 2973,55, | 2973,56, | 2973,57, | 2973,58, | 2973,59, | 2973,60, | 2973,61, | 2973,62, | 2973,63, | 2973,64, | 2973,65, | 2973,66, | 2973,67, | 2973,68, | 2973,69, | 2973,70, | 2973,71, | 2973,72, | 2973,73, | 2973,74, | 2973,75, | 2973,76, | 2973,77, | 2973,78, | 2973,79, | 2973,80, | 2973,81, | 2973,82, | 2973,83, | 2973,84, | 2973,85, | 2974,1, | 2974,2, | 2974,3, | 2974,4, | 2974,5, | 2974,6, | 2974,7, | 2974,8, | 2974,9, | 2974,10, | 2974,11, | 2974,12, | 2974,13, | 2974,14, | 2974,15, | 2974,16, | 2974,17, | 2974,18, | 2974,19, | 2974,20, | 2974,21, | 2974,22, | 2974,23, | 2974,24, | 2974,25, | 2974,26, | 2974,27, | 2974,28, | 2974,29, | 2974,30, | 2974,31, | 2974,32, | 2974,33, | 2974,34, | 2974,35, | 2974,36, | 2974,37, | 2974,38, | 2974,39, | 2974,40, | 2974,41, | 2974,42, | 2974,43, | 2974,44, | 2974,45, | 2974,46, | 2974,47, | 2974,48, | 2974,49, | 2974,50, | 2974,51, | 2974,52, | 2974,53, | 2974,54, | 2974,55, | 2974,56, | 2974,57, | 2974,58, | 2974,59, | 2974,60, | 2974,61, | 2974,62, | 2974,63, | 2974,64, | 2974,65, | 2974,66, | 2974,67, | 2974,68, | 2974,69, | 2974,70, | 2974,71, | 2974,72, | 2974,73, | 2974,74, | 2974,75, | 2974,76, | 2974,77, | 2974,78, | 2974,79, | 2974,80, | 2974,81, | 2974,82, | 2974,83, | 2974,84, | 2974,85, | 2975,1, | 2975,2, | 2975,3, | 2975,4, | 2975,5, | 2975,6, | 2975,7, | 2975,8, | 2975,9, | 2975,10, | 2975,11, | 2975,12, | 2975,13, | 2975,14, | 2975,15, | 2975,16, | 2975,17, | 2975,18, | 2975,19, | 2975,20, | 2975,21, | 2975,22, | 2975,23, | 2975,24, | 2975,25, | 2975,26, | 2975,27, | 2975,28, | 2975,29, | 2975,30, | 2975,31, | 2975,32, | 2975,33, | 2975,34, | 2975,35, | 2975,36, | 2975,37, | 2975,38, | 2975,39, | 2975,40, | 2975,41, | 2975,42, | 2975,43, | 2975,44, | 2975,45, | 2975,46, | 2975,47, | 2975,48, | 2975,49, | 2975,50, | 2975,51, | 2975,52, | 2975,53, | 2975,54, | 2975,55, | 2975,56, | 2975,57, | 2975,58, | 2975,59, | 2975,60, | 2975,61, | 2975,62, | 2975,63, | 2975,64, | 2975,65, | 2975,66, | 2975,67, | 2975,68, | 2975,69, | 2975,70, | 2975,71, | 2975,72, | 2975,73, | 2975,74, | 2975,75, | 2975,76, | 2975,77, | 2975,78, | 2975,79, | 2975,80, | 2975,81, | 2975,82, | 2975,83, | 2975,84, | 2975,85, | 2976,1, | 2976,2, | 2976,3, | 2976,4, | 2976,5, | 2976,6, | 2976,7, | 2976,8, | 2976,9, | 2976,10, | 2976,11, | 2976,12, | 2976,13, | 2976,14, | 2976,15, | 2976,16, | 2976,17, | 2976,18, | 2976,19, | 2976,20, | 2976,21, | 2976,22, | 2976,23, | 2976,24, | 2976,25, | 2976,26, | 2976,27, | 2976,28, | 2976,29, | 2976,30, | 2976,31, | 2976,32, | 2976,33, | 2976,34, | 2976,35, | 2976,36, | 2976,37, | 2976,38, | 2976,39, | 2976,40, | 2976,41, | 2976,42, | 2976,43, | 2976,44, | 2976,45, | 2976,46, | 2976,47, | 2976,48, | 2976,49, | 2976,50, | 2976,51, | 2976,52, | 2976,53, | 2976,54, | 2976,55, | 2976,56, | 2976,57, | 2976,58, | 2976,59, | 2976,60, | 2976,61, | 2976,62, | 2976,63, | 2976,64, | 2976,65, | 2976,66, | 2976,67, | 2976,68, | 2976,69, | 2976,70, | 2976,71, | 2976,72, | 2976,73, | 2976,74, | 2976,75, | 2976,76, | 2976,77, | 2976,78, | 2976,79, | 2976,80, | 2976,81, | 2976,82, | 2976,83, | 2976,84, | 2976,85, | 2977,1, | 2977,2, | 2977,3, | 2977,4, | 2977,5, | 2977,6, | 2977,7, | 2977,8, | 2977,9, | 2977,10, | 2977,11, | 2977,12, | 2977,13, | 2977,14, | 2977,15, | 2977,16, | 2977,17, | 2977,18, | 2977,19, | 2977,20, | 2977,21, | 2977,22, | 2977,23, | 2977,24, | 2977,25, | 2977,26, | 2977,27, | 2977,28, | 2977,29, | 2977,30, | 2977,31, | 2977,32, | 2977,33, | 2977,34, | 2977,35, | 2977,36, | 2977,37, | 2977,38, | 2977,39, | 2977,40, | 2977,41, | 2977,42, | 2977,43, | 2977,44, | 2977,45, | 2977,46, | 2977,47, | 2977,48, | 2977,49, | 2977,50, | 2977,51, | 2977,52, | 2977,53, | 2977,54, | 2977,55, | 2977,56, | 2977,57, | 2977,58, | 2977,59, | 2977,60, | 2977,61, | 2977,62, | 2977,63, | 2977,64, | 2977,65, | 2977,66, | 2977,67, | 2977,68, | 2977,69, | 2977,70, | 2977,71, | 2977,72, | 2977,73, | 2977,74, | 2977,75, | 2977,76, | 2977,77, | 2977,78, | 2977,79, | 2977,80, | 2977,81, | 2977,82, | 2977,83, | 2977,84, | 2977,85, | 2978,1, | 2978,2, | 2978,3, | 2978,4, | 2978,5, | 2978,6, | 2978,7, | 2978,8, | 2978,9, | 2978,10, | 2978,11, | 2978,12, | 2978,13, | 2978,14, | 2978,15, | 2978,16, | 2978,17, | 2978,18, | 2978,19, | 2978,20, | 2978,21, | 2978,22, | 2978,23, | 2978,24, | 2978,25, | 2978,26, | 2978,27, | 2978,28, | 2978,29, | 2978,30, | 2978,31, | 2978,32, | 2978,33, | 2978,34, | 2978,35, | 2978,36, | 2978,37, | 2978,38, | 2978,39, | 2978,40, | 2978,41, | 2978,42, | 2978,43, | 2978,44, | 2978,45, | 2978,46, | 2978,47, | 2978,48, | 2978,49, | 2978,50, | 2978,51, | 2978,52, | 2978,53, | 2978,54, | 2978,55, | 2978,56, | 2978,57, | 2978,58, | 2978,59, | 2978,60, | 2978,61, | 2978,62, | 2978,63, | 2978,64, | 2978,65, | 2978,66, | 2978,67, | 2978,68, | 2978,69, | 2978,70, | 2978,71, | 2978,72, | 2978,73, | 2978,74, | 2978,75, | 2978,76, | 2978,77, | 2978,78, | 2978,79, | 2978,80, | 2978,81, | 2978,82, | 2978,83, | 2978,84, | 2978,85, | 2979,1, | 2979,2, | 2979,3, | 2979,4, | 2979,5, | 2979,6, | 2979,7, | 2979,8, | 2979,9, | 2979,10, | 2979,11, | 2979,12, | 2979,13, | 2979,14, | 2979,15, | 2979,16, | 2979,17, | 2979,18, | 2979,19, | 2979,20, | 2979,21, | 2979,22, | 2979,23, | 2979,24, | 2979,25, | 2979,26, | 2979,27, | 2979,28, | 2979,29, | 2979,30, | 2979,31, | 2979,32, | 2979,33, | 2979,34, | 2979,35, | 2979,36, | 2979,37, | 2979,38, | 2979,39, | 2979,40, | 2979,41, | 2979,42, | 2979,43, | 2979,44, | 2979,45, | 2979,46, | 2979,47, | 2979,48, | 2979,49, | 2979,50, | 2979,51, | 2979,52, | 2979,53, | 2979,54, | 2979,55, | 2979,56, | 2979,57, | 2979,58, | 2979,59, | 2979,60, | 2979,61, | 2979,62, | 2979,63, | 2979,64, | 2979,65, | 2979,66, | 2979,67, | 2979,68, | 2979,69, | 2979,70, | 2979,71, | 2979,72, | 2979,73, | 2979,74, | 2979,75, | 2979,76, | 2979,77, | 2979,78, | 2979,79, | 2979,80, | 2979,81, | 2979,82, | 2979,83, | 2979,84, | 2979,85, | 2980,1, | 2980,2, | 2980,3, | 2980,4, | 2980,5, | 2980,6, | 2980,7, | 2980,8, | 2980,9, | 2980,10, | 2980,11, | 2980,12, | 2980,13, | 2980,14, | 2980,15, | 2980,16, | 2980,17, | 2980,18, | 2980,19, | 2980,20, | 2980,21, | 2980,22, | 2980,23, | 2980,24, | 2980,25, | 2980,26, | 2980,27, | 2980,28, | 2980,29, | 2980,30, | 2980,31, | 2980,32, | 2980,33, | 2980,34, | 2980,35, | 2980,36, | 2980,37, | 2980,38, | 2980,39, | 2980,40, | 2980,41, | 2980,42, | 2980,43, | 2980,44, | 2980,45, | 2980,46, | 2980,47, | 2980,48, | 2980,49, | 2980,50, | 2980,51, | 2980,52, | 2980,53, | 2980,54, | 2980,55, | 2980,56, | 2980,57, | 2980,58, | 2980,59, | 2980,60, | 2980,61, | 2980,62, | 2980,63, | 2980,64, | 2980,65, | 2980,66, | 2980,67, | 2980,68, | 2980,69, | 2980,70, | 2980,71, | 2980,72, | 2980,73, | 2980,74, | 2980,75, | 2980,76, | 2980,77, | 2980,78, | 2980,79, | 2980,80, | 2980,81, | 2980,82, | 2980,83, | 2980,84, | 2980,85, | 2981,1, | 2981,2, | 2981,3, | 2981,4, | 2981,5, | 2981,6, | 2981,7, | 2981,8, | 2981,9, | 2981,10, | 2981,11, | 2981,12, | 2981,13, | 2981,14, | 2981,15, | 2981,16, | 2981,17, | 2981,18, | 2981,19, | 2981,20, | 2981,21, | 2981,22, | 2981,23, | 2981,24, | 2981,25, | 2981,26, | 2981,27, | 2981,28, | 2981,29, | 2981,30, | 2981,31, | 2981,32, | 2981,33, | 2981,34, | 2981,35, | 2981,36, | 2981,37, | 2981,38, | 2981,39, | 2981,40, | 2981,41, | 2981,42, | 2981,43, | 2981,44, | 2981,45, | 2981,46, | 2981,47, | 2981,48, | 2981,49, | 2981,50, | 2981,51, | 2981,52, | 2981,53, | 2981,54, | 2981,55, | 2981,56, | 2981,57, | 2981,58, | 2981,59, | 2981,60, | 2981,61, | 2981,62, | 2981,63, | 2981,64, | 2981,65, | 2981,66, | 2981,67, | 2981,68, | 2981,69, | 2981,70, | 2981,71, | 2981,72, | 2981,73, | 2981,74, | 2981,75, | 2981,76, | 2981,77, | 2981,78, | 2981,79, | 2981,80, | 2981,81, | 2981,82, | 2981,83, | 2981,84, | 2981,85, | 2982,1, | 2982,2, | 2982,3, | 2982,4, | 2982,5, | 2982,6, | 2982,7, | 2982,8, | 2982,9, | 2982,10, | 2982,11, | 2982,12, | 2982,13, | 2982,14, | 2982,15, | 2982,16, | 2982,17, | 2982,18, | 2982,19, | 2982,20, | 2982,21, | 2982,22, | 2982,23, | 2982,24, | 2982,25, | 2982,26, | 2982,27, | 2982,28, | 2982,29, | 2982,30, | 2982,31, | 2982,32, | 2982,33, | 2982,34, | 2982,35, | 2982,36, | 2982,37, | 2982,38, | 2982,39, | 2982,40, | 2982,41, | 2982,42, | 2982,43, | 2982,44, | 2982,45, | 2982,46, | 2982,47, | 2982,48, | 2982,49, | 2982,50, | 2982,51, | 2982,52, | 2982,53, | 2982,54, | 2982,55, | 2982,56, | 2982,57, | 2982,58, | 2982,59, | 2982,60, | 2982,61, | 2982,62, | 2982,63, | 2982,64, | 2982,65, | 2982,66, | 2982,67, | 2982,68, | 2982,69, | 2982,70, | 2982,71, | 2982,72, | 2982,73, | 2982,74, | 2982,75, | 2982,76, | 2982,77, | 2982,78, | 2982,79, | 2982,80, | 2982,81, | 2982,82, | 2982,83, | 2982,84, | 2982,85, | 2983,1, | 2983,2, | 2983,3, | 2983,4, | 2983,5, | 2983,6, | 2983,7, | 2983,8, | 2983,9, | 2983,10, | 2983,11, | 2983,12, | 2983,13, | 2983,14, | 2983,15, | 2983,16, | 2983,17, | 2983,18, | 2983,19, | 2983,20, | 2983,21, | 2983,22, | 2983,23, | 2983,24, | 2983,25, | 2983,26, | 2983,27, | 2983,28, | 2983,29, | 2983,30, | 2983,31, | 2983,32, | 2983,33, | 2983,34, | 2983,35, | 2983,36, | 2983,37, | 2983,38, | 2983,39, | 2983,40, | 2983,41, | 2983,42, | 2983,43, | 2983,44, | 2983,45, | 2983,46, | 2983,47, | 2983,48, | 2983,49, | 2983,50, | 2983,51, | 2983,52, | 2983,53, | 2983,54, | 2983,55, | 2983,56, | 2983,57, | 2983,58, | 2983,59, | 2983,60, | 2983,61, | 2983,62, | 2983,63, | 2983,64, | 2983,65, | 2983,66, | 2983,67, | 2983,68, | 2983,69, | 2983,70, | 2983,71, | 2983,72, | 2983,73, | 2983,74, | 2983,75, | 2983,76, | 2983,77, | 2983,78, | 2983,79, | 2983,80, | 2983,81, | 2983,82, | 2983,83, | 2983,84, | 2983,85, | 2984,1, | 2984,2, | 2984,3, | 2984,4, | 2984,5, | 2984,6, | 2984,7, | 2984,8, | 2984,9, | 2984,10, | 2984,11, | 2984,12, | 2984,13, | 2984,14, | 2984,15, | 2984,16, | 2984,17, | 2984,18, | 2984,19, | 2984,20, | 2984,21, | 2984,22, | 2984,23, | 2984,24, | 2984,25, | 2984,26, | 2984,27, | 2984,28, | 2984,29, | 2984,30, | 2984,31, | 2984,32, | 2984,33, | 2984,34, | 2984,35, | 2984,36, | 2984,37, | 2984,38, | 2984,39, | 2984,40, | 2984,41, | 2984,42, | 2984,43, | 2984,44, | 2984,45, | 2984,46, | 2984,47, | 2984,48, | 2984,49, | 2984,50, | 2984,51, | 2984,52, | 2984,53, | 2984,54, | 2984,55, | 2984,56, | 2984,57, | 2984,58, | 2984,59, | 2984,60, | 2984,61, | 2984,62, | 2984,63, | 2984,64, | 2984,65, | 2984,66, | 2984,67, | 2984,68, | 2984,69, | 2984,70, | 2984,71, | 2984,72, | 2984,73, | 2984,74, | 2984,75, | 2984,76, | 2984,77, | 2984,78, | 2984,79, | 2984,80, | 2984,81, | 2984,82, | 2984,83, | 2984,84, | 2984,85, | 2985,1, | 2985,2, | 2985,3, | 2985,4, | 2985,5, | 2985,6, | 2985,7, | 2985,8, | 2985,9, | 2985,10, | 2985,11, | 2985,12, | 2985,13, | 2985,14, | 2985,15, | 2985,16, | 2985,17, | 2985,18, | 2985,19, | 2985,20, | 2985,21, | 2985,22, | 2985,23, | 2985,24, | 2985,25, | 2985,26, | 2985,27, | 2985,28, | 2985,29, | 2985,30, | 2985,31, | 2985,32, | 2985,33, | 2985,34, | 2985,35, | 2985,36, | 2985,37, | 2985,38, | 2985,39, | 2985,40, | 2985,41, | 2985,42, | 2985,43, | 2985,44, | 2985,45, | 2985,46, | 2985,47, | 2985,48, | 2985,49, | 2985,50, | 2985,51, | 2985,52, | 2985,53, | 2985,54, | 2985,55, | 2985,56, | 2985,57, | 2985,58, | 2985,59, | 2985,60, | 2985,61, | 2985,62, | 2985,63, | 2985,64, | 2985,65, | 2985,66, | 2985,67, | 2985,68, | 2985,69, | 2985,70, | 2985,71, | 2985,72, | 2985,73, | 2985,74, | 2985,75, | 2985,76, | 2985,77, | 2985,78, | 2985,79, | 2985,80, | 2985,81, | 2985,82, | 2985,83, | 2985,84, | 2985,85, | 2986,1, | 2986,2, | 2986,3, | 2986,4, | 2986,5, | 2986,6, | 2986,7, | 2986,8, | 2986,9, | 2986,10, | 2986,11, | 2986,12, | 2986,13, | 2986,14, | 2986,15, | 2986,16, | 2986,17, | 2986,18, | 2986,19, | 2986,20, | 2986,21, | 2986,22, | 2986,23, | 2986,24, | 2986,25, | 2986,26, | 2986,27, | 2986,28, | 2986,29, | 2986,30, | 2986,31, | 2986,32, | 2986,33, | 2986,34, | 2986,35, | 2986,36, | 2986,37, | 2986,38, | 2986,39, | 2986,40, | 2986,41, | 2986,42, | 2986,43, | 2986,44, | 2986,45, | 2986,46, | 2986,47, | 2986,48, | 2986,49, | 2986,50, | 2986,51, | 2986,52, | 2986,53, | 2986,54, | 2986,55, | 2986,56, | 2986,57, | 2986,58, | 2986,59, | 2986,60, | 2986,61, | 2986,62, | 2986,63, | 2986,64, | 2986,65, | 2986,66, | 2986,67, | 2986,68, | 2986,69, | 2986,70, | 2986,71, | 2986,72, | 2986,73, | 2986,74, | 2986,75, | 2986,76, | 2986,77, | 2986,78, | 2986,79, | 2986,80, | 2986,81, | 2986,82, | 2986,83, | 2986,84, | 2986,85, | 2987,1, | 2987,2, | 2987,3, | 2987,4, | 2987,5, | 2987,6, | 2987,7, | 2987,8, | 2987,9, | 2987,10, | 2987,11, | 2987,12, | 2987,13, | 2987,14, | 2987,15, | 2987,16, | 2987,17, | 2987,18, | 2987,19, | 2987,20, | 2987,21, | 2987,22, | 2987,23, | 2987,24, | 2987,25, | 2987,26, | 2987,27, | 2987,28, | 2987,29, | 2987,30, | 2987,31, | 2987,32, | 2987,33, | 2987,34, | 2987,35, | 2987,36, | 2987,37, | 2987,38, | 2987,39, | 2987,40, | 2987,41, | 2987,42, | 2987,43, | 2987,44, | 2987,45, | 2987,46, | 2987,47, | 2987,48, | 2987,49, | 2987,50, | 2987,51, | 2987,52, | 2987,53, | 2987,54, | 2987,55, | 2987,56, | 2987,57, | 2987,58, | 2987,59, | 2987,60, | 2987,61, | 2987,62, | 2987,63, | 2987,64, | 2987,65, | 2987,66, | 2987,67, | 2987,68, | 2987,69, | 2987,70, | 2987,71, | 2987,72, | 2987,73, | 2987,74, | 2987,75, | 2987,76, | 2987,77, | 2987,78, | 2987,79, | 2987,80, | 2987,81, | 2987,82, | 2987,83, | 2987,84, | 2987,85, | 2988,1, | 2988,2, | 2988,3, | 2988,4, | 2988,5, | 2988,6, | 2988,7, | 2988,8, | 2988,9, | 2988,10, | 2988,11, | 2988,12, | 2988,13, | 2988,14, | 2988,15, | 2988,16, | 2988,17, | 2988,18, | 2988,19, | 2988,20, | 2988,21, | 2988,22, | 2988,23, | 2988,24, | 2988,25, | 2988,26, | 2988,27, | 2988,28, | 2988,29, | 2988,30, | 2988,31, | 2988,32, | 2988,33, | 2988,34, | 2988,35, | 2988,36, | 2988,37, | 2988,38, | 2988,39, | 2988,40, | 2988,41, | 2988,42, | 2988,43, | 2988,44, | 2988,45, | 2988,46, | 2988,47, | 2988,48, | 2988,49, | 2988,50, | 2988,51, | 2988,52, | 2988,53, | 2988,54, | 2988,55, | 2988,56, | 2988,57, | 2988,58, | 2988,59, | 2988,60, | 2988,61, | 2988,62, | 2988,63, | 2988,64, | 2988,65, | 2988,66, | 2988,67, | 2988,68, | 2988,69, | 2988,70, | 2988,71, | 2988,72, | 2988,73, | 2988,74, | 2988,75, | 2988,76, | 2988,77, | 2988,78, | 2988,79, | 2988,80, | 2988,81, | 2988,82, | 2988,83, | 2988,84, | 2988,85, | 2989,1, | 2989,2, | 2989,3, | 2989,4, | 2989,5, | 2989,6, | 2989,7, | 2989,8, | 2989,9, | 2989,10, | 2989,11, | 2989,12, | 2989,13, | 2989,14, | 2989,15, | 2989,16, | 2989,17, | 2989,18, | 2989,19, | 2989,20, | 2989,21, | 2989,22, | 2989,23, | 2989,24, | 2989,25, | 2989,26, | 2989,27, | 2989,28, | 2989,29, | 2989,30, | 2989,31, | 2989,32, | 2989,33, | 2989,34, | 2989,35, | 2989,36, | 2989,37, | 2989,38, | 2989,39, | 2989,40, | 2989,41, | 2989,42, | 2989,43, | 2989,44, | 2989,45, | 2989,46, | 2989,47, | 2989,48, | 2989,49, | 2989,50, | 2989,51, | 2989,52, | 2989,53, | 2989,54, | 2989,55, | 2989,56, | 2989,57, | 2989,58, | 2989,59, | 2989,60, | 2989,61, | 2989,62, | 2989,63, | 2989,64, | 2989,65, | 2989,66, | 2989,67, | 2989,68, | 2989,69, | 2989,70, | 2989,71, | 2989,72, | 2989,73, | 2989,74, | 2989,75, | 2989,76, | 2989,77, | 2989,78, | 2989,79, | 2989,80, | 2989,81, | 2989,82, | 2989,83, | 2989,84, | 2989,85, | 2990,1, | 2990,2, | 2990,3, | 2990,4, | 2990,5, | 2990,6, | 2990,7, | 2990,8, | 2990,9, | 2990,10, | 2990,11, | 2990,12, | 2990,13, | 2990,14, | 2990,15, | 2990,16, | 2990,17, | 2990,18, | 2990,19, | 2990,20, | 2990,21, | 2990,22, | 2990,23, | 2990,24, | 2990,25, | 2990,26, | 2990,27, | 2990,28, | 2990,29, | 2990,30, | 2990,31, | 2990,32, | 2990,33, | 2990,34, | 2990,35, | 2990,36, | 2990,37, | 2990,38, | 2990,39, | 2990,40, | 2990,41, | 2990,42, | 2990,43, | 2990,44, | 2990,45, | 2990,46, | 2990,47, | 2990,48, | 2990,49, | 2990,50, | 2990,51, | 2990,52, | 2990,53, | 2990,54, | 2990,55, | 2990,56, | 2990,57, | 2990,58, | 2990,59, | 2990,60, | 2990,61, | 2990,62, | 2990,63, | 2990,64, | 2990,65, | 2990,66, | 2990,67, | 2990,68, | 2990,69, | 2990,70, | 2990,71, | 2990,72, | 2990,73, | 2990,74, | 2990,75, | 2990,76, | 2990,77, | 2990,78, | 2990,79, | 2990,80, | 2990,81, | 2990,82, | 2990,83, | 2990,84, | 2990,85, | 2991,1, | 2991,2, | 2991,3, | 2991,4, | 2991,5, | 2991,6, | 2991,7, | 2991,8, | 2991,9, | 2991,10, | 2991,11, | 2991,12, | 2991,13, | 2991,14, | 2991,15, | 2991,16, | 2991,17, | 2991,18, | 2991,19, | 2991,20, | 2991,21, | 2991,22, | 2991,23, | 2991,24, | 2991,25, | 2991,26, | 2991,27, | 2991,28, | 2991,29, | 2991,30, | 2991,31, | 2991,32, | 2991,33, | 2991,34, | 2991,35, | 2991,36, | 2991,37, | 2991,38, | 2991,39, | 2991,40, | 2991,41, | 2991,42, | 2991,43, | 2991,44, | 2991,45, | 2991,46, | 2991,47, | 2991,48, | 2991,49, | 2991,50, | 2991,51, | 2991,52, | 2991,53, | 2991,54, | 2991,55, | 2991,56, | 2991,57, | 2991,58, | 2991,59, | 2991,60, | 2991,61, | 2991,62, | 2991,63, | 2991,64, | 2991,65, | 2991,66, | 2991,67, | 2991,68, | 2991,69, | 2991,70, | 2991,71, | 2991,72, | 2991,73, | 2991,74, | 2991,75, | 2991,76, | 2991,77, | 2991,78, | 2991,79, | 2991,80, | 2991,81, | 2991,82, | 2991,83, | 2991,84, | 2991,85, | 2992,1, | 2992,2, | 2992,3, | 2992,4, | 2992,5, | 2992,6, | 2992,7, | 2992,8, | 2992,9, | 2992,10, | 2992,11, | 2992,12, | 2992,13, | 2992,14, | 2992,15, | 2992,16, | 2992,17, | 2992,18, | 2992,19, | 2992,20, | 2992,21, | 2992,22, | 2992,23, | 2992,24, | 2992,25, | 2992,26, | 2992,27, | 2992,28, | 2992,29, | 2992,30, | 2992,31, | 2992,32, | 2992,33, | 2992,34, | 2992,35, | 2992,36, | 2992,37, | 2992,38, | 2992,39, | 2992,40, | 2992,41, | 2992,42, | 2992,43, | 2992,44, | 2992,45, | 2992,46, | 2992,47, | 2992,48, | 2992,49, | 2992,50, | 2992,51, | 2992,52, | 2992,53, | 2992,54, | 2992,55, | 2992,56, | 2992,57, | 2992,58, | 2992,59, | 2992,60, | 2992,61, | 2992,62, | 2992,63, | 2992,64, | 2992,65, | 2992,66, | 2992,67, | 2992,68, | 2992,69, | 2992,70, | 2992,71, | 2992,72, | 2992,73, | 2992,74, | 2992,75, | 2992,76, | 2992,77, | 2992,78, | 2992,79, | 2992,80, | 2992,81, | 2992,82, | 2992,83, | 2992,84, | 2992,85, | 2993,1, | 2993,2, | 2993,3, | 2993,4, | 2993,5, | 2993,6, | 2993,7, | 2993,8, | 2993,9, | 2993,10, | 2993,11, | 2993,12, | 2993,13, | 2993,14, | 2993,15, | 2993,16, | 2993,17, | 2993,18, | 2993,19, | 2993,20, | 2993,21, | 2993,22, | 2993,23, | 2993,24, | 2993,25, | 2993,26, | 2993,27, | 2993,28, | 2993,29, | 2993,30, | 2993,31, | 2993,32, | 2993,33, | 2993,34, | 2993,35, | 2993,36, | 2993,37, | 2993,38, | 2993,39, | 2993,40, | 2993,41, | 2993,42, | 2993,43, | 2993,44, | 2993,45, | 2993,46, | 2993,47, | 2993,48, | 2993,49, | 2993,50, | 2993,51, | 2993,52, | 2993,53, | 2993,54, | 2993,55, | 2993,56, | 2993,57, | 2993,58, | 2993,59, | 2993,60, | 2993,61, | 2993,62, | 2993,63, | 2993,64, | 2993,65, | 2993,66, | 2993,67, | 2993,68, | 2993,69, | 2993,70, | 2993,71, | 2993,72, | 2993,73, | 2993,74, | 2993,75, | 2993,76, | 2993,77, | 2993,78, | 2993,79, | 2993,80, | 2993,81, | 2993,82, | 2993,83, | 2993,84, | 2993,85, | 2994,1, | 2994,2, | 2994,3, | 2994,4, | 2994,5, | 2994,6, | 2994,7, | 2994,8, | 2994,9, | 2994,10, | 2994,11, | 2994,12, | 2994,13, | 2994,14, | 2994,15, | 2994,16, | 2994,17, | 2994,18, | 2994,19, | 2994,20, | 2994,21, | 2994,22, | 2994,23, | 2994,24, | 2994,25, | 2994,26, | 2994,27, | 2994,28, | 2994,29, | 2994,30, | 2994,31, | 2994,32, | 2994,33, | 2994,34, | 2994,35, | 2994,36, | 2994,37, | 2994,38, | 2994,39, | 2994,40, | 2994,41, | 2994,42, | 2994,43, | 2994,44, | 2994,45, | 2994,46, | 2994,47, | 2994,48, | 2994,49, | 2994,50, | 2994,51, | 2994,52, | 2994,53, | 2994,54, | 2994,55, | 2994,56, | 2994,57, | 2994,58, | 2994,59, | 2994,60, | 2994,61, | 2994,62, | 2994,63, | 2994,64, | 2994,65, | 2994,66, | 2994,67, | 2994,68, | 2994,69, | 2994,70, | 2994,71, | 2994,72, | 2994,73, | 2994,74, | 2994,75, | 2994,76, | 2994,77, | 2994,78, | 2994,79, | 2994,80, | 2994,81, | 2994,82, | 2994,83, | 2994,84, | 2994,85, | 2995,1, | 2995,2, | 2995,3, | 2995,4, | 2995,5, | 2995,6, | 2995,7, | 2995,8, | 2995,9, | 2995,10, | 2995,11, | 2995,12, | 2995,13, | 2995,14, | 2995,15, | 2995,16, | 2995,17, | 2995,18, | 2995,19, | 2995,20, | 2995,21, | 2995,22, | 2995,23, | 2995,24, | 2995,25, | 2995,26, | 2995,27, | 2995,28, | 2995,29, | 2995,30, | 2995,31, | 2995,32, | 2995,33, | 2995,34, | 2995,35, | 2995,36, | 2995,37, | 2995,38, | 2995,39, | 2995,40, | 2995,41, | 2995,42, | 2995,43, | 2995,44, | 2995,45, | 2995,46, | 2995,47, | 2995,48, | 2995,49, | 2995,50, | 2995,51, | 2995,52, | 2995,53, | 2995,54, | 2995,55, | 2995,56, | 2995,57, | 2995,58, | 2995,59, | 2995,60, | 2995,61, | 2995,62, | 2995,63, | 2995,64, | 2995,65, | 2995,66, | 2995,67, | 2995,68, | 2995,69, | 2995,70, | 2995,71, | 2995,72, | 2995,73, | 2995,74, | 2995,75, | 2995,76, | 2995,77, | 2995,78, | 2995,79, | 2995,80, | 2995,81, | 2995,82, | 2995,83, | 2995,84, | 2995,85, | 2996,1, | 2996,2, | 2996,3, | 2996,4, | 2996,5, | 2996,6, | 2996,7, | 2996,8, | 2996,9, | 2996,10, | 2996,11, | 2996,12, | 2996,13, | 2996,14, | 2996,15, | 2996,16, | 2996,17, | 2996,18, | 2996,19, | 2996,20, | 2996,21, | 2996,22, | 2996,23, | 2996,24, | 2996,25, | 2996,26, | 2996,27, | 2996,28, | 2996,29, | 2996,30, | 2996,31, | 2996,32, | 2996,33, | 2996,34, | 2996,35, | 2996,36, | 2996,37, | 2996,38, | 2996,39, | 2996,40, | 2996,41, | 2996,42, | 2996,43, | 2996,44, | 2996,45, | 2996,46, | 2996,47, | 2996,48, | 2996,49, | 2996,50, | 2996,51, | 2996,52, | 2996,53, | 2996,54, | 2996,55, | 2996,56, | 2996,57, | 2996,58, | 2996,59, | 2996,60, | 2996,61, | 2996,62, | 2996,63, | 2996,64, | 2996,65, | 2996,66, | 2996,67, | 2996,68, | 2996,69, | 2996,70, | 2996,71, | 2996,72, | 2996,73, | 2996,74, | 2996,75, | 2996,76, | 2996,77, | 2996,78, | 2996,79, | 2996,80, | 2996,81, | 2996,82, | 2996,83, | 2996,84, | 2996,85, | 2997,1, | 2997,2, | 2997,3, | 2997,4, | 2997,5, | 2997,6, | 2997,7, | 2997,8, | 2997,9, | 2997,10, | 2997,11, | 2997,12, | 2997,13, | 2997,14, | 2997,15, | 2997,16, | 2997,17, | 2997,18, | 2997,19, | 2997,20, | 2997,21, | 2997,22, | 2997,23, | 2997,24, | 2997,25, | 2997,26, | 2997,27, | 2997,28, | 2997,29, | 2997,30, | 2997,31, | 2997,32, | 2997,33, | 2997,34, | 2997,35, | 2997,36, | 2997,37, | 2997,38, | 2997,39, | 2997,40, | 2997,41, | 2997,42, | 2997,43, | 2997,44, | 2997,45, | 2997,46, | 2997,47, | 2997,48, | 2997,49, | 2997,50, | 2997,51, | 2997,52, | 2997,53, | 2997,54, | 2997,55, | 2997,56, | 2997,57, | 2997,58, | 2997,59, | 2997,60, | 2997,61, | 2997,62, | 2997,63, | 2997,64, | 2997,65, | 2997,66, | 2997,67, | 2997,68, | 2997,69, | 2997,70, | 2997,71, | 2997,72, | 2997,73, | 2997,74, | 2997,75, | 2997,76, | 2997,77, | 2997,78, | 2997,79, | 2997,80, | 2997,81, | 2997,82, | 2997,83, | 2997,84, | 2997,85, | 2998,1, | 2998,2, | 2998,3, | 2998,4, | 2998,5, | 2998,6, | 2998,7, | 2998,8, | 2998,9, | 2998,10, | 2998,11, | 2998,12, | 2998,13, | 2998,14, | 2998,15, | 2998,16, | 2998,17, | 2998,18, | 2998,19, | 2998,20, | 2998,21, | 2998,22, | 2998,23, | 2998,24, | 2998,25, | 2998,26, | 2998,27, | 2998,28, | 2998,29, | 2998,30, | 2998,31, | 2998,32, | 2998,33, | 2998,34, | 2998,35, | 2998,36, | 2998,37, | 2998,38, | 2998,39, | 2998,40, | 2998,41, | 2998,42, | 2998,43, | 2998,44, | 2998,45, | 2998,46, | 2998,47, | 2998,48, | 2998,49, | 2998,50, | 2998,51, | 2998,52, | 2998,53, | 2998,54, | 2998,55, | 2998,56, | 2998,57, | 2998,58, | 2998,59, | 2998,60, | 2998,61, | 2998,62, | 2998,63, | 2998,64, | 2998,65, | 2998,66, | 2998,67, | 2998,68, | 2998,69, | 2998,70, | 2998,71, | 2998,72, | 2998,73, | 2998,74, | 2998,75, | 2998,76, | 2998,77, | 2998,78, | 2998,79, | 2998,80, | 2998,81, | 2998,82, | 2998,83, | 2998,84, | 2998,85, | 2999,1, | 2999,2, | 2999,3, | 2999,4, | 2999,5, | 2999,6, | 2999,7, | 2999,8, | 2999,9, | 2999,10, | 2999,11, | 2999,12, | 2999,13, | 2999,14, | 2999,15, | 2999,16, | 2999,17, | 2999,18, | 2999,19, | 2999,20, | 2999,21, | 2999,22, | 2999,23, | 2999,24, | 2999,25, | 2999,26, | 2999,27, | 2999,28, | 2999,29, | 2999,30, | 2999,31, | 2999,32, | 2999,33, | 2999,34, | 2999,35, | 2999,36, | 2999,37, | 2999,38, | 2999,39, | 2999,40, | 2999,41, | 2999,42, | 2999,43, | 2999,44, | 2999,45, | 2999,46, | 2999,47, | 2999,48, | 2999,49, | 2999,50, | 2999,51, | 2999,52, | 2999,53, | 2999,54, | 2999,55, | 2999,56, | 2999,57, | 2999,58, | 2999,59, | 2999,60, | 2999,61, | 2999,62, | 2999,63, | 2999,64, | 2999,65, | 2999,66, | 2999,67, | 2999,68, | 2999,69, | 2999,70, | 2999,71, | 2999,72, | 2999,73, | 2999,74, | 2999,75, | 2999,76, | 2999,77, | 2999,78, | 2999,79, | 2999,80, | 2999,81, | 2999,82, | 2999,83, | 2999,84, | 2999,85, | 3000,1, | 3000,2, | 3000,3, | 3000,4, | 3000,5, | 3000,6, | 3000,7, | 3000,8, | 3000,9, | 3000,10, | 3000,11, | 3000,12, | 3000,13, | 3000,14, | 3000,15, | 3000,16, | 3000,17, | 3000,18, | 3000,19, | 3000,20, | 3000,21, | 3000,22, | 3000,23, | 3000,24, | 3000,25, | 3000,26, | 3000,27, | 3000,28, | 3000,29, | 3000,30, | 3000,31, | 3000,32, | 3000,33, | 3000,34, | 3000,35, | 3000,36, | 3000,37, | 3000,38, | 3000,39, | 3000,40, | 3000,41, | 3000,42, | 3000,43, | 3000,44, | 3000,45, | 3000,46, | 3000,47, | 3000,48, | 3000,49, | 3000,50, | 3000,51, | 3000,52, | 3000,53, | 3000,54, | 3000,55, | 3000,56, | 3000,57, | 3000,58, | 3000,59, | 3000,60, | 3000,61, | 3000,62, | 3000,63, | 3000,64, | 3000,65, | 3000,66, | 3000,67, | 3000,68, | 3000,69, | 3000,70, | 3000,71, | 3000,72, | 3000,73, | 3000,74, | 3000,75, | 3000,76, | 3000,77, | 3000,78, | 3000,79, | 3000,80, | 3000,81, | 3000,82, | 3000,83, | 3000,84, | 3000,85, | 3001,1, | 3001,2, | 3001,3, | 3001,4, | 3001,5, | 3001,6, | 3001,7, | 3001,8, | 3001,9, | 3001,10, | 3001,11, | 3001,12, | 3001,13, | 3001,14, | 3001,15, | 3001,16, | 3001,17, | 3001,18, | 3001,19, | 3001,20, | 3001,21, | 3001,22, | 3001,23, | 3001,24, | 3001,25, | 3001,26, | 3001,27, | 3001,28, | 3001,29, | 3001,30, | 3001,31, | 3001,32, | 3001,33, | 3001,34, | 3001,35, | 3001,36, | 3001,37, | 3001,38, | 3001,39, | 3001,40, | 3001,41, | 3001,42, | 3001,43, | 3001,44, | 3001,45, | 3001,46, | 3001,47, | 3001,48, | 3001,49, | 3001,50, | 3001,51, | 3001,52, | 3001,53, | 3001,54, | 3001,55, | 3001,56, | 3001,57, | 3001,58, | 3001,59, | 3001,60, | 3001,61, | 3001,62, | 3001,63, | 3001,64, | 3001,65, | 3001,66, | 3001,67, | 3001,68, | 3001,69, | 3001,70, | 3001,71, | 3001,72, | 3001,73, | 3001,74, | 3001,75, | 3001,76, | 3001,77, | 3001,78, | 3001,79, | 3001,80, | 3001,81, | 3001,82, | 3001,83, | 3001,84, | 3001,85, | 3002,1, | 3002,2, | 3002,3, | 3002,4, | 3002,5, | 3002,6, | 3002,7, | 3002,8, | 3002,9, | 3002,10, | 3002,11, | 3002,12, | 3002,13, | 3002,14, | 3002,15, | 3002,16, | 3002,17, | 3002,18, | 3002,19, | 3002,20, | 3002,21, | 3002,22, | 3002,23, | 3002,24, | 3002,25, | 3002,26, | 3002,27, | 3002,28, | 3002,29, | 3002,30, | 3002,31, | 3002,32, | 3002,33, | 3002,34, | 3002,35, | 3002,36, | 3002,37, | 3002,38, | 3002,39, | 3002,40, | 3002,41, | 3002,42, | 3002,43, | 3002,44, | 3002,45, | 3002,46, | 3002,47, | 3002,48, | 3002,49, | 3002,50, | 3002,51, | 3002,52, | 3002,53, | 3002,54, | 3002,55, | 3002,56, | 3002,57, | 3002,58, | 3002,59, | 3002,60, | 3002,61, | 3002,62, | 3002,63, | 3002,64, | 3002,65, | 3002,66, | 3002,67, | 3002,68, | 3002,69, | 3002,70, | 3002,71, | 3002,72, | 3002,73, | 3002,74, | 3002,75, | 3002,76, | 3002,77, | 3002,78, | 3002,79, | 3002,80, | 3002,81, | 3002,82, | 3002,83, | 3002,84, | 3002,85, | 3003,1, | 3003,2, | 3003,3, | 3003,4, | 3003,5, | 3003,6, | 3003,7, | 3003,8, | 3003,9, | 3003,10, | 3003,11, | 3003,12, | 3003,13, | 3003,14, | 3003,15, | 3003,16, | 3003,17, | 3003,18, | 3003,19, | 3003,20, | 3003,21, | 3003,22, | 3003,23, | 3003,24, | 3003,25, | 3003,26, | 3003,27, | 3003,28, | 3003,29, | 3003,30, | 3003,31, | 3003,32, | 3003,33, | 3003,34, | 3003,35, | 3003,36, | 3003,37, | 3003,38, | 3003,39, | 3003,40, | 3003,41, | 3003,42, | 3003,43, | 3003,44, | 3003,45, | 3003,46, | 3003,47, | 3003,48, | 3003,49, | 3003,50, | 3003,51, | 3003,52, | 3003,53, | 3003,54, | 3003,55, | 3003,56, | 3003,57, | 3003,58, | 3003,59, | 3003,60, | 3003,61, | 3003,62, | 3003,63, | 3003,64, | 3003,65, | 3003,66, | 3003,67, | 3003,68, | 3003,69, | 3003,70, | 3003,71, | 3003,72, | 3003,73, | 3003,74, | 3003,75, | 3003,76, | 3003,77, | 3003,78, | 3003,79, | 3003,80, | 3003,81, | 3003,82, | 3003,83, | 3003,84, | 3003,85, | 3004,1, | 3004,2, | 3004,3, | 3004,4, | 3004,5, | 3004,6, | 3004,7, | 3004,8, | 3004,9, | 3004,10, | 3004,11, | 3004,12, | 3004,13, | 3004,14, | 3004,15, | 3004,16, | 3004,17, | 3004,18, | 3004,19, | 3004,20, | 3004,21, | 3004,22, | 3004,23, | 3004,24, | 3004,25, | 3004,26, | 3004,27, | 3004,28, | 3004,29, | 3004,30, | 3004,31, | 3004,32, | 3004,33, | 3004,34, | 3004,35, | 3004,36, | 3004,37, | 3004,38, | 3004,39, | 3004,40, | 3004,41, | 3004,42, | 3004,43, | 3004,44, | 3004,45, | 3004,46, | 3004,47, | 3004,48, | 3004,49, | 3004,50, | 3004,51, | 3004,52, | 3004,53, | 3004,54, | 3004,55, | 3004,56, | 3004,57, | 3004,58, | 3004,59, | 3004,60, | 3004,61, | 3004,62, | 3004,63, | 3004,64, | 3004,65, | 3004,66, | 3004,67, | 3004,68, | 3004,69, | 3004,70, | 3004,71, | 3004,72, | 3004,73, | 3004,74, | 3004,75, | 3004,76, | 3004,77, | 3004,78, | 3004,79, | 3004,80, | 3004,81, | 3004,82, | 3004,83, | 3004,84, | 3004,85, | 3005,33, | 3006,33, | 3007,33, | 3008,33, | 3009,33, | 3010,33, | 3011,33, | 3012,33, | 3013,33, | 3014,33, | 3015,33, | 3016,33, | 3017,33, | 3018,33, | 3019,33, | 3020,33, | 3021,33, | 3022,33, | 3023,33, | 3024,33, | 3025,33, | 3026,33 |]); libminizinc-2.5.3/tests/spec/unit/regression/bug69_4.mzn0000644000175000017500000000053113757304533021637 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution y: [2, 1, 1] - !Result solution: !Solution y: [10, 10, 10] ***/ % DISABLED ON mzn_cd_fd % A regression test for G12 bug #69. % array [1..3] of var int: y; predicate p(array [int] of var 1..10: x) = (x[1] mod 2 = 0); constraint p(y); solve satisfy; output ["y = ", show(y), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/test_bug72.mzn0000644000175000017500000000061113757304533022444 0ustar kaolkaol/*** --- !Test solvers: [gecode] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: - !Solution x: !!set {1} b: true --- !Test solvers: [chuffed] expected: !Result status: SATISFIED solution: !Solution x: !!set {1} b: true ***/ var set of 1..1: x; constraint 1 in x; var bool: b; constraint b = exists([true | s in x]); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/abs_bug.mzn0000644000175000017500000000232113757304533022061 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution _output_item: | [4, 10] {4,10,13} {1,3,4} depot(a,4). depot(c,10). ***/ % Regression test. % The bounds inferred for absolute values expressions where incorrect in r13710 % and before. int: nr; % number of restaurants set of int: Restaurant = 1..nr; array[Restaurant] of string: name :: add_to_output; array[Restaurant] of 0..910: k; % kilometre position set of int: ks :: add_to_output = { k[r] | r in Restaurant }; set of Restaurant: first :: add_to_output = { min(r in Restaurant where k[r] == pos)(r) | pos in ks }; int: number_of_depots; set of int: Depot = 1..number_of_depots; array[Depot] of var 0..910: p :: add_to_output; % position of depot constraint forall(d in Depot)(p[d] in ks); constraint forall(d in 1..number_of_depots-1)(p[d] < p[d+1]); solve minimize sum(r in Restaurant)(min(d in Depot)(abs(p[d] - k[r]))); %satisfy; output [ show(p), "\n", show(ks), "\n", show(first), "\n"]++ [ if (fix(p[d]) == k[r]) then "depot(" ++ name[r] ++ "," ++ show(p[d]) ++ ").\n" else "" endif | d in Depot, r in first ]; nr = 4; name = ["a", "b", "c", "d"]; k = [4,4,10,13]; number_of_depots = 2; libminizinc-2.5.3/tests/spec/unit/regression/bizarre.mzn0000644000175000017500000000343013757304533022117 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution allsym: [P, L, E, A, S, E, ' ', S, O, L, V, E, P, U, Z, Z, L, E, '?', '?', '?', '?', '?', '?'] num_symbols2: 11 sym2: [A, ' ', S, O, V, P, U, Z, L, E, '?'] x: 0 - !Result solution: !Solution allsym: [P, L, E, A, S, E, ' ', S, O, L, V, E, P, U, Z, Z, L, E, '?', '?', '?', '?', '?', '?'] num_symbols2: 11 sym2: [A, ' ', S, O, V, P, U, Z, L, E, '?'] x: 1 ***/ % Regression test for a flattening problem reported by pjs in version 1.1.5 % of MiniZinc. int: size_codex; array[1..size_codex] of 0..9: codex; array[1..size_codex] of string: fixed; int: num_symbols; array[1..num_symbols] of string: symbols; int: rows; int: cols; array[1..rows,1..cols] of string: puzzle; array[1..rows*cols] of string: allsym :: add_to_output = [ puzzle[i,j] | i in 1..rows, j in 1..cols ]; int: num_symbols2 :: add_to_output = length( [ allsym[i] | i in 1..rows*cols where not exists(j in i+1..rows*cols)( allsym[i] == allsym[j]) ]); array[1..num_symbols] of string: sym2 :: add_to_output = [ allsym[i] | i in 1..rows*cols where not exists(j in i+1..rows*cols)( allsym[i] == allsym[j]) ]; var 0..1:x :: add_to_output; solve satisfy; output [show(x),"\n"] ++ [show(num_symbols2),"\n"] ++ [show(allsym),"\n"] ++ [show(sym2),"\n"] ; size_codex = 10; codex = [0, 1, 2, 3, 5, 6, 7, 7, 8, 9]; fixed = [" "," "," "," "," "," ","Z","?"," "," "]; num_symbols = 11; symbols = ["P","L","E","A","S","O","V","U","Z","?"," "]; rows = 4; cols = 6; puzzle = [| "P", "L", "E", "A", "S", "E" | " ", "S", "O", "L", "V", "E" | "P", "U", "Z", "Z", "L", "E" | "?", "?", "?", "?", "?", "?" |]; libminizinc-2.5.3/tests/spec/unit/regression/output_only_fn.ozn0000644000175000017500000000007313757304533023547 0ustar kaolkaoloutput [show(x)]; function int : foo = 10; int: x = foo(); libminizinc-2.5.3/tests/spec/unit/regression/bug256.mzn0000644000175000017500000000126613757304533021500 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution {} ***/ % Regression test for bug #256: this model caused solns2out % to abort with the following message: % % solns2out: % error: % :1 % In assignment for 'x'. % In coercion. % In 'array1d' expression. % This is not a valid MiniZinc array type. array[1..1] of var set of 1..1: x = [{}]; solve satisfy; output [show(x), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/test_output_array_of_set.mzn0000644000175000017500000000032613757304533025616 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ % This used to cause the error: 'MiniZinc: internal error: invalid set literal type' array[1..1] of var set of 1..1: sets; output [show(sets[i]) | i in 1..1];libminizinc-2.5.3/tests/spec/unit/regression/flat_cv_let.mzn0000644000175000017500000000043013757304533022740 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution objective: 4 a: [0,0,2,2] num: 4 ***/ array[1..4] of var 0..2: a ::add_to_output; int: num ::add_to_output = (let { constraint forall(i in 1..2) ( a[i] = 0 ); } in length(a) - 2) + 2; solve maximize sum(a); libminizinc-2.5.3/tests/spec/unit/regression/test_bug45.mzn0000644000175000017500000000034013757304533022443 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution i: 1 ***/ var 1..1: i; predicate losseq(array[int] of var int: a) = sum([1 | e in a where e >= 1]) = 1; constraint losseq([0,0,0,1]); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/test_slice_1d_array.mzn0000644000175000017500000000027713757304533024407 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution xs: [2, 3] ***/ array[int] of int: x = [1,2,3,4]; int: i = 2; array[int] of int: xs :: add_to_output = x[i..i+1]; libminizinc-2.5.3/tests/spec/unit/regression/bug282.mzn0000644000175000017500000000123113757304533021467 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution P: -2147483645 Q: -2147483644 R: -2147483646 - !Result solution: !Solution P: 1 Q: 2 R: 0 - !Result solution: !Solution P: -499999999 Q: -499999998 R: -500000000 ***/ % Regression test for bug #282: mzn2fzn's optimization pass left dangling % variables in the int_search/4 annotation below. var int : P; var int : Q; var int : R; constraint ((R + 1) = P); constraint ((R + 2) = Q); solve :: seq_search([int_search([P,Q,R], input_order, indomain_min, complete)]) satisfy; output [ "P = ", show(P), "\n", "Q = ", show(Q), "\n", "R = ", show(R), "\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/ts_bug.mzn0000644000175000017500000001042613757304533021747 0ustar kaolkaol/*** !Test solvers: [gecode] expected: - !Result status: OPTIMAL_SOLUTION solution: !Solution cost: 48 s: [4, 1, 2, 3, 6, 5] dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {1, 3}] bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}] aft: [!!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {}] a: [!!set {1, 2}, !!set {2, 3}, !!set {3, 4}, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}] - !Result status: OPTIMAL_SOLUTION solution: !Solution cost: 48 s: [4, 1, 2, 3, 6, 5] dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {1, 3}] bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !Range 1..4, !Range 1..4, !Range 1..4] aft: [!Range 1..4, !Range 1..4, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {}] a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}] - !Result status: OPTIMAL_SOLUTION solution: !Solution cost: 48 s: [5, 3, 2, 1, 4, 6] dur: [!!set {1, 3}, !!set {1, 3, 4}, !!set {1, 2, 4}, !!set {1, 2, 4}, !!set {1, 4}, !!set {1, 4}] bef: [!!set {}, !!set {1, 3}, !!set {1, 3, 4}, !Range 1..4, !Range 1..4, !Range 1..4] aft: [!Range 1..4, !Range 1..4, !!set {1, 2, 4}, !!set {1, 2, 4}, !!set {1, 4}, !!set {}] a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}] - !Result status: OPTIMAL_SOLUTION solution: !Solution cost: 48 s: [4, 1, 2, 3, 5, 6] dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 4}, !!set {1, 4}] bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !Range 1..4, !Range 1..4, !Range 1..4] aft: [!Range 1..4, !Range 1..4, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 4}, !!set {}] a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}] ***/ % mzn2fzn and minizinc aborted on this model with an error message about % being unable to compute set bounds. This was fixed in r8782. % (This is derived from the talent scheduling model in the MiniZinc % benchmarks.) include "all_different.mzn"; int: numActors; % number of actors int: numScenes; % numer of scenes %-- Types --------------------------------------------------------------------- set of int: Actors = 1..numActors; set of int: Scenes = 1..numScenes; array[Actors,Scenes] of 0..1: ia; % 01 definition of actors in scenes array[Scenes] of set of Actors: a :: add_to_output = [ { j | j in Actors where ia[j,i] == 1} | i in Scenes] ; % actors for each scene array[Scenes] of int: d; % duration of each scene array[Actors] of int: c; % cost of each actor numScenes = 6; numActors = 4; ia = [| 1,0,0,0,1,1| 1,1,0,1,0,0| 0,1,1,0,1,0| 0,0,1,1,0,1|]; c = [1,1,1,1]; d = [1,2,3,4,5,6]; %-- Decision variables -------------------------------------------------------- array[Scenes] of var Scenes: s :: add_to_output; % schedule of scenes %-- Auxilliary variables ------------------------------------------------------ array[Scenes] of var set of Actors: bef :: add_to_output; % actors appearing before time t array[Scenes] of var set of Actors: aft :: add_to_output; % actors appearing after time t array[Scenes] of var set of Actors: dur :: add_to_output; % actors on set at time t var int: cost :: add_to_output; %-- Constraints --------------------------------------------------------------- constraint all_different(s); % each scene scheduled once constraint bef[1] = {} /\ % no actors before time 1 aft[numScenes] = {} /\ % no actors after time numScenes forall(t in 1..numScenes-1)( bef[t+1] = a[s[t]] union bef[t] /\ aft[t] = a[s[t+1]] union aft[t+1] ); constraint dur[1] = a[s[1]] /\ forall(t in 2..numScenes-1)( dur[t] = bef[t+1] intersect aft[t] ) /\ dur[numScenes] = a[s[numScenes]]; constraint cost = sum(i in Scenes)( sum(j in Actors)( c[j] * d[s[i]] * bool2int(j in dur[i]) ) ); %-- symmetry breaking constraint constraint s[1] < s[numScenes]; %-- Solving objective and solution output ------------------------------------- solve :: int_search(s, first_fail, indomain, complete) minimize cost; libminizinc-2.5.3/tests/spec/unit/regression/output_only_no_rhs.mzn0000644000175000017500000000015013757304533024426 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Error type: MiniZincTypeError ***/ var int: x :: output_only;libminizinc-2.5.3/tests/spec/unit/regression/makepar_output.mzn0000644000175000017500000000042313757304533023520 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result solution: !Solution _output_item: '1..1' ***/ % Used to crash due to trying to use the var version of binops in output % Fixed in b4510b996be58e2831daab37a18ccecc8a36ba6d var 1..10: x; var 1..10: y; output [show(x..y)];libminizinc-2.5.3/tests/spec/unit/regression/flipstrip_simple.mzn0000644000175000017500000000042613757304533024050 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution f1: 1 ***/ % flipstrip % miniimize the number of moves to turn all bools to true array[1..1] of bool: pos = [false]; var 1..1: f1; constraint false \/ not pos[f1]; solve satisfy; output [ "f1 = ",show(f1),";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug71_1.mzn0000644000175000017500000000022213757304533021622 0ustar kaolkaol/*** !Test expected: - !Result status: UNSATISFIABLE - !Error ***/ var int: x; constraint x = min (i in 3..2) ([1, 2, 3][i]); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/overloading.mzn0000644000175000017500000000061713757304533022776 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution b1: false b2: true ***/ % bug #1: the overloading was being handled wrongly, giving the wrong output % "b = true". predicate foo(set of int: x) = true; predicate foo(int: x) = false; var bool: b1 :: add_to_output = foo(3); var bool: b2 :: add_to_output = foo({42}); solve satisfy; output ["b1 = ", show(b1), "; b2 = ", show(b2), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug283.mzn0000644000175000017500000000100613757304533021470 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution A3: false B3: true - !Result solution: !Solution A3: true B3: false ***/ % Regression test for bug #283: mzn2fzn's optimization pass left dangling % variables in the bool_search/4 annotation below. var bool : A3; var bool : B3; constraint (A3 <-> (not B3)); solve :: seq_search([ bool_search([A3], input_order, indomain_min, complete)]) satisfy; output [ "A3 = ", show(A3), "\n", "B3 = ", show(B3), "\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug69_1.mzn0000644000175000017500000000033013757304533021631 0ustar kaolkaol/*** !Test expected: - !Result status: UNSATISFIABLE ***/ % A regression test for G12 bug #69. % var int: y; predicate p(var 1..10: x) = (x = y); constraint p(2063); solve satisfy; output ["y = ", show(y), "\n"]; libminizinc-2.5.3/tests/spec/unit/regression/float_opt_crash.mzn0000644000175000017500000000046013757304533023630 0ustar kaolkaol/*** !Test solvers: [gecode] options: all_solutions: true expected: !Result solution: !SolutionSet - !Solution x: 1.0 - !Solution x: 2.0 - !Solution x: null ***/ % Regression test for crash due to no opt float_dom definition var opt {1.0, 2.0}: x :: add_to_output; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/bug109.mzn0000644000175000017500000000252713757304533021476 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution p: - 1 - 2 - 1 - !Result solution: !Solution p: - 2 - 2 - 1 ***/ % Regression test for MiniZinc bug #109. % mzn2fzn 1.1 was incorrectly flattening predicate arguments in a reifying % context. Thiw as leading to the generated model instance being % inconsistent. % Smullyan Knights and Knaves problems in MiniZinc. % % % These are the problems 26 to 35 from Raymond Smullyan's wonderful book % "What is the name of this book? - The riddle of dracula and % other logical puzzles". % % % Model created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc int: knight = 1; % alway tells the truth int: knave = 2; % always lies array[1..3] of var {knight, knave}: p; % a knight always speaks the truth % a knave always lies % % says(kind of person, what the person say) % predicate says(var int: kind, var bool: says) = (kind = knight /\ says = true ) \/ (kind = knave /\ says = false ) ; constraint %% Problem 27 %% B: A said that there are exactly 1 knights %% C: B is a knave %% What are B and C %% Solution: B: knave, C: knight says(p[2], says(p[1], 1 = sum(i in 1..3) (bool2int(p[i] = 1)))) /\ says(p[3], p[2] = knave); solve satisfy; output ["p = ", show(p), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug110.mzn0000644000175000017500000000145513757304533021465 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution board: - [0, 0, 0, 0, 0] - [0, 0, 0, 0, 0] - [0, 0, 0, 0, 0] - [0, 0, 0, 0, 0] - [0, 0, 0, 0, 0] - !Result solution: !Solution board: - [2, 2, 2, 2, 2] - [2, 2, 2, 2, 2] - [2, 2, 2, 2, 2] - [2, 2, 2, 2, 2] - [2, 2, 2, 2, 2] ***/ % vim: et ts=4 % Cut down version of MiniZinc bug 110. % When flattened with mzn2fzn 1.1 this model results in negative % (and more generally out-of-bounds) array accesses. array[1..5,1..5] of var 0..2: board; constraint forall(row,col in 1..5) ( ( board[row, col] = 1 -> forall(i in 1..5) ( (((row-i > 0) /\ (col-i > 0)) -> (board[row-i,col-i] < 2)) ) ) ); solve satisfy; output ["board = ", show(board), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/decision_tree_binary.mzn0000644000175000017500000000765513757304533024656 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result solution: !Solution node_used: [3, 4, 6, 9, 11, 13, 15, 8, 9, 10, 11, 12, 13, 14, 15] x: [6, 2, 6, 2, 4, 6, 8, 1, 2, 3, 4, 5, 6, 7, 8] ***/ % Regression test for a problem in mzn2fzn 1.2 where log/2 % was not recognised as a built-in operation by the flattening % engine. % THe model is from: http://www.hakank.org/minizinc/decision_tree_binary.mzn % Decision tree in MiniZinc. % % Simple zero sum binary decision trees. % % % Model created by Hakan Kjellerstrand, hakank@bonetmail.com % The model only handles complete binary trees of sizes % n = (a**2) - 1, for some a. The values are at the lowest level. % % Example with n = 7 % % x1 A maximizes % /\ % x2 x3 B minimizes % / \ /\ % x4 x5 x6 x7 (A) % % The value nodes (the last level): % x4 = 6 % x5 = 1 % x6 = 5 % x7 = 3 % % First B minimizes the last level (x4..x7): % x2 = argmin(x5, x4) -> x2 = x5 % x3 = argmin(x6, x7) -> x3 = x7 % % A then maximizes from B's choices as the last step: % x1 = argmax( x3, x2) -> x1 = x3 % % % The solution is a decision tree represented here as as: % % % x (the values): % 3 % 1 3 % 6 1 5 3 % % node_used: % 3 % 5 7 % 4 5 6 7 % % minizinc and fz can handle n as large as 4095 (2**12-1) % without breaking much sweat. % For n = 8191 (2**13-1), it core dumps however. % int: n; % must be a (a**2) - 1, for some a, e.g. 7, 15, 31, 63 etc int: levels = n div 2; % the number of levels array[1..n] of var int: x; % the decision variables, the value tree array[1..n] of var 1..n: node_used; % the nodes indices % % tree_levels contains the levels in the tree, e.g. % [1, 2,2, 3,3,3,3, 4,4,4,4,4,4,4,4, ....] % for odd levels: A is trying to maximize his/her gain, % for even levels B is trying to minimize A's gains % array[1..n] of 0..n: tree_levels = [1+floor(log(2.0,int2float(i))) | i in 1..n ]; % solve :: int_search(x, "first_fail", "indomain", "complete") satisfy; solve satisfy; % % argmax: maximize A's values % predicate argmax(array[int] of var int: x, int: i1, int: i2, array[int] of var int: node_used, int: node_used_ix) = (x[i1] >= x[i2] -> node_used[node_used_ix] = i1) /\ (x[i1] < x[i2] -> node_used[node_used_ix] = i2) ; % argmin: minimize A's values predicate argmin(array[int] of var int: x, int: i1, int: i2, array[int] of var int: node_used, int: node_used_ix) = (-x[i1] >= -x[i2] -> node_used[node_used_ix] = i1) /\ (-x[i1] < -x[i2] -> node_used[node_used_ix] = i2) ; predicate cp1d(array[int] of var int: x, array[int] of var int: y) = assert(index_set(x) = index_set(y), "cp1d: x and y have different sizes", forall(i in index_set(x)) ( x[i] = y[i] ) ) ; constraint % the first 1..n div 2 in x is to be decided by the model, % the rest is the node values. cp1d(x, [_, _,_, _,_, _,_, 1,2, 3,4, 5,6, 7,8]) % n = 15 /\ % the last n div 2 positions (the node "row") in node_used is static forall(i in levels+1..n) ( node_used[i] = i % more general: makes the node value 1.. . % Comment it if another tree should be used. % /\ x[i] = -(n - i - levels) + 1 ) /\ % the first n div 2 positions and values are dynamic, % the rest are static. forall(i in 1..levels) ( x[i] = x[node_used[i]] ) /\ % Should we maximize or minimize? % It depends on the level. forall(i in 1..levels) ( if tree_levels[i] mod 2 = 1 then argmax(x, 2*i, 2*i+1, node_used, i) else argmin(x, 2*i, 2*i+1, node_used, i) endif ) ; % A "nice tree" (OK, it's not so nice. :-) output ["x (the values):\n" , show(x[1])] ++ [ if tree_levels[i] > tree_levels[i-1] then "\n" else " " endif ++ show(x[i]) | i in 2..n ] ++ ["\n\nnode_used:\n", show(node_used[1])] ++ [ if tree_levels[i] > tree_levels[i-1] then "\n" else " " endif ++ show(node_used[i]) | i in 2..n ] ++ ["\n"]; n = 15; libminizinc-2.5.3/tests/spec/unit/regression/parse_assignments.mzc.mzn0000644000175000017500000000005213757304533024773 0ustar kaolkaolbool: x :: add_to_output; output ["Ok"]; libminizinc-2.5.3/tests/spec/unit/regression/test_bug66.mzn0000644000175000017500000000035113757304533022450 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution s1: !set {1} s2: !Range 1..2 ***/ var set of 1..1: s1; var set of 1..3: s2; constraint s2 = s1 union if 1 in s1 then {2} else {3} endif; solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/checker_var_bug.mzc.mzn0000644000175000017500000000001413757304533024355 0ustar kaolkaolvar 1..2: x;libminizinc-2.5.3/tests/spec/unit/regression/checker_var_bug.mzn0000644000175000017500000000032513757304533023572 0ustar kaolkaol/*** !Test solvers: [gecode] extra_files: - checker_var_bug.mzc.mzn expected: - !Result solution: !Solution _checker: "x = 1;\n" - !Result solution: !Solution _checker: "x = 2;\n" ***/ solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/test_bug65.mzn0000644000175000017500000000036713757304533022456 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ include "globals.mzn"; function array[int] of $T: mrow(array[int, int] of $T: x, int: r) = [x[r,i] | i in index_set_2of2(x)]; constraint all_different(mrow([|1,2|2,3|],1)); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/bug244.mzn0000644000175000017500000000151713757304533021474 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution b: false i: 0 - !Solution b: true i: 1 - !Solution b: false i: 2 - !Solution b: false i: 3 options: all_solutions: true ***/ % Regression test for bug #244: when asked for all solutions (with G12/FD) % this model did not produce the solution (i = 0, b = false). The problem % was that the flattening of the reified array lookup in the constraint was % incorrect. We were emitting (in pseudcode): % % (i = i' <-> i <= size(arr)) /\ i >= 1 % % rather than % % (i = i' <-> i (i >= 1 /\ i <= size(arr))) % % i' is the fesh index variable. var 0..3: i; var bool: b; array[1..2] of bool: arr = [true, false]; constraint b = arr[i]; solve satisfy; output [ "b = ", show(b), ";\n", "i = ", show(i), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/bug380.mzn0000644000175000017500000000304513757304533021473 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution a: - [false, false, false, false] - [false, false, false, false] - [false, false, false, false] - [false, false, false, false] d: [3, 3, 3, 3] ***/ % Regression test for bug #380 - the body of the lex_leq_bool_half was being % flattened in a reified context. (The reification context was not being % correctly reset after the application arguments had been flattened.) int: n = 4; set of int: N = 1..n; array[N,N] of var bool: a; array[N] of var 3..n-1: d; int: i = 2; constraint lex_lesseq_bool_half([ a[i,j+1] | j in N where j != i /\ j != i+1 ], [ a[i,j] | j in N where j != i /\ j != i+1 ], d[i] = d[i+1] ); solve satisfy; output ["d = array1d(1..4, ", show(d), ");\n"]; % half reified version of lex_lesseq for Booleans, that is % h -> lex_lesseq(x,y) predicate lex_lesseq_bool_half(array[int] of var bool: x, array[int] of var bool: y, var bool: h) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = max(ux - lx, uy - ly), array[0..size] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (h -> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ if i = size then true else x[lx + i] < y[ly + i] \/ b[i+1] endif ) ); libminizinc-2.5.3/tests/spec/unit/regression/test_parout.mzn0000644000175000017500000000060513757304533023033 0ustar kaolkaol/*** --- !Test solvers: [gecode, chuffed] expected: - !Result status: SATISFIED solution: !Solution x: 10 y: -2147483646 - !Result status: SATISFIED solution: !Solution x: 10 y: 11 --- !Test solvers: [cbc] expected: !Error {} ***/ int: X = 10; var int: x :: add_to_output = X; var int: y :: add_to_output; constraint x != y; solve satisfy; output ["\(x) \(y)\n"]; libminizinc-2.5.3/tests/spec/unit/regression/bug52.mzn0000644000175000017500000000067513757304533021415 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x1d1: 3 x1d9: 10 ***/ % A regression test for G12 bug #52. % array[1..3,1..3] of var int: x; array[1..9] of var int: x1d = [x[w,h] | w in 1..3, h in 1..3]; var int: x1d1 :: add_to_output = x1d[1]; var int: x1d9 :: add_to_output = x1d[9]; constraint x[1, 1] = 3; constraint x[3, 3] = 10; solve satisfy; output [ "x1d1 = ", show(x1d1), ";\n", "x1d9 = ", show(x1d9), ";\n" ]; libminizinc-2.5.3/tests/spec/unit/regression/coerce_set_to_array_2.mzn0000644000175000017500000000044013757304533024713 0ustar kaolkaol/*** !Test expected: !Error ***/ % Should give an error because sets of floats cannot be coerced to arrays. % Used to work due to set of float being incorrectly made a subtype of array of float. function bool: foo(array [int] of float: x) = true; bool: x :: add_to_output = foo({1.0}); libminizinc-2.5.3/tests/spec/unit/regression/arg-reif-array-float.mzn0000644000175000017500000000057213757304533024400 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: !Result solution: !SolutionSet - !Solution a: 1 - !Solution a: 2 - !Solution a: 3 options: all_solutions: true ***/ var 1..3: a; predicate test_pred(array[int] of 1.0..10.0: x, var int: y) = y = 3; constraint test_pred([1.0, 2.0, 4.0, 11.0], a) == false; solve satisfy; output ["a = ", show(a), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/test_bug54.mzn0000644000175000017500000000134513757304533022451 0ustar kaolkaol/*** --- !Test solvers: [gecode] options: all_solutions: true expected: !Result status: ALL_SOLUTIONS solution: - !Solution x: 7 y: 1 z: 7 --- !Test # Workaround for chuffed all-solution issue solvers: [chuffed] expected: !Result status: SATISFIED solution: !Solution x: 7 y: 1 z: 7 ***/ function var int:mydiv(var int: x, var int: y) = let {constraint y != 0 } in safediv(x, y) ; function var int: safediv(var int: x, var int: y) :: promise_total = let { var 0..ub(x): q; var 0..ub(y)-1: r; constraint q*y + r = x; constraint r < y; } in q; var int: x; var int: y; var int: z; constraint x = 7; constraint y = 1; constraint z = mydiv(x,y); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/test_github_30.mzn0000644000175000017500000000063013757304533023303 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution X: - [3, 0, 0, 0] - [3, 0, 0, 0] - !Result solution: !Solution X: - [3, 10, 10, 10] - [3, 10, 10, 10] ***/ set of int: smallset = 0..10; array[1..2, 1..4] of var smallset: X; constraint forall( i in 1..2 ) ( let { array[int] of var smallset: Y = row(X, i); } in Y[1] == 3 % Any use of Y triggers the issue. ); solve satisfy;libminizinc-2.5.3/tests/spec/unit/regression/bug141.mzn0000644000175000017500000000120613757304533021463 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - !Result solution: !Solution x: - 9 - 9 - 9 - 9 - 9 - 9 - 9 - 9 - 9 ***/ % Regression test for bug #141. % In mzn2fzn 1.1.5 'x' was not being marked as an output variable in the % generated FlatZinc because the code that processed output items was % ignoring the assignments for any let variables. array[1..9] of var 1..9: x; solve satisfy; output let { array[1..9] of 1..99: y = [ sum(s2 in 1..9)( fix(x[s2]) ) | s in 1..9 ] } in [ show(y) ]; libminizinc-2.5.3/tests/spec/unit/regression/int_times.mzn0000644000175000017500000000023613757304533022455 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: 1 ***/ % Used to give UNSATISFIABLE var {1}: x; constraint int_times(1, 1, x); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/float_div_crash.mzn0000644000175000017500000000014513757304533023610 0ustar kaolkaol/*** !Test expected: !Error type: MiniZincTypeError ***/ float: x :: add_to_output = 2.0 div 1.0; libminizinc-2.5.3/tests/spec/unit/regression/bug341.mzn0000644000175000017500000000212013757304533021461 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution S: - !Range 1..3 - !Range 4..6 - !Result solution: !Solution S: - !!set {} - !!set {} ***/ % Regression test for bug #341: mzn2fzn 1.5.0 was incorrectly tightening the % bounds on the array S to 4..3. The problem was that the bounds inferred for % each element of the array (which may differ) were being applied to the array % as a whole. array[1..2] of var set of 1..6: S; constraint S[1] subset {1,2,3} /\ S[2] subset {4,5,6} ; solve satisfy; output [ "S = array1d(1..2, ", show(S), ";" ]; libminizinc-2.5.3/tests/spec/unit/regression/var_self_assign_bug.mzn0000644000175000017500000000125213757304533024463 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution partitions: - !!set {1, 2, 3} - !!set {1, 2, 3} - !!set {1, 2, 3} - !Result solution: !Solution partitions: - !Range 1..3 - !Range 1..3 - !Range 1..3 - !Result solution: !Solution partitions: - !!set {} - !!set {} - !!set {} ***/ % Regression test for a bug in mzn2fzn version 1.2 (and up to % r13389 on the trunk). The following model used to result in % variable declaration with a self-assignment being produced % by mzn2fzn. array[1..3] of var set of {1,2,3}: partitions :: add_to_output; constraint array_union(partitions) == array_union(partitions); solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/bool2float_let.mzn0000644000175000017500000000023413757304533023367 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution {} ***/ constraint let { var float: x = true } in x >= 0.0 ; solve satisfy; libminizinc-2.5.3/tests/spec/unit/regression/assign_reverse_map.mzn0000644000175000017500000000213513757304533024336 0ustar kaolkaol/*** !Test solvers: [gecode] expected: - !Result solution: !Solution x: 2 ***/ % Test a simple equality constraint after creating a encoding with a reverse mapper. % The correct behaviour is that this needs to be posted as a constraints. % Previously an optimisation would simply change the domain, which is incorrect once the encoding has been created. var 1..2: x; array[int] of var bool: x_enc = unary_encode(x); constraint x = 2; % Simple unary SAT encoding for integers with two options function array[int] of var bool: unary_encode(var int: x) ::promise_total = let { array[lb(x)..ub(x)] of var bool: x_enc::expression_name("unary_encoding"); constraint ub(x) - lb(x) = 1; constraint bool_not(x_enc[lb(x)], x_enc[ub(x)]); constraint (x = reverse_unary(x_enc))::is_reverse_map; } in x_enc; predicate int_eq(var int: x, int: y) = let { array[int] of var bool: x_enc = unary_encode(x); } in x_enc[y]; % Reverse mappings (unary to integer) function var int: reverse_unary(array[int] of var bool: x_enc); function int: reverse_unary(array[int] of bool: x_enc) = arg_max(x_enc); libminizinc-2.5.3/tests/spec/unit/regression/bug70.mzn0000644000175000017500000000260613757304533021411 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution x: - 3 - 2 - 1 - !Result solution: !Solution x: - 2 - 4 - 1 - !Result solution: !Solution x: - 1 - 2 - 4 - !Result solution: !Solution x: - 1 - 3 - 2 - !Result solution: !Solution x: - 2 - 3 - 4 - !Result solution: !Solution x: - 4 - 1 - 3 - !Result solution: !Solution x: - 4 - 3 - 2 - !Result solution: !Solution x: - 3 - 4 - 1 - !Result solution: !Solution x: - 1 - 2 - 3 ***/ % Regression test for bug #70: set2array coercions were not supported. include "global_cardinality_low_up.mzn"; predicate my_global_cardinality_low_up(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound) = forall(i in index_set(cover)) ( sum(j in index_set(x)) ( bool2int(x[j] = cover[i]) ) in lbound[i]..ubound[i] ); predicate myall_different(array[int] of var int: x) = global_cardinality_low_up( x, set2array(dom_array(x)), [0 | i in dom_array(x)], [1 | i in dom_array(x)]); array[1..3] of var 1..4: x; constraint myall_different(x); solve :: int_search(x, input_order, indomain_min, complete) satisfy; output ["x = ", show(x), ";\n"]; libminizinc-2.5.3/tests/spec/unit/regression/comprehension_where.mzn0000644000175000017500000000045213757304533024525 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED ***/ % Used to give UNSATISFIABLE due to introducing a call for the array comprehension. array [1..1] of var 0..1: x; array [1..1] of var 1..1: y; constraint absent(z[1]); array [1..1] of var opt 1..1: z = [y[x[i]] | i in 1..1 where x[i] != 0]; libminizinc-2.5.3/tests/spec/unit/regression/subsets_100.mzn0000644000175000017500000000472513757304533022541 0ustar kaolkaol/*** !Test solvers: [gecode, chuffed] expected: - !Result status: SATISFIED solution: !Solution s: !Range 1..9 t: !!set {45} s_total: 45 t_total: 45 - !Result status: SATISFIED solution: !Solution s: !!set {100} t: !!set {49, 51} s_total: 100 t_total: 100 - !Result status: SATISFIED solution: !Solution s: !!set {1, 2, 40, 56, 94} t: !!set {3, 93, 97} s_total: 193 t_total: 193 ***/ % Regression test for a bug in mzn2fzn 1.2. The optimisation pass was leaving % dangling references to variables it had "eliminated". The symptom was the % following error from the FlatZinc interpreter: % % subsets_100.fzn:413: % symbol error: `INT____407' undeclared % % (This model is from the original bug report.) % Subsets 100 puzzle in MiniZinc. % % From rec.puzzle FAQ % http://brainyplanet.com/index.php/Subsets?PHPSESSID=051ae1e2b6df794a5a08fc7b5ecf8028 % """ % Out of the set of integers 1,...,100 you are given ten different integers. % From this set, A, of ten integers you can always find two disjoint non-empty % subsets, S & T, such that the sum of elements in S equals the sum of elements % in T. Note: S union T need not be all ten elements of A. Prove this. % """ % % This MiniZinc model was created by Hakan Kjellerstrand, hakank@bonetmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc % % Note that this model is not run using CBC % This is because the solutions listed are not exhaustive, so we would usually check against another solver % However we cannot do this because when giving values for s or t then sum_set does not work % As the ub for the set will simply be the set itself, summing the wrong numbers include "globals.mzn"; int: n = 100; int: m = 10; var set of 1..n: s; var set of 1..n: t; var int: s_total; var int: t_total; % % sums the integer in set ss % predicate sum_set(var set of int: ss, var int: total) = let { int: m = card(ub(ss)), % NOTE: This prevents checking of solutions since when fixing ss then card(ub(ss))=card(ss) so numbers are not summed correctly when checking array[1..m] of var 0..1: tmp } in forall(i in 1..m) ( i in ss <-> tmp[i] = 1 ) /\ total = sum(i in 1..m) (i*tmp[i]) ; solve :: set_search([s,t], input_order, indomain_min, complete) satisfy; constraint card(s union t) <= m /\ card(s union t) > 0 /\ disjoint(s, t) /\ sum_set(s, s_total) /\ sum_set(t, t_total) /\ s_total = t_total % /\ % t_total = n ; libminizinc-2.5.3/tests/spec/unit/regression/is_fixed_comp.mzn0000644000175000017500000000041713757304533023273 0ustar kaolkaol/*** !Test expected: - !Result solution: !Solution len: 1 ***/ array[1..2] of var bool: x = [true, _]; var int: len ::add_to_output; constraint len = let { array[int] of var bool: x_fixed = [x[i] | i in index_set(x) where is_fixed(x[i])]; } in length(x_fixed); libminizinc-2.5.3/tests/spec/unit/param_file/0000755000175000017500000000000013757304533017652 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/param_file/param_file_array.json0000644000175000017500000000007713757304533024046 0ustar kaolkaol{ "-D": [ "x = true;", "y = false;" ] }libminizinc-2.5.3/tests/spec/unit/param_file/param_file_nested_object.mzn0000644000175000017500000000040713757304533025370 0ustar kaolkaol/*** --- !Test solvers: [gecode] options: all_solutions: true extra_files: - param_file_nested_object.mpc expected: !Result status: SATISFIED solution: - !Solution x: 1 ***/ var 1..10: x; solve :: int_search([x], input_order, indomain_min) satisfy; libminizinc-2.5.3/tests/spec/unit/param_file/param_file_blacklist.mzn0000644000175000017500000000042613757304533024531 0ustar kaolkaol/*** --- !Test solvers: [gecode] extra_files: - param_file_blacklist_1.mpc expected: !Error regex: .*not allowed in configuration file.* --- !Test solvers: [gecode] extra_files: - param_file_blacklist_2.mpc expected: !Error regex: .*not allowed in configuration file.* ***/ libminizinc-2.5.3/tests/spec/unit/param_file/param_file_resolution.mpc0000644000175000017500000000010713757304533024733 0ustar kaolkaol{ "param-file": "file_resolution/param_file_resolution_inner.mpc" }libminizinc-2.5.3/tests/spec/unit/param_file/param_file_resolution.mzn0000644000175000017500000000026613757304533024766 0ustar kaolkaol/*** --- !Test solvers: [gecode] extra_files: - param_file_resolution.mpc expected: !Result status: SATISFIED solution: !Solution x: 1 y: 2 ***/ include "included.mzn"; libminizinc-2.5.3/tests/spec/unit/param_file/param_file_blacklist_1.mpc0000644000175000017500000000002413757304533024716 0ustar kaolkaol{ "help": true }libminizinc-2.5.3/tests/spec/unit/param_file/param_file_nested_object.mpc0000644000175000017500000000006313757304533025341 0ustar kaolkaol{ "backend-flags": { "-node": 1 } }libminizinc-2.5.3/tests/spec/unit/param_file/param_file_recursive.mzn0000644000175000017500000000022013757304533024560 0ustar kaolkaol/*** --- !Test solvers: [gecode] extra_files: - param_file_recursive.mpc expected: !Error regex: .*Cyclic parameter configuration file.* ***/ libminizinc-2.5.3/tests/spec/unit/param_file/param_file_array.mzn0000644000175000017500000000036613757304533023702 0ustar kaolkaol/*** --- !Test solvers: [gecode] options: param-file: './spec/unit/param_file/param_file_array.json' expected: !Result status: SATISFIED solution: !Solution x: true y: false ***/ bool: x :: add_to_output; bool: y :: add_to_output; libminizinc-2.5.3/tests/spec/unit/param_file/param_file_recursive.mpc0000644000175000017500000000006013757304533024535 0ustar kaolkaol{ "param-file": "param_file_recursive.mpc" }libminizinc-2.5.3/tests/spec/unit/param_file/param_file_blacklist_2.mpc0000644000175000017500000000003013757304533024714 0ustar kaolkaol{ "--help": "blah" }libminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/0000755000175000017500000000000013757304533023054 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/param_file_resolution_inner.mpc0000644000175000017500000000026613757304533031336 0ustar kaolkaol{ "data": [ "inner_directory/data_file.dzn", "inner_directory/data_file.json" ], "model": "inner_directory/model_file.mzn", "search-dir": "includes" }libminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/inner_directory/0000755000175000017500000000000013757304533026253 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/inner_directory/model_file.mzn0000644000175000017500000000003013757304533031071 0ustar kaolkaolint: y :: add_to_output;libminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/inner_directory/data_file.json0000644000175000017500000000001613757304533031053 0ustar kaolkaol{ "y": 2 }libminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/inner_directory/data_file.dzn0000644000175000017500000000000613757304533030674 0ustar kaolkaolx = 1;libminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/includes/0000755000175000017500000000000013757304533024662 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/param_file/file_resolution/includes/included.mzn0000644000175000017500000000003013757304533027170 0ustar kaolkaolint: x :: add_to_output;libminizinc-2.5.3/tests/spec/unit/division/0000755000175000017500000000000013757304533017377 5ustar kaolkaollibminizinc-2.5.3/tests/spec/unit/division/test_div5.mzn0000644000175000017500000000016513757304533022035 0ustar kaolkaol/*** !Test expected: !Result status: UNSATISFIABLE ***/ var 0..1: x; constraint 1 div x != 1; solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div8.mzn0000644000175000017500000000037513757304533022043 0ustar kaolkaol/*** !Test solvers: [gecode, cbc] expected: - !Result status: SATISFIED solution: !Solution y: 0 - !Result status: SATISFIED solution: !Solution y: 1 ***/ var 0..1: y; constraint not ( 2 div y + 2 div (y - 1) == 0 ); solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div9.mzn0000644000175000017500000000023713757304533022041 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution y: 1 ***/ var 0..2: y; constraint 2 div y + 2 div (y - 2) == 0 ; solve satisfy;libminizinc-2.5.3/tests/spec/unit/division/test_div1.mzn0000644000175000017500000000022313757304533022024 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: 0 ***/ var 0..1: x; constraint not (1 div x = 1); solve satisfy;libminizinc-2.5.3/tests/spec/unit/division/test_div7.mzn0000644000175000017500000000023513757304533022035 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution y: 1 ***/ var 0..1: y; constraint not(y < 1 \/ 1 div y != 1); solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div10.mzn0000644000175000017500000000030113757304533022101 0ustar kaolkaol/*** !Test solvers: [gecode, cbc] expected: !Result status: SATISFIED solution: !Solution y: 1 ***/ var 0..1: y; constraint y == 1 \/ 2 div y + 2 div (y - 1) == 0 ; solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div11.mzn0000644000175000017500000000037713757304533022117 0ustar kaolkaol/*** !Test solvers: [gecode, cbc] expected: - !Result status: SATISFIED solution: !Solution y: 0 - !Result status: SATISFIED solution: !Solution y: 1 ***/ var 0..1: y; constraint true \/ 2 div y + 2 div (y - 1) == 0 ; solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div3.mzn0000644000175000017500000000027313757304533022033 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution i: 4 ***/ array [1..3] of int: x = [1, 4, 9]; var 1..4: i; constraint i <= 3 -> x[i] > 10; solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div6.mzn0000644000175000017500000000023513757304533022034 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution y: 0 ***/ var 0..1: y; constraint y < 1 \/ not (1 div y = 1); solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div12.mzn0000644000175000017500000000377213757304533022122 0ustar kaolkaol/*** !Test solvers: [gecode] expected: !Result status: OPTIMAL_SOLUTION solution: !Solution aCostSupport: 0 mdl8_Z: 0 ***/ %%%%%% Regression test for the "missing builtin mzn_in_root_context" resolved @227ce089 int: nOBJCOEFDIVISOR__MIP = 10000; %%% Objective coefficient divisor to adapt magnitude in MIP int: nOBJCOEFDIVISOR__CP = 1000; %%% Objective coefficient divisor to adapt magnitude in CP int: nOBJLENGTHDISCR = 1000; %%% Length measure discretizer to improve objective precision (in CP) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CONSTRAINTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function var int: CostScaledByDiscrLength(var int: L, float: unit_cost, float: costDivisor, float: lengthDiscr) = CostScaledByDiscrLength__useDIV(L, unit_cost, costDivisor, lengthDiscr); function var int: CostScaledByDiscrLength__useDIV(var int: L, float: unit_cost, float: costDivisor, float: lengthDiscr) = let { int: lengthDiscrCeil = ceil(lengthDiscr); } in ((L + lengthDiscrCeil - 1) div lengthDiscrCeil) * ceil(unit_cost * lengthDiscrCeil / costDivisor); function var int: CostScaledByDiscrLength__useMULT(var int: L, float: unit_cost, float: costDivisor, float: lengthDiscr) = let { var int: L_scaled; %% Manual decomp: OR-TOOLS 8.0.8 says "TIMEOUT, unknown" int: lengthDiscrCeil = ceil(lengthDiscr); %% But it could be better, as suggested by Gurobi constraint L <= %% Assume L is minimized L_scaled * lengthDiscrCeil ; } in L_scaled * ceil(unit_cost * lengthDiscrCeil / costDivisor); %%%%%%%%%%%%%%%% SUPPORT COSTS %%%%%%%%%%%%%%%%%%%%%%%%%%% var 0..1000000000: aCostSupport; var 0..0: mdl8_Z; constraint aCostSupport >= CostScaledByDiscrLength( mdl8_Z, 42240, nOBJCOEFDIVISOR__CP, nOBJLENGTHDISCR ) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SOLVE + OBJECTIVE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solve minimize aCostSupport; libminizinc-2.5.3/tests/spec/unit/division/test_div4.mzn0000644000175000017500000000023213757304533022027 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution x: 1 ***/ var 0..1: x; constraint not (not (1 div x = 1)); solve satisfy; libminizinc-2.5.3/tests/spec/unit/division/test_div2.mzn0000644000175000017500000000023013757304533022023 0ustar kaolkaol/*** !Test expected: !Result status: SATISFIED solution: !Solution y: 0 ***/ var 0..1: y; constraint y < 1 \/ 1 div y != 1; solve satisfy; libminizinc-2.5.3/tests/spec/sudoku/0000755000175000017500000000000013757304533016106 5ustar kaolkaollibminizinc-2.5.3/tests/spec/sudoku/sudoku_4_16x16.dzn0000644000175000017500000000150713757304533021230 0ustar kaolkaolS=4; puzzle_input=[| 0, 0, 6, 10, 0, 7, 8, 0, 1, 14, 9, 0, 0, 11, 0, 0| 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 7, 0, 12, 0, 0, 0| 2, 0, 8, 15, 0, 0, 0, 0, 0, 10, 0, 3, 0, 6, 0, 4| 0, 5, 0, 0, 6, 0, 3, 14, 0, 0, 0, 0, 0, 8, 0, 10| 0, 0, 2, 0, 0, 0, 6, 16, 0, 1, 12, 0, 11, 0, 0, 0| 13, 15, 0, 0, 8, 2, 7, 0, 10, 0, 16, 0, 0, 0, 0, 12| 10, 0, 16, 0, 14, 0, 9, 0, 0, 3, 6, 2, 7, 0, 0, 8| 6, 0, 0, 0, 0, 15, 0, 1, 8, 0, 0, 13, 4, 0, 10, 0| 0, 2, 0, 6, 5, 0, 0, 8, 12, 0, 1, 0, 0, 0, 0, 14| 3, 0, 0, 5, 2, 16, 4, 0, 0, 13, 0, 14, 0, 12, 0, 6| 8, 0, 0, 0, 0, 3, 0, 10, 0, 4, 11, 6, 0, 0, 1, 16| 0, 0, 0, 16, 0, 9, 12, 0, 15, 2, 0, 0, 0, 7, 0, 0| 1, 0, 7, 0, 0, 0, 0, 0, 16, 11, 0, 10, 0, 0, 2, 0| 4, 0, 10, 0, 11, 0, 1, 0, 0, 0, 0, 0, 5, 13, 0, 7| 0, 0, 0, 13, 0, 8, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0| 0, 0, 11, 0, 0, 14, 16, 7, 0, 5, 4, 0, 10, 15, 0, 0 |]; libminizinc-2.5.3/tests/spec/sudoku/sudoku.mzn0000644000175000017500000001306413757304533020152 0ustar kaolkaol/*** --- !Test extra_files: [sudoku_1_16x16.dzn] solvers: [cbc, chuffed] check_against: [cbc, chuffed] expected: !Result solution: !Solution {} --- !Test extra_files: [sudoku_2_16x16.dzn] solvers: [cbc, chuffed] check_against: [cbc, chuffed] expected: !Result solution: !Solution {} --- !Test extra_files: [sudoku_3_16x16.dzn] solvers: [cbc, chuffed] check_against: [cbc, chuffed] expected: !Result solution: !Solution {} --- !Test extra_files: [sudoku_4_16x16.dzn] solvers: [cbc, chuffed] check_against: [cbc, chuffed] expected: !Result solution: !Solution {} --- !Test extra_files: [sudoku_5_16x16.dzn] solvers: [cbc, chuffed] check_against: [cbc, chuffed] expected: !Result solution: !Solution {} ***/ %-----------------------------------------------------------------------------% % Sudoku for squares of arbitrary size N = (S x S) %-----------------------------------------------------------------------------% %int: S=3; %int: N = S * S; %array[1..N,1..N] of int: puzzle_input=[| %0, 0, 0, 0, 0, 0, 0, 0, 0| %0, 6, 8, 4, 0, 1, 0, 7, 0| %0, 0, 0, 0, 8, 5, 0, 3, 0| %0, 2, 6, 8, 0, 9, 0, 4, 0| %0, 0, 7, 0, 0, 0, 9, 0, 0| %0, 5, 0, 1, 0, 6, 3, 2, 0| %0, 4, 0, 6, 1, 0, 0, 0, 0| %0, 3, 0, 2, 0, 7, 6, 9, 0| %0, 0, 0, 0, 0, 0, 0, 0, 0| %|]; int: S; int: N=S*S; array[1..N,1..N] of int: puzzle_input; %int: S=4; %int: N=S*S; %array[1..N,1..N] of int: puzzle_input=[| %13, 4, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 11, 0, 14, 10| %9, 12, 14, 5, 7, 0, 0, 15, 0, 0, 0, 0, 0, 2, 1, 0| %2, 15, 0, 6, 16, 0, 10, 9, 0, 0, 0, 0, 0, 5, 3, 0| %0, 0, 1, 0, 5, 0, 14, 0, 0, 0, 0, 0, 9, 6, 0, 0| %0, 0, 0, 0, 10, 12, 0, 5, 0, 0, 13, 0, 0, 0, 6, 8| %0, 0, 0, 0, 8, 0, 9, 0, 2, 0, 0, 14, 16, 0, 0, 11| %0, 0, 0, 0, 0, 0, 6, 7, 9, 0, 0, 0, 5, 15, 13, 12| %0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2, 0, 0, 3| %16, 9, 15, 10, 0, 0, 0, 4, 0, 6, 0, 2, 0, 0, 0, 0| %0, 13, 0, 3, 0, 11, 0, 0, 0, 4, 1, 16, 0, 0, 0, 0| %0, 0, 8, 12, 6, 7, 16, 0, 0, 5, 0, 0, 0, 0, 0, 0| %0, 2, 11, 0, 1, 0, 0, 0, 10, 13, 12, 0, 0, 0, 0, 0| %4, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9| %3, 6, 0, 0, 0, 0, 0, 0, 12, 1, 11, 8, 14, 0, 0, 5| %0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 7, 10, 15, 11, 0, 4| %0, 11, 10, 1, 0, 0, 0, 0, 0, 0, 15, 9, 6, 0, 7, 0|]; %int: S=5; %int: N=S*S; %array[1..N,1..N] of int: puzzle_input=[| %0, 12, 0, 25, 10, 0, 0, 0, 11, 24, 2, 0, 0, 0, 14, 23, 0, 9, 0, 0, 19, 0, 4, 0, 3| %0, 14, 0, 4, 1, 0, 15, 21, 2, 0, 0, 0, 13, 12, 0, 0, 0, 20, 24, 0, 0, 0, 8, 18, 5| %0, 18, 0, 9, 17, 0, 0, 6, 0, 5, 0, 0, 21, 24, 0, 19, 0, 0, 10, 16, 0, 0, 23, 0, 0| %16, 23, 0, 0, 0, 0, 25, 10, 14, 0, 22, 0, 0, 1, 6, 0, 7, 0, 0, 0, 0, 0, 20, 24, 0| %0, 0, 0, 0, 0, 7, 0, 0, 0, 12, 19, 0, 0, 15, 0, 0, 5, 6, 0, 0, 22, 0, 0, 16, 0| %0, 17, 10, 0, 0, 0, 0, 0, 0, 11, 0, 12, 24, 0, 0, 6, 21, 0, 18, 0, 0, 19, 0, 0, 0| %0, 13, 0, 19, 0, 0, 0, 0, 21, 1, 10, 15, 22, 11, 0, 0, 16, 0, 25, 0, 23, 0, 5, 0, 0| %9, 22, 0, 11, 15, 12, 18, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 23, 10, 17, 0, 0, 0| %0, 0, 0, 2, 0, 0, 0, 24, 0, 25, 0, 13, 0, 23, 0, 0, 0, 0, 4, 0, 15, 9, 22, 0, 21| %0, 24, 21, 3, 23, 6, 0, 15, 0, 0, 0, 25, 18, 0, 17, 0, 0, 0, 9, 0, 14, 12, 0, 8, 0| %4, 15, 0, 0, 5, 0, 11, 0, 1, 0, 9, 16, 14, 10, 0, 0, 6, 17, 0, 0, 0, 13, 0, 3, 19| %0, 0, 0, 10, 0, 0, 0, 8, 19, 0, 0, 6, 0, 17, 0, 0, 0, 16, 0, 25, 4, 1, 0, 5, 0| %0, 1, 19, 13, 0, 0, 0, 25, 0, 0, 3, 2, 11, 0, 0, 12, 0, 23, 0, 0, 0, 21, 0, 0, 0| %0, 21, 11, 0, 0, 17, 7, 0, 5, 3, 0, 23, 8, 0, 0, 0, 1, 0, 2, 13, 0, 25, 0, 10, 14| %0, 0, 23, 0, 0, 4, 0, 0, 0, 14, 7, 0, 0, 25, 0, 0, 0, 24, 0, 9, 2, 0, 0, 0, 0| %0, 0, 0, 7, 18, 11, 5, 0, 0, 22, 0, 14, 0, 0, 0, 1, 0, 2, 20, 0, 3, 0, 19, 13, 0| %6, 10, 2, 14, 0, 0, 0, 20, 0, 0, 0, 0, 23, 7, 4, 0, 12, 25, 3, 0, 0, 16, 21, 17, 0| %15, 0, 0, 0, 11, 0, 21, 0, 0, 0, 0, 0, 17, 8, 22, 5, 18, 0, 0, 0, 7, 24, 0, 0, 0| %0, 0, 13, 0, 21, 1, 0, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 8| %0, 9, 0, 12, 0, 0, 0, 14, 7, 0, 0, 24, 0, 19, 20, 16, 0, 0, 0, 10, 0, 0, 0, 25, 18| %21, 25, 1, 5, 0, 0, 0, 0, 0, 2, 0, 17, 0, 14, 18, 0, 4, 0, 7, 0, 0, 0, 0, 0, 16| %8, 19, 0, 15, 0, 0, 9, 0, 20, 21, 25, 0, 3, 0, 11, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0| %0, 0, 0, 0, 2, 0, 0, 7, 0, 0, 0, 22, 0, 0, 9, 17, 14, 0, 23, 0, 8, 4, 0, 0, 6| %0, 4, 0, 0, 6, 18, 0, 3, 10, 17, 8, 0, 0, 0, 0, 0, 0, 0, 0, 12, 21, 22, 0, 0, 7| %0, 0, 17, 0, 0, 5, 0, 4, 25, 0, 12, 19, 20, 13, 0, 0, 0, 0, 0, 1, 0, 14, 9, 0, 11|]; array[1..N*N] of var 1..N: puzzle; constraint forall (i in 1..N, j in 1..N) ( if (puzzle_input[i,j]==0) then true else puzzle[(i-1)*N+j]==puzzle_input[i,j] endif ); ann: total; function var int: eq_const(var int: x, int: d) ::total = if d in dom(x) then let { array[int] of var int: i2ax = int2a(x) } in i2ax[d] else 0 endif; function array[int] of var int: int2a(var int: x) ::total = let { array[dom(x)] of var 0..1: a; constraint int_lin_eq([1|i in index_set(a)],a,1); constraint int_lin_eq([i|i in index_set(a)]++[-1],a++[x],0); } in a; predicate alldiff(array[int] of var int: x) = forall (d in dom_array(x)) ( int_lin_le([1|i in index_set(x)],[eq_const(x[i],d) | i in index_set(x)],1) ); predicate alldiff_builtin(array[int] of var int: x); % All cells in a row, in a column, and in a subsquare are different. constraint forall(i in 1..N)( alldiff(j in 1..N)( puzzle[(i-1)*N+j] )) /\ forall(j in 1..N)( alldiff(i in 1..N)( puzzle[(i-1)*N+j] )) /\ forall(i,j in 1..S) ( alldiff(p,q in 1..S)( puzzle[(S*(i-1)+p-1)*N+(S*(j-1)+q)] )) ; solve satisfy; %-----------------------------------------------------------------------------% % % The data for the puzzle that causes satz to make 1 backtrack (normally none % are made). % libminizinc-2.5.3/tests/spec/sudoku/sudoku_3_16x16.dzn0000644000175000017500000000150313757304533021223 0ustar kaolkaolS=4; puzzle_input=[| 0, 16, 7, 0, 0, 14, 0, 4, 6, 0, 10, 0, 0, 0, 1, 0| 3, 0, 0, 14, 0, 7, 9, 0, 0, 0, 8, 0, 2, 0, 10, 0| 0, 0, 0, 10, 15, 0, 0, 3, 0, 16, 5, 0, 4, 0, 7, 0| 0, 9, 8, 0, 0, 0, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0| 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 5, 0, 1, 12, 0| 16, 11, 2, 0, 0, 0, 0, 13, 8, 0, 0, 10, 7, 0, 0, 6| 15, 0, 0, 0, 0, 0, 3, 0, 0, 12, 0, 7, 0, 0, 0, 14| 0, 8, 0, 0, 0, 0, 1, 9, 4, 15, 0, 0, 13, 3, 0, 0| 0, 0, 11, 3, 0, 0, 14, 12, 10, 13, 0, 0, 0, 0, 6, 0| 12, 0, 0, 0, 3, 0, 6, 0, 0, 9, 0, 0, 0, 0, 0, 1| 8, 0, 0, 6, 10, 0, 0, 11, 2, 0, 0, 0, 0, 12, 3, 15| 0, 5, 13, 0, 16, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 2| 0, 0, 0, 0, 0, 0, 15, 0, 0, 4, 0, 0, 0, 2, 14, 0| 0, 10, 0, 9, 0, 3, 12, 0, 16, 0, 0, 2, 1, 0, 0, 0| 0, 7, 0, 11, 0, 9, 0, 0, 0, 10, 15, 0, 6, 0, 0, 3| 0, 4, 0, 0, 0, 16, 0, 14, 12, 0, 11, 0, 0, 8, 9, 0 |]; libminizinc-2.5.3/tests/spec/sudoku/sudoku_2_16x16.dzn0000644000175000017500000000150213757304533021221 0ustar kaolkaolS=4; puzzle_input=[| 11, 12, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 1, 2, 14| 6, 0, 1, 0, 8, 0, 0, 5, 0, 12, 0, 0, 0, 0, 0, 11| 2, 0, 0, 10, 0, 12, 0, 0, 14, 7, 0, 0, 0, 0, 3, 0| 0, 0, 0, 8, 0, 0, 4, 11, 1, 0, 10, 15, 9, 7, 0, 0| 0, 0, 0, 3, 9, 13, 0, 0, 2, 0, 5, 12, 0, 0, 8, 0| 0, 0, 0, 1, 2, 8, 0, 12, 0, 0, 4, 13, 0, 9, 0, 3| 9, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0| 0, 0, 8, 12, 10, 0, 0, 1, 9, 0, 7, 0, 14, 0, 11, 0| 0, 6, 0, 16, 0, 15, 0, 7, 13, 0, 0, 4, 2, 10, 0, 0| 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 7| 1, 0, 7, 0, 16, 5, 0, 0, 11, 0, 2, 10, 15, 0, 0, 0| 0, 10, 0, 0, 13, 2, 0, 3, 0, 0, 12, 5, 8, 0, 0, 0| 0, 0, 2, 14, 4, 9, 0, 16, 6, 5, 0, 0, 3, 0, 0, 0| 0, 1, 0, 0, 0, 0, 13, 8, 0, 0, 15, 0, 12, 0, 0, 16| 16, 0, 0, 0, 0, 0, 6, 0, 8, 0, 0, 9, 0, 13, 0, 1| 7, 9, 3, 0, 0, 0, 10, 0, 0, 0, 16, 0, 0, 0, 6, 2 |]; libminizinc-2.5.3/tests/spec/sudoku/sudoku_1_16x16.dzn0000644000175000017500000000150613757304533021224 0ustar kaolkaolS=4; puzzle_input=[| 13, 4, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 11, 0, 14, 10| 9, 12, 14, 5, 7, 0, 0, 15, 0, 0, 0, 0, 0, 2, 1, 0| 2, 15, 0, 6, 16, 0, 10, 9, 0, 0, 0, 0, 0, 5, 3, 0| 0, 0, 1, 0, 5, 0, 14, 0, 0, 0, 0, 0, 9, 6, 0, 0| 0, 0, 0, 0, 10, 12, 0, 5, 0, 0, 13, 0, 0, 0, 6, 8| 0, 0, 0, 0, 8, 0, 9, 0, 2, 0, 0, 14, 16, 0, 0, 11| 0, 0, 0, 0, 0, 0, 6, 7, 9, 0, 0, 0, 5, 15, 13, 12| 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2, 0, 0, 3| 16, 9, 15, 10, 0, 0, 0, 4, 0, 6, 0, 2, 0, 0, 0, 0| 0, 13, 0, 3, 0, 11, 0, 0, 0, 4, 1, 16, 0, 0, 0, 0| 0, 0, 8, 12, 6, 7, 16, 0, 0, 5, 0, 0, 0, 0, 0, 0| 0, 2, 11, 0, 1, 0, 0, 0, 10, 13, 12, 0, 0, 0, 0, 0| 4, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9| 3, 6, 0, 0, 0, 0, 0, 0, 12, 1, 11, 8, 14, 0, 0, 5| 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 7, 10, 15, 11, 0, 4| 0, 11, 10, 1, 0, 0, 0, 0, 0, 0, 15, 9, 6, 0, 7, 0 |]; libminizinc-2.5.3/tests/spec/sudoku/sudoku_5_16x16.dzn0000644000175000017500000000151313757304533021226 0ustar kaolkaolS=4; puzzle_input=[| 0, 13, 0, 12, 5, 0, 11, 0, 0, 0, 15, 6, 4, 14, 0, 0| 0, 0, 8, 2, 0, 16, 0, 0, 0, 0, 13, 1, 0, 0, 0, 11| 14, 0, 6, 1, 0, 0, 0, 9, 0, 0, 11, 0, 0, 2, 5, 0| 15, 0, 0, 0, 1, 0, 0, 13, 3, 5, 0, 0, 0, 6, 8, 7| 9, 15, 0, 0, 0, 0, 13, 0, 0, 0, 2, 0, 8, 0, 0, 12| 6, 14, 2, 0, 12, 0, 1, 0, 10, 0, 0, 0, 0, 0, 13, 0| 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 9, 5, 0, 0, 0, 2| 0, 0, 0, 13, 0, 7, 0, 2, 14, 12, 0, 0, 3, 10, 0, 0| 0, 0, 12, 9, 0, 0, 8, 7, 5, 0, 6, 0, 11, 0, 0, 0| 8, 0, 0, 0, 6, 14, 0, 0, 11, 0, 0, 0, 7, 0, 0, 0| 0, 1, 0, 0, 0, 0, 0, 3, 0, 8, 0, 14, 0, 16, 4, 5| 5, 0, 0, 14, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 15, 10| 11, 2, 5, 0, 0, 0, 7, 14, 6, 0, 0, 16, 0, 0, 0, 13| 0, 10, 7, 0, 0, 5, 0, 0, 15, 0, 0, 0, 14, 12, 0, 9| 12, 0, 0, 0, 13, 11, 0, 0, 0, 0, 5, 0, 10, 15, 0, 0| 0, 0, 1, 3, 10, 12, 0, 0, 0, 11, 0, 9, 2, 0, 16, 0 |]; libminizinc-2.5.3/tests/spec/suites.yml0000644000175000017500000000121613757304533016633 0ustar kaolkaoldefault: !Suite includes: ['unit/*'] optimize-0: !Suite includes: ['examples/*'] strict: false options: -O0: true optimize-2: !Suite includes: ['examples/*'] strict: false options: -O0: true optimize-3: !Suite includes: ['examples/*'] strict: false options: -O0: true no-mip-domains: !Suite includes: ['examples/*'] strict: false solvers: [cbc] options: -D: fMIPdomains=false no-half-reifications: !Suite includes: ['examples/*'] strict: false options: no-half-reifications: true no-chain-compression: !Suite includes: ['examples/*'] strict: false options: no-chain-compression: true libminizinc-2.5.3/tests/requirements.txt0000644000175000017500000000015513757304533017127 0ustar kaolkaolPyYAML==5.3 pytest==6.* py==1.9.* pytest-html==2.* pytest-xdist==2.* pytest-instafail==0.4.* minizinc==0.4.* libminizinc-2.5.3/tests/conftest.py0000644000175000017500000002513413757304533016046 0ustar kaolkaolfrom minizinc_testing import yaml from minizinc_testing.spec import CachedResult import pytest # pylint: disable=import-error,no-name-in-module from py.xml import html from html import escape import pytest_html import re import minizinc as mzn from difflib import HtmlDiff import sys def pytest_configure(config): pytest.solver_cache = {} search = config.getoption("--driver") if search is not None: driver = mzn.find_driver([search]) if driver is None: raise Exception("Failed to find MiniZinc driver in {}".format(search)) driver.make_default() def pytest_addoption(parser): parser.addoption( "--solvers", action="store", metavar="SOLVERS", help="only run tests with the comma separated SOLVERS.", ) parser.addoption( "--suite", action="append", default=[], metavar="SUITE_NAME", help="Use the given YAML configuration from suites.yml", ) parser.addoption( "--all-suites", action="store_true", dest="feature", help="Run all test suites" ) parser.addoption( "--driver", action="store", metavar="MINIZINC", help="Directory containing MiniZinc executable", ) def pytest_collect_file(parent, path): if path.ext == ".mzn": return MznFile.from_parent(parent, fspath=path) def pytest_html_results_table_header(cells): cells.insert(2, html.th("Solver", class_="sortable", col="solver")) cells.insert(3, html.th("Checker", class_="sortable", col="checker")) cells.pop() def pytest_html_results_table_row(report, cells): if hasattr(report, "user_properties"): props = {k: v for k, v in report.user_properties} cells.insert(2, html.td(props["solver"])) cells.insert(3, html.td(props["checker"] if "checker" in props else "-")) cells.pop() @pytest.hookimpl(hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield report = outcome.get_result() extra = getattr(report, "extra", []) if report.when == "call" and report.outcome != "skipped": props = {k: v for k, v in report.user_properties} if "compare" in props: required, obtained = props["compare"] html_content = """ """.format( escape(obtained) ) actual = obtained.split("\n") htmldiff = HtmlDiff(2) html_content += '

Diffs

' html_content += "
".join( htmldiff.make_table( expected.split("\n"), actual, fromdesc="expected", todesc="actual", context=True, ) for expected in required ) html_content += "
" extra.append(pytest_html.extras.html(html_content)) report.extra = extra def pytest_metadata(metadata): # Ensure that secrets don't get shown # Can likely be removed after pytest-metadata is updated metadata.pop("CI_JOB_TOKEN", None) metadata.pop("CI_REPOSITORY_URL", None) metadata.pop("CI_REGISTRY_PASSWORD", None) class MznFile(pytest.File): def collect(self): with open("./spec/suites.yml", encoding="utf-8") as suites_file: suites = yaml.load(suites_file) if not self.config.getoption("--all-suites"): enabled_suites = self.config.getoption("--suite") if len(enabled_suites) == 0: suites = {"default": suites["default"]} else: suites = {k: v for k, v in suites.items() if k in enabled_suites} with self.fspath.open(encoding="utf-8") as file: contents = file.read() yaml_comment = re.match(r"\/\*\*\*\n(.*?)\n\*\*\*\/", contents, flags=re.S) if yaml_comment is None: pytest.skip( "skipping {} as no tests specified".format(str(self.fspath)) ) else: tests = [doc for doc in yaml.load_all(yaml_comment.group(1))] for suite_name, suite in suites.items(): if any(self.fspath.fnmatch(glob) for glob in suite.includes): for i, spec in enumerate(tests): for solver in spec.solvers: base = ( str(i) if spec.name is yaml.Undefined else spec.name ) name = "{}.{}.{}".format(suite_name, base, solver) cache = CachedResult() yield SolveItem.from_parent( self, name=name, spec=spec, solver=solver, cache=cache, markers=spec.markers, suite=suite, ) for checker in spec.check_against: yield CheckItem.from_parent( self, name="{}:{}".format(name, checker), cache=cache, solver=solver, checker=checker, markers=spec.markers, suite=suite, ) class MznItem(pytest.Item): def __init__(self, name, parent, solver, markers, suite): super().__init__(name, parent) self.user_properties.append(("solver", solver)) for marker in markers: self.add_marker(marker) if self.config.getoption("--solvers") is not None: self.allowed = [ x.strip() for x in self.config.getoption("--solvers").split(",") ] self.allowed = [x for x in self.allowed if x in suite.solvers] else: self.allowed = suite.solvers if not self.solver_allowed(solver): self.add_marker( pytest.mark.skip("skipping {} not in {}".format(solver, self.allowed)) ) if not self.solver_exists(solver): self.add_marker(pytest.mark.skip("Solver {} not available".format(solver))) def solver_allowed(self, solver): return self.allowed is None or solver in self.allowed def solver_exists(self, solver): solver_exists = pytest.solver_cache.get(solver, None) if solver_exists is None: try: s = mzn.Solver.lookup(solver) empty_model = mzn.Model() empty_model.add_string("solve satisfy;") instance = mzn.Instance(s, empty_model) instance.solve() solver_exists = True except (mzn.MiniZincError, LookupError) as error: solver_exists = False finally: pytest.solver_cache[solver] = solver_exists return solver_exists class SolveItem(MznItem): def __init__(self, name, parent, spec, solver, cache, markers, suite): super().__init__(name, parent, solver, markers, suite) self.spec = spec self.solver = solver self.cache = cache self.default_options = suite.options self.strict = suite.strict def runtest(self): model, result, required, obtained = self.spec.run( str(self.fspath), self.solver, default_options=self.default_options ) # To pass model and result to checker test item self.cache.model = model self.cache.result = result self.cache.obtained = obtained passed = self.spec.passed(result) if not passed: # Test fails if we still haven't passed expected = [yaml.dump(exp) for exp in required] actual = yaml.dump(obtained) self.user_properties.append(("compare", (expected, actual))) message = "expected one of\n\n{}\n\nbut got\n\n{}".format( "\n---\n".join(expected), actual ) # Doesn't match, so backup by checking against another solver if isinstance(result, mzn.Result) and result.status.has_solution(): checkers = [s for s in self.spec.solvers if s is not self.solver] if len(checkers) > 0: checker = checkers[0] non_strict_pass = self.cache.test(checker) status = "but passed" if non_strict_pass else "and failed" message += "\n\n{} check against {}.".format(status, checker) if not self.strict and non_strict_pass: print(message, file=sys.stderr) return assert False, message def reportinfo(self): return self.fspath, 0, "{}::{}".format(str(self.fspath), self.name) class CheckItem(MznItem): def __init__(self, name, parent, cache, solver, checker, markers, suite): super().__init__(name, parent, solver, markers, suite) if not self.solver_allowed(checker): self.add_marker( pytest.mark.skip( "skipping checker {} not in {}".format(checker, self.allowed) ) ) if not self.solver_exists(checker): self.add_marker( pytest.mark.skip("skipping checker {} not available".format(checker)) ) self.cache = cache self.solver = solver self.checker = checker self.user_properties.append(("checker", checker)) self.add_marker(pytest.mark.check) def runtest(self): if ( not isinstance(self.cache.result, mzn.Result) or not self.cache.result.status.has_solution() ): pytest.skip("skipping check for no result/solution") else: passed = self.cache.test(self.checker) assert passed, "failed when checking against {}. Got {}".format( self.checker, yaml.dump(self.cache.obtained) ) def reportinfo(self): return self.fspath, 0, "{}::{}".format(str(self.fspath), self.name) libminizinc-2.5.3/tests/benchmarking/0000755000175000017500000000000013757304533016272 5ustar kaolkaollibminizinc-2.5.3/tests/benchmarking/json_config.py0000644000175000017500000000314213757304533021142 0ustar kaolkaolimport json, copy ######################## Methods to store program config in JSON ######## ######################## Config can be incrementable, see mergeJSON ##### ########################### JSON CONFIG & STUFF ######################### n_JSON_Indent = 4 s_AddKey = "ADD_KEY::" ## The prefix for keys to be added in new backend definitions ## The prefix itself is not added ## TODO: remove in lvalue s_CommentKey = "///COMMENT" ## The key for comments in JSON config dictionaries ## Returns a merge of j2 into j1. def mergeJSON( j1, j2 ): jNew = None if dict==type(j1) and dict==type(j2): jNew = copy.deepcopy( j1, {} ) for key in j2: if key in j1: jNew[key] = mergeJSON( j1[key], j2[key] ) else: assert key.startswith( s_AddKey ), "Adding key %s: does not start with the prefix %s, j1: %s" % (key, s_AddKey, j1.__str__()) jNew[key[len(s_AddKey):]] = j2[key] elif list==type(j1) and list==type(j2): jNew = [] for i in range( 0, len(j2) ): ## Can assign a shorter list this way if i 1e-6 * max( abs(dObj_MZN), abs(dObj_SLV) ): aResultThisInst[ "n_ErrorsLogical" ] += 1 aDetThis [ "errL" ] += 1 print ( " WARNING: DIFFERENT MZN / SOLVER OBJ VALUES for the instance ", sInst, ", method '", lNames, "' : ", dObj_MZN, " / ", dObj_SLV, sep='', file=self.ioContrObjValMZN) ## Retrieve solution status if "Sol_Status" in mSlv: n_SolStatus = mSlv[ "Sol_Status" ][0] else: n_SolStatus = 0 ## Retrieve dual bound dBnd = None if None!=dBnd_SLV and abs( dBnd_SLV ) < 1e45: dBnd = dBnd_SLV self.lDualBnd.append( ( dBnd_SLV, lNames ) ) ## Even infeas instances can have dual bound? ## Trying to deduce opt sense if not given: if 1==len(self.sSenses): nSense = next(iter(self.sSenses.keys())) else: nSense = -2 ## ?? aDetThis[ "sns" ] = self.mapProblemSense[ nSense ] self.bOptProblem = True if 0!=nSense else False ## or (None!=dBnd or None!=dObj) ### ... here assumed it's an opt problem by default... why... need to check bounds first?? ## Handle optimality / SAT completed if 2==n_SolStatus: if not self.bOptProblem: self.lSatAll.append( lNames ) aResultThisInst[ "n_SATALL" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ 4 ] else: ## Assume it's an optimization problem????? TODO self.lOpt.append( lNames ) ## Append the optimal method list aResultThisInst[ "n_OPT" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ 2 ] if dObj is None or abs( dObj ) >= 1e45: aResultThisInst[ "n_ErrorsLogical" ] += 1 aDetThis [ "errL" ] += 1 print ( " WARNING: OPTIMAL STATUS BUT BAD OBJ VALUE, instance ", sInst, ", method '", lNames, "': '", ( "" if None==dObj else str(dObj) ), "', result record: ", # mRes, ",, dObj_MZN: ", dObj_MZN, sep='', file=self.ioBadObjValueStatusOpt ) else: self.mOptVal[ dObj ] = lNames ## Could have used OrderedDict self.lOptVal.append( (dObj, lNames) ) ## To have both a map and the order self.lPrimBnd.append( (dObj, lNames) ) ## Handle feasibility / SAT elif 1==n_SolStatus: if not self.bOptProblem: self.lSat.append( lNames ) aResultThisInst[ "n_SAT" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ 3 ] else: ## Assume it's an optimization problem????? TODO self.lFeas.append( lNames ) ## Append the optimal method list aResultThisInst[ "n_FEAS" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ 1 ] if None==dObj or abs( dObj ) >= 1e45: aResultThisInst[ "n_ErrorsLogical" ] += 1 aDetThis [ "errL" ] += 1 print ( " WARNING: feasible status but bad obj value, instance ", sInst, ", method '", lNames, "' :'", ( "" if None==dObj else str(dObj) ), "', result record: ", # mRes, sep='', file=self.ioBadObjValueStatusFeas ) else: self.lPrimBnd.append( (dObj, lNames) ) ## Handle infeasibility elif -1>=n_SolStatus and -3<=n_SolStatus: self.lInfeas.append( lNames ) aResultThisInst[ "n_INFEAS" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ n_SolStatus ] self.mInfeas. setdefault( sInst, [] ) self.mInfeas[ sInst ].append( lNames ) ## Handle ERROR? elif -4==n_SolStatus: aResultThisInst[ "n_ErrorsBackend" ] = 1 aDetThis [ "errH" ] += 1 aDetThis[ "stt" ] = self.mapStatShort[ n_SolStatus ] ## Should not happen TODO self.mError. setdefault( sInst, [] ).append( lNames ) print( "ERROR REPORTED for the instance ", sInst, ", method '", lNames, "', result record: ", ## mRes, sep='', file=self.ioErrors ) else: aResultThisInst[ "n_UNKNOWN" ] = 1 aDetThis[ "stt" ] = self.mapStatShort[ 0 ] ## Handle NOFZN if None==dTime_Flt: aResultThisInst[ "n_NOFZN" ] = 1 self.mNoFZN. setdefault( sInst, [] ).append( lNames ) self.lNOFZN.append( lNames ) ## Handle FAIL??? # LAST: utils.addMapValues( self.mCmpVecVals[lNames], aResultThisInst ) ### ### Now compare between differen methods: CONTRADICTIONS ### def checkContradictions( self, sInst ): self.fContr = False if len(self.lOpt)+len(self.lFeas)+len(self.lSatAll)+len(self.lSat) > 0 and len(self.lInfeas) > 0: self.nContrStatus += 1 self.fContr = True print( "CONTRADICTION of STATUS: instance " + str(sInst) + ": " + \ "\n OPTIMAL: " + strNL( "\n ", self.lOpt) + \ "\n FEAS: " + strNL( "\n ", self.lFeas) + \ "\n SAT_COMPLETE: " + strNL( "\n ", self.lSatAll) + \ "\n SAT: " + strNL( "\n ", self.lSat) + \ "\n INFEAS: " + strNL( "\n ", self.lInfeas), file= self.ioContrStatus ) if len(self.mOptVal) > 1: self.nContrOptVal += 1 self.fContr = True print( "CONTRADICTION of OPTIMAL VALUES: " + str(sInst) + \ ": " + strNL( "\n ", self.mOptVal.items()), file=self.ioContrOptVal ) self.nOptSense=0; ## Take as SAT by default if len(self.lPrimBnd)>0 and len(self.lDualBnd)>0 and len(self.lOpt)= nDMax - 1e-6 and nPMax > nDMin + 1e-6: self.nOptSense=-1 ## minimize elif nPMax > nDMin + 1e-6 and nPMin < nDMax - 1e-6 or \ nPMin < nDMax - 1e-6 and nPMax > nDMin + 1e-6: self.nContrBounds += 1 self.fContr = True print( "CONTRADICTION of BOUNDS: instance " + str(sInst) + \ ":\n PRIMALS: " + strNL( "\n ", self.lPrimBnd) + \ ",\n DUALS: " + strNL( "\n ", self.lDualBnd), file = self.ioContrBounds ) else: self.nOptSense=0 ## SAT if 1==len(self.sSenses) and self.nOptSense!=0: if self.nOptSense!=self.nOptSenseGiven: ## access the 'given' opt sense print( "CONTRADICITON of IMPLIED OBJ SENSE: Instance "+ str(sInst) + \ ": primal bounds " + strNL( "\n ", self.lPrimBnd) + \ " and dual bounds "+ strNL( "\n ", self.lDualBnd) + \ " together imply opt sense " + str(self.nOptSense) + \ ", while result logs say "+ str(self.nOptSenseGiven), file=self.ioContrBounds ) ## else accepting nOptSense as it is ### ### Now compare between differen methods: DIFFERENCES AND RANKING ### def rankPerformance( self, sInst ): ### Accepting the opt sense from result tables, if given if self.nOptSenseGiven!=-2: self.nOptSense = self.nOptSenseGiven ### Compare methods on this instance: if not self.fContr and self.nReported == len(self.lResLogs): if len(self.lNOFZN) == 1: self.matrRanking[self.lNOFZN[0], "ONFZ"] += 1 self.matrRankingMsg[self.lNOFZN[0], "ONFZ"].append( \ str(sInst) + ": the ONLY NON-FLATTENED") elif len(self.lOpt) == 1: self.matrRanking[self.lOpt[0], "OOpt"] += 1 self.matrRankingMsg[self.lOpt[0], "OOpt"].append( \ str(sInst) + ": the ONLY OPTIMAL") elif len(self.lSatAll) == 1: self.matrRanking[self.lSatAll[0], "OSaC"] += 1 self.matrRankingMsg[self.lSatAll[0], "OSaC"].append( \ str(sInst) + ": the ONLY SAT-COMPLETE") elif len(self.lOpt) == 0 and len(self.lFeas) == 1: self.matrRanking[self.lFeas[0], "OFeas"] += 1 self.matrRankingMsg[self.lFeas[0], "OFeas"].append( \ str(sInst) + ": the ONLY FEASIBLE") elif len(self.lSatAll) == 0 and len(self.lSat) == 1: self.matrRanking[self.lSat[0], "OSat"] += 1 self.matrRankingMsg[self.lSat[0], "OSat"].append( \ str(sInst) + ": the ONLY SAT") elif len(self.lOpt) == 0 and len(self.lFeas) > 1: self.nNoOptAndAtLeast2Feas += 1 elif len(self.lInfeas) == 1: self.matrRanking[self.lInfeas[0], "OInfeas"] += 1 self.matrRankingMsg[self.lInfeas[0], "OInfeas"].append( \ str(sInst) + ": the ONLY INFeasible") if not self.fContr \ and 0==len(self.lInfeas) and 10: self.lPrimBnd.reverse() dBnd, dNM = zip(*self.lPrimBnd) dBetter = (dBnd[0]-dBnd[1]) * self.nOptSense if 1e-2 < dBetter: ## Param? TODO self.matrRanking[dNM[0], "BPri"] += 1 self.matrRankingMsg[dNM[0], "BPri"].append( str(sInst) \ + ": the best OBJ VALUE by " + str(dBetter) \ + "\n PRIMAL BOUNDS AVAILABLE: " + strNL( "\n ", self.lPrimBnd)) if not self.fContr \ and 0==len(self.lInfeas) and 1. The DZN format is produced, e.g., if the model is flattened with \'' + sDZNOutputAgrs + '\'') parser.add_argument('--checkStderr', metavar='', help='with --checkDZN, read a solver\'s stderr log from (not essential)') parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='tee backend\'s stderr to screen, in addition to the instance\'s output dumpfile in mzn-test/OUTPUTS. Only works for --shellSolve 1') parser.add_argument('--vc', '--verbose-check', dest='vc', action='store_true', help='same for checking') ## parser.add_argument('--no-feature', dest='feature', action='store_false') ## parser.set_defaults(feature=True) parser.add_argument('--debug', '--printcall', type=int, metavar='', help='bit 1: print full solver call commands, bit 2: same for checker') parser.add_argument('--shellSolve', type=int, metavar='0/1', help='backend call through shell when using psutils') parser.add_argument('--psutils', type=int, metavar='0/1', help='backend call through psutils (seems buggy in 3.4.2)') ## parser.add_argument('--fullPaths', action='store_true', ## help='use full paths in instance identifiers. By default, it\'s the pure base filenames') parser.add_argument('--mergeCfg', action="append", metavar='', help='merge config from ') parser.add_argument('--saveCfg', metavar='', help='save internal config to . Can be useful to modify some parameters and run with --mergeCfg') parser.add_argument('--saveSolverCfg', metavar='', help='save the final solver backend config to ') parser.add_argument('--saveCheckerCfg', metavar='', help='save the final checker backend config to ') parser.add_argument('--addOption', '--addOptions', action="append", metavar='', type=str, help='add to any solver / checker call') parser.add_argument('--addSolverOption', '--addSolverOptions', action="append", metavar='', type=str, help='add to the solver call') parser.add_argument('--addCheckerOption', '--addCheckerOptions', action="append", metavar='', type=str, help='add to a checker call') parser.add_argument('--useJoinedName', action="append", metavar='<...%s...>', type=str, help='add this to the call, with %%s being replaced by' ' a joined filename from all the input filenames, e.g., "--writeModel MODELS/%%s.mps"') self.args = parser.parse_args() # print( "ARGS:\n", self.args ) ## Solver backend and checker backend list self.slvBE = None self.chkBEs = None ## Get parameters from config and command line, merge values def obtainParams(self): self.parseCmdLine() self.mergeValues() def initCfgDefault(self): ddd = { s_CommentKey: [ "The default config structure for mzn-test.py. ", s_ProgramDescr, "You can export this by --saveCfg and modify -> --mergeCfg,", "even having only partial JSON subtree in a merged file(s).", "Structure: COMMON_OPTIONS, SOLVER_/CHECKER_PROFILES, BACKEND_DEFS.", "Solver and checkers are selected from pre-defined profiles,", "which are in turn built from sequences of 'basic backend definitions'.", "Comments are either separate keys or added as list elements ('/// ...')", "in pre-selected positions; then, overriding items should keep that order." ], "COMMON_OPTIONS": { s_CommentKey: [ "'Solvers' and 'Checkers' select the profiles to use for solving and checking.", "At the moment only the 1st solver is used from Solvers." "The selected profiles must be known in SOLVER_PROFILES / CHECKER_PROFILES, resp." ], "Solvers": [ "MINIZINC", #"MZN-CPLEX", "/// At the moment only the 1st element is used for solving" ], "SOLUTION_CHECKING": { "Checkers": ["GECODE-CHK", "GUROBI-CHK", "CPLEX-CHK" ], "n_CheckedMax": [ -10, "/// Negative value means it's that many last solutions" ], "n_FailedSaveMax": [ 3, "/// After that many failed solutions, stop checking the instance" ], "s_FailedSaveFile": [ sFlnSolFailBase, "/// Filename to save failed solutions" ], }, "Instance_List": { s_CommentKey: [ "Params for instance lists.", "Instance list is a file containing an instance's model files,", "at most 1 instance per line.", "InstanceFileExt: only files with this extensions from a list file", "will be taken on each line" ], "InstanceFileExt": [".mzn", ".dzn"] ## Add json? TODO }, "runCommand": { "windows": { "runSilent": "echo \"WARNING. No timeout on Windows.\" & {2} 1>{3} 2>{4}", "runVerbose": "echo \"WARNING. No timeout on Windows.\" & {2} 3>&1 1>{3} 2>&3 | tee {4} & echo >>{4}" } ,"non-windows": { "runSilent": "ulimit -v {0}; timeout -k 1 {1} bash -c \"{2}\" 1>{3} 2>{4}", "runVerbose": "ulimit -v {0}; timeout -k 1 {1} bash -c \"{2}\" 3>&1 1>{3} 2>&3 | tee {4}; echo >>{4}" } } }, "SOLVER_PROFILES": { s_CommentKey: [ "Similar to CHECKER_PROFILES." ], "MINIZINC": [ "__BE_COMMON", "__BE_SOLVER", "BE_MINIZINC" ], "FZN-GUROBI": [ "__BE_COMMON", "__BE_SOLVER", "BE_FZN-GUROBI" ], "FZN-CPLEX": [ "__BE_COMMON", "__BE_SOLVER", "BE_FZN-CPLEX" ], "FZN-CBC": [ "__BE_COMMON", "__BE_SOLVER", "BE_FZN-CBC" ], "GUROBI": [ "__BE_COMMON", "__BE_SOLVER", "BE_GUROBI" ], "CPLEX": [ "__BE_COMMON", "__BE_SOLVER", "BE_CPLEX" ], "XPRESS": [ "__BE_COMMON", "__BE_SOLVER", "BE_XPRESS" ], "SCIP": [ "__BE_COMMON", "__BE_SOLVER", "BE_SCIP" ], "CBC": [ "__BE_COMMON", "__BE_SOLVER", "BE_CBC" ], "GECODE": [ "__BE_COMMON", "__BE_SOLVER", "BE_GECODE" ], "CHUFFED": [ "__BE_COMMON", "__BE_SOLVER", "BE_CHUFFED" ], "ORTOOLS": [ "__BE_COMMON", "__BE_SOLVER", "BE_ORTOOLS" ] #, # "MZN-GUROBI": [ "__BE_COMMON", "__BE_SOLVER", "BE_MZN-GUROBI" ], # "MZN-CPLEX": [ "__BE_COMMON", "__BE_SOLVER", "BE_MZN-CPLEX" ], # "MZN-CBC": [ "__BE_COMMON", "__BE_SOLVER", "BE_MZN-CBC" ], # "MZN-GECODE": [ "__BE_COMMON", "__BE_SOLVER", "BE_MZN-GECODE" ], # "FZN-CHUFFED": [ "__BE_COMMON", "__BE_SOLVER", "BE_FZN-CHUFFED" ] }, "CHECKER_PROFILES": { s_CommentKey: [ "Each profile gives a list of backend defs to use.", "Later backends in the list can override/add options, ", "for example for values to be read from the outputs.", "Adding is only possible if the key is prefixed by '"+s_AddKey+"'" ], "MINIZINC-CHK": [ "__BE_COMMON", "__BE_CHECKER_OLDMINIZINC", "BE_MINIZINC" ], "GECODE-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_GECODE" ], "GUROBI-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_GUROBI" ], "CPLEX-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_CPLEX" ], "CHUFFED-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_CHUFFED" ], "MZN-GECODE-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_MZN-GECODE" ], "MZN-GUROBI-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_MZN-GUROBI" ], "MZN-CPLEX-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_MZN-CPLEX" ], "FZN-GECODE-CHK": [ "__BE_COMMON", "__BE_CHECKER_OLDMINIZINC", "BE_FZN-GECODE" ], "FZN-GECODE-SHELL-CHK": [ "__BE_COMMON", "__BE_CHECKER_OLDMINIZINC", "BE_FZN-GECODE_SHELL" ], "FZN-CHUFFED-CHK": [ "__BE_COMMON", "__BE_CHECKER", "BE_FZN-CHUFFED" ] }, "BACKEND_DEFS": { s_CommentKey: [ "__BE_COMMON initializes a basic backend structure.", "Each further backend in a profile list overrides or adds options." ], "__BE_COMMON": { s_CommentKey: [ "THE INITIALIZING BACKEND." ], "EXE": { s_CommentKey: [ "Solver call parameters" ], "s_SolverCall" : ["minizinc -v -s -a " + sDZNOutputAgrs + " %s", "/// The 1st element defines the call line. %s is replaced by the instance filename(s)."], "s_ExtraCmdline" : ["", "/// Only for __BE_SOLVER/__BE_CHECKER... subprofiles." " The 1st element gives extra cmdline arguments to the call"], "b_ThruShell" : [True, "/// Set True to call solver thru shell." " Then you can do shell tricks but Ctrl+C may not kill all subprocesses etc."], "n_TimeoutRealHard": [150, "/// Real-time timeout per instance, seconds," " for all solution steps together. Use mzn/backend options for CPU time limit."], "n_VMEMLIMIT_SoftHard": [8000000, 8000000, "/// 2 limits, soft/hard, in KB. Platform-dependent in Python 3.6. Default 8 GB"], }, "Stderr_Keylines": { s_CommentKey: [ "A complete line in stderr will be interpreted accordingly.", " Format: : { : , ... }" " You can add own things here (use '"+s_AddKey+"' before new var name)", " which will be transferred into results" ] }, "Stderr_Keyvalues": { s_CommentKey: [ "Numerical values to be extracted from a line in stderr.", " { : [ , , ] }." ], ### The %%%mzn-stat values appear in stdout (as of May 2019) but leave them here just in case "Time_Flt": [ "%%%mzn-stat: flatTime", "[:=]", 3, "/// E.g., 'Flattening done, 3s' produces 3." " !!! This is interpreted as successful flattening by the checker" ], "ObjVal_Solver": [ "%%%mzn-stat objective=", "[,:/=]", 3, ## Need = to avoid mixup witht the bound "/// The objval as reported by solver."], "DualBnd_Solver": [ "%%%mzn-stat objectiveBound", "[,:/=]", 3 ], "CPUTime_Solver": [ "%%%mzn-stat solveTime", "[,:/=]", 3 ], "NNodes_Solver": [ "%%%mzn-stat nodes", "[,:/=]", 3 ], }, "Stdout_Keylines": { s_CommentKey: [ "Similar to Stderr_Keylines"], "Sol_Status": { "----------": 1, "==========": 2, "=====UNSATISFIABLE=====": -1, "=====UNBOUNDED=====": -2, "=====UNKNOWN=====": 0, "=====UNSATorUNBOUNDED=====": -3, "=====ERROR=====": -4 }, "Problem_Sense": { "%%%mzn-stat: method=\"maximize\"": 1, "%%%mzn-stat: method=\"minimize\"": -1, "%%%mzn-stat: method=\"satisfy\"": 0, } }, "Stdout_Keyvalues": { s_CommentKey: ["Similar to Stderr_Keyvalues." ], "Time_Flt": [ "%%%mzn-stat: flatTime", "[:=]", 3, "/// E.g., 'Flattening done, 3s' produces 3." " !!! This is interpreted as successful flattening by the checker" ], "ObjVal_Solver": [ "%%%mzn-stat objective=", "[,:/=]", 3, ## Need = to avoid mixup witht the bound "/// The objval as reported by solver."], "DualBnd_Solver": [ "%%%mzn-stat objectiveBound", "[,:/=]", 3 ], "CPUTime_Solver": [ "%%%mzn-stat solveTime", "[,:/=]", 3 ], "NNodes_Solver": [ "%%%mzn-stat nodes", "[,:/=]", 3 ], "ObjVal_MZN": [ "_objective", "[():=;%]", 2, "/// The objective value as evaluated by MZN." ], "RealTime_Solns2Out": [ "% time elapsed:", " ", 4 ], } }, "__BE_SOLVER": { s_CommentKey: ["Specializations for a general solver" ], "EXE": { "s_ExtraCmdline" : ["-a"], "b_ThruShell" : [True], "n_TimeoutRealHard": [150], # "n_VMEMLIMIT_SoftHard": [8000100000, 8100000000] } }, "__BE_CHECKER": { s_CommentKey: ["Specializations for a general checker" ], "EXE": { "s_ExtraCmdline" : [sFlatOptChecker], "b_ThruShell" : [True], "n_TimeoutRealHard": [15], # "n_VMEMLIMIT_SoftHard": [8100000000, 8100000000] } }, "__BE_CHECKER_OLDMINIZINC": { s_CommentKey: ["Specializations for a general checker using the 1.6 MiniZinc driver" ], "EXE": { "s_ExtraCmdline" : ["--mzn2fzn-cmd 'mzn2fzn -v -s --output-mode dzn " + sFlatOptChecker + "'"], "b_ThruShell" : [True], "n_TimeoutRealHard": [15], # "n_VMEMLIMIT_SoftHard": [8100000000, 8100000000] } }, "BE_MINIZINC": { s_CommentKey: [ "------------------- Specializations for pure minizinc driver" ], "EXE":{ "s_SolverCall": [ "minizinc --mzn2fzn-cmd 'mzn2fzn -v -s " + sDZNOutputAgrs + "' -s %s"], # _objective fails for checking "b_ThruShell" : [True], }, }, "BE_FZN-GUROBI": { s_CommentKey: [ "------------------- Specializations for Gurobi solver instance" ], "EXE":{ "s_SolverCall" : ["mzn2fzn -v -s -G linear " + sDZNOutputAgrs + " %s --fzn tmp.fzn --ozn tmp.ozn && mzn-gurobi -v -s tmp.fzn"], ## works without solns2out for now. Need thus when using shell call with system() TODO? #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Presolved:", " ", 2 ], s_AddKey+"Preslv_Cols": [ "Presolved:", " ", 4 ], s_AddKey+"Preslv_Non0": [ "Presolved:", " ", 6 ] }, }, "BE_GUROBI": { s_CommentKey: [ "------------------- Specializations for Gurobi solver instance" ], "EXE":{ "s_SolverCall" : ["minizinc -v -s --solver gurobi --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Presolved:", " ", 2 ], s_AddKey+"Preslv_Cols": [ "Presolved:", " ", 4 ], s_AddKey+"Preslv_Non0": [ "Presolved:", " ", 6 ] }, }, "BE_MZN-GUROBI": { s_CommentKey: [ "------------------- Specializations for Gurobi solver instance" ], "EXE":{ "s_SolverCall" : ["mzn-gurobi -v -s -G linear --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Presolved:", " ", 2 ], s_AddKey+"Preslv_Cols": [ "Presolved:", " ", 4 ], s_AddKey+"Preslv_Non0": [ "Presolved:", " ", 6 ] }, }, "BE_FZN-CPLEX": { s_CommentKey: [ "------------------- Specializations for IBM ILOG CPLEX solver instance" ], "EXE": { "s_SolverCall" : ["mzn2fzn -v -s -G linear " + sDZNOutputAgrs + " %s --fzn tmp.fzn --ozn tmp.ozn && mzn-cplex -v -s tmp.fzn"] #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Reduced MIP has [0-9]+ rows,", " ", 4 ], s_AddKey+"Preslv_Cols": [ "Reduced MIP has [0-9]+ rows,", " ", 6 ], s_AddKey+"Preslv_Non0": [ "Reduced MIP has [0-9]+ rows,", " ", 9 ] }, }, "BE_CPLEX": { s_CommentKey: [ "------------------- Specializations for IBM ILOG CPLEX solver instance" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver cplex --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Reduced MIP has [0-9]+ rows,", " ", 4 ], s_AddKey+"Preslv_Cols": [ "Reduced MIP has [0-9]+ rows,", " ", 6 ], s_AddKey+"Preslv_Non0": [ "Reduced MIP has [0-9]+ rows,", " ", 9 ] }, }, "BE_XPRESS": { s_CommentKey: [ "------------------- Specializations for FICO XPRESS solver instance" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver xpress --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { ## Is different for XPRESS and -v fails at the moment anyway s_AddKey+"Preslv_Rows": [ "Reduced MIP has [0-9]+ rows,", " ", 4 ], s_AddKey+"Preslv_Cols": [ "Reduced MIP has [0-9]+ rows,", " ", 6 ], s_AddKey+"Preslv_Non0": [ "Reduced MIP has [0-9]+ rows,", " ", 9 ] }, }, "BE_MZN-CPLEX": { s_CommentKey: [ "------------------- Specializations for IBM ILOG CPLEX solver instance" ], "EXE": { "s_SolverCall" : ["mzn-cplex -v -s -G linear --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], #"opt_writeModel": ["--writeModel"] }, "Stderr_Keyvalues": { s_AddKey+"Preslv_Rows": [ "Reduced MIP has [0-9]+ rows,", " ", 4 ], s_AddKey+"Preslv_Cols": [ "Reduced MIP has [0-9]+ rows,", " ", 6 ], s_AddKey+"Preslv_Non0": [ "Reduced MIP has [0-9]+ rows,", " ", 9 ] }, }, "BE_FZN-CBC": { s_CommentKey: [ "------------------- Specializations for COIN-OR Branch&Cut solver instance" ], "EXE": { "s_SolverCall" : ["mzn-cbc -v -s -G linear --output-time " + sDZNOutputAgrs + " %s --fzn tmp.fzn --ozn tmp.ozn && mzn-cplex -v -s tmp.fzn"], #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], }, }, "BE_SCIP": { s_CommentKey: [ "------------------- Specializations for SCIP solver instance" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver scip --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], }, }, "BE_CBC": { s_CommentKey: [ "------------------- Specializations for COIN-OR Branch&Cut solver instance" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver osicbc --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], }, }, "BE_MZN-CBC": { s_CommentKey: [ "------------------- Specializations for COIN-OR Branch&Cut solver instance" ], "EXE": { "s_SolverCall" : ["mzn-cbc -v -s -G linear --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking #"s_SolverCall" : ["./run-mzn-cplex.sh %s"], #"b_ThruShell" : [True], }, }, "BE_GECODE": { s_CommentKey: [ "------------------- Specializations for Gecode FlatZinc interpreter" ], "EXE": { # "s_SolverCall" : ["minizinc -s --solver gecode " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO "s_SolverCall" : ["minizinc -v -s --solver gecode " + sDZNOutputAgrs + " %s"], # --time 300000 "b_ThruShell" : [True], } }, "BE_MZN-GECODE": { s_CommentKey: [ "------------------- Specializations for Gecode FlatZinc interpreter" ], "EXE": { # "s_SolverCall" : ["mzn-fzn -s -G gecode --solver fzn-gecode " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO "s_SolverCall" : ["mzn-gecode -v -s -G gecode " + sDZNOutputAgrs + " %s"], # --time 300000 "b_ThruShell" : [True], } }, "BE_FZN-GECODE": { s_CommentKey: [ "------------------- Specializations for Gecode FlatZinc interpreter" ], "EXE": { # "s_SolverCall" : ["mzn-fzn -s -G gecode --solver fzn-gecode " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO "s_SolverCall" : ["minizinc -s -G gecode -f fzn-gecode --mzn2fzn-cmd 'mzn2fzn -v -s " + sDZNOutputAgrs + "' %s"], "b_ThruShell" : [True], } }, "BE_FZN-GECODE_SHELL": { s_CommentKey: [ "------------------- Specializations for Gecode FlatZinc interpreter" ], "EXE": { # "s_SolverCall" : ["mzn-fzn -s -G gecode --solver fzn-gecode " + sDZNOutputAgrs + " %s"], # _objective fails for checking TODO "s_SolverCall" : ["mzn2fzn -v -s -G gecode " + sDZNOutputAgrs + sFlatOptChecker + " %s --fzn tmp.fzn --ozn tmp.ozn && fzn-gecode tmp.fzn | solns2out tmp.ozn"], "b_ThruShell" : [True], "s_ExtraCmdline" : [""], } }, "BE_CHUFFED": { s_CommentKey: [ "------------------- Specializations for Chuffed FlatZinc interpreter" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver chuffed -f --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking } ## --fzn-flags --time-out --fzn-flags 300 } , "BE_ORTOOLS": { s_CommentKey: [ "------------------- Specializations for OR-Tools FlatZinc interpreter" ], "EXE": { "s_SolverCall" : ["minizinc -v -s --solver ortools -f --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking } ## --fzn-flags --time-out --fzn-flags 300 } , "BE_FZN-CHUFFED": { s_CommentKey: [ "------------------- Specializations for Chuffed FlatZinc interpreter" ], "EXE": { "s_SolverCall" : ["mzn-fzn -v -s -G chuffed --solver fzn-chuffed --fzn-flags -f --output-time " + sDZNOutputAgrs + " %s"], # _objective fails for checking } ## --fzn-flags --time-out --fzn-flags 300 } } } return ddd ## self.nNoOptAndAtLeast2Feas = 0 ## Read a cfg file, instead of/in addition to the default cfg def mergeCfg(self, fln): ddd1 = None with open( fln, 'r' ) as rf: ddd1 = json.load( rf ) self.cfg = mergeJSON( self.cfg, ddd1 ) ## Merge cmdline values with cfg, performing some immediate actions ## And compile the backends constituting solver and checker(s) def mergeValues(self): if None!=self.args.mergeCfg: ### MERGE CFG FROM EXTRA FILES for eCfg in self.args.mergeCfg: self.mergeCfg( eCfg ) ################ Update some explicit cmdline params -- AFTER MERGING CFG FILES. if None!=self.args.failed: self.cfg["COMMON_OPTIONS"]["SOLUTION_CHECKING"]["s_FailedSaveFile"][0] = self.args.failed if None!=self.args.nCheckMax: self.cfg["COMMON_OPTIONS"]["SOLUTION_CHECKING"]["n_CheckedMax"][0] = self.args.nCheckMax if None!=self.args.nFailedSaveMax: self.cfg["COMMON_OPTIONS"]["SOLUTION_CHECKING"]["n_FailedSaveMax"][0] = self.args.nFailedSaveMax ################ SAVE FINAL CFG if None!=self.args.saveCfg: with utils.openFile_autoDir( self.args.saveCfg, 'w' ) as wf: print( "Saving final config to", self.args.saveCfg ) json.dump( self.cfg, wf, sort_keys=True, indent=json_config.n_JSON_Indent ) ### COMPILE THE SOLVER BACKEND if None!=self.args.solver: self.cfg["COMMON_OPTIONS"]["Solvers"][0] = self.args.solver slvPrfName = self.cfg["COMMON_OPTIONS"]["Solvers"][0] slvPrf = self.cfg["SOLVER_PROFILES"][slvPrfName] assert len(slvPrf)>0, "Solver profile '%s' should use at least a basic backend" % slvPrfName self.slvBE = self.cfg["BACKEND_DEFS"][slvPrf[0]] for i in range( 1, len( slvPrf ) ): self.slvBE = json_config.mergeJSON( self.slvBE, self.cfg["BACKEND_DEFS"][slvPrf[i]] ) if None!=self.args.tSolve: self.slvBE["EXE"]["n_TimeoutRealHard"][0] = self.args.tSolve assert None==self.args.solver or None==self.args.call, "ERROR: both solver call and a solver profile specified." if None!=self.args.call: ## After the compilation self.slvBE["EXE"]["s_SolverCall"][0] = self.args.call if None!=self.args.shellSolve: self.slvBE["EXE"]["b_ThruShell"][0] = self.args.shellSolve!=0 print ( "\nSolver/checker configurations:\n SLV_CFG: ", json.dumps( self.slvBE["EXE"] ) ) ### COMPILE THE CHECKER BACKENDS if None!=self.args.chkPrf and 00, "Checker profile '%s' should use at least a basic backend" % chkPrfName self.chkBEs.append( self.cfg["BACKEND_DEFS"][chkPrf[0]] ) for i in range( 1, len( chkPrf ) ): self.chkBEs[-1] = json_config.mergeJSON( self.chkBEs[-1], self.cfg["BACKEND_DEFS"][chkPrf[i]] ) if None!=self.args.tCheck: self.chkBEs[-1]["EXE"]["n_TimeoutRealHard"][0] = self.args.tCheck print ( " CHK_CFG: ", json.dumps( self.chkBEs[-1]["EXE"] ) ) print( "" ) ### SAVE THE SOLVER BACKEND if None!=self.args.saveSolverCfg: with utils.openFile_autoDir( self.args.saveSolverCfg, 'w' ) as wf: print( "Saving solver config to", self.args.saveSolverCfg ) json.dump( self.slvBE, wf, sort_keys=True, indent=json_config.n_JSON_Indent ) ### SAVE THE CHECKER BACKENDS if None!=self.args.saveCheckerCfg: with utils.openFile_autoDir( self.args.saveCheckerCfg, 'w' ) as wf: print( "Saving checker config to", self.args.saveCheckerCfg ) json.dump( self.chkBE, wf, sort_keys=True, indent=json_config.n_JSON_Indent ) self.sThisName = self.args.result if None!=self.args.name: self.sThisName = self.args.name def __init__(self): self.cfgDefault = self.initCfgDefault() self.cfg = self.cfgDefault ### Further parameters self.args = {} def __str__(self): s_Out = json.dumps( self.cfg, sort_keys=True, indent=json_config.n_JSON_Indent ) + '\n' s_Out += str(self.args) + '\n' s_Out += "\n >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SOLVER BACKEND:\n" s_Out += json.dumps( self.slvBE, sort_keys=True, indent=json_config.n_JSON_Indent ) + '\n' s_Out += "\n >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CHECKER BACKENDS:\n" for chkBE in self.chkBEs: s_Out += json.dumps( chkBE, sort_keys=True, indent=json_config.n_JSON_Indent ) + '\n' return s_Out ############################################################################################## ################### The MZNTest class ############################################################################################## class MznTest: ## Produce a pair: first, a string identifying the instance which is given as a string of the instance files ## Second, same without paths and file extensions for short printing ## the elements are sorted according to the extensions list, then alphabetically def getIName( self, s_Inst ): lId = s_Inst.split() ## list of instance files lExt = self.params.cfg["COMMON_OPTIONS"]["Instance_List"]["InstanceFileExt"] lId = sorted( lId, key = lambda nm: ( lExt.index( os.path.splitext(nm)[1] ) \ if os.path.splitext(nm)[1] in lExt else len(lExt), os.path.basename( nm ) ) ) lId2 = [ os.path.splitext( os.path.basename( fln ) )[0] for fln in lId ]; return ' '.join(lId), ' '.join(lId2); def obtainParams( self ): self.params.obtainParams() ## If an instance was specified in cmdline, or model list(s) supplied def compileExplicitModelLists(self): ## Get cmdline filenames or from the --instList arguments ## Can compile the list from log files, see below self.params.instList = [] ## Only if -l not used, take the pos args if (self.params.args.l_InstLists is None or 0==len( self.params.args.l_InstLists )) \ and self.params.args.instanceFiles is not None and 0 this is solving (not checking) and will use --checkDZN if opted ## TODO ## Because we cannot limit memory of the subprocesses directly AND there seem to be bugs in the Python 3.4 impl, ## could replace the subprocess call by a call to an external which would run under given memory/time limits ## and save output to given files. ## OR: update from Python 3.4.2? ## NAming output / model files: sort input filenames, replace spaces/punctuation ### USE smth like ## keepcharacters = (' ','.','_') ## "".join(c for c in filename if c.isalnum() or c in keepcharacters else 'I').strip() ## PARAMETERS ## : solList: if not None, we are solving originally ( not checking ) def solveInstance(self, s_Inst, slvBE, slvName, solList=None): resSlv = OrderedDict() bChkDZN = True if None!=solList and None!=self.params.args.checkDZN else False if bChkDZN: print( "_PARSING '", self.params.args.checkDZN, sep='', end="'... " ) with open( self.params.args.checkDZN, 'r' ) as ro: mzn_exec.parseStdout( ro, resSlv, slvBE["Stdout_Keylines"], slvBE["Stdout_Keyvalues"], solList ) print( ro.tell(), "bytes", end='' ) if None!=self.params.args.checkStderr: print( " and '", self.params.args.checkStderr, sep='', end="'... " ) with open( self.params.args.checkStderr, 'r' ) as re: mzn_exec.parseStderr( re, resSlv, slvBE["Stderr_Keylines"], slvBE["Stderr_Keyvalues"] ) print( re.tell(), "bytes", end='' ) else: #### Solving oneself print( slvName, "... ", sep='', end='', flush=True ) s_Call = slvBE["EXE"]["s_SolverCall"][0] % s_Inst \ + ' ' + slvBE["EXE"]["s_ExtraCmdline"][0] if self.params.args.addOption is not None: for sOpt in self.params.args.addOption: s_Call += ' ' + sOpt if solList is not None: if self.params.args.addSolverOption is not None: for sOpt in self.params.args.addSolverOption: s_Call += ' ' + sOpt else: if self.params.args.addCheckerOption is not None: for sOpt in self.params.args.addCheckerOption: s_Call += ' ' + sOpt s_InstMerged = s_Inst.strip() ## s_InstMerged = regex.sub( r"[.\\/:~]", "", s_InstMerged ); ## s_InstMerged = regex.sub( r"[ ]", "-", s_InstMerged ); keepcharacters = ('-','_') s_InstMerged = "".join(c if c.isalnum() or c in keepcharacters else 'I' for c in s_InstMerged).strip() if solList is not None and self.params.args.useJoinedName is not None: for sUseJN in self.params.args.useJoinedName: s_UsingOpt = sUseJN % s_InstMerged s_Call += ' ' + s_UsingOpt if solList is not None: ## solving the original instance sFlnStdout = sFlnStdoutBase.format( s_InstMerged ) sFlnStderr = sFlnStderrBase.format( s_InstMerged ) if self.params.args.debug is not None and ( self.params.args.debug & 1 ): print( " CALL: \"", s_Call, "\"", sep='', flush=True ) else: sFlnStdout = 'last_stdout' + slvName + '.txt' sFlnStderr = 'last_stderr' + slvName + '.txt' if self.params.args.debug is not None and ( self.params.args.debug & 2 ): print( " CALL: \"", s_Call, "\"", sep='', flush=True ) resSlv["Solver_Call"] = s_Call resSlv["DateTime_Start"] = datetime.datetime.now().__str__() if 1==self.params.args.psutils: completed, tmAll = \ mzn_exec.runCmd( s_Call, slvBE["EXE"]["b_ThruShell"][0], slvBE["EXE"]["n_TimeoutRealHard"][0], slvBE["EXE"]["n_VMEMLIMIT_SoftHard"] ) with utils.openFile_autoDir( sFlnStdout, "w" ) as tf: tf.write( completed.stdout ) with utils.openFile_autoDir( sFlnStderr, "w" ) as tf: tf.write( completed.stderr ) print( "STDOUT/ERR: ", len(completed.stdout), '/', len(completed.stderr), " bytes", sep='', end=', ' ) mzn_exec.parseStderr( io.StringIO( completed.stderr ), resSlv, slvBE["Stderr_Keylines"], slvBE["Stderr_Keyvalues"] ) mzn_exec.parseStdout( io.StringIO( completed.stdout ), resSlv, slvBE["Stdout_Keylines"], slvBE["Stdout_Keyvalues"], solList ) ## Adding the outputs to the log ## resSlv["StdErr"] = completed.stderr ## resSlv["StdOut"] = completed.stdout else: ## use the 'system' call with utils.openFile_autoDir( sFlnStdout, "w" ) as tf: tf.write( "% EMPTY\n" ) with utils.openFile_autoDir( sFlnStderr, "w" ) as tf: tf.write( "% EMPTY" ) tmAll = mzn_exec.runCmdCmdline( s_Call, sFlnStdout, sFlnStderr, self.params.cfg["COMMON_OPTIONS"]["runCommand"], slvBE["EXE"]["n_TimeoutRealHard"][0], (self.params.args.verbose) if solList is not None else (self.params.args.vc), slvBE["EXE"]["n_VMEMLIMIT_SoftHard"] ) with open( sFlnStderr, "r" ) as rf: mzn_exec.parseStderr( rf, resSlv, slvBE["Stderr_Keylines"], slvBE["Stderr_Keyvalues"] ) with open( sFlnStdout, "r" ) as rf: mzn_exec.parseStdout( rf, resSlv, slvBE["Stdout_Keylines"], slvBE["Stdout_Keyvalues"], solList ) print( " t: {:.3f}".format( tmAll ), end=' s, ' ) resSlv["DateTime_Finish"] = datetime.datetime.now().__str__() resSlv["TimeReal_All"] = tmAll resSlv["TimeReal_LastStatus"] = 0 resSlv["Hostname"] = platform.uname()[1] ### For all cases, some postprocessing ############################# if "Sol_Status" not in resSlv: resSlv["Sol_Status"] = [-50, " !!!!! STATUS TOTALLY UNKNOWN - NO STATUS LINE PARSED."] if "Time_Flt" not in resSlv or utils.try_float( resSlv.get( "Time_Flt" ) ) is None: resSlv["NOFZN"] = [" !!!!! No flattening finish time registered or successfully parsed"] dTmLast = utils.try_float( resSlv.get( "RealTime_Solns2Out" ) ) if None!=dTmLast: resSlv["TimeReal_LastStatus"] = dTmLast / 1000.0 resSlv.pop( "RealTime_Solns2Out" ) ## if "SolutionLast" in resSlv: ## print( " SOLUTION_LAST:\n", resSlv["SolutionLast"], sep='' ) if None!=solList: print( " Nsol:", len(solList), end=',' ) print( " STATUS:", resSlv["Sol_Status"] ) return resSlv ## Append the unchecked solution of the instance to a temp. file def saveSolution(self, wf): json_log.writeLogChunk( wf, json.dumps( self.result, indent=json_config.n_JSON_Indent ) ) ## Return the necessity to check solutions. ## Can be false if we only want to compare different solvers. def ifShouldCheck(self): return \ 00 ## Check selected solutions of the instance def checkOriginal( self, s_Inst ): nCM = self.params.cfg["COMMON_OPTIONS"]["SOLUTION_CHECKING"]["n_CheckedMax"][0] nFSM = self.params.cfg["COMMON_OPTIONS"]["SOLUTION_CHECKING"]["n_FailedSaveMax"][0] assert 0!=nCM assert 0chkRes["Sol_Status"][0] and -3<=chkRes["Sol_Status"][0] ) ): ## INFEAS bCheckOK = False chkFlSt = chkRes["Sol_Status"] self.result["SOLUTION_CHECKS_DONE"] += 1 if not bCheckOK: fFailed = 1 self.result["SOLUTION_CHECKS_FAILED"] += 1 self.result["SOLUTION_FAILED_LAST"] = self.solList[ iSol ] # self.result["SOLUTION_FAILED_LAST__CHKSTATUS"] = chkRes["Sol_Status"] if self.fileFail is None: self.fileFail = utils.openFile_autoDir( self.fileFailName, "w" ) self.saveSolution( self.fileFail ) if nFSM<=self.result["SOLUTION_CHECKS_FAILED"]: print ( self.result["SOLUTION_CHECKS_FAILED"], "failed solution(s) saved, go on" ) break self.nCheckedInstances += 1 self.nChecksFailed += fFailed print( " CHECK FAILS on this instance: ", self.result["SOLUTION_CHECKS_FAILED"], ", total check-failed instances: ", self.nChecksFailed, " from ", self.nCheckedInstances, sep='' ) def __init__(self): ## Default params self.params = MZT_Param() ############################################################################################## ######################### MZNTest public ############################# ############################################################################################## def run(self): self.obtainParams() self.compileExplicitModelLists() self.compileResultLogs() if not self.bCmpOnly: self.runTheInstances() else: self.compareLogs() self.summarize() # def main mznTst = MznTest() mznTst.run() libminizinc-2.5.3/tests/benchmarking/mzn_exec.py0000644000175000017500000001642213757304533020461 0ustar kaolkaolimport timeit, re, sys, os import utils, json_config ## TODO Keyline/value dictionaries: entries == json_config.s_CommentKey are ignored. Make it a parameter class Output: def __init__( self ): stdout = "" stderr = "" def on_terminate(proc): print("process {} terminated with exit code {}".format(proc, proc.returncode)) ############################################################################################## ###################### MZN instance execution + result parsing low-level ##################### ############################################################################################## ## runCmdCmdline using system(). Actually used for checking as well. ## run the specified shell command string and return the time. ## can add ulimit etc. ## s1, s2: filenames for strout, stderr ## dictCmd: commands for Win and non-Win ## meml: list of 2 values, soft & hard limits as N bytes def runCmdCmdline( s_Cmd, s1, s2, dictCmd, timeo, bVerbose=False, meml=None ): tm = timeit.default_timer() setCmd = dictCmd["windows"] if "win" in sys.platform and "cygwin" not in sys.platform else dictCmd["non-windows"] sCmd = setCmd["runVerbose" if bVerbose else "runSilent"].format(meml[1], timeo, s_Cmd, s1, s2) print( "\n RUNNING:", sCmd ) os.system(sCmd) tm = timeit.default_timer() - tm return tm ## runCmd using psutils. Actually should be used for checking as well. ## run the specified shell command string and return the popen result. ## TODO catch intermediate solutions if needed ## meml: list of 2 values, soft & hard limits as N bytes def runCmd( s_Cmd, b_Shell=False, timeo=None, meml=None ): import psutil, shlex, subprocess, resource if b_Shell: l_Cmd = s_Cmd else: l_Cmd = shlex.split( s_Cmd ) tm = timeit.default_timer() ################# In the following, the subprocess.RUN method fails to kill shell calls on Linux #try: # completed = subprocess.run( l_Cmd, shell=b_Shell, # universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=timeo ) #except subprocess.TimeoutExpired as te: # completed = te ################# Using psutils proc = psutil.Popen(l_Cmd, shell=b_Shell, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if None!=meml: if hasattr( psutil, 'RLIMIT_AS' ): ## TODO move into preexec_fn for parallel tests? proc.rlimit( resource.RLIMIT_AS, ( meml[0]*1000, meml[1]*1000 ) ) else: print( " ... but the OS doesn't support RLIMIT_AS." ) completed = Output() try: completed.stdout, completed.stderr = proc.communicate(timeout=timeo) except subprocess.TimeoutExpired: print ( " soft_kill. ", end='' ) procs = psutil.Process().children(recursive=True) for p in procs: p.terminate() try: completed.stdout, completed.stderr = proc.communicate(timeout=1) except subprocess.TimeoutExpired as te: print ( " hard_kill. ", end='' ) procs = psutil.Process().children(recursive=True) for p in procs: p.kill() completed.stdout, completed.stderr = proc.communicate() ### Clean up: (does psutil.Process.communicate() wait for all descendants?) ----------------------------------- procs = psutil.Process().children(recursive=True) for p in procs: p.kill() ### OR: even Queue? # with psutil.Popen(["ifconfig"], stdout=subprocess.PIPE) as proc: # log.write(proc.stdout.read()) # # procs = psutil.Process().children() # for p in procs: # p.terminate() # gone, still_alive = psutil.wait_procs(procs, timeout=3, callback=on_terminate) # for p in still_alive: # p.kill() tm = timeit.default_timer() - tm return completed, tm def parseStderr( f, result, mapKL, mapKV ): # result["ProbSense"] = None # result["TimeFlt"] = None for line in f: line = line.strip() checkKeylines( line, mapKL, result ) checkKeyvalues( line, mapKV, result ) ## Puts feasible solutions into solList if it's not None def parseStdout( f, result, mapKL, mapKV, solList ): l_SolLast = "" n_SolStatus = 0 result["Number_Solutions"] = 0 for line in f: line = line.rstrip() ## To remove \n and spaces on the right res00 = {} ## A temporary to see if we get a feasible solution separator checkKeylines( line, mapKL, res00 ) utils.mergeDict( result, res00 ) checkKeyvalues( line, mapKV, result ) ## See if it's a solution status if "Sol_Status" in res00: if 1==res00[ "Sol_Status" ][0]: result["Number_Solutions"] += 1 ## result["Solution_Last"] = l_SolLast ## Or save it? Need from a file then but might be great to have here if None!=solList: solList.append( l_SolLast ) l_SolLast = "" ## Clean up else: l_SolLast += line l_SolLast += '\n' ## Check if any keylines of the given 2-level dictionary equal the given line ## The 1st level gives variable name, 2nd level gives the line->value map def checkKeylines( line, dict2, result ): assert dict==type(dict2) ## What if we use OrderedDict??? TODO assert isinstance(result, dict) for key in dict2: if json_config.s_CommentKey!=key: val1 = dict2[key] assert dict==type(val1), "checkKeylines: key '%s': '%s'==type (%s)" % \ ( key, type(val1), val1.__str__() ) if line in val1: result[ key ] = [ val1[ line ], line ] ## Check if any search pattern of the given dict values is in the given line ## The key gives variable name, value gives the line->value mapping def checkKeyvalues( line, dictVal, result ): assert dict==type(dictVal) ## What if we use OrderedDict??? TODO assert isinstance(result, dict) for key in dictVal: if json_config.s_CommentKey!=key: paramArray = dictVal[ key ] assert 3<=len( paramArray ), \ "Key '%s': param list should have >=3 elements, now: %s" % (key, paramArray.__str__()) if None!=re.search( paramArray[0], line ): try: lineSubst = re.sub( paramArray[1], ' ', line ) except: print(" WARNING: failed to substitute regex '", paramArray[1], "' by ' ' in string '", line, "': ", sys.exc_info()[0:2] , sep='') else: lSL = lineSubst.split() if len( lSL )>paramArray[2]-1: s_Val = lSL[ paramArray[2]-1 ] ## d_Val = try_float( s_Val ) result[key] = s_Val ### [ d_Val, s_Val ] Need here? ## print( " checkKeyval: result[{}] = '{}'".format(key, s_Val) ) else: print( "ERROR: Parsing output line ", lSL, ": regex key '", paramArray[0], "' found, but the split line too short for index ", paramArray[2], sep='' ) libminizinc-2.5.3/tests/benchmarking/json_log.py0000644000175000017500000000272513757304533020464 0ustar kaolkaolimport json, sys ########################### LOGFILES ######################### sChunkSep = '---' ## A single line like this separates chunks in a logfile ############################################################################################## ###################### Logfile I/O ##################### ############################################################################################## ## PROBLEM: JSON does not allow appending. ## WORKAROUND: separate [JSON] chunks by '---', inspired by https://github.com/pvorb/jsml. ## Writing an arbitrary chunk: ensure end-of-line before separator def writeLogChunk( wf, ch ): ss = ch.__str__() wf.write( ss ) if 0 MiniZinc Test Creator
  • {{ modified[file] ? '● ' : '' }}{{file}}
Edit test case
  • {{ c.name ? c.name : `Test case ${i+1}`}}
Test Case
Solvers
Checkers
Type
Options
Extra command line options
Expected Output
Generate
libminizinc-2.5.3/tests/minizinc_testing/helpers.py0000644000175000017500000000261013757304533021232 0ustar kaolkaolfrom . import yaml @yaml.sequence(u"!Unordered") class Unordered: """ A list where order is not important (like a set, except elements can be repeated) Represented by `!Unordered` in YAML. """ def __init__(self, *args): self.items = args def __iter__(self): return iter(self.items) def __eq__(self, other): items = list(self.items) try: for x in other: items.remove(x) return True except ValueError: return False @yaml.scalar(u"!Approx") class Approx: """ A helper which allows for approximate comparison of floats using `!Approx` """ def __init__(self, value, threshold=0.000001): self.value = float(value) self.threshold = threshold def __eq__(self, other): diff = abs(other - self.value) return diff <= self.threshold def __repr__(self): return "Approx({})".format(self.value) def get_value(self): return self.value @yaml.scalar(u"!Trim") class Trim: """ A helper which allows for comparison of trimmed strings with `!Trim` """ def __init__(self, value): self.value = value def __eq__(self, other): return self.value.strip() == other.strip() def __repr__(self): return "Strip({})".format(self.value) def get_value(self): return self.value libminizinc-2.5.3/tests/minizinc_testing/create.py0000644000175000017500000001114613757304533021037 0ustar kaolkaolfrom . import yaml from . import spec from . import helpers from flask import Flask, request, jsonify from glob import glob from datetime import timedelta import re app = Flask(__name__) @app.route("/") def root(): return app.send_static_file("index.html") @app.route("/files.json") def files(): files = [x[5:].replace("\\", "/") for x in glob("spec/**/*.mzn", recursive=True)] return jsonify({"files": files}) @app.route("/file.json") def file(): path = "./spec/" + request.args["f"] with open(path, encoding="utf-8") as file: contents = file.read() yaml_comment = re.match(r"\/\*\*\*\n(.*?)\n\*\*\*\/", contents, flags=re.S) if yaml_comment is None: return jsonify({"cases": []}) tests = [x for x in yaml.load_all(yaml_comment.group(1))] cases = [ { k: v for k, v in test.__dict__.items() if v is not yaml.Undefined and k in ["name", "solvers", "check_against", "markers", "type",] } for test in tests ] for case, test in zip(cases, tests): case["extra_files"] = "\n".join(test.extra_files) case["expected"] = ( [{"value": yaml.dump(expected)} for expected in test.expected] if isinstance(test.expected, list) else [{"value": yaml.dump(test.expected)}] ) case["options"] = [ {"key": k, "value": (v if isinstance(v, str) else "")} for k, v in test.options.items() if k not in ["all_solutions", "timeout"] ] case["all_solutions"] = ( "all_solutions" in test.options and test.options["all_solutions"] ) case["timeout"] = ( test.options["timeout"].total_seconds() if "timeout" in test.options else 0 ) return jsonify({"cases": cases}) def load_spec(data): items = { k: v for k, v in data.items() if k in ["name", "solvers", "check_against", "markers", "type"] } items["extra_files"] = data["extra_files"].splitlines(keepends=False) items["expected"] = [yaml.load(x["value"]) for x in data["expected"]] items["options"] = { x["key"]: (x["value"] if len(x["value"]) > 0 else True) for x in data["options"] } items["options"]["all_solutions"] = data["all_solutions"] if not data["timeout"] == "" and float(data["timeout"]) > 0: items["options"]["timeout"] = timedelta(seconds=float(data["timeout"])) print(items) return spec.Test(**items) @app.route("/generate.json", methods=["POST"]) def generate(): path = "./spec/" + request.args["f"] variables = request.args["vars"].splitlines(keepends=False) mode = request.args["mode"] data = request.json def filter_args(solution, mode, variables): if mode == "exclude": for x in variables: delattr(solution, x) else: all_vars = [x for x in solution.__dict__.keys()] for x in all_vars: if x not in variables: delattr(solution, x) return solution test = load_spec(data) generated = [] for solver in test.solvers: model, result, required, obtained = test.run(path, solver) if not test.passed(result): if isinstance(obtained, spec.Result): if isinstance(obtained.solution, list): obtained.solution = [ filter_args(s, mode, variables) for s in obtained.solution ] else: filter_args(obtained.solution, mode, variables) test.expected.append(obtained) generated.append({"value": yaml.dump(obtained)}) return jsonify({"obtained": generated}) @app.route("/save.json", methods=["POST"]) def save(): path = "./spec/" + request.args["f"] data = request.json dumped = yaml.dump_all(load_spec(x) for x in data) with open(path, encoding="utf-8", mode="r+") as file: contents = file.read() yaml_comment = re.match( r"^(.*\/\*\*\*\n)(.*?)(\n\*\*\*\/.*)$", contents, flags=re.S ) output = "" if yaml_comment is None: output = "/***\n" + dumped + "***/\n\n" + contents else: output = yaml_comment.group(1) + dumped + yaml_comment.group(3) file.seek(0) file.truncate() file.write(output) return jsonify({"status": "success"}) if __name__ == "__main__": app.run(debug=True) libminizinc-2.5.3/tests/pytest.ini0000644000175000017500000000051513757304533015674 0ustar kaolkaol[pytest] addopts = --tb=short --html=output/report.html --css=style.css --junitxml=output/junit.xml -n auto --instafail --dist=loadfile -rs junit_family = xunit2 junit_suite_name = minizinc junit_logging = system-err log_cli = True testpaths = spec markers = push: mark test for run on push check: mark test as a checker testlibminizinc-2.5.3/README.md0000644000175000017500000001474013757304533013765 0ustar kaolkaol

Logo

MiniZinc

A high-level constraint modelling language that allows you to easily express and solve discrete optimisation problems.
Visit our website »

View Documentation · Report Bug · Request Feature

## Table of Contents * [About the Project](#about-the-project) * [Getting Started](#getting-started) * [Installation](#installation) * [Usage](#usage) * [Building](#building) * [Prerequisites](#prerequisites) * [Compilation](#compilation) * [Testing](#testing) * [License](#license) * [Contact](#contact) ## About The Project MiniZinc is a free and open-source constraint modeling language. You can use MiniZinc to model constraint satisfaction and optimisation problems in a high-level, solver-independent way, taking advantage of a large library of pre-defined constraints. Your model is then compiled into FlatZinc, a solver input language that is understood by a wide range of solvers. MiniZinc is developed at Monash University in collaboration with Data61 Decision Sciences. ## Getting Started To get a MiniZinc up and running follow these simple steps. ### Installation The recommended way to install _MiniZinc_ is by the use of the bundled binary packages. These packages are available for machines running Linux, Mac, and Windows. The latest release can be found on [the MiniZinc website](http://www.minizinc.org/software.html). ### Usage Once the MiniZinc bundle is installed on your machine, you can start expressing and solving discrete optimisation problems. The following code segment shows a MiniZinc model for the well known n-queens problem. ```minizinc int: n = 8; % The number of queens. array [1..n] of var 1..n: q; include "alldifferent.mzn"; constraint alldifferent(q); constraint alldifferent(i in 1..n)(q[i] + i); constraint alldifferent(i in 1..n)(q[i] - i); ``` You have two easy options to solve this model: - In the MiniZincIDE: Select your preferred solver and press the "Run" button. - With the `minizinc` executable available on your path: run `minizinc --solver gecode nqueens.mzn`. _For more example MiniZinc models and more information about working with MiniZinc, please refer to our [Documentation](https://www.minizinc.org/doc-latest/)_ ## Building The following instructions will help you compile the MiniZinc compiler. Note that this repository does not include the IDE, findMUS, or any solvers that are part of the MiniZinc project. These can be found in the following repositories: - [MiniZincIDE](https://github.com/MiniZinc/MiniZincIDE) - [Gecode](https://github.com/Gecode/gecode) - [Chuffed](https://github.com/chuffed/chuffed) ### Prerequisites - [CMake](https://cmake.org/) (>=3.4) - A recent C++ compiler - Compilation is tested with recent versions of Clang, GCC, and Microsoft Visual C++. - (optional) [Bison](https://www.gnu.org/software/bison/) (>=3.4) and [Flex](https://github.com/westes/flex) (>=2.5) - To make changes to the MiniZinc lexer or parser. - (optional) [Gecode](https://www.gecode.org/) - To compile the internal Gecode solver interface (included in the MiniZinc bundle) - (optional) [Coin OR's CBC](https://www.coin-or.org/) - To compile the internal CBC solver interface (included in the MiniZinc bundle) - (optional) Proprietary solver headers ([CPLEX](https://www.ibm.com/analytics/cplex-optimizer), [Gurobi](https://www.gurobi.com/), [SCIP](https://www.scipopt.org/), [Xpress](https://www.fico.com/)) - To load these solvers at runtime (included in the MiniZinc bundle) ### Compilation The MiniZinc compiler is compiled as a CMake project. CMake's [User Interaction Guide](https://cmake.org/cmake/help/latest/guide/user-interaction/index.html) can provide you with a quick introduction to compiling CMake projects. The following CMake variables can be used in the MiniZinc project to instruct the compilation behaviour: | Variable | Default | Description | |----------------------------------------------|---------|-------------------------------------------------------------| | CMAKE_BUILD_TYPE | Release | Build type of single-configuration generators. | | CMAKE_INSTALL_PREFIX | | Install directory used by `--target install`. | | CMAKE_POSITION_INDEPENDENT_CODE | TRUE | Whether to create a position-independent targets | | ****_ROOT | | Additional directory to look for **** | | CMAKE_DISABLE_FIND_PACKAGE_**** | FALSE | Disable compilation of ****'s solver interface | | USE_PROPRIETARY | FALSE | Allow static linking of proprietary solvers | | ****_PLUGIN | TRUE | Load solver at runtime (instead of static compilation) | Possible values for **** are `CPlex`, `Geas`, `Gecode`, `Gurobi`, `OsiCBC`, `SCIP`, and `Xpress`. ## Testing The correctness of the MiniZinc compiler is tested using a [PyTest](https://docs.pytest.org/en/stable/) test suite. Instruction on how to run the test suite and how to add new tests can be found [here](https://github.com/MiniZinc/libminizinc/tree/master/tests) ## License Distributed under the Mozilla Public License Version 2.0. See `LICENSE` for more information. ## Contact 🏛 **MiniZinc Community** - Website: [https://www.minizinc.org/](https://www.minizinc.org/) - StackOverflow: [https://stackoverflow.com/questions/tagged/minizinc](https://stackoverflow.com/questions/tagged/minizinc) - Google Groups: [https://groups.google.com/g/minizinc](https://groups.google.com/g/minizinc) 🏛 **Monash Optimisation Group** - Website: [https://www.monash.edu/it/dsai/optimisation](https://www.monash.edu/it/dsai/optimisation) libminizinc-2.5.3/include/0000755000175000017500000000000013757304533014123 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/0000755000175000017500000000000013757304533015743 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solver_instance_base.hh0000644000175000017500000001250313757304533022455 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include #include #include namespace MiniZinc { /// An abstract SI class SolverInstanceBase { protected: Env& _env; Solns2Out* _pS2Out = nullptr; std::ostream& _log; public: /// Options base class /// A sub-class will be provided by each concrete SolverInstance class Options { public: bool verbose = false; bool printStatistics = false; }; protected: std::unique_ptr _options; typedef SolverInstance::Status Status; typedef SolverInstance::StatusReason StatusReason; Status _status; StatusReason _statusReason; public: SolverInstanceBase(Env& env, std::ostream& log, Options* options) : _env(env), _log(log), _options(options), _status(SolverInstance::UNKNOWN), _statusReason(SolverInstance::SR_OK) {} virtual ~SolverInstanceBase() {} /// Set/get the environment: virtual Env* getEnv() const { assert(&_env); return &_env; } virtual Env& env() const { return *getEnv(); } Solns2Out* getSolns2Out() const { assert(_pS2Out); return _pS2Out; } void setSolns2Out(Solns2Out* s2o) { _pS2Out = s2o; } virtual void printSolution(); // virtual void printSolution(ostream& ); // deprecated /// print statistics in form of comments virtual void printStatistics() {} virtual void printStatisticsLine(bool fLegend = false) {} /// find the next solution virtual Status next() = 0; /// generate the solver-instance-representation from the flatzinc model virtual void processFlatZinc() = 0; /// clean up input model & flatzinc void cleanupForNonincrementalSolving() const { getEnv()->envi().cleanupExceptOutput(); } /// solve the problem instance (according to the solve specification in the flatzinc model) virtual Status solve(); /// return reason for status given by solve virtual StatusReason reason() { return _statusReason; } virtual Status status() { return _status; } void setStatus(Status s) { _status = s; } Options* options() { return _options.get(); } /// reset the model to its core (removing temporary cts) and the solver to the root node of the /// search static void reset(); /// reset the solver to the root node of the search TODO: difference between reset() and /// resetSolver()? virtual void resetSolver() = 0; /// reset the solver and add temporary constraints given by the iterator virtual void resetWithConstraints(Model::iterator begin, Model::iterator end); /// add permanent constraints given by the iterator to the solver instance virtual void processPermanentConstraints(Model::iterator begin, Model::iterator end); protected: /// flatten the search annotations, pushing them into the vector \a out void flattenSearchAnnotations(const Annotation& ann, std::vector& out); void flattenMultipleObjectives(const Annotation& ann, MultipleObjectives& mo) const; static void flattenMultObjComponent(const Annotation& ann, MultipleObjectives::Objective& obj); private: SolverInstanceBase(const SolverInstanceBase&); SolverInstanceBase& operator=(const SolverInstanceBase&); }; /// This implements a solver which is linked and returns its solution by assignSolutionToOutput() class SolverInstanceBase2 : public SolverInstanceBase { protected: virtual Expression* getSolutionValue(Id* id) = 0; public: /// Assign output for all vars: need public for callbacks // Default impl requires a Solns2Out object set up virtual void assignSolutionToOutput(); /// Print solution to setup dest void printSolution() override; protected: std::vector _varsWithOutput; // this is to extract fzn vars. Identical to output()? TODO public: SolverInstanceBase2(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) : SolverInstanceBase(env, log, opt) {} }; typedef void (*poster)(SolverInstanceBase&, const Call* call); class Registry { protected: ManagedASTStringMap _registry; SolverInstanceBase& _base; public: Registry(SolverInstanceBase& base) : _base(base) {} void add(ASTString name, poster p); void add(const std::string& name, poster p); void post(Call* c); void cleanup() { _registry.clear(); } }; /// Finally, this class also stores a mapping VarDecl->SolverVar and a constraint transformer /// It is a template holding parameterized VarId and Statistics, so cannot have members defined in a /// .cpp template class SolverInstanceImpl : public SolverInstanceBase2 { public: typedef typename Solver::Variable VarId; protected: IdMap _variableMap; // this to find solver's variables given an Id Registry _constraintRegistry; public: SolverInstanceImpl(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) : SolverInstanceBase2(env, log, opt), _constraintRegistry(*this) {} }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solns2out.hh0000644000175000017500000001422613757304533020241 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include // temp., TODO #include #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { /// Class handling fzn solver's output /// could facilitate exhange of raw/final outputs in a portfolio class Solns2Out { protected: std::unique_ptr _envGuard; Env* _env = nullptr; Model* _outputModel = nullptr; typedef std::pair DE; ManagedASTStringMap _declmap; Expression* _outputExpr = nullptr; std::string _checkerModel; std::string _statisticsCheckerModel; bool _fNewSol2Print = false; // should be set for evalOutput to work public: std::string solution; std::string comments; int nLinesIgnore = 0; struct Options { std::string flagOutputFile; bool flagOutputComments = true; bool flagOutputFlush = true; bool flagOutputTime = false; int flagIgnoreLines = 0; bool flagUnique = true; bool flagCanonicalize = false; bool flagStandaloneSolns2Out = false; std::string flagOutputNoncanonical; std::string flagOutputRaw; int flagNumberOutput = -1; /// Default values, also used for input const char* const solutionSeparatorDef = "----------"; const char* const unsatisfiableMsgDef = "=====UNSATISFIABLE====="; const char* const unboundedMsgDef = "=====UNBOUNDED====="; const char* const unsatorunbndMsgDef = "=====UNSATorUNBOUNDED====="; const char* const unknownMsgDef = "=====UNKNOWN====="; const char* const errorMsgDef = "=====ERROR====="; const char* const searchCompleteMsgDef = "=========="; /// Output values std::string solutionSeparator = solutionSeparatorDef; std::string solutionComma = ""; std::string unsatisfiableMsg = unsatisfiableMsgDef; std::string unboundedMsg = unboundedMsgDef; std::string unsatorunbndMsg = unsatorunbndMsgDef; std::string unknownMsg = unknownMsgDef; std::string errorMsg = errorMsgDef; std::string searchCompleteMsg = searchCompleteMsgDef; } opt; struct Statistics { unsigned long long nSolns = 0; unsigned long long nFails = 0; unsigned long long nNodes = 0; } stats; ~Solns2Out(); Solns2Out(std::ostream& os, std::ostream& log, std::string stdlibDir); bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); static void printHelp(std::ostream& os); /// The output model (~.ozn) can be passed in 1 way in this base class: /// passing Env* containing output() bool initFromEnv(Env* pE); /// Then, variable assignments can be passed either as text /// or put directly into envi()->output() ( latter done externally /// by e.g. SolverInstance::assignSolutionToOutput() ) /// In the 1st case, (part of) the assignment text is passed as follows, /// original end-of-lines need to be there as well bool feedRawDataChunk(const char* data); SolverInstance::Status status = SolverInstance::UNKNOWN; bool fStatusPrinted = false; /// Should be called when entering new solution into the output model. /// Default assignSolutionToOutput() does it by using findOutputVar(). void declNewOutput(); /// This can be used by assignSolutionToOutput() DE& findOutputVar(const ASTString& name); /// In the other case, /// the evaluation procedures print output/status to os /// returning false means need to stop (error/ too many solutions) /// Solution validation here TODO /// Note that --canonicalize delays output /// until ... exit, eof, ?? TODO /// These functions should only be called explicitly /// from SolverInstance bool evalOutput(const std::string& s_ExtraInfo = ""); /// This means the solver exits bool evalStatus(SolverInstance::Status status); void printStatistics(std::ostream& os); Env* getEnv() const { return _env; } Model* getModel() const { assert(getEnv()->output()); return getEnv()->output(); } /// Get the primary output stream /// First call restores stdout std::ostream& getOutput(); /// Get the secondary output stream std::ostream& getLog(); private: Timer _starttime; std::unique_ptr _outStream; // file output std::unique_ptr _outStreamNonCanon; std::unique_ptr _outStreamRaw; std::set _sSolsCanon; std::string _linePart; // non-finished line from last chunk /// Initialise from ozn file void initFromOzn(const std::string& filename); protected: std::ostream& _os; std::ostream& _log; std::vector _includePaths; std::string _stdlibDir; // Basically open output void init(); std::map _mapInputStatus; void createInputMap(); void restoreDefaults(); /// Parsing fznsolver's complete raw text output void parseAssignments(std::string& solution); /// Checking solution against checker model void checkSolution(std::ostream& os); void checkStatistics(std::ostream& os); bool evalOutputInternal(std::ostream& fout); bool evalOutputFinalInternal(bool flag_flush); bool evalStatusMsg(SolverInstance::Status status); }; // Passthrough Solns2Out class class Solns2Log { private: std::ostream& _log; std::ostream& _errLog; public: Solns2Log(std::ostream& log, std::ostream& errLog) : _log(log), _errLog(errLog) {} bool feedRawDataChunk(const char* data) { _log << data << std::flush; return true; } std::ostream& getLog() { return _errLog; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/flat_exp.hh0000644000175000017500000000236713757304533020076 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { void add_path_annotation(EnvI& env, Expression* e); void add_ctx_ann(VarDecl* vd, BCtx& c); bool istrue(EnvI& env, Expression* e); bool isfalse(EnvI& env, Expression* e); Expression* create_dummy_value(EnvI& env, const Type& t); TypeInst* eval_typeinst(EnvI& env, const Ctx& ctx, VarDecl* vd); KeepAlive bind(EnvI& env, Ctx ctx, VarDecl* vd, Expression* e); KeepAlive conj(EnvI& env, VarDecl* b, const Ctx& ctx, const std::vector& e); VarDecl* new_vardecl(EnvI& env, const Ctx& ctx, TypeInst* ti, Id* origId, VarDecl* origVd, Expression* rhs); KeepAlive flat_cv_exp(EnvI& env, Ctx ctx, Expression* e); void make_defined_var(VarDecl* vd, Call* c); void check_index_sets(EnvI& env, VarDecl* vd, Expression* e); class CallArgItem { public: EnvI& env; CallArgItem(EnvI& env0); ~CallArgItem(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/model.hh0000644000175000017500000003163413757304533017373 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include namespace MiniZinc { class VarDeclIterator; class ConstraintIterator; class FunctionIterator; class CopyMap; class EnvI; class Model; class VarDeclIteratorContainer { private: Model* _m; public: VarDeclIteratorContainer(Model* m) : _m(m) {} VarDeclIterator begin(); VarDeclIterator end(); }; class ConstraintIteratorContainer { private: Model* _m; public: ConstraintIteratorContainer(Model* m) : _m(m) {} ConstraintIterator begin(); ConstraintIterator end(); }; class FunctionIteratorContainer { private: Model* _m; public: FunctionIteratorContainer(Model* m) : _m(m) {} FunctionIterator begin(); FunctionIterator end(); }; /// A MiniZinc model class Model : public GCMarker { friend Model* copy(EnvI& env, CopyMap& cm, Model* m, bool isFlatModel); public: struct FnEntry { std::vector t; FunctionI* fi; bool isPolymorphic; FnEntry(FunctionI* fi0); bool operator<(const FnEntry& f) const; static bool compare(const FnEntry& e1, const FnEntry& e2); }; protected: /// Add all instances of polymorphic entry \a fe to \a entries static void addPolymorphicInstances(Model::FnEntry& fe, std::vector& entries); void mark(MINIZINC_GC_STAT_ARGS) override { _filepath.mark(); _filename.mark(); for (auto& _item : _items) { #if defined(MINIZINC_GC_STATS) Item::mark(_items[j], gc_stats); #else Item::mark(_item); #endif } }; /// Type of map from identifiers to function declarations using FnMap = ASTStringMap>; /// Map from identifiers to function declarations FnMap _fnmap; /// Type of map from Type (represented as int) to reverse mapper functions using RevMapperMap = std::unordered_map; /// Map from Type (represented as int) to reverse mapper functions RevMapperMap _revmapmap; /// Filename of the model ASTString _filename; /// Path of the model ASTString _filepath; /// Parent model if model was included Model* _parent; /// Items in the model std::vector _items; /// Pointer to the solve item SolveI* _solveItem; /// Pointer to the output item OutputI* _outputItem; /// File-level documentation comment std::string _docComment; /// Store some declarations struct FnDecls { using TCheckedDecl = std::pair; // bool means that it was checked TCheckedDecl boundsDisj = {false, nullptr}; // SCIP's bound disjunction } _fnDecls; public: /// Construct empty model Model(); /// Destructor ~Model() override; /// Add \a i to the model void addItem(Item* i); /// Get parent model Model* parent() const { return _parent; } /// Set parent model to \a p void setParent(Model* p) { assert(_parent == nullptr); _parent = p; } /// Get file name ASTString filename() const { return _filename; } /// Get file path ASTString filepath() const { return _filepath; } /// Set file name void setFilename(const std::string& f) { assert(_filename.size() == 0); _filename = ASTString(f); } /// Set file name void setFilename(const ASTString& f) { _filename = f; } /// Set file path void setFilepath(const std::string& f) { assert(_filepath.size() == 0); _filepath = ASTString(f); } void setFilepath(const ASTString& f) { assert(_filepath.size() == 0); _filepath = f; } /// Register a builtin function item bool registerFn(EnvI& env, FunctionI* fi, bool keepSorted = false, bool throwIfDuplicate = true); /// Sort functions by type void sortFn(); /// Check that registered functions do not clash wrt overloading void checkFnOverloading(EnvI& env); /// Fix function table after type checking void fixFnMap(); /// Return function declaration for \a id matching \a args FunctionI* matchFn(EnvI& env, const ASTString& id, const std::vector& args, bool strictEnums) const; /// Return function declaration for \a id matching types \a t FunctionI* matchFn(EnvI& env, const ASTString& id, const std::vector& t, bool strictEnums); /// Return function declaration matching call \a c FunctionI* matchFn(EnvI& env, Call* c, bool strictEnums, bool throwIfNotFound = false) const; /// Return function declaration for reverse mapper for type \a t FunctionI* matchRevMap(EnvI& env, const Type& t) const; /// Check whether functions \a f and \a g have the same overloaded variants bool sameOverloading(EnvI& env, const std::vector& args, FunctionI* f, FunctionI* g) const; /// Merge all builtin functions into \a m void mergeStdLib(EnvI& env, Model* m) const; /// Return item \a i Item*& operator[](unsigned int i); /// Return item \a i const Item* operator[](unsigned int i) const; /// Return number of items unsigned int size() const; typedef std::vector::iterator iterator; typedef std::vector::const_iterator const_iterator; /// Iterator for beginning of items iterator begin(); /// Iterator for beginning of items const_iterator begin() const; /// Iterator for end of items iterator end(); /// Iterator for end of items const_iterator end() const; ConstraintIteratorContainer constraints(); VarDeclIteratorContainer vardecls(); FunctionIteratorContainer functions(); SolveI* solveItem(); OutputI* outputItem(); void setOutputItem(OutputI* oi); /// Add a file-level documentation comment void addDocComment(const std::string& s) { _docComment += s; } /// Return the file-level documentation comment const std::string& docComment() const { return _docComment; } /// Remove all items marked as removed void compact(); /// Get the stored function declarations FnDecls& getFnDecls() { return _fnDecls; } }; class VarDeclIterator { Model* _model; Model::iterator _it; public: typedef Model::iterator::difference_type difference_type; typedef Model::iterator::value_type value_type; typedef VarDeclI& reference; typedef VarDeclI* pointer; typedef std::forward_iterator_tag iterator_category; VarDeclIterator() {} VarDeclIterator(const VarDeclIterator& vi) : _it(vi._it) {} VarDeclIterator(Model* model, const Model::iterator& it) : _model(model), _it(it) { while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())) { ++_it; } } ~VarDeclIterator() {} VarDeclIterator& operator=(const VarDeclIterator& vi) { if (this != &vi) { _it = vi._it; } return *this; } bool operator==(const VarDeclIterator& vi) const { return _it == vi._it; } bool operator!=(const VarDeclIterator& vi) const { return _it != vi._it; } VarDeclIterator& operator++() { do { ++_it; } while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())); return *this; } reference operator*() const { return *(*_it)->cast(); } pointer operator->() const { return (*_it)->cast(); } }; class ConstraintIterator { Model* _model; Model::iterator _it; public: typedef Model::iterator::difference_type difference_type; typedef Model::iterator::value_type value_type; typedef ConstraintI& reference; typedef ConstraintI* pointer; typedef std::forward_iterator_tag iterator_category; ConstraintIterator() {} ConstraintIterator(const ConstraintIterator& vi) : _it(vi._it) {} ConstraintIterator(Model* model, const Model::iterator& it) : _model(model), _it(it) { while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())) { ++_it; } } ~ConstraintIterator() {} ConstraintIterator& operator=(const ConstraintIterator& vi) { if (this != &vi) { _it = vi._it; } return *this; } bool operator==(const ConstraintIterator& vi) const { return _it == vi._it; } bool operator!=(const ConstraintIterator& vi) const { return _it != vi._it; } ConstraintIterator& operator++() { do { ++_it; } while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())); return *this; } reference operator*() const { return *(*_it)->cast(); } pointer operator->() const { return (*_it)->cast(); } }; class FunctionIterator { Model* _model; Model::iterator _it; public: typedef Model::iterator::difference_type difference_type; typedef Model::iterator::value_type value_type; typedef FunctionI& reference; typedef FunctionI* pointer; typedef std::forward_iterator_tag iterator_category; FunctionIterator() {} FunctionIterator(const FunctionIterator& vi) : _it(vi._it) {} FunctionIterator(Model* model, const Model::iterator& it) : _model(model), _it(it) { while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())) { ++_it; } } ~FunctionIterator() {} FunctionIterator& operator=(const FunctionIterator& vi) { if (this != &vi) { _it = vi._it; } return *this; } bool operator==(const FunctionIterator& vi) const { return _it == vi._it; } bool operator!=(const FunctionIterator& vi) const { return _it != vi._it; } FunctionIterator& operator++() { do { ++_it; } while (_it != _model->end() && (!(*_it)->isa() || (*_it)->removed())); return *this; } reference operator*() const { return *(*_it)->cast(); } pointer operator->() const { return (*_it)->cast(); } }; class EnvI; /// Environment class Env { private: EnvI* _e; public: Env(Model* m = nullptr, std::ostream& outstream = std::cout, std::ostream& errstream = std::cerr); ~Env(); Model* model(); void model(Model* m); Model* flat(); void swap(); Model* output(); EnvI& envi(); const EnvI& envi() const; std::ostream& dumpErrorStack(std::ostream& os); const std::vector& warnings(); void clearWarnings(); unsigned int maxCallStack() const; std::ostream& evalOutput(std::ostream& os, std::ostream& log); }; class CallStackItem { public: EnvI& env; CallStackItem(EnvI& env0, Expression* e); CallStackItem(EnvI& env0, Id* ident, IntVal i); ~CallStackItem(); }; /// Visitor for model items class ItemVisitor { public: /// Enter model static bool enterModel(Model* /*m*/) { return true; } /// Enter item static bool enter(Item* /*m*/) { return true; } /// Visit include item void vIncludeI(IncludeI* /*ii*/) {} /// Visit variable declaration void vVarDeclI(VarDeclI* /*vdi*/) {} /// Visit assign item void vAssignI(AssignI* /*ai*/) {} /// Visit constraint item void vConstraintI(ConstraintI* /*ci*/) {} /// Visit solve item void vSolveI(SolveI* /*si*/) {} /// Visit output item void vOutputI(OutputI* /*oi*/) {} /// Visit function item void vFunctionI(FunctionI* /*fi*/) {} }; /// Iterator over items in a model and all its included models template class ItemIter { protected: I& _iter; public: ItemIter(I& iter) : _iter(iter) {} void run(Model* m) { std::unordered_set seen; std::vector models; models.push_back(m); seen.insert(m); while (!models.empty()) { Model* cm = models.back(); models.pop_back(); if (!_iter.enterModel(cm)) { continue; } std::vector includedModels; for (auto& i : *cm) { if (i->removed()) { continue; } if (!_iter.enter(i)) { continue; } switch (i->iid()) { case Item::II_INC: if (seen.find(i->cast()->m()) == seen.end()) { includedModels.push_back(i->cast()->m()); seen.insert(i->cast()->m()); } _iter.vIncludeI(i->cast()); break; case Item::II_VD: _iter.vVarDeclI(i->cast()); break; case Item::II_ASN: _iter.vAssignI(i->cast()); break; case Item::II_CON: _iter.vConstraintI(i->cast()); break; case Item::II_SOL: _iter.vSolveI(i->cast()); break; case Item::II_OUT: _iter.vOutputI(i->cast()); break; case Item::II_FUN: _iter.vFunctionI(i->cast()); break; } } for (auto i = static_cast(includedModels.size()); (i--) != 0U;) { models.push_back(includedModels[i]); } } } }; /// Run iterator \a i over all items of model \a m template void iter_items(I& i, Model* m) { ItemIter(i).run(m); } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/type.hh0000644000175000017500000002353513757304533017255 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { class EnvI; /// Type of a MiniZinc expression class Type { public: /// Type-inst enum TypeInst { TI_PAR, TI_VAR }; /// Basic type enum BaseType { BT_BOOL, BT_INT, BT_FLOAT, BT_STRING, BT_ANN, BT_TOP, BT_BOT, BT_UNKNOWN }; /// Whether the expression is plain or set enum SetType { ST_PLAIN, ST_SET }; /// Whether the expression is normal or optional enum OptType { OT_PRESENT, OT_OPTIONAL }; /// Whether the par expression contains a var argument enum ContainsVarType { CV_NO, CV_YES }; private: unsigned int _ti : 1; unsigned int _bt : 4; unsigned int _st : 1; unsigned int _ot : 1; unsigned int _cv : 1; /** \brief Enumerated type identifier * This is an index into a table in the Env. It is currently limited to * 4095 different enumerated type identifiers. * For a non-array type, this maps directly to the identity of the enum. * For an array type, it maps to a tuple of enum identities. */ unsigned int _enumId : 12; /// Number of array dimensions signed int _dim : 7; public: /// Default constructor Type() : _ti(TI_PAR), _bt(BT_UNKNOWN), _st(ST_PLAIN), _ot(OT_PRESENT), _cv(CV_NO), _enumId(0), _dim(0) {} /// Access type-inst TypeInst ti() const { return static_cast(_ti); } /// Set type-inst void ti(const TypeInst& t) { _ti = t; if (t == TI_VAR) { _cv = CV_YES; } } /// Access basic type BaseType bt() const { return static_cast(_bt); } /// Set basic type void bt(const BaseType& b) { _bt = b; } /// Access set type SetType st() const { return static_cast(_st); } /// Set set type void st(const SetType& s) { _st = s; } /// Access opt type OptType ot() const { return static_cast(_ot); } /// Set opt type void ot(const OptType& o) { _ot = o; } /// Access var-in-par type bool cv() const { return static_cast(_cv) == CV_YES; } /// Set var-in-par type void cv(bool b) { _cv = b ? CV_YES : CV_NO; } /// Access enum identifier unsigned int enumId() const { return _enumId; } /// Set enum identifier void enumId(unsigned int eid) { _enumId = eid; } /// Access dimensions int dim() const { return _dim; } /// Set dimensions void dim(int d) { _dim = d; assert(_dim == d); } protected: /// Constructor Type(const TypeInst& ti, const BaseType& bt, const SetType& st, unsigned int enumId, int dim) : _ti(ti), _bt(bt), _st(st), _ot(OT_PRESENT), _cv(ti == TI_VAR ? CV_YES : CV_NO), _enumId(enumId), _dim(dim) {} public: static Type parint(int dim = 0) { return Type(TI_PAR, BT_INT, ST_PLAIN, 0, dim); } static Type parenum(unsigned int enumId, int dim = 0) { return Type(TI_PAR, BT_INT, ST_PLAIN, enumId, dim); } static Type parbool(int dim = 0) { return Type(TI_PAR, BT_BOOL, ST_PLAIN, 0, dim); } static Type parfloat(int dim = 0) { return Type(TI_PAR, BT_FLOAT, ST_PLAIN, 0, dim); } static Type parstring(int dim = 0) { return Type(TI_PAR, BT_STRING, ST_PLAIN, 0, dim); } static Type partop(int dim = 0) { return Type(TI_PAR, BT_TOP, ST_PLAIN, 0, dim); } static Type ann(int dim = 0) { return Type(TI_PAR, BT_ANN, ST_PLAIN, 0, dim); } static Type parsetint(int dim = 0) { return Type(TI_PAR, BT_INT, ST_SET, 0, dim); } static Type parsetenum(unsigned int enumId, int dim = 0) { return Type(TI_PAR, BT_INT, ST_SET, enumId, dim); } static Type parsetbool(int dim = 0) { return Type(TI_PAR, BT_BOOL, ST_SET, 0, dim); } static Type parsetfloat(int dim = 0) { return Type(TI_PAR, BT_FLOAT, ST_SET, 0, dim); } static Type parsetstring(int dim = 0) { return Type(TI_PAR, BT_STRING, ST_SET, 0, dim); } static Type varint(int dim = 0) { return Type(TI_VAR, BT_INT, ST_PLAIN, 0, dim); } static Type varenumint(unsigned int enumId, int dim = 0) { return Type(TI_VAR, BT_INT, ST_PLAIN, enumId, dim); } static Type varbool(int dim = 0) { return Type(TI_VAR, BT_BOOL, ST_PLAIN, 0, dim); } static Type varfloat(int dim = 0) { return Type(TI_VAR, BT_FLOAT, ST_PLAIN, 0, dim); } static Type varsetint(int dim = 0) { return Type(TI_VAR, BT_INT, ST_SET, 0, dim); } static Type varbot(int dim = 0) { return Type(TI_VAR, BT_BOT, ST_PLAIN, 0, dim); } static Type bot(int dim = 0) { return Type(TI_PAR, BT_BOT, ST_PLAIN, 0, dim); } static Type top(int dim = 0) { return Type(TI_PAR, BT_TOP, ST_PLAIN, 0, dim); } static Type vartop(int dim = 0) { return Type(TI_VAR, BT_TOP, ST_PLAIN, 0, dim); } static Type optvartop(int dim = 0) { Type t(TI_VAR, BT_TOP, ST_PLAIN, 0, dim); t._ot = OT_OPTIONAL; return t; } static Type optpartop(int dim = 0) { Type t(TI_PAR, BT_TOP, ST_PLAIN, 0, dim); t._ot = OT_OPTIONAL; return t; } static Type unboxedint; static Type unboxedfloat; bool isunknown() const { return bt() == BT_UNKNOWN; } bool isplain() const { return _dim == 0 && st() == ST_PLAIN && ot() == OT_PRESENT; } bool isint() const { return _dim == 0 && st() == ST_PLAIN && bt() == BT_INT; } bool isbot() const { return bt() == BT_BOT; } bool isfloat() const { return _dim == 0 && st() == ST_PLAIN && bt() == BT_FLOAT; } bool isbool() const { return _dim == 0 && st() == ST_PLAIN && bt() == BT_BOOL; } bool isstring() const { return isplain() && bt() == BT_STRING; } bool isvar() const { return ti() != TI_PAR; } bool isvarbool() const { return ti() == TI_VAR && _dim == 0 && st() == ST_PLAIN && bt() == BT_BOOL && ot() == OT_PRESENT; } bool isvarfloat() const { return ti() == TI_VAR && _dim == 0 && st() == ST_PLAIN && bt() == BT_FLOAT && ot() == OT_PRESENT; } bool isvarint() const { return ti() == TI_VAR && _dim == 0 && st() == ST_PLAIN && bt() == BT_INT && ot() == OT_PRESENT; } bool isPar() const { return ti() == TI_PAR; } bool isOpt() const { return ot() == OT_OPTIONAL; } bool isPresent() const { return ot() == OT_PRESENT; } bool isSet() const { return _dim == 0 && st() == ST_SET; } bool isIntSet() const { return isSet() && (bt() == BT_INT || bt() == BT_BOT); } bool isBoolSet() const { return isSet() && (bt() == BT_BOOL || bt() == BT_BOT); } bool isFloatSet() const { return isSet() && (bt() == BT_FLOAT || bt() == BT_BOT); } bool isAnn() const { return isplain() && bt() == BT_ANN; } bool isIntArray() const { return _dim == 1 && st() == ST_PLAIN && ot() == OT_PRESENT && bt() == BT_INT; } bool isBoolArray() const { return _dim == 1 && st() == ST_PLAIN && ot() == OT_PRESENT && bt() == BT_BOOL; } bool isIntSetArray() const { return _dim == 1 && st() == ST_SET && bt() == BT_INT; } bool operator==(const Type& t) const { return ti() == t.ti() && bt() == t.bt() && st() == t.st() && ot() == t.ot() && _dim == t._dim; } bool operator!=(const Type& t) const { return !this->operator==(t); } // protected: int toInt() const { return +((1 - static_cast(_st)) << 28) + (static_cast(_bt) << 24) + (static_cast(_ti) << 21) + (static_cast(_ot) << 20) + (static_cast(_enumId) << 8) + (_dim == -1 ? 1 : (_dim == 0 ? 0 : _dim + 1)); } static Type fromInt(int i) { Type t; t._st = 1 - static_cast((i >> 28) & 0x1); t._bt = static_cast((i >> 24) & 0xF); t._ti = static_cast((i >> 21) & 0x7); t._ot = static_cast((i >> 20) & 0x1); t._enumId = static_cast((i >> 8) & 0xFFF); int dim = (i & 0x7F); t._dim = (dim == 0 ? 0 : (dim == 1 ? -1 : dim - 1)); return t; } std::string toString(EnvI& env) const; std::string nonEnumToString() const; /// Check if \a bt0 is a subtype of \a bt1 static bool btSubtype(const Type& t0, const Type& t1, bool strictEnums) { if (t0.bt() == t1.bt() && (!strictEnums || t0.dim() != 0 || (t0.enumId() == t1.enumId() || t1.enumId() == 0))) { return true; } switch (t0.bt()) { case BT_BOOL: return (t1.bt() == BT_INT || t1.bt() == BT_FLOAT); case BT_INT: return t1.bt() == BT_FLOAT; default: return false; } } /// Check if this type is a subtype of \a t bool isSubtypeOf(const Type& t, bool strictEnums) const { if (_dim == 0 && t._dim != 0 && st() == ST_SET && t.st() == ST_PLAIN && bt() != BT_FLOAT && (bt() == BT_BOT || btSubtype(*this, t, false) || t.bt() == BT_TOP) && ti() == TI_PAR && (ot() == OT_PRESENT || ot() == t.ot())) { return true; } // either same dimension or t has variable dimension if (_dim != t._dim && (_dim == 0 || t._dim != -1)) { return false; } // same type, this is present or both optional if (ti() == t.ti() && btSubtype(*this, t, strictEnums) && st() == t.st()) { return ot() == OT_PRESENT || ot() == t.ot(); } // this is par other than that same type as t if (ti() == TI_PAR && btSubtype(*this, t, strictEnums) && st() == t.st()) { return ot() == OT_PRESENT || ot() == t.ot(); } if (ti() == TI_PAR && t.bt() == BT_BOT) { return true; } if ((ti() == t.ti() || ti() == TI_PAR) && bt() == BT_BOT && (st() == t.st() || st() == ST_PLAIN)) { return ot() == OT_PRESENT || ot() == t.ot(); } if (t.bt() == BT_TOP && (ot() == OT_PRESENT || ot() == t.ot()) && (t.st() == ST_PLAIN || st() == t.st()) && (ti() == TI_PAR || t.ti() == TI_VAR)) { return true; } return false; } /// Compare types int cmp(const Type& t) const { return toInt() < t.toInt() ? -1 : (toInt() > t.toInt() ? 1 : 0); } }; }; // namespace MiniZinc libminizinc-2.5.3/include/minizinc/astiterator.hh0000644000175000017500000002704013757304533020630 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { /** * \brief Bottom-up iterator for expressions */ template class BottomUpIterator { protected: /// The visitor to call back during iteration T& _t; /// Stack item struct C { /// Expression on the stack Expression* e; /// Whether this expression has been visited before bool done; /// If part of a generator expression, which one it is int genNumber; /// Constructor C(Expression* e0) : e(e0), done(false), genNumber(-1) {} /// Constructor for generator expression C(Expression* e0, int genNumber0) : e(e0), done(true), genNumber(genNumber0) {} }; /// Push all elements of \a v onto \a stack template void pushVec(std::vector& stack, ASTExprVec v) { for (unsigned int i = 0; i < v.size(); i++) { stack.push_back(C(v[i])); } } public: /// Constructor BottomUpIterator(T& t) : _t(t) {} /// Run iterator on expression \a e void run(Expression* root); }; template void bottom_up(T& t, Expression* e) { BottomUpIterator(t).run(e); } /** * \brief Leaf iterator for expressions */ template class TopDownIterator { protected: /// The visitor to call back during iteration T& _t; /// Push all elements of \a v onto \a stack template static void pushVec(std::vector& stack, ASTExprVec v) { for (unsigned int i = 0; i < v.size(); i++) { stack.push_back(v[i]); } } public: /// Constructor TopDownIterator(T& t) : _t(t) {} /// Run iterator on expression \a e void run(Expression* root); }; template void top_down(T& t, Expression* root) { TopDownIterator(t).run(root); } /* IMPLEMENTATION */ template void BottomUpIterator::run(Expression* root) { std::vector stack; if (_t.enter(root)) { stack.push_back(C(root)); } while (!stack.empty()) { C& c = stack.back(); if (c.e == nullptr) { stack.pop_back(); continue; } if (c.done) { switch (c.e->eid()) { case Expression::E_INTLIT: _t.vIntLit(*c.e->template cast()); break; case Expression::E_FLOATLIT: _t.vFloatLit(*c.e->template cast()); break; case Expression::E_SETLIT: _t.vSetLit(*c.e->template cast()); break; case Expression::E_BOOLLIT: _t.vBoolLit(*c.e->template cast()); break; case Expression::E_STRINGLIT: _t.vStringLit(*c.e->template cast()); break; case Expression::E_ID: _t.vId(*c.e->template cast()); break; case Expression::E_ANON: _t.vAnonVar(*c.e->template cast()); break; case Expression::E_ARRAYLIT: _t.vArrayLit(*c.e->template cast()); break; case Expression::E_ARRAYACCESS: _t.vArrayAccess(*c.e->template cast()); break; case Expression::E_COMP: if (c.genNumber >= 0) { _t.vComprehensionGenerator(*c.e->template cast(), c.genNumber); } else { _t.vComprehension(*c.e->template cast()); } break; case Expression::E_ITE: _t.vITE(*c.e->template cast()); break; case Expression::E_BINOP: _t.vBinOp(*c.e->template cast()); break; case Expression::E_UNOP: _t.vUnOp(*c.e->template cast()); break; case Expression::E_CALL: _t.vCall(*c.e->template cast()); break; case Expression::E_VARDECL: _t.vVarDecl(*c.e->template cast()); break; case Expression::E_LET: _t.vLet(*c.e->template cast()); break; case Expression::E_TI: _t.vTypeInst(*c.e->template cast()); break; case Expression::E_TIID: _t.vTIId(*c.e->template cast()); break; } _t.exit(c.e); stack.pop_back(); } else { c.done = true; Expression* ce = c.e; for (ExpressionSetIter it = ce->ann().begin(); it != ce->ann().end(); ++it) { if (_t.enter(*it)) { stack.push_back(C(*it)); } } if (_t.enter(ce)) { switch (ce->eid()) { case Expression::E_INTLIT: case Expression::E_FLOATLIT: case Expression::E_BOOLLIT: case Expression::E_STRINGLIT: case Expression::E_ANON: case Expression::E_ID: case Expression::E_TIID: break; case Expression::E_SETLIT: pushVec(stack, ce->template cast()->v()); break; case Expression::E_ARRAYLIT: { for (unsigned int i = 0; i < ce->cast()->size(); i++) { stack.push_back((*ce->cast())[i]); } } break; case Expression::E_ARRAYACCESS: pushVec(stack, ce->template cast()->idx()); stack.push_back(C(ce->template cast()->v())); break; case Expression::E_COMP: { auto* comp = ce->template cast(); stack.push_back(C(comp->e())); for (unsigned int i = comp->numberOfGenerators(); (i--) != 0U;) { for (unsigned int j = comp->numberOfDecls(i); (j--) != 0U;) { stack.push_back(C(comp->decl(i, j))); } if (comp->in(i) != nullptr) { stack.push_back(C(comp->where(i))); stack.push_back(C(comp, i)); stack.push_back(C(comp->in(i))); } else { stack.push_back(C(comp, i)); stack.push_back(C(comp->where(i))); } } } break; case Expression::E_ITE: { ITE* ite = ce->template cast(); stack.push_back(C(ite->elseExpr())); for (int i = 0; i < ite->size(); i++) { stack.push_back(C(ite->ifExpr(i))); stack.push_back(C(ite->thenExpr(i))); } } break; case Expression::E_BINOP: stack.push_back(C(ce->template cast()->rhs())); stack.push_back(C(ce->template cast()->lhs())); break; case Expression::E_UNOP: stack.push_back(C(ce->template cast()->e())); break; case Expression::E_CALL: for (unsigned int i = 0; i < ce->template cast()->argCount(); i++) { stack.push_back(ce->template cast()->arg(i)); } break; case Expression::E_VARDECL: stack.push_back(C(ce->template cast()->e())); stack.push_back(C(ce->template cast()->ti())); break; case Expression::E_LET: stack.push_back(C(ce->template cast()->in())); pushVec(stack, ce->template cast()->let()); break; case Expression::E_TI: stack.push_back(C(ce->template cast()->domain())); pushVec(stack, ce->template cast()->ranges()); break; } } else { c.e = nullptr; } } } } template void TopDownIterator::run(Expression* root) { std::vector stack; if (_t.enter(root)) { stack.push_back(root); } while (!stack.empty()) { Expression* e = stack.back(); stack.pop_back(); if (e == nullptr) { continue; } if (!_t.enter(e)) { continue; } for (ExpressionSetIter it = e->ann().begin(); it != e->ann().end(); ++it) { stack.push_back(*it); } switch (e->eid()) { case Expression::E_INTLIT: _t.vIntLit(*e->template cast()); break; case Expression::E_FLOATLIT: _t.vFloatLit(*e->template cast()); break; case Expression::E_SETLIT: _t.vSetLit(*e->template cast()); pushVec(stack, e->template cast()->v()); break; case Expression::E_BOOLLIT: _t.vBoolLit(*e->template cast()); break; case Expression::E_STRINGLIT: _t.vStringLit(*e->template cast()); break; case Expression::E_ID: _t.vId(*e->template cast()); break; case Expression::E_ANON: _t.vAnonVar(*e->template cast()); break; case Expression::E_ARRAYLIT: _t.vArrayLit(*e->template cast()); for (unsigned int i = 0; i < e->cast()->size(); i++) { stack.push_back((*e->cast())[i]); } break; case Expression::E_ARRAYACCESS: _t.vArrayAccess(*e->template cast()); pushVec(stack, e->template cast()->idx()); stack.push_back(e->template cast()->v()); break; case Expression::E_COMP: _t.vComprehension(*e->template cast()); { auto* comp = e->template cast(); for (unsigned int i = comp->numberOfGenerators(); (i--) != 0U;) { stack.push_back(comp->where(i)); stack.push_back(comp->in(i)); for (unsigned int j = comp->numberOfDecls(i); (j--) != 0U;) { stack.push_back(comp->decl(i, j)); } } stack.push_back(comp->e()); } break; case Expression::E_ITE: _t.vITE(*e->template cast()); { ITE* ite = e->template cast(); stack.push_back(ite->elseExpr()); for (int i = 0; i < ite->size(); i++) { stack.push_back(ite->ifExpr(i)); stack.push_back(ite->thenExpr(i)); } } break; case Expression::E_BINOP: _t.vBinOp(*e->template cast()); stack.push_back(e->template cast()->rhs()); stack.push_back(e->template cast()->lhs()); break; case Expression::E_UNOP: _t.vUnOp(*e->template cast()); stack.push_back(e->template cast()->e()); break; case Expression::E_CALL: _t.vCall(*e->template cast()); for (unsigned int i = 0; i < e->template cast()->argCount(); i++) { stack.push_back(e->template cast()->arg(i)); } break; case Expression::E_VARDECL: _t.vVarDecl(*e->template cast()); stack.push_back(e->template cast()->e()); stack.push_back(e->template cast()->ti()); break; case Expression::E_LET: _t.vLet(*e->template cast()); stack.push_back(e->template cast()->in()); pushVec(stack, e->template cast()->let()); break; case Expression::E_TI: _t.vTypeInst(*e->template cast()); stack.push_back(e->template cast()->domain()); pushVec(stack, e->template cast()->ranges()); break; case Expression::E_TIID: _t.vTIId(*e->template cast()); break; } } } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/astvec.hh0000644000175000017500000001376613757304533017566 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class ASTIntVecO; /** * \brief Handler for ASTIntVecO objects */ class ASTIntVec { protected: /// Vector ASTIntVecO* _v; public: /// Default constructor ASTIntVec() : _v(nullptr) {} /// Constructor ASTIntVec(ASTIntVecO* v) : _v(v) {} /// Constructor ASTIntVec(const std::vector& v); /// Copy constructor ASTIntVec(const ASTIntVec& v); /// Assignment operator ASTIntVec& operator=(const ASTIntVec& v); /// Size of vector unsigned int size() const; /// Element access int& operator[](unsigned int i); /// Element access int operator[](unsigned int i) const; /// Iterator begin int* begin(); /// Iterator end int* end(); /// Mark as alive for garbage collection void mark() const; }; template class ASTExprVecO; /** * \brief Handler for ASTExprVecO objects */ template class ASTExprVec { protected: /// Vector ASTExprVecO* _v; public: /// Default constructor ASTExprVec() : _v(nullptr) {} /// Constructor ASTExprVec(ASTExprVecO* v) : _v(v) {} /// Constructor ASTExprVec(const std::vector& v); /// Copy constructor ASTExprVec(const ASTExprVec& v); /// Assignment operator // NOLINTNEXTLINE(bugprone-unhandled-self-assignment) ASTExprVec& operator=(const ASTExprVec& v); /// Size of vector unsigned int size() const; /// Element access T*& operator[](unsigned int i); /// Element access T* operator[](unsigned int i) const; /// Iterator begin T** begin(); /// Iterator end T** end(); /// Return vector object ASTExprVecO* vec() const; /// Mark as alive for garbage collection void mark() const; }; /// Garbage collected integer vector class ASTIntVecO : public ASTChunk { protected: /// Constructor ASTIntVecO(const std::vector& v); public: /// Allocate and initialise from \a v static ASTIntVecO* a(const std::vector& v); /// Return size unsigned int size() const { return static_cast(_size / sizeof(int)); } /// Return element at position \a i int& operator[](unsigned int i) { assert(i < size()); return reinterpret_cast(_data)[i]; } /// Return element at position \a i int operator[](unsigned int i) const { assert(i < size()); return reinterpret_cast(_data)[i]; } /// Iterator begin int* begin() { return reinterpret_cast(_data); } /// Iterator end int* end() { return begin() + size(); } /// Mark as alive for garbage collection void mark() const { _gcMark = 1; } }; /// Garbage collected vector of expressions template class ASTExprVecO : public ASTVec { protected: /// Constructor ASTExprVecO(const std::vector& v); public: /// Allocate and initialise from \a v static ASTExprVecO* a(const std::vector& v); unsigned int size() const { return static_cast(_size); } bool empty() const { return size() == 0; } T& operator[](unsigned int i) { assert(i < static_cast(size())); return reinterpret_cast(_data[i]); } T operator[](unsigned int i) const { assert(i < static_cast(size())); return reinterpret_cast(_data[i]); } /// Iterator begin T* begin() { return reinterpret_cast(_data); } /// Iterator end T* end() { return begin() + size(); } /// Mark as alive for garbage collection void mark() const { _gcMark = 1; } /// Check if flag is set bool flag() const { return _flag1; } /// Set flag void flag(bool f) { _flag1 = f; } }; template ASTExprVecO::ASTExprVecO(const std::vector& v) : ASTVec(v.size()) { _flag1 = false; for (auto i = static_cast(v.size()); (i--) != 0U;) { (*this)[i] = v[i]; } } template ASTExprVecO* ASTExprVecO::a(const std::vector& v) { auto* ao = static_cast*>(alloc(v.size())); new (ao) ASTExprVecO(v); return ao; } inline ASTIntVec::ASTIntVec(const std::vector& v) : _v(ASTIntVecO::a(v)) {} inline ASTIntVec::ASTIntVec(const ASTIntVec& v) : _v(v._v) {} // NOLINTNEXTLINE(bugprone-unhandled-self-assignment) inline ASTIntVec& ASTIntVec::operator=(const ASTIntVec& v) { _v = v._v; return *this; } inline unsigned int ASTIntVec::size() const { return _v != nullptr ? _v->size() : 0; } inline int& ASTIntVec::operator[](unsigned int i) { return (*_v)[i]; } inline int ASTIntVec::operator[](unsigned int i) const { return (*_v)[i]; } inline int* ASTIntVec::begin() { return _v != nullptr ? _v->begin() : nullptr; } inline int* ASTIntVec::end() { return _v != nullptr ? _v->end() : nullptr; } inline void ASTIntVec::mark() const { if (_v != nullptr) { _v->mark(); } } template ASTExprVec::ASTExprVec(const std::vector& v) : _v(ASTExprVecO::a(v)) {} template inline ASTExprVec::ASTExprVec(const ASTExprVec& v) : _v(v._v) {} template // NOLINTNEXTLINE(bugprone-unhandled-self-assignment) inline ASTExprVec& ASTExprVec::operator=(const ASTExprVec& v) { _v = v._v; return *this; } template inline unsigned int ASTExprVec::size() const { return _v ? _v->size() : 0; } template inline T*& ASTExprVec::operator[](unsigned int i) { return (*_v)[i]; } template inline T* ASTExprVec::operator[](unsigned int i) const { return (*_v)[i]; } template inline T** ASTExprVec::begin() { return _v ? _v->begin() : nullptr; } template inline T** ASTExprVec::end() { return _v ? _v->end() : nullptr; } template inline ASTExprVecO* ASTExprVec::vec() const { return _v; } template inline void ASTExprVec::mark() const { if (_v) { _v->mark(); } } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solver_instance_defs.hh0000644000175000017500000000171213757304533022464 0ustar kaolkaol#ifndef SOLVER_INSTANCE_DEFS_HH #define SOLVER_INSTANCE_DEFS_HH #include namespace MiniZinc { template class MultipleObjectivesTemplate { public: class Objective { public: Objective() {} Objective(Var v, double w) : _objVar{v}, _weight(w) {} Var getVariable() const { return _objVar; } double getWeight() const { return _weight; } void setVariable(Var vd) { _objVar = vd; } void setWeight(double w) { _weight = w; } private: Var _objVar{}; double _weight = 1.0; }; using ArrayOfObjectives = std::vector; const ArrayOfObjectives& getObjectives() const { return _objs; } size_t size() const { return _objs.size(); } void add(const Objective& obj) { _objs.push_back(obj); } private: ArrayOfObjectives _objs; }; /// Typical MultipleObjectives using MultipleObjectives = MultipleObjectivesTemplate; } // namespace MiniZinc #endif // SOLVER_INSTANCE_DEFS_HH libminizinc-2.5.3/include/minizinc/optimize.hh0000644000175000017500000000575013757304533020133 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class VarOccurrences { public: typedef std::unordered_set Items; IdMap itemMap; IdMap idx; /// Add \a to the index void addIndex(VarDeclI* i, int idx_i); /// Add \a to the index void addIndex(VarDecl* e, int idx_i); /// Find index of \a vd int find(VarDecl* vd); /// Remove index of \a vd void remove(VarDecl* vd); /// Add \a i to the dependencies of \a v void add(VarDecl* v, Item* i); /// Remove \a i from map and return new number of occurrences int remove(VarDecl* v, Item* i); /// Remove all occurrences from map and return new number of occurrences void removeAllOccurrences(VarDecl* v); /// Return number of occurrences of \a v int occurrences(VarDecl* v); /// Return number of constraint usages of \a v and whether \a v is an output variable std::pair usages(VarDecl* v); /// Unify \a v0 and \a v1 (removing \a v0) void unify(EnvI& env, Model* m, Id* id0, Id* id1); /// Clear all entries void clear(); }; class CollectOccurrencesE : public EVisitor { public: VarOccurrences& vo; Item* ci; CollectOccurrencesE(VarOccurrences& vo0, Item* ci0) : vo(vo0), ci(ci0) {} void vId(const Id& id) { if (id.decl() != nullptr) { vo.add(id.decl(), ci); } } }; class CollectOccurrencesI : public ItemVisitor { public: VarOccurrences& vo; CollectOccurrencesI(VarOccurrences& vo0) : vo(vo0) {} void vVarDeclI(VarDeclI* v); void vConstraintI(ConstraintI* ci); void vSolveI(SolveI* si); }; class CollectDecls : public EVisitor { public: VarOccurrences& vo; std::vector& vd; Item* item; CollectDecls(VarOccurrences& vo0, std::vector& vd0, Item* item0) : vo(vo0), vd(vd0), item(item0) {} static bool varIsFree(VarDecl* vd) { if (vd->e() == nullptr || vd->ti()->domain() == nullptr || vd->ti()->computedDomain()) { return true; } /// TODO: test if id's domain is a superset of the right hand side /// this currently only tests for equality, and for Boolean domains if (Id* ident = vd->e()->dynamicCast()) { if (Expression::equal(ident->decl()->ti()->domain(), vd->ti()->domain())) { return true; } } else if (vd->e() == vd->ti()->domain()) { return true; } return false; } void vId(Id& id) { if ((id.decl() != nullptr) && vo.remove(id.decl(), item) == 0) { if (varIsFree(id.decl())) { vd.push_back(id.decl()); } } } }; bool is_output(VarDecl* vd); /// Simplyfy models in \a env void optimize(Env& env, bool chain_compression = true); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/MIPdomains.hh0000644000175000017500000000473213757304533020272 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #define MZN_MIPD__assert_soft(c, e) \ do { \ static int nn = 0; \ if (!(c)) \ if (++nn <= 1) std::cerr << e << std::endl; /* NOLINT(bugprone-macro-parentheses) */ \ } while (0) #define MZN_MIPD__assert_hard(c) MZN_ASSERT_HARD(c) #define MZN_MIPD__assert_hard_msg(c, e) MZN_ASSERT_HARD_MSG(c, e) #define MZN_MIPD__FLATTENING_ERROR__IF_NOT(cond, envi, loc, msg) \ do { \ if (!(cond)) { \ std::ostringstream oss; \ oss << msg; /* NOLINT(bugprone-macro-parentheses) */ \ throw FlatteningError(envi, loc, oss.str()); \ } \ } while (0) #define MZN_MIPD__ASSERT_FOR_SAT(cond, envi, loc, msg) \ do { \ if (!(cond)) { \ std::ostringstream oss; \ oss << "from MIPDomains: " << msg; /* NOLINT(bugprone-macro-parentheses) */ \ throw ModelInconsistent(envi, loc, oss.str()); \ } \ } while (0) //( c, e ) \ // do { if ( !(c) ) { std::ostringstream oss; oss << e; throw MIPD_Infeasibility_Exception(oss.str()); } } while (0) namespace MiniZinc { /// Linearize domain constraints in \a env void mip_domains(Env& env, bool fVerbose = false, int nmi = 0, double dmd = 3.0); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/hash.hh0000644000175000017500000001340213757304533017207 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include namespace MiniZinc { /// Hash class for expressions struct ExpressionHash { size_t operator()(const Expression* e) const { return Expression::hash(e); } }; /// Equality test for expressions struct ExpressionEq { bool operator()(const Expression* e0, const Expression* e1) const { return Expression::equal(e0, e1); } }; /// Hash map from expression to \a T template class ExpressionMap { protected: /// The underlying map implementation std::unordered_map _m; public: /// Iterator type typedef typename std::unordered_map::iterator iterator; /// Insert mapping from \a e to \a t iterator insert(Expression* e, const T& t) { assert(e != nullptr); return _m.insert(std::pair(e, t)).first; } /// Find \a e in map iterator find(Expression* e) { return _m.find(e); } /// Begin of iterator iterator begin() { return _m.begin(); } /// End of iterator iterator end() { return _m.end(); } /// Remove binding of \a e from map void remove(Expression* e) { _m.erase(e); } /// Remove all elements from the map void clear() { _m.clear(); } }; /// Equality test for identifiers struct IdEq { bool operator()(const Id* e0, const Id* e1) const { if (e0->idn() == e1->idn()) { if (e0->idn() == -1) { return e0->v() == e1->v(); } return true; } return false; } }; /// Hash map from identifier to \a T template class IdMap { protected: /// The underlying map implementation std::unordered_map _m; public: /// Iterator type typedef typename std::unordered_map::iterator iterator; /// Insert mapping from \a e to \a t void insert(Id* e, const T& t) { assert(e != nullptr); _m.insert(std::pair(e, t)); } /// Find \a e in map iterator find(Id* e) { return _m.find(e); } /// Begin of iterator iterator begin() { return _m.begin(); } /// End of iterator iterator end() { return _m.end(); } /// Remove binding of \a e from map void remove(Id* e) { _m.erase(e); } /// Return number of elements in the map int size() const { return _m.size(); } /// Remove all elements from the map void clear() { _m.clear(); } T& get(Id* ident) { auto it = find(ident); // assert(it != _m.end()); if (_m.end() == it) { // Changing so it stays in Release version std::string msg = "Id "; // if (ident) // could be a segfault... // msg += ident->v().c_str(); msg += " not found"; throw InternalError(msg); } return it->second; } }; /// Hash class for KeepAlive objects struct KAHash { size_t operator()(const KeepAlive& e) const { return Expression::hash(e()); } }; /// Equality test for KeepAlive objects struct KAEq { bool operator()(const KeepAlive& e0, const KeepAlive& e1) const { return Expression::equal(e0(), e1()); } }; /// Hash map from KeepAlive to \a T template class KeepAliveMap { protected: /// The underlying map implementation std::unordered_map _m; public: /// Iterator type typedef typename std::unordered_map::iterator iterator; /// Insert mapping from \a e to \a t void insert(KeepAlive& e, const T& t) { assert(e() != nullptr); _m.insert(std::pair(e, t)); } /// Find \a e in map iterator find(KeepAlive& e) { return _m.find(e); } /// Begin of iterator iterator begin() { return _m.begin(); } /// End of iterator iterator end() { return _m.end(); } /// Remove binding of \a e from map void remove(KeepAlive& e) { _m.erase(e); } void clear() { _m.clear(); } template void dump() { for (auto i = _m.begin(); i != _m.end(); ++i) { std::cerr << D::k(i->first()) << ": " << D::d(i->second) << std::endl; } } }; class ExpressionSetIter : public std::unordered_set::iterator { protected: bool _empty; typedef std::unordered_set::iterator Iter; public: ExpressionSetIter() : _empty(false) {} ExpressionSetIter(bool /*b*/) : _empty(true) {} ExpressionSetIter(const Iter& i) : Iter(i), _empty(false) {} bool operator==(const ExpressionSetIter& i) const { return (_empty && i._empty) || static_cast(*this) == static_cast(i); } bool operator!=(const ExpressionSetIter& i) const { return !operator==(i); } }; /// Hash set for expressions class ExpressionSet { protected: /// The underlying set implementation std::unordered_set _s; public: /// Insert \a e void insert(Expression* e) { assert(e != nullptr); _s.insert(e); } /// Find \a e in map ExpressionSetIter find(Expression* e) { return _s.find(e); } /// Begin of iterator ExpressionSetIter begin() { return _s.begin(); } /// End of iterator ExpressionSetIter end() { return _s.end(); } /// Remove binding of \a e from map void remove(Expression* e) { _s.erase(e); } bool contains(Expression* e) { return find(e) != end(); } /// Remove all elements from the map void clear() { _s.clear(); } bool isEmpty() const { return _s.begin() == _s.end(); } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/astmap.hh0000644000175000017500000000314313757304533017552 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include namespace MiniZinc { /// Hash map from strings to \a T /// Note: This map is only safe to use if the keys are guaranteed to be /// marked alive. (For example if they are used in a Model object) template using ASTStringMap = std::unordered_map; /// Hash set of strings /// Note: This set is only safe to use if the keys are guaranteed to be /// marked alive. (For example if they are used in a Model object) using ASTStringSet = std::unordered_set; /// Hash map from strings to \a T /// Note: This map will ensure its keys stay alive while it still exists /// Specialisations for Expression* and VarDeclI* exist to ensure the /// stored values are kept alive as well. template class ManagedASTStringMap : public GCMarker, public std::unordered_map { protected: void mark(MINIZINC_GC_STAT_ARGS) override { for (auto& it : *this) { it.first.mark(); } } }; template <> void ManagedASTStringMap::mark(MINIZINC_GC_STAT_ARGS); template <> void ManagedASTStringMap::mark(MINIZINC_GC_STAT_ARGS); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/_thirdparty/0000755000175000017500000000000013757304533020274 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/_thirdparty/b64/0000755000175000017500000000000013757304533020667 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/_thirdparty/b64/cencode.h0000644000175000017500000000135513757304533022444 0ustar kaolkaol/* cencode.h - c header for a base64 encoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_CENCODE_H #define BASE64_CENCODE_H typedef enum { step_A, step_B, step_C } base64_encodestep; typedef struct { base64_encodestep step; char result; int stepcount; } base64_encodestate; void base64_init_encodestate(base64_encodestate* state_in); char base64_encode_value(char value_in); int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); int base64_encode_blockend(char* code_out, base64_encodestate* state_in); #endif /* BASE64_CENCODE_H */ libminizinc-2.5.3/include/minizinc/_thirdparty/b64/cdecode.h0000644000175000017500000000124113757304533022424 0ustar kaolkaol/* cdecode.h - c header for a base64 decoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_CDECODE_H #define BASE64_CDECODE_H typedef enum { step_a, step_b, step_c, step_d } base64_decodestep; typedef struct { base64_decodestep step; char plainchar; } base64_decodestate; void base64_init_decodestate(base64_decodestate* state_in); int base64_decode_value(char value_in); int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in); #endif /* BASE64_CDECODE_H */ libminizinc-2.5.3/include/minizinc/_thirdparty/b64/decode.h0000644000175000017500000000260513757304533022266 0ustar kaolkaol// :mode=c++: /* decode.h - c++ wrapper for a base64 decoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_DECODE_H #define BASE64_DECODE_H #define BUFFERSIZE 4096 #include namespace base64 { extern "C" { #include } struct decoder { base64_decodestate _state; int _buffersize; decoder(int buffersize_in = BUFFERSIZE) : _buffersize(buffersize_in) {} int decode(char value_in) { return base64_decode_value(value_in); } int decode(const char* code_in, const int length_in, char* plaintext_out) { return base64_decode_block(code_in, length_in, plaintext_out, &_state); } void decode(std::istream& istream_in, std::ostream& ostream_in) { base64_init_decodestate(&_state); // const int N = _buffersize; char* code = new char[N]; char* plaintext = new char[N]; int codelength; int plainlength; do { istream_in.read((char*)code, N); codelength = istream_in.gcount(); plainlength = decode(code, codelength, plaintext); ostream_in.write((const char*)plaintext, plainlength); } while (istream_in.good() && codelength > 0); // base64_init_decodestate(&_state); delete[] code; delete[] plaintext; } }; } // namespace base64 #endif // BASE64_DECODE_H libminizinc-2.5.3/include/minizinc/_thirdparty/b64/encode.h0000644000175000017500000000305513757304533022300 0ustar kaolkaol// :mode=c++: /* encode.h - c++ wrapper for a base64 encoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_ENCODE_H #define BASE64_ENCODE_H #define BUFFERSIZE 4096 #include namespace base64 { extern "C" { #include } struct encoder { base64_encodestate _state; int _buffersize; encoder(int buffersize_in = BUFFERSIZE) : _buffersize(buffersize_in) {} int encode(char value_in) { return base64_encode_value(value_in); } int encode(const char* code_in, const int length_in, char* plaintext_out) { return base64_encode_block(code_in, length_in, plaintext_out, &_state); } int encode_end(char* plaintext_out) { return base64_encode_blockend(plaintext_out, &_state); } void encode(std::istream& istream_in, std::ostream& ostream_in) { base64_init_encodestate(&_state); // const int N = _buffersize; char* plaintext = new char[N]; char* code = new char[2 * N]; int plainlength; int codelength; do { istream_in.read(plaintext, N); plainlength = istream_in.gcount(); // codelength = encode(plaintext, plainlength, code); ostream_in.write(code, codelength); } while (istream_in.good() && plainlength > 0); codelength = encode_end(code); ostream_in.write(code, codelength); // base64_init_encodestate(&_state); delete[] code; delete[] plaintext; } }; } // namespace base64 #endif // BASE64_ENCODE_H libminizinc-2.5.3/include/minizinc/_thirdparty/miniz.h0000644000175000017500000021052413757304533021577 0ustar kaolkaol/* miniz.c 2.0.7 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing See "unlicense" statement at the end of this file. Rich Geldreich , last updated Oct. 13, 2013 Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros). * Low-level Deflate/Inflate implementation notes: Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses approximately as well as zlib. Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory block large enough to hold the entire file. The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation. * zlib-style API notes: miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in zlib replacement in many apps: The z_stream struct, optional memory allocation callbacks deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound inflateInit/inflateInit2/inflate/inflateEnd compress, compress2, compressBound, uncompress CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. Supports raw deflate streams or standard zlib streams with adler-32 checking. Limitations: The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries. I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but there are no guarantees that miniz.c pulls this off perfectly. * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by Alex Evans. Supports 1-4 bytes/pixel images. * ZIP archive API notes: The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to get the job done with minimal fuss. There are simple API's to retrieve file information, read files from existing archives, create new archives, append new files to existing archives, or clone archive data from one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h), or you can specify custom file read/write callbacks. - Archive reading: Just call this function to read a single file from a disk archive: void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags); For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files. - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file: int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); The locate operation can optionally check file comments too, which (as one example) can be used to identify multiple versions of the same file in an archive. This function uses a simple linear search through the central directory, so it's not very fast. Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and retrieve detailed info on each file by calling mz_zip_reader_file_stat(). - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data to disk and builds an exact image of the central directory in memory. The central directory image is written all at once at the end of the archive file when the archive is finalized. The archive writer can optionally align each file's local header and file data to any power of 2 alignment, which can be useful when the archive will be read from optical media. Also, the writer supports placing arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still readable by any ZIP tool. - Archive appending: The simple way to add a single file to an archive is to call this function: mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); The archive will be created if it doesn't already exist, otherwise it'll be appended to. Note the appending is done in-place and is not an atomic operation, so if something goes wrong during the operation it's possible the archive could be left without a central directory (although the local file headers and file data will be fine, so the archive will be recoverable). For more complex archive modification scenarios: 1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and you're done. This is safe but requires a bunch of temporary disk space or heap memory. 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(), append new files as needed, then finalize the archive which will write an updated central directory to the original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a possibility that the archive's central directory could be lost with this method if anything goes wrong, though. - ZIP archive support limitations: No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files. Requires streams capable of seeking. * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it. * Important: For best perf. be sure to customize the below macros for your target platform: #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 #define MINIZ_LITTLE_ENDIAN 1 #define MINIZ_HAS_64BIT_REGISTERS 1 * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before including miniz.c to ensure miniz uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes). */ #pragma once /* Defines to completely disable specific portions of miniz.c: If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. */ /* Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. */ /*#define MINIZ_NO_STDIO */ /* If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current * time, or */ /* get/set file times, and the C run-time funcs that get/set times won't be called. */ /* The current downside is the times written to your archives will be from 1979. */ /*#define MINIZ_NO_TIME */ /* Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. */ /*#define MINIZ_NO_ARCHIVE_APIS */ /* Define MINIZ_NO_ARCHIVE_WRITING_APIS to disable all writing related ZIP archive API's. */ /*#define MINIZ_NO_ARCHIVE_WRITING_APIS */ /* Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. */ /*#define MINIZ_NO_ZLIB_APIS */ /* Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock * zlib. */ /*#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES */ /* Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. */ /*#define MINIZ_NO_MALLOC */ #if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) /* TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux */ #define MINIZ_NO_TIME #endif #include #if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) #include #endif #if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || \ defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || \ defined(__x86_64__) /* MINIZ_X86_OR_X64_CPU is only used to help set the below macros. */ #define MINIZ_X86_OR_X64_CPU 1 #else #define MINIZ_X86_OR_X64_CPU 0 #endif #if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU /* Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. */ #define MINIZ_LITTLE_ENDIAN 1 #else #define MINIZ_LITTLE_ENDIAN 0 #endif #if MINIZ_X86_OR_X64_CPU /* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and * stores from unaligned addresses. */ #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 #else #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0 #endif #if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || \ defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) /* Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and * don't involve compiler generated calls to helper functions). */ #define MINIZ_HAS_64BIT_REGISTERS 1 #else #define MINIZ_HAS_64BIT_REGISTERS 0 #endif #ifdef __cplusplus extern "C" { #endif /* ------------------- zlib-style API Definitions. */ /* For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. * Beware: mz_ulong can be either 32 or 64-bits! */ typedef unsigned long mz_ulong; /* mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've * modified the MZ_MALLOC macro) to release a block allocated from the heap. */ void mz_free(void* p); #define MZ_ADLER32_INIT (1) /* mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. */ mz_ulong mz_adler32(mz_ulong adler, const unsigned char* ptr, size_t buf_len); #define MZ_CRC32_INIT (0) /* mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. */ mz_ulong mz_crc32(mz_ulong crc, const unsigned char* ptr, size_t buf_len); /* Compression strategies. */ enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; /* Method */ #define MZ_DEFLATED 8 /* Heap allocation callbacks. Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. */ typedef void* (*mz_alloc_func)(void* opaque, size_t items, size_t size); typedef void (*mz_free_func)(void* opaque, void* address); typedef void* (*mz_realloc_func)(void* opaque, void* address, size_t items, size_t size); /* Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not * zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. */ enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; #define MZ_VERSION "10.0.2" #define MZ_VERNUM 0xA020 #define MZ_VER_MAJOR 10 #define MZ_VER_MINOR 0 #define MZ_VER_REVISION 2 #define MZ_VER_SUBREVISION 0 #ifndef MINIZ_NO_ZLIB_APIS /* Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for * advanced use (refer to the zlib docs). */ enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; /* Return status codes. MZ_PARAM_ERROR is non-standard. */ enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; /* Window bits */ #define MZ_DEFAULT_WINDOW_BITS 15 struct mz_internal_state; /* Compression/decompression stream struct. */ typedef struct mz_stream_s { const unsigned char* next_in; /* pointer to next byte to read */ unsigned int avail_in; /* number of bytes available at next_in */ mz_ulong total_in; /* total number of bytes consumed so far */ unsigned char* next_out; /* pointer to next byte to write */ unsigned int avail_out; /* number of bytes that can be written to next_out */ mz_ulong total_out; /* total number of bytes produced so far */ char* msg; /* error msg (unused) */ struct mz_internal_state* state; /* internal state, allocated by zalloc/zfree */ mz_alloc_func zalloc; /* optional heap allocation function (defaults to malloc) */ mz_free_func zfree; /* optional heap free function (defaults to free) */ void* opaque; /* heap alloc function user pointer */ int data_type; /* data_type (unused) */ mz_ulong adler; /* adler32 of the source or uncompressed data */ mz_ulong reserved; /* not used */ } mz_stream; typedef mz_stream* mz_streamp; /* Returns the version string of miniz.c. */ const char* mz_version(); /* mz_deflateInit() initializes a compressor with default options: */ /* Parameters: */ /* pStream must point to an initialized mz_stream struct. */ /* level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. */ /* level 1 enables a specially optimized compression function that's been optimized purely for * performance, not ratio. */ /* (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and * MINIZ_LITTLE_ENDIAN are defined.) */ /* Return values: */ /* MZ_OK on success. */ /* MZ_STREAM_ERROR if the stream is bogus. */ /* MZ_PARAM_ERROR if the input parameters are bogus. */ /* MZ_MEM_ERROR on out of memory. */ int mz_deflateInit(mz_streamp pStream, int level); /* mz_deflateInit2() is like mz_deflate(), except with more control: */ /* Additional parameters: */ /* method must be MZ_DEFLATED */ /* window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib * header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) */ /* mem_level must be between [1, 9] (it's checked but ignored by miniz.c) */ int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); /* Quickly resets a compressor without having to reallocate anything. Same as calling * mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). */ int mz_deflateReset(mz_streamp pStream); /* mz_deflate() compresses the input to output, consuming as much of the input and producing as much * output as possible. */ /* Parameters: */ /* pStream is the stream to read from and write to. You must initialize/update the next_in, * avail_in, next_out, and avail_out members. */ /* flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. */ /* Return values: */ /* MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's * more output to be written but the output buffer is full). */ /* MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call * mz_deflate() on the stream anymore. */ /* MZ_STREAM_ERROR if the stream is bogus. */ /* MZ_PARAM_ERROR if one of the parameters is invalid. */ /* MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are * empty. (Fill up the input buffer or free up some output space and try again.) */ int mz_deflate(mz_streamp pStream, int flush); /* mz_deflateEnd() deinitializes a compressor: */ /* Return values: */ /* MZ_OK on success. */ /* MZ_STREAM_ERROR if the stream is bogus. */ int mz_deflateEnd(mz_streamp pStream); /* mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be * generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. */ mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); /* Single-call compression functions mz_compress() and mz_compress2(): */ /* Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. */ int mz_compress(unsigned char* pDest, mz_ulong* pDest_len, const unsigned char* pSource, mz_ulong source_len); int mz_compress2(unsigned char* pDest, mz_ulong* pDest_len, const unsigned char* pSource, mz_ulong source_len, int level); /* mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be * generated by calling mz_compress(). */ mz_ulong mz_compressBound(mz_ulong source_len); /* Initializes a decompressor. */ int mz_inflateInit(mz_streamp pStream); /* mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window * size and whether or not the stream has been wrapped with a zlib header/footer: */ /* window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or * -MZ_DEFAULT_WINDOW_BITS (raw deflate). */ int mz_inflateInit2(mz_streamp pStream, int window_bits); /* Decompresses the input stream to the output, consuming only as much of the input as needed, and * writing as much to the output as possible. */ /* Parameters: */ /* pStream is the stream to read from and write to. You must initialize/update the next_in, * avail_in, next_out, and avail_out members. */ /* flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. */ /* On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both * sized large enough to decompress the entire stream in a single call (this is slightly faster). */ /* MZ_FINISH implies that there are no more source bytes available beside what's already in the * input buffer, and that the output buffer is large enough to hold the rest of the decompressed * data. */ /* Return values: */ /* MZ_OK on success. Either more input is needed but not available, and/or there's more output to * be written but the output buffer is full. */ /* MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For * zlib streams, the adler-32 of the decompressed data has also been verified. */ /* MZ_STREAM_ERROR if the stream is bogus. */ /* MZ_DATA_ERROR if the deflate stream is invalid. */ /* MZ_PARAM_ERROR if one of the parameters is invalid. */ /* MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the * inflater needs more input to continue, or if the output buffer is not large enough. Call * mz_inflate() again */ /* with more input data, or with more room in the output buffer (except when using single call * decompression, described above). */ int mz_inflate(mz_streamp pStream, int flush); /* Deinitializes a decompressor. */ int mz_inflateEnd(mz_streamp pStream); /* Single-call decompression. */ /* Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. */ int mz_uncompress(unsigned char* pDest, mz_ulong* pDest_len, const unsigned char* pSource, mz_ulong source_len); /* Returns a string description of the specified error code, or NULL if the error code is invalid. */ const char* mz_error(int err); /* Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in * replacement for the subset of zlib that miniz.c supports. */ /* Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same * project. */ #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES typedef unsigned char Byte; typedef unsigned int uInt; typedef mz_ulong uLong; typedef Byte Bytef; typedef uInt uIntf; typedef char charf; typedef int intf; typedef void* voidpf; typedef uLong uLongf; typedef void* voidp; typedef void* const voidpc; #define Z_NULL 0 #define Z_NO_FLUSH MZ_NO_FLUSH #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH #define Z_SYNC_FLUSH MZ_SYNC_FLUSH #define Z_FULL_FLUSH MZ_FULL_FLUSH #define Z_FINISH MZ_FINISH #define Z_BLOCK MZ_BLOCK #define Z_OK MZ_OK #define Z_STREAM_END MZ_STREAM_END #define Z_NEED_DICT MZ_NEED_DICT #define Z_ERRNO MZ_ERRNO #define Z_STREAM_ERROR MZ_STREAM_ERROR #define Z_DATA_ERROR MZ_DATA_ERROR #define Z_MEM_ERROR MZ_MEM_ERROR #define Z_BUF_ERROR MZ_BUF_ERROR #define Z_VERSION_ERROR MZ_VERSION_ERROR #define Z_PARAM_ERROR MZ_PARAM_ERROR #define Z_NO_COMPRESSION MZ_NO_COMPRESSION #define Z_BEST_SPEED MZ_BEST_SPEED #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY #define Z_FILTERED MZ_FILTERED #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY #define Z_RLE MZ_RLE #define Z_FIXED MZ_FIXED #define Z_DEFLATED MZ_DEFLATED #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS #define alloc_func mz_alloc_func #define free_func mz_free_func #define internal_state mz_internal_state #define z_stream mz_stream #define deflateInit mz_deflateInit #define deflateInit2 mz_deflateInit2 #define deflateReset mz_deflateReset #define deflate mz_deflate #define deflateEnd mz_deflateEnd #define deflateBound mz_deflateBound #define compress mz_compress #define compress2 mz_compress2 #define compressBound mz_compressBound #define inflateInit mz_inflateInit #define inflateInit2 mz_inflateInit2 #define inflate mz_inflate #define inflateEnd mz_inflateEnd #define uncompress mz_uncompress #define crc32 mz_crc32 #define adler32 mz_adler32 #define MAX_WBITS 15 #define MAX_MEM_LEVEL 9 #define zError mz_error #define ZLIB_VERSION MZ_VERSION #define ZLIB_VERNUM MZ_VERNUM #define ZLIB_VER_MAJOR MZ_VER_MAJOR #define ZLIB_VER_MINOR MZ_VER_MINOR #define ZLIB_VER_REVISION MZ_VER_REVISION #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION #define zlibVersion mz_version #define zlib_version mz_version() #endif /* #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES */ #endif /* MINIZ_NO_ZLIB_APIS */ #ifdef __cplusplus } #endif #pragma once #include #include #include #include /* ------------------- Types and macros */ typedef unsigned char mz_uint8; typedef signed short mz_int16; typedef unsigned short mz_uint16; typedef unsigned int mz_uint32; typedef unsigned int mz_uint; typedef int64_t mz_int64; typedef uint64_t mz_uint64; typedef int mz_bool; #define MZ_FALSE (0) #define MZ_TRUE (1) /* Works around MSVC's spammy "warning C4127: conditional expression is constant" message. */ #ifdef _MSC_VER #define MZ_MACRO_END while (0, 0) #else #define MZ_MACRO_END while (0) #endif #ifdef MINIZ_NO_STDIO #define MZ_FILE void* #else #include #define MZ_FILE FILE #endif /* #ifdef MINIZ_NO_STDIO */ #ifdef MINIZ_NO_TIME typedef struct mz_dummy_time_t_tag { int m_dummy; } mz_dummy_time_t; #define MZ_TIME_T mz_dummy_time_t #else #define MZ_TIME_T time_t #endif #define MZ_ASSERT(x) assert(x) #ifdef MINIZ_NO_MALLOC #define MZ_MALLOC(x) NULL #define MZ_FREE(x) (void)x, ((void)0) #define MZ_REALLOC(p, x) NULL #else #define MZ_MALLOC(x) malloc(x) #define MZ_FREE(x) free(x) #define MZ_REALLOC(p, x) realloc(p, x) #endif #define MZ_MAX(a, b) (((a) > (b)) ? (a) : (b)) #define MZ_MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN #define MZ_READ_LE16(p) *((const mz_uint16*)(p)) #define MZ_READ_LE32(p) *((const mz_uint32*)(p)) #else #define MZ_READ_LE16(p) \ ((mz_uint32)(((const mz_uint8*)(p))[0]) | ((mz_uint32)(((const mz_uint8*)(p))[1]) << 8U)) #define MZ_READ_LE32(p) \ ((mz_uint32)(((const mz_uint8*)(p))[0]) | ((mz_uint32)(((const mz_uint8*)(p))[1]) << 8U) | \ ((mz_uint32)(((const mz_uint8*)(p))[2]) << 16U) | \ ((mz_uint32)(((const mz_uint8*)(p))[3]) << 24U)) #endif #define MZ_READ_LE64(p) \ (((mz_uint64)MZ_READ_LE32(p)) | \ (((mz_uint64)MZ_READ_LE32((const mz_uint8*)(p) + sizeof(mz_uint32))) << 32U)) #ifdef _MSC_VER #define MZ_FORCEINLINE __forceinline #elif defined(__GNUC__) #define MZ_FORCEINLINE __inline__ __attribute__((__always_inline__)) #else #define MZ_FORCEINLINE inline #endif #ifdef __cplusplus extern "C" { #endif extern void* miniz_def_alloc_func(void* opaque, size_t items, size_t size); extern void miniz_def_free_func(void* opaque, void* address); extern void* miniz_def_realloc_func(void* opaque, void* address, size_t items, size_t size); #define MZ_UINT16_MAX (0xFFFFU) #define MZ_UINT32_MAX (0xFFFFFFFFU) #ifdef __cplusplus } #endif #pragma once #ifdef __cplusplus extern "C" { #endif /* ------------------- Low-level Compression API Definitions */ /* Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and * raw/dynamic blocks will be output more frequently). */ #define TDEFL_LESS_MEMORY 0 /* tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of * probes per dictionary search): */ /* TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. * 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best * compression). */ enum { TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF }; /* TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, * and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. */ /* TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib * headers). */ /* TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy * parsing. */ /* TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to * the minimum, but the output may vary from run to run given the same input (depending on the * contents of memory). */ /* TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) */ /* TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. */ /* TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. */ /* TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. */ /* The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see * TDEFL_MAX_PROBES_MASK). */ enum { TDEFL_WRITE_ZLIB_HEADER = 0x01000, TDEFL_COMPUTE_ADLER32 = 0x02000, TDEFL_GREEDY_PARSING_FLAG = 0x04000, TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, TDEFL_RLE_MATCHES = 0x10000, TDEFL_FILTER_MATCHES = 0x20000, TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 }; /* High level compression functions: */ /* tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). */ /* On entry: */ /* pSrc_buf, src_buf_len: Pointer and size of source block to compress. */ /* flags: The max match finder probes (default is 128) logically OR'd against the above flags. * Higher probes are slower but improve compression. */ /* On return: */ /* Function returns a pointer to the compressed data, or NULL on failure. */ /* *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on * uncompressible data. */ /* The caller must free() the returned block when it's no longer needed. */ void* tdefl_compress_mem_to_heap(const void* pSrc_buf, size_t src_buf_len, size_t* pOut_len, int flags); /* tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. */ /* Returns 0 on failure. */ size_t tdefl_compress_mem_to_mem(void* pOut_buf, size_t out_buf_len, const void* pSrc_buf, size_t src_buf_len, int flags); /* Compresses an image to a compressed PNG file in memory. */ /* On entry: */ /* pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. */ /* The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top * scanline is stored first in memory. */ /* level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or * a decent default is MZ_DEFAULT_LEVEL */ /* If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps). */ /* On return: */ /* Function returns a pointer to the compressed data, or NULL on failure. */ /* *pLen_out will be set to the size of the PNG image file. */ /* The caller must mz_free() the returned heap block (which will typically be larger than * *pLen_out) when it's no longer needed. */ void* tdefl_write_image_to_png_file_in_memory_ex(const void* pImage, int w, int h, int num_chans, size_t* pLen_out, mz_uint level, mz_bool flip); void* tdefl_write_image_to_png_file_in_memory(const void* pImage, int w, int h, int num_chans, size_t* pLen_out); /* Output stream interface. The compressor uses this interface to write compressed data. It'll * typically be called TDEFL_OUT_BUF_SIZE at a time. */ typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void* pUser); /* tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this * function internally. */ mz_bool tdefl_compress_mem_to_output(const void* pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void* pPut_buf_user, int flags); enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; /* TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using * static/fixed Huffman codes). */ #if TDEFL_LESS_MEMORY enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; #else enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; #endif /* The low-level tdefl functions below may be used directly if the above helper functions aren't * flexible enough. The low-level functions don't make any heap allocations, unlike the above helper * functions. */ typedef enum { TDEFL_STATUS_BAD_PARAM = -2, TDEFL_STATUS_PUT_BUF_FAILED = -1, TDEFL_STATUS_OKAY = 0, TDEFL_STATUS_DONE = 1 } tdefl_status; /* Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums */ typedef enum { TDEFL_NO_FLUSH = 0, TDEFL_SYNC_FLUSH = 2, TDEFL_FULL_FLUSH = 3, TDEFL_FINISH = 4 } tdefl_flush; /* tdefl's compression state structure. */ typedef struct { tdefl_put_buf_func_ptr m_pPut_buf_func; void* m_pPut_buf_user; mz_uint m_flags, m_max_probes[2]; int m_greedy_parsing; mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; tdefl_status m_prev_return_status; const void* m_pIn_buf; void* m_pOut_buf; size_t *m_pIn_buf_size, *m_pOut_buf_size; tdefl_flush m_flush; const mz_uint8* m_pSrc; size_t m_src_buf_left, m_out_buf_ofs; mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; } tdefl_compressor; /* Initializes the compressor. */ /* There is no corresponding deinit() function because the tdefl API's do not dynamically allocate * memory. */ /* pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the * user should call the tdefl_compress_buffer() API for compression. */ /* If pBut_buf_func is NULL the user should always call the tdefl_compress() API. */ /* flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) */ tdefl_status tdefl_init(tdefl_compressor* d, tdefl_put_buf_func_ptr pPut_buf_func, void* pPut_buf_user, int flags); /* Compresses a block of data, consuming as much of the specified input buffer as possible, and * writing as much compressed data to the specified output buffer as possible. */ tdefl_status tdefl_compress(tdefl_compressor* d, const void* pIn_buf, size_t* pIn_buf_size, void* pOut_buf, size_t* pOut_buf_size, tdefl_flush flush); /* tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL * tdefl_put_buf_func_ptr. */ /* tdefl_compress_buffer() always consumes the entire input buffer. */ tdefl_status tdefl_compress_buffer(tdefl_compressor* d, const void* pIn_buf, size_t in_buf_size, tdefl_flush flush); tdefl_status tdefl_get_prev_return_status(tdefl_compressor* d); mz_uint32 tdefl_get_adler32(tdefl_compressor* d); /* Create tdefl_compress() flags given zlib-style compression parameters. */ /* level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some * files) */ /* window_bits may be -15 (raw deflate) or 15 (zlib) */ /* strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED */ mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); /* Allocate the tdefl_compressor structure in C so that */ /* non-C language bindings to tdefl_ API don't need to worry about */ /* structure size and allocation mechanism. */ tdefl_compressor* tdefl_compressor_alloc(); void tdefl_compressor_free(tdefl_compressor* pComp); #ifdef __cplusplus } #endif #pragma once /* ------------------- Low-level Decompression API Definitions */ #ifdef __cplusplus extern "C" { #endif /* Decompression flags used by tinfl_decompress(). */ /* TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 * checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. */ /* TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the * supplied input buffer. If clear, the input buffer contains all remaining input. */ /* TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the * entire decompressed stream. If clear, the output buffer is at least the size of the dictionary * (typically 32KB). */ /* TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. */ enum { TINFL_FLAG_PARSE_ZLIB_HEADER = 1, TINFL_FLAG_HAS_MORE_INPUT = 2, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, TINFL_FLAG_COMPUTE_ADLER32 = 8 }; /* High level decompression functions: */ /* tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via * malloc(). */ /* On entry: */ /* pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. */ /* On return: */ /* Function returns a pointer to the decompressed data, or NULL on failure. */ /* *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on * uncompressible data. */ /* The caller must call mz_free() on the returned block when it's no longer needed. */ void* tinfl_decompress_mem_to_heap(const void* pSrc_buf, size_t src_buf_len, size_t* pOut_len, int flags); /* tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. */ /* Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. */ #define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) size_t tinfl_decompress_mem_to_mem(void* pOut_buf, size_t out_buf_len, const void* pSrc_buf, size_t src_buf_len, int flags); /* tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and * a user provided callback function will be called to flush the buffer. */ /* Returns 1 on success or 0 on failure. */ typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void* pUser); int tinfl_decompress_mem_to_callback(const void* pIn_buf, size_t* pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void* pPut_buf_user, int flags); struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; /* Allocate the tinfl_decompressor structure in C so that */ /* non-C language bindings to tinfl_ API don't need to worry about */ /* structure size and allocation mechanism. */ tinfl_decompressor* tinfl_decompressor_alloc(); void tinfl_decompressor_free(tinfl_decompressor* pDecomp); /* Max size of LZ dictionary. */ #define TINFL_LZ_DICT_SIZE 32768 /* Return status. */ typedef enum { /* This flags indicates the inflator needs 1 or more input bytes to make forward progress, but the caller is indicating that no more are available. The compressed data */ /* is probably corrupted. If you call the inflator again with more bytes it'll try to continue processing the input but this is a BAD sign (either the data is corrupted or you called it incorrectly). */ /* If you call it again with no input you'll just get TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS again. */ TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS = -4, /* This flag indicates that one or more of the input parameters was obviously bogus. (You can try calling it again, but if you get this error the calling code is wrong.) */ TINFL_STATUS_BAD_PARAM = -3, /* This flags indicate the inflator is finished but the adler32 check of the uncompressed data didn't match. If you call it again it'll return TINFL_STATUS_DONE. */ TINFL_STATUS_ADLER32_MISMATCH = -2, /* This flags indicate the inflator has somehow failed (bad code, corrupted input, etc.). If you call it again without resetting via tinfl_init() it it'll just keep on returning the same status failure code. */ TINFL_STATUS_FAILED = -1, /* Any status code less than TINFL_STATUS_DONE must indicate a failure. */ /* This flag indicates the inflator has returned every byte of uncompressed data that it can, has consumed every byte that it needed, has successfully reached the end of the deflate stream, and */ /* if zlib headers and adler32 checking enabled that it has successfully checked the uncompressed data's adler32. If you call it again you'll just get TINFL_STATUS_DONE over and over again. */ TINFL_STATUS_DONE = 0, /* This flag indicates the inflator MUST have more input data (even 1 byte) before it can make any more forward progress, or you need to clear the TINFL_FLAG_HAS_MORE_INPUT */ /* flag on the next call if you don't have any more source data. If the source data was somehow corrupted it's also possible (but unlikely) for the inflator to keep on demanding input to */ /* proceed, so be sure to properly set the TINFL_FLAG_HAS_MORE_INPUT flag. */ TINFL_STATUS_NEEDS_MORE_INPUT = 1, /* This flag indicates the inflator definitely has 1 or more bytes of uncompressed data available, but it cannot write this data into the output buffer. */ /* Note if the source compressed data was corrupted it's possible for the inflator to return a lot of uncompressed data to the caller. I've been assuming you know how much uncompressed data to expect */ /* (either exact or worst case) and will stop calling the inflator and fail after receiving too much. In pure streaming scenarios where you have no idea how many bytes to expect this may not be possible */ /* so I may need to add some code to address this. */ TINFL_STATUS_HAS_MORE_OUTPUT = 2 } tinfl_status; /* Initializes the decompressor to its initial state. */ #define tinfl_init(r) \ do { \ (r)->m_state = 0; \ } \ MZ_MACRO_END #define tinfl_get_adler32(r) (r)->m_check_adler32 /* Main low-level decompressor coroutine function. This is the only function actually needed for * decompression. All the other functions are just high-level helpers for improved usability. */ /* This is a universal API, i.e. it can be used as a building block to build any desired higher * level decompression API. In the limit case, it can be called once per every byte input or output. */ tinfl_status tinfl_decompress(tinfl_decompressor* r, const mz_uint8* pIn_buf_next, size_t* pIn_buf_size, mz_uint8* pOut_buf_start, mz_uint8* pOut_buf_next, size_t* pOut_buf_size, const mz_uint32 decomp_flags); /* Internal/private bits follow. */ enum { TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS }; typedef struct { mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; } tinfl_huff_table; #if MINIZ_HAS_64BIT_REGISTERS #define TINFL_USE_64BIT_BITBUF 1 #else #define TINFL_USE_64BIT_BITBUF 0 #endif #if TINFL_USE_64BIT_BITBUF typedef mz_uint64 tinfl_bit_buf_t; #define TINFL_BITBUF_SIZE (64) #else typedef mz_uint32 tinfl_bit_buf_t; #define TINFL_BITBUF_SIZE (32) #endif struct tinfl_decompressor_tag { mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; tinfl_bit_buf_t m_bit_buf; size_t m_dist_from_out_buf_start; tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; }; #ifdef __cplusplus } #endif #pragma once /* ------------------- ZIP archive reading/writing */ #ifndef MINIZ_NO_ARCHIVE_APIS #ifdef __cplusplus extern "C" { #endif enum { /* Note: These enums can be reduced as needed to save memory or stack space - they are pretty conservative. */ MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 512, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 512 }; typedef struct { /* Central directory file index. */ mz_uint32 m_file_index; /* Byte offset of this entry in the archive's central directory. Note we currently only support up * to UINT_MAX or less bytes in the central dir. */ mz_uint64 m_central_dir_ofs; /* These fields are copied directly from the zip's central dir. */ mz_uint16 m_version_made_by; mz_uint16 m_version_needed; mz_uint16 m_bit_flag; mz_uint16 m_method; #ifndef MINIZ_NO_TIME MZ_TIME_T m_time; #endif /* CRC-32 of uncompressed data. */ mz_uint32 m_crc32; /* File's compressed size. */ mz_uint64 m_comp_size; /* File's uncompressed size. Note, I've seen some old archives where directory entries had 512 * bytes for their uncompressed sizes, but when you try to unpack them you actually get 0 bytes. */ mz_uint64 m_uncomp_size; /* Zip internal and external file attributes. */ mz_uint16 m_internal_attr; mz_uint32 m_external_attr; /* Entry's local header file offset in bytes. */ mz_uint64 m_local_header_ofs; /* Size of comment in bytes. */ mz_uint32 m_comment_size; /* MZ_TRUE if the entry appears to be a directory. */ mz_bool m_is_directory; /* MZ_TRUE if the entry uses encryption/strong encryption (which miniz_zip doesn't support) */ mz_bool m_is_encrypted; /* MZ_TRUE if the file is not encrypted, a patch file, and if it uses a compression method we * support. */ mz_bool m_is_supported; /* Filename. If string ends in '/' it's a subdirectory entry. */ /* Guaranteed to be zero terminated, may be truncated to fit. */ char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; /* Comment field. */ /* Guaranteed to be zero terminated, may be truncated to fit. */ char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; } mz_zip_archive_file_stat; typedef size_t (*mz_file_read_func)(void* pOpaque, mz_uint64 file_ofs, void* pBuf, size_t n); typedef size_t (*mz_file_write_func)(void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n); typedef mz_bool (*mz_file_needs_keepalive)(void* pOpaque); struct mz_zip_internal_state_tag; typedef struct mz_zip_internal_state_tag mz_zip_internal_state; typedef enum { MZ_ZIP_MODE_INVALID = 0, MZ_ZIP_MODE_READING = 1, MZ_ZIP_MODE_WRITING = 2, MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 } mz_zip_mode; typedef enum { MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800, MZ_ZIP_FLAG_VALIDATE_LOCATE_FILE_FLAG = 0x1000, /* if enabled, mz_zip_reader_locate_file() will be called on each file as its validated to ensure the func finds the file in the central dir (intended for testing) */ MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY = 0x2000, /* validate the local headers, but don't decompress the entire file and check the crc32 */ MZ_ZIP_FLAG_WRITE_ZIP64 = 0x4000, /* always use the zip64 file format, instead of the original zip file format with automatic switch to zip64. Use as flags parameter with mz_zip_writer_init*_v2 */ MZ_ZIP_FLAG_WRITE_ALLOW_READING = 0x8000, MZ_ZIP_FLAG_ASCII_FILENAME = 0x10000 } mz_zip_flags; typedef enum { MZ_ZIP_TYPE_INVALID = 0, MZ_ZIP_TYPE_USER, MZ_ZIP_TYPE_MEMORY, MZ_ZIP_TYPE_HEAP, MZ_ZIP_TYPE_FILE, MZ_ZIP_TYPE_CFILE, MZ_ZIP_TOTAL_TYPES } mz_zip_type; /* miniz error codes. Be sure to update mz_zip_get_error_string() if you add or modify this enum. */ typedef enum { MZ_ZIP_NO_ERROR = 0, MZ_ZIP_UNDEFINED_ERROR, MZ_ZIP_TOO_MANY_FILES, MZ_ZIP_FILE_TOO_LARGE, MZ_ZIP_UNSUPPORTED_METHOD, MZ_ZIP_UNSUPPORTED_ENCRYPTION, MZ_ZIP_UNSUPPORTED_FEATURE, MZ_ZIP_FAILED_FINDING_CENTRAL_DIR, MZ_ZIP_NOT_AN_ARCHIVE, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED, MZ_ZIP_UNSUPPORTED_MULTIDISK, MZ_ZIP_DECOMPRESSION_FAILED, MZ_ZIP_COMPRESSION_FAILED, MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE, MZ_ZIP_CRC_CHECK_FAILED, MZ_ZIP_UNSUPPORTED_CDIR_SIZE, MZ_ZIP_ALLOC_FAILED, MZ_ZIP_FILE_OPEN_FAILED, MZ_ZIP_FILE_CREATE_FAILED, MZ_ZIP_FILE_WRITE_FAILED, MZ_ZIP_FILE_READ_FAILED, MZ_ZIP_FILE_CLOSE_FAILED, MZ_ZIP_FILE_SEEK_FAILED, MZ_ZIP_FILE_STAT_FAILED, MZ_ZIP_INVALID_PARAMETER, MZ_ZIP_INVALID_FILENAME, MZ_ZIP_BUF_TOO_SMALL, MZ_ZIP_INTERNAL_ERROR, MZ_ZIP_FILE_NOT_FOUND, MZ_ZIP_ARCHIVE_TOO_LARGE, MZ_ZIP_VALIDATION_FAILED, MZ_ZIP_WRITE_CALLBACK_FAILED, MZ_ZIP_TOTAL_ERRORS } mz_zip_error; typedef struct { mz_uint64 m_archive_size; mz_uint64 m_central_directory_file_ofs; /* We only support up to UINT32_MAX files in zip64 mode. */ mz_uint32 m_total_files; mz_zip_mode m_zip_mode; mz_zip_type m_zip_type; mz_zip_error m_last_error; mz_uint64 m_file_offset_alignment; mz_alloc_func m_pAlloc; mz_free_func m_pFree; mz_realloc_func m_pRealloc; void* m_pAlloc_opaque; mz_file_read_func m_pRead; mz_file_write_func m_pWrite; mz_file_needs_keepalive m_pNeeds_keepalive; void* m_pIO_opaque; mz_zip_internal_state* m_pState; } mz_zip_archive; typedef struct { mz_zip_archive* pZip; mz_uint flags; int status; #ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS mz_uint file_crc32; #endif mz_uint64 read_buf_size, read_buf_ofs, read_buf_avail, comp_remaining, out_buf_ofs, cur_file_ofs; mz_zip_archive_file_stat file_stat; void* pRead_buf; void* pWrite_buf; size_t out_blk_remain; tinfl_decompressor inflator; } mz_zip_reader_extract_iter_state; /* -------- ZIP reading */ /* Inits a ZIP archive reader. */ /* These functions read and validate the archive's central directory. */ mz_bool mz_zip_reader_init(mz_zip_archive* pZip, mz_uint64 size, mz_uint flags); mz_bool mz_zip_reader_init_mem(mz_zip_archive* pZip, const void* pMem, size_t size, mz_uint flags); #ifndef MINIZ_NO_STDIO /* Read a archive from a disk file. */ /* file_start_ofs is the file offset where the archive actually begins, or 0. */ /* actual_archive_size is the true total size of the archive, which may be smaller than the file's * actual size on disk. If zero the entire file is treated as the archive. */ mz_bool mz_zip_reader_init_file(mz_zip_archive* pZip, const char* pFilename, mz_uint32 flags); mz_bool mz_zip_reader_init_file_v2(mz_zip_archive* pZip, const char* pFilename, mz_uint flags, mz_uint64 file_start_ofs, mz_uint64 archive_size); /* Read an archive from an already opened FILE, beginning at the current file position. */ /* The archive is assumed to be archive_size bytes long. If archive_size is < 0, then the entire * rest of the file is assumed to contain the archive. */ /* The FILE will NOT be closed when mz_zip_reader_end() is called. */ mz_bool mz_zip_reader_init_cfile(mz_zip_archive* pZip, MZ_FILE* pFile, mz_uint64 archive_size, mz_uint flags); #endif /* Ends archive reading, freeing all allocations, and closing the input archive file if * mz_zip_reader_init_file() was used. */ mz_bool mz_zip_reader_end(mz_zip_archive* pZip); /* -------- ZIP reading or writing */ /* Clears a mz_zip_archive struct to all zeros. */ /* Important: This must be done before passing the struct to any mz_zip functions. */ void mz_zip_zero_struct(mz_zip_archive* pZip); mz_zip_mode mz_zip_get_mode(mz_zip_archive* pZip); mz_zip_type mz_zip_get_type(mz_zip_archive* pZip); /* Returns the total number of files in the archive. */ mz_uint mz_zip_reader_get_num_files(mz_zip_archive* pZip); mz_uint64 mz_zip_get_archive_size(mz_zip_archive* pZip); mz_uint64 mz_zip_get_archive_file_start_offset(mz_zip_archive* pZip); MZ_FILE* mz_zip_get_cfile(mz_zip_archive* pZip); /* Reads n bytes of raw archive data, starting at file offset file_ofs, to pBuf. */ size_t mz_zip_read_archive_data(mz_zip_archive* pZip, mz_uint64 file_ofs, void* pBuf, size_t n); /* Attempts to locates a file in the archive's central directory. */ /* Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH */ /* Returns -1 if the file cannot be found. */ int mz_zip_locate_file(mz_zip_archive* pZip, const char* pName, const char* pComment, mz_uint flags); /* Returns MZ_FALSE if the file cannot be found. */ mz_bool mz_zip_locate_file_v2(mz_zip_archive* pZip, const char* pName, const char* pComment, mz_uint flags, mz_uint32* pIndex); /* All mz_zip funcs set the m_last_error field in the mz_zip_archive struct. These functions * retrieve/manipulate this field. */ /* Note that the m_last_error functionality is not thread safe. */ mz_zip_error mz_zip_set_last_error(mz_zip_archive* pZip, mz_zip_error err_num); mz_zip_error mz_zip_peek_last_error(mz_zip_archive* pZip); mz_zip_error mz_zip_clear_last_error(mz_zip_archive* pZip); mz_zip_error mz_zip_get_last_error(mz_zip_archive* pZip); const char* mz_zip_get_error_string(mz_zip_error mz_err); /* MZ_TRUE if the archive file entry is a directory entry. */ mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive* pZip, mz_uint file_index); /* MZ_TRUE if the file is encrypted/strong encrypted. */ mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive* pZip, mz_uint file_index); /* MZ_TRUE if the compression method is supported, and the file is not encrypted, and the file is * not a compressed patch file. */ mz_bool mz_zip_reader_is_file_supported(mz_zip_archive* pZip, mz_uint file_index); /* Retrieves the filename of an archive file entry. */ /* Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function * returns the number of bytes needed to fully store the filename. */ mz_uint mz_zip_reader_get_filename(mz_zip_archive* pZip, mz_uint file_index, char* pFilename, mz_uint filename_buf_size); /* Attempts to locates a file in the archive's central directory. */ /* Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH */ /* Returns -1 if the file cannot be found. */ int mz_zip_reader_locate_file(mz_zip_archive* pZip, const char* pName, const char* pComment, mz_uint flags); int mz_zip_reader_locate_file_v2(mz_zip_archive* pZip, const char* pName, const char* pComment, mz_uint flags, mz_uint32* file_index); /* Returns detailed information about an archive file entry. */ mz_bool mz_zip_reader_file_stat(mz_zip_archive* pZip, mz_uint file_index, mz_zip_archive_file_stat* pStat); /* MZ_TRUE if the file is in zip64 format. */ /* A file is considered zip64 if it contained a zip64 end of central directory marker, or if it * contained any zip64 extended file information fields in the central directory. */ mz_bool mz_zip_is_zip64(mz_zip_archive* pZip); /* Returns the total central directory size in bytes. */ /* The current max supported size is <= MZ_UINT32_MAX. */ size_t mz_zip_get_central_dir_size(mz_zip_archive* pZip); /* Extracts a archive file to a memory buffer using no memory allocation. */ /* There must be at least enough room on the stack to store the inflator's state (~34KB or so). */ mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive* pZip, mz_uint file_index, void* pBuf, size_t buf_size, mz_uint flags, void* pUser_read_buf, size_t user_read_buf_size); mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive* pZip, const char* pFilename, void* pBuf, size_t buf_size, mz_uint flags, void* pUser_read_buf, size_t user_read_buf_size); /* Extracts a archive file to a memory buffer. */ mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive* pZip, mz_uint file_index, void* pBuf, size_t buf_size, mz_uint flags); mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive* pZip, const char* pFilename, void* pBuf, size_t buf_size, mz_uint flags); /* Extracts a archive file to a dynamically allocated heap buffer. */ /* The memory will be allocated via the mz_zip_archive's alloc/realloc functions. */ /* Returns NULL and sets the last error on failure. */ void* mz_zip_reader_extract_to_heap(mz_zip_archive* pZip, mz_uint file_index, size_t* pSize, mz_uint flags); void* mz_zip_reader_extract_file_to_heap(mz_zip_archive* pZip, const char* pFilename, size_t* pSize, mz_uint flags); /* Extracts a archive file using a callback function to output the file's data. */ mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive* pZip, mz_uint file_index, mz_file_write_func pCallback, void* pOpaque, mz_uint flags); mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive* pZip, const char* pFilename, mz_file_write_func pCallback, void* pOpaque, mz_uint flags); /* Extract a file iteratively */ mz_zip_reader_extract_iter_state* mz_zip_reader_extract_iter_new(mz_zip_archive* pZip, mz_uint file_index, mz_uint flags); mz_zip_reader_extract_iter_state* mz_zip_reader_extract_file_iter_new(mz_zip_archive* pZip, const char* pFilename, mz_uint flags); size_t mz_zip_reader_extract_iter_read(mz_zip_reader_extract_iter_state* pState, void* pvBuf, size_t buf_size); mz_bool mz_zip_reader_extract_iter_free(mz_zip_reader_extract_iter_state* pState); #ifndef MINIZ_NO_STDIO /* Extracts a archive file to a disk file and sets its last accessed and modified times. */ /* This function only extracts files, not archive directory records. */ mz_bool mz_zip_reader_extract_to_file(mz_zip_archive* pZip, mz_uint file_index, const char* pDst_filename, mz_uint flags); mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive* pZip, const char* pArchive_filename, const char* pDst_filename, mz_uint flags); /* Extracts a archive file starting at the current position in the destination FILE stream. */ mz_bool mz_zip_reader_extract_to_cfile(mz_zip_archive* pZip, mz_uint file_index, MZ_FILE* File, mz_uint flags); mz_bool mz_zip_reader_extract_file_to_cfile(mz_zip_archive* pZip, const char* pArchive_filename, MZ_FILE* pFile, mz_uint flags); #endif #if 0 /* TODO */ typedef void *mz_zip_streaming_extract_state_ptr; mz_zip_streaming_extract_state_ptr mz_zip_streaming_extract_begin(mz_zip_archive *pZip, mz_uint file_index, mz_uint flags); uint64_t mz_zip_streaming_extract_get_size(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState); uint64_t mz_zip_streaming_extract_get_cur_ofs(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState); mz_bool mz_zip_streaming_extract_seek(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState, uint64_t new_ofs); size_t mz_zip_streaming_extract_read(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState, void *pBuf, size_t buf_size); mz_bool mz_zip_streaming_extract_end(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState); #endif /* This function compares the archive's local headers, the optional local zip64 extended information * block, and the optional descriptor following the compressed data vs. the data in the central * directory. */ /* It also validates that each file can be successfully uncompressed unless the * MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY is specified. */ mz_bool mz_zip_validate_file(mz_zip_archive* pZip, mz_uint file_index, mz_uint flags); /* Validates an entire archive by calling mz_zip_validate_file() on each file. */ mz_bool mz_zip_validate_archive(mz_zip_archive* pZip, mz_uint flags); /* Misc utils/helpers, valid for ZIP reading or writing */ mz_bool mz_zip_validate_mem_archive(const void* pMem, size_t size, mz_uint flags, mz_zip_error* pErr); mz_bool mz_zip_validate_file_archive(const char* pFilename, mz_uint flags, mz_zip_error* pErr); /* Universal end function - calls either mz_zip_reader_end() or mz_zip_writer_end(). */ mz_bool mz_zip_end(mz_zip_archive* pZip); /* -------- ZIP writing */ #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS /* Inits a ZIP archive writer. */ /*Set pZip->m_pWrite (and pZip->m_pIO_opaque) before calling mz_zip_writer_init or * mz_zip_writer_init_v2*/ /*The output is streamable, i.e. file_ofs in mz_file_write_func always increases only by n*/ mz_bool mz_zip_writer_init(mz_zip_archive* pZip, mz_uint64 existing_size); mz_bool mz_zip_writer_init_v2(mz_zip_archive* pZip, mz_uint64 existing_size, mz_uint flags); mz_bool mz_zip_writer_init_heap(mz_zip_archive* pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); mz_bool mz_zip_writer_init_heap_v2(mz_zip_archive* pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size, mz_uint flags); #ifndef MINIZ_NO_STDIO mz_bool mz_zip_writer_init_file(mz_zip_archive* pZip, const char* pFilename, mz_uint64 size_to_reserve_at_beginning); mz_bool mz_zip_writer_init_file_v2(mz_zip_archive* pZip, const char* pFilename, mz_uint64 size_to_reserve_at_beginning, mz_uint flags); mz_bool mz_zip_writer_init_cfile(mz_zip_archive* pZip, MZ_FILE* pFile, mz_uint flags); #endif /* Converts a ZIP archive reader object into a writer object, to allow efficient in-place file * appends to occur on an existing archive. */ /* For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it * can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. */ /* For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the * realloc callback (which defaults to realloc unless you've overridden it). */ /* Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided * m_pWrite function cannot be NULL. */ /* Note: In-place archive modification is not recommended unless you know what you're doing, because * if execution stops or something goes wrong before */ /* the archive is finalized the file's central directory will be hosed. */ mz_bool mz_zip_writer_init_from_reader(mz_zip_archive* pZip, const char* pFilename); mz_bool mz_zip_writer_init_from_reader_v2(mz_zip_archive* pZip, const char* pFilename, mz_uint flags); /* Adds the contents of a memory buffer to an archive. These functions record the current local time * into the archive. */ /* To add a directory entry, call this method with an archive name ending in a forwardslash with an * empty buffer. */ /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) * logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ mz_bool mz_zip_writer_add_mem(mz_zip_archive* pZip, const char* pArchive_name, const void* pBuf, size_t buf_size, mz_uint level_and_flags); /* Like mz_zip_writer_add_mem(), except you can specify a file comment field, and optionally supply * the function with already compressed data. */ /* uncomp_size/uncomp_crc32 are only used if the MZ_ZIP_FLAG_COMPRESSED_DATA flag is specified. */ mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive* pZip, const char* pArchive_name, const void* pBuf, size_t buf_size, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive* pZip, const char* pArchive_name, const void* pBuf, size_t buf_size, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32, MZ_TIME_T* last_modified, const char* user_extra_data_local, mz_uint user_extra_data_local_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len); #ifndef MINIZ_NO_STDIO /* Adds the contents of a disk file to an archive. This function also records the disk file's * modified time into the archive. */ /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) * logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ mz_bool mz_zip_writer_add_file(mz_zip_archive* pZip, const char* pArchive_name, const char* pSrc_filename, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags); /* Like mz_zip_writer_add_file(), except the file data is read from the specified FILE stream. */ mz_bool mz_zip_writer_add_cfile(mz_zip_archive* pZip, const char* pArchive_name, MZ_FILE* pSrc_file, mz_uint64 size_to_add, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char* user_extra_data_local, mz_uint user_extra_data_local_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len); #endif /* Adds a file to an archive by fully cloning the data from another archive. */ /* This function fully clones the source file's compressed data (no recompression), along with its * full filename, extra data (it may add or modify the zip64 local header extra data field), and the * optional descriptor following the compressed data. */ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive* pZip, mz_zip_archive* pSource_zip, mz_uint src_file_index); /* Finalizes the archive by writing the central directory records followed by the end of central * directory record. */ /* After an archive is finalized, the only valid call on the mz_zip_archive struct is * mz_zip_writer_end(). */ /* An archive must be manually finalized by calling this function for it to be valid. */ mz_bool mz_zip_writer_finalize_archive(mz_zip_archive* pZip); /* Finalizes a heap archive, returning a poiner to the heap block and its size. */ /* The heap block will be allocated using the mz_zip_archive's alloc/realloc callbacks. */ mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive* pZip, void** ppBuf, size_t* pSize); /* Ends archive writing, freeing all allocations, and closing the output file if * mz_zip_writer_init_file() was used. */ /* Note for the archive to be valid, it *must* have been finalized before ending (this function will * not do it for you). */ mz_bool mz_zip_writer_end(mz_zip_archive* pZip); /* -------- Misc. high-level helper functions: */ /* mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob * to a ZIP archive. */ /* Note this is NOT a fully safe operation. If it crashes or dies in some way your archive can be * left in a screwed up state (without a central directory). */ /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) * logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ /* TODO: Perhaps add an option to leave the existing central dir in place in case the add dies? We * could then truncate the file (so the old central dir would be at the end) if something goes * wrong. */ mz_bool mz_zip_add_mem_to_archive_file_in_place(const char* pZip_filename, const char* pArchive_name, const void* pBuf, size_t buf_size, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags); mz_bool mz_zip_add_mem_to_archive_file_in_place_v2(const char* pZip_filename, const char* pArchive_name, const void* pBuf, size_t buf_size, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_zip_error* pErr); /* Reads a single file from an archive into a heap block. */ /* If pComment is not NULL, only the file with the specified comment will be extracted. */ /* Returns NULL on failure. */ void* mz_zip_extract_archive_file_to_heap(const char* pZip_filename, const char* pArchive_name, size_t* pSize, mz_uint flags); void* mz_zip_extract_archive_file_to_heap_v2(const char* pZip_filename, const char* pArchive_name, const char* pComment, size_t* pSize, mz_uint flags, mz_zip_error* pErr); #endif /* #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS */ #ifdef __cplusplus } #endif #endif /* MINIZ_NO_ARCHIVE_APIS */ libminizinc-2.5.3/include/minizinc/prettyprinter.hh0000644000175000017500000000455113757304533021224 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Pierre Wilke * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class Document; class ItemDocumentMapper; class PrettyPrinter; class Printer { private: EnvI* _env; ItemDocumentMapper* _ism; PrettyPrinter* _printer; std::ostream& _os; int _width; bool _flatZinc; void init(); void p(Document* d); void p(const Item* i); public: Printer(std::ostream& os, int width = 80, bool flatZinc = true, EnvI* env = nullptr); ~Printer(); void print(const Expression* e); void print(const Item* i); void print(const Model* m); template static std::string escapeStringLit(const S& s) { const char* sc = s.c_str(); std::ostringstream ret; for (unsigned int i = 0; i < s.size(); i++) { switch (sc[i]) { case '\n': ret << "\\n"; break; case '\t': ret << "\\t"; break; case '"': ret << "\\\""; break; case '\\': ret << "\\\\"; break; default: ret << sc[i]; } } return ret.str(); } }; /// Output operator for expressions template std::basic_ostream& operator<<(std::basic_ostream& os, const Expression& e) { std::basic_ostringstream s; s.copyfmt(os); s.width(0); Printer p(s, 0); p.print(&e); return os << s.str(); } /// Output operator for items template std::basic_ostream& operator<<(std::basic_ostream& os, const Item& i) { std::basic_ostringstream s; s.copyfmt(os); s.width(0); Printer p(s); p.print(&i); return os << s.str(); } void pp_floatval(std::ostream& os, const FloatVal& fv, bool hexFloat = false); } // namespace MiniZinc void debugprint(MiniZinc::Expression* e); void debugprint(MiniZinc::Item* i); void debugprint(MiniZinc::Model* m); void debugprint(const MiniZinc::Location& l); libminizinc-2.5.3/include/minizinc/astexception.hh0000644000175000017500000000504213757304533020773 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include namespace MiniZinc { class SyntaxError : public Exception { protected: Location _loc; public: SyntaxError(const Location& loc, const std::string& msg) : Exception(msg), _loc(loc) {} ~SyntaxError() throw() override {} const char* what() const throw() override { return "MiniZinc: syntax error"; } const Location& loc() const { return _loc; } }; class LocationException : public Exception { protected: Location _loc; public: LocationException(EnvI& env, const Location& loc, const std::string& msg); ~LocationException() throw() override {} const Location& loc() const { return _loc; } }; class TypeError : public LocationException { public: TypeError(EnvI& env, const Location& loc, const std::string& msg) : LocationException(env, loc, msg) {} ~TypeError() throw() override {} const char* what() const throw() override { return "MiniZinc: type error"; } }; class EvalError : public LocationException { public: EvalError(EnvI& env, const Location& loc, const std::string& msg) : LocationException(env, loc, msg) {} EvalError(EnvI& env, const Location& loc, const std::string& msg, const ASTString& name) : LocationException(env, loc, "") { std::ostringstream ss; ss << msg << " '" << name << "'"; _msg = ss.str(); } ~EvalError() throw() override {} const char* what() const throw() override { return "MiniZinc: evaluation error"; } }; class ModelInconsistent : public LocationException { public: ModelInconsistent(EnvI& env, const Location& loc, const std::string& msg = "") : LocationException(env, loc, "model inconsistency detected" + (msg.empty() ? msg : ": ") + msg) {} ~ModelInconsistent() throw() override {} const char* what() const throw() override { return "MiniZinc: warning"; } }; class ResultUndefinedError : public LocationException { public: ResultUndefinedError(EnvI& env, const Location& loc, const std::string& msg); ~ResultUndefinedError() throw() override {} const char* what() const throw() override { return "MiniZinc: result of evaluation is undefined"; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/parser.hh0000644000175000017500000001123713757304533017564 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once // This is a workaround for a bug in flex that only shows up // with the Microsoft C++ compiler #if defined(_MSC_VER) #define YY_NO_UNISTD_H #ifdef __cplusplus extern "C" int isatty(int); #endif #endif // The Microsoft C++ compiler marks certain functions as deprecated, // so let's take the alternative definitions #if defined(_MSC_VER) #define strdup _strdup #define fileno _fileno #endif #if defined(_MSC_VER) #pragma warning(disable : 4065) #endif namespace MiniZinc { class ParserLocation; } #define YYLTYPE MiniZinc::ParserLocation #define YYLTYPE_IS_DECLARED 1 #define YYLTYPE_IS_TRIVIAL 0 #include #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { struct ParseWorkItem { Model* m; IncludeI* ii; std::string dirName; std::string fileName; bool isSTDLib; bool isModelString; ParseWorkItem(Model* m0, IncludeI* ii0, std::string dirName0, std::string fileName0, bool isSTDLib0 = false, bool isModelString0 = false) : m(m0), ii(ii0), dirName(std::move(dirName0)), fileName(std::move(fileName0)), isSTDLib(isSTDLib0), isModelString(isModelString0) {} }; /// %State of the %MiniZinc parser class ParserState { public: ParserState(const std::string& f, const std::string& b, std::ostream& err0, std::vector& files0, std::map& seenModels0, MiniZinc::Model* model0, bool isDatafile0, bool isFlatZinc0, bool isSTDLib0, bool parseDocComments0) : filename(f.c_str()), buf(b.c_str()), pos(0), length(static_cast(b.size())), lineStartPos(0), nTokenNextStart(1), hadNewline(false), files(files0), seenModels(seenModels0), model(model0), isDatafile(isDatafile0), isFlatZinc(isFlatZinc0), isSTDLib(isSTDLib0), parseDocComments(parseDocComments0), hadError(false), err(err0) {} const char* filename; void* yyscanner; const char* buf; unsigned int pos, length; int lineStartPos; int nTokenNextStart; bool hadNewline; std::vector& files; std::map& seenModels; MiniZinc::Model* model; bool isDatafile; bool isFlatZinc; bool isSTDLib; bool parseDocComments; bool hadError; std::vector syntaxErrors; std::ostream& err; std::string stringBuffer; void printCurrentLine(int firstCol, int lastCol) { const char* eol_c = strchr(buf + lineStartPos, '\n'); if (eol_c != nullptr) { if (eol_c == buf + lineStartPos) { return; } err << std::string(buf + lineStartPos, eol_c - (buf + lineStartPos)); } else { err << buf + lineStartPos; } err << std::endl; for (int i = 0; i < firstCol - 1; i++) { err << " "; } for (int i = firstCol; i <= lastCol; i++) { err << "^"; } err << std::endl; } int fillBuffer(char* lexBuf, unsigned int lexBufSize) { if (pos >= length) { return 0; } int num = std::min(length - pos, lexBufSize); memcpy(lexBuf, buf + pos, num); pos += num; return num; } }; Model* parse(Env& env, const std::vector& filename, const std::vector& datafiles, const std::string& textModel, const std::string& textModelName, const std::vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, std::ostream& err); Model* parse_from_string(Env& env, const std::string& text, const std::string& filename, const std::vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, std::ostream& err, std::vector& syntaxErrors); Model* parse_data(Env& env, Model* m, const std::vector& datafiles, const std::vector& includePaths, bool isFlatZinc, bool ignoreStdlib, bool parseDocComments, bool verbose, std::ostream& err); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/process.hh0000644000175000017500000004175313757304533017754 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include const auto SolverInstance__ERROR = MiniZinc::SolverInstance::ERROR; // before windows.h #ifdef _WIN32 #define NOMINMAX #include #include #undef ERROR //#include #else #include #include #include #include #endif #include #include #include #include #include #include #include #include namespace MiniZinc { #ifdef _WIN32 template void ReadPipePrint(HANDLE g_hCh, bool* _done, std::ostream* pOs, std::deque* outputQueue, std::mutex* mtx, std::mutex* cv_mutex, std::condition_variable* cv) { bool& done = *_done; assert(pOs != 0 || outputQueue != 0); while (!done) { char buffer[5255]; char nl_buffer[5255]; DWORD count = 0; BOOL bSuccess = ReadFile(g_hCh, buffer, sizeof(buffer) - 1, &count, NULL); if (bSuccess && count > 0) { int nl_count = 0; for (int i = 0; i < count; i++) { if (buffer[i] != 13) { nl_buffer[nl_count++] = buffer[i]; } } nl_buffer[nl_count] = 0; std::lock_guard lck(*mtx); if (outputQueue) { std::unique_lock lk(*cv_mutex); bool wasEmpty = outputQueue->empty(); outputQueue->push_back(nl_buffer); lk.unlock(); if (wasEmpty) { cv->notify_one(); } } if (pOs) (*pOs) << nl_buffer << std::flush; } else { if (outputQueue) { std::unique_lock lk(*cv_mutex); bool wasEmpty = outputQueue->empty(); outputQueue->push_back("\n"); done = true; lk.unlock(); if (wasEmpty) { cv->notify_one(); } } else { done = true; } } } } #endif template class Process { protected: std::vector _fzncmd; S2O* _pS2Out; int _timelimit; bool _sigint; #ifdef _WIN32 static BOOL WINAPI handleInterrupt(DWORD fdwCtrlType) { switch (fdwCtrlType) { case CTRL_C_EVENT: { std::unique_lock lck(_interruptMutex); hadInterrupt = true; _interruptCondition.notify_all(); return TRUE; } default: return FALSE; } } static std::mutex _interruptMutex; static std::condition_variable _interruptCondition; #else static void handleInterrupt(int signal) { if (signal == SIGINT) { hadInterrupt = true; } else { hadTerm = true; } } static bool hadTerm; #endif static bool hadInterrupt; public: Process(std::vector& fzncmd, S2O* pso, int tl, bool si) : _fzncmd(fzncmd), _pS2Out(pso), _timelimit(tl), _sigint(si) { assert(nullptr != _pS2Out); } int run() { #ifdef _WIN32 SetConsoleCtrlHandler(handleInterrupt, TRUE); SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; HANDLE g_hChildStd_IN_Rd = NULL; HANDLE g_hChildStd_IN_Wr = NULL; HANDLE g_hChildStd_OUT_Rd = NULL; HANDLE g_hChildStd_OUT_Wr = NULL; HANDLE g_hChildStd_ERR_Rd = NULL; HANDLE g_hChildStd_ERR_Wr = NULL; // Create a pipe for the child process's STDOUT. if (!CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0)) std::cerr << "Stdout CreatePipe" << std::endl; // Ensure the read handle to the pipe for STDOUT is not inherited. if (!SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)) std::cerr << "Stdout SetHandleInformation" << std::endl; // Create a pipe for the child process's STDERR. if (!CreatePipe(&g_hChildStd_ERR_Rd, &g_hChildStd_ERR_Wr, &saAttr, 0)) std::cerr << "Stderr CreatePipe" << std::endl; // Ensure the read handle to the pipe for STDERR is not inherited. if (!SetHandleInformation(g_hChildStd_ERR_Rd, HANDLE_FLAG_INHERIT, 0)) std::cerr << "Stderr SetHandleInformation" << std::endl; // Create a pipe for the child process's STDIN if (!CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)) std::cerr << "Stdin CreatePipe" << std::endl; // Ensure the write handle to the pipe for STDIN is not inherited. if (!SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0)) std::cerr << "Stdin SetHandleInformation" << std::endl; PROCESS_INFORMATION piProcInfo; STARTUPINFOW siStartInfo; BOOL bSuccess = FALSE; // Set up members of the PROCESS_INFORMATION structure. ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); // Set up members of the STARTUPINFO structure. // This structure specifies the STDIN and STDOUT handles for redirection. ZeroMemory(&siStartInfo, sizeof(STARTUPINFOW)); siStartInfo.cb = sizeof(STARTUPINFOW); siStartInfo.hStdError = g_hChildStd_ERR_Wr; siStartInfo.hStdOutput = g_hChildStd_OUT_Wr; siStartInfo.hStdInput = g_hChildStd_IN_Rd; siStartInfo.dwFlags |= STARTF_USESTDHANDLES; std::string cmdline = FileUtils::combine_cmd_line(_fzncmd); wchar_t* cmdstr = _wcsdup(FileUtils::utf8_to_wide(cmdline).c_str()); HANDLE hJobObject = CreateJobObject(NULL, NULL); BOOL processStarted = CreateProcessW(NULL, cmdstr, // command line NULL, // process security attributes NULL, // primary thread security attributes TRUE, // handles are inherited 0, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &siStartInfo, // STARTUPINFO pointer &piProcInfo); // receives PROCESS_INFORMATION if (!processStarted) { std::stringstream ssm; ssm << "Error occurred when executing FZN solver with command \"" << FileUtils::wide_to_utf8(cmdstr) << "\"."; throw InternalError(ssm.str()); } BOOL assignedToJob = AssignProcessToJobObject(hJobObject, piProcInfo.hProcess); if (!assignedToJob) { throw InternalError("Failed to assign process to job."); } CloseHandle(piProcInfo.hThread); delete cmdstr; // Stop ReadFile from blocking CloseHandle(g_hChildStd_OUT_Wr); CloseHandle(g_hChildStd_ERR_Wr); // Just close the child's in pipe here CloseHandle(g_hChildStd_IN_Rd); bool doneStdout = false; bool doneStderr = false; // Threaded solution seems simpler than asyncronous pipe reading std::mutex pipeMutex; std::mutex cv_mutex; std::condition_variable cv; std::deque outputQueue; thread thrStdout(&ReadPipePrint, g_hChildStd_OUT_Rd, &doneStdout, nullptr, &outputQueue, &pipeMutex, &cv_mutex, &cv); thread thrStderr(&ReadPipePrint, g_hChildStd_ERR_Rd, &doneStderr, &_pS2Out->getLog(), nullptr, &pipeMutex, nullptr, nullptr); thread thrTimeout([&] { auto shouldStop = [&] { return hadInterrupt || (doneStderr && doneStdout); }; std::unique_lock lck(_interruptMutex); if (_timelimit != 0) { if (!_interruptCondition.wait_for(lck, std::chrono::milliseconds(_timelimit), shouldStop)) { // If we timed out, generate an interrupt but ignore it ourselves bool oldHadInterrupt = hadInterrupt; GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); _interruptCondition.wait(lck, [&] { return hadInterrupt; }); hadInterrupt = oldHadInterrupt; } } else { _interruptCondition.wait(lck, shouldStop); } // At this point the child should be stopped/stopping if (!doneStderr || !doneStdout) { if (!_interruptCondition.wait_for(lck, std::chrono::milliseconds(200), [&] { return doneStderr && doneStdout; })) { // Force terminate the child after 200ms TerminateJobObject(hJobObject, 0); }; } }); while (true) { std::unique_lock lk(cv_mutex); cv.wait(lk, [&] { return !outputQueue.empty(); }); while (!outputQueue.empty()) { try { _pS2Out->feedRawDataChunk(outputQueue.front().c_str()); outputQueue.pop_front(); } catch (...) { TerminateJobObject(hJobObject, 0); doneStdout = true; doneStderr = true; lk.unlock(); thrStdout.join(); thrStderr.join(); { // Make sure thrTimeout terminates std::unique_lock lck(_interruptMutex); _interruptCondition.notify_all(); } thrTimeout.join(); SetConsoleCtrlHandler(handleInterrupt, FALSE); std::rethrow_exception(std::current_exception()); } } if (doneStdout) break; } thrStdout.join(); thrStderr.join(); { // Make sure thrTimeout terminates std::unique_lock lck(_interruptMutex); _interruptCondition.notify_all(); } thrTimeout.join(); DWORD exitCode = 0; if (GetExitCodeProcess(piProcInfo.hProcess, &exitCode) == FALSE) { exitCode = 1; } CloseHandle(piProcInfo.hProcess); SetConsoleCtrlHandler(handleInterrupt, FALSE); if (hadInterrupt) { // Re-trigger signal if it was not caused by our own timeout GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); } return exitCode; } #else int pipes[3][2]; pipe(pipes[0]); pipe(pipes[1]); pipe(pipes[2]); if (int childPID = fork()) { close(pipes[0][0]); close(pipes[1][1]); close(pipes[2][1]); close(pipes[0][1]); fd_set fdset; FD_ZERO(&fdset); // NOLINT(readability-isolate-declaration) struct timeval starttime; gettimeofday(&starttime, nullptr); struct timeval timeout_orig; timeout_orig.tv_sec = _timelimit / 1000; timeout_orig.tv_usec = (_timelimit % 1000) * 1000; struct timeval timeout = timeout_orig; hadInterrupt = false; hadTerm = false; struct sigaction sa; struct sigaction old_sa_int; struct sigaction old_sa_term; sa.sa_handler = &handleInterrupt; sa.sa_flags = 0; sigfillset(&sa.sa_mask); sigaction(SIGINT, &sa, &old_sa_int); sigaction(SIGTERM, &sa, &old_sa_term); int signal = _sigint ? SIGINT : SIGTERM; bool handledInterrupt = false; bool handledTerm = false; bool done = hadTerm || hadInterrupt; bool timed_out = false; while (!done) { FD_SET(pipes[1][0], &fdset); FD_SET(pipes[2][0], &fdset); int sel = select(FD_SETSIZE, &fdset, nullptr, nullptr, _timelimit == 0 ? nullptr : &timeout); if (sel == -1) { if (errno != EINTR) { // some error has happened throw InternalError(std::string("Error in communication with solver: ") + strerror(errno)); } } bool timeoutImmediately = false; if (hadInterrupt && !handledInterrupt) { signal = SIGINT; handledInterrupt = true; timeoutImmediately = true; } if (hadTerm && !handledTerm) { signal = SIGTERM; handledTerm = true; timeoutImmediately = true; } if (timeoutImmediately) { // Set timeout to immediately expire _timelimit = -1; timeout.tv_sec = 0; timeout.tv_usec = 0; timeout_orig = timeout; timeval currentTime; gettimeofday(¤tTime, nullptr); starttime = currentTime; } bool killed = false; if (_timelimit != 0) { timeval currentTime; gettimeofday(¤tTime, nullptr); if (sel != 0) { timeval elapsed; elapsed.tv_sec = currentTime.tv_sec - starttime.tv_sec; elapsed.tv_usec = currentTime.tv_usec - starttime.tv_usec; if (elapsed.tv_usec < 0) { elapsed.tv_sec--; elapsed.tv_usec += 1000000; } // Reset timeout to original limit timeout = timeout_orig; // Subtract elapsed time timeout.tv_usec = timeout.tv_usec - elapsed.tv_usec; if (timeout.tv_usec < 0) { timeout.tv_sec--; timeout.tv_usec += 1000000; } timeout.tv_sec = timeout.tv_sec - elapsed.tv_sec; } else { timeout.tv_usec = 0; timeout.tv_sec = 0; } if (timeout.tv_sec < 0 || (timeout.tv_sec == 0 && timeout.tv_usec == 0)) { timed_out = true; if (signal == SIGKILL) { killed = true; done = true; } if (killpg(childPID, signal) == -1) { // Fallback to killing the child if killing the process group fails kill(childPID, signal); } timeout.tv_sec = 0; timeout.tv_usec = 200000; timeout_orig = timeout; starttime = currentTime; // Upgrade signal for next attempt signal = signal == SIGINT ? SIGTERM : SIGKILL; } } bool addedNl = false; for (int i = 1; i <= 2; ++i) { if (FD_ISSET(pipes[i][0], &fdset)) { char buffer[1000]; int count = read(pipes[i][0], buffer, sizeof(buffer) - 1); if (count > 0) { buffer[count] = 0; if (1 == i) { // cerr << "mzn-fzn: raw chunk stdout::: " << flush; // cerr << buffer << flush; try { _pS2Out->feedRawDataChunk(buffer); } catch (...) { // Exception during solns2out, kill process and re-throw if (killpg(childPID, SIGKILL) == -1) { // Fallback to killing the child if killing the process group fails kill(childPID, SIGKILL); } throw; } } else { _pS2Out->getLog() << buffer << std::flush; } } else if (1 == i) { _pS2Out->feedRawDataChunk("\n"); // in case last chunk did not end with \n addedNl = true; done = true; } } } if (killed && !addedNl) { _pS2Out->feedRawDataChunk("\n"); // in case last chunk did not end with \n } } close(pipes[1][0]); close(pipes[2][0]); int exitStatus = timed_out ? 0 : 1; int childStatus; int pidStatus = waitpid(childPID, &childStatus, 0); if (!timed_out && pidStatus > 0) { if (WIFEXITED(childStatus)) { exitStatus = WEXITSTATUS(childStatus); } } sigaction(SIGINT, &old_sa_int, nullptr); sigaction(SIGTERM, &old_sa_term, nullptr); if (hadInterrupt) { kill(getpid(), SIGINT); } if (hadTerm) { kill(getpid(), SIGTERM); } return exitStatus; } if (setpgid(0, 0) == -1) { throw InternalError("Failed to set pgid of subprocess"); } close(STDOUT_FILENO); close(STDERR_FILENO); close(STDIN_FILENO); dup2(pipes[0][0], STDIN_FILENO); dup2(pipes[1][1], STDOUT_FILENO); dup2(pipes[2][1], STDERR_FILENO); close(pipes[0][0]); close(pipes[0][1]); close(pipes[1][1]); close(pipes[1][0]); close(pipes[2][1]); close(pipes[2][0]); std::vector cmd_line; for (auto& iCmdl : _fzncmd) { cmd_line.push_back(strdup(iCmdl.c_str())); } char** argv = new char*[cmd_line.size() + 1]; for (unsigned int i = 0; i < cmd_line.size(); i++) { argv[i] = cmd_line[i]; } argv[cmd_line.size()] = nullptr; int status = execvp(argv[0], argv); // execvp only returns if an error occurs. assert(status == -1); // the returned value will always be -1 std::stringstream ssm; ssm << "Error occurred when executing FZN solver with command \""; for (auto& s : cmd_line) { ssm << s << ' '; } ssm << "\"."; throw InternalError(ssm.str()); } #endif }; template bool Process::hadInterrupt; #ifdef _WIN32 template std::mutex Process::_interruptMutex; template std::condition_variable Process::_interruptCondition; #else template bool Process::hadTerm; #endif } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/htmlprinter.hh0000644000175000017500000000257713757304533020647 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { class Model; class HtmlDocument { protected: std::string _filename; std::string _title; std::string _doc; public: HtmlDocument(std::string filename, std::string title, std::string document) : _filename(std::move(filename)), _title(std::move(title)), _doc(std::move(document)) {} std::string filename() const { return _filename; } std::string title() const { return _title; } std::string document() const { return _doc; } }; class HtmlPrinter { public: static std::vector printHtml(EnvI& env, Model* m, const std::string& basename, int splitLevel, bool includeStdLib, bool generateIndex); }; class RSTPrinter { public: static std::vector printRST(EnvI& env, Model* m, const std::string& basename, int splitLevel, bool includeStdLib, bool generateIndex); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/passes/0000755000175000017500000000000013757304533017241 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/passes/compile_pass.hh0000644000175000017500000000225513757304533022244 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Kevin Leo */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { struct CompilePassFlags { bool noMIPdomains; bool verbose; bool statistics; bool optimize; bool chainCompression; bool newfzn; bool werror; bool modelCheckOnly; bool modelInterfaceOnly; bool allowMultiAssign; }; class CompilePass : public Pass { private: Env* _env; FlatteningOptions _fopts; CompilePassFlags _compflags; std::string _library; std::vector _includePaths; bool _changeLibrary; bool _ignoreUnknownIds; public: CompilePass(Env* e, FlatteningOptions& opts, CompilePassFlags& cflags, std::string globals_library, std::vector include_paths, bool change_lib, bool ignore_unknown); Env* run(Env* store, std::ostream& log) override; ~CompilePass() override; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/passes/gecode_pass.hh0000644000175000017500000000114213757304533022034 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Kevin Leo */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { class GecodeOptions; class GecodePass : public Pass { GecodeOptions* _gopts; public: GecodePass(GecodeOptions* gopts); Env* run(Env* e, std::ostream& log) override; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solver_config.hh0000644000175000017500000002641413757304533021132 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include namespace MiniZinc { class SolverConfigs; /** * \brief Configuration data for individual MiniZinc solvers */ class SolverConfig { public: /// Extra command line flags supported by solver struct ExtraFlag { enum FlagType { T_BOOL, T_INT, T_FLOAT, T_STRING }; std::string flag; std::string description; FlagType flagType; std::vector range; std::string defaultValue; ExtraFlag(std::string f, std::string d, FlagType t = T_BOOL, std::vector r = {}, std::string v = "false") : flag(std::move(f)), description(std::move(d)), flagType(t), range(std::move(r)), defaultValue(std::move(v)) {} bool validate(const std::string& v) const; }; protected: /// The configuration file for this solver (or empty string for built-in solvers) std::string _configFile; /// The unique identifier for the solver std::string _id; /// Name of the solver (used for output) std::string _name; /// The path to the executable std::string _executable; /// The path to the executable, after resolving std::string _executableResolved; /// The path to the solver's MiniZinc library std::string _mznlib; /// The path to the solver's MiniZinc library, after resolving std::string _mznlibResolved; /// Version string std::string _version; /// MiniZinc library version int _mznlibVersion = 1; /// Short description std::string _description; /// Contact email std::string _contact; /// URL for more information std::string _website; /// Whether solver supports MiniZinc input bool _supportsMzn = false; /// Whether solver supports FlatZinc input bool _supportsFzn = true; /// Whether solver supports NL input bool _supportsNL = false; /// Whether solver requires solutions2out processing bool _needsSolns2Out = true; /// Whether solver is a GUI application bool _isGUIApplication = false; /// Whether solver needs path to minizinc executable (passed as --minizinc-exe) bool _needsMznExecutable = false; /// Whether solver needs path to MiniZinc standard library (passed as --stdlib-dir) bool _needsStdlibDir = false; /// Whether solver needs path to symbol table (paths file) (passed as --paths) bool _needsPathsFile = false; /// Supported standard command line flags std::vector _stdFlags; /// Supported extra command line flags (flag and description) std::vector _extraFlags; /// Required command line flags std::vector _requiredFlags; /// Default command line flags (imported from global or user configuration) std::vector _defaultFlags; /// Tags std::vector _tags; public: /// Load solver configuration from \a filename static SolverConfig load(const std::string& filename); /// Default constructor SolverConfig() {} /// Constructor SolverConfig(std::string id, std::string version) : _id(std::move(id)), _version(std::move(version)) {} /// Return identifier std::string id() const { return _id; } /// Return version string std::string version() const { return _version; } /// Return configuration file name std::string configFile() const { return _configFile; } /// Set configuration file name void configFile(const std::string& s) { _configFile = s; } /// Return name std::string name() const { return _name; } // Set name void name(const std::string& s) { _name = s; } /// Return executable path std::string executable() const { return _executable; } /// Set executable path void executable(const std::string& s) { _executable = s; } /// Return resolved executable path std::string executableResolved() const { return _executableResolved; } /// Return MiniZinc library path std::string mznlib() const { return _mznlib; } /// Set MiniZinc library path void mznlib(const std::string& s) { _mznlib = s; } /// Return resolved MiniZinc library path std::string mznlibResolved() const { return _mznlibResolved; } /// Return required MiniZinc library version int mznlibVersion() const { return _mznlibVersion; } /// Set required MiniZinc library version void mznlibVersion(int i) { _mznlibVersion = i; } /// Whether solver supports MiniZinc input bool supportsMzn() const { return _supportsMzn; } /// Set whether solver supports MiniZinc input void supportsMzn(bool b) { _supportsMzn = b; } /// Whether solver supports FlatZinc input bool supportsFzn() const { return _supportsFzn; } /// Set whether solver supports FlatZinc input void supportsFzn(bool b) { _supportsFzn = b; } /// Whether solver supports NL input bool supportsNL() const { return _supportsNL; } /// Set whether solver supports NL input void supportsNL(bool b) { _supportsNL = b; } /// Whether solver requires solutions2out processing bool needsSolns2Out() const { return _needsSolns2Out; } /// Set whether solver requires solutions2out processing void needsSolns2Out(bool b) { _needsSolns2Out = b; } /// Whether solver is a GUI application bool isGUIApplication() const { return _isGUIApplication; } /// Set whether solver is a GUI application void isGUIApplication(bool b) { _isGUIApplication = b; } /// Whether solver needs path to minizinc executable (passed as --minizinc-exe) bool needsMznExecutable() const { return _needsMznExecutable; } /// Set whether solver needs path to minizinc executable void needsMznExecutable(bool b) { _needsMznExecutable = b; } /// Whether solver needs path to MiniZinc standard library (passed as --stdlib-dir) bool needsStdlibDir() const { return _needsStdlibDir; } /// Set whether solver needs path to MiniZinc standard library void needsStdlibDir(bool b) { _needsStdlibDir = b; } /// Whether solver needs path to symbol table (paths file) (passed as --paths) bool needsPathsFile() const { return _needsPathsFile; } /// Set whether solver needs path to symbol table (paths file) void needsPathsFile(bool b) { _needsPathsFile = b; } /// Return short description std::string description() const { return _description; } /// Set short description void description(const std::string& s) { _description = s; } /// Return contact email std::string contact() const { return _contact; } /// Set contact email void contact(const std::string& s) { _contact = s; } /// Return web site URL std::string website() const { return _website; } /// Set web site URL void website(const std::string& s) { _website = s; } /// Return supported standard command line flags const std::vector& stdFlags() const { return _stdFlags; } /// Set supported standard command line flags void stdFlags(const std::vector& f) { _stdFlags = f; } /// Return supported extra command line flags const std::vector& extraFlags() const { return _extraFlags; } /// Set supported extra command line flags void extraFlags(const std::vector& f) { _extraFlags = f; } /// Return supported required command line flags const std::vector& requiredFlags() const { return _requiredFlags; } /// Set supported required command line flags void requiredFlags(const std::vector& f) { _requiredFlags = f; } /// Return default command line flags const std::vector& defaultFlags() const { return _defaultFlags; } /// Set default command line flags void defaultFlags(const std::vector& f) { _defaultFlags = f; } /// Return tags const std::vector& tags() const { return _tags; } /// Set tags void tags(const std::vector& t) { _tags = t; } /// Output as JSON std::string toJSON(const SolverConfigs& configs) const; /// Test equality bool operator==(const SolverConfig& sc) const { return _id == sc.id() && _version == sc.version(); } }; /// A container for solver configurations class SolverConfigs { protected: /// The solvers std::vector _solvers; typedef std::unordered_map > TagMap; /// Mapping tags to vectors of solvers (indexed into _solvers) TagMap _tags; /// The default solver std::string _defaultSolver; /// The MiniZinc library directory std::string _mznlibDir; /// The solver configurations path std::vector _solverPath; typedef std::unordered_map DefaultMap; /// Mapping from tag to default solver for that tag DefaultMap _tagDefault; typedef std::unordered_map > SolverDefaultMap; /// Mapping from solver id to default options for that solver SolverDefaultMap _solverDefaultOptions; /// Add new solver configuration \a sc void addConfig(const SolverConfig& sc); public: /** \brief Constructor loading configurations from \a solverpath * * Configuration files must be called config.msc and the path * uses platform specific separators (: on Unix-like systems, ; on Windows). */ SolverConfigs(std::ostream& log); /// Populate the solver configurations void populate(std::ostream& log); /// Return configuration for solver \a s /// The string can be a comma separated list of tags, in which case a /// solver that matches all tags will be returned. The tag can also be /// a solver id. A concrete version can be requested using @. /// Examples: /// config("gecode@6.1.0") would request a gecode solver of version 6.1.0 /// config("mip,internal") would request a MIP solver that uses the internal API /// config("org.minizinc.mip.coin-bc@2.9/1.16 would request a specific version of OSICBC const SolverConfig& config(const std::string& s); /// Return list of all solver ids std::vector solvers() const; /// Return search path for solver configs std::vector solverConfigsPath() const; /// Return JSON list of all solver configurations std::string solverConfigsJSON() const; /// Add a built-in solver static void registerBuiltinSolver(const SolverConfig& sc); /// Default solver const std::string& defaultSolver() const { return _defaultSolver; } /// Default solver for tag \a t const std::string& defaultSolver(const std::string& t) const { static std::string noDefault; auto it = _tagDefault.find(t); return it == _tagDefault.end() ? noDefault : it->second; } /// MiniZinc library directory const std::string& mznlibDir() const { return _mznlibDir; } /// Default options for the solver with the given ID std::vector defaultOptions(const std::string& id); }; /// An exception thrown when encountering an error in a solver configuration class ConfigException : public Exception { public: /// Construct with message \a msg ConfigException(const std::string& msg) : Exception(msg) {} /// Destructor ~ConfigException() throw() override {} /// Return description const char* what() const throw() override { return "MiniZinc: configuration error"; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/pathfileprinter.hh0000644000175000017500000000156713757304533021475 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class Model; class PathFilePrinter { typedef std::pair NamePair; typedef std::unordered_map NameMap; private: NameMap _betternames; std::ostream& _os; int _constraintIndex; void addBetterName(Id* id, const std::string& name, const std::string& path, bool overwrite); public: PathFilePrinter(std::ostream& o, EnvI& envi); void print(Model* m); void print(Item* i); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/chain_compressor.hh0000644000175000017500000000573213757304533021631 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class ChainCompressor { public: ChainCompressor(EnvI& env, Model& m, std::vector& deletedVarDecls) : _env(env), _m(m), _deletedVarDecls(deletedVarDecls){}; virtual bool trackItem(Item* i) = 0; virtual void compress() = 0; protected: EnvI& _env; Model& _m; std::vector& _deletedVarDecls; std::multimap _items; typedef std::multimap::iterator iterator; void storeItem(VarDecl* v, Item* i) { _items.emplace(v, i); } void updateCount(); unsigned long count(VarDecl* v) { return _items.count(v); } std::pair find(VarDecl* v) { return _items.equal_range(v); }; void removeItem(Item* i); int addItem(Item* i); // Replaces the Nth argument of a Call c by Expression e, c must be located on Item i void replaceCallArgument(Item* i, Call* c, unsigned int n, Expression* e); }; class ImpCompressor : public ChainCompressor { public: ImpCompressor(EnvI& env, Model& m, std::vector& deletedVarDecls, std::vector& boolConstraints0) : ChainCompressor(env, m, deletedVarDecls), _boolConstraints(boolConstraints0){}; bool trackItem(Item* i) override; void compress() override; protected: std::vector& _boolConstraints; // Compress two implications. e.g. (x -> y) /\ (y -> z) => x -> z // In this case i: (y -> z), newLHS: x // Function returns true if compression was successful (and the implication that contains newLHS // can be removed) Side effect: Item i might be removed. bool compressItem(Item* i, VarDecl* newLHS); // Constructs a clause constraint item with pos and neg as parameters. // if pos/neg are not ArrayLit then they will inserted into an ArrayLit. ConstraintI* constructClause(Expression* pos, Expression* neg); ConstraintI* constructHalfReif(Call* call, Id* control); }; class LECompressor : public ChainCompressor { public: LECompressor(EnvI& env, Model& m, std::vector& deletedVarDecls) : ChainCompressor(env, m, deletedVarDecls){}; bool trackItem(Item* i) override; void compress() override; protected: std::map _aliasMap; /// Replace the use a variable within an inequality /// e.g. i: int_lin_le([1,2,3], [a,b,c], 10), oldVar: a, newVar d -> int_lin_le([1,2,3], [d,b,c], /// 10) Occurrence count is updated for variables involved. template void leReplaceVar(Item* i, VarDecl* oldVar, VarDecl* newVar); /// Check if the bounds of two Variables are equal bool eqBounds(Expression* a, Expression* b); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solver.hh0000644000175000017500000001623313757304533017603 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include #include #include namespace MiniZinc { class SolverInitialiser { public: SolverInitialiser(); }; class SolverFactory; /// SolverRegistry is a storage for all SolverFactories in linked modules class SolverRegistry { public: void addSolverFactory(SolverFactory* sf); void removeSolverFactory(SolverFactory* sf); typedef std::vector SFStorage; const SFStorage& getSolverFactories() const { return _sfstorage; } typedef std::vector> FactoryFlagStorage; void addFactoryFlag(const std::string& flag, SolverFactory* sf); void removeFactoryFlag(const std::string& flag, SolverFactory* sf); const FactoryFlagStorage& getFactoryFlags() const { return _factoryFlagStorage; } private: SFStorage _sfstorage; FactoryFlagStorage _factoryFlagStorage; }; // SolverRegistry /// this function returns the global SolverRegistry object SolverRegistry* get_global_solver_registry(); /// Representation of flags that can be passed to solvers class MZNFZNSolverFlag { public: /// The type of the solver flag enum FlagType { FT_ARG, FT_NOARG } t; /// The name of the solver flag std::string n; protected: MZNFZNSolverFlag(const FlagType& t0, std::string n0) : t(t0), n(std::move(n0)) {} public: /// Create flag that has an argument static MZNFZNSolverFlag arg(const std::string& n) { return MZNFZNSolverFlag(FT_ARG, n); } /// Create flag that has no argument static MZNFZNSolverFlag noarg(const std::string& n) { return MZNFZNSolverFlag(FT_NOARG, n); } /// Create solver flag from standard flag static MZNFZNSolverFlag std(const std::string& n); /// Create solver flag from extra flag static MZNFZNSolverFlag extra(const SolverConfig::ExtraFlag& ef); }; /// SolverFactory's descendants create, store and destroy SolverInstances /// A SolverFactory stores all Instances itself and upon module exit, /// destroys them and de-registers itself from the global SolverRegistry /// An instance of SolverFactory's descendant can be created directly /// or by one of the specialized createF_...() functions class SolverFactory { protected: /// doCreateSI should be implemented to actually allocate a SolverInstance using new() virtual SolverInstanceBase* doCreateSI(Env&, std::ostream&, SolverInstanceBase::Options* opt) = 0; typedef std::vector> SIStorage; SIStorage _sistorage; SolverFactory() { get_global_solver_registry()->addSolverFactory(this); } public: virtual ~SolverFactory() { try { get_global_solver_registry()->removeSolverFactory(this); } catch (std::exception&) { assert(false); // Assert that the solver registry can be obtained and the solver factory // safely removed } } /// Processes a previously registered factory flag. virtual bool processFactoryOption(int& i, std::vector& argv, const std::string& workingDir = std::string()) { return false; }; /// Called after any registered factory flags have been processed. virtual void factoryOptionsFinished(){}; /// Create solver-specific options object virtual SolverInstanceBase::Options* createOptions() = 0; /// Function createSI also adds each SI to the local storage SolverInstanceBase* createSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); /// also providing a manual destroy function. /// there is no need to call it upon overall finish - that is taken care of void destroySI(SolverInstanceBase* pSI); /// Process an item in the command line. /// Leaving this now like this because this seems simpler. /// We can also pass options internally between modules in this way /// and it only needs 1 format virtual bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) { return false; } virtual std::string getDescription(SolverInstanceBase::Options* opt = nullptr) = 0; virtual std::string getVersion(SolverInstanceBase::Options* opt = nullptr) = 0; virtual std::string getId() = 0; virtual void printHelp(std::ostream& /*os*/) {} }; // SolverFactory // Class MznSolver coordinates flattening and solving. class MznSolver { private: SolverInitialiser _solverInit; enum OptionStatus { OPTION_OK, OPTION_ERROR, OPTION_FINISH }; /// Solver configurations SolverConfigs _solverConfigs; Flattener _flt; SolverInstanceBase* _si = nullptr; SolverInstanceBase::Options* _siOpt = nullptr; SolverFactory* _sf = nullptr; bool _isMzn2fzn = false; std::string _executableName; std::ostream& _os; std::ostream& _log; // These have special handling here as the stdFlags they correspond to // depend on the method and whether the solver supports the flag bool _supportsA = false; bool _supportsI = false; bool _flagAllSatisfaction = false; bool _flagIntermediate = false; public: Solns2Out s2out; /// global options bool flagVerbose = false; bool flagStatistics = false; bool flagCompilerVerbose = false; bool flagCompilerStatistics = false; bool flagIsSolns2out = false; int flagOverallTimeLimit = 0; MznSolver(std::ostream& os = std::cout, std::ostream& log = std::cerr); ~MznSolver(); SolverInstance::Status run(const std::vector& args, const std::string& model = std::string(), const std::string& exeName = std::string("minizinc"), const std::string& modelName = std::string("stdin")); OptionStatus processOptions(std::vector& argv); SolverFactory* getSF() { assert(_sf); return _sf; } SolverInstanceBase::Options* getSIOptions() { assert(_siOpt); return _siOpt; } bool getFlagVerbose() const { return flagVerbose; /*getFlt()->getFlagVerbose();*/ } void printUsage(); private: void printHelp(const std::string& selectedSolver = std::string()); /// Flatten model void flatten(const std::string& modelString = std::string(), const std::string& modelName = std::string("stdin")); static size_t getNSolvers() { return get_global_solver_registry()->getSolverFactories().size(); } /// If building a flattening exe only. bool ifMzn2Fzn() const; bool ifSolns2out() const; void addSolverInterface(); void addSolverInterface(SolverFactory* sf); SolverInstance::Status solve(); SolverInstance::Status getFltStatus() const { return _flt.status; } SolverInstanceBase* getSI() { assert(_si); return _si; } bool getFlagStatistics() const { return flagStatistics; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/utils.hh0000644000175000017500000001455013757304533017431 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MZN_HAS_LLROUND #include namespace MiniZinc { inline long long int round_to_longlong(double v) { return ::llround(v); } } // namespace MiniZinc #else namespace MiniZinc { inline long long int round_to_longlong(double v) { return static_cast(v < 0 ? v - 0.5 : v + 0.5); } } // namespace MiniZinc #endif namespace MiniZinc { // #define __MZN_PRINTATONCE__ #ifdef __MZN_PRINTATONCE__ #define __MZN_PRINT_SRCLOC(e1, e2) \ std::cerr << '\n' \ << __FILE__ << ": " << __LINE__ << " (" << __func__ << "): not " << e1 << ": " \ << std::flush; \ std::cerr << e2 << std::endl #else #define __MZN_PRINT_SRCLOC(e1, e2) #endif #define MZN_ASSERT_HARD(c) \ do { \ if (!(c)) { \ __MZN_PRINT_SRCLOC(#c, ""); \ throw InternalError(#c); \ } \ } while (0) #define MZN_ASSERT_HARD_MSG(c, e) \ do { \ if (!(c)) { \ __MZN_PRINT_SRCLOC(#c, e); \ std::ostringstream oss; \ oss << "not " << #c << ": " << e; /* NOLINT(bugprone-macro-parentheses) */ \ throw MiniZinc::InternalError(oss.str()); \ } \ } while (0) inline bool beginswith(const std::string& s, const std::string& t) { return s.compare(0, t.length(), t) == 0; } inline void check_io_status(bool fOk, const std::string& msg, bool fHard = true) { if (!fOk) { #ifdef _MSC_VER char errBuf[1024]; strerror_s(errBuf, sizeof(errBuf), errno); #else char* errBuf = strerror(errno); #endif std::cerr << "\n " << msg << ": " << errBuf << "." << std::endl; MZN_ASSERT_HARD_MSG(!fHard, msg << ": " << errBuf); } } template inline bool assign_string(T* /*t*/, const std::string& /*s*/) { return false; } template <> inline bool assign_string(std::string* pS, const std::string& s) { *pS = s; return true; } /// A simple per-cmdline option parser class CLOParser { int& _i; // current item std::vector& _argv; public: CLOParser(int& ii, std::vector& av) : _i(ii), _argv(av) {} template inline bool get(const char* names, // space-separated option list Value* pResult = nullptr, // pointer to value storage bool fValueOptional = false // if pResult, for non-string values ) { return getOption(names, pResult, fValueOptional); } template inline bool getOption(const char* names, // space-separated option list Value* pResult = nullptr, // pointer to value storage bool fValueOptional = false // if pResult, for non-string values ) { assert(nullptr == strchr(names, ',')); assert(nullptr == strchr(names, ';')); if (_i >= _argv.size()) { return false; } std::string arg(_argv[_i]); /// Separate keywords std::string keyword; std::istringstream iss(names); while (iss >> keyword) { if (((2 < keyword.size() || nullptr == pResult) && arg != keyword) || // exact cmp (0 != arg.compare(0, keyword.size(), keyword))) { // truncated cmp continue; } /// Process it bool combinedArg = false; // whether arg and value are combined in one string (like -Ggecode) if (keyword.size() < arg.size()) { if (nullptr == pResult) { continue; } combinedArg = true; arg.erase(0, keyword.size()); } else { if (nullptr == pResult) { return true; } _i++; if (_i >= _argv.size()) { --_i; return fValueOptional; } arg = _argv[_i]; } assert(pResult); if (assign_string(pResult, arg)) { return true; } std::istringstream iss(arg); Value tmp; if (!(iss >> tmp)) { if (!combinedArg) { --_i; } return fValueOptional; } *pResult = tmp; return true; } return false; } }; // class CLOParser /// This class prints a value if non-0 and adds comma if not 1st time class HadOne { bool _fHadOne = false; public: template std::string operator()(const N& val, const char* descr = nullptr) { std::ostringstream oss; if (val) { if (_fHadOne) { oss << ", "; } _fHadOne = true; oss << val; if (descr) { oss << descr; } } return oss.str(); } void reset() { _fHadOne = false; } operator bool() const { return _fHadOne; } bool operator!() const { return !_fHadOne; } }; /// Split a string into words /// Add the words into the given vector inline void split(const std::string& str, std::vector& words) { std::istringstream iss(str); std::string buf; while (iss) { iss >> buf; words.push_back(buf); } } /// Puts the strings' c_str()s into the 2nd argument. /// The latter is only valid as long as the former isn't changed. inline void vec_string2vec_pchar(const std::vector& vS, std::vector& vPC) { vPC.resize(vS.size()); for (size_t i = 0; i < vS.size(); ++i) { vPC[i] = vS[i].c_str(); } } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/flattener.hh0000644000175000017500000000775313757304533020264 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include // temp., TODO #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAS_GECODE #include #endif namespace MiniZinc { class Flattener { private: std::unique_ptr _pEnv; std::ostream& _os; std::ostream& _log; public: Flattener(std::ostream& os, std::ostream& log, std::string stdlibDir); ~Flattener(); bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); static void printVersion(std::ostream& os); void printHelp(std::ostream& os) const; void flatten(const std::string& modelString = std::string(), const std::string& modelName = std::string("stdin")); void printStatistics(std::ostream& os); void setFlagVerbose(bool f) { _flags.verbose = f; } bool getFlagVerbose() const { return _flags.verbose; } void setFlagStatistics(bool f) { _flags.statistics = f; } bool getFlagStatistics() const { return _flags.statistics; } void setFlagTimelimit(unsigned long long int t) { _fopts.timeout = t; } unsigned long long int getFlagTimelimit() const { return _fopts.timeout; } void setFlagOutputByDefault(bool f) { _fOutputByDefault = f; } Env* getEnv() const { assert(_pEnv.get()); return _pEnv.get(); } bool hasInputFiles() const { return !_filenames.empty() || _flags.stdinInput || !_flagSolutionCheckModel.empty(); } SolverInstance::Status status = SolverInstance::UNKNOWN; private: Env* multiPassFlatten(const std::vector >& passes); bool _fOutputByDefault = false; // if the class is used in mzn2fzn, write .fzn+.ozn by default std::vector _filenames; std::vector _datafiles; std::vector _includePaths; bool _isFlatzinc = false; struct { bool typecheck = true; bool verbose = false; bool newfzn = false; bool optimize = true; bool chainCompression = true; bool werror = false; bool onlyRangeDomains = false; bool allowUnboundedVars = false; bool noMIPdomains = false; bool statistics = false; bool stdinInput = false; bool allowMultiAssign = false; bool gecode = false; bool twoPass = false; bool sac = false; bool shave = false; bool noOutputOzn = false; bool keepMznPaths = false; bool outputFznStdout = false; bool outputOznStdout = false; bool outputPathsStdout = false; bool instanceCheckOnly = false; bool modelCheckOnly = false; bool modelInterfaceOnly = false; bool modelTypesOnly = false; bool outputObjective = false; bool outputOutputItem = false; bool compileSolutionCheckModel = false; } _flags; int _optMIPDmaxIntvEE = 0; double _optMIPDmaxDensEE = 0.0; unsigned int _flagPrePasses = 1; std::string _stdLibDir; std::string _globalsDir; std::string _flagOutputBase; std::string _flagOutputFzn; std::string _flagOutputOzn; std::string _flagOutputPaths; FlatteningOptions::OutputMode _flagOutputMode = FlatteningOptions::OUTPUT_ITEM; std::string _flagSolutionCheckModel; FlatteningOptions _fopts; Timer _starttime; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/aststring.hh0000644000175000017500000001763313757304533020314 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include namespace MiniZinc { class ASTStringData; /** * \brief Handle for an interned garbage collected string */ class ASTString { protected: /// String ASTStringData* _s = nullptr; public: /// Default constructor ASTString() = default; /// Constructor ASTString(const std::string& s); /// Constructor ASTString(ASTStringData* s) : _s(s){}; /// Copy constructor ASTString(const ASTString& s) = default; /// Assignment operator ASTString& operator=(const ASTString& s) = default; /// Size of the string size_t size() const; /// Underlying C string object const char* c_str() const; // NOLINT(readability-identifier-naming) /// Underlying string implementation ASTStringData* aststr() const { return _s; } /// Return if string is equal to \a s bool operator==(const ASTString& s) const; /// Return if string is not equal to \a s bool operator!=(const ASTString& s) const; /// Return if string is less than \a s bool operator<(const ASTString& s) const; /// Return if string is equal to \a s bool operator==(const std::string& s) const; /// Return if string is not equal to \a s bool operator!=(const std::string& s) const; /// Return if string ends with \a s bool endsWith(const std::string& s) const; /// Return if string begins with \a s bool beginsWith(const std::string& s) const; /// Returns a substring [pos, pos+count). std::string substr(size_t pos = 0, size_t count = std::string::npos) const; // Finds the last character equal to one of characters in the given character sequence. size_t findLastOf(char ch, size_t pos = std::string::npos) const noexcept; // Finds the first character equal to the given character sequence. size_t find(char ch, size_t pos = 0) const noexcept; /// Return Levenshtein distance to \a s int levenshteinDistance(const ASTString& other) const; /// Compute hash value of string size_t hash() const; /// Mark string during garbage collection void mark() const; }; /** * \brief Print String \a s */ template std::basic_ostream& operator<<(std::basic_ostream& os, const ASTString& s) { return s.size() == 0 ? os : (os << s.c_str()); } } // namespace MiniZinc namespace std { template <> struct hash { public: size_t operator()(const MiniZinc::ASTString& s) const; }; template <> struct equal_to { public: bool operator()(const MiniZinc::ASTString& s0, const MiniZinc::ASTString& s1) const; }; template <> struct less { public: bool operator()(const MiniZinc::ASTString& s0, const MiniZinc::ASTString& s1) const; }; } // namespace std namespace MiniZinc { struct CStringHash { public: // FIXME: This is not an amazing hash function size_t operator()(const std::pair& s) const { size_t result = 0; const size_t prime = 31; for (size_t i = 0; i < s.second; ++i) { result = s.first[i] + (result * prime); } return result; } }; struct CStringEquals { public: bool operator()(const std::pair& s0, const std::pair& s1) const { return s0.second == s1.second && (strncmp(s0.first, s1.first, s0.second) == 0); } }; /** * \brief Garbage collected interned string */ class ASTStringData : public ASTChunk { friend class GC::Heap; protected: /// Interning Hash Map using Interner = std::unordered_map, ASTStringData*, CStringHash, CStringEquals>; static Interner& interner(); /// Constructor ASTStringData(const std::string& s); public: /// Allocate and initialise as \a s static ASTStringData* a(const std::string& s); /// Return underlying C-style string // NOLINTNEXTLINE(readability-identifier-naming) const char* c_str() const { return _data + sizeof(size_t); } /// Return size of string size_t size() const { return static_cast(_size) - static_cast(sizeof(size_t)) - 1; } /// Access character at position \a i char operator[](unsigned int i) { assert(i < size()); return _data[sizeof(size_t) + i]; } /// Return hash value of string size_t hash() const { return reinterpret_cast(_data)[0]; } /// Mark for garbage collection void mark() const { _gcMark = 1; } protected: /// GC Destructor void destroy() const { assert(interner().find({this->c_str(), this->size()}) != interner().end()); interner().erase({this->c_str(), this->size()}); }; }; inline ASTString::ASTString(const std::string& s) : _s(ASTStringData::a(s)) {} inline size_t ASTString::size() const { return _s != nullptr ? _s->size() : 0; } // NOLINTNEXTLINE(readability-identifier-naming) inline const char* ASTString::c_str() const { return _s != nullptr ? _s->c_str() : nullptr; } inline void ASTString::mark() const { if (_s != nullptr) { _s->mark(); } } inline bool ASTString::operator==(const ASTString& s) const { return _s == s._s; } inline bool ASTString::operator!=(const ASTString& s) const { return _s != s._s; } inline bool ASTString::operator<(const ASTString& s) const { if (size() == 0) { return 0 < s.size(); } unsigned int size = std::min(_s->size(), s.size()); int cmp = strncmp(_s->c_str(), s.c_str(), size); if (cmp == 0) { return _s->size() < s.size(); } return cmp < 0; } inline bool ASTString::operator==(const std::string& s) const { return size() == s.size() && (size() == 0 || strncmp(_s->c_str(), s.c_str(), size()) == 0); } inline bool ASTString::operator!=(const std::string& s) const { return !(*this == s); } inline bool ASTString::endsWith(const std::string& s) const { return size() >= s.size() && (size() == 0 || strncmp(_s->c_str() + size() - s.size(), s.c_str(), s.size()) == 0); } inline bool ASTString::beginsWith(const std::string& s) const { return size() >= s.size() && (size() == 0 || strncmp(_s->c_str(), s.c_str(), s.size()) == 0); } inline std::string ASTString::substr(size_t pos, size_t count) const { if (pos > size()) { throw std::out_of_range("ASTString::substr pos out of range"); } if (count == std::string::npos) { return std::string(c_str() + pos, size() - pos); } return std::string(c_str() + pos, std::min(size() - pos, count)); } inline size_t ASTString::findLastOf(char ch, size_t pos) const noexcept { const char* str = c_str(); for (int i = std::min(size() - 1, pos); i >= 0; --i) { if (str[i] == ch) { return i; } } return std::string::npos; } inline size_t ASTString::find(char ch, size_t pos) const noexcept { if (pos >= size()) { return std::string::npos; } const char* str = c_str(); for (int i = pos; i < size(); ++i) { if (str[i] == ch) { return i; } } return std::string::npos; } inline size_t ASTString::hash() const { return _s != nullptr ? _s->hash() : 0; } } // namespace MiniZinc namespace std { inline size_t hash::operator()(const MiniZinc::ASTString& s) const { return s.hash(); } inline bool equal_to::operator()(const MiniZinc::ASTString& s0, const MiniZinc::ASTString& s1) const { return s0 == s1; } inline bool less::operator()(const MiniZinc::ASTString& s0, const MiniZinc::ASTString& s1) const { return s0 < s1; } } // namespace std libminizinc-2.5.3/include/minizinc/builtins.hh0000644000175000017500000000101713757304533020114 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { /// Add builtins to the functions defined in \a env.model() void register_builtins(Env& env); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/values.hh0000644000175000017500000006474213757304533017600 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include #include namespace MiniZinc { class IntVal; } namespace std { MiniZinc::IntVal abs(const MiniZinc::IntVal& x); } namespace MiniZinc { class FloatVal; class IntVal { friend IntVal operator+(const IntVal& x, const IntVal& y); friend IntVal operator-(const IntVal& x, const IntVal& y); friend IntVal operator*(const IntVal& x, const IntVal& y); friend IntVal operator/(const IntVal& x, const IntVal& y); friend IntVal operator%(const IntVal& x, const IntVal& y); friend IntVal std::abs(const MiniZinc::IntVal& x); friend bool operator==(const IntVal& x, const IntVal& y); friend class FloatVal; private: long long int _v; bool _infinity; IntVal(long long int v, bool infinity) : _v(v), _infinity(infinity) {} static long long int safePlus(long long int x, long long int y) { if (x < 0) { if (y < std::numeric_limits::min() - x) { throw ArithmeticError("integer overflow"); } } else { if (y > std::numeric_limits::max() - x) { throw ArithmeticError("integer overflow"); } } return x + y; } static long long int safeMinus(long long int x, long long int y) { if (x < 0) { if (y > x - std::numeric_limits::min()) { throw ArithmeticError("integer overflow"); } } else { if (y < x - std::numeric_limits::max()) { throw ArithmeticError("integer overflow"); } } return x - y; } static long long int safeMult(long long int x, long long int y) { if (y == 0) { return 0; } long long unsigned int x_abs = (x < 0 ? 0 - x : x); long long unsigned int y_abs = (y < 0 ? 0 - y : y); if (x_abs > std::numeric_limits::max() / y_abs) { throw ArithmeticError("integer overflow"); } return x * y; } static long long int safeDiv(long long int x, long long int y) { if (y == 0) { throw ArithmeticError("integer division by zero"); } if (x == 0) { return 0; } if (x == std::numeric_limits::min() && y == -1) { throw ArithmeticError("integer overflow"); } return x / y; } static long long int safeMod(long long int x, long long int y) { if (y == 0) { throw ArithmeticError("integer division by zero"); } if (y == -1) { return 0; } return x % y; } public: IntVal() : _v(0), _infinity(false) {} IntVal(long long int v) : _v(v), _infinity(false) {} IntVal(const FloatVal& v); long long int toInt() const { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } return _v; } bool isFinite() const { return !_infinity; } bool isPlusInfinity() const { return _infinity && _v == 1; } bool isMinusInfinity() const { return _infinity && _v == -1; } IntVal& operator+=(const IntVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safePlus(_v, x._v); return *this; } IntVal& operator-=(const IntVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safeMinus(_v, x._v); return *this; } IntVal& operator*=(const IntVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safeMult(_v, x._v); return *this; } IntVal& operator/=(const IntVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safeDiv(_v, x._v); return *this; } IntVal operator-() const { IntVal r = *this; r._v = safeMinus(0, _v); return r; } IntVal& operator++() { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safePlus(_v, 1); return *this; } IntVal operator++(int) { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } IntVal ret = *this; _v = safePlus(_v, 1); return ret; } IntVal& operator--() { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = safeMinus(_v, 1); return *this; } IntVal operator--(int) { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } IntVal ret = *this; _v = safeMinus(_v, 1); return ret; } IntVal pow(const IntVal& exponent) { if (!exponent.isFinite() || !isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } if (exponent == 0) { return 1; } if (exponent == 1) { return *this; } IntVal result = 1; for (int i = 0; i < exponent.toInt(); i++) { result *= *this; } return result; } static IntVal minint(); static IntVal maxint(); static IntVal infinity(); /// Infinity-safe addition IntVal plus(int x) const { if (isFinite()) { return safePlus(_v, x); } return *this; } /// Infinity-safe subtraction IntVal minus(int x) const { if (isFinite()) { return safeMinus(_v, x); } return *this; } size_t hash() const { std::hash longhash; return longhash(_v); } }; inline bool operator==(const IntVal& x, const IntVal& y) { return x._infinity == y._infinity && x._v == y._v; } inline bool operator<=(const IntVal& x, const IntVal& y) { return y.isPlusInfinity() || x.isMinusInfinity() || (x.isFinite() && y.isFinite() && x.toInt() <= y.toInt()); } inline bool operator<(const IntVal& x, const IntVal& y) { return (y.isPlusInfinity() && !x.isPlusInfinity()) || (x.isMinusInfinity() && !y.isMinusInfinity()) || (x.isFinite() && y.isFinite() && x.toInt() < y.toInt()); } inline bool operator>=(const IntVal& x, const IntVal& y) { return y <= x; } inline bool operator>(const IntVal& x, const IntVal& y) { return y < x; } inline bool operator!=(const IntVal& x, const IntVal& y) { return !(x == y); } inline IntVal operator+(const IntVal& x, const IntVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return IntVal::safePlus(x._v, y._v); } inline IntVal operator-(const IntVal& x, const IntVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return IntVal::safeMinus(x._v, y._v); } inline IntVal operator*(const IntVal& x, const IntVal& y) { if (!x.isFinite()) { if (y.isFinite() && (y._v == 1 || y._v == -1)) { return IntVal(IntVal::safeMult(x._v, y._v), !x.isFinite()); } } else if (!y.isFinite()) { if (x.isFinite() && (y._v == 1 || y._v == -1)) { return IntVal(IntVal::safeMult(x._v, y._v), true); } } else { return IntVal::safeMult(x._v, y._v); } throw ArithmeticError("arithmetic operation on infinite value"); } inline IntVal operator/(const IntVal& x, const IntVal& y) { if (y.isFinite() && (y._v == 1 || y._v == -1)) { return IntVal(IntVal::safeMult(x._v, y._v), !x.isFinite()); } if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return IntVal::safeDiv(x._v, y._v); } inline IntVal operator%(const IntVal& x, const IntVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return IntVal::safeMod(x._v, y._v); } template std::basic_ostream& operator<<(std::basic_ostream& os, const IntVal& s) { if (s.isMinusInfinity()) { return os << "-infinity"; } if (s.isPlusInfinity()) { return os << "infinity"; } return os << s.toInt(); } } // namespace MiniZinc namespace std { inline MiniZinc::IntVal abs(const MiniZinc::IntVal& x) { if (!x.isFinite()) { return MiniZinc::IntVal::infinity(); } return x < 0 ? MiniZinc::IntVal::safeMinus(0, x._v) : x; } inline MiniZinc::IntVal min(const MiniZinc::IntVal& x, const MiniZinc::IntVal& y) { return x <= y ? x : y; } inline MiniZinc::IntVal max(const MiniZinc::IntVal& x, const MiniZinc::IntVal& y) { return x >= y ? x : y; } template <> struct equal_to { public: bool operator()(const MiniZinc::IntVal& s0, const MiniZinc::IntVal& s1) const { return s0 == s1; } }; inline MiniZinc::FloatVal abs(const MiniZinc::FloatVal& x); } // namespace std namespace std { template <> struct hash { public: size_t operator()(const MiniZinc::IntVal& s) const { return s.hash(); } }; } // namespace std namespace MiniZinc { class FloatVal { friend FloatVal operator+(const FloatVal& x, const FloatVal& y); friend FloatVal operator-(const FloatVal& x, const FloatVal& y); friend FloatVal operator*(const FloatVal& x, const FloatVal& y); friend FloatVal operator/(const FloatVal& x, const FloatVal& y); friend FloatVal std::abs(const MiniZinc::FloatVal& x); friend bool operator==(const FloatVal& x, const FloatVal& y); friend class IntVal; private: double _v; bool _infinity; void checkOverflow() const { if (!std::isfinite(_v)) { throw ArithmeticError("overflow in floating point operation"); } } FloatVal(double v, bool infinity) : _v(v), _infinity(infinity) { checkOverflow(); } public: FloatVal() : _v(0.0), _infinity(false) {} FloatVal(double v) : _v(v), _infinity(false) { checkOverflow(); } FloatVal(const IntVal& v) : _v(static_cast(v._v)), _infinity(!v.isFinite()) {} double toDouble() const { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } return _v; } bool isFinite() const { return !_infinity; } bool isPlusInfinity() const { return _infinity && _v == 1.0; } bool isMinusInfinity() const { return _infinity && _v == -1.0; } FloatVal& operator+=(const FloatVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v += x._v; checkOverflow(); return *this; } FloatVal& operator-=(const FloatVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v -= x._v; checkOverflow(); return *this; } FloatVal& operator*=(const FloatVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v *= x._v; checkOverflow(); return *this; } FloatVal& operator/=(const FloatVal& x) { if (!(isFinite() && x.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = _v / x._v; checkOverflow(); return *this; } FloatVal operator-() const { FloatVal r = *this; r._v = -r._v; return r; } FloatVal& operator++() { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = _v + 1; checkOverflow(); return *this; } FloatVal operator++(int) { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } FloatVal ret = *this; _v = _v + 1; checkOverflow(); return ret; } FloatVal& operator--() { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } _v = _v - 1; checkOverflow(); return *this; } FloatVal operator--(int) { if (!isFinite()) { throw ArithmeticError("arithmetic operation on infinite value"); } FloatVal ret = *this; _v = _v - 1; checkOverflow(); return ret; } static FloatVal infinity(); /// Infinity-safe addition FloatVal plus(int x) { if (isFinite()) { return (*this) + x; } return *this; } /// Infinity-safe subtraction FloatVal minus(int x) { if (isFinite()) { return (*this) - x; } return *this; } size_t hash() const { std::hash doublehash; return doublehash(_v); } }; inline bool operator==(const FloatVal& x, const FloatVal& y) { return x._infinity == y._infinity && x._v == y._v; } inline bool operator<=(const FloatVal& x, const FloatVal& y) { return y.isPlusInfinity() || x.isMinusInfinity() || (x.isFinite() && y.isFinite() && x.toDouble() <= y.toDouble()); } inline bool operator<(const FloatVal& x, const FloatVal& y) { return (y.isPlusInfinity() && !x.isPlusInfinity()) || (x.isMinusInfinity() && !y.isMinusInfinity()) || (x.isFinite() && y.isFinite() && x.toDouble() < y.toDouble()); } inline bool operator>=(const FloatVal& x, const FloatVal& y) { return y <= x; } inline bool operator>(const FloatVal& x, const FloatVal& y) { return y < x; } inline bool operator!=(const FloatVal& x, const FloatVal& y) { return !(x == y); } inline FloatVal operator+(const FloatVal& x, const FloatVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return x.toDouble() + y.toDouble(); } inline FloatVal operator-(const FloatVal& x, const FloatVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return x.toDouble() - y.toDouble(); } inline FloatVal operator*(const FloatVal& x, const FloatVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return x.toDouble() * y.toDouble(); } inline FloatVal operator/(const FloatVal& x, const FloatVal& y) { if (!(x.isFinite() && y.isFinite())) { throw ArithmeticError("arithmetic operation on infinite value"); } return x.toDouble() / y.toDouble(); } template std::basic_ostream& operator<<(std::basic_ostream& os, const FloatVal& s) { if (s.isMinusInfinity()) { return os << "-infinity"; } if (s.isPlusInfinity()) { return os << "infinity"; } return os << s.toDouble(); } inline IntVal::IntVal(const FloatVal& v) : _v(static_cast(v._v)), _infinity(!v.isFinite()) {} } // namespace MiniZinc namespace std { inline MiniZinc::FloatVal abs(const MiniZinc::FloatVal& x) { if (!x.isFinite()) { return MiniZinc::FloatVal::infinity(); } return x.toDouble() < 0 ? MiniZinc::FloatVal(-x.toDouble()) : x; } inline MiniZinc::FloatVal min(const MiniZinc::FloatVal& x, const MiniZinc::FloatVal& y) { return x <= y ? x : y; } inline MiniZinc::FloatVal max(const MiniZinc::FloatVal& x, const MiniZinc::FloatVal& y) { return x >= y ? x : y; } inline MiniZinc::FloatVal floor(const MiniZinc::FloatVal& x) { if (!x.isFinite()) { return x; } return floor(x.toDouble()); } inline MiniZinc::FloatVal ceil(const MiniZinc::FloatVal& x) { if (!x.isFinite()) { return x; } return ceil(x.toDouble()); } template <> struct equal_to { public: bool operator()(const MiniZinc::FloatVal& s0, const MiniZinc::FloatVal& s1) const { return s0 == s1; } }; } // namespace std namespace std { template <> struct hash { public: size_t operator()(const MiniZinc::FloatVal& s) const { return s.hash(); } }; } // namespace std namespace MiniZinc { typedef unsigned long long int UIntVal; /// An integer set value class IntSetVal : public ASTChunk { public: /// Contiguous range struct Range { /// Range minimum IntVal min; /// Range maximum IntVal max; /// Construct range from \a m to \a n Range(IntVal m, IntVal n) : min(m), max(n) {} /// Default constructor Range() {} }; private: /// Return range at position \a i Range& get(unsigned int i) { return reinterpret_cast(_data)[i]; } /// Return range at position \a i const Range& get(unsigned int i) const { return reinterpret_cast(_data)[i]; } /// Construct empty set IntSetVal() : ASTChunk(0) {} /// Construct set of single range IntSetVal(IntVal m, IntVal n); /// Construct set from \a s IntSetVal(const std::vector& s) : ASTChunk(sizeof(Range) * s.size()) { for (auto i = static_cast(s.size()); (i--) != 0U;) { get(i) = s[i]; } } /// Disabled IntSetVal(const IntSetVal& r); /// Disabled IntSetVal& operator=(const IntSetVal& r); public: /// Return number of ranges unsigned int size() const { return static_cast(_size / sizeof(Range)); } /// Return minimum, or infinity if set is empty IntVal min() const { return size() == 0 ? IntVal::infinity() : get(0).min; } /// Return maximum, or minus infinity if set is empty IntVal max() const { return size() == 0 ? -IntVal::infinity() : get(size() - 1).max; } /// Return minimum of range \a i IntVal min(unsigned int i) const { assert(i < size()); return get(i).min; } /// Return maximum of range \a i IntVal max(unsigned int i) const { assert(i < size()); return get(i).max; } /// Return width of range \a i IntVal width(unsigned int i) const { assert(i < size()); if (min(i).isFinite() && max(i).isFinite()) { return max(i) - min(i) + 1; } return IntVal::infinity(); } /// Return cardinality IntVal card() const { IntVal c = 0; for (unsigned int i = size(); (i--) != 0U;) { if (width(i).isFinite()) { c += width(i); } else { return IntVal::infinity(); } } return c; } /// Allocate empty set from context static IntSetVal* a() { auto* r = static_cast(ASTChunk::alloc(0)); new (r) IntSetVal(); return r; } /// Allocate set \f$\{m,n\}\f$ from context static IntSetVal* a(IntVal m, IntVal n) { if (m > n) { return a(); } auto* r = static_cast(ASTChunk::alloc(sizeof(Range))); new (r) IntSetVal(m, n); return r; } /// Allocate set using iterator \a i template static IntSetVal* ai(I& i) { std::vector s; for (; i(); ++i) { s.push_back(Range(i.min(), i.max())); } auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * s.size())); new (r) IntSetVal(s); return r; } /// Allocate set from vector \a s0 (may contain duplicates) static IntSetVal* a(const std::vector& s0) { if (s0.empty()) { return a(); } std::vector s = s0; std::sort(s.begin(), s.end()); std::vector ranges; IntVal min = s[0]; IntVal max = min; for (unsigned int i = 1; i < s.size(); i++) { if (s[i] > max + 1) { ranges.emplace_back(min, max); min = s[i]; max = min; } else { max = s[i]; } } ranges.emplace_back(min, max); auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * ranges.size())); new (r) IntSetVal(ranges); return r; } static IntSetVal* a(const std::vector& ranges) { auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * ranges.size())); new (r) IntSetVal(ranges); return r; } /// Check if set contains \a v bool contains(const IntVal& v) const { for (int i = 0; i < size(); i++) { if (v < min(i)) { return false; } if (v <= max(i)) { return true; } } return false; } /// Check if it is equal to \a s bool equal(const IntSetVal* s) const { if (size() != s->size()) { return false; } for (int i = 0; i < size(); i++) { if (min(i) != s->min(i) || max(i) != s->max(i)) { return false; } } return true; } /// Mark for garbage collection void mark() { _gcMark = 1; } }; /// Iterator over an IntSetVal class IntSetRanges { protected: /// The set value const IntSetVal* _rs; /// The current range int _n; public: /// Constructor IntSetRanges(const IntSetVal* r) : _rs(r), _n(0) {} /// Check if iterator is still valid bool operator()() const { return _n < _rs->size(); } /// Move to next range void operator++() { ++_n; } /// Return minimum of current range IntVal min() const { return _rs->min(_n); } /// Return maximum of current range IntVal max() const { return _rs->max(_n); } /// Return width of current range IntVal width() const { return _rs->width(_n); } }; template std::basic_ostream& operator<<(std::basic_ostream& os, const IntSetVal& s) { if (s.size() == 0) { os << "1..0"; } else if (s.size() == 1) { // Print the range IntSetRanges isr(&s); os << isr.min() << ".." << isr.max(); } else { // Print each element of the set bool first = true; os << "{"; for (IntSetRanges isr(&s); isr(); ++isr) { if (!first) { os << ", "; } first = false; for (IntVal v = isr.min(); v < isr.max(); ++v) { os << v; } } os << "}"; } return os; } /// An integer set value class FloatSetVal : public ASTChunk { public: /// Contiguous range struct Range { /// Range minimum FloatVal min; /// Range maximum FloatVal max; /// Construct range from \a m to \a n Range(FloatVal m, FloatVal n) : min(m), max(n) {} /// Default constructor Range() {} }; private: /// Return range at position \a i Range& get(unsigned int i) { return reinterpret_cast(_data)[i]; } /// Return range at position \a i const Range& get(unsigned int i) const { return reinterpret_cast(_data)[i]; } /// Construct empty set FloatSetVal() : ASTChunk(0) {} /// Construct set of single range FloatSetVal(FloatVal m, FloatVal n); /// Construct set from \a s FloatSetVal(const std::vector& s) : ASTChunk(sizeof(Range) * s.size()) { for (auto i = static_cast(s.size()); (i--) != 0U;) { get(i) = s[i]; } } /// Disabled FloatSetVal(const FloatSetVal& r); /// Disabled FloatSetVal& operator=(const FloatSetVal& r); public: /// Return number of ranges unsigned int size() const { return static_cast(_size / sizeof(Range)); } /// Return minimum, or infinity if set is empty FloatVal min() const { return size() == 0 ? FloatVal::infinity() : get(0).min; } /// Return maximum, or minus infinity if set is empty FloatVal max() const { return size() == 0 ? -FloatVal::infinity() : get(size() - 1).max; } /// Return minimum of range \a i FloatVal min(unsigned int i) const { assert(i < size()); return get(i).min; } /// Return maximum of range \a i FloatVal max(unsigned int i) const { assert(i < size()); return get(i).max; } /// Return width of range \a i FloatVal width(unsigned int i) const { assert(i < size()); if (min(i).isFinite() && max(i).isFinite() && min(i) == max(i)) { return 1; } return IntVal::infinity(); } /// Return cardinality FloatVal card() const { FloatVal c = 0; for (unsigned int i = size(); (i--) != 0U;) { if (width(i).isFinite()) { c += width(i); } else { return FloatVal::infinity(); } } return c; } /// Allocate empty set from context static FloatSetVal* a() { auto* r = static_cast(ASTChunk::alloc(0)); new (r) FloatSetVal(); return r; } /// Allocate set \f$\{m,n\}\f$ from context static FloatSetVal* a(FloatVal m, FloatVal n) { if (m > n) { return a(); } auto* r = static_cast(ASTChunk::alloc(sizeof(Range))); new (r) FloatSetVal(m, n); return r; } /// Allocate set using iterator \a i template static FloatSetVal* ai(I& i) { std::vector s; for (; i(); ++i) { s.push_back(Range(i.min(), i.max())); } auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * s.size())); new (r) FloatSetVal(s); return r; } /// Allocate set from vector \a s0 (may contain duplicates) static FloatSetVal* a(const std::vector& s0) { if (s0.empty()) { return a(); } std::vector s = s0; std::sort(s.begin(), s.end()); std::vector ranges; FloatVal min = s[0]; FloatVal max = min; for (unsigned int i = 1; i < s.size(); i++) { if (s[i] > max) { ranges.emplace_back(min, max); min = s[i]; max = min; } else { max = s[i]; } } ranges.emplace_back(min, max); auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * ranges.size())); new (r) FloatSetVal(ranges); return r; } static FloatSetVal* a(const std::vector& ranges) { auto* r = static_cast(ASTChunk::alloc(sizeof(Range) * ranges.size())); new (r) FloatSetVal(ranges); return r; } /// Check if set contains \a v bool contains(const FloatVal& v) const { for (int i = 0; i < size(); i++) { if (v < min(i)) { return false; } if (v <= max(i)) { return true; } } return false; } /// Check if it is equal to \a s bool equal(const FloatSetVal* s) const { if (size() != s->size()) { return false; } for (int i = 0; i < size(); i++) { if (min(i) != s->min(i) || max(i) != s->max(i)) { return false; } } return true; } /// Mark for garbage collection void mark() { _gcMark = 1; } }; /// Iterator over an IntSetVal class FloatSetRanges { /// The set value const FloatSetVal* _rs; /// The current range int _n; public: /// Constructor FloatSetRanges(const FloatSetVal* r) : _rs(r), _n(0) {} /// Check if iterator is still valid bool operator()() const { return _n < _rs->size(); } /// Move to next range void operator++() { ++_n; } /// Return minimum of current range FloatVal min() const { return _rs->min(_n); } /// Return maximum of current range FloatVal max() const { return _rs->max(_n); } /// Return width of current range FloatVal width() const { return _rs->width(_n); } }; template std::basic_ostream& operator<<(std::basic_ostream& os, const FloatSetVal& s) { for (FloatSetRanges isr(&s); isr(); ++isr) { os << isr.min() << ".." << isr.max() << " "; } return os; } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/plugin.hh0000644000175000017500000000644213757304533017570 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jason Nguyen */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #ifdef _WIN32 #define NOMINMAX // Ensure the words min/max remain available #include #undef ERROR #else #include #endif #include #include #include #include #include #include /// Convenience macro for loading symbols #define load_symbol(name) *(void**)(&(name)) = symbol(#name) namespace MiniZinc { /// Base class for plugins loaded from DLLs class Plugin { public: class PluginError : public Exception { public: /// Construct with message \a msg PluginError(const std::string& msg) : Exception(msg) {} /// Destructor ~PluginError() throw() override {} /// Return description const char* what() const throw() override { return "MiniZinc: plugin loading error"; } }; /// Load a plugin with given DLL path Plugin(const std::string& file) { if (!open(file)) { throw PluginError("Failed to load plugin " + file); } } /// Load a plugin by trying the given DLL file paths Plugin(const std::vector& files) { for (const auto& file : files) { if (open(file)) { return; } } bool first = true; std::stringstream ss; ss << "Failed to load plugin. Tried "; for (const auto& file : files) { if (first) { first = false; } else { ss << ", "; } ss << file; } throw PluginError(ss.str()); } ~Plugin() { close(); } /// Get the path to the loaded DLL const std::string& path() { return _loaded; } protected: /// Load a symbol from this DLL void* symbol(const char* name) { void* ret; #ifdef _WIN32 ret = (void*)GetProcAddress((HMODULE)_dll, (LPCSTR)name); #else ret = dlsym(_dll, name); #endif if (ret == nullptr) { throw PluginError(std::string("Failed to load symbol ") + name); } return ret; } private: void* _dll; std::string _loaded; bool open(const std::string& file) { #ifdef _WIN32 const std::string ext = ".dll"; #elif __APPLE__ const std::string ext = ".dylib"; #else const std::string ext = ".so"; #endif bool hasExt = file.size() >= ext.size() && file.compare(file.size() - ext.size(), ext.size(), ext) == 0; auto path = (hasExt || MiniZinc::FileUtils::is_absolute(file)) ? file : (file + ext); #ifdef _WIN32 auto dir = MiniZinc::FileUtils::dir_name(path); if (!dir.empty()) { // Add the path with the DLL to the search path for dependency loading SetDllDirectoryW(MiniZinc::FileUtils::utf8_to_wide(dir).c_str()); } _dll = (void*)LoadLibrary((LPCSTR)path.c_str()); if (!dir.empty()) { SetDllDirectoryW(nullptr); } #else _dll = dlopen(path.c_str(), RTLD_NOW); #endif if (_dll != nullptr) { _loaded = path; return true; } return false; } void close() { #ifdef _WIN32 FreeLibrary((HMODULE)_dll); #else dlclose(_dll); #endif _dll = nullptr; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/exception.hh0000644000175000017500000000343513757304533020267 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { class Exception : public std::exception { protected: std::string _msg; public: Exception(std::string msg) : _msg(std::move(msg)) {} ~Exception() throw() override {} const char* what() const throw() override = 0; const std::string& msg() const { return _msg; } }; class ParseException : public Exception { public: ParseException(const std::string& msg) : Exception(msg) {} ~ParseException() throw() override {} const char* what() const throw() override { return ""; } }; class InternalError : public Exception { public: InternalError(const std::string& msg) : Exception(msg) {} ~InternalError() throw() override {} const char* what() const throw() override { return "MiniZinc: internal error"; } }; class Error : public Exception { public: Error(const std::string& msg) : Exception(msg) {} ~Error() throw() override {} const char* what() const throw() override { return ""; } }; class Timeout : public Exception { public: Timeout() : Exception("time limit reached") {} ~Timeout() throw() override {} const char* what() const throw() override { return "MiniZinc: time out"; } }; class ArithmeticError : public Exception { public: ArithmeticError(const std::string& msg) : Exception(msg) {} ~ArithmeticError() throw() override {} const char* what() const throw() override { return "MiniZinc: arithmetic error"; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/interrupt.hh0000644000175000017500000000537113757304533020326 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jason Nguyen */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #ifdef _WIN32 #define NOMINMAX // Ensure the words min/max remain available #include #undef ERROR #include #include namespace MiniZinc { // Listens for a message on the named pipe \\.\pipe\minizinc-PID // Triggers a Ctrl+C when an empty message is received. class InterruptListener { public: static InterruptListener& run() { static InterruptListener instance; return instance; } InterruptListener(InterruptListener const&) = delete; void operator=(InterruptListener const&) = delete; ~InterruptListener() { SetConsoleCtrlHandler(CtrlHandler, FALSE); SetEvent(hEvents[0]); thread.join(); CloseHandle(hNamedPipe); CloseHandle(hEvents[0]); CloseHandle(hEvents[1]); } private: std::thread thread; HANDLE hNamedPipe; InterruptListener() { // Setup events hEvents[0] = CreateEvent(NULL, FALSE, FALSE, NULL); // Signalled when thread needs to exit hEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL); // Signalled on pipe events // Setup a named pipe so that the IDE can trigger an interrupt std::stringstream ss; ss << "\\\\.\\pipe\\minizinc-" << GetCurrentProcessId(); std::string pipeName = ss.str(); hNamedPipe = CreateNamedPipe(pipeName.c_str(), PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE, 1, 0, 0, 0, NULL); if (hEvents[0] && hEvents[1] && hNamedPipe) { SetConsoleCtrlHandler(CtrlHandler, TRUE); thread = std::thread(&InterruptListener::listen, this); } } void listen() { OVERLAPPED ol; // Connect pipe ZeroMemory(&ol, sizeof(OVERLAPPED)); ol.hEvent = hEvents[1]; ConnectNamedPipe(hNamedPipe, &ol); DWORD ev = WaitForMultipleObjects(2, &hEvents[0], FALSE, INFINITE); if (ev - WAIT_OBJECT_0 == 0) { return; } // Listen for pings on pipe while (true) { ZeroMemory(&ol, sizeof(OVERLAPPED)); ol.hEvent = hEvents[1]; ReadFile(hNamedPipe, NULL, 0, NULL, &ol); DWORD ev = WaitForMultipleObjects(2, &hEvents[0], FALSE, INFINITE); if (ev - WAIT_OBJECT_0 == 0) { return; } GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); } } static HANDLE hEvents[2]; static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { // Tell thread to stop SetEvent(hEvents[0]); return FALSE; } }; HANDLE InterruptListener::hEvents[2]; } // namespace MiniZinc #endif libminizinc-2.5.3/include/minizinc/ast.hh0000644000175000017500000017445713757304533017075 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace MiniZinc { class IntLit; class FloatLit; class SetLit; class BoolLit; class StringLit; class Id; class AnonVar; class ArrayLit; class ArrayAccess; class Comprehension; class ITE; class BinOp; class UnOp; class Call; class VarDecl; class Let; class TypeInst; class Item; class FunctionI; class ExpressionSet; class ExpressionSetIter; /// %Location of an expression used during parsing class ParserLocation { protected: /// Source code file name ASTString _filename; /// Line where expression starts unsigned int _firstLine; /// Line where expression ends unsigned int _lastLine; /// Column where expression starts unsigned int _firstColumn; /// Column where expression ends unsigned int _lastColumn; public: /// Construct empty location ParserLocation() : _firstLine(1), _lastLine(1), _firstColumn(0), _lastColumn(0) {} /// Construct location ParserLocation(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column) : _filename(filename), _firstLine(first_line), _lastLine(last_line), _firstColumn(first_column), _lastColumn(last_column) {} ASTString filename() const { return _filename; } void filename(const ASTString& f) { _filename = f; } unsigned int firstLine() const { return _firstLine; } void firstLine(unsigned int l) { _firstLine = l; } unsigned int lastLine() const { return _lastLine; } void lastLine(unsigned int l) { _lastLine = l; } unsigned int firstColumn() const { return _firstColumn; } void firstColumn(unsigned int c) { _firstColumn = c; } unsigned int lastColumn() const { return _lastColumn; } void lastColumn(unsigned int c) { _lastColumn = c; } std::string toString() const { std::ostringstream oss; oss << _filename << ":" << _firstLine << "." << _firstColumn; if (_firstLine != _lastLine) { oss << "-" << _lastLine << "." << _lastColumn; } else if (_firstColumn != _lastColumn) { oss << "-" << _lastColumn; } return oss.str(); } }; /// %Location of an expression in the source code class Location { protected: /// Internal representation of a Location /// Layout depends on sizeof pointer and arguments /// 32 bit pointers: /// Layout 1: filename (32 bit), first line (8 bit), last line-first line (7 bit), first column /// (6 bit), last column (7 bit) Layout 2: filename (32 bit), 4 IntLit for the lines/columns /// 64 bit pointers: /// Layout 1: filename (64 bit), first line (20 bit), last line-first line (20 bit), first /// column (10 bit), last column (10 bit) Layout 2: filename (64 bit), 4 IntLit for the /// lines/columns class LocVec : public ASTVec { protected: LocVec(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column); LocVec(const ASTString& filename, IntVal combined); public: static LocVec* a(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column); void mark() { _gcMark = 1; if (_data[0] != nullptr) { static_cast(_data[0])->mark(); } } ASTString filename() const; unsigned int firstLine() const; unsigned int lastLine() const; unsigned int firstColumn() const; unsigned int lastColumn() const; }; union LI { LocVec* lv; ptrdiff_t t; } _locInfo; LocVec* lv() const { LI li = _locInfo; li.t &= ~static_cast(1); return li.lv; } public: /// Construct empty location Location() { _locInfo.lv = nullptr; } /// Construct location Location(const ASTString& filename, unsigned int first_line, unsigned int first_column, unsigned int last_line, unsigned int last_column) { if (last_line < first_line) { throw InternalError("invalid location"); } _locInfo.lv = LocVec::a(filename, first_line, first_column, last_line, last_column); } Location(const ParserLocation& loc) { _locInfo.lv = LocVec::a(loc.filename(), loc.firstLine(), loc.firstColumn(), loc.lastLine(), loc.lastColumn()); } /// Return string representation std::string toString() const; /// Return filename ASTString filename() const { return lv() != nullptr ? lv()->filename() : ASTString(); } /// Return first line number unsigned int firstLine() const { return lv() != nullptr ? lv()->firstLine() : 0; } /// Return last line number unsigned int lastLine() const { return lv() != nullptr ? lv()->lastLine() : 0; } /// Return first column number unsigned int firstColumn() const { return lv() != nullptr ? lv()->firstColumn() : 0; } /// Return last column number unsigned int lastColumn() const { return lv() != nullptr ? lv()->lastColumn() : 0; } /// Return whether location is introduced by the compiler bool isIntroduced() const { return _locInfo.lv == nullptr || ((_locInfo.t & 1) != 0); } /// Mark as alive for garbage collection void mark() const; /// Return location with introduced flag set Location introduce() const; /// Location used for un-allocated expressions static Location nonalloc; /// Return true if this is a location for an unallocated expression bool isNonAlloc() const { return this == &Location::nonalloc; } ParserLocation parserLocation() const { return ParserLocation(filename(), firstLine(), firstColumn(), lastLine(), lastColumn()); } }; /// Output operator for locations template std::basic_ostream& operator<<(std::basic_ostream& os, const Location& loc) { std::basic_ostringstream s; s.copyfmt(os); s.width(0); if (loc.filename() == "") { s << "unknown file"; } else { s << loc.filename(); } s << ":" << loc.firstLine() << "." << loc.firstColumn(); if (loc.firstLine() != loc.lastLine()) { s << "-" << loc.lastLine() << "." << loc.lastColumn(); } else if (loc.firstColumn() != loc.lastColumn()) { s << "-" << loc.lastColumn(); } return os << s.str(); } /** * \brief Annotations */ class Annotation { private: ExpressionSet* _s; /// Delete Annotation(const Annotation&); /// Delete Annotation& operator=(const Annotation&); public: Annotation() : _s(nullptr) {} ~Annotation(); bool contains(Expression* e) const; bool containsCall(const ASTString& id) const; bool isEmpty() const; ExpressionSetIter begin() const; ExpressionSetIter end() const; void add(Expression* e); void add(std::vector e); void remove(Expression* e); void removeCall(const ASTString& id); void clear(); void merge(const Annotation& ann); Call* getCall(const ASTString& id) const; static Annotation empty; }; /// returns the Annotation specified by the string; returns NULL if not exists Expression* get_annotation(const Annotation& ann, const std::string& str); /// returns the Annotation specified by the string; returns NULL if not exists Expression* get_annotation(const Annotation& ann, const ASTString& str); /** * \brief Base class for expressions */ class Expression : public ASTNode { protected: /// The %MiniZinc type of the expression Type _type; /// The annotations Annotation _ann; /// The location of the expression Location _loc; /// The hash value of the expression size_t _hash; public: /// Identifier of the concrete expression type enum ExpressionId { E_INTLIT = ASTNode::NID_END + 1, E_FLOATLIT, E_SETLIT, E_BOOLLIT, E_STRINGLIT, E_ID, E_ANON, E_ARRAYLIT, E_ARRAYACCESS, E_COMP, E_ITE, E_BINOP, E_UNOP, E_CALL, E_VARDECL, E_LET, E_TI, E_TIID, EID_END = E_TIID }; bool isUnboxedVal() const { if (sizeof(double) <= sizeof(void*)) { // bit 1 or bit 0 is set return (reinterpret_cast(this) & static_cast(3)) != 0; } // bit 0 is set return (reinterpret_cast(this) & static_cast(1)) != 0; } bool isUnboxedInt() const { if (sizeof(double) <= sizeof(void*)) { // bit 1 is set, bit 0 is not set return (reinterpret_cast(this) & static_cast(3)) == 2; } // bit 0 is set return (reinterpret_cast(this) & static_cast(1)) == 1; } bool isUnboxedFloatVal() const { // bit 0 is set (and doubles fit inside pointers) return (sizeof(double) <= sizeof(void*)) && (reinterpret_cast(this) & static_cast(1)) == 1; } ExpressionId eid() const { return isUnboxedInt() ? E_INTLIT : isUnboxedFloatVal() ? E_FLOATLIT : static_cast(_id); } const Location& loc() const { return isUnboxedVal() ? Location::nonalloc : _loc; } void loc(const Location& l) { if (!isUnboxedVal()) { _loc = l; } } const Type& type() const { return isUnboxedInt() ? Type::unboxedint : isUnboxedFloatVal() ? Type::unboxedfloat : _type; } void type(const Type& t); size_t hash() const { return isUnboxedInt() ? unboxedIntToIntVal().hash() : isUnboxedFloatVal() ? unboxedFloatToFloatVal().hash() : _hash; } protected: /// Combination function for hash values void combineHash(size_t h) { _hash ^= h + 0x9e3779b9 + (_hash << 6) + (_hash >> 2); } /// Combination function for hash values static size_t combineHash(size_t seed, size_t h) { seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2); return seed; } /// Compute base hash value void initHash() { _hash = combineHash(0, _id); } /// Check if \a e0 and \a e1 are equal static bool equalInternal(const Expression* e0, const Expression* e1); /// Constructor Expression(const Location& loc, const ExpressionId& eid, const Type& t) : ASTNode(eid), _type(t), _loc(loc) {} public: IntVal unboxedIntToIntVal() const { assert(isUnboxedInt()); if (sizeof(double) <= sizeof(void*)) { unsigned long long int i = reinterpret_cast(this) & ~static_cast(7); bool pos = ((reinterpret_cast(this) & static_cast(4)) == 0); if (pos) { return static_cast(i >> 3); } return -(static_cast(i >> 3)); } unsigned long long int i = reinterpret_cast(this) & ~static_cast(3); bool pos = ((reinterpret_cast(this) & static_cast(2)) == 0); if (pos) { return static_cast(i >> 2); } return -(static_cast(i >> 2)); } static IntLit* intToUnboxedInt(long long int i) { static const unsigned int pointerBits = sizeof(void*) * 8; if (sizeof(double) <= sizeof(void*)) { static const long long int maxUnboxedVal = (static_cast(1) << (pointerBits - 3)) - static_cast(1); if (i < -maxUnboxedVal || i > maxUnboxedVal) { return nullptr; } long long int j = i < 0 ? -i : i; ptrdiff_t ubi_p = (static_cast(j) << 3) | static_cast(2); if (i < 0) { ubi_p = ubi_p | static_cast(4); } return reinterpret_cast(ubi_p); } static const long long int maxUnboxedVal = (static_cast(1) << (pointerBits - 2)) - static_cast(1); if (i < -maxUnboxedVal || i > maxUnboxedVal) { return nullptr; } long long int j = i < 0 ? -i : i; ptrdiff_t ubi_p = (static_cast(j) << 2) | static_cast(1); if (i < 0) { ubi_p = ubi_p | static_cast(2); } return reinterpret_cast(ubi_p); } FloatVal unboxedFloatToFloatVal() const { assert(isUnboxedFloatVal()); union { double d; uint64_t bits; const Expression* p; } _u; _u.p = this; _u.bits = _u.bits >> 1; uint64_t exponent = (_u.bits & (static_cast(0x3FF) << 52)) >> 52; if (exponent != 0) { exponent += 512; // reconstruct original bias of 1023 } uint64_t sign = ((_u.bits & (static_cast(1) << 62)) != 0U ? 1 : 0); _u.bits = (sign << 63) | (exponent << 52) | (_u.bits & static_cast(0xFFFFFFFFFFFFF)); return _u.d; } static FloatLit* doubleToUnboxedFloatVal(double d) { if (sizeof(double) > sizeof(void*)) { return nullptr; } union { double d; uint64_t bits; FloatLit* p; } _u; _u.d = d; uint64_t exponent = (_u.bits & (static_cast(0x7FF) << 52)) >> 52; if (exponent != 0) { if (exponent < 513 || exponent > 1534) { return nullptr; // exponent doesn't fit in 10 bits } exponent -= 512; // make exponent fit in 10 bits, with bias 511 } bool sign = (_u.bits & (static_cast(1) << 63)) != 0; _u.bits = _u.bits & ~(static_cast(0x7FF) << 52); // mask out top 11 bits (previously exponent) _u.bits = (_u.bits << 1) | 1U; // shift by one bit and add tag for double _u.bits = _u.bits | (static_cast(sign) << 63) | (static_cast(exponent) << 53); return _u.p; } bool isTagged() const { // only bit 2 is set if (isUnboxedVal()) { return false; } if (sizeof(double) <= sizeof(void*)) { return (reinterpret_cast(this) & static_cast(7)) == 4; } return (reinterpret_cast(this) & static_cast(3)) == 2; } Expression* tag() const { assert(!isUnboxedVal()); if (sizeof(double) <= sizeof(void*)) { return reinterpret_cast(reinterpret_cast(this) | static_cast(4)); } return reinterpret_cast(reinterpret_cast(this) | static_cast(2)); } Expression* untag() { if (isUnboxedVal()) { return this; } if (sizeof(double) <= sizeof(void*)) { return reinterpret_cast(reinterpret_cast(this) & ~static_cast(4)); } return reinterpret_cast(reinterpret_cast(this) & ~static_cast(2)); } /// Test if expression is of type \a T template bool isa() const { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-undefined-compare" #endif if (nullptr == this) { throw InternalError("isa: nullptr"); } #ifdef __clang__ #pragma clang diagnostic pop #endif return isUnboxedInt() ? T::eid == E_INTLIT : isUnboxedFloatVal() ? T::eid == E_FLOATLIT : _id == T::eid; } /// Cast expression to type \a T* template T* cast() { assert(isa()); return static_cast(this); } /// Cast expression to type \a const T* template const T* cast() const { assert(isa()); return static_cast(this); } /// Cast expression to type \a T* or NULL if types do not match template T* dynamicCast() { return isa() ? static_cast(this) : nullptr; } /// Cast expression to type \a const T* or NULL if types do not match template const T* dynamicCast() const { return isa() ? static_cast(this) : nullptr; } /// Cast expression to type \a T* template static T* cast(Expression* e) { return e == nullptr ? nullptr : e->cast(); } /// Cast expression to type \a const T* template static const T* cast(const Expression* e) { return e == nullptr ? NULL : e->cast(); } /// Cast expression to type \a T* or NULL if types do not match template static T* dynamicCast(Expression* e) { return e == nullptr ? nullptr : e->dynamicCast(); } /// Cast expression to type \a const T* or NULL if types do not match template static const T* dynamicCast(const Expression* e) { return e == nullptr ? NULL : e->dynamicCast(); } /// Add annotation \a ann to the expression void addAnnotation(Expression* ann); /// Add annotation \a ann to the expression void addAnnotations(const std::vector& ann); const Annotation& ann() const { return isUnboxedVal() ? Annotation::empty : _ann; } Annotation& ann() { return isUnboxedVal() ? Annotation::empty : _ann; } /// Return hash value of \a e static size_t hash(const Expression* e) { return e == nullptr ? 0 : e->hash(); } /// Check if \a e0 and \a e1 are equal static bool equal(const Expression* e0, const Expression* e1); /// Mark \a e as alive for garbage collection static void mark(Expression* e); }; /// \brief Integer literal expression class IntLit : public Expression { protected: /// The value of this expression IntVal _v; /// Constructor IntLit(const Location& loc, IntVal v); public: /// The identifier of this expression type static const ExpressionId eid = E_INTLIT; /// Access value IntVal v() const { return isUnboxedInt() ? unboxedIntToIntVal() : _v; } /// Recompute hash value void rehash(); /// Allocate literal static IntLit* a(IntVal v); /// Allocate literal for enumerated type (only used internally for generators) static IntLit* aEnum(IntVal v, unsigned int enumId); }; /// \brief Float literal expression class FloatLit : public Expression { protected: /// The value of this expression FloatVal _v; /// Constructor FloatLit(const Location& loc, FloatVal v); public: /// The identifier of this expression type static const ExpressionId eid = E_FLOATLIT; /// Access value FloatVal v() const { return isUnboxedFloatVal() ? unboxedFloatToFloatVal() : _v; } /// Recompute hash value void rehash(); /// Allocate literal static FloatLit* a(FloatVal v); }; /// \brief Set literal expression class SetLit : public Expression { protected: /// The value of this expression ASTExprVec _v; union { /// A range-list based representation for an integer set, or NULL IntSetVal* isv; /// A range-list based representation for an float set, or NULL FloatSetVal* fsv; } _u; public: /// The identifier of this expression type static const ExpressionId eid = E_SETLIT; /// Construct set \$f\{v1,\dots,vn\}\$f SetLit(const Location& loc, const std::vector& v); /// Construct set \$f\{v1,\dots,vn\}\$f SetLit(const Location& loc, const ASTExprVec& v); /// Construct set SetLit(const Location& loc, IntSetVal* isv); /// Construct set SetLit(const Location& loc, FloatSetVal* fsv); /// Access value ASTExprVec v() const { return _v; } /// Set value void v(const ASTExprVec& val) { _v = val; } /// Access integer set value if present IntSetVal* isv() const { return (type().bt() == Type::BT_INT || type().bt() == Type::BT_BOOL) ? _u.isv : nullptr; } /// Set integer set value void isv(IntSetVal* val) { _u.isv = val; } /// Access float set value if present FloatSetVal* fsv() const { return type().bt() == Type::BT_FLOAT ? _u.fsv : nullptr; } /// Set integer set value void fsv(FloatSetVal* val) { _u.fsv = val; } /// Recompute hash value void rehash(); }; /// \brief Boolean literal expression class BoolLit : public Expression { protected: /// The value of this expression bool _v; public: /// The identifier of this expression type static const ExpressionId eid = E_BOOLLIT; /// Constructor BoolLit(const Location& loc, bool v); /// Access value bool v() const { return _v; } /// Recompute hash value void rehash(); }; /// \brief String literal expression class StringLit : public Expression { protected: /// The value of this expression ASTString _v; public: /// The identifier of this expression type static const ExpressionId eid = E_STRINGLIT; /// Constructor StringLit(const Location& loc, const std::string& v); /// Constructor StringLit(const Location& loc, const ASTString& v); /// Access value ASTString v() const { return _v; } /// Set value void v(const ASTString& val) { _v = val; } /// Recompute hash value void rehash(); }; /// \brief Identifier expression class Id : public Expression { protected: /// The string identifier union { /// Identifier of called predicate or function ASTString val; /// The predicate or function declaration (or NULL) void* idn; } _vOrIdn = {nullptr}; /// The declaration corresponding to this identifier (may be NULL) Expression* _decl; public: /// The identifier of this expression type static const ExpressionId eid = E_ID; /// Constructor (\a decl may be NULL) Id(const Location& loc, const std::string& v, VarDecl* decl); /// Constructor (\a decl may be NULL) Id(const Location& loc, const ASTString& v, VarDecl* decl); /// Constructor (\a decl may be NULL) Id(const Location& loc, long long int idn, VarDecl* decl); /// Access identifier ASTString v() const; inline bool hasStr() const { return (reinterpret_cast(_vOrIdn.idn) & static_cast(1)) == 0; } /// Set identifier void v(const ASTString& val) { _vOrIdn.val = val; } /// Access identifier number long long int idn() const; /// Set identifier number void idn(long long int n) { _vOrIdn.idn = reinterpret_cast((static_cast(n) << 1) | static_cast(1)); rehash(); } /// Return identifier or X_INTRODUCED plus identifier number ASTString str() const; /// Access declaration VarDecl* decl() const { Expression* d = _decl; while ((d != nullptr) && d->isa()) { d = d->cast()->_decl; } return Expression::cast(d); } /// Set declaration void decl(VarDecl* d); /// Redirect to another Id \a id void redirect(Id* id) { assert(_decl == nullptr || _decl->isa()); _decl = id; } /// Recompute hash value void rehash(); /// Levenshtein distance to \a other identifier int levenshteinDistance(Id* other) const; }; /// \brief Type-inst identifier expression class TIId : public Expression { protected: /// The string identifier ASTString _v; public: /// The identifier of this expression type static const ExpressionId eid = E_TIID; /// Constructor TIId(const Location& loc, const std::string& v); /// Constructor TIId(const Location& loc, const ASTString& v); /// Access identifier ASTString v() const { return _v; } /// Set identifier void v(const ASTString& val) { _v = val; } /// Check whether it is an enum identifier (starting with two $ signs) bool isEnum() const { return _v.c_str()[0] == '$'; } /// Recompute hash value void rehash(); }; /// \brief Anonymous variable expression class AnonVar : public Expression { public: /// The identifier of this expression type static const ExpressionId eid = E_ANON; /// Constructor AnonVar(const Location& loc); /// Recompute hash value void rehash(); }; /// \brief Array literal expression class ArrayLit : public Expression { friend class Expression; protected: /// The array union { /// An expression vector (if _flag2==false) ASTExprVecO* v; /// Another array literal (if _flag2==true) ArrayLit* al; } _u; /// The declared array dimensions // If _flag2 is true, then this is an array view. In that case, // the _dims array holds the sliced dimensions ASTIntVec _dims; /// Set compressed vector (initial repetitions are removed) void compress(const std::vector& v, const std::vector& dims); public: /// Index conversion from slice to original unsigned int origIdx(unsigned int i) const; /// Get element \a i of a sliced array Expression* getSlice(unsigned int i) const; /// Set element \a i of a sliced array void setSlice(unsigned int i, Expression* e); /// The identifier of this expression type static const ExpressionId eid = E_ARRAYLIT; /// Constructor ArrayLit(const Location& loc, const std::vector& v, const std::vector >& dims); /// Constructor (existing content) ArrayLit(const Location& loc, ArrayLit& v, const std::vector >& dims); /// Constructor (one-dimensional, existing content) ArrayLit(const Location& loc, ArrayLit& v); /// Constructor (one-dimensional) ArrayLit(const Location& loc, const std::vector& v); /// Constructor (two-dimensional) ArrayLit(const Location& loc, const std::vector >& v); /// Constructor for slices ArrayLit(const Location& loc, ArrayLit* v, const std::vector >& dims, const std::vector >& slice); /// Constructor (one-dimensional) ArrayLit(const Location& loc, const std::vector& v); /// Recompute hash value void rehash(); // The following methods are only used for copying /// Access value ASTExprVec getVec() const { assert(!_flag2); return _u.v; } /// Set value void setVec(const ASTExprVec& val) { assert(!_flag2); _u.v = val.vec(); } /// Get underlying array (if this is an array slice) or NULL ArrayLit* getSliceLiteral() const { return _flag2 ? _u.al : nullptr; } /// Get underlying _dims vector ASTIntVec dimsInternal() const { return _dims; } /// Return number of dimensions unsigned int dims() const; /// Return minimum index of dimension \a i int min(unsigned int i) const; /// Return maximum index of dimension \a i int max(unsigned int i) const; /// Return the length of the array unsigned int length() const; /// Turn into 1d array (only used at the end of flattening) void make1d(); /// Check if this array was produced by flattening bool flat() const { return _flag1; } /// Set whether this array was produced by flattening void flat(bool b) { _flag1 = b; } /// Return size of underlying array unsigned int size() const { return (_flag2 || _u.v->flag()) ? length() : _u.v->size(); } /// Access element \a i Expression* operator[](unsigned int i) const { return (_flag2 || _u.v->flag()) ? getSlice(i) : (*_u.v)[i]; } /// Set element \a i void set(unsigned int i, Expression* e) { if (_flag2 || _u.v->flag()) { setSlice(i, e); } else { (*_u.v)[i] = e; } } }; /// \brief Array access expression class ArrayAccess : public Expression { protected: /// The array to access Expression* _v; /// The indexes (for all array dimensions) ASTExprVec _idx; public: /// The identifier of this expression type static const ExpressionId eid = E_ARRAYACCESS; /// Constructor ArrayAccess(const Location& loc, Expression* v, const std::vector& idx); /// Constructor ArrayAccess(const Location& loc, Expression* v, const ASTExprVec& idx); /// Access value Expression* v() const { return _v; } /// Set value void v(Expression* val) { _v = val; } /// Access index sets ASTExprVec idx() const { return _idx; } /// Set index sets void idx(const ASTExprVec& idx) { _idx = idx; } /// Recompute hash value void rehash(); }; /** * \brief Generators for comprehensions * * A generator consists of a list of variable declarations, one for * each generated variable, and the expression to generate. E.g., * the Zinc expression [ x[i,j,k] | i,j in 1..10, k in 1..5] contains * two generators. The first one has variable declarations for i and j * and the expression 1..10, and the second one has a variable declaration * for k and the expression 1..5. * */ class Generator { friend class Comprehension; protected: /// Variable declarations std::vector _v; /// in-expression Expression* _in; /// where-expression Expression* _where; public: /// Allocate Generator(const std::vector& v, Expression* in, Expression* where); /// Allocate Generator(const std::vector& v, Expression* in, Expression* where); /// Allocate Generator(const std::vector& v, Expression* in, Expression* where); /// Allocate Generator(const std::vector& v, Expression* in, Expression* where); /// Allocate single where clause (without generator) at position \a pos Generator(int pos, Expression* where); }; /// \brief A list of generators with one where-expression struct Generators { /// %Generators std::vector g; /// Constructor Generators() {} }; /// \brief An expression representing an array- or set-comprehension class Comprehension : public Expression { friend class Expression; protected: /// The expression to generate Expression* _e; /// A list of generator expressions ASTExprVec _g; /// A list of indices where generators start ASTIntVec _gIndex; public: /// The identifier of this expression type static const ExpressionId eid = E_COMP; /// Constructor Comprehension(const Location& loc, Expression* e, Generators& g, bool set); /// Recompute hash value void rehash(); /// Whether comprehension is a set bool set() const; /// Return number of generators unsigned int numberOfGenerators() const; /// Return "in" expression for generator \a i Expression* in(unsigned int i); /// Return "in" expression for generator \a i const Expression* in(unsigned int i) const; /// Return number of declarations for generator \a i unsigned int numberOfDecls(unsigned int i) const; /// Return declaration \a i for generator \a gen VarDecl* decl(unsigned int gen, unsigned int i); /// Return declaration \a i for generator \a gen const VarDecl* decl(unsigned int gen, unsigned int i) const; /// Return where clause for generator \a i Expression* where(unsigned int i); /// Return where clause for generator \a i const Expression* where(unsigned int i) const; /// Return generator body Expression* e() const { return _e; } /// Set generator body void e(Expression* e0) { _e = e0; } /// Re-construct (used for copying) void init(Expression* e, Generators& g); /// Check if \a e contains one of the variables bound by this comprehension bool containsBoundVariable(Expression* e); }; /// \brief If-then-else expression class ITE : public Expression { friend class Expression; protected: /// List of if-then-pairs ASTExprVec _eIfThen; /// Else-expression Expression* _eElse; public: /// The identifier of this expression type static const ExpressionId eid = E_ITE; /// Constructor ITE(const Location& loc, const std::vector& e_if_then, Expression* e_else); unsigned int size() const { return static_cast(_eIfThen.size() / 2); } Expression* ifExpr(unsigned int i) { return _eIfThen[2 * i]; } Expression* thenExpr(unsigned int i) { return _eIfThen[2 * i + 1]; } Expression* elseExpr() { return _eElse; } const Expression* ifExpr(unsigned int i) const { return _eIfThen[2 * i]; } const Expression* thenExpr(unsigned int i) const { return _eIfThen[2 * i + 1]; } const Expression* elseExpr() const { return _eElse; } void thenExpr(unsigned int i, Expression* e) { _eIfThen[2 * i + 1] = e; } void elseExpr(Expression* e) { _eElse = e; } /// Recompute hash value void rehash(); /// Re-construct (used for copying) void init(const std::vector& e_if_then, Expression* e_else); }; /// Type of binary operators enum BinOpType { BOT_PLUS, BOT_MINUS, BOT_MULT, BOT_DIV, BOT_IDIV, BOT_MOD, BOT_POW, BOT_LE, BOT_LQ, BOT_GR, BOT_GQ, BOT_EQ, BOT_NQ, BOT_IN, BOT_SUBSET, BOT_SUPERSET, BOT_UNION, BOT_DIFF, BOT_SYMDIFF, BOT_INTERSECT, BOT_PLUSPLUS, BOT_EQUIV, BOT_IMPL, BOT_RIMPL, BOT_OR, BOT_AND, BOT_XOR, BOT_DOTDOT }; /// \brief Binary-operator expression class BinOp : public Expression { protected: /// Left hand side expression Expression* _e0; /// Right hand side expression Expression* _e1; /// The predicate or function declaration (or NULL) FunctionI* _decl; public: /// The identifier of this expression type static const ExpressionId eid = E_BINOP; /// Constructor BinOp(const Location& loc, Expression* e0, BinOpType op, Expression* e1); /// Access left hand side Expression* lhs() const { return _e0; } /// Set left hand side void lhs(Expression* e) { _e0 = e; } /// Access right hand side Expression* rhs() const { return _e1; } /// Set right hand side void rhs(Expression* e) { _e1 = e; } /// Access argument \a i Expression* arg(int i) { assert(i == 0 || i == 1); return i == 0 ? _e0 : _e1; } /// Return number of arguments static unsigned int argCount() { return 2; } /// Access declaration FunctionI* decl() const { return _decl; } /// Set declaration void decl(FunctionI* f) { _decl = f; } /// Return string representation of the operator ASTString opToString() const; /// Recompute hash value void rehash(); /// Return operator type BinOpType op() const; /// Morph into a call Call* morph(const ASTString& ident, const std::vector& args); }; /// Type of unary operators enum UnOpType { UOT_NOT, UOT_PLUS, UOT_MINUS }; /// \brief Unary-operator expressions class UnOp : public Expression { protected: /// %Expression Expression* _e0; /// The predicate or function declaration (or NULL) FunctionI* _decl; public: /// The identifier of this expression type static const ExpressionId eid = E_UNOP; /// Constructor UnOp(const Location& loc, UnOpType op, Expression* e); /// Access expression Expression* e() const { return _e0; } /// Set expression void e(Expression* e0) { _e0 = e0; } /// Access argument \a i Expression* arg(int i) { assert(i == 0); return _e0; } /// Return number of arguments static unsigned int argCount() { return 1; } /// Access declaration FunctionI* decl() const { return _decl; } /// Set declaration void decl(FunctionI* f) { _decl = f; } ASTString opToString() const; /// Recompute hash value void rehash(); /// Return operator type UnOpType op() const; }; /// \brief A predicate or function call expression class Call : public Expression { friend class Expression; protected: union { /// Identifier of called predicate or function ASTString id; /// The predicate or function declaration (or NULL) FunctionI* decl; } _uId = {nullptr}; union { /// Single-argument call (tagged pointer) Expression* oneArg; /// Arguments to the call ASTExprVecO* args; } _u; /// Check if _uId contains an id or a decl bool hasId() const; public: /// The identifier of this expression type static const ExpressionId eid = E_CALL; /// Constructor Call(const Location& loc, const std::string& id, const std::vector& args); /// Constructor Call(const Location& loc, const ASTString& id, const std::vector& args); /// Access identifier ASTString id() const; /// Set identifier (overwrites decl) void id(const ASTString& i); /// Number of arguments unsigned int argCount() const { return _u.oneArg->isUnboxedVal() || _u.oneArg->isTagged() ? 1 : _u.args->size(); } /// Access argument \a i Expression* arg(unsigned int i) const { assert(i < argCount()); if (_u.oneArg->isUnboxedVal() || _u.oneArg->isTagged()) { assert(i == 0U); return _u.oneArg->isUnboxedVal() ? _u.oneArg : _u.oneArg->untag(); } return (*_u.args)[i]; } /// Set argument \a i void arg(unsigned int i, Expression* e) { assert(i < argCount()); if (_u.oneArg->isUnboxedVal() || _u.oneArg->isTagged()) { assert(i == 0U); _u.oneArg = e->isUnboxedVal() ? e : e->tag(); } else { (*_u.args)[i] = e; } } /// Set arguments void args(const ASTExprVec& a) { if (a.size() == 1) { _u.oneArg = a[0]->isUnboxedVal() ? a[0] : a[0]->tag(); } else { _u.args = a.vec(); assert(!_u.oneArg->isTagged()); } } /// Access declaration FunctionI* decl() const; /// Set declaration (overwrites id) void decl(FunctionI* f); /// Recompute hash value void rehash(); }; /// \brief A variable declaration expression class VarDecl : public Expression { protected: /// Type-inst of the declared variable TypeInst* _ti; /// Identifier Id* _id; /// Initialisation expression (can be NULL) Expression* _e; /// Flattened version of the VarDecl WeakRef _flat; /// Integer payload int _payload; public: /// The identifier of this expression type static const ExpressionId eid = E_VARDECL; /// Constructor VarDecl(const Location& loc, TypeInst* ti, const std::string& id, Expression* e = nullptr); /// Constructor VarDecl(const Location& loc, TypeInst* ti, const ASTString& id, Expression* e = nullptr); /// Constructor VarDecl(const Location& loc, TypeInst* ti, long long int idn, Expression* e = nullptr); /// Constructor VarDecl(const Location& loc, TypeInst* ti, Id* id, Expression* e = nullptr); /// Access TypeInst TypeInst* ti() const { return _ti; } /// Set TypeInst void ti(TypeInst* t) { _ti = t; } /// Access identifier Id* id() const { return _id; } /// Access initialisation expression Expression* e() const; /// Set initialisation expression void e(Expression* rhs); /// Access flattened version VarDecl* flat() { return _flat() != nullptr ? _flat()->cast() : nullptr; } /// Set flattened version void flat(VarDecl* vd); /// Recompute hash value void rehash(); /// Whether variable is toplevel bool toplevel() const; /// Whether variable is toplevel void toplevel(bool t); /// Whether variable is introduced bool introduced() const; /// Whether variable is introduced void introduced(bool t); /// Whether variable has been evaluated bool evaluated() const; /// Whether variable has been evaluated void evaluated(bool t); /// Access payload int payload() const { return _payload; } /// Set payload void payload(int i) { _payload = i; } /// Put current value on trail void trail(); }; class EnvI; class CopyMap; /// \brief %Let expression class Let : public Expression { friend Expression* copy(EnvI& env, CopyMap& m, Expression* e, bool followIds, bool copyFundecls, bool isFlatModel); friend class Expression; protected: /// List of local declarations ASTExprVec _let; /// Copy of original local declarations ASTExprVec _letOrig; /// Body of the let Expression* _in; public: /// The identifier of this expression type static const ExpressionId eid = E_LET; /// Constructor Let(const Location& loc, const std::vector& let, Expression* in); /// Recompute hash value void rehash(); /// Access local declarations ASTExprVec let() const { return _let; } /// Access local declarations ASTExprVec letOrig() const { return _letOrig; } /// Access body Expression* in() const { return _in; } /// Remember current let bindings void pushbindings(); /// Restore previous let bindings void popbindings(); }; /// \brief Type-inst expression class TypeInst : public Expression { protected: /// Ranges of an array expression ASTExprVec _ranges; /// Declared domain (or NULL) Expression* _domain; public: /// The identifier of this expression type static const ExpressionId eid = E_TI; /// Constructor TypeInst(const Location& loc, const Type& t, const ASTExprVec& ranges, Expression* domain = nullptr); /// Constructor TypeInst(const Location& loc, const Type& t, Expression* domain = nullptr); /// Access ranges ASTExprVec ranges() const { return _ranges; } /// Access domain Expression* domain() const { return _domain; } //// Set domain void domain(Expression* d) { _domain = d; } /// Set ranges to \a ranges void setRanges(const std::vector& ranges); bool isarray() const { return _ranges.size() > 0; } bool hasTiVariable() const; /// Recompute hash value void rehash(); /// Check if domain is computed from right hand side of variable bool computedDomain() const { return _flag1; } /// Set if domain is computed from right hand side of variable void setComputedDomain(bool b) { _flag1 = b; } /// Check if this TypeInst represents an enum bool isEnum() const { return _flag2; } /// Set if this TypeInst represents an enum void setIsEnum(bool b) { _flag2 = b; } }; /** * \brief Base-class for items */ class Item : public ASTNode { protected: /// Location of the item Location _loc; public: /// Identifier of the concrete item type enum ItemId { II_INC = Expression::EID_END + 1, II_VD, II_ASN, II_CON, II_SOL, II_OUT, II_FUN, II_END = II_FUN }; ItemId iid() const { return static_cast(_id); } const Location& loc() const { return _loc; } protected: /// Constructor Item(const Location& loc, const ItemId& iid) : ASTNode(iid), _loc(loc) { _flag1 = false; } public: /// Test if item is of type \a T template bool isa() const { return _id == T::iid; } /// Cast item to type \a T* template T* cast() { assert(isa()); return static_cast(this); } /// Cast expression to type \a const T* template const T* cast() const { assert(isa()); return static_cast(this); } /// Cast item to type \a T* or NULL if types do not match template T* dynamicCast() { return isa() ? static_cast(this) : nullptr; } /// Cast item to type \a const T* or NULL if types do not match template const T* dynamicCast() const { return isa() ? static_cast(this) : NULL; } /// Cast item to type \a T* template static T* cast(Item* i) { return i == nullptr ? nullptr : i->cast(); } /// Cast item to type \a const T* template static const T* cast(const Item* i) { return i == nullptr ? NULL : i->cast(); } /// Cast item to type \a T* or NULL if types do not match template static T* dynamicCast(Item* i) { return i == nullptr ? nullptr : i->dynamicCast(); } /// Cast item to type \a const T* or NULL if types do not match template static const T* dynamicCast(const Item* i) { return i == nullptr ? NULL : i->dynamicCast(); } /// Check if item should be removed bool removed() const { return _flag1; } /// Set flag to remove item void remove() { _flag1 = true; } /// Unset remove item flag (only possible if not already removed by compact()) void unremove() { _flag1 = false; } /// Mark alive for garbage collection #if defined(MINIZINC_GC_STATS) static void mark(Item* item, MINIZINC_GC_STAT_ARGS); #else static void mark(Item* item); #endif bool hasMark() { return _gcMark != 0U; } }; class Model; /// \brief Include item class IncludeI : public Item { protected: /// Filename to include ASTString _f; /// Model for that file Model* _m; public: /// The identifier of this item type static const ItemId iid = II_INC; /// Constructor IncludeI(const Location& loc, const ASTString& f); /// Access filename ASTString f() const { return _f; } /// Set filename void f(const ASTString& nf) { _f = nf; } /// Access model Model* m() const { return _m; } /// Set the model void m(Model* m0, bool own = true) { assert(_m == nullptr || m0 == nullptr); _m = m0; _flag2 = own; } bool own() const { return _flag2; } }; /// \brief Variable declaration item class VarDeclI : public Item { protected: /// The declaration expression VarDecl* _e; public: /// The identifier of this item type static const ItemId iid = II_VD; /// Constructor VarDeclI(const Location& loc, VarDecl* e); /// Access expression VarDecl* e() const { return _e; } /// Set expression void e(VarDecl* vd) { _e = vd; } /// Flag used during compilation bool flag() const { return _flag2; } /// Set flag used during compilation void flag(bool b) { _flag2 = b; } }; /// \brief Assign item class AssignI : public Item { protected: /// Identifier of variable to assign to ASTString _id; /// Expression to assign to the variable Expression* _e; /// Declaration of the variable to assign to VarDecl* _decl; public: /// The identifier of this item type static const ItemId iid = II_ASN; /// Constructor AssignI(const Location& loc, const std::string& id, Expression* e); /// Constructor AssignI(const Location& loc, const ASTString& id, Expression* e); /// Access identifier ASTString id() const { return _id; } /// Access expression Expression* e() const { return _e; } /// Set expression void e(Expression* e0) { _e = e0; } /// Access declaration VarDecl* decl() const { return _decl; } /// Set declaration void decl(VarDecl* d) { _decl = d; } }; /// \brief Constraint item class ConstraintI : public Item { protected: /// Constraint expression Expression* _e; public: /// The identifier of this item type static const ItemId iid = II_CON; /// Constructor ConstraintI(const Location& loc, Expression* e); /// Access expression Expression* e() const { return _e; } /// Set expression void e(Expression* e0) { _e = e0; } /// Flag used during compilation bool flag() const { return _flag2; } /// Set flag used during compilation void flag(bool b) { _flag2 = b; } }; /// \brief Solve item class SolveI : public Item { protected: /// Solve item annotation Annotation _ann; /// Expression for minimisation/maximisation (or NULL) Expression* _e; /// Constructor SolveI(const Location& loc, Expression* e); public: /// The identifier of this item type static const ItemId iid = II_SOL; /// Type of solving enum SolveType { ST_SAT, ST_MIN, ST_MAX }; /// Allocate solve satisfy item static SolveI* sat(const Location& loc); /// Allocate solve minimize item static SolveI* min(const Location& loc, Expression* e); /// Allocate solve maximize item static SolveI* max(const Location& loc, Expression* e); /// Access solve annotation const Annotation& ann() const { return _ann; } /// Access solve annotation Annotation& ann() { return _ann; } /// Access expression for optimisation Expression* e() const { return _e; } /// Set expression for optimisation void e(Expression* e0) { _e = e0; } /// Return type of solving SolveType st() const; /// Set type of solving void st(SolveType s); }; /// \brief Output item class OutputI : public Item { protected: /// Expression to output Expression* _e; public: /// The identifier of this item type static const ItemId iid = II_OUT; /// Constructor OutputI(const Location& loc, Expression* e); /// Access expression Expression* e() const { return _e; } /// Update expression void e(Expression* e) { _e = e; } }; class EnvI; /// \brief Function declaration item class FunctionI : public Item { protected: /// Identifier of this function ASTString _id; /// Type-inst of the return value TypeInst* _ti; /// List of parameter declarations ASTExprVec _params; /// Annotation Annotation _ann; /// Function body (or NULL) Expression* _e; /// Whether function is defined in the standard library bool _fromStdLib; public: /// The identifier of this item type static const ItemId iid = II_FUN; /// Type of builtin expression-valued functions typedef Expression* (*builtin_e)(EnvI&, Call*); /// Type of builtin int-valued functions typedef IntVal (*builtin_i)(EnvI&, Call*); /// Type of builtin bool-valued functions typedef bool (*builtin_b)(EnvI&, Call*); /// Type of builtin float-valued functions typedef FloatVal (*builtin_f)(EnvI&, Call*); /// Type of builtin set-valued functions typedef IntSetVal* (*builtin_s)(EnvI&, Call*); /// Type of builtin string-valued functions typedef std::string (*builtin_str)(EnvI&, Call*); /// Builtin functions (or NULL) struct { builtin_e e; builtin_i i; builtin_f f; builtin_b b; builtin_s s; builtin_str str; } builtins; /// Constructor FunctionI(const Location& loc, const std::string& id, TypeInst* ti, const std::vector& params, Expression* e = nullptr, bool from_stdlib = false); /// Constructor FunctionI(const Location& loc, const ASTString& id, TypeInst* ti, const ASTExprVec& params, Expression* e = nullptr, bool from_stdlib = false); /// Access identifier ASTString id() const { return _id; } /// Access TypeInst TypeInst* ti() const { return _ti; } /// Access parameters ASTExprVec params() const { return _params; } /// Access annotation const Annotation& ann() const { return _ann; } /// Access annotation Annotation& ann() { return _ann; } /// Access body Expression* e() const { return _e; } /// Set body void e(Expression* b) { _e = b; } /** \brief Compute return type given argument types \a ta */ Type rtype(EnvI& env, const std::vector& ta, bool strictEnums); /** \brief Compute return type given argument types \a ta */ Type rtype(EnvI& env, const std::vector& ta, bool strictEnums); /** \brief Compute expected type of argument \a n given argument types \a ta */ Type argtype(EnvI& env, const std::vector& ta, unsigned int n) const; /// Return whether function is defined in the standard library bool fromStdLib() const { return _fromStdLib; }; }; /** * \brief Visitor for expressions * * This class implements no-ops for all expression types. * Override the methods to implement custom behaviour. */ class EVisitor { public: /// Visit integer literal void vIntLit(const IntLit& /*il*/) {} /// Visit floating point literal void vFloatLit(const FloatLit& /*fl*/) {} /// Visit Boolean literal void vBoolLit(const BoolLit& /*bl*/) {} /// Visit set literal void vSetLit(const SetLit& /*sl*/) {} /// Visit string literal void vStringLit(const StringLit& /*sl*/) {} /// Visit identifier void vId(const Id& /*ident*/) {} /// Visit anonymous variable void vAnonVar(const AnonVar& /*x*/) {} /// Visit array literal void vArrayLit(const ArrayLit& /*al*/) {} /// Visit array access void vArrayAccess(const ArrayAccess& /*aa*/) {} /// Visit array comprehension void vComprehension(const Comprehension& /*c*/) {} /// Visit array comprehension (only generator \a gen_i) void vComprehensionGenerator(const Comprehension& /*c*/, int /*gen_i*/) {} /// Visit if-then-else void vITE(const ITE& /*ite*/) {} /// Visit binary operator void vBinOp(const BinOp& /*bo*/) {} /// Visit unary operator void vUnOp(const UnOp& /*uo*/) {} /// Visit call void vCall(const Call& /*c*/) {} /// Visit let void vLet(const Let& /*let*/) {} /// Visit variable declaration void vVarDecl(const VarDecl& /*vd*/) {} /// Visit type inst void vTypeInst(const TypeInst& /*ti*/) {} /// Visit TIId void vTIId(const TIId& /*tiid*/) {} /// Determine whether to enter node static bool enter(Expression* /*e*/) { return true; } /// Exit node after processing has finished void exit(Expression* /*e*/) {} }; /// Statically allocated constants class Constants : public GCMarker { public: /// Literal true BoolLit* literalTrue; /// Variable bound to true VarDecl* varTrue; /// Literal false BoolLit* literalFalse; /// Variable bound to false VarDecl* varFalse; /// Special variable to signal compiler to ignore result VarDecl* varIgnore; /// Infinite set SetLit* infinity; /// Function item used to keep track of redefined variables FunctionI* varRedef; /// Literal absent value Expression* absent; /// Identifiers for builtins struct { ASTString forall; ASTString forallReif; ASTString exists; ASTString clause; ASTString bool2int; ASTString int2float; ASTString bool2float; ASTString assert; ASTString mzn_deprecate; // NOLINT(readability-identifier-naming) ASTString mzn_symmetry_breaking_constraint; // NOLINT(readability-identifier-naming) ASTString mzn_redundant_constraint; // NOLINT(readability-identifier-naming) ASTString trace; ASTString sum; ASTString lin_exp; // NOLINT(readability-identifier-naming) ASTString element; ASTString show; ASTString fix; ASTString output; struct { ASTString lin_eq; // NOLINT(readability-identifier-naming) ASTString lin_le; // NOLINT(readability-identifier-naming) ASTString lin_ne; // NOLINT(readability-identifier-naming) ASTString plus; ASTString minus; ASTString times; ASTString div; ASTString mod; ASTString lt; ASTString le; ASTString gt; ASTString ge; ASTString eq; ASTString ne; } int_; // NOLINT(readability-identifier-naming) struct { ASTString lin_eq; // NOLINT(readability-identifier-naming) ASTString lin_le; // NOLINT(readability-identifier-naming) ASTString lin_ne; // NOLINT(readability-identifier-naming) ASTString plus; ASTString minus; ASTString times; ASTString div; ASTString mod; ASTString lt; ASTString le; ASTString gt; ASTString ge; ASTString eq; ASTString ne; } int_reif; // NOLINT(readability-identifier-naming) struct { ASTString lin_eq; // NOLINT(readability-identifier-naming) ASTString lin_le; // NOLINT(readability-identifier-naming) ASTString lin_lt; // NOLINT(readability-identifier-naming) ASTString lin_ne; // NOLINT(readability-identifier-naming) ASTString plus; ASTString minus; ASTString times; ASTString div; ASTString mod; ASTString lt; ASTString le; ASTString gt; ASTString ge; ASTString eq; ASTString ne; ASTString in; ASTString dom; } float_; // NOLINT(readability-identifier-naming) struct { ASTString lin_eq; // NOLINT(readability-identifier-naming) ASTString lin_le; // NOLINT(readability-identifier-naming) ASTString lin_lt; // NOLINT(readability-identifier-naming) ASTString lin_ne; // NOLINT(readability-identifier-naming) ASTString plus; ASTString minus; ASTString times; ASTString div; ASTString mod; ASTString lt; ASTString le; ASTString gt; ASTString ge; ASTString eq; ASTString ne; ASTString in; } float_reif; // NOLINT(readability-identifier-naming) ASTString bool_eq; // NOLINT(readability-identifier-naming) ASTString bool_eq_reif; // NOLINT(readability-identifier-naming) ASTString bool_not; // NOLINT(readability-identifier-naming) ASTString array_bool_or; // NOLINT(readability-identifier-naming) ASTString array_bool_and; // NOLINT(readability-identifier-naming) ASTString bool_clause; // NOLINT(readability-identifier-naming) ASTString bool_clause_reif; // NOLINT(readability-identifier-naming) ASTString bool_xor; // NOLINT(readability-identifier-naming) ASTString set_eq; // NOLINT(readability-identifier-naming) ASTString set_in; // NOLINT(readability-identifier-naming) ASTString set_subset; // NOLINT(readability-identifier-naming) ASTString set_card; // NOLINT(readability-identifier-naming) ASTString pow; ASTString introduced_var; // NOLINT(readability-identifier-naming) ASTString anonEnumFromStrings; } ids; /// Identifiers for Boolean contexts struct { Id* root; Id* pos; Id* neg; Id* mix; } ctx; /// Common annotations struct { Id* output_var; // NOLINT(readability-identifier-naming) ASTString output_array; // NOLINT(readability-identifier-naming) Id* add_to_output; // NOLINT(readability-identifier-naming) Id* output_only; // NOLINT(readability-identifier-naming) Id* mzn_check_var; // NOLINT(readability-identifier-naming) ASTString mzn_check_enum_var; // NOLINT(readability-identifier-naming) Id* is_defined_var; // NOLINT(readability-identifier-naming) ASTString defines_var; // NOLINT(readability-identifier-naming) Id* is_reverse_map; // NOLINT(readability-identifier-naming) Id* promise_total; // NOLINT(readability-identifier-naming) Id* maybe_partial; // NOLINT(readability-identifier-naming) ASTString doc_comment; // NOLINT(readability-identifier-naming) ASTString mzn_path; // NOLINT(readability-identifier-naming) ASTString is_introduced; // NOLINT(readability-identifier-naming) Id* user_cut; // NOLINT(readability-identifier-naming) // MIP Id* lazy_constraint; // NOLINT(readability-identifier-naming) // MIP Id* mzn_break_here; // NOLINT(readability-identifier-naming) Id* rhs_from_assignment; // NOLINT(readability-identifier-naming) Id* domain_change_constraint; // NOLINT(readability-identifier-naming) ASTString mzn_deprecated; // NOLINT(readability-identifier-naming) Id* mzn_was_undefined; // NOLINT(readability-identifier-naming) Id* array_check_form; // NOLINT(readability-identifier-naming) } ann; /// Command line options struct { /// basic MiniZinc command line options ASTString cmdlineData_str; // NOLINT(readability-identifier-naming) ASTString cmdlineData_short_str; // NOLINT(readability-identifier-naming) ASTString datafile_str; // NOLINT(readability-identifier-naming) ASTString datafile_short_str; // NOLINT(readability-identifier-naming) ASTString globalsDir_str; // NOLINT(readability-identifier-naming) ASTString globalsDir_alt_str; // NOLINT(readability-identifier-naming) ASTString globalsDir_short_str; // NOLINT(readability-identifier-naming) ASTString help_str; // NOLINT(readability-identifier-naming) ASTString help_short_str; // NOLINT(readability-identifier-naming) ASTString ignoreStdlib_str; // NOLINT(readability-identifier-naming) ASTString include_str; // NOLINT(readability-identifier-naming) ASTString inputFromStdin_str; // NOLINT(readability-identifier-naming) ASTString instanceCheckOnly_str; // NOLINT(readability-identifier-naming) ASTString no_optimize_str; // NOLINT(readability-identifier-naming) ASTString no_optimize_alt_str; // NOLINT(readability-identifier-naming) ASTString no_outputOzn_str; // NOLINT(readability-identifier-naming) ASTString no_outputOzn_short_str; // NOLINT(readability-identifier-naming) ASTString no_typecheck_str; // NOLINT(readability-identifier-naming) ASTString newfzn_str; // NOLINT(readability-identifier-naming) ASTString outputBase_str; // NOLINT(readability-identifier-naming) ASTString outputFznToStdout_str; // NOLINT(readability-identifier-naming) ASTString outputFznToStdout_alt_str; // NOLINT(readability-identifier-naming) ASTString outputOznToFile_str; // NOLINT(readability-identifier-naming) ASTString outputOznToStdout_str; // NOLINT(readability-identifier-naming) ASTString outputFznToFile_str; // NOLINT(readability-identifier-naming) ASTString outputFznToFile_alt_str; // NOLINT(readability-identifier-naming) ASTString outputFznToFile_short_str; // NOLINT(readability-identifier-naming) ASTString rangeDomainsOnly_str; // NOLINT(readability-identifier-naming) ASTString statistics_str; // NOLINT(readability-identifier-naming) ASTString statistics_short_str; // NOLINT(readability-identifier-naming) ASTString stdlib_str; // NOLINT(readability-identifier-naming) ASTString verbose_str; // NOLINT(readability-identifier-naming) ASTString verbose_short_str; // NOLINT(readability-identifier-naming) ASTString version_str; // NOLINT(readability-identifier-naming) ASTString werror_str; // NOLINT(readability-identifier-naming) struct { ASTString all_sols_str; // NOLINT(readability-identifier-naming) ASTString fzn_solver_str; // NOLINT(readability-identifier-naming) } solver; } cli; /// options strings to find setting in Options map struct { ASTString cmdlineData; ASTString datafile; ASTString datafiles; ASTString fznToStdout; ASTString fznToFile; ASTString globalsDir; ASTString ignoreStdlib; ASTString includeDir; ASTString includePaths; ASTString instanceCheckOnly; ASTString inputFromStdin; ASTString model; ASTString newfzn; ASTString noOznOutput; ASTString optimize; ASTString outputBase; ASTString oznToFile; ASTString oznToStdout; ASTString rangeDomainsOnly; ASTString statistics; ASTString stdlib; ASTString typecheck; ASTString verbose; ASTString werror; struct { ASTString allSols; ASTString numSols; ASTString threads; ASTString fzn_solver; // NOLINT(readability-identifier-naming) ASTString fzn_flags; // NOLINT(readability-identifier-naming) ASTString fzn_flag; // NOLINT(readability-identifier-naming) ASTString fzn_time_limit_ms; // NOLINT(readability-identifier-naming) ASTString fzn_sigint; // NOLINT(readability-identifier-naming) } solver; } opts; /// categories of the command line interface options struct { ASTString general; ASTString io; ASTString solver; ASTString translation; } cli_cat; // NOLINT(readability-identifier-naming) /// Keep track of allocated integer literals std::unordered_map integerMap; /// Keep track of allocated float literals std::unordered_map floatMap; /// Constructor Constants(); /// Return shared BoolLit BoolLit* boollit(bool b) { return b ? literalTrue : literalFalse; } static const int max_array_size = std::numeric_limits::max() / 2; void mark(MINIZINC_GC_STAT_ARGS) override; }; /// Return static instance Constants& constants(); } // namespace MiniZinc #include libminizinc-2.5.3/include/minizinc/ast.hpp0000644000175000017500000004640513757304533017254 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ namespace MiniZinc { inline bool Expression::equal(const Expression* e0, const Expression* e1) { if (e0 == e1) { return true; } if (e0 == nullptr || e1 == nullptr) { return false; } if (e0->isUnboxedInt() || e1->isUnboxedInt()) { return false; } if (e0->isUnboxedFloatVal() || e1->isUnboxedFloatVal()) { if (e0->isUnboxedFloatVal() && e1->isUnboxedFloatVal()) { return e0->unboxedFloatToFloatVal() == e1->unboxedFloatToFloatVal(); } return false; } if (static_cast(e0->_id) != static_cast(e1->_id)) { return false; } if (e0->type() != e1->type()) { return false; } if (e0->hash() != e1->hash()) { return false; } return equalInternal(e0, e1); } inline void Expression::type(const Type& t) { if (isUnboxedVal()) { assert(!isUnboxedInt() || t == Type::parint()); assert(!isUnboxedFloatVal() || t == Type::parfloat()); return; } if (eid() == E_VARDECL) { this->cast()->id()->_type = t; } else if (eid() == E_ID && (this->cast()->decl() != nullptr)) { assert(_type.bt() == Type::BT_UNKNOWN || _type.dim() == t.dim() || t.dim() != -1); this->cast()->decl()->_type = t; } _type = t; } inline IntLit::IntLit(const Location& loc, IntVal v) : Expression(loc, E_INTLIT, Type::parint()), _v(v) { rehash(); } inline IntLit* IntLit::a(MiniZinc::IntVal v) { if (v.isFinite()) { IntLit* ret = intToUnboxedInt(v.toInt()); if (ret != nullptr) { return ret; } } auto it = constants().integerMap.find(v); if (it == constants().integerMap.end() || it->second() == nullptr) { auto* il = new IntLit(Location().introduce(), v); if (it == constants().integerMap.end()) { constants().integerMap.insert(std::make_pair(v, il)); } else { it->second = il; } return il; } return it->second()->cast(); } inline IntLit* IntLit::aEnum(IntVal v, unsigned int enumId) { if (enumId == 0) { return a(v); } auto* il = new IntLit(Location().introduce(), v); Type tt(il->type()); tt.enumId(enumId); il->type(tt); return il; } inline ASTString Location::LocVec::filename() const { return static_cast(_data[0]); } inline unsigned int Location::LocVec::firstLine() const { if (_size == 2) { static const unsigned int pointerBits = sizeof(void*) * 8; auto* il = static_cast(_data[1]); long long unsigned int mask = pointerBits <= 32 ? 0xFF : 0xFFFFF; union { long long int i; unsigned long long int u; } ui; ui.i = il->v().toInt(); return static_cast(ui.u & mask); } auto* il = static_cast(_data[1]); return il->v().toInt(); } inline unsigned int Location::LocVec::lastLine() const { if (_size == 2) { static const unsigned int pointerBits = sizeof(void*) * 8; auto* il = static_cast(_data[1]); long long unsigned int first_line_size = pointerBits <= 32 ? 8 : 20; long long unsigned int mask = pointerBits <= 32 ? 0xFF : 0xFFFFF; long long unsigned int offsetmask = pointerBits <= 32 ? 0x7F : 0xFFFFF; union { long long int i; unsigned long long int u; } ui; ui.i = il->v().toInt(); // return first line (8 bit) + offset (7 bit) return static_cast((ui.u & mask) + ((ui.u >> first_line_size) & offsetmask)); } auto* il = static_cast(_data[2]); return il->v().toInt(); } inline unsigned int Location::LocVec::firstColumn() const { if (_size == 2) { static const unsigned int pointerBits = sizeof(void*) * 8; auto* il = static_cast(_data[1]); long long unsigned int first_col_offset = pointerBits <= 32 ? 8 + 7 : 20 + 20; long long unsigned int mask = pointerBits <= 32 ? 0x3F : 0x3FF; union { long long int i; unsigned long long int u; } ui; ui.i = il->v().toInt(); // return first line (8 bit) + offset (7 bit) return static_cast((ui.u >> first_col_offset) & mask); } auto* il = static_cast(_data[3]); return il->v().toInt(); } inline unsigned int Location::LocVec::lastColumn() const { if (_size == 2) { static const unsigned int pointerBits = sizeof(void*) * 8; auto* il = static_cast(_data[1]); long long unsigned int last_col_offset = pointerBits <= 32 ? 8 + 7 + 6 : 20 + 20 + 10; long long unsigned int mask = pointerBits <= 32 ? 0x7F : 0x3FF; union { long long int i; unsigned long long int u; } ui; ui.i = il->v().toInt(); // return first line (8 bit) + offset (7 bit) return static_cast((ui.u >> last_col_offset) & mask); } auto* il = static_cast(_data[4]); return il->v().toInt(); } inline FloatLit::FloatLit(const Location& loc, FloatVal v) : Expression(loc, E_FLOATLIT, Type::parfloat()), _v(v) { rehash(); } inline FloatLit* FloatLit::a(MiniZinc::FloatVal v) { if (sizeof(double) <= sizeof(void*) && v.isFinite()) { FloatLit* ret = Expression::doubleToUnboxedFloatVal(v.toDouble()); if (ret != nullptr) { return ret; } } auto it = constants().floatMap.find(v); if (it == constants().floatMap.end() || it->second() == nullptr) { auto* fl = new FloatLit(Location().introduce(), v); if (it == constants().floatMap.end()) { constants().floatMap.insert(std::make_pair(v, fl)); } else { it->second = fl; } return fl; } return it->second()->cast(); } inline SetLit::SetLit(const Location& loc, const std::vector& v) : Expression(loc, E_SETLIT, Type()), _v(ASTExprVec(v)) { _u.isv = nullptr; rehash(); } inline SetLit::SetLit(const Location& loc, const ASTExprVec& v) : Expression(loc, E_SETLIT, Type()), _v(v) { _u.isv = nullptr; rehash(); } inline SetLit::SetLit(const Location& loc, IntSetVal* isv) : Expression(loc, E_SETLIT, Type()) { _type = Type::parsetint(); _u.isv = isv; rehash(); } inline SetLit::SetLit(const Location& loc, FloatSetVal* fsv) : Expression(loc, E_SETLIT, Type()) { _type = Type::parsetfloat(); _u.fsv = fsv; rehash(); } inline BoolLit::BoolLit(const Location& loc, bool v) : Expression(loc, E_BOOLLIT, Type::parbool()), _v(v) { rehash(); } inline StringLit::StringLit(const Location& loc, const std::string& v) : Expression(loc, E_STRINGLIT, Type::parstring()), _v(ASTString(v)) { rehash(); } inline StringLit::StringLit(const Location& loc, const ASTString& v) : Expression(loc, E_STRINGLIT, Type::parstring()), _v(v) { rehash(); } inline Id::Id(const Location& loc, const std::string& v0, VarDecl* decl) : Expression(loc, E_ID, Type()), _decl(decl) { v(v0); rehash(); } inline Id::Id(const Location& loc, const ASTString& v0, VarDecl* decl) : Expression(loc, E_ID, Type()), _decl(decl) { v(v0); rehash(); } inline Id::Id(const Location& loc, long long int idn0, VarDecl* decl) : Expression(loc, E_ID, Type()), _decl(decl) { idn(idn0); rehash(); } inline void Id::decl(VarDecl* d) { _decl = d; } inline ASTString Id::v() const { if ((_decl != nullptr) && _decl->isa()) { Expression* d = _decl; while ((d != nullptr) && d->isa()) { d = d->cast()->_decl; } return d->cast()->id()->v(); } assert(hasStr()); return _vOrIdn.val; } inline long long int Id::idn() const { if ((_decl != nullptr) && _decl->isa()) { Expression* d = _decl; while ((d != nullptr) && d->isa()) { d = d->cast()->_decl; } return d->cast()->id()->idn(); } if (hasStr()) { return -1; } long long int i = reinterpret_cast(_vOrIdn.idn) & ~static_cast(1); return i >> 1; } inline TIId::TIId(const Location& loc, const std::string& v) : Expression(loc, E_TIID, Type()), _v(ASTString(v)) { rehash(); } inline TIId::TIId(const Location& loc, const ASTString& v) : Expression(loc, E_TIID, Type()), _v(v) { rehash(); } inline AnonVar::AnonVar(const Location& loc) : Expression(loc, E_ANON, Type()) { rehash(); } inline ArrayLit::ArrayLit(const Location& loc, ArrayLit& v, const std::vector >& dims) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = v._flag2; if (_flag2) { _u.al = v._u.al; std::vector d(dims.size() * 2 + v._dims.size() - v.dims() * 2); for (auto i = static_cast(dims.size()); (i--) != 0U;) { d[i * 2] = dims[i].first; d[i * 2 + 1] = dims[i].second; } int sliceOffset = static_cast(dims.size()) * 2; unsigned int origSliceOffset = v.dims() * 2; for (int i = 0; i < _u.al->dims() * 2; i++) { d[sliceOffset + i] = v._dims[origSliceOffset + i]; } _dims = ASTIntVec(d); } else { std::vector d(dims.size() * 2); for (auto i = static_cast(dims.size()); (i--) != 0U;) { d[i * 2] = dims[i].first; d[i * 2 + 1] = dims[i].second; } if (v._u.v->flag() || d.size() != 2 || d[0] != 1) { // only allocate dims vector if it is not a 1d array indexed from 1 _dims = ASTIntVec(d); } _u.v = v._u.v; } rehash(); } inline ArrayLit::ArrayLit(const Location& loc, ArrayLit& v) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = v._flag2; if (_flag2) { _u.al = v._u.al; std::vector d(2 + v._dims.size() - v.dims() * 2); d[0] = 1; d[1] = v.size(); int sliceOffset = 2; unsigned int origSliceOffset = v.dims() * 2; for (int i = 0; i < _u.al->dims() * 2; i++) { d[sliceOffset + i] = v._dims[origSliceOffset + i]; } _dims = ASTIntVec(d); } else { _u.v = v._u.v; if (_u.v->flag()) { std::vector d(2); d[0] = 1; d[1] = v.length(); _dims = ASTIntVec(d); } else { // don't allocate dims vector since this is a 1d array indexed from 1 } } rehash(); } inline ArrayLit::ArrayLit(const Location& loc, const std::vector& v) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = false; std::vector d(2); d[0] = 1; d[1] = static_cast(v.size()); compress(v, d); rehash(); } inline ArrayLit::ArrayLit(const Location& loc, const std::vector& v) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = false; std::vector d(2); d[0] = 1; d[1] = static_cast(v.size()); std::vector vv(v.size()); for (unsigned int i = 0; i < v.size(); i++) { vv[i] = v[i](); } compress(vv, d); rehash(); } inline ArrayLit::ArrayLit(const Location& loc, const std::vector >& v) : Expression(loc, E_ARRAYLIT, Type()) { _flag1 = false; _flag2 = false; std::vector dims(4); dims[0] = 1; dims[1] = static_cast(v.size()); dims[2] = 1; dims[3] = !v.empty() ? static_cast(v[0].size()) : 0; std::vector vv; for (const auto& i : v) { for (auto* j : i) { vv.push_back(j); } } compress(vv, dims); rehash(); } inline ArrayAccess::ArrayAccess(const Location& loc, Expression* v, const std::vector& idx) : Expression(loc, E_ARRAYACCESS, Type()) { _v = v; _idx = ASTExprVec(idx); rehash(); } inline ArrayAccess::ArrayAccess(const Location& loc, Expression* v, const ASTExprVec& idx) : Expression(loc, E_ARRAYACCESS, Type()) { _v = v; _idx = idx; rehash(); } inline void Comprehension::init(Expression* e, Generators& g) { _e = e; std::vector es; std::vector idx; for (auto& i : g.g) { idx.push_back(static_cast(es.size())); es.push_back(i._in); es.push_back(i._where); for (auto& j : i._v) { es.push_back(j); } } idx.push_back(static_cast(es.size())); _g = ASTExprVec(es); _gIndex = ASTIntVec(idx); rehash(); } inline Comprehension::Comprehension(const Location& loc, Expression* e, Generators& g, bool set) : Expression(loc, E_COMP, Type()) { _flag1 = set; init(e, g); } inline void ITE::init(const std::vector& e_if_then, Expression* e_else) { _eIfThen = ASTExprVec(e_if_then); _eElse = e_else; rehash(); } inline ITE::ITE(const Location& loc, const std::vector& e_if_then, Expression* e_else) : Expression(loc, E_ITE, Type()) { init(e_if_then, e_else); } inline BinOp::BinOp(const Location& loc, Expression* e0, BinOpType op, Expression* e1) : Expression(loc, E_BINOP, Type()), _e0(e0), _e1(e1), _decl(nullptr) { _secondaryId = op; rehash(); } inline UnOp::UnOp(const Location& loc, UnOpType op, Expression* e) : Expression(loc, E_UNOP, Type()), _e0(e), _decl(nullptr) { _secondaryId = op; rehash(); } inline bool Call::hasId() const { return (reinterpret_cast(_uId.decl) & static_cast(1)) == 0; } inline ASTString Call::id() const { return hasId() ? _uId.id : decl()->id(); } inline void Call::id(const ASTString& i) { _uId.id = i; assert(hasId()); assert(decl() == nullptr); } inline FunctionI* Call::decl() const { return hasId() ? nullptr : reinterpret_cast(reinterpret_cast(_uId.decl) & ~static_cast(1)); } inline void Call::decl(FunctionI* f) { assert(f != nullptr); _uId.decl = reinterpret_cast(reinterpret_cast(f) | static_cast(1)); } inline Call::Call(const Location& loc, const std::string& id0, const std::vector& args) : Expression(loc, E_CALL, Type()) { _flag1 = false; id(ASTString(id0)); if (args.size() == 1) { _u.oneArg = args[0]->isUnboxedVal() ? args[0] : args[0]->tag(); } else { _u.args = ASTExprVec(args).vec(); } rehash(); assert(hasId()); assert(decl() == nullptr); } inline Call::Call(const Location& loc, const ASTString& id0, const std::vector& args) : Expression(loc, E_CALL, Type()) { _flag1 = false; id(ASTString(id0)); if (args.size() == 1) { _u.oneArg = args[0]->isUnboxedVal() ? args[0] : args[0]->tag(); } else { _u.args = ASTExprVec(args).vec(); } rehash(); assert(hasId()); assert(decl() == nullptr); } inline VarDecl::VarDecl(const Location& loc, TypeInst* ti, const ASTString& id, Expression* e) : Expression(loc, E_VARDECL, ti != nullptr ? ti->type() : Type()), _id(nullptr), _flat(nullptr) { _id = new Id(loc, id, this); _flag1 = true; _flag2 = false; _ti = ti; _e = e; _id->type(type()); _payload = 0; rehash(); } inline VarDecl::VarDecl(const Location& loc, TypeInst* ti, long long int idn, Expression* e) : Expression(loc, E_VARDECL, ti != nullptr ? ti->type() : Type()), _id(nullptr), _flat(nullptr) { _id = new Id(loc, idn, this); _flag1 = true; _flag2 = false; _ti = ti; _e = e; _id->type(type()); _payload = 0; rehash(); } inline VarDecl::VarDecl(const Location& loc, TypeInst* ti, const std::string& id, Expression* e) : Expression(loc, E_VARDECL, ti->type()), _id(nullptr), _flat(nullptr) { _id = new Id(loc, ASTString(id), this); _flag1 = true; _flag2 = false; _ti = ti; _e = e; _id->type(type()); _payload = 0; rehash(); } inline VarDecl::VarDecl(const Location& loc, TypeInst* ti, Id* id, Expression* e) : Expression(loc, E_VARDECL, ti->type()), _id(nullptr), _flat(nullptr) { if (id->idn() == -1) { _id = new Id(id->loc(), id->v(), this); } else { _id = new Id(id->loc(), id->idn(), this); } _flag1 = true; _flag2 = false; _ti = ti; _e = e; _id->type(type()); _payload = 0; rehash(); } inline Expression* VarDecl::e() const { return (_e == nullptr || _e->isUnboxedVal()) ? _e : _e->untag(); } inline void VarDecl::e(Expression* rhs) { assert(rhs == nullptr || !rhs->isa() || rhs->cast() != _id); _e = rhs; } inline bool VarDecl::toplevel() const { return _flag1; } inline void VarDecl::toplevel(bool t) { _flag1 = t; } inline bool VarDecl::introduced() const { return _flag2; } inline void VarDecl::introduced(bool t) { _flag2 = t; } inline bool VarDecl::evaluated() const { return _e->isUnboxedVal() || _e->isTagged(); } inline void VarDecl::evaluated(bool t) { if (!_e->isUnboxedVal()) { if (t) { _e = _e->tag(); } else { _e = _e->untag(); } } } inline void VarDecl::flat(VarDecl* vd) { _flat = WeakRef(vd); } inline TypeInst::TypeInst(const Location& loc, const Type& type, const ASTExprVec& ranges, Expression* domain) : Expression(loc, E_TI, type), _ranges(ranges), _domain(domain) { _flag1 = false; _flag2 = false; rehash(); } inline TypeInst::TypeInst(const Location& loc, const Type& type, Expression* domain) : Expression(loc, E_TI, type), _domain(domain) { _flag1 = false; _flag2 = false; rehash(); } inline IncludeI::IncludeI(const Location& loc, const ASTString& f) : Item(loc, II_INC), _f(f), _m(nullptr) {} inline VarDeclI::VarDeclI(const Location& loc, VarDecl* e) : Item(loc, II_VD), _e(e) {} inline AssignI::AssignI(const Location& loc, const std::string& id, Expression* e) : Item(loc, II_ASN), _id(ASTString(id)), _e(e), _decl(nullptr) {} inline AssignI::AssignI(const Location& loc, const ASTString& id, Expression* e) : Item(loc, II_ASN), _id(id), _e(e), _decl(nullptr) {} inline ConstraintI::ConstraintI(const Location& loc, Expression* e) : Item(loc, II_CON), _e(e) {} inline SolveI::SolveI(const Location& loc, Expression* e) : Item(loc, II_SOL), _e(e) {} inline SolveI* SolveI::sat(const Location& loc) { auto* si = new SolveI(loc, nullptr); si->_secondaryId = ST_SAT; return si; } inline SolveI* SolveI::min(const Location& loc, Expression* e) { auto* si = new SolveI(loc, e); si->_secondaryId = ST_MIN; return si; } inline SolveI* SolveI::max(const Location& loc, Expression* e) { auto* si = new SolveI(loc, e); si->_secondaryId = ST_MAX; return si; } inline SolveI::SolveType SolveI::st() const { return static_cast(_secondaryId); } inline void SolveI::st(SolveI::SolveType s) { _secondaryId = s; } inline OutputI::OutputI(const Location& loc, Expression* e) : Item(loc, II_OUT), _e(e) {} inline FunctionI::FunctionI(const Location& loc, const std::string& id, TypeInst* ti, const std::vector& params, Expression* e, bool from_stdlib) : Item(loc, II_FUN), _id(ASTString(id)), _ti(ti), _params(ASTExprVec(params)), _e(e), _fromStdLib(from_stdlib) { builtins.e = nullptr; builtins.b = nullptr; builtins.f = nullptr; builtins.i = nullptr; builtins.s = nullptr; builtins.str = nullptr; } inline FunctionI::FunctionI(const Location& loc, const ASTString& id, TypeInst* ti, const ASTExprVec& params, Expression* e, bool from_stdlib) : Item(loc, II_FUN), _id(id), _ti(ti), _params(params), _e(e), _fromStdLib(from_stdlib) { builtins.e = nullptr; builtins.b = nullptr; builtins.f = nullptr; builtins.i = nullptr; builtins.s = nullptr; builtins.str = nullptr; } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/config.hh.in0000644000175000017500000000113213757304533020133 0ustar kaolkaol#define MZN_VERSION_MAJOR "${libminizinc_VERSION_MAJOR}" #define MZN_VERSION_MINOR "${libminizinc_VERSION_MINOR}" #define MZN_VERSION_PATCH "${libminizinc_VERSION_PATCH}" #define MZN_BUILD_REF "${BUILD_REF}" #define MZN_STATIC_STDLIB_DIR "${MZN_STATIC_STDLIB_DIR}" #cmakedefine HAS_DECLSPEC_THREAD #cmakedefine HAS_ATTR_THREAD #cmakedefine HAS_PIDPATH #cmakedefine HAS_GETMODULEFILENAME #cmakedefine HAS_GETFILEATTRIBUTES #cmakedefine HAS_MEMCPY_S #cmakedefine COMPILE_BOOST_MINCUT #cmakedefine HAS_DLFCN_H #cmakedefine HAS_WINDOWS_H #cmakedefine GUROBI_PLUGIN #cmakedefine CPLEX_PLUGIN libminizinc-2.5.3/include/minizinc/flatten.hh0000644000175000017500000001062613757304533017726 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { /// Exception thrown for errors during flattening class FlatteningError : public LocationException { public: FlatteningError(EnvI& env, const Location& loc, const std::string& msg); ~FlatteningError() throw() override {} const char* what() const throw() override { return "MiniZinc: flattening error"; } }; /// Options for the flattener struct FlatteningOptions { /// Keep output in resulting flat model bool keepOutputInFzn; /// Verbose output during flattening bool verbose; /// Only use paths for variables introduced by file 0 (the MiniZinc model) bool onlyToplevelPaths; /// Construct and collect mzn_paths for expressions and VarDeclI during flattening bool collectMznPaths; /// Do not apply domain changes but insert them as constraints (useful for debugging) bool recordDomainChanges; /// Only range domains for old linearization. Set from redefs to true if not here bool onlyRangeDomains; /// Allow the use of Half Reifications bool enableHalfReification; /// Timeout for flattening in milliseconds (0 means no timeout) unsigned long long int timeout; /// Create standard, DZN or JSON output enum OutputMode { OUTPUT_ITEM, OUTPUT_DZN, OUTPUT_JSON, OUTPUT_CHECKER } outputMode; /// Output objective value (only for DZN and JSON mode) bool outputObjective; /// Output original output item as string (only for DZN and JSON mode) bool outputOutputItem; /// Model is being compiled with a solution checker bool hasChecker; /// Output detailed timing information for flattening bool detailedTiming; /// Default constructor FlatteningOptions() : keepOutputInFzn(false), verbose(false), onlyToplevelPaths(false), collectMznPaths(false), recordDomainChanges(false), onlyRangeDomains(false), enableHalfReification(true), timeout(0), outputMode(OUTPUT_ITEM), outputObjective(false), outputOutputItem(false), detailedTiming(false) {} }; class Pass { public: Pass(){}; virtual Env* run(Env* env, std::ostream& log) = 0; virtual ~Pass(){}; }; /// Flatten model in environment \a e void flatten(Env& e, FlatteningOptions opt = FlatteningOptions()); /// Translate model in environment \a e into old FlatZinc syntax void oldflatzinc(Env& e); /// Populate FlatZinc output model void populate_output(Env& e); /// Statistics on flat models struct FlatModelStatistics { /// Number of integer variables int n_int_vars; // NOLINT(readability-identifier-naming) /// Number of bool variables int n_bool_vars; // NOLINT(readability-identifier-naming) /// Number of float variables int n_float_vars; // NOLINT(readability-identifier-naming) /// Number of set variables int n_set_vars; // NOLINT(readability-identifier-naming) /// Number of bool constraints int n_bool_ct; // NOLINT(readability-identifier-naming) /// Number of integer constraints int n_int_ct; // NOLINT(readability-identifier-naming) /// Number of float constraints int n_float_ct; // NOLINT(readability-identifier-naming) /// Number of set constraints int n_set_ct; // NOLINT(readability-identifier-naming) /// Number of reified constraints evaluated int n_reif_ct; // NOLINT(readability-identifier-naming) /// Number of half-reified constraints evaluated int n_imp_ct; // NOLINT(readability-identifier-naming) /// Number of implications eliminated using path compression int n_imp_del; // NOLINT(readability-identifier-naming) /// Number of linear expressions eliminated using path compression int n_lin_del; // NOLINT(readability-identifier-naming) /// Constructor FlatModelStatistics() : n_int_vars(0), n_bool_vars(0), n_float_vars(0), n_set_vars(0), n_bool_ct(0), n_int_ct(0), n_float_ct(0), n_set_ct(0), n_reif_ct(0), n_imp_ct(0), n_imp_del(0), n_lin_del(0) {} }; /// Compute statistics for flat model in \a m FlatModelStatistics statistics(Env& m); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/flatten_internal.hh0000644000175000017500000003730513757304533021625 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include // TODO: Should this be a command line option? It doesn't seem too expensive // #define OUTPUT_CALLTREE namespace MiniZinc { /// Result of evaluation class EE { public: /// The result value KeepAlive r; /// Boolean expression representing whether result is defined KeepAlive b; /// Constructor explicit EE(Expression* r0 = nullptr, Expression* b0 = nullptr) : r(r0), b(b0) {} }; /// Boolean evaluation context enum BCtx { C_ROOT, C_POS, C_NEG, C_MIX }; /// Evaluation context struct Ctx { /// Boolean context BCtx b; /// Integer context BCtx i; /// Boolen negation flag bool neg; /// Default constructor (root context) Ctx() : b(C_ROOT), i(C_MIX), neg(false) {} /// Copy constructor Ctx(const Ctx& ctx) : b(ctx.b), i(ctx.i), neg(ctx.neg) {} /// Assignment operator Ctx& operator=(const Ctx& ctx) { if (this != &ctx) { b = ctx.b; i = ctx.i; neg = ctx.neg; } return *this; } }; /// Turn \a c into positive context BCtx operator+(const BCtx& c); /// Negate context \a c BCtx operator-(const BCtx& c); class EnvI { public: Model* model; Model* originalModel; Model* output; VarOccurrences varOccurrences; VarOccurrences outputVarOccurrences; std::ostream& outstream; std::ostream& errstream; std::stringstream logstream; std::stringstream checkerOutput; // The current pass number (used for unifying and disabling path construction in final pass) unsigned int currentPassNumber; // Used for disabling path construction in final pass unsigned int finalPassNumber; // Used for disabling path construction past the maxPathDepth of previous passes unsigned int maxPathDepth; #ifdef OUTPUT_CALLTREE // Call stack depth int callDepth = 0; #endif VarOccurrences outputFlatVarOccurrences; CopyMap cmap; IdMap reverseMappers; struct WW { WeakRef r; WeakRef b; WW(const WeakRef& r0, const WeakRef& b0) : r(r0), b(b0) {} }; typedef KeepAliveMap CSEMap; bool ignorePartial; bool ignoreUnknownIds; std::vector callStack; std::vector > errorStack; std::vector idStack; unsigned int maxCallStack; std::vector warnings; std::vector modifiedVarDecls; std::unordered_set deprecationWarnings; int inRedundantConstraint; int inMaybePartial; struct { int reifConstraints; int impConstraints; int impDel; int linDel; } counters; bool inReverseMapVar; FlatteningOptions fopts; unsigned int pathUse; ASTStringMap reverseEnum; struct PathVar { KeepAlive decl; unsigned int passNumber; }; // Store mapping from path string to (VarDecl, pass_no) tuples typedef std::unordered_map PathMap; // Mapping from arbitrary Expressions to paths typedef KeepAliveMap ReversePathMap; std::vector checkVars; protected: CSEMap _cseMap; Model* _flat; bool _failed; unsigned int _ids; ASTStringMap _reifyMap; PathMap _pathMap; ReversePathMap _reversePathMap; ASTStringSet _filenameSet; typedef std::unordered_map EnumMap; EnumMap _enumMap; std::vector _enumVarDecls; typedef std::unordered_map ArrayEnumMap; ArrayEnumMap _arrayEnumMap; std::vector > _arrayEnumDecls; bool _collectVardecls; public: EnvI(Model* model0, std::ostream& outstream0 = std::cout, std::ostream& errstream0 = std::cerr); ~EnvI(); long long int genId(); /// Set minimum new temporary id to \a i+1 void minId(unsigned int i) { _ids = std::max(_ids, i + 1); } void cseMapInsert(Expression* e, const EE& ee); CSEMap::iterator cseMapFind(Expression* e); void cseMapRemove(Expression* e); CSEMap::iterator cseMapEnd(); void dump(); unsigned int registerEnum(VarDeclI* vdi); VarDeclI* getEnum(unsigned int i) const; unsigned int registerArrayEnum(const std::vector& arrayEnum); const std::vector& getArrayEnum(unsigned int i) const; /// Check if \a t1 is a subtype of \a t2 (including enumerated types if \a strictEnum is true) bool isSubtype(const Type& t1, const Type& t2, bool strictEnum) const; bool hasReverseMapper(Id* ident) { return reverseMappers.find(ident) != reverseMappers.end(); } void flatAddItem(Item* i); void flatRemoveItem(ConstraintI* i); void flatRemoveItem(VarDeclI* i); void flatRemoveExpr(Expression* e, Item* i); void voAddExp(VarDecl* vd); void annotateFromCallStack(Expression* e); void fail(const std::string& msg = std::string()); bool failed() const; Model* flat(); void swap(); void swapOutput() { std::swap(model, output); } ASTString reifyId(const ASTString& id); static ASTString halfReifyId(const ASTString& id); std::ostream& dumpStack(std::ostream& os, bool errStack); bool dumpPath(std::ostream& os, bool force = false); void addWarning(const std::string& msg); void collectVarDecls(bool b); PathMap& getPathMap() { return _pathMap; } ReversePathMap& getReversePathMap() { return _reversePathMap; } ASTStringSet& getFilenameSet() { return _filenameSet; } void copyPathMapsAndState(EnvI& env); /// deprecated, use Solns2Out std::ostream& evalOutput(std::ostream& os, std::ostream& log); void createErrorStack(); Call* surroundingCall() const; void cleanupExceptOutput(); }; void set_computed_domain(EnvI& envi, VarDecl* vd, Expression* domain, bool is_computed); EE flat_exp(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b); EE flatten_id(EnvI& env, const Ctx& ctx, Expression* e, VarDecl* r, VarDecl* b, bool doNotFollowChains); class CmpExpIdx { public: std::vector& x; CmpExpIdx(std::vector& x0) : x(x0) {} bool operator()(int i, int j) const { if (Expression::equal(x[i](), x[j]())) { return false; } if (x[i]()->isa() && x[j]()->isa() && x[i]()->cast()->idn() != -1 && x[j]()->cast()->idn() != -1) { return x[i]()->cast()->idn() < x[j]()->cast()->idn(); } return x[i]() < x[j](); } }; template class LinearTraits {}; template <> class LinearTraits { public: typedef IntVal Val; static Val eval(EnvI& env, Expression* e) { return eval_int(env, e); } static void constructLinBuiltin(BinOpType bot, ASTString& callid, int& coeff_sign, Val& d) { switch (bot) { case BOT_LE: callid = constants().ids.int_.lin_le; coeff_sign = 1; d += 1; break; case BOT_LQ: callid = constants().ids.int_.lin_le; coeff_sign = 1; break; case BOT_GR: callid = constants().ids.int_.lin_le; coeff_sign = -1; d = -d + 1; break; case BOT_GQ: callid = constants().ids.int_.lin_le; coeff_sign = -1; d = -d; break; case BOT_EQ: callid = constants().ids.int_.lin_eq; coeff_sign = 1; break; case BOT_NQ: callid = constants().ids.int_.lin_ne; coeff_sign = 1; break; default: assert(false); break; } } // NOLINTNEXTLINE(readability-identifier-naming) static ASTString id_eq() { return constants().ids.int_.eq; } typedef IntBounds Bounds; static bool finite(const IntBounds& ib) { return ib.l.isFinite() && ib.u.isFinite(); } static bool finite(const IntVal& v) { return v.isFinite(); } static Bounds computeBounds(EnvI& env, Expression* e) { return compute_int_bounds(env, e); } typedef IntSetVal* Domain; static Domain evalDomain(EnvI& env, Expression* e) { return eval_intset(env, e); } static Expression* newDomain(Val v) { return new SetLit(Location().introduce(), IntSetVal::a(v, v)); } static Expression* newDomain(Val v0, Val v1) { return new SetLit(Location().introduce(), IntSetVal::a(v0, v1)); } static Expression* newDomain(Domain d) { return new SetLit(Location().introduce(), d); } static bool domainContains(Domain dom, Val v) { return dom->contains(v); } static bool domainEquals(Domain dom, Val v) { return dom->size() == 1 && dom->min(0) == v && dom->max(0) == v; } static bool domainEquals(Domain dom1, Domain dom2) { IntSetRanges d1(dom1); IntSetRanges d2(dom2); return Ranges::equal(d1, d2); } static bool domainTighter(Domain dom, Bounds b) { return !b.valid || dom->min() > b.l || dom->max() < b.u; } static bool domainIntersects(Domain dom, Val v0, Val v1) { return (v0 > v1) || (dom->size() > 0 && dom->min(0) <= v1 && v0 <= dom->max(dom->size() - 1)); } static bool domainEmpty(Domain dom) { return dom->size() == 0; } static Domain limitDomain(BinOpType bot, Domain dom, Val v) { IntSetRanges dr(dom); IntSetVal* ndomain; switch (bot) { case BOT_LE: v -= 1; // fall through case BOT_LQ: { Ranges::Bounded b = Ranges::Bounded::maxiter(dr, v); ndomain = IntSetVal::ai(b); } break; case BOT_GR: v += 1; // fall through case BOT_GQ: { Ranges::Bounded b = Ranges::Bounded::miniter(dr, v); ndomain = IntSetVal::ai(b); } break; case BOT_NQ: { Ranges::Const c(v, v); Ranges::Diff > d(dr, c); ndomain = IntSetVal::ai(d); } break; default: assert(false); return nullptr; } return ndomain; } static Domain intersectDomain(Domain dom, Val v0, Val v1) { IntSetRanges dr(dom); Ranges::Const c(v0, v1); Ranges::Inter > inter(dr, c); return IntSetVal::ai(inter); } static Val floorDiv(Val v0, Val v1) { return static_cast( floor(static_cast(v0.toInt()) / static_cast(v1.toInt()))); } static Val ceilDiv(Val v0, Val v1) { return static_cast( ceil(static_cast(v0.toInt()) / static_cast(v1.toInt()))); } static IntLit* newLit(Val v) { return IntLit::a(v); } }; template <> class LinearTraits { public: typedef FloatVal Val; static Val eval(EnvI& env, Expression* e) { return eval_float(env, e); } static void constructLinBuiltin(BinOpType bot, ASTString& callid, int& coeff_sign, Val& d) { switch (bot) { case BOT_LE: callid = constants().ids.float_.lin_lt; coeff_sign = 1; break; case BOT_LQ: callid = constants().ids.float_.lin_le; coeff_sign = 1; break; case BOT_GR: callid = constants().ids.float_.lin_lt; coeff_sign = -1; d = -d; break; case BOT_GQ: callid = constants().ids.float_.lin_le; coeff_sign = -1; d = -d; break; case BOT_EQ: callid = constants().ids.float_.lin_eq; coeff_sign = 1; break; case BOT_NQ: callid = constants().ids.float_.lin_ne; coeff_sign = 1; break; default: assert(false); break; } } // NOLINTNEXTLINE(readability-identifier-naming) static ASTString id_eq() { return constants().ids.float_.eq; } typedef FloatBounds Bounds; static bool finite(const FloatBounds& ib) { return ib.l.isFinite() && ib.u.isFinite(); } static bool finite(const FloatVal& v) { return v.isFinite(); } static Bounds computeBounds(EnvI& env, Expression* e) { return compute_float_bounds(env, e); } typedef FloatSetVal* Domain; static Domain evalDomain(EnvI& env, Expression* e) { return eval_floatset(env, e); } static Expression* newDomain(Val v) { return new SetLit(Location().introduce(), FloatSetVal::a(v, v)); } static Expression* newDomain(Val v0, Val v1) { return new SetLit(Location().introduce(), FloatSetVal::a(v0, v1)); } static Expression* newDomain(Domain d) { return new SetLit(Location().introduce(), d); } static bool domainContains(Domain dom, Val v) { return dom->contains(v); } static bool domainEquals(Domain dom, Val v) { return dom->size() == 1 && dom->min(0) == v && dom->max(0) == v; } static bool domainTighter(Domain dom, Bounds b) { return !b.valid || dom->min() > b.l || dom->max() < b.u; } static bool domainIntersects(Domain dom, Val v0, Val v1) { return (v0 > v1) || (dom->size() > 0 && dom->min(0) <= v1 && v0 <= dom->max(dom->size() - 1)); } static bool domainEmpty(Domain dom) { return dom->size() == 0; } static bool domainEquals(Domain dom1, Domain dom2) { FloatSetRanges d1(dom1); FloatSetRanges d2(dom2); return Ranges::equal(d1, d2); } static Domain intersectDomain(Domain dom, Val v0, Val v1) { if (dom != nullptr) { FloatSetRanges dr(dom); Ranges::Const c(v0, v1); Ranges::Inter > inter(dr, c); return FloatSetVal::ai(inter); } Domain d = FloatSetVal::a(v0, v1); return d; } static Domain limitDomain(BinOpType bot, Domain dom, Val v) { FloatSetRanges dr(dom); FloatSetVal* ndomain; switch (bot) { case BOT_LE: return nullptr; case BOT_LQ: { Ranges::Bounded b = Ranges::Bounded::maxiter(dr, v); ndomain = FloatSetVal::ai(b); } break; case BOT_GR: return nullptr; case BOT_GQ: { Ranges::Bounded b = Ranges::Bounded::miniter(dr, v); ndomain = FloatSetVal::ai(b); } break; case BOT_NQ: { Ranges::Const c(v, v); Ranges::Diff > d(dr, c); ndomain = FloatSetVal::ai(d); } break; default: assert(false); return nullptr; } return ndomain; } static Val floorDiv(Val v0, Val v1) { return v0 / v1; } static Val ceilDiv(Val v0, Val v1) { return v0 / v1; } static FloatLit* newLit(Val v) { return FloatLit::a(v); } }; template void simplify_lin(std::vector::Val>& c, std::vector& x, typename LinearTraits::Val& d) { std::vector idx(c.size()); for (auto i = static_cast(idx.size()); i--;) { idx[i] = i; Expression* e = follow_id_to_decl(x[i]()); if (auto* vd = e->dynamicCast()) { if (vd->e() && vd->e()->isa()) { x[i] = vd->e(); } else { x[i] = e->cast()->id(); } } else { x[i] = e; } } std::sort(idx.begin(), idx.end(), CmpExpIdx(x)); unsigned int ci = 0; for (; ci < x.size(); ci++) { if (Lit* il = x[idx[ci]]()->dynamicCast()) { d += c[idx[ci]] * il->v(); c[idx[ci]] = 0; } else { break; } } for (unsigned int i = ci + 1; i < x.size(); i++) { if (Expression::equal(x[idx[i]](), x[idx[ci]]())) { c[idx[ci]] += c[idx[i]]; c[idx[i]] = 0; } else if (Lit* il = x[idx[i]]()->dynamicCast()) { d += c[idx[i]] * il->v(); c[idx[i]] = 0; } else { ci = i; } } ci = 0; for (unsigned int i = 0; i < c.size(); i++) { if (c[i] != 0) { c[ci] = c[i]; x[ci] = x[i]; ci++; } } c.resize(ci); x.resize(ci); } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/eval_par.hh0000644000175000017500000002354113757304533020062 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include namespace MiniZinc { /// Evaluate par int expression \a e IntVal eval_int(EnvI& env, Expression* e); /// Evaluate par bool expression \a e bool eval_bool(EnvI& env, Expression* e); /// Evaluate par float expression \a e FloatVal eval_float(EnvI& env, Expression* e); /// Evaluate an array expression \a e into an array literal ArrayLit* eval_array_lit(EnvI& env, Expression* e); /// Evaluate an access to array \a with indices \a idx and return whether /// access succeeded in \a success Expression* eval_arrayaccess(EnvI& env, ArrayLit* a, const std::vector& idx, bool& success); /// Evaluate an array access \a e and return whether access succeeded in \a success Expression* eval_arrayaccess(EnvI& env, ArrayAccess* e, bool& success); /// Evaluate a set expression \a e into a set literal SetLit* eval_set_lit(EnvI& env, Expression* e); /// Evaluate a par integer set \a e IntSetVal* eval_intset(EnvI& env, Expression* e); /// Evaluate a par bool set \a e IntSetVal* eval_boolset(EnvI& env, Expression* e); /// Evaluate a par float set \a e FloatSetVal* eval_floatset(EnvI& env, Expression* e); /// Evaluate a par string \a e std::string eval_string(EnvI& env, Expression* e); /// Evaluate a par expression \a e and return it wrapped in a literal Expression* eval_par(EnvI& env, Expression* e); /// Check if variable declaration \a vd satisfies the domain and index set constraints void check_par_declaration(EnvI& env, VarDecl* vd); /// Representation for bounds of an integer expression struct IntBounds { /// Lower bound IntVal l; /// Upper bound IntVal u; /// Whether the bounds are valid bool valid; /// Constructor IntBounds(IntVal l0, IntVal u0, bool valid0) : l(l0), u(u0), valid(valid0) {} }; /// Compute bounds of an integer expression IntBounds compute_int_bounds(EnvI& env, Expression* e); /// Representation for bounds of a float expression struct FloatBounds { /// Lower bound FloatVal l; /// Upper bound FloatVal u; /// Whether the bounds are valid bool valid; /// Constructor FloatBounds(FloatVal l0, FloatVal u0, bool valid0) : l(l0), u(u0), valid(valid0) {} }; /// Compute bounds of an integer expression FloatBounds compute_float_bounds(EnvI& env, Expression* e); /** * \brief Compute bounds of a set of int expression * * Returns NULL if bounds cannot be determined */ IntSetVal* compute_intset_bounds(EnvI& env, Expression* e); class EvalBase { public: /// Evaluate bool expression that may contain variables static bool evalBoolCV(EnvI& env, Expression* e); }; template void eval_comp_array(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, KeepAlive in, std::vector& a); template void eval_comp_set(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, KeepAlive in, std::vector& a); template void eval_comp_set(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, IntVal i, KeepAlive in, std::vector& a) { { GCLock lock; GC::mark(); e->decl(gen, id)->trail(); e->decl(gen, id)->e(IntLit::a(i)); } CallStackItem csi(env, e->decl(gen, id)->id(), i); if (id == e->numberOfDecls(gen) - 1) { bool where = true; if (e->where(gen) != nullptr && !e->where(gen)->type().isvar()) { where = eval.evalBoolCV(env, e->where(gen)); } if (where) { if (gen == e->numberOfGenerators() - 1) { a.push_back(eval.e(env, e->e())); } else { if (e->in(gen + 1) == nullptr) { eval_comp_array(env, eval, e, gen + 1, 0, 0, e->in(gen + 1), a); } else { KeepAlive nextin; Expression* gen_in = e->in(gen + 1); if (gen_in->type().isvar() || gen_in->type().cv()) { gen_in = eval.flatten(env, e->in(gen + 1)); } if (gen_in->type().dim() == 0) { GCLock lock; nextin = new SetLit(Location(), eval_intset(env, gen_in)); } else { GCLock lock; nextin = eval_array_lit(env, gen_in); } if (e->in(gen + 1)->type().dim() == 0) { eval_comp_set(env, eval, e, gen + 1, 0, nextin, a); } else { eval_comp_array(env, eval, e, gen + 1, 0, nextin, a); } } } } } else { eval_comp_set(env, eval, e, gen, id + 1, in, a); } GC::untrail(); e->decl(gen, id)->flat(nullptr); } template void eval_comp_array(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, IntVal i, KeepAlive in, std::vector& a) { GC::mark(); e->decl(gen, id)->trail(); CallStackItem csi(env, e->decl(gen, id)->id(), i); if (in() == nullptr) { // this is an assignment generator Expression* asn = e->where(gen)->type().isPar() ? eval_par(env, e->where(gen)) : eval.flatten(env, e->where(gen)); e->decl(gen, id)->e(asn); e->rehash(); } else { auto* al = in()->cast(); e->decl(gen, id)->e((*al)[static_cast(i.toInt())]); e->rehash(); } if (id == e->numberOfDecls(gen) - 1) { bool where = true; if (e->in(gen) != nullptr && e->where(gen) != nullptr && !e->where(gen)->type().isvar()) { where = eval.evalBoolCV(env, e->where(gen)); } if (where) { if (gen == e->numberOfGenerators() - 1) { a.push_back(eval.e(env, e->e())); } else { if (e->in(gen + 1) == nullptr) { eval_comp_array(env, eval, e, gen + 1, 0, 0, e->in(gen + 1), a); } else { KeepAlive nextin; Expression* gen_in = e->in(gen + 1); if (gen_in->type().isvar() || gen_in->type().cv()) { gen_in = eval.flatten(env, e->in(gen + 1)); } if (gen_in->type().dim() == 0) { GCLock lock; nextin = new SetLit(Location(), eval_intset(env, gen_in)); } else { GCLock lock; nextin = eval_array_lit(env, gen_in); } if (gen_in->type().dim() == 0) { eval_comp_set(env, eval, e, gen + 1, 0, nextin, a); } else { eval_comp_array(env, eval, e, gen + 1, 0, nextin, a); } } } } } else { eval_comp_array(env, eval, e, gen, id + 1, in, a); } GC::untrail(); e->decl(gen, id)->flat(nullptr); } /** * \brief Evaluate comprehension expression * * Calls \a eval.e for every element of the comprehension \a e, * where \a gen is the current generator, \a id is the current identifier * in that generator, \a in is the expression of that generator, and * \a a is the array in which to place the result. */ template void eval_comp_set(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, KeepAlive in, std::vector& a) { IntSetVal* isv = eval_intset(env, in()); if (isv->card().isPlusInfinity()) { throw EvalError(env, in()->loc(), "comprehension iterates over an infinite set"); } IntSetRanges rsi(isv); Ranges::ToValues rsv(rsi); for (; rsv(); ++rsv) { eval_comp_set(env, eval, e, gen, id, rsv.val(), in, a); } } /** * \brief Evaluate comprehension expression * * Calls \a eval.e for every element of the comprehension \a e, * where \a gen is the current generator, \a id is the current identifier * in that generator, \a in is the expression of that generator, and * \a a is the array in which to place the result. */ template void eval_comp_array(EnvI& env, Eval& eval, Comprehension* e, int gen, int id, KeepAlive in, std::vector& a) { auto* al = in()->cast(); for (unsigned int i = 0; i < al->size(); i++) { eval_comp_array(env, eval, e, gen, id, i, in, a); } } /** * \brief Evaluate comprehension expression * * Calls \a eval.e for every element of the comprehension \a e and * returns a vector with all the evaluated results. */ template std::vector eval_comp(EnvI& env, Eval& eval, Comprehension* e) { std::vector a; if (e->in(0) == nullptr) { eval_comp_array(env, eval, e, 0, 0, 0, e->in(0), a); } else { KeepAlive in; { GCLock lock; if (e->in(0)->type().dim() == 0) { if (e->in(0)->type().isvar()) { in = new SetLit(Location(), compute_intset_bounds(env, e->in(0))); } else { in = new SetLit(Location(), eval_intset(env, e->in(0))); } } else { if (e->in(0)->type().isvar()) { in = eval_array_lit(env, eval.flatten(env, e->in(0))); } else { in = eval_array_lit(env, e->in(0)); } } } if (e->in(0)->type().dim() == 0) { eval_comp_set(env, eval, e, 0, 0, in, a); } else { eval_comp_array(env, eval, e, 0, 0, in, a); } } return a; } /** * \brief Evaluate comprehension expression * * Calls \a Eval::e for every element of the comprehension \a e and * returns a vector with all the evaluated results. */ template std::vector eval_comp(EnvI& env, Comprehension* e) { Eval eval; return eval_comp(env, eval, e); } Expression* follow_id(Expression* e); Expression* follow_id_to_decl(Expression* e); Expression* follow_id_to_value(Expression* e); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/json_parser.hh0000644000175000017500000000440213757304533020611 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include namespace MiniZinc { class JSONError : public LocationException { public: JSONError(EnvI& env, const Location& loc, const std::string& msg) : LocationException(env, loc, msg) {} const char* what() const throw() override { return "MiniZinc: JSON parsing error"; } }; class JSONParser { protected: enum TokenT { T_LIST_OPEN, T_LIST_CLOSE, T_OBJ_OPEN, T_OBJ_CLOSE, T_COMMA, T_COLON, T_STRING, T_INT, T_FLOAT, T_BOOL, T_NULL, T_EOF } _t; class Token; EnvI& _env; int _line; int _column; std::string _filename; Location errLocation() const; Token readToken(std::istream& is); void expectToken(std::istream& is, TokenT t); std::string expectString(std::istream& is); void expectEof(std::istream& is); Token parseEnumString(std::istream& is); Expression* parseExp(std::istream& is, bool parseObjects = true, bool possibleString = true); ArrayLit* parseArray(std::istream& is, bool possibleString = true); Expression* parseObject(std::istream& is, bool possibleString = true); void parseModel(Model* m, std::istream& is, bool isData); static Expression* coerceArray(TypeInst* intendedTI, ArrayLit* al); public: JSONParser(EnvI& env) : _env(env) {} /// Parses \a filename as MiniZinc data and creates assign items in \a m void parse(Model* m, const std::string& filename, bool isData = true); /// Parses \a data as JSON-encoded MiniZinc data and creates assign items in \a m void parseFromString(Model* m, const std::string& data, bool isData = true); /// Check if file \a filename may contain JSON-encoded MiniZinc data static bool fileIsJSON(const std::string& filename); /// Check if string \a data may contain JSON-encoded MiniZinc data static bool stringIsJSON(const std::string& data); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/typecheck.hh0000644000175000017500000000603713757304533020251 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { /// Scoped variable declarations class Scopes { protected: typedef IdMap DeclMap; enum ScopeType { ST_TOPLEVEL, ST_FUN, ST_INNER }; struct Scope { /// Map from identifiers to declarations DeclMap m; /// Type of this scope ScopeType st; /// Constructor Scope(ScopeType st0) : st(st0) {} /// Whether this scope is toplevel bool toplevel() const { return st == ST_TOPLEVEL; } }; /// Stack of scopes std::vector _s; public: /// Constructor Scopes(); /// Add a variable declaration void add(EnvI& env, VarDecl* vd); /// Push a new toplevel scope void pushToplevel(); /// Push a new function scope void pushFun(); /// Push a new scope void push(); /// Pop topmost scope void pop(); /// Return declaration for \a ident, or NULL if not found VarDecl* find(Id* ident); /// Find declarations with identifiers similar to \a ident VarDecl* findSimilar(Id* ident); }; /// Topological sorting of items class TopoSorter { public: typedef std::vector Decls; typedef std::unordered_map PosMap; /// List of all declarations Decls decls; /// Scoped declarations Scopes scopes; /// Map from declarations to positions PosMap pos; /// The model Model* model; TopoSorter(Model* model0) : model(model0) {} /// Add a variable declaration item void add(EnvI& env, VarDeclI* vd, bool handleEnums, Model* enumItems); /// Get variable declaration from identifier \a id VarDecl* get(EnvI& env, const ASTString& id, const Location& loc); VarDecl* checkId(EnvI& env, const ASTString& id_v, const Location& loc); VarDecl* checkId(EnvI& env, Id* ident, const Location& loc); /// Run the topological sorting for expression \a e void run(EnvI& env, Expression* e); }; /// Type check the model \a m void typecheck(Env& env, Model* origModel, std::vector& typeErrors, bool ignoreUndefinedParameters, bool allowMultiAssignment, bool isFlatZinc = false); /// Type check new assign item \a ai in model \a m void typecheck(Env& env, Model* m, AssignI* ai); /// Output description of parameters and output variables to \a os void output_model_interface(Env& env, Model* m, std::ostream& os, const std::vector& skipDirs); /// Output information about variable types (enum types) to \a os void output_model_variable_types(Env& env, Model* m, std::ostream& os, const std::vector& skipDirs); std::string create_enum_to_string_name(Id* ident, const std::string& prefix); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/file_utils.hh0000644000175000017500000000731313757304533020427 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include // Macro so that we can use overloaded wide versions of fstream::open for Windows #ifdef _WIN32 #define FILE_PATH(path) MiniZinc::FileUtils::utf8_to_wide(path) #else #define FILE_PATH(path) (path) #endif namespace MiniZinc { namespace FileUtils { /// Return full path to current executable std::string progpath(); /// Test if \a filename exists bool file_exists(const std::string& filename); /// Test if \a dirname exists and is a directory bool directory_exists(const std::string& dirname); /// Find executable \a filename anywhere on the path /// On Windows, also check extensions .exe and .bat std::string find_executable(const std::string& filename); /// Return full path to file. If \a basePath is not empty, also try resolving /// relative paths with respect to \a basePath. std::string file_path(const std::string& filename, const std::string& basePath = std::string()); /// Return directory name containing \a filename std::string dir_name(const std::string& filename); /// Return base name of \a filename (without dir_name) std::string base_name(const std::string& filename); /// Check whether path is absolute bool is_absolute(const std::string& path); /// Return list of files with extension \a ext in directory \a dir std::vector directory_list(const std::string& dir, const std::string& ext = std::string("*")); /// Return share/minizinc directory if present anywhere above the executable std::string share_directory(); /// Return current working directory std::string working_directory(); /// Get global configuration file name (in share/minizinc directory) std::string global_config_file(); /// Get per-user configuration file name (usually in home directory or AppData directory) std::string user_config_file(); /// Get per-user configuration directory name (usually in home directory or AppData directory) std::string user_config_dir(); /// Parse command line \a s into individual arguments std::vector parse_cmd_line(const std::string& s); /// Combine individual arguments \a cmd into properly quoted command line std::string combine_cmd_line(const std::vector& cmd); /// Create a temporary file class TmpFile { private: std::string _name; #ifdef _WIN32 std::vector _tmpNames; #endif #ifndef _WIN32 int _tmpfileDesc; #endif public: // Constructor for file with extension \a ext TmpFile(const std::string& ext); /// Destructor (removes file) ~TmpFile(); std::string name() const { return _name; } }; /// Create a temporary directory class TmpDir { private: std::string _name; public: // Constructor for difrectory TmpDir(); /// Destructor (removes directory) ~TmpDir(); std::string name() const { return _name; } }; /// Inflate string \a s void inflate_string(std::string& s); /// Deflate string \a s std::string deflate_string(const std::string& s); /// Encode string into base 64 std::string encode_base64(const std::string& s); /// Decode string from base 64 std::string decode_base64(const std::string& s); #ifdef _WIN32 /// Convert UTF-16 string to UTF-8 std::string wide_to_utf8(const wchar_t* str, int size = -1); /// Convert UTF-16 string to UTF-8 std::string wide_to_utf8(const std::wstring& str); /// Convert UTF-8 string to UTF-16 std::wstring utf8_to_wide(const std::string& str); #endif } // namespace FileUtils } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/copy.hh0000644000175000017500000000416413757304533017243 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { class CopyMap { protected: typedef std::unordered_map ModelMap; ModelMap _modelMap; ASTNodeWeakMap _nodeMap; public: void insert(Expression* e0, Expression* e1); Expression* find(Expression* e); void insert(Item* e0, Item* e1); Item* find(Item* e); void insert(Model* e0, Model* e1); Model* find(Model* e); void insert(IntSetVal* e0, IntSetVal* e1); IntSetVal* find(IntSetVal* e); void insert(FloatSetVal* e0, FloatSetVal* e1); FloatSetVal* find(FloatSetVal* e); template void insert(ASTExprVec e0, ASTExprVec e1) { _nodeMap.insert(e0.vec(), e1.vec()); } template ASTExprVecO* find(ASTExprVec e) { ASTNode* n = _nodeMap.find(e.vec()); return static_cast*>(n); } void clear() { _modelMap.clear(); _nodeMap.clear(); } }; /// Create a deep copy of expression \a e Expression* copy(EnvI& env, Expression* e, bool followIds = false, bool copyFundecls = false, bool isFlatModel = false); /// Create a deep copy of item \a i Item* copy(EnvI& env, Item* i, bool followIds = false, bool copyFundecls = false, bool isFlatModel = false); /// Create a deep copy of model \a m Model* copy(EnvI& env, Model* m); /// Create a deep copy of expression \a e Expression* copy(EnvI& env, CopyMap& map, Expression* e, bool followIds = false, bool copyFundecls = false, bool isFlatModel = false); /// Create a deep copy of item \a i Item* copy(EnvI& env, CopyMap& map, Item* i, bool followIds = false, bool copyFundecls = false, bool isFlatModel = false); /// Create a deep copy of model \a m Model* copy(EnvI& env, CopyMap& cm, Model* m, bool isFlatModel = false); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solver_instance.hh0000644000175000017500000000150613757304533021464 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class SolverInstanceBase; class SolverInstance { protected: SolverInstanceBase* _si; public: enum Status { OPT, // For SAT problems this means "search complete" SAT, UNSAT, UNBND, UNSATorUNBND, UNKNOWN, ERROR, NONE }; enum StatusReason { SR_OK = -5, SR_TIME, SR_MEMORY, SR_LIMIT, SR_ERROR }; }; const SolverInstance::Status SolverInstance__ERROR = SolverInstance::ERROR; // just in case... } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/utils_savestream.hh0000644000175000017500000000235213757304533021660 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { /// Helper class to redirect, e.g., stdout to stderr class StreamRedir { /// The stream to be changed FILE* const _file0; /* * Structure for retaining information about a stream, sufficient to * recreate that stream later on. * See * https://stackoverflow.com/questions/4760201/how-do-i-suppress-output-while-using-a-dynamic-library */ struct StreamInfo { int fd = -1; fpos_t pos; }; /// The original stream StreamInfo _streamInfo; public: /// Constructs with the stream to be changed // StreamRedir(FILE* s0); /// Constructs with s0 and replaces it by s1 StreamRedir(FILE* s0, FILE* s1, bool fFlush = true); ~StreamRedir(); /// Restore original void restore(bool fFLush = true); protected: /// Replace & save stream by s1 void replaceStream(FILE* s1, bool fFlush = true); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/gc.hh0000644000175000017500000001505113757304533016657 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include //#define MINIZINC_GC_STATS #if defined(MINIZINC_GC_STATS) #include struct GCStat { int first; int second; int keepalive; int inmodel; size_t total; GCStat() : first(0), second(0), keepalive(0), inmodel(0), total(0) {} }; #define MINIZINC_GC_STAT_ARGS std::map& gc_stats #else #define MINIZINC_GC_STAT_ARGS #endif namespace MiniZinc { /** * \brief Base class for abstract syntax tree nodes */ class ASTNode { friend class GC; protected: /// Mark for garbage collection mutable unsigned int _gcMark : 1; /// Id of the node unsigned int _id : 7; /// Secondary id unsigned int _secondaryId : 7; /// Flag unsigned int _flag1 : 1; /// Flag unsigned int _flag2 : 1; enum BaseNodes { NID_FL, NID_CHUNK, NID_VEC, NID_STR, NID_END = NID_STR }; /// Constructor ASTNode(unsigned int id) : _gcMark(0), _id(id) {} public: /// Allocate node void* operator new(size_t size); /// Placement-new void* operator new(size_t /*s*/, void* n) throw() { return n; } /// Delete node (no-op) void operator delete(void* /*n*/, size_t /*s*/) throw() {} /// Delete node (no-op) void operator delete(void* /*n*/, void* /*m*/) throw() {} /// Delete node (no-op) void operator delete(void* /*n*/) throw() {} }; /** * \brief Base class for unstructured garbage collected data */ class ASTChunk : public ASTNode { friend class GC; protected: /// Allocated size size_t _size; /// Storage char _data[4]; /// Constructor ASTChunk(size_t size, unsigned int id = ASTNode::NID_CHUNK); /// Actual size of object in memory size_t memsize() const { size_t s = sizeof(ASTChunk) + (_size <= 4 ? 0 : _size - 4) * sizeof(char); s += ((8 - (s & 7)) & 7); return s; } /// Allocate raw memory static void* alloc(size_t size); }; /** * \brief Base class for structured garbage collected data */ class ASTVec : public ASTNode { friend class GC; protected: /// Allocated size size_t _size; /// Storage void* _data[2]; /// Constructor ASTVec(size_t size); /// Actual size of object in memory size_t memsize() const { size_t s = sizeof(ASTVec) + (_size <= 2 ? 0 : _size - 2) * sizeof(void*); s += ((8 - (s & 7)) & 7); return s; } /// Allocate raw memory static void* alloc(size_t size); }; class Expression; class GCMarker; class KeepAlive; class WeakRef; class ASTNodeWeakMap; class ASTStringData; /// Garbage collector class GC { friend class ASTNode; friend class ASTVec; friend class ASTChunk; friend class ASTStringData; friend class KeepAlive; friend class WeakRef; friend class ASTNodeWeakMap; private: class Heap; /// The memory controlled by the collector Heap* _heap; /// Count how many locks are currently active unsigned int _lockCount; /// Timeout in milliseconds unsigned long long int _timeout; /// Counter for timeout int _timeoutCount; /// Timer for timeout Timer _timeoutTimer; /// Return thread-local GC object static GC*& gc(); /// Constructor GC(); /// Allocate garbage collected memory void* alloc(size_t size); static void addKeepAlive(KeepAlive* e); static void removeKeepAlive(KeepAlive* e); static void addWeakRef(WeakRef* e); static void removeWeakRef(WeakRef* e); static void addNodeWeakMap(ASTNodeWeakMap* m); static void removeNodeWeakMap(ASTNodeWeakMap* m); public: /// Acquire garbage collector lock for this thread static void lock(); /// Release garbage collector lock for this thread static void unlock(); /// Manually trigger garbage collector (must be unlocked) static void trigger(); /// Test if garbage collector is locked static bool locked(); /// Add model \a m to root set static void add(GCMarker* m); /// Remove model \a m from root set static void remove(GCMarker* m); /// Put a mark on the trail static void mark(); /// Add a trail entry static void trail(Expression** l, Expression* v); /// Untrail to previous mark static void untrail(); /// Set timeout of \a t milliseconds, 0 means disable static void setTimeout(unsigned long long int t); /// Return maximum allocated memory (high water mark) static size_t maxMem(); }; /// Automatic garbage collection lock class GCLock { public: /// Acquire lock GCLock(); /// Release lock upon destruction ~GCLock(); }; /// Expression wrapper that is a member of the root set class KeepAlive { friend class GC; private: Expression* _e; KeepAlive* _p; KeepAlive* _n; public: KeepAlive(Expression* e = nullptr); ~KeepAlive(); KeepAlive(const KeepAlive& e); KeepAlive& operator=(const KeepAlive& e); Expression* operator()() { return _e; } Expression* operator()() const { return _e; } KeepAlive* next() const { return _n; } }; /// Expression wrapper that is a member of the root set class WeakRef { friend class GC; private: Expression* _e; WeakRef* _p; WeakRef* _n; bool _valid; public: WeakRef(Expression* e = nullptr); ~WeakRef(); WeakRef(const WeakRef& e); WeakRef& operator=(const WeakRef& e); Expression* operator()() { return _valid ? _e : nullptr; } Expression* operator()() const { return _valid ? _e : nullptr; } WeakRef* next() const { return _n; } }; class ASTNodeWeakMap { friend class GC; private: ASTNodeWeakMap(const WeakRef& e); ASTNodeWeakMap& operator=(const ASTNodeWeakMap& e); protected: typedef std::unordered_map NodeMap; ASTNodeWeakMap* _p; ASTNodeWeakMap* _n; ASTNodeWeakMap* next() const { return _n; } NodeMap _m; public: ASTNodeWeakMap(); ~ASTNodeWeakMap(); void insert(ASTNode* n0, ASTNode* n1); ASTNode* find(ASTNode* n); void clear() { _m.clear(); } }; /** * \brief Abstract base class for object containing garbage collected data */ class GCMarker { friend class GC; private: /// Previous object in root set list GCMarker* _rootsPrev = nullptr; /// Next object in root set list GCMarker* _rootsNext = nullptr; protected: /// Mark garbage collected objects that virtual void mark(MINIZINC_GC_STAT_ARGS) = 0; public: GCMarker() { GC::add(this); } virtual ~GCMarker() { GC::remove(this); } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/0000755000175000017500000000000013757304533017440 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solvers/geas_solverinstance.hh0000644000175000017500000001000413757304533024012 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { class GeasOptions : public SolverInstanceBase::Options { public: bool allSolutions = false; int conflicts = 0; bool freeSearch = false; int nrSolutions = 1; int objProbeLimit = 0; bool statistics = false; std::chrono::milliseconds time = std::chrono::milliseconds(0); }; class GeasVariable { public: enum Type { BOOL_TYPE, FLOAT_TYPE, INT_TYPE }; protected: Type _t; // Type of the variable union { geas::patom_t bv; geas::fp::fpvar fv; geas::intvar iv; }; public: explicit GeasVariable(const geas::patom_t& bv0) : _t(BOOL_TYPE), bv(bv0){}; explicit GeasVariable(const geas::fp::fpvar& fv0) : _t(FLOAT_TYPE), fv(fv0){}; explicit GeasVariable(const geas::intvar& iv0) : _t(INT_TYPE), iv(iv0){}; GeasVariable(const GeasVariable& gv) : _t(gv._t) { switch (_t) { case BOOL_TYPE: bv = gv.bv; break; case FLOAT_TYPE: fv = gv.fv; break; case INT_TYPE: iv = gv.iv; break; } } bool isBool() const { return _t == BOOL_TYPE; } bool isFloat() const { return _t == FLOAT_TYPE; } bool isInt() const { return _t == INT_TYPE; } geas::patom_t boolVar() const { return bv; } geas::fp::fpvar floatVar() const { return fv; } geas::intvar intVar() const { return iv; } }; class GeasTypes { public: typedef GeasVariable Variable; typedef MiniZinc::Statistics Statistics; }; class GeasSolverInstance : public SolverInstanceImpl { public: GeasSolverInstance(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); ~GeasSolverInstance() override = default; void processFlatZinc() override; geas::solver_data* solverData() const { return _solver.data; } geas::solver& solver() { return _solver; } Status solve() override; Status next() override { return SolverInstance::ERROR; } // TODO: Implement void resetSolver() override; Expression* getSolutionValue(Id* id) override; void printStatistics() override; // MiniZinc to Geas conversions bool asBool(Expression* e) { return eval_bool(env().envi(), e); } vec asBool(ArrayLit* al); geas::patom_t asBoolVar(Expression* e); vec asBoolVar(ArrayLit* al); vec asInt(ArrayLit* al); int asInt(Expression* e) { return static_cast(eval_int(env().envi(), e).toInt()); } geas::intvar asIntVar(Expression* e); vec asIntVar(ArrayLit* al); // TODO: create only when necessary or use Geas internal geas::intvar zero; protected: geas::solver _solver; Model* _flat; SolveI::SolveType _objType = SolveI::ST_SAT; std::unique_ptr _objVar; GeasTypes::Variable& resolveVar(Expression* e); bool addSolutionNoGood(); void registerConstraint(const std::string& name, poster p); void registerConstraints(); }; class GeasSolverFactory : public SolverFactory { public: GeasSolverFactory(); SolverInstanceBase::Options* createOptions() override; SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override; std::string getDescription(SolverInstanceBase::Options* opt) override { return "Elsie Geas - Another Lazy Clause Generation Solver"; }; std::string getVersion(SolverInstanceBase::Options* opt) override { return "0.0.1"; } std::string getId() override { return "org.minizinc.geas"; } bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void printHelp(std::ostream& os) override; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/gecode_solverinstance.hh0000644000175000017500000003150113757304533024326 0ustar kaolkaol/* * Main authors: * Kevin Leo * Andrea Rendl * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #if GECODE_VERSION_NUMBER < 600000 #error Gecode versions before 6.0 are not supported #endif #define MZ_IntConLevel Gecode::IntPropLevel #define MZ_ICL_VAL Gecode::IPL_VAL #define MZ_ICL_DOM Gecode::IPL_DOM #define MZ_ICL_BND Gecode::IPL_BND #define MZ_ICL_DEF Gecode::IPL_DEF #define MZ_EPK_DEF Gecode::IPL_DEF namespace MiniZinc { /* class GecodeVariable { public: enum vartype {BOOL_TYPE,FLOAT_TYPE,INT_TYPE,SET_TYPE}; protected: Gecode::VarImpBase* _var; vartype _t; /// the index in FznSpace::bv of the boolean variable that corresponds to the int var; if not exists then -1 int _boolAliasIndex; public: GecodeVariable(Gecode::IntVar& x) : _var(x.varimp()), _t(INT_TYPE), _boolAliasIndex(-1) {} GecodeVariable(Gecode::BoolVar& x) : _var(x.varimp()), _t(BOOL_TYPE), _boolAliasIndex(-1) {} GecodeVariable(Gecode::FloatVar& x) : _var(x.varimp()), _t(FLOAT_TYPE), _boolAliasIndex(-1) {} GecodeVariable(Gecode::SetVar& x) : _var(x.varimp()), _t(SET_TYPE), _boolAliasIndex(-1) {} Gecode::IntVar intVar(void) { assert(_t == INT_TYPE); Gecode::Int::IntView iv(static_cast(_var)); return Gecode::IntVar(iv); } Gecode::BoolVar boolVar(void) { assert(_t == BOOL_TYPE); Gecode::Int::BoolView bv(static_cast(_var)); return Gecode::BoolVar(bv); } Gecode::FloatVar floatVar(void) { assert(_t == FLOAT_TYPE); Gecode::Float::FloatView fv(static_cast(_var)); return Gecode::FloatVar(fv); } Gecode::SetVar setVar(void) { assert(_t == FLOAT_TYPE); Gecode::Set::SetView sv(static_cast(_var)); return Gecode::SetVar(sv); } bool isint(void) const { return _t == INT_TYPE; } bool isbool(void) const { return _t == BOOL_TYPE; } bool isfloat(void) const { return _t == FLOAT_TYPE; } bool isset(void) const { return _t == SET_TYPE; } bool hasBoolAlias(void) { return _boolAliasIndex >= 0; } /// set the index in FznSpace::bv of the Boolean variable that corresponds to the int variable void setBoolAliasIndex(int index) { assert(_t == INT_TYPE); assert(index >= 0); _boolAliasIndex = index; } int boolAliasIndex(void) { return _boolAliasIndex; } vartype t(void) const { return _t; } }; */ class GecodeVariable { public: enum vartype { BOOL_TYPE, FLOAT_TYPE, INT_TYPE, SET_TYPE }; protected: /// variable type vartype _t; /// the index in the iv/bv/fv/sv array in the space, depending the type _t unsigned int _index; /// the index in FznSpace::bv of the boolean variable that corresponds to the int var; if not /// exists then -1 int _boolAliasIndex; public: GecodeVariable(vartype t, unsigned int index) : _t(t), _index(index), _boolAliasIndex(-1) {} bool isint() const { return _t == INT_TYPE; } bool isbool() const { return _t == BOOL_TYPE; } bool isfloat() const { return _t == FLOAT_TYPE; } bool isset() const { return _t == SET_TYPE; } bool hasBoolAlias() const { return _boolAliasIndex >= 0; } /// set the index in FznSpace::bv of the Boolean variable that corresponds to the int variable void setBoolAliasIndex(unsigned int index) { assert(_t == INT_TYPE); _boolAliasIndex = static_cast(index); } int boolAliasIndex() const { return _boolAliasIndex; } unsigned int index() const { return _index; } Gecode::IntVar& intVar(MiniZinc::FznSpace* space) const { assert(_t == INT_TYPE); assert(_index < space->iv.size()); return space->iv[_index]; } Gecode::BoolVar& boolVar(MiniZinc::FznSpace* space) const { assert(_t == BOOL_TYPE); assert(_index < space->bv.size()); return space->bv[_index]; } #ifdef GECODE_HAS_FLOAT_VARS Gecode::FloatVar& floatVar(MiniZinc::FznSpace* space) const { assert(_t == FLOAT_TYPE); assert(_index < space->fv.size()); return space->fv[_index]; } #endif #ifdef GECODE_HAS_SET_VARS Gecode::SetVar& setVar(MiniZinc::FznSpace* space) const { assert(_t == SET_TYPE); assert(_index < space->sv.size()); return space->sv[_index]; } #endif }; class GecodeSolver { public: typedef GecodeVariable Variable; typedef MiniZinc::Statistics Statistics; }; class GecodeEngine; class GecodeOptions : public SolverInstanceBase::Options { public: bool allowUnboundedVars = false; bool onlyRangeDomains = false; bool sac = false; bool shave = false; bool verbose = false; unsigned int prePasses = 0; bool statistics = false; bool allSolutions = false; int nSolutions = -1; unsigned int c_d = 8; // NOLINT(readability-identifier-naming) unsigned int a_d = 2; // NOLINT(readability-identifier-naming) int nodes = 0; int fails = 0; int time = 0; int seed = 1; double decay = 0.5; }; class GecodeSolverInstance : public SolverInstanceImpl { private: bool _printStats; bool _onlyRangeDomains; bool _runSac; bool _runShave; unsigned int _prePasses; bool _allSolutions; int _nMaxSolutions; int _nFoundSolutions; bool _allowUnboundedVars; Model* _flat; public: /// the Gecode space that will be/has been solved FznSpace* currentSpace; /// the solution (or NULL if does not exist or not yet computed) FznSpace* solution; /// the variable declarations with output annotations std::vector varsWithOutput; /// declaration map for processing and printing output // typedef std::pair DE; // ASTStringMap::t _declmap; /// TODO: we can probably get rid of this std::unordered_map*> arrayMap; /// The solver engine GecodeEngine* engine; Gecode::Search::Options engineOptions; GecodeSolverInstance(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); ~GecodeSolverInstance() override; Status next() override; void processFlatZinc() override; Status solve() override; void resetSolver() override; // Presolve the currently loaded model, updating variables with the same // names in the given Model* originalModel. bool presolve(Model* originalModel = nullptr); bool sac(bool toFixedPoint, bool shaving) const; void printStatistics() override; void processSolution(bool last_sol = false); Expression* getSolutionValue(Id* id) override; Gecode::Space* getGecodeModel(); // helpers for getting correct int bounds static bool valueWithinBounds(double b); // helper functions for processing flatzinc constraints /// Convert \a arg (array of integers) to IntArgs static Gecode::IntArgs arg2intargs(Expression* arg, int offset = 0); /// Convert \a arg (array of Booleans) to IntArgs static Gecode::IntArgs arg2boolargs(Expression* arg, int offset = 0); /// Convert \a n to IntSet Gecode::IntSet arg2intset(EnvI& envi, Expression* arg); /// Convert \a n to IntSetArgs Gecode::IntSetArgs arg2intsetargs(EnvI& envi, Expression* arg, int offset = 0); /// Convert \a arg to IntVarArgs Gecode::IntVarArgs arg2intvarargs(Expression* arg, int offset = 0); /// Convert \a arg to BoolVarArgs Gecode::BoolVarArgs arg2boolvarargs(Expression* a, int offset = 0, int siv = -1); /// Convert \a n to BoolVar Gecode::BoolVar arg2boolvar(Expression* e); /// Convert \a n to IntVar Gecode::IntVar arg2intvar(Expression* e); /// Convert \a n to SetVar Gecode::SetVar arg2setvar(Expression* e); /// Convert \a arg to SetVarArgs Gecode::SetVarArgs arg2setvarargs(Expression* arg, int offset = 0, int doffset = 0, const Gecode::IntSet& od = Gecode::IntSet::empty); /// convert \a arg to an ArrayLit (throws InternalError if not possible) ArrayLit* arg2arraylit(Expression* arg); /// Check if \a b is array of Booleans (or has a single integer) bool isBoolArray(ArrayLit* a, int& singleInt); #ifdef GECODE_HAS_FLOAT_VARS /// Convert \a n to FloatValArgs static Gecode::FloatValArgs arg2floatargs(Expression* arg, int offset = 0); /// Convert \a n to FloatVar Gecode::FloatVar arg2floatvar(Expression* e); /// Convert \a n to FloatVarArgs Gecode::FloatVarArgs arg2floatvarargs(Expression* arg, int offset = 0); #endif /// Convert \a ann to IntConLevel static MZ_IntConLevel ann2icl(const Annotation& ann); /// convert the annotation \a s int variable selection to the respective Gecode var selection static Gecode::TieBreak ann2ivarsel(ASTString s, Gecode::Rnd& rnd, double decay); /// convert the annotation \a s int value selection to the respective Gecode val selection static Gecode::IntValBranch ann2ivalsel(ASTString s, std::string& r0, std::string& r1, Gecode::Rnd& rnd); /// convert assign value selection static Gecode::IntAssign ann2asnivalsel(ASTString s, Gecode::Rnd& rnd); static Gecode::TieBreak ann2bvarsel(ASTString s, Gecode::Rnd& rnd, double decay); /// convert the annotation \a s int value selection to the respectbve Gecode val selection static Gecode::BoolValBranch ann2bvalsel(ASTString s, std::string& r0, std::string& r1, Gecode::Rnd& rnd); /// convert assign value selection static Gecode::BoolAssign ann2asnbvalsel(ASTString s, Gecode::Rnd& rnd); #ifdef GECODE_HAS_SET_VARS static Gecode::SetVarBranch ann2svarsel(ASTString s, Gecode::Rnd& rnd, double decay); static Gecode::SetValBranch ann2svalsel(ASTString s, std::string& r0, std::string& r1, Gecode::Rnd& rnd); #endif #ifdef GECODE_HAS_FLOAT_VARS static Gecode::TieBreak ann2fvarsel(ASTString s, Gecode::Rnd& rnd, double decay); static Gecode::FloatValBranch ann2fvalsel(ASTString s, std::string& r0, std::string& r1); #endif /// Returns the VarDecl of \a expr and throws an InternalError if not possible VarDecl* getVarDecl(Expression* expr); /// Returns the VarDecl of \a aa VarDecl* resolveArrayAccess(ArrayAccess* aa); /// Returns the VarDecl of \a array at index \a index VarDecl* resolveArrayAccess(VarDecl* vd, long long int index); /// Returns the GecodeVariable representing the Id, VarDecl or ArrayAccess GecodeSolver::Variable resolveVar(Expression* e); /// Inserts variable gv into _variableMap with key id void insertVar(Id* id, GecodeVariable gv); protected: void registerConstraints(); void registerConstraint(const std::string& name, poster p); /// creates the gecode branchers // TODO: what is decay, ignoreUnknown -> do we need all the args? void createBranchers(Annotation& ann, Expression* additionalAnn, int seed, double decay, bool ignoreUnknown, std::ostream& err); void prepareEngine(); void setSearchStrategyFromAnnotation( std::vector flatAnn, std::vector& iv_searched, std::vector& bv_searched, #ifdef GECODE_HAS_SET_VARS std::vector& sv_searched, #endif #ifdef GECODE_HAS_FLOAT_VARS std::vector& fv_searched, #endif Gecode::TieBreak& def_int_varsel, Gecode::IntValBranch& def_int_valsel, Gecode::TieBreak& def_bool_varsel, Gecode::BoolValBranch& def_bool_valsel, #ifdef GECODE_HAS_SET_VARS Gecode::SetVarBranch& def_set_varsel, Gecode::SetValBranch& def_set_valsel, #endif #ifdef GECODE_HAS_FLOAT_VARS Gecode::TieBreak& def_float_varsel, Gecode::FloatValBranch& def_float_valsel, #endif Gecode::Rnd& rnd, double decay, bool ignoreUnknown, std::ostream& err); }; class GecodeSolverFactory : public SolverFactory { public: GecodeSolverFactory(); SolverInstanceBase::Options* createOptions() override; SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override; std::string getDescription(SolverInstanceBase::Options* opt = nullptr) override; std::string getVersion(SolverInstanceBase::Options* opt = nullptr) override; std::string getId() override { return "org.minizinc.gecode_presolver"; } bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void printHelp(std::ostream& os) override; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/fzn_solverinstance.hh0000644000175000017500000000516213757304533023701 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include //#include namespace MiniZinc { class FZNSolverOptions : public SolverInstanceBase::Options { public: std::string fznSolver; std::string backend; std::vector fznFlags; int numSols = 1; std::string parallel; int fznTimeLimitMilliseconds = 0; int solverTimeLimitMilliseconds = 0; bool fznSigint = false; /// Number of (optimal) solutions to output bool numOptimal = true; bool allOptimal = false; bool fznNeedsPaths = false; bool fznOutputPassthrough = false; bool supportsA = false; bool supportsN = false; bool supportsF = false; bool supportsP = false; bool supportsS = false; bool supportsR = false; bool supportsV = false; bool supportsT = false; bool supportsI = false; bool supportsNO = false; bool supportsAO = false; bool supportsCpprofiler = false; std::vector fznSolverFlags; }; class FZNSolverInstance : public SolverInstanceBase { private: std::string _fznSolver; protected: Model* _fzn; Model* _ozn; public: FZNSolverInstance(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); ~FZNSolverInstance() override; Status next() override { return SolverInstance::ERROR; } Status solve() override; void processFlatZinc() override; void resetSolver() override; protected: static Expression* getSolutionValue(Id* id); }; class FZNSolverFactory : public SolverFactory { protected: SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override; public: FZNSolverFactory(); SolverInstanceBase::Options* createOptions() override; std::string getDescription(SolverInstanceBase::Options* opt = nullptr) override; std::string getVersion(SolverInstanceBase::Options* opt = nullptr) override; std::string getId() override; bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void printHelp(std::ostream& os) override; static void setAcceptedFlags(SolverInstanceBase::Options* opt, const std::vector& flags); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/0000755000175000017500000000000013757304533020065 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_cplex_wrap.hh0000644000175000017500000003370713757304533023271 0ustar kaolkaol /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include // add -DCPLEX_STUDIO_DIR=/opt/ibm/ILOG/CPLEX_Studio1261 to the 1st call of cmake class MIPCplexWrapper : public MIPWrapper { CPXENVptr _env = nullptr; CPXLPptr _lp = nullptr; int _status; char _cplexBuffer[CPXMESSAGEBUFSIZE]; char _cplexStatusBuffer[CPXMESSAGEBUFSIZE]; std::vector _x; #ifdef CPLEX_PLUGIN void* _cplexDll; #endif public: class FactoryOptions { public: bool processOption(int& i, std::vector& argv, const std::string& workingDir); std::string cplexDll; }; class Options : public MiniZinc::SolverInstanceBase::Options { public: int nMIPFocus = 0; int nThreads = 1; std::string sExportModel; int nTimeout = -1; long int nSolLimit = -1; int nSeed = -1; double nWorkMemLimit = 0.5; // although CPLEX 12.10 has default 2GB std::string sNodefileDir; std::string sReadParams; std::string sWriteParams; bool flagIntermediate = false; double absGap = -1; double relGap = 1e-8; double intTol = 1e-8; double objDiff = 1.0; std::unordered_map extraParams; bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); static void printHelp(std::ostream& os); }; private: FactoryOptions& _factoryOptions; Options* _options = nullptr; public: MIPCplexWrapper(FactoryOptions& factoryOpt, Options* opt) : _factoryOptions(factoryOpt), _options(opt) { openCPLEX(); } ~MIPCplexWrapper() override { closeCPLEX(); } static std::string getDescription(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getVersion(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getId(); static std::string getName(); static std::vector getTags(); static std::vector getStdFlags(); static std::vector getRequiredFlags(FactoryOptions& factoryOpt); static std::vector getFactoryFlags(); static std::vector getExtraFlags(FactoryOptions& factoryOpt); // Statistics& getStatistics() { return _statistics; } // IloConstraintArray *userCuts, *lazyConstraints; /// derived should overload and call the ancestor // virtual void cleanup(); void checkDLL(); void openCPLEX(); void closeCPLEX(); /// actual adding new variables to the solver void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names) override; /// adding a linear constraint void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = "") override; void setVarBounds(int iVar, double lb, double ub) override; void setVarLB(int iVar, double lb) override; void setVarUB(int iVar, double ub) override; /// Indicator constraint: x[iBVar]==bVal -> lin constr void addIndicatorConstraint(int iBVar, int bVal, int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, const std::string& rowName = "") override; bool addWarmStart(const std::vector& vars, const std::vector& vals) override; /// adding an implication // virtual void addImpl() = 0; void setObjSense(int s) override; // +/-1 for max/min double getInfBound() override { return CPX_INFBOUND; } int getNCols() override { return dll_CPXgetnumcols(_env, _lp); } int getNRows() override { return dll_CPXgetnumrows(_env, _lp); } // void setObjUB(double ub) { objUB = ub; } // void addQPUniform(double c) { qpu = c; } // also sets problem type to MIQP unless c=0 void solve() override; /// OUTPUT: const double* getValues() override { return output.x; } double getObjValue() override { return output.objVal; } double getBestBound() override { return output.bestBound; } double getCPUTime() override { return output.dCPUTime; } Status getStatus() override { return output.status; } std::string getStatusName() override { return output.statusName; } int getNNodes() override { return output.nNodes; } int getNOpen() override { return output.nOpenNodes; } // virtual int getNNodes() = 0; // virtual double getTime() = 0; // CPLEX API // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddfuncdest)(CPXCENVptr, CPXCHANNELptr, void*, void (*msgfunction)(void*, const char*)); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddindconstr)(CPXCENVptr, CPXLPptr, int, int, int, double, int, int const*, double const*, char const*); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddlazyconstraints)(CPXCENVptr env, CPXLPptr lp, int rcnt, int nzcnt, double const* rhs, char const* sense, int const* rmatbeg, int const* rmatind, double const* rmatval, char** rowname); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddmipstarts)(CPXCENVptr env, CPXLPptr lp, int mcnt, int nzcnt, int const* beg, int const* varindices, double const* values, int const* effortlevel, char** mipstartname); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddrows)(CPXCENVptr env, CPXLPptr lp, int ccnt, int rcnt, int nzcnt, double const* rhs, char const* sense, int const* rmatbeg, int const* rmatind, double const* rmatval, char** colname, char** rowname); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXaddusercuts)(CPXCENVptr env, CPXLPptr lp, int rcnt, int nzcnt, double const* rhs, char const* sense, int const* rmatbeg, int const* rmatind, double const* rmatval, char** rowname); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXchgbds)(CPXCENVptr env, CPXLPptr lp, int cnt, int const* indices, char const* lu, double const* bd); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXchgmipstarts)(CPXCENVptr env, CPXLPptr lp, int mcnt, int const* mipstartindices, int nzcnt, int const* beg, int const* varindices, double const* values, int const* effortlevel); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXchgobjsen)(CPXCENVptr env, CPXLPptr lp, int maxormin); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXcloseCPLEX)(CPXENVptr* env_p); // NOLINTNEXTLINE(readability-identifier-naming) CPXLPptr (*dll_CPXcreateprob)(CPXCENVptr env, int* status_p, char const* probname_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXcutcallbackadd)(CPXCENVptr env, void* cbdata, int wherefrom, int nzcnt, double rhs, int sense, int const* cutind, double const* cutval, int purgeable); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXfreeprob)(CPXCENVptr env, CPXLPptr* lp_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetbestobjval)(CPXCENVptr env, CPXCLPptr lp, double* objval_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetcallbackincumbent)(CPXCENVptr env, void* cbdata, int wherefrom, double* x, int begin, int end); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetcallbackinfo)(CPXCENVptr env, void* cbdata, int wherefrom, int whichinfo, void* result_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetcallbacknodeinfo)(CPXCENVptr env, void* cbdata, int wherefrom, int nodeindex, int whichinfo, void* result_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetcallbacknodex)(CPXCENVptr env, void* cbdata, int wherefrom, double* x, int begin, int end); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetchannels)(CPXCENVptr env, CPXCHANNELptr* cpxresults_p, CPXCHANNELptr* cpxwarning_p, CPXCHANNELptr* cpxerror_p, CPXCHANNELptr* cpxlog_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetdettime)(CPXCENVptr env, double* dettimestamp_p); // NOLINTNEXTLINE(readability-identifier-naming) CPXCCHARptr (*dll_CPXgeterrorstring)(CPXCENVptr env, int errcode, char* buffer_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetmipstartindex)(CPXCENVptr env, CPXCLPptr lp, char const* lname_str, int* index_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetnodecnt)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetnodeleftcnt)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetnumcols)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetnumrows)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetobjsen)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetobjval)(CPXCENVptr env, CPXCLPptr lp, double* objval_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetsolnpoolnumsolns)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetstat)(CPXCENVptr env, CPXCLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) CPXCHARptr (*dll_CPXgetstatstring)(CPXCENVptr env, int statind, char* buffer_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgettime)(CPXCENVptr env, double* timestamp_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetx)(CPXCENVptr env, CPXCLPptr lp, double* x, int begin, int end); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXmipopt)(CPXCENVptr env, CPXLPptr lp); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXnewcols)(CPXCENVptr env, CPXLPptr lp, int ccnt, double const* obj, double const* lb, double const* ub, char const* xctype, char** colname); // NOLINTNEXTLINE(readability-identifier-naming) CPXENVptr (*dll_CPXopenCPLEX)(int* status_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXreadcopyparam)(CPXENVptr env, char const* filename_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetdblparam)(CPXENVptr env, int whichparam, double newvalue); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetinfocallbackfunc)(CPXENVptr env, int (*callback)(CPXCENVptr, void*, int, void*), void* cbhandle); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetintparam)(CPXENVptr env, int whichparam, CPXINT newvalue); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetstrparam)(CPXENVptr env, int whichparam, char const* newvalue); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetlazyconstraintcallbackfunc)(CPXENVptr env, int (*lazyconcallback)(CALLBACK_CUT_ARGS), void* cbhandle); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetusercutcallbackfunc)(CPXENVptr env, int (*cutcallback)(CALLBACK_CUT_ARGS), void* cbhandle); // NOLINTNEXTLINE(readability-identifier-naming) CPXCCHARptr (*dll_CPXversion)(CPXCENVptr env); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXwriteparam)(CPXCENVptr env, char const* filename_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXwriteprob)(CPXCENVptr env, CPXCLPptr lp, char const* filename_str, char const* filetype_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetparamname)(CPXCENVptr env, int whichparam, char* name_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetparamnum)(CPXCENVptr env, char const* name_str, int* whichparam_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXgetparamtype)(CPXCENVptr env, int whichparam, int* paramtype); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXinfodblparam)(CPXCENVptr env, int whichparam, double* defvalue_p, double* minvalue_p, double* maxvalue_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXinfointparam)(CPXCENVptr env, int whichparam, CPXINT* defvalue_p, CPXINT* minvalue_p, CPXINT* maxvalue_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXinfolongparam)(CPXCENVptr env, int whichparam, CPXLONG* defvalue_p, CPXLONG* minvalue_p, CPXLONG* maxvalue_p); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXinfostrparam)(CPXCENVptr env, int whichparam, char* defvalue_str); // NOLINTNEXTLINE(readability-identifier-naming) int (*dll_CPXsetlongparam)(CPXENVptr env, int whichparam, CPXLONG newvalue); protected: void wrapAssert(bool cond, const std::string& msg, bool fTerm = true); /// Need to consider the 100 status codes in CPLEX and change with every version? TODO Status convertStatus(int cplexStatus); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_solverinstance.hpp0000644000175000017500000012065613757304533024354 0ustar kaolkaol#include #include #include namespace MiniZinc { template MIPSolverFactory::MIPSolverFactory() : _factoryOptions() { for (auto& flag : MIPWrapper::getFactoryFlags()) { get_global_solver_registry()->addFactoryFlag(flag, this); } } template bool MIPSolverFactory::processFactoryOption(int& i, std::vector& argv, const std::string& workingDir) { return _factoryOptions.processOption(i, argv, workingDir); } template void MIPSolverFactory::factoryOptionsFinished() { _extraFlags = MIPWrapper::getExtraFlags(_factoryOptions); SolverConfig sc(getId(), MIPWrapper::getVersion(_factoryOptions, nullptr)); sc.name(MIPWrapper::getName()); sc.mznlib(MIPWrapper::getMznLib()); sc.mznlibVersion(1); sc.supportsMzn(true); sc.description(MIPWrapper::getDescription(_factoryOptions, nullptr)); sc.requiredFlags(MIPWrapper::getRequiredFlags(_factoryOptions)); sc.tags(MIPWrapper::getTags()); sc.stdFlags(MIPWrapper::getStdFlags()); sc.extraFlags(_extraFlags); SolverConfigs::registerBuiltinSolver(sc); } template bool MIPSolverFactory::processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir) { CLOParser cop(i, argv); auto& options = static_cast(*opt); if (cop.get("-v --verbose-solving")) { options.verbose = true; return true; } if (cop.get("-s --solver-statistics")) { options.printStatistics = true; return true; } if (options.processOption(i, argv, workingDir)) { return true; } // Add any command line extra flags for (const auto& flag : _extraFlags) { if (flag.flagType == SolverConfig::ExtraFlag::FlagType::T_BOOL && flag.range.empty() && cop.get(flag.flag.c_str())) { options.extraParams.emplace(flag.flag, "true"); return true; } std::string buffer; if (cop.get(flag.flag.c_str(), &buffer)) { if (flag.validate(buffer)) { options.extraParams.emplace(flag.flag, buffer); return true; } return false; } } return false; } template std::string MIPSolverFactory::getDescription(SolverInstanceBase::Options* opt) { std::string v = "MIP solver plugin, compiled " __DATE__ ", using: " + MIPWrapper::getDescription(_factoryOptions, opt); return v; } template std::string MIPSolverFactory::getVersion(SolverInstanceBase::Options* opt) { return MIPWrapper::getVersion(_factoryOptions, opt); } template std::string MIPSolverFactory::getId() { return "org.minizinc.mip." + MIPWrapper::getId(); } template MIPSolver::Variable MIPSolverinstance::exprToVar(Expression* arg) { if (Id* ident = arg->dynamicCast()) { return _variableMap.get(ident->decl()->id()); } return _mipWrapper->addLitVar(exprToConst(arg)); } template void MIPSolverinstance::exprToVarArray(Expression* arg, std::vector& vars) { ArrayLit* al = eval_array_lit(getEnv()->envi(), arg); vars.clear(); vars.reserve(al->size()); for (unsigned int i = 0; i < al->size(); i++) { vars.push_back(exprToVar((*al)[i])); } } template std::pair MIPSolverinstance::exprToConstEasy(Expression* e) { std::pair res{0.0, true}; if (auto* il = e->dynamicCast()) { res.first = (static_cast(il->v().toInt())); } else if (auto* fl = e->dynamicCast()) { res.first = (fl->v().toDouble()); } else if (auto* bl = e->dynamicCast()) { res.first = static_cast(bl->v()); } else { res.second = false; } return res; } template double MIPSolverinstance::exprToConst(Expression* e) { const auto e2ce = exprToConstEasy(e); if (!e2ce.second) { std::ostringstream oss; oss << "ExprToConst: expected a numeric/bool literal, getting " << *e; throw InternalError(oss.str()); } return e2ce.first; } template void MIPSolverinstance::exprToArray(Expression* arg, std::vector& vals) { ArrayLit* al = eval_array_lit(getEnv()->envi(), arg); vals.clear(); vals.reserve(al->size()); for (unsigned int i = 0; i < al->size(); i++) { vals.push_back(exprToConst((*al)[i])); } } template void MIPSolverinstance::processSearchAnnotations(const Annotation& ann) { if (getMIPWrapper()->getFreeSearch() == MIPWrapper::SearchType::FREE_SEARCH) { return; } std::vector flattenedAnns; flattenSearchAnnotations(ann, flattenedAnns); std::vector vars; std::vector aPri; // priorities /// Annotations that may be useful for custom search strategies in e.g. SCIP std::deque variableSelection; std::deque valueSelection; int nArrayAnns = 0; auto priority = flattenedAnns.size(); // Variables at front get highest pri for (const auto& annExpression : flattenedAnns) { /// Skip expressions that are not meaningful or we cannot process if (!annExpression->isa()) { continue; } Call* annotation = annExpression->cast(); const auto annotation_type = annotation->id(); if (annotation_type != "int_search" && annotation_type != "float_search") { continue; } if ((annotation->argCount() == 0U) || nullptr == eval_array_lit(_env.envi(), annotation->arg(0))) { std::cerr << " SEARCH ANN: '" << (*annotation) << "' is unknown. " << std::endl; continue; } /// Save the variable selection and the value selection strategies, indexed on priority. /// Rules are ordered by ascending priorities, i.e. rules with lower priorities are at the front /// so that we can index them by priority. const auto cVarSel = annotation->arg(1)->cast()->str(); const auto cValSel = annotation->arg(2)->cast()->str(); variableSelection.push_front(cVarSel.c_str()); valueSelection.push_front(cValSel.c_str()); ++nArrayAnns; /// Take the variables and append them with set prioirty. std::vector annVars; exprToVarArray(annotation->arg(0), annVars); aPri.insert(aPri.end(), annVars.size(), --priority); std::move(annVars.begin(), annVars.end(), std::back_inserter(vars)); } if (vars.empty()) { return; } if (getMIPWrapper()->getFreeSearch() == MIPWrapper::SearchType::UNIFORM_SEARCH) { std::fill(aPri.begin(), aPri.end(), 1); /// It is an error here to use variableSelection / valueSelection since /// we can't index them anymore. Makes no sense to use them for uniform search anyway. variableSelection.clear(); valueSelection.clear(); } else { /// Subtract offset of remaining priority so that priorities start at 0, /// so that we can index variableSelection and valueSelection by priority. std::transform(aPri.cbegin(), aPri.cend(), aPri.begin(), [priority](const int p) { return p - priority; }); } // Try adding to solver const auto successfullyAddedAnnotations = getMIPWrapper()->addSearch(vars, aPri); if (!successfullyAddedAnnotations) { std::cerr << "\nWARNING: MIP backend seems to ignore search strategy." << std::endl; } else { std::cerr << " MIP: added " << vars.size() << " variable branching priorities from " << nArrayAnns << " arrays." << std::endl; } } template void MIPSolverinstance::processWarmstartAnnotations(const Annotation& ann) { int nVal = 0; for (ExpressionSetIter i = ann.begin(); i != ann.end(); ++i) { Expression* e = *i; if (e->isa()) { Call* c = e->cast(); if (c->id() == "warm_start_array" || c->id() == "seq_search") { auto* anns = c->arg(0)->cast(); for (unsigned int i = 0; i < anns->size(); i++) { Annotation subann; subann.add((*anns)[i]); processWarmstartAnnotations(subann); } } else if (c->id() == "warm_start") { MZN_ASSERT_HARD_MSG(c->argCount() >= 2, "ERROR: warm_start needs 2 array args"); std::vector coefs; std::vector vars; /// Process coefs & vars together to eliminate literals (problem with Gurobi's /// updatemodel()'s) ArrayLit* alC = eval_array_lit(_env.envi(), c->arg(1)); MZN_ASSERT_HARD_MSG(nullptr != alC, "ERROR: warm_start needs 2 array args"); coefs.reserve(alC->size()); ArrayLit* alV = eval_array_lit(_env.envi(), c->arg(0)); MZN_ASSERT_HARD_MSG(nullptr != alV, "ERROR: warm_start needs 2 array args"); vars.reserve(alV->size()); for (unsigned int i = 0; i < alV->size() && i < alC->size(); i++) { const auto e2c = exprToConstEasy((*alC)[i]); /// Check if it is not an opt int etc. and a proper variable if (e2c.second) { if (Id* ident = (*alV)[i]->dynamicCast()) { coefs.push_back(e2c.first); vars.push_back(exprToVar(ident)); } // else ignore } } assert(coefs.size() == vars.size()); nVal += static_cast(coefs.size()); if (!coefs.empty() && !getMIPWrapper()->addWarmStart(vars, coefs)) { std::cerr << "\nWARNING: MIP backend seems to ignore warm starts" << std::endl; return; } } } } if (nVal && getMIPWrapper()->fVerbose) { std::cerr << " MIP: added " << nVal << " MIPstart values..." << std::flush; } } template void MIPSolverinstance::processMultipleObjectives(const Annotation& ann) { MultipleObjectives mo; flattenMultipleObjectives(ann, mo); if (mo.size() != 0U) { typename MIPWrapper::MultipleObjectives mo_mip; for (const auto& obj : mo.getObjectives()) { mo_mip.add({exprToVar(obj.getVariable()), obj.getWeight()}); } if (!getMIPWrapper()->defineMultipleObjectives(mo_mip)) { getEnv()->envi().addWarning("Solver backend does not support multiple objectives."); } if (getMIPWrapper()->fVerbose) { std::cerr << " MIP: added " << mo.size() << " objectives." << std::endl; } } } template void MIPSolverinstance::processFlatZinc() { _mipWrapper->fVerbose = _options->verbose; SolveI* solveItem = getEnv()->flat()->solveItem(); VarDecl* objVd = nullptr; if (solveItem->st() != SolveI::SolveType::ST_SAT) { if (Id* id = solveItem->e()->dynamicCast()) { objVd = id->decl(); } else { std::cerr << "Objective must be Id: " << solveItem->e() << std::endl; throw InternalError("Objective must be Id"); } } for (VarDeclIterator it = getEnv()->flat()->vardecls().begin(); it != getEnv()->flat()->vardecls().end(); ++it) { if (it->removed()) { continue; } VarDecl* vd = it->e(); if (!vd->ann().isEmpty()) { if (vd->ann().containsCall(constants().ann.output_array) || vd->ann().contains(constants().ann.output_var)) { _varsWithOutput.push_back(vd); // std::cerr << (*vd); // if ( vd->e() ) // cerr << " = " << (*vd->e()); // cerr << endl; } } if (vd->type().dim() == 0 && it->e()->type().isvar() && !it->removed()) { MiniZinc::TypeInst* ti = it->e()->ti(); typename MIPWrapper::VarType vType = MIPWrapper::VarType::REAL; // fInt = false; if (ti->type().isvarint() || ti->type().isint()) { vType = MIPWrapper::VarType::INT; } else if (ti->type().isvarbool() || ti->type().isbool()) { vType = MIPWrapper::VarType::BINARY; } else if (!(ti->type().isvarfloat() || ti->type().isfloat())) { std::stringstream ssm; ssm << "This type of var is not handled by MIP: " << *it << std::endl; ssm << " VarDecl flags (ti, bt, st, ot): " << ti->type().ti() << ti->type().bt() << ti->type().st() << ti->type().ot() << ", dim == " << ti->type().dim() << "\nRemove the variable or add a constraint so it is redefined." << std::endl; throw InternalError(ssm.str()); } double lb = 0.0; double ub = 1.0; // for bool if (ti->domain() != nullptr) { if (MIPWrapper::VarType::REAL == vType) { FloatBounds fb = compute_float_bounds(getEnv()->envi(), it->e()->id()); if (fb.valid) { lb = fb.l.toDouble(); ub = fb.u.toDouble(); } else { lb = 1.0; ub = 0.0; } } else if (MIPWrapper::VarType::INT == vType) { IntBounds ib = compute_int_bounds(getEnv()->envi(), it->e()->id()); if (ib.valid) { // Normally should be lb = static_cast(ib.l.toInt()); ub = static_cast(ib.u.toInt()); } else { lb = 1; ub = 0; } } } else if (MIPWrapper::VarType::BINARY != vType) { lb = -getMIPWrapper()->getInfBound(); // if just 1 bound inf, using MZN's default? TODO ub = -lb; } // IntSetVal* dom = eval_intset(env,vdi->e()->ti()->domain()); // if (dom->size() > 1) // throw runtime_error("MIPSolverinstance: domains with holes ! supported, use // --MIPdomains"); VarId res; Id* id = it->e()->id(); MZN_ASSERT_HARD(id == id->decl()->id()); // Assume all unified MZN_ASSERT_HARD(it->e() == id->decl()); // Assume all unified double obj = vd == objVd ? 1.0 : 0.0; auto* decl00 = follow_id_to_decl(it->e()); MZN_ASSERT_HARD(decl00->isa()); { auto* vd00 = decl00->dynamicCast(); if (nullptr != vd00->e()) { // Should be a const auto dRHS = exprToConst(vd00->e()); lb = std::max(lb, dRHS); ub = std::min(ub, dRHS); } if (it->e() != vd00) { // A different vardecl res = exprToVar(vd00->id()); // Assume FZN is sorted. MZN_ASSERT_HARD(!getMIPWrapper()->fPhase1Over); // Still can change colUB, colObj /// Tighten the ini-expr's bounds lb = getMIPWrapper()->colLB.at(res) = std::max(getMIPWrapper()->colLB.at(res), lb); ub = getMIPWrapper()->colUB.at(res) = std::min(getMIPWrapper()->colUB.at(res), ub); if (0.0 != obj) { getMIPWrapper()->colObj.at(res) = obj; } } else { res = getMIPWrapper()->addVar(obj, lb, ub, vType, id->str().c_str()); } } /// Test infeasibility if (lb > ub) { _status = SolverInstance::UNSAT; if (getMIPWrapper()->fVerbose) { std::cerr << " VarDecl '" << *(it->e()) << "' seems infeasible: computed bounds [" << lb << ", " << ub << ']' << std::endl; } } if (0.0 != obj) { dObjVarLB = lb; dObjVarUB = ub; getMIPWrapper()->output.nObjVarIndex = res; if (getMIPWrapper()->fVerbose) { std::cerr << " MIP: objective variable index (0-based): " << res << std::endl; } } _variableMap.insert(id, res); assert(res == _variableMap.get(id)); } } if (_mipWrapper->fVerbose && (!_mipWrapper->sLitValues.empty())) { std::cerr << " MIPSolverinstance: during Phase 1, " << _mipWrapper->nLitVars << " literals with " << _mipWrapper->sLitValues.size() << " values used." << std::endl; } if (!getMIPWrapper()->fPhase1Over) { getMIPWrapper()->addPhase1Vars(); } if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: adding constraints..." << std::flush; } for (ConstraintIterator it = getEnv()->flat()->constraints().begin(); it != getEnv()->flat()->constraints().end(); ++it) { if (!it->removed()) { if (Call* c = it->e()->dynamicCast()) { _constraintRegistry.post(c); } } } if (_mipWrapper->fVerbose) { std::cerr << " done, " << _mipWrapper->getNRows() << " rows && " << _mipWrapper->getNCols() << " columns in total."; if (_mipWrapper->nIndicatorConstr != 0) { std::cerr << " " << _mipWrapper->nIndicatorConstr << " indicator constraints." << std::endl; } std::cerr << std::endl; if (!_mipWrapper->sLitValues.empty()) { std::cerr << " MIPSolverinstance: overall, " << _mipWrapper->nLitVars << " literals with " << _mipWrapper->sLitValues.size() << " values used." << std::endl; } } processSearchAnnotations(solveItem->ann()); processWarmstartAnnotations(solveItem->ann()); processMultipleObjectives(solveItem->ann()); } // processFlatZinc template Expression* MIPSolverinstance::getSolutionValue(Id* id) { id = id->decl()->id(); if (id->type().isvar()) { MIPSolver::Variable var = exprToVar(id); double val = getMIPWrapper()->getValues()[var]; switch (id->type().bt()) { case Type::BT_INT: return IntLit::a(round_to_longlong(val)); case Type::BT_FLOAT: return FloatLit::a(val); case Type::BT_BOOL: return new BoolLit(Location(), round_to_longlong(val) != 0); default: return nullptr; } } else { return id->decl()->e(); } } template void MIPSolverinstance::genCuts(const typename MIPWrapper::Output& slvOut, typename MIPWrapper::CutInput& cutsIn, bool fMIPSol) { for (auto& pCG : _cutGenerators) { if (!fMIPSol || ((pCG->getMask() & MIPWrapper::MaskConsType_Lazy) != 0)) { pCG->generate(slvOut, cutsIn); } } /// Select some most violated? TODO } template void MIPSolverinstance::printStatisticsLine(bool fLegend) { // auto nn = std::chrono::system_clock::now(); // auto n_c = std::chrono::system_clock::to_time_t( nn ); { std::ios oldState(nullptr); oldState.copyfmt(_log); _log.precision(12); _log << " % MIP Status: " << _mipWrapper->getStatusName() << std::endl; if (fLegend) { _log << " % obj, bound, time wall/CPU, nodes (left): "; } _log << _mipWrapper->getObjValue() << ", "; _log << _mipWrapper->getBestBound() << ", "; _log.setf(std::ios::fixed); _log.precision(1); _log << _mipWrapper->getWallTimeElapsed() << "/"; _log << _mipWrapper->getCPUTime() << ", "; _log << _mipWrapper->getNNodes(); if (_mipWrapper->getNOpen() != 0) { _log << " ( " << _mipWrapper->getNOpen() << " )"; } // _log << " " << std::ctime( &n_c ); // ctime already adds EOL. os << endl; _log << std::endl; _log.copyfmt(oldState); } } template void MIPSolverinstance::printStatistics() { // auto nn = std::chrono::system_clock::now(); // auto n_c = std::chrono::system_clock::to_time_t( nn ); { EnvI& env = getEnv()->envi(); std::ios oldState(nullptr); oldState.copyfmt(env.outstream); env.outstream.precision(12); env.outstream << "%%%mzn-stat: objective=" << _mipWrapper->getObjValue() << std::endl; ; env.outstream << "%%%mzn-stat: objectiveBound=" << _mipWrapper->getBestBound() << std::endl; ; env.outstream << "%%%mzn-stat: nodes=" << _mipWrapper->getNNodes() << std::endl; ; if (_mipWrapper->getNOpen() != 0) { env.outstream << "%%%mzn-stat: openNodes=" << _mipWrapper->getNOpen() << std::endl; }; env.outstream.setf(std::ios::fixed); env.outstream.precision(4); env.outstream << "%%%mzn-stat: solveTime=" << _mipWrapper->getWallTimeElapsed() << std::endl; ; env.outstream.copyfmt(oldState); env.outstream << "%%%mzn-stat-end" << std::endl; } } template void handle_solution_callback(const typename MIPWrapper::Output& out, void* pp) { // multi-threading? TODO auto* pSI = static_cast*>(pp); assert(pSI); /// Not for -a: // if (fabs(pSI->lastIncumbent - out.objVal) > 1e-12*(1.0 + fabs(out.objVal))) { pSI->lastIncumbent = out.objVal; try { /// Sometimes the intermediate output is wrong, especially in SCIP pSI->printSolution(); // The solution in [out] is not used TODO } catch (const Exception& e) { std::cerr << std::endl; std::cerr << " Error when evaluating an intermediate solution: " << e.what() << ": " << e.msg() << std::endl; } catch (const std::exception& e) { std::cerr << std::endl; std::cerr << " Error when evaluating an intermediate solution: " << e.what() << std::endl; } catch (...) { std::cerr << std::endl; std::cerr << " Error when evaluating an intermediate solution: " << " UNKNOWN EXCEPTION." << std::endl; } // } } template void handle_cut_callback(const typename MIPWrapper::Output& out, typename MIPWrapper::CutInput& in, void* pp, bool fMIPSol) { // multi-threading? TODO auto* pSI = static_cast*>(pp); assert(pSI); assert(&out); assert(&in); pSI->genCuts(out, in, fMIPSol); } template SolverInstance::Status MIPSolverinstance::solve() { SolveI* solveItem = getEnv()->flat()->solveItem(); int nProbType = 0; if (solveItem->st() != SolveI::SolveType::ST_SAT) { if (solveItem->st() == SolveI::SolveType::ST_MAX) { getMIPWrapper()->setObjSense(1); getMIPWrapper()->setProbType(1); nProbType = 1; if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: this is a MAXimization problem." << std::endl; } } else { getMIPWrapper()->setObjSense(-1); getMIPWrapper()->setProbType(-1); nProbType = -1; if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: this is a MINimization problem." << std::endl; } } if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: bounds for the objective function: " << dObjVarLB << ", " << dObjVarUB << std::endl; } } else { getMIPWrapper()->setProbType(0); if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: this is a SATisfiability problem." << std::endl; } } lastIncumbent = 1e200; // for callbacks typename MIPWrapper::Status sw; if (SolverInstance::UNSAT == _status) { // already deduced - exit now return _status; } if (getMIPWrapper()->getNCols()) { // If any variables, we need to run solver just to get values? getMIPWrapper()->provideSolutionCallback(handle_solution_callback, this); if (!_cutGenerators.empty()) { // only then, can modify presolve getMIPWrapper()->provideCutCallback(handle_cut_callback, this); } ////////////// clean up envi ///////////////// { /// Removing for now - need access to output variables TODO // cleanupForNonincrementalSolving(); if (GC::locked() && _mipWrapper->fVerbose) { std::cerr << "WARNING: GC is locked before SolverInstance::solve()! Wasting memory." << std::endl; } // GCLock lock; GC::trigger(); } getMIPWrapper()->solve(); // printStatistics(cout, 1); MznSolver does this (if it wants) sw = getMIPWrapper()->getStatus(); } else { if (_mipWrapper->fVerbose) { std::cerr << " MIPSolverinstance: no constraints - skipping actual solution phase." << std::endl; } sw = MIPWrapper::Status::OPT; printSolution(); } SolverInstance::Status s = SolverInstance::UNKNOWN; switch (sw) { case MIPWrapper::Status::OPT: if (0 != nProbType) { s = SolverInstance::OPT; } else { s = SolverInstance::SAT; // For SAT problems, just say SAT unless we know it's complete } break; case MIPWrapper::Status::SAT: s = SolverInstance::SAT; break; case MIPWrapper::Status::UNSAT: s = SolverInstance::UNSAT; break; case MIPWrapper::Status::UNBND: s = SolverInstance::UNBND; break; case MIPWrapper::Status::UNSATorUNBND: s = SolverInstance::UNSATorUNBND; break; case MIPWrapper::Status::UNKNOWN: s = SolverInstance::UNKNOWN; break; default: s = SolverInstance::ERROR; } _pS2Out->stats.nNodes = _mipWrapper->getNNodes(); return s; } namespace SCIPConstraints { bool check_ann_user_cut(const Call* call); bool check_ann_lazy_constraint(const Call* call); int get_mask_cons_type(const Call* call); /// Create constraint name /// Input: a prefix, a counter, and the original call. /// If the call has a path annotation, that is used, /// otherwise pfx << cnt. inline std::string make_constraint_name(const char* pfx, int cnt, const Expression* cOrig = nullptr) { Call* mznp; std::ostringstream ss; if (nullptr != cOrig && ((mznp = cOrig->ann().getCall(constants().ann.mzn_path)) != nullptr)) { assert(1 == mznp->argCount()); auto* strp = mznp->arg(0)->dynamicCast(); assert(strp); ss << strp->v().substr(0, 255); // Gurobi 8.1 has <=255 characters } else { ss << pfx << cnt; } return ss.str(); } /// Gurobi 8.1.0 complains about duplicates, CPLEX 12.8.0 just ignores repeats /// An example for duplicated indices was on 72a9b64f with two floats equated template void remove_duplicates(std::vector& rmi, std::vector& rmv) { std::unordered_map linExp; for (int i = rmi.size(); i--;) { linExp[rmi[i]] += rmv[i]; } if (rmi.size() == linExp.size()) { return; } rmi.resize(linExp.size()); rmv.resize(linExp.size()); int i = 0; for (const auto& iv : linExp) { rmi[i] = iv.first; rmv[i] = iv.second; ++i; } } template void p_lin(SolverInstanceBase& si, const Call* call, typename MIPWrapper::LinConType lt) { auto& gi = dynamic_cast&>(si); Env& _env = gi.env(); // ArrayLit* al = eval_array_lit(_env.envi(), args[0]); // int nvars = al->v().size(); std::vector coefs; // gi.exprToArray(args[0], coefs); std::vector::VarId> vars; // gi.exprToVarArray(args[1], vars); IntVal ires; FloatVal fres; double rhs; if (call->arg(2)->type().isint()) { ires = eval_int(_env.envi(), call->arg(2)); rhs = static_cast(ires.toInt()); } else if (call->arg(2)->type().isfloat()) { fres = eval_float(_env.envi(), call->arg(2)); rhs = fres.toDouble(); } else { throw InternalError("p_lin: rhs unknown type"); } /// Process coefs & vars together to eliminate literals (problem with Gurobi's updatemodel()'s) ArrayLit* alC = eval_array_lit(_env.envi(), call->arg(0)); coefs.reserve(alC->size()); ArrayLit* alV = eval_array_lit(_env.envi(), call->arg(1)); vars.reserve(alV->size()); for (unsigned int i = 0; i < alV->size(); i++) { const double dCoef = gi.exprToConst((*alC)[i]); if (Id* ident = (*alV)[i]->dynamicCast()) { coefs.push_back(dCoef); vars.push_back(gi.exprToVar(ident)); } else { rhs -= dCoef * gi.exprToConst((*alV)[i]); } } assert(coefs.size() == vars.size()); /// Check feas-ty if (coefs.empty()) { if ((MIPWrapper::LinConType::EQ == lt && 1e-5 < fabs(rhs)) || (MIPWrapper::LinConType::LQ == lt && -1e-5 > (rhs)) || (MIPWrapper::LinConType::GQ == lt && 1e-5 < (rhs))) { si.setStatus(SolverInstance::UNSAT); if (gi.getMIPWrapper()->fVerbose) { std::cerr << " Constraint '" << *call << "' seems infeasible: simplified to 0 (rel) " << rhs << std::endl; } } } else { remove_duplicates(vars, coefs); // See if the solver adds indexation itself: no. gi.getMIPWrapper()->addRow( static_cast(coefs.size()), &vars[0], &coefs[0], lt, rhs, get_mask_cons_type(call), make_constraint_name("p_lin_", (gi.getMIPWrapper()->nAddedRows++), call)); } } template void p_int_lin_le(SolverInstanceBase& si, const Call* call) { p_lin(si, call, MIPWrapper::LQ); } template void p_int_lin_eq(SolverInstanceBase& si, const Call* call) { p_lin(si, call, MIPWrapper::EQ); } template void p_float_lin_le(SolverInstanceBase& si, const Call* call) { p_lin(si, call, MIPWrapper::LQ); } template void p_float_lin_eq(SolverInstanceBase& si, const Call* call) { p_lin(si, call, MIPWrapper::EQ); } // The non-_lin constraints happen in a failed model || in a non-optimized one: template void p_non_lin(SolverInstanceBase& si, const Call* call, typename MIPWrapper::LinConType nCmp) { auto& gi = dynamic_cast&>(si); std::vector coefs; std::vector vars; double rhs = 0.0; if (call->arg(0)->isa()) { coefs.push_back(1.0); vars.push_back(gi.exprToVar(call->arg(0))); } else { rhs -= gi.exprToConst(call->arg(0)); } if (call->arg(1)->isa()) { coefs.push_back(-1.0); vars.push_back(gi.exprToVar(call->arg(1))); } else { rhs += gi.exprToConst(call->arg(1)); } /// Check feas-ty if (coefs.empty()) { if ((MIPWrapper::LinConType::EQ == nCmp && 1e-5 < fabs(rhs)) || (MIPWrapper::LinConType::LQ == nCmp && -1e-5 > (rhs)) || (MIPWrapper::LinConType::GQ == nCmp && 1e-5 < (rhs))) { si.setStatus(SolverInstance::UNSAT); if (gi.getMIPWrapper()->fVerbose) { std::cerr << " Constraint '" << *call << "' seems infeasible: simplified to 0 (rel) " << rhs << std::endl; } } } else { remove_duplicates(vars, coefs); gi.getMIPWrapper()->addRow( static_cast(vars.size()), &vars[0], &coefs[0], nCmp, rhs, get_mask_cons_type(call), make_constraint_name("p_eq_", (gi.getMIPWrapper()->nAddedRows++), call)); } } template void p_eq(SolverInstanceBase& si, const Call* call) { p_non_lin(si, call, MIPWrapper::EQ); } template void p_le(SolverInstanceBase& si, const Call* call) { p_non_lin(si, call, MIPWrapper::LQ); } /// var1<=0 if var2==0 template void p_indicator_le0_if0(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); /// Looking at the bounded variable and the flag bool f1const = 0; bool f2const = 0; double val1; double val2; MIPSolver::Variable var1; MIPSolver::Variable var2; if (call->arg(0)->isa()) { var1 = gi.exprToVar(call->arg(0)); } else { f1const = 1; val1 = gi.exprToConst(call->arg(0)); } if (call->arg(1)->isa()) { var2 = gi.exprToVar(call->arg(1)); } else { f2const = 1; val2 = gi.exprToConst(call->arg(1)); } /// Check feas-ty. 1e-6 ????????????? TODO if (f1const && f2const) { if (val1 > 1e-6 && val2 < 1e-6) { si.setStatus(SolverInstance::UNSAT); if (gi.getMIPWrapper()->fVerbose) { std::cerr << " Constraint '" << *call << "' seems infeasible: " << val2 << "==0 -> " << val1 << "<=0" << std::endl; } } } else if (f1const) { if (val1 > 1e-6) { // so var2==1 gi.getMIPWrapper()->setVarBounds(var2, 1.0, 1.0); } } else if (f2const) { if (val2 < 1e-6) { // so var1<=0 gi.getMIPWrapper()->setVarUB(var1, 0.0); } } else { double coef = 1.0; gi.getMIPWrapper()->addIndicatorConstraint( var2, 0, 1, &var1, &coef, MIPWrapper::LinConType::LQ, 0.0, make_constraint_name("p_ind_", (gi.getMIPWrapper()->nAddedRows++), call)); ++gi.getMIPWrapper()->nIndicatorConstr; } } /// var1==var2 if var3==1 template void p_indicator_eq_if1(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); std::vector coefs; std::vector vars; double rhs = 0.0; /// Looking at the bounded variables and the flag bool f1const = 0; bool f2const = 0; bool fBconst = 0; double val1; double val2; double valB; MIPSolver::Variable var1; MIPSolver::Variable var2; MIPSolver::Variable varB; if (call->arg(0)->isa()) { var1 = gi.exprToVar(call->arg(0)); coefs.push_back(1.0); vars.push_back(var1); } else { f1const = 1; val1 = gi.exprToConst(call->arg(0)); rhs -= val1; } if (call->arg(1)->isa()) { var2 = gi.exprToVar(call->arg(1)); coefs.push_back(-1.0); vars.push_back(var2); } else { f2const = 1; val2 = gi.exprToConst(call->arg(1)); rhs += val2; } if (call->arg(2)->isa()) { varB = gi.exprToVar(call->arg(2)); } else { fBconst = 1; valB = gi.exprToConst(call->arg(2)); } /// Check feas-ty. 1e-6 ????????????? TODO if (f1const && f2const && fBconst) { if (fabs(val1 - val2) > 1e-6 && val2 > 0.999999) { si.setStatus(SolverInstance::UNSAT); if (gi.getMIPWrapper()->fVerbose) { std::cerr << " Constraint '" << *call << "' seems infeasible: " << valB << "==0 -> " << val1 << "==" << val2 << std::endl; } } } else if (f1const && f2const) { if (fabs(val1 - val2) > 1e-6) { // so varB=0 gi.getMIPWrapper()->setVarBounds(varB, 0.0, 0.0); } } else if (fBconst) { if (val2 > 0.999999) { // so var1<=0 remove_duplicates(vars, coefs); gi.getMIPWrapper()->addRow( static_cast(vars.size()), &vars[0], &coefs[0], MIPWrapper::LinConType::EQ, rhs, MIPWrapper::MaskConsType_Normal, make_constraint_name("p_eq_", (gi.getMIPWrapper()->nAddedRows++), call)); } } else { std::ostringstream ss; ss << "p_ind_" << (gi.getMIPWrapper()->nAddedRows++); gi.getMIPWrapper()->addIndicatorConstraint( varB, 1, static_cast(coefs.size()), vars.data(), coefs.data(), MIPWrapper::LinConType::EQ, rhs, make_constraint_name("p_ind_", (gi.getMIPWrapper()->nAddedRows++), call)); ++gi.getMIPWrapper()->nIndicatorConstr; } } /// Cumulative template void p_cumulative(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); std::unique_ptr pCG(new SECCutGen(gi.getMIPWrapper())); assert(call->argCount() == 4); std::vector startTimes; gi.exprToVarArray(call->arg(0), startTimes); std::vector durations; std::vector demands; gi.exprToArray(call->arg(1), durations); gi.exprToArray(call->arg(2), demands); double b = gi.exprToConst(call->arg(3)); gi.getMIPWrapper()->addCumulative( startTimes.size(), startTimes.data(), durations.data(), demands.data(), b, make_constraint_name("p_cumulative_", (gi.getMIPWrapper()->nAddedRows++), call)); } /// The XBZ cut generator template void p_xbz_cutgen(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); // auto pCG = make_unique(); std::unique_ptr pCG(new XBZCutGen(gi.getMIPWrapper())); assert(call->argCount() == 3); gi.exprToVarArray(call->arg(0), pCG->varX); gi.exprToVarArray(call->arg(1), pCG->varB); assert(pCG->varX.size() == pCG->varB.size()); pCG->varZ = gi.exprToVar(call->arg(2)); // cout << " NEXT_CUTGEN" << endl; // pCG->print( cout ); gi.registerCutGenerator(move(pCG)); } /// Initialize the SEC cut generator template void p_sec_cutgen(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); std::unique_ptr pCG(new SECCutGen(gi.getMIPWrapper())); assert(call->argCount() == 1); gi.exprToVarArray(call->arg(0), pCG->varXij); // WHAT ABOUT CONSTANTS? const double dN = sqrt(pCG->varXij.size()); MZN_ASSERT_HARD(fabs(dN - round(dN)) < 1e-6); // should be a square matrix pCG->nN = static_cast(round(dN)); const auto sVld = pCG->validate(); MZN_ASSERT_HARD_MSG(sVld.empty(), "ERROR(s): " << sVld); // cout << " NEXT_CUTGEN" << endl; // pCG->print( cout ); gi.registerCutGenerator(move(pCG)); } /// SCIP's bound disj template void p_bounds_disj(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); assert(6 == call->argCount()); std::vector fUB; std::vector fUBF; std::vector bnd; std::vector bndF; std::vector vars; std::vector varsF; gi.exprToArray(call->arg(0), fUB); gi.exprToArray(call->arg(3), fUBF); gi.exprToArray(call->arg(1), bnd); gi.exprToArray(call->arg(4), bndF); gi.exprToVarArray(call->arg(2), vars); gi.exprToVarArray(call->arg(5), varsF); double coef = 1.0; gi.getMIPWrapper()->addBoundsDisj( fUB.size(), fUB.data(), bnd.data(), vars.data(), fUBF.size(), fUBF.data(), bndF.data(), varsF.data(), make_constraint_name("p_bounds_disj_", (gi.getMIPWrapper()->nAddedRows++), call)); } template void p_array_minimum(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); assert(2 == call->argCount()); auto res = gi.exprToVar(call->arg(0)); std::vector args; gi.exprToVarArray(call->arg(1), args); gi.getMIPWrapper()->addMinimum( res, args.size(), args.data(), make_constraint_name("p_minimum_", (gi.getMIPWrapper()->nAddedRows++), call)); } /// fzn_[int/float]_times template void p_times(SolverInstanceBase& si, const Call* call) { auto& gi = dynamic_cast&>(si); assert(3 == call->argCount()); auto x = gi.exprToVar(call->arg(0)); auto y = gi.exprToVar(call->arg(1)); auto z = gi.exprToVar(call->arg(2)); gi.getMIPWrapper()->addTimes( x, y, z, make_constraint_name("p_times_", (gi.getMIPWrapper()->nAddedRows++), call)); } } // namespace SCIPConstraints template void MIPSolverinstance::registerConstraints() { GCLock lock; _constraintRegistry.add("int2float", SCIPConstraints::p_eq); _constraintRegistry.add("bool_eq", SCIPConstraints::p_eq); // for inconsistency reported in fzn _constraintRegistry.add("int_eq", SCIPConstraints::p_eq); _constraintRegistry.add("int_le", SCIPConstraints::p_le); _constraintRegistry.add("int_lin_eq", SCIPConstraints::p_int_lin_eq); _constraintRegistry.add("int_lin_le", SCIPConstraints::p_int_lin_le); // _constraintRegistry.add("int_plus", SCIPConstraints::p_plus); // _constraintRegistry.add("bool2int", SCIPConstraints::p_eq); _constraintRegistry.add("float_eq", SCIPConstraints::p_eq); _constraintRegistry.add("float_le", SCIPConstraints::p_le); _constraintRegistry.add("float_lin_eq", SCIPConstraints::p_float_lin_eq); _constraintRegistry.add("float_lin_le", SCIPConstraints::p_float_lin_le); // _constraintRegistry.add("float_plus", SCIPConstraints::p_plus); /// XBZ cut generator _constraintRegistry.add("array_var_float_element__XBZ_lb__cutgen", SCIPConstraints::p_xbz_cutgen); _constraintRegistry.add("circuit__SECcuts", SCIPConstraints::p_sec_cutgen); //////////////// GLOBALS / GENERAL CONSTRAINTS ///////////////////////////////////////// /// Indicators, if supported by the solver _constraintRegistry.add("aux_int_le_zero_if_0__IND", SCIPConstraints::p_indicator_le0_if0); _constraintRegistry.add("aux_float_le_zero_if_0__IND", SCIPConstraints::p_indicator_le0_if0); _constraintRegistry.add("aux_float_eq_if_1__IND", SCIPConstraints::p_indicator_eq_if1); _constraintRegistry.add("fzn_cumulative_fixed_d_r", SCIPConstraints::p_cumulative); _constraintRegistry.add("bounds_disj", SCIPConstraints::p_bounds_disj); _constraintRegistry.add("fzn_array_float_minimum", SCIPConstraints::p_array_minimum); _constraintRegistry.add("fzn_int_times", SCIPConstraints::p_times); _constraintRegistry.add("fzn_float_times", SCIPConstraints::p_times); } } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_scip_solverfactory.hh0000644000175000017500000000074313757304533025037 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class SCIPSolverFactoryInitialiser { public: SCIPSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_osicbc_wrap.hh0000644000175000017500000001334713757304533023416 0ustar kaolkaol /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include // CMakeLists.txt needs OSICBC_HOME defined // #include // #include // #include // #include // #include // #include #include #include // #include class MIPosicbcWrapper : public MIPWrapper { // OsiCbcSolverInterface osi; // deprecated in Cbc 2.9.6 OsiClpSolverInterface _osi; // CoinPackedMatrix* matrix = 0; int _error; std::string _osicbcBuffer; // [CBC_MESSAGEBUFSIZE]; // string osicbc_status_buffer; // [CBC_MESSAGEBUFSIZE]; std::vector _x; // To add constraints: // vector rowStarts, columns; std::vector _rows; std::vector // element, _rowlb, _rowub; std::unordered_map _warmstart; // this accumulates warmstart infos public: class FactoryOptions { public: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) bool processOption(int& i, std::vector& argv, const std::string& workingDir) { return false; } }; class Options : public MiniZinc::SolverInstanceBase::Options { public: int nThreads = 1; std::string sExportModel; int nTimeout = 0; long int nSolLimit = -1; double nWorkMemLimit = -1; std::string sReadParams; std::string sWriteParams; bool flagIntermediate = false; double absGap = -1; double relGap = 1e-8; double intTol = 1e-8; double objDiff = 1.0; std::vector cbcCmdOptions; std::unordered_map extraParams; bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); static void printHelp(std::ostream& os); }; private: Options* _options = nullptr; public: MIPosicbcWrapper(FactoryOptions& factoryOpt, Options* opt) : _options(opt) { openOSICBC(); } ~MIPosicbcWrapper() override { closeOSICBC(); } static std::string getDescription(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getVersion(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getId(); static std::string getName(); static std::vector getTags(); static std::vector getStdFlags(); static std::vector getRequiredFlags(FactoryOptions& factoryOpt) { return {}; }; static std::vector getFactoryFlags() { return {}; }; static std::vector getExtraFlags(FactoryOptions& factoryOpt); void printVersion(std::ostream&); void printHelp(std::ostream&); // Statistics& getStatistics() { return _statistics; } // IloConstraintArray *userCuts, *lazyConstraints; /// derived should overload and call the ancestor // virtual void cleanup(); void openOSICBC() {} void closeOSICBC() {} /// actual adding new variables to the solver void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names) override; void addPhase1Vars() override { if (fVerbose) { std::cerr << " MIPosicbcWrapper: delaying physical addition of variables..." << std::endl; } } /// adding a linear constraint void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = "") override; /// adding an implication // virtual void addImpl() = 0; bool addWarmStart(const std::vector& vars, const std::vector& vals) override; void setObjSense(int s) override; // +/-1 for max/min double getInfBound() override { return _osi.getInfinity(); } int getNCols() override { int nc = _osi.getNumCols(); return nc != 0 ? nc : static_cast(colLB.size()); } int getNColsModel() override { return _osi.getNumCols(); } int getNRows() override { if (!_rowlb.empty()) { return _rowlb.size(); } return _osi.getNumRows(); } // void setObjUB(double ub) { objUB = ub; } // void addQPUniform(double c) { qpu = c; } // also sets problem type to MIQP unless c=0 void solve() override; /// OUTPUT: const double* getValues() override { return output.x; } double getObjValue() override { return output.objVal; } double getBestBound() override { return output.bestBound; } double getCPUTime() override { return output.dCPUTime; } Status getStatus() override { return output.status; } std::string getStatusName() override { return output.statusName; } int getNNodes() override { return output.nNodes; } int getNOpen() override { return output.nOpenNodes; } // virtual int getNNodes() = 0; // virtual double getTime() = 0; protected: // OsiSolverInterface& getOsiSolver() { return osi; } void wrapAssert(bool cond, const std::string& msg, bool fTerm = true); /// Need to consider the 100 status codes in OSICBC and change with every version? TODO Status convertStatus(CbcModel* pModel); Status convertStatus(); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_wrap.hh0000644000175000017500000003026213757304533022067 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include //#include #include #include #include #include #include #include #include /// Facilitate lhs computation of a cut inline double compute_sparse(int n, const int* ind, const double* coef, const double* dense, int nVarsDense) { assert(ind && coef && dense); double val = 0.0; for (int i = 0; i < n; ++i) { assert(ind[i] >= 0); assert(ind[i] < nVarsDense); val += coef[i] * dense[ind[i]]; } return val; } class MIPWrapper; /// An abstract MIP wrapper. /// Does not include MZN stuff so can be used independently /// although it's limited to the MZN solving needs. class MIPWrapper { public: typedef int VarId; // CPLEX uses int enum VarType { REAL, INT, BINARY }; enum LinConType { LQ = -1, EQ = 0, GQ = 1 }; // CPLEX 12.6.2 advises anti-symmetry constraints to be user+lazy static const int MaskConsType_Normal = 1; /// User cut. Only cuts off fractional points, no integer feasible points static const int MaskConsType_Usercut = 2; /// Lazy cut. Can cut off otherwise feasible integer solutions. /// Callback should be able to produce previously generated cuts again if needed [Gurobi] static const int MaskConsType_Lazy = 4; enum Status { OPT, SAT, UNSAT, UNBND, UNSATorUNBND, UNKNOWN, __ERROR }; /// Search strategy for the solver enum SearchType { FIXED_SEARCH = 0, FREE_SEARCH = 1, UNIFORM_SEARCH = 2 }; /// Columns for SCIP upfront and with obj coefs: std::vector colObj, colLB, colUB; std::vector colTypes; std::vector colNames; // , rowLB, rowUB, elements; // veci whichInt // , starts, column; // double objUB; // double qpu; /// Parameter bool fVerbose = false; int nProbType = -2; // +-1: max/min; 0: sat struct Output { Status status; std::string statusName = "Untouched"; double objVal = 1e308; double bestBound = 1e308; int nCols = 0; int nObjVarIndex = -1; const double* x = nullptr; int nNodes = 0; int nOpenNodes = 0; double dWallTime = 0.0; std::chrono::time_point dWallTime0; double dCPUTime = 0; std::clock_t cCPUTime0 = 0; }; Output output; /// General cut definition, could be used for addRow() too class CutDef { CutDef() {} public: CutDef(LinConType s, int m) : sense(s), mask(m) {} std::vector rmatind; std::vector rmatval; LinConType sense = LQ; double rhs = 0.0; int mask = 0; // need to know what type of cuts are registered before solve() TODO std::string rowName = ""; void addVar(int i, double c) { rmatind.push_back(i); rmatval.push_back(c); } double computeViol(const double* x, int nCols) { double lhs = compute_sparse(static_cast(rmatind.size()), rmatind.data(), rmatval.data(), x, nCols); if (LQ == sense) { return lhs - rhs; } if (GQ == sense) { return rhs - lhs; } assert(0); return 0.0; } }; /// Cut callback fills one typedef std::vector CutInput; /// solution callback handler, the wrapper might not have these callbacks implemented typedef void (*SolCallbackFn)(const Output&, void*); /// cut callback handler, the wrapper might not have these callbacks implemented typedef void (*CutCallbackFn)(const Output&, CutInput&, void*, bool fMIPSol // if with a MIP feas sol - lazy cuts only ); struct CBUserInfo { MIPWrapper* wrapper = nullptr; MIPWrapper::Output* pOutput = nullptr; MIPWrapper::Output* pCutOutput = nullptr; void* psi = nullptr; // external info. Intended to keep MIPSolverinstance SolCallbackFn solcbfn = nullptr; CutCallbackFn cutcbfn = nullptr; /// Union of all flags used for the registered callback cuts /// See MaskConstrType_.. /// Solvers need to know this /// In MIPSolverinstance, class CutGen defines getMask() which should return that int cutMask = 0; // can be any combination of User/Lazy bool fVerb = false; // used in Gurobi bool printed = false; // whether any solution was output double nTimeoutFeas = -1.0; // >=0 => stop that long after 1st feas double nTime1Feas = -1e100; // time of the 1st feas }; CBUserInfo cbui; MIPWrapper() { cbui.wrapper = this; } virtual ~MIPWrapper() { /* cleanup(); */ } /// derived should overload and call the ancestor // virtual void cleanup() { // colObj.clear(); colLB.clear(); colUB.clear(); // colTypes.clear(); colNames.clear(); // } /// re-create solver object. Called from the base class constructor // virtual void resetModel() { }; // virtual void printVersion(ostream& os) { os << "Abstract MIP wrapper"; } // virtual void printHelp(ostream& ) { } bool fPhase1Over = false; private: /// adding a variable just internally (in Phase 1 only that). Not to be used directly. virtual VarId addVarLocal(double obj, double lb, double ub, VarType vt, const std::string& name = "") { // cerr << " addVarLocal: colObj.size() == " << colObj.size() // << " obj == " <(colObj.size() - 1); } /// add the given var to the solver. Asserts all previous are added. Phase >=2. No direct use virtual void addVar(int j) { assert(j == getNCols()); assert(fPhase1Over); doAddVars(1, &colObj[j], &colLB[j], &colUB[j], &colTypes[j], &colNames[j]); } /// actual adding new variables to the solver. "Updates" the model (e.g., Gurobi). No direct use virtual void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names) = 0; public: /// debugging stuff // set sLitValues; std::unordered_map sLitValues; void setProbType(int t) { nProbType = t; } /// adding a variable, at once to the solver, this is for the 2nd phase virtual VarId addVar(double obj, double lb, double ub, VarType vt, const std::string& name = "") { // cerr << " AddVar: " << lb << ": "; VarId res = addVarLocal(obj, lb, ub, vt, name); if (fPhase1Over) { addVar(res); } return res; } int nLitVars = 0; /// adding a literal as a variable. Should not happen in feasible models virtual VarId addLitVar(double v) { // Cannot do this: at least CBC does not support duplicated indexes TODO?? // ++nLitVars; // auto itFound = sLitValues.find(v); // if (sLitValues.end() != itFound) // return itFound->second; std::ostringstream oss; oss << "lit_" << v << "__" << (nLitVars++); std::string name = oss.str(); size_t pos = name.find('.'); if (std::string::npos != pos) { name.replace(pos, 1, "p"); } VarId res = addVarLocal(0.0, v, v, REAL, name); if (fPhase1Over) { addVar(res); } // cerr << " AddLitVar " << v << " (PROBABLY WRONG)" << endl; sLitValues[v] = res; return res; } /// adding all local variables upfront. Makes sure it's called only once virtual void addPhase1Vars() { assert(0 == getNColsModel()); assert(!fPhase1Over); if (fVerbose) { std::cerr << " MIPWrapper: adding the " << colObj.size() << " Phase-1 variables..." << std::flush; } if (!colObj.empty()) { doAddVars(colObj.size(), &colObj[0], &colLB[0], &colUB[0], &colTypes[0], &colNames[0]); } if (fVerbose) { std::cerr << " done." << std::endl; } fPhase1Over = true; // SCIP needs after adding } /// var bounds virtual void setVarBounds(int iVar, double lb, double ub) { throw 0; } virtual void setVarLB(int iVar, double lb) { throw 0; } virtual void setVarUB(int iVar, double ub) { throw 0; } /// adding a linear constraint virtual void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = "") = 0; /// Indicator constraint: x[iBVar]==bVal -> lin constr virtual void addIndicatorConstraint(int iBVar, int bVal, int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, const std::string& rowName = "") { throw std::runtime_error("Indicator constraints not supported. "); } virtual void addMinimum(int iResultVar, int nnz, int* ind, const std::string& rowName = "") { throw std::runtime_error("This backend does not support the Minimum constraint"); } /// Bounds disj for SCIP virtual void addBoundsDisj(int n, double* fUB, double* bnd, int* vars, int nF, double* fUBF, double* bndF, int* varsF, const std::string& rowName = "") { throw std::runtime_error("Bounds disjunctions not supported. "); } /// Times constraint: var[x]*var[y] == var[z] virtual void addTimes(int x, int y, int z, const std::string& rowName = "") { throw std::runtime_error("Backend: [int/float]_times not supported. "); } /// Cumulative, currently SCIP only virtual void addCumulative(int nnz, int* rmatind, double* d, double* r, double b, const std::string& rowName = "") { throw std::runtime_error("Cumulative constraints not supported. "); } /// 0: model-defined level, 1: free, 2: uniform search virtual int getFreeSearch() { return SearchType::FREE_SEARCH; } /// Return 0 if ignoring searches virtual bool addSearch(const std::vector& vars, const std::vector& pri) { return false; } /// Return 0 if ignoring warm starts virtual bool addWarmStart(const std::vector& vars, const std::vector& vals) { return false; } using MultipleObjectives = MiniZinc::MultipleObjectivesTemplate; virtual bool defineMultipleObjectives(const MultipleObjectives& mo) { return false; } int nAddedRows = 0; // for name counting int nIndicatorConstr = 0; /// adding an implication // virtual void addImpl() = 0; virtual void setObjSense(int s) = 0; // +/-1 for max/min virtual double getInfBound() = 0; virtual int getNCols() = 0; virtual int getNColsModel() { return getNCols(); } // from the solver virtual int getNRows() = 0; // void setObjUB(double ub) { objUB = ub; } // void addQPUniform(double c) { qpu = c; } // also sets problem type to MIQP unless c=0 /// Set solution callback. Thread-safety?? /// solution callback handler, the wrapper might not have these callbacks implemented virtual void provideSolutionCallback(SolCallbackFn cbfn, void* info) { assert(cbfn); cbui.pOutput = &output; cbui.psi = info; cbui.solcbfn = cbfn; } /// solution callback handler, the wrapper might not have these callbacks implemented virtual void provideCutCallback(CutCallbackFn cbfn, void* info) { assert(cbfn); cbui.pCutOutput = nullptr; // &outpCuts; thread-safety: caller has to provide this cbui.psi = info; cbui.cutcbfn = cbfn; } virtual void solve() = 0; /// OUTPUT, should also work in a callback virtual const double* getValues() = 0; virtual double getObjValue() = 0; virtual double getBestBound() = 0; virtual double getWallTimeElapsed() { return output.dWallTime; } virtual double getCPUTime() = 0; virtual Status getStatus() = 0; virtual std::string getStatusName() = 0; virtual int getNNodes() = 0; virtual int getNOpen() = 0; /// Default MZN library for MIP static std::string getMznLib(); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_cplex_solverfactory.hh0000644000175000017500000000074513757304533025216 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class CplexSolverFactoryInitialiser { public: CplexSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_gurobi_wrap.hh0000644000175000017500000003163513757304533023443 0ustar kaolkaol /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include extern "C" { #include // need GUROBI_HOME defined } class MIPGurobiWrapper : public MIPWrapper { GRBenv* _env = nullptr; GRBmodel* _model = nullptr; #ifdef GUROBI_PLUGIN void* _gurobiDll; #endif int _error; std::string _gurobiBuffer; // [GRB_MESSAGEBUFSIZE]; std::string _gurobiStatusBuffer; // [GRB_MESSAGEBUFSIZE]; std::vector _x; public: class FactoryOptions { public: bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); std::string gurobiDll; }; class Options : public MiniZinc::SolverInstanceBase::Options { public: int nMIPFocus = 0; int nFreeSearch = 1; int nThreads = 1; std::string sExportModel; int nTimeout1000 = -1; int nTimeoutFeas1000 = -1; int nSolLimit = -1; int nSeed = -1; double nWorkMemLimit = 0.5; std::string sNodefileDir; std::string sReadParams; std::string sWriteParams; std::vector sConcurrentParamFiles; bool flagIntermediate = false; double absGap = -1; double relGap = 1e-8; double feasTol = 1e-8; double intTol = 1e-8; double objDiff = 1.0; int nonConvex = 2; std::unordered_map extraParams; bool processOption(int& i, std::vector& argv, const std::string& workingDir); static void printHelp(std::ostream& os); }; private: FactoryOptions& _factoryOptions; Options* _options = nullptr; public: // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* dll_GRBversion)(int*, int*, int*); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBaddconstr)(GRBmodel* model, int numnz, int* cind, double* cval, char sense, double rhs, const char* constrname); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBaddgenconstrMin)(GRBmodel* model, const char* name, int resvar, int nvars, const int* vars, double constant); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBaddqconstr)(GRBmodel* model, int numlnz, int* lind, double* lval, int numqnz, int* qrow, int* qcol, double* qval, char sense, double rhs, const char* QCname); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBaddgenconstrIndicator)(GRBmodel* model, const char* name, int binvar, int binval, int nvars, const int* ind, const double* val, char sense, double rhs); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBaddvars)(GRBmodel* model, int numvars, int numnz, int* vbeg, int* vind, double* vval, double* obj, double* lb, double* ub, char* vtype, char** varnames); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBcbcut)(void* cbdata, int cutlen, const int* cutind, const double* cutval, char cutsense, double cutrhs); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBcbget)(void* cbdata, int where, int what, void* resultP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBcblazy)(void* cbdata, int lazylen, const int* lazyind, const double* lazyval, char lazysense, double lazyrhs); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* dll_GRBfreeenv)(GRBenv* env); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBfreemodel)(GRBmodel* model); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetdblattr)(GRBmodel* model, const char* attrname, double* valueP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetdblattrarray)(GRBmodel* model, const char* attrname, int first, int len, double* values); // NOLINTNEXTLINE(readability-identifier-naming) GRBenv*(__stdcall* dll_GRBgetenv)(GRBmodel* model); // NOLINTNEXTLINE(readability-identifier-naming) const char*(__stdcall* dll_GRBgeterrormsg)(GRBenv* env); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetintattr)(GRBmodel* model, const char* attrname, int* valueP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBloadenv)(GRBenv** envP, const char* logfilename); // NOLINTNEXTLINE(readability-identifier-naming) GRBenv*(__stdcall* dll_GRBgetconcurrentenv)(GRBmodel* model, int num); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBnewmodel)(GRBenv* env, GRBmodel** modelP, const char* Pname, int numvars, double* obj, double* lb, double* ub, char* vtype, char** varnames); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBoptimize)(GRBmodel* model); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBreadparams)(GRBenv* env, const char* filename); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetcallbackfunc)(GRBmodel* model, int(__stdcall* cb)(CB_ARGS), void* usrdata); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetdblparam)(GRBenv* env, const char* paramname, double value); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetintparam)(GRBenv* env, const char* paramname, int value); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetintattr)(GRBmodel* model, const char* attrname, int newvalue); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetdblattrelement)(GRBmodel* model, const char* attrname, int iv, double v); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetintattrlist)(GRBmodel* model, const char* attrname, int len, int* ind, int* newvalues); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetdblattrlist)(GRBmodel* model, const char* attrname, int len, int* ind, double* newvalues); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetobjectiven)(GRBmodel* model, int index, int priority, double weight, double abstol, double reltol, const char* name, double constant, int lnz, int* lind, double* lval); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBsetstrparam)(GRBenv* env, const char* paramname, const char* value); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* dll_GRBterminate)(GRBmodel* model); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBupdatemodel)(GRBmodel* model); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBwrite)(GRBmodel* model, const char* filename); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBwriteparams)(GRBenv* env, const char* filename); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetintparam)(GRBenv* env, const char* paramname, int* valueP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBemptyenv)(GRBenv** envP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetnumparams)(GRBenv* env); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetparamname)(GRBenv* env, int i, char** paramnameP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetparamtype)(GRBenv* env, const char* paramname); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetintparaminfo)(GRBenv* env, const char* paramname, int* valueP, int* minP, int* maxP, int* defP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetdblparaminfo)(GRBenv* env, const char* paramname, double* valueP, double* minP, double* maxP, double* defP); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* dll_GRBgetstrparaminfo)(GRBenv* env, const char* paramname, char* valueP, char* defP); MIPGurobiWrapper(FactoryOptions& factoryOpt, Options* opt) : _factoryOptions(factoryOpt), _options(opt) { if (opt != nullptr) { openGUROBI(); } } ~MIPGurobiWrapper() override { closeGUROBI(); } static std::string getDescription(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getVersion(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getId(); static std::string getName(); static std::vector getTags(); static std::vector getStdFlags(); static std::vector getRequiredFlags(FactoryOptions& factoryOpt); static std::vector getFactoryFlags(); static std::vector getExtraFlags(FactoryOptions& factoryOpt); // Statistics& getStatistics() { return _statistics; } // IloConstraintArray *userCuts, *lazyConstraints; /// derived should overload and call the ancestor // virtual void cleanup(); void checkDLL(); void openGUROBI(); void closeGUROBI(); /// actual adding new variables to the solver void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names) override; /// adding a linear constraint void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = "") override; void setVarBounds(int iVar, double lb, double ub) override; void setVarLB(int iVar, double lb) override; void setVarUB(int iVar, double ub) override; /// Indicator constraint: x[iBVar]==bVal -> lin constr void addIndicatorConstraint(int iBVar, int bVal, int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, const std::string& rowName = "") override; void addMinimum(int iResultVar, int nnz, int* ind, const std::string& rowName = "") override; /// Times constraint: var[x]*var[y] == var[z] void addTimes(int x, int y, int z, const std::string& rowName = "") override; int getFreeSearch() override; bool addSearch(const std::vector& vars, const std::vector& pri) override; bool addWarmStart(const std::vector& vars, const std::vector& vals) override; bool defineMultipleObjectives(const MultipleObjectives& mo) override; int nRows = 0; // to count rows in order tp notice lazy constraints std::vector nLazyIdx; std::vector nLazyValue; /// adding an implication // virtual void addImpl() = 0; void setObjSense(int s) override; // +/-1 for max/min double getInfBound() override { return GRB_INFINITY; } int getNCols() override { dll_GRBupdatemodel(_model); int cols; _error = dll_GRBgetintattr(_model, GRB_INT_ATTR_NUMVARS, &cols); return cols; } int getNRows() override { dll_GRBupdatemodel(_model); int cols; _error = dll_GRBgetintattr(_model, GRB_INT_ATTR_NUMCONSTRS, &cols); return cols; } // void setObjUB(double ub) { objUB = ub; } // void addQPUniform(double c) { qpu = c; } // also sets problem type to MIQP unless c=0 void solve() override; /// OUTPUT: const double* getValues() override { return output.x; } double getObjValue() override { return output.objVal; } double getBestBound() override { return output.bestBound; } double getCPUTime() override { return output.dCPUTime; } Status getStatus() override { return output.status; } std::string getStatusName() override { return output.statusName; } int getNNodes() override { return output.nNodes; } int getNOpen() override { return output.nOpenNodes; } // virtual int getNNodes() = 0; // virtual double getTime() = 0; protected: void wrapAssert(bool cond, const std::string& msg, bool fTerm = true); /// Need to consider the 100 status codes in GUROBI and change with every version? TODO Status convertStatus(int gurobiStatus); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_osicbc_solverfactory.hh0000644000175000017500000000074713757304533025347 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class OSICBCSolverFactoryInitialiser { public: OSICBCSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_xpress_solverfactory.hh0000644000175000017500000000074713757304533025431 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class XpressSolverFactoryInitialiser { public: XpressSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_gurobi_solverfactory.hh0000644000175000017500000000074713757304533025374 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class GurobiSolverFactoryInitialiser { public: GurobiSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_xpress_wrap.hh0000644000175000017500000002307713757304533023501 0ustar kaolkaol/* * Main authors: * Karsten Lehmann */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include using namespace std; class XpressPlugin : public MiniZinc::Plugin { public: XpressPlugin(); XpressPlugin(const std::string& dll); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSinit)(const char* path); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSfree)(); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRSgetversion)(char* version); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetlicerrmsg)(char* buffer, int length); // NOLINTNEXTLINE(readability-identifier-naming) struct xo_prob_struct*(XB_CC* XPRBgetXPRSprob)(struct Xbprob* prob); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetmsglevel)(struct Xbprob* prob, int level); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetlogfile)(XPRSprob prob, const char* logname); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetintcontrol)(XPRSprob prob, int _index, int _ivalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetdblcontrol)(XPRSprob prob, int _index, double _dvalue); // NOLINTNEXTLINE(readability-identifier-naming) double(XB_CC* XPRBgetsol)(struct Xbvar* var); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetintattrib)(XPRSprob prob, int _index, int* _ivalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetdblattrib)(XPRSprob prob, int _index, double* _dvalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBbegincb)(struct Xbprob* prob, struct xo_prob_struct* optprob); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsync)(struct Xbprob* prob, int synctype); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBendcb)(struct Xbprob* prob); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetterm)(struct Xbctr* lct, struct Xbvar* var, double coeff); // NOLINTNEXTLINE(readability-identifier-naming) struct Xbvar*(XB_CC* XPRBnewvar)(struct Xbprob* prob, int type, const char* name, double bdl, double bdu); // NOLINTNEXTLINE(readability-identifier-naming) struct Xbctr*(XB_CC* XPRBnewctr)(struct Xbprob* prob, const char* name, int qrtype); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetctrtype)(struct Xbctr* lct, int qrtype); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBexportprob)(struct Xbprob* prob, int format, const char* filename); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBgetbounds)(struct Xbvar* var, double* lbd, double* ubd); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetobj)(struct Xbprob* prob, struct Xbctr* ctr); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBmipoptimize)(struct Xbprob* prob, const char* alg); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetsense)(struct Xbprob* prob, int dir); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetcbintsol)(XPRSprob prob, void(XPRS_CC* f_intsol)(XPRSprob prob, void* vContext), void* p); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetub)(struct Xbvar* var, double c); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetlb)(struct Xbvar* var, double c); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetindicator)(struct Xbctr* lct, int dir, struct Xbvar* var); // NOLINTNEXTLINE(readability-identifier-naming) struct Xbsol*(XB_CC* XPRBnewsol)(struct Xbprob* prob); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBsetsolvar)(struct Xbsol* sol, struct Xbvar* var, double coeff); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBaddmipsol)(struct Xbprob* prob, struct Xbsol* sol, const char* name); // NOLINTNEXTLINE(readability-identifier-naming) struct Xbprob*(XB_CC* XPRBnewprob)(const char* name); // NOLINTNEXTLINE(readability-identifier-naming) int(XB_CC* XPRBdelprob)(struct Xbprob* prob); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetcontrolinfo)(XPRSprob prob, const char* sCaName, int* iHeaderId, int* iTypeinfo); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetintcontrol)(XPRSprob prob, int _index, int* _ivalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetintcontrol64)(XPRSprob prob, int _index, XPRSint64* _ivalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetdblcontrol)(XPRSprob prob, int _index, double* _dvalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetstrcontrol)(XPRSprob prob, int _index, char* _svalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetintcontrol64)(XPRSprob prob, int _index, XPRSint64 _ivalue); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSgetstringcontrol)(XPRSprob prob, int _index, char* _svalue, int _svaluesize, int* _controlsize); // NOLINTNEXTLINE(readability-identifier-naming) int(XPRS_CC* XPRSsetstrcontrol)(XPRSprob prob, int _index, const char* _svalue); private: void loadDll(); static const std::vector& dlls(); }; class MIPxpressWrapper : public MIPWrapper { public: class FactoryOptions { public: bool processOption(int& i, std::vector& argv, const std::string& workingDir); std::string xpressDll; std::string xprsPassword; }; class Options : public MiniZinc::SolverInstanceBase::Options { public: int msgLevel = 0; int timeout = 0; int numSolutions = 0; std::string logFile = ""; std::string writeModelFile = ""; std::string writeModelFormat = "lp"; double absGap = 0; double relGap = 0.0001; bool intermediateSolutions = false; int numThreads = 0; int randomSeed = 0; std::unordered_map extraParams; bool processOption(int& i, std::vector& argv, const std::string& workingDir = std::string()); static void printHelp(std::ostream& os); }; private: FactoryOptions& _factoryOptions; Options* _options = nullptr; XpressPlugin* _plugin = nullptr; public: void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, string* names) override; void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const string& rowName = "") override; void setObjSense(int s) override; void solve() override; void setVarLB(int iVar, double lb) override; void setVarUB(int iVar, double ub) override; void setVarBounds(int iVar, double lb, double ub) override; void addIndicatorConstraint(int iBVar, int bVal, int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, const std::string& rowName = "") override; bool addWarmStart(const std::vector& vars, const std::vector& vals) override; int getNCols() override { return _variables.size(); } int getNRows() override { return _nRows; } double getInfBound() override { return XPRB_INFINITY; } const double* getValues() override { return output.x; } double getObjValue() override { return output.objVal; } double getBestBound() override { return output.bestBound; } double getCPUTime() override { return output.dCPUTime; } Status getStatus() override { return output.status; } string getStatusName() override { return output.statusName; } int getNNodes() override { return output.nNodes; } int getNOpen() override { return output.nOpenNodes; } MIPxpressWrapper(FactoryOptions& factoryOpt, Options* opt) : _factoryOptions(factoryOpt), _options(opt) { openXpress(); }; ~MIPxpressWrapper() override { closeXpress(); }; static std::string getDescription(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getVersion(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getId(); static std::string getName(); static std::vector getTags(); static std::vector getStdFlags(); static std::vector getRequiredFlags(FactoryOptions& factoryOpt); static std::vector getFactoryFlags(); static std::vector getExtraFlags(FactoryOptions& factoryOpt); private: XPRBprob _problem; XPRBctr _xpressObj; vector _variables; size_t _nRows{0}; void openXpress(); void closeXpress(); void checkDLL(); void setUserSolutionCallback(); void setOptions(); void writeModelIfRequested(); static int convertConstraintType(LinConType sense); static int convertVariableType(VarType varType); static int convertObjectiveSense(int s); XPRBctr addConstraint(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask, const string& rowName); void addDummyConstraint(); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_scip_wrap.hh0000644000175000017500000004506213757304533023111 0ustar kaolkaol /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #ifndef _WIN32 #define __stdcall #endif // Workaround for SCIP replacing function calls with macros in release mode #ifdef NDEBUG #define SCIPinfinityPlugin(plugin, scip) SCIPinfinity(scip) #else #define SCIPinfinityPlugin(plugin, scip) plugin->SCIPinfinity(scip) #endif class ScipPlugin : public MiniZinc::Plugin { public: ScipPlugin(); ScipPlugin(const std::string& dll); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPmajorVersion)(); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPminorVersion)(); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPtechVersion)(); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPsubversion)(); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* SCIPprintError)(SCIP_RETCODE retcode); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreate)(SCIP** scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPincludeDefaultPlugins)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateProbBasic)(SCIP* scip, const char* name); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPfree)(SCIP** scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateVarBasic) (SCIP* scip, SCIP_VAR** var, const char* name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPaddVar)(SCIP* scip, SCIP_VAR* var); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPreleaseVar)(SCIP* scip, SCIP_VAR** var); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPinfinity)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateConsBasicLinear) (SCIP* scip, SCIP_CONS** cons, const char* name, int nvars, SCIP_VAR** vars, SCIP_Real* vals, SCIP_Real lhs, SCIP_Real rhs); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateConsBasicQuadratic) (SCIP* scip, /**< SCIP data structure */ SCIP_CONS** cons, /**< pointer to hold the created constraint */ const char* name, /**< name of constraint */ int nlinvars, /**< number of linear terms (n) */ SCIP_VAR** linvars, /**< array with variables in linear part (x_i) */ SCIP_Real* lincoefs, /**< array with coefficients of variables in linear part (b_i) */ int nquadterms, /**< number of quadratic terms (m) */ SCIP_VAR** quadvars1, /**< array with first variables in quadratic terms (y_j) */ SCIP_VAR** quadvars2, /**< array with second variables in quadratic terms (z_j) */ SCIP_Real* quadcoefs, /**< array with coefficients of quadratic terms (a_j) */ SCIP_Real lhs, /**< left hand side of quadratic equation (ell) */ SCIP_Real rhs /**< right hand side of quadratic equation (u) */ ); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPaddCons)(SCIP* scip, SCIP_CONS* cons); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPreleaseCons)(SCIP* scip, SCIP_CONS** cons); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgVarLbGlobal)(SCIP* scip, SCIP_VAR* var, SCIP_Real newbound); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgVarUbGlobal)(SCIP* scip, SCIP_VAR* var, SCIP_Real newbound); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPgetNegatedVar)(SCIP* scip, SCIP_VAR* var, SCIP_VAR** negvar); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateConsBasicIndicator) (SCIP* scip, SCIP_CONS** cons, const char* name, SCIP_VAR* binvar, int nvars, SCIP_VAR** vars, SCIP_Real* vals, SCIP_Real rhs); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateConsBasicBounddisjunction) (SCIP* scip, SCIP_CONS** cons, const char* name, int nvars, SCIP_VAR** vars, SCIP_BOUNDTYPE* boundtypes, SCIP_Real* bounds); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcreateConsBasicCumulative) (SCIP* scip, SCIP_CONS** cons, const char* name, int nvars, SCIP_VAR** vars, int* durations, int* demands, int capacity); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPgetNSolsFound)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPgetNSols)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetIntParam)(SCIP* scip, const char* name, int value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetRealParam)(SCIP* scip, const char* name, SCIP_Real value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPwriteOrigProblem) (SCIP* scip, const char* filename, const char* extension, SCIP_Bool genericnames); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* SCIPsetMessagehdlrQuiet)(SCIP* scip, SCIP_Bool quiet); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPmessagehdlrCreate) (SCIP_MESSAGEHDLR** messagehdlr, SCIP_Bool bufferedoutput, const char* filename, SCIP_Bool quiet, SCIP_DECL_MESSAGEWARNING((*messagewarning)), SCIP_DECL_MESSAGEDIALOG((*messagedialog)), SCIP_DECL_MESSAGEINFO((*messageinfo)), SCIP_DECL_MESSAGEHDLRFREE((*messagehdlrfree)), SCIP_MESSAGEHDLRDATA* messagehdlrdata); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetMessagehdlr)(SCIP* scip, SCIP_MESSAGEHDLR* messagehdlr); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPreadParams)(SCIP* scip, const char* filename); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPwriteParams) (SCIP* scip, const char* filename, SCIP_Bool comments, SCIP_Bool onlychanged); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsolve)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_STATUS(__stdcall* SCIPgetStatus)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPgetPrimalbound)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPgetDualbound)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPgetSolVals) (SCIP* scip, SCIP_SOL* sol, int nvars, SCIP_VAR** vars, SCIP_Real* vals); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_SOL*(__stdcall* SCIPgetBestSol)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPgetNTotalNodes)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPgetNNodes)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPgetNNodesLeft)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPfreeTransform)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetObjsense)(SCIP* scip, SCIP_OBJSENSE objsense); // NOLINTNEXTLINE(readability-identifier-naming) const char*(__stdcall* SCIPeventhdlrGetName)(SCIP_EVENTHDLR* eventhdlr); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPcatchEvent) (SCIP* scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR* eventhdlr, SCIP_EVENTDATA* eventdata, int* filterpos); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPdropEvent) (SCIP* scip, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR* eventhdlr, SCIP_EVENTDATA* eventdata, int filterpos); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_EVENTTYPE(__stdcall* SCIPeventGetType)(SCIP_EVENT* event); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPgetSolOrigObj)(SCIP* scip, SCIP_SOL* sol); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPincludeEventhdlrBasic) (SCIP* scip, SCIP_EVENTHDLR** eventhdlrptr, const char* name, const char* desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA* eventhdlrdata); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetEventhdlrInit) (SCIP* scip, SCIP_EVENTHDLR* eventhdlr, SCIP_DECL_EVENTINIT((*eventinit))); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPsetEventhdlrExit) (SCIP* scip, SCIP_EVENTHDLR* eventhdlr, SCIP_DECL_EVENTEXIT((*eventexit))); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* SCIPmessagePrintErrorHeader)(const char* sourcefile, int sourceline); // NOLINTNEXTLINE(readability-identifier-naming) void(__stdcall* SCIPmessagePrintError)(const char* formatstr, ...); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPgetNVars)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPgetNConss)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_PARAM**(__stdcall* SCIPgetParams)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPgetNParams)(SCIP* scip); // NOLINTNEXTLINE(readability-identifier-naming) const char*(__stdcall* SCIPparamGetName)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_PARAMTYPE(__stdcall* SCIPparamGetType)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) const char*(__stdcall* SCIPparamGetDesc)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Bool(__stdcall* SCIPparamGetBoolDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) char*(__stdcall* SCIPparamGetCharAllowedValues)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) char(__stdcall* SCIPparamGetCharDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPparamGetIntDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPparamGetIntMin)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) int(__stdcall* SCIPparamGetIntMax)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPparamGetLongintDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPparamGetLongintMin)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Longint(__stdcall* SCIPparamGetLongintMax)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPparamGetRealDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPparamGetRealMin)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_Real(__stdcall* SCIPparamGetRealMax)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) char*(__stdcall* SCIPparamGetStringDefault)(SCIP_PARAM* param); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_PARAM*(__stdcall* SCIPgetParam)(SCIP* scip, const char* name); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgBoolParam)(SCIP* scip, SCIP_PARAM* param, SCIP_Bool value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgIntParam)(SCIP* scip, SCIP_PARAM* param, int value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgLongintParam)(SCIP* scip, SCIP_PARAM* param, SCIP_Longint value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgRealParam)(SCIP* scip, SCIP_PARAM* param, SCIP_Real value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgCharParam)(SCIP* scip, SCIP_PARAM* param, char value); // NOLINTNEXTLINE(readability-identifier-naming) SCIP_RETCODE(__stdcall* SCIPchgStringParam)(SCIP* scip, SCIP_PARAM* param, const char* value); private: void load(); }; class MIPScipWrapper : public MIPWrapper { SCIP* _scip = nullptr; // SCIP_Retcode retcode = SCIP_OKAY; // char scip_buffer[SCIP_MESSAGEBUFSIZE]; // char scip_status_buffer[SCIP_MESSAGEBUFSIZE]; std::vector _scipVars; virtual SCIP_RETCODE delSCIPVars(); std::vector _x; public: class FactoryOptions { public: bool processOption(int& i, std::vector& argv, const std::string& workingDir); std::string scipDll; }; class Options : public MiniZinc::SolverInstanceBase::Options { public: int nThreads = 1; std::string sExportModel; int nTimeout = -1; double nWorkMemLimit = -1; std::string sReadParams; std::string sWriteParams; bool flagIntermediate = false; double absGap = -1; double relGap = 1e-8; double intTol = 1e-8; double objDiff = 1.0; std::unordered_map extraParams; bool processOption(int& i, std::vector& argv, const std::string& workingDir); static void printHelp(std::ostream& os); }; private: FactoryOptions& _factoryOptions; Options* _options = nullptr; ScipPlugin* _plugin = nullptr; public: MIPScipWrapper(FactoryOptions& factoryOpt, Options* opt) : _factoryOptions(factoryOpt), _options(opt) { SCIP_PLUGIN_CALL(openSCIP()); } ~MIPScipWrapper() override { SCIP_RETCODE ret = delSCIPVars(); assert(ret == SCIP_OKAY); ret = closeSCIP(); assert(ret == SCIP_OKAY); } static std::string getDescription(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getVersion(FactoryOptions& factoryOpt, MiniZinc::SolverInstanceBase::Options* opt = nullptr); static std::string getId(); static std::string getName(); static std::vector getTags(); static std::vector getStdFlags(); static std::vector getRequiredFlags(FactoryOptions& factoryOpt); static std::vector getFactoryFlags(); static std::vector getExtraFlags(FactoryOptions& factoryOpt); bool processOption(int& i, int argc, const char** argv, const std::string& workingDir = std::string()); void printVersion(std::ostream& os); void printHelp(std::ostream& os); // Statistics& getStatistics() { return _statistics; } // IloConstraintArray *userCuts, *lazyConstraints; /// derived should overload and call the ancestor // virtual void cleanup(); SCIP_RETCODE openSCIP(); SCIP_RETCODE closeSCIP(); SCIP_RETCODE includeEventHdlrBestsol(); /// actual adding new variables to the solver void doAddVars(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names) override { SCIP_PLUGIN_CALL(doAddVarsSCIP(n, obj, lb, ub, vt, names)); } virtual SCIP_RETCODE doAddVarsSCIP(size_t n, double* obj, double* lb, double* ub, VarType* vt, std::string* names); void setVarBounds(int iVar, double lb, double ub) override; void setVarLB(int iVar, double lb) override; void setVarUB(int iVar, double ub) override; /// adding a linear constraint void addRow(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = "") override { SCIP_PLUGIN_CALL(addRowSCIP(nnz, rmatind, rmatval, sense, rhs, mask, rowName)); } virtual SCIP_RETCODE addRowSCIP(int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, int mask = MaskConsType_Normal, const std::string& rowName = ""); /// adding an implication // virtual void addImpl() = 0; /// Indicator constraint: x[iBVar]==bVal -> lin constr void addIndicatorConstraint(int iBVar, int bVal, int nnz, int* rmatind, double* rmatval, LinConType sense, double rhs, const std::string& rowName = "") override; /// Bounds disj for SCIP void addBoundsDisj(int n, double* fUB, double* bnd, int* vars, int nF, double* fUBF, double* bndF, int* varsF, const std::string& rowName = "") override; /// Cumulative, currently SCIP only void addCumulative(int nnz, int* rmatind, double* d, double* r, double b, const std::string& rowName = "") override; /// Times constraint: var[x]*var[y] == var[z] void addTimes(int x, int y, int z, const std::string& rowName = "") override; void setObjSense(int s) override { // +/-1 for max/min SCIP_PLUGIN_CALL(setObjSenseSCIP(s)); } virtual SCIP_RETCODE setObjSenseSCIP(int s); double getInfBound() override { return SCIPinfinityPlugin(_plugin, _scip); } int getNCols() override { return _plugin->SCIPgetNVars(_scip); } int getNRows() override { return _plugin->SCIPgetNConss(_scip); } // void setObjUB(double ub) { objUB = ub; } // void addQPUniform(double c) { qpu = c; } // also sets problem type to MIQP unless c=0 void solve() override { SCIP_PLUGIN_CALL(solveSCIP()); } virtual SCIP_RETCODE solveSCIP(); /// OUTPUT: const double* getValues() override { return output.x; } double getObjValue() override { return output.objVal; } double getBestBound() override { return output.bestBound; } double getCPUTime() override { return output.dCPUTime; } Status getStatus() override { return output.status; } std::string getStatusName() override { return output.statusName; } int getNNodes() override { return output.nNodes; } int getNOpen() override { return output.nOpenNodes; } // virtual int getNNodes() = 0; // virtual double getTime() = 0; protected: // NOLINTNEXTLINE(readability-identifier-naming) void SCIP_PLUGIN_CALL(SCIP_RETCODE retcode, const std::string& msg = "", bool fTerm = true); /// Need to consider the 100 status codes in SCIP and change with every version? TODO Status convertStatus(SCIP_STATUS scipStatus); }; libminizinc-2.5.3/include/minizinc/solvers/MIP/MIP_solverinstance.hh0000644000175000017500000001260113757304533024152 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include namespace MiniZinc { // can be redefined as compilation parameter #ifndef GETMIPWRAPPER #define GETMIPWRAPPER MIP_WrapperFactory::GetDefaultMIPWrapper() #endif class MIPSolver { public: typedef MIPWrapper::VarId Variable; typedef MiniZinc::Statistics Statistics; }; /// Generic cut generator /// Callback should be able to produce previously generated cuts again if needed [Gurobi] class CutGen { public: virtual ~CutGen() {} /// Say what type of cuts virtual int getMask() = 0; /// Adds new cuts to the 2nd parameter virtual void generate(const MIPWrapper::Output&, MIPWrapper::CutInput&) = 0; virtual void print(std::ostream& /*os*/) {} }; /// XBZ cut generator class XBZCutGen : public CutGen { XBZCutGen() {} MIPWrapper* _pMIP = nullptr; public: XBZCutGen(MIPWrapper* pw) : _pMIP(pw) {} std::vector varX, varB; /// Say what type of cuts int getMask() override { return MIPWrapper::MaskConsType_Usercut; } MIPWrapper::VarId varZ; void generate(const MIPWrapper::Output& slvOut, MIPWrapper::CutInput& cutsIn) override; void print(std::ostream& os) override; }; /// SEC cut generator for circuit class SECCutGen : public CutGen { SECCutGen() {} MIPWrapper* _pMIP = nullptr; public: SECCutGen(MIPWrapper* pw) : _pMIP(pw) {} /// Say what type of cuts int getMask() override { return MIPWrapper::MaskConsType_Lazy | MIPWrapper::MaskConsType_Usercut; } std::vector varXij; int nN = 0; // N nodes /// returns error message if fails std::string validate() const; void generate(const MIPWrapper::Output& slvOut, MIPWrapper::CutInput& cutsIn) override; void print(std::ostream& os) override; }; template class MIPSolverinstance : public SolverInstanceImpl { using SolverInstanceBase::_log; protected: const std::unique_ptr _mipWrapper; std::vector > _cutGenerators; public: void registerCutGenerator(std::unique_ptr&& pCG) { getMIPWrapper()->cbui.cutMask |= pCG->getMask(); _cutGenerators.push_back(move(pCG)); } double lastIncumbent; double dObjVarLB = -1e300, dObjVarUB = 1e300; MIPSolverinstance(Env& env, std::ostream& log, typename MIPWrapper::FactoryOptions& factoryOpt, typename MIPWrapper::Options* opt) : SolverInstanceImpl(env, log, opt), _mipWrapper(new MIPWrapper(factoryOpt, opt)) { assert(_mipWrapper.get()); registerConstraints(); } virtual MIPWrapper* getMIPWrapper() const { return _mipWrapper.get(); } Status next() override { assert(0); return SolverInstance::UNKNOWN; } void processFlatZinc() override; virtual void processWarmstartAnnotations(const Annotation& ann); virtual void processSearchAnnotations(const Annotation& ann); virtual void processMultipleObjectives(const Annotation& ann); Status solve() override; void resetSolver() override {} virtual void genCuts(const typename MIPWrapper::Output& slvOut, typename MIPWrapper::CutInput& cutsIn, bool fMIPSol); // void assignSolutionToOutput(); // needs to be public for the callback? void printStatistics() override; void printStatisticsLine(bool fLegend = false) override; /// creates a var for a literal, if necessary VarId exprToVar(Expression* arg); void exprToArray(Expression* arg, std::vector& vals); void exprToVarArray(Expression* arg, std::vector& vars); std::pair exprToConstEasy(Expression* e); double exprToConst(Expression* e); Expression* getSolutionValue(Id* id) override; void registerConstraints(); }; // MIPSolverinstance template class MIPSolverFactory : public SolverFactory { public: MIPSolverFactory(); bool processFactoryOption(int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void factoryOptionsFinished() override; SolverInstanceBase::Options* createOptions() override { return new typename MIPWrapper::Options; } SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override { return new MIPSolverinstance(env, log, _factoryOptions, static_cast(opt)); } bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; std::string getDescription(SolverInstanceBase::Options* opt = nullptr) override; std::string getVersion(SolverInstanceBase::Options* opt = nullptr) override; std::string getId() override; void printHelp(std::ostream& os) override { MIPWrapper::Options::printHelp(os); } private: typename MIPWrapper::FactoryOptions _factoryOptions; std::vector _extraFlags; }; } // namespace MiniZinc #include libminizinc-2.5.3/include/minizinc/solvers/geas/0000755000175000017500000000000013757304533020357 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solvers/geas/geas_constraints.hh0000644000175000017500000001030013757304533024240 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { namespace GeasConstraints { #define PosterImpl(X) void X(SolverInstanceBase& s, const Call* ce) /* Integer Comparison Constraints */ PosterImpl(p_int_eq); PosterImpl(p_int_ne); PosterImpl(p_int_le); PosterImpl(p_int_lt); PosterImpl(p_int_eq_imp); PosterImpl(p_int_ne_imp); PosterImpl(p_int_le_imp); PosterImpl(p_int_lt_imp); PosterImpl(p_int_eq_reif); PosterImpl(p_int_ne_reif); PosterImpl(p_int_le_reif); PosterImpl(p_int_lt_reif); /* Integer Arithmetic Constraints */ PosterImpl(p_int_abs); PosterImpl(p_int_times); PosterImpl(p_int_div); PosterImpl(p_int_max); PosterImpl(p_int_min); /* Integer Linear Constraints */ PosterImpl(p_int_lin_eq); PosterImpl(p_int_lin_ne); PosterImpl(p_int_lin_le); PosterImpl(p_int_lin_eq_imp); PosterImpl(p_int_lin_ne_imp); PosterImpl(p_int_lin_le_imp); PosterImpl(p_int_lin_eq_reif); PosterImpl(p_int_lin_ne_reif); PosterImpl(p_int_lin_le_reif); /* Boolean Comparison Constraints */ PosterImpl(p_bool_eq); PosterImpl(p_bool_ne); PosterImpl(p_bool_le); PosterImpl(p_bool_lt); PosterImpl(p_bool_eq_imp); PosterImpl(p_bool_ne_imp); PosterImpl(p_bool_le_imp); PosterImpl(p_bool_lt_imp); PosterImpl(p_bool_eq_reif); PosterImpl(p_bool_ne_reif); PosterImpl(p_bool_le_reif); PosterImpl(p_bool_lt_reif); /* Boolean Arithmetic Constraints */ PosterImpl(p_bool_or); PosterImpl(p_bool_and); PosterImpl(p_bool_xor); PosterImpl(p_bool_not); PosterImpl(p_bool_or_imp); PosterImpl(p_bool_and_imp); PosterImpl(p_bool_xor_imp); PosterImpl(p_bool_clause); PosterImpl(p_array_bool_or); PosterImpl(p_array_bool_and); PosterImpl(p_bool_clause_imp); PosterImpl(p_array_bool_or_imp); PosterImpl(p_array_bool_and_imp); PosterImpl(p_bool_clause_reif); /* Boolean Linear Constraints */ PosterImpl(p_bool_lin_eq); PosterImpl(p_bool_lin_ne); PosterImpl(p_bool_lin_le); PosterImpl(p_bool_lin_eq_imp); PosterImpl(p_bool_lin_ne_imp); PosterImpl(p_bool_lin_le_imp); PosterImpl(p_bool_lin_lt_imp); PosterImpl(p_bool_lin_eq_reif); PosterImpl(p_bool_lin_ne_reif); PosterImpl(p_bool_lin_le_reif); /* Coercion Constraints */ PosterImpl(p_bool2int); /* Element Constraints */ PosterImpl(p_array_int_element); PosterImpl(p_array_bool_element); PosterImpl(p_array_int_maximum); PosterImpl(p_array_int_minimum); PosterImpl(p_array_var_int_element); PosterImpl(p_array_var_bool_element); /* Global Constraints */ PosterImpl(p_all_different); PosterImpl(p_all_different_except_0); PosterImpl(p_at_most); PosterImpl(p_at_most1); PosterImpl(p_cumulative); PosterImpl(p_disjunctive); PosterImpl(p_global_cardinality); PosterImpl(p_table_int); /**** NOT YET SUPPORTED: ****/ /* Boolean Arithmetic Constraints */ // PosterImpl(p_array_bool_xor); // PosterImpl(p_array_bool_xor_imp); /* Floating Point Comparison Constraints */ // PosterImpl(p_float_eq); // PosterImpl(p_float_ne); // PosterImpl(p_float_le); // PosterImpl(p_float_lt); // PosterImpl(p_float_eq_reif); // PosterImpl(p_float_le_reif) // PosterImpl(p_float_lt_reif); /* Floating Point Arithmetic Constraints */ // PosterImpl(p_float_times); // PosterImpl(p_float_div); // PosterImpl(p_float_plus) ; // PosterImpl(p_float_sqrt); // PosterImpl(p_float_abs);; // PosterImpl(p_float_max); // PosterImpl(p_float_min); // PosterImpl(p_float_acos); // PosterImpl(p_float_asin); // PosterImpl(p_float_atan); // PosterImpl(p_float_cos); // PosterImpl(p_float_exp); // PosterImpl(p_float_sin); // PosterImpl(p_float_tan); // PosterImpl(p_float_ln); // PosterImpl(p_float_log10); // PosterImpl(p_float_log2); /* Floating Linear Constraints */ // PosterImpl(p_float_lin_eq); // PosterImpl(p_float_lin_eq_reif); // PosterImpl(p_float_lin_le); // PosterImpl(p_float_lin_le_reif); /* Coercion Constraints */ // PosterImpl(p_int2float); } // namespace GeasConstraints } // namespace MiniZinclibminizinc-2.5.3/include/minizinc/solvers/fzn_solverfactory.hh0000644000175000017500000000074113757304533023542 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class FZNSolverFactoryInitialiser { public: FZNSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/geas_solverfactory.hh0000644000175000017500000000074613757304533023671 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class GeasSolverFactoryInitialiser { public: GeasSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/mzn_solverinstance.hh0000644000175000017500000000375613757304533023717 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { class MZNSolverOptions : public SolverInstanceBase::Options { public: std::string mznSolver; std::vector mznFlags; int numSols = 1; bool allSols = false; std::string parallel; int mznTimeLimitMilliseconds = 0; int solverTimeLimitMilliseconds = 0; bool mznSigint = false; bool supportsT = false; std::vector mznSolverFlags; }; class MZNSolverInstance : public SolverInstanceBase { private: std::string _mznSolver; public: MZNSolverInstance(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); ~MZNSolverInstance() override; Status next() override { return SolverInstance::ERROR; } Status solve() override; void processFlatZinc() override; void resetSolver() override; }; class MZNSolverFactory : public SolverFactory { protected: SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override; public: MZNSolverFactory(); SolverInstanceBase::Options* createOptions() override; std::string getDescription(SolverInstanceBase::Options* opt = nullptr) override; std::string getVersion(SolverInstanceBase::Options* opt = nullptr) override; std::string getId() override; bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void printHelp(std::ostream& os) override; static void setAcceptedFlags(SolverInstanceBase::Options* opt, const std::vector& flags); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/gecode_solverfactory.hh0000644000175000017500000000074713757304533024201 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class GecodeSolverFactoryInitialiser { public: GecodeSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/mzn_solverfactory.hh0000644000175000017500000000074113757304533023551 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class MZNSolverFactoryInitialiser { public: MZNSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/gecode/0000755000175000017500000000000013757304533020666 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solvers/gecode/fzn_space.hh0000644000175000017500000000606313757304533023164 0ustar kaolkaol/* * Main authors: * Kevin Leo * Andrea Rendl * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #ifdef GECODE_HAS_SET_VARS #include #endif #ifdef GECODE_HAS_FLOAT_VARS #include #endif #undef ERROR namespace MiniZinc { class FznSpace : public Gecode::Space { public: /// The integer variables std::vector iv; /// The introduced integer variables Gecode::IntVarArray ivAux; /// Indicates whether an integer variable is introduced by mzn2fzn std::vector ivIntroduced; /// Indicates whether an integer variable is defined std::vector ivDefined; /// The Boolean variables std::vector bv; /// The introduced Boolean variables Gecode::BoolVarArray bvAux; /// Indicates whether a Boolean variable is introduced by mzn2fzn std::vector bvIntroduced; /// Indicates whether a Boolean variable is defined std::vector bvDefined; #ifdef GECODE_HAS_SET_VARS /// The set variables std::vector sv; /// The introduced set variables Gecode::SetVarArray svAux; /// Indicates whether a set variable is introduced by mzn2fzn std::vector svIntroduced; /// Indicates whether a set variable is introduced by mzn2fzn std::vector svDefined; #endif #ifdef GECODE_HAS_FLOAT_VARS /// The float variables std::vector fv; /// The introduced float variables Gecode::FloatVarArray fvAux; /// Indicates whether a float variable is introduced by mzn2fzn std::vector fvIntroduced; /// Indicates whether a float variable is defined std::vector fvDefined; #endif /// Indicates if the objective variable is integer (float otherwise) bool optVarIsInt; /// Index of the variable to optimize int optVarIdx; /// Whether the introduced variables still need to be copied bool copyAuxVars; /// solve type (SAT, MIN or MAX) MiniZinc::SolveI::SolveType solveType; /// copy constructor FznSpace(FznSpace& f); /// standard constructor FznSpace() : optVarIsInt(true), optVarIdx(-1), copyAuxVars(true) {} ~FznSpace() override {} /// get the index of the Boolean variable in bv; return -1 if not exists int getBoolAliasIndex(const Gecode::BoolVar& bvar) { for (unsigned int i = 0; i < bv.size(); i++) { if (bv[i].varimp() == bvar.varimp()) { // std::cout << "DEBUG: settings bool alias of variable to index " << i << std::endl; return static_cast(i); } } return -1; // we should have found the boolvar in bv } protected: /// Implement optimization void constrain(const Space& s) override; /// Copy function Gecode::Space* copy() override; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/gecode/gecode_constraints.hh0000644000175000017500000002004013757304533025060 0ustar kaolkaol/* * Main authors: * Kevin Leo * Andrea Rendl * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { namespace GecodeConstraints { #define PosterImpl(X) void X(SolverInstanceBase& s, const Call* ce) PosterImpl(p_distinct); PosterImpl(p_distinct_offset); PosterImpl(p_all_equal); void p_int_cmp(GecodeSolverInstance& s, Gecode::IntRelType irt, const Call* ce); PosterImpl(p_int_eq); PosterImpl(p_int_ne); PosterImpl(p_int_ge); PosterImpl(p_int_gt); PosterImpl(p_int_le); PosterImpl(p_int_lt); void p_int_cmp_reif(GecodeSolverInstance& s, Gecode::IntRelType irt, Gecode::ReifyMode rm, const Call* call); ///* Comparisons */ PosterImpl(p_int_eq_reif); PosterImpl(p_int_ne_reif); PosterImpl(p_int_ge_reif); PosterImpl(p_int_gt_reif); PosterImpl(p_int_le_reif); PosterImpl(p_int_lt_reif); PosterImpl(p_int_eq_imp); PosterImpl(p_int_ne_imp); PosterImpl(p_int_ge_imp); PosterImpl(p_int_gt_imp); PosterImpl(p_int_le_imp); PosterImpl(p_int_lt_imp); void p_int_lin_cmp(GecodeSolverInstance& s, Gecode::IntRelType irt, const Call* call); void p_int_lin_cmp_reif(GecodeSolverInstance& s, Gecode::IntRelType irt, Gecode::ReifyMode rm, const Call* call); PosterImpl(p_int_lin_eq); PosterImpl(p_int_lin_eq_reif); PosterImpl(p_int_lin_eq_imp); PosterImpl(p_int_lin_ne); PosterImpl(p_int_lin_ne_reif); PosterImpl(p_int_lin_ne_imp); PosterImpl(p_int_lin_le); PosterImpl(p_int_lin_le_reif); PosterImpl(p_int_lin_le_imp); PosterImpl(p_int_lin_lt); PosterImpl(p_int_lin_lt_reif); PosterImpl(p_int_lin_lt_imp); PosterImpl(p_int_lin_ge); PosterImpl(p_int_lin_ge_reif); PosterImpl(p_int_lin_ge_imp); PosterImpl(p_int_lin_gt); PosterImpl(p_int_lin_gt_reif); PosterImpl(p_int_lin_gt_imp); void p_bool_lin_cmp(GecodeSolverInstance& s, Gecode::IntRelType irt, const Call* call); void p_bool_lin_cmp_reif(GecodeSolverInstance& s, Gecode::IntRelType irt, Gecode::ReifyMode rm, const Call* call); PosterImpl(p_bool_lin_eq); PosterImpl(p_bool_lin_eq_reif); PosterImpl(p_bool_lin_eq_imp); PosterImpl(p_bool_lin_ne); PosterImpl(p_bool_lin_ne_reif); PosterImpl(p_bool_lin_ne_imp); PosterImpl(p_bool_lin_le); PosterImpl(p_bool_lin_le_reif); PosterImpl(p_bool_lin_le_imp); PosterImpl(p_bool_lin_lt); PosterImpl(p_bool_lin_lt_reif); PosterImpl(p_bool_lin_lt_imp); PosterImpl(p_bool_lin_ge); PosterImpl(p_bool_lin_ge_reif); PosterImpl(p_bool_lin_ge_imp); PosterImpl(p_bool_lin_gt); PosterImpl(p_bool_lin_gt_reif); PosterImpl(p_bool_lin_gt_imp); ///* arithmetic constraints */ PosterImpl(p_int_plus); PosterImpl(p_int_minus); PosterImpl(p_int_times); PosterImpl(p_int_div); PosterImpl(p_int_mod); PosterImpl(p_int_min); PosterImpl(p_int_max); PosterImpl(p_int_negate); ///* Boolean constraints */ void p_bool_cmp(GecodeSolverInstance& s, Gecode::IntRelType irt, const Call* call); void p_bool_cmp_reif(GecodeSolverInstance& s, Gecode::IntRelType irt, Gecode::ReifyMode rm, const Call* call); PosterImpl(p_bool_eq); PosterImpl(p_bool_eq_reif); PosterImpl(p_bool_eq_imp); PosterImpl(p_bool_ne); PosterImpl(p_bool_ne_reif); PosterImpl(p_bool_ne_imp); PosterImpl(p_bool_ge); PosterImpl(p_bool_ge_reif); PosterImpl(p_bool_ge_imp); PosterImpl(p_bool_le); PosterImpl(p_bool_le_reif); PosterImpl(p_bool_le_imp); PosterImpl(p_bool_gt); PosterImpl(p_bool_gt_reif); PosterImpl(p_bool_gt_imp); PosterImpl(p_bool_lt); PosterImpl(p_bool_lt_reif); PosterImpl(p_bool_lt_imp); PosterImpl(p_bool_or); PosterImpl(p_bool_or_imp); PosterImpl(p_bool_and); PosterImpl(p_bool_and_imp); PosterImpl(p_array_bool_and); PosterImpl(p_array_bool_and_imp); PosterImpl(p_array_bool_or); PosterImpl(p_array_bool_or_imp); PosterImpl(p_array_bool_xor); PosterImpl(p_array_bool_xor_imp); PosterImpl(p_array_bool_clause); PosterImpl(p_array_bool_clause_reif); PosterImpl(p_array_bool_clause_imp); PosterImpl(p_bool_xor); PosterImpl(p_bool_xor_imp); PosterImpl(p_bool_l_imp); PosterImpl(p_bool_r_imp); PosterImpl(p_bool_not); ///* element constraints */ PosterImpl(p_array_int_element); PosterImpl(p_array_bool_element); ///* coercion constraints */ PosterImpl(p_bool2int); PosterImpl(p_int_in); PosterImpl(p_int_in_reif); PosterImpl(p_int_in_imp); ///* constraints from the standard library */ PosterImpl(p_abs); PosterImpl(p_array_int_lt); PosterImpl(p_array_int_lq); PosterImpl(p_array_bool_lt); PosterImpl(p_array_bool_lq); PosterImpl(p_count); PosterImpl(p_count_reif); PosterImpl(p_count_imp); void count_rel(Gecode::IntRelType irt, SolverInstanceBase& s, const Call* call); PosterImpl(p_at_most); PosterImpl(p_at_least); PosterImpl(p_bin_packing_load); PosterImpl(p_global_cardinality); PosterImpl(p_global_cardinality_closed); PosterImpl(p_global_cardinality_low_up); PosterImpl(p_global_cardinality_low_up_closed); PosterImpl(p_minimum); PosterImpl(p_maximum); PosterImpl(p_minimum_arg); PosterImpl(p_maximum_arg); PosterImpl(p_regular); PosterImpl(p_sort); PosterImpl(p_inverse_offsets); PosterImpl(p_increasing_int); PosterImpl(p_increasing_bool); PosterImpl(p_decreasing_int); PosterImpl(p_decreasing_bool); PosterImpl(p_table_int); PosterImpl(p_table_bool); PosterImpl(p_cumulatives); PosterImpl(p_among_seq_int); PosterImpl(p_among_seq_bool); PosterImpl(p_schedule_unary); PosterImpl(p_schedule_unary_optional); PosterImpl(p_cumulative_opt); PosterImpl(p_circuit); PosterImpl(p_circuit_cost_array); PosterImpl(p_circuit_cost); PosterImpl(p_nooverlap); PosterImpl(p_precede); PosterImpl(p_nvalue); PosterImpl(p_among); PosterImpl(p_member_int); PosterImpl(p_member_int_reif); PosterImpl(p_member_bool); PosterImpl(p_member_bool_reif); #ifdef GECODE_HAS_FLOAT_VARS PosterImpl(p_int2float); void p_float_lin_cmp(GecodeSolverInstance& s, Gecode::FloatRelType frt, const Call* ce); void p_float_lin_cmp_reif(GecodeSolverInstance& s, Gecode::FloatRelType frt, const Call* ce); PosterImpl(p_float_lin_eq); PosterImpl(p_float_lin_eq_reif); PosterImpl(p_float_lin_le); PosterImpl(p_float_lin_le_reif); PosterImpl(p_float_times); PosterImpl(p_float_div); PosterImpl(p_float_plus); PosterImpl(p_float_sqrt); PosterImpl(p_float_abs); PosterImpl(p_float_eq); PosterImpl(p_float_eq_reif); PosterImpl(p_float_le); PosterImpl(p_float_le_reif); PosterImpl(p_float_max); PosterImpl(p_float_min); PosterImpl(p_float_lt); PosterImpl(p_float_lt_reif); PosterImpl(p_float_ne); #ifdef GECODE_HAS_MPFR PosterImpl(p_float_acos); PosterImpl(p_float_asin); PosterImpl(p_float_atan); PosterImpl(p_float_cos); PosterImpl(p_float_exp); PosterImpl(p_float_sin); PosterImpl(p_float_tan); PosterImpl(p_float_ln); PosterImpl(p_float_log10); PosterImpl(p_float_log2); #endif #endif #ifdef GECODE_HAS_SET_VARS PosterImpl(p_set_eq); PosterImpl(p_set_le); PosterImpl(p_set_lt); PosterImpl(p_set_eq); PosterImpl(p_set_ne); PosterImpl(p_set_union); PosterImpl(p_array_set_element); PosterImpl(p_array_set_element); PosterImpl(p_set_intersect); PosterImpl(p_set_diff); PosterImpl(p_set_symdiff); PosterImpl(p_set_subset); PosterImpl(p_set_superset); PosterImpl(p_set_card); PosterImpl(p_set_in); PosterImpl(p_set_eq_reif); PosterImpl(p_set_le_reif); PosterImpl(p_set_lt_reif); PosterImpl(p_set_eq_reif); PosterImpl(p_set_ne_reif); PosterImpl(p_set_subset_reif); PosterImpl(p_set_superset_reif); PosterImpl(p_set_in_reif); PosterImpl(p_set_in_imp); PosterImpl(p_set_disjoint); PosterImpl(p_link_set_to_booleans); PosterImpl(p_array_set_union); PosterImpl(p_array_set_partition); PosterImpl(p_set_convex); PosterImpl(p_array_set_seq); PosterImpl(p_array_set_seq_union); PosterImpl(p_array_set_element_union); PosterImpl(p_array_set_element_intersect); PosterImpl(p_array_set_element_intersect_in); PosterImpl(p_array_set_element_partition); PosterImpl(p_int_set_channel); PosterImpl(p_range); PosterImpl(p_weights); PosterImpl(p_inverse_set); PosterImpl(p_precede_set); #endif } // namespace GecodeConstraints } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/nl/0000755000175000017500000000000013757304533020051 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/solvers/nl/nl_solverinstance.hh0000644000175000017500000000373213757304533024127 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include namespace MiniZinc { class NLSolverOptions : public SolverInstanceBase::Options { public: std::string nlSolver; std::vector nlFlags; std::vector nlSolverFlags; bool doHexafloat = false; bool doKeepfile = false; }; class NLSolverInstance : public SolverInstanceBase { protected: Model* _fzn; Model* _ozn; NLFile _nlFile; public: NLSolverInstance(Env& env, std::ostream& log, SolverInstanceBase::Options* opt); ~NLSolverInstance() override; Status next() override { return SolverInstance::Status::ERROR; } Status solve() override; void processFlatZinc() override; void resetSolver() override; protected: static Expression* getSolutionValue(Id* id); void analyse(const Item* i); }; class NLSolverFactory : public SolverFactory { protected: SolverInstanceBase* doCreateSI(Env& env, std::ostream& log, SolverInstanceBase::Options* opt) override; public: NLSolverFactory(); SolverInstanceBase::Options* createOptions() override; std::string getDescription(SolverInstanceBase::Options* opt = nullptr) override; std::string getVersion(SolverInstanceBase::Options* opt = nullptr) override; std::string getId() override; bool processOption(SolverInstanceBase::Options* opt, int& i, std::vector& argv, const std::string& workingDir = std::string()) override; void printHelp(std::ostream& os) override; // void setAcceptedFlags(SolverInstanceBase::Options* opt, const std::vector& // flags); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/nl/nl_components.hh0000644000175000017500000003674613757304533023270 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once //#include #include #include #include #include #include #include /* A NL File is composed of a header and several segments. Adding items in the nl file is done through adding segment (or adding item in a segment). As for the header, segment are printable. Segment are identified by a prefix, which should be one of (taken from table 13 in 'writing nl files'): F imported function description S suffix values V defined variable definition (must precede V,C,L,O segments where used) (yes, I know, "V must preceed V"...) C algebraic constraint body L logical constraint expression O objective function d dual initial guess x primal initial guess r bounds on algebraic constraint bodies (“ranges”), can only appears once b bounds on variable, can only appears once k Jacobian column counts (must precede all J segments) J Jacobian sparsity, linear terms G Gradient sparsity, linear terms */ namespace MiniZinc { // --- --- --- Tooling /** Exception when translating * Code mostly taken from https://www.softwariness.com/articles/assertions-in-cpp/ */ class NLException : public std::exception { public: // --- --- --- Fields const char* expression; const char* file; int line; std::string message; std::string report; /** Exception constructor. Use with the macro assert/should_not_happen. * If not, WARNING: stream must be a std::ostringstream& * We only use a ostreamé so we can use the standard "<<" operator, which is returning a ostream& */ NLException(const char* expression, const char* file, int line, std::ostream& stream) : expression(expression), file(file), line(line) { message = static_cast(stream).str(); std::ostringstream outputStream; if (expression == nullptr) { outputStream << "Something should not have happen in file '" << file << "' line " << line << ". Message:" << std::endl; if (!message.empty()) { outputStream << message << std::endl; } else { outputStream << "No message provided..." << std::endl; } } else { std::string expressionString = expression; if (expressionString == "false" || expressionString == "0" || expressionString == "FALSE") { outputStream << "Unreachable code assertion"; } else { outputStream << "Assertion '" << expression << "'"; } outputStream << " failed in file '" << file << "' line " << line << std::endl; } outputStream << "Note: the NL component is still in development!" << std::endl; report = outputStream.str(); } /** Exception interface */ const char* what() const noexcept override { return report.c_str(); } ~NLException() noexcept override = default; }; #ifdef assert #undef assert #endif /** Should not happen macro */ #define should_not_happen(MESSAGE) \ do { \ ostringstream oss; \ oss << MESSAGE; /* NOLINT(bugprone-macro-parentheses) */ \ throw NLException(NULL, __FILE__, __LINE__, oss); \ } while (false) /* CMake febug build flag: double negation... because... ? */ #ifndef NDEBUG #define DEBUG_MSG(STR) \ do { \ std::cerr << "%[NL DEBUG] " << STR << endl; /* NOLINT(bugprone-macro-parentheses) */ \ } while (false) #define assert(EXPRESSION) \ do { \ if (!(EXPRESSION)) { \ ostringstream oss; \ throw NLException(#EXPRESSION, __FILE__, __LINE__, oss); \ } \ } while (false) #else #define DEBUG_MSG(STR) \ do { \ } while (false) #define assert(EXPRESSION) \ do { \ } while (false) #endif // --- --- --- Components // Declaration class NLFile; /** A Bound. * A bound can represent various constraint on a variable or a constraint. * Because it apply to both variables and constraints, we keep it general enough. * Note that the targeted variable or constraint is implicitely represented by its position in the final NL File. * As a result, this information does not appear here. * Bounds are used in the 'b' and 'r' segments. # Text # Starting the segment # Variable # Tag in enum NLS_Bounditem::Bound 0 1.1 3.4 # 1.1 =< V =< 3.4 First variable LB_UB 1 2.5 # V =< 2.5 Second variable UB 2 7 # 7 =< V etc... LB 3 # no constraint NONE 4 9.4 # V = 9.4 EQ * Notes: - bound values are stored as 'double', even for integer variables. * - we do not make that class Printable as it is better "printed" with a name for the targeted variable/constraint */ class NLBound { public: /** Bound kind. Declaration matches specification above. */ enum Bound { LB_UB = 0, UB = 1, LB = 2, NONE = 3, EQ = 4 }; /** *** *** *** Fields *** *** *** **/ Bound tag = NONE; double lb = 0; double ub = 0; /** *** *** *** Constructors & helpers *** *** *** **/ NLBound() = default; NLBound(Bound tag, double lb, double ub); static NLBound makeBounded(double lb, double ub); static NLBound makeUBBounded(double ub); static NLBound makeLBBounded(double lb); static NLBound makeNoBound(); static NLBound makeEqual(double val); /** *** *** *** Update the lower or upper bound *** *** *** **/ // Note: this method are "additive only": we cannot use them to remove a a bound. void updateLB(double new_lb); void updateUB(double new_ub); void updateEq(double new_eq); /** *** *** *** Printing Methods *** *** *** **/ /** Print the bound with a comment containing the name of the variable/constraint. */ std::ostream& printToStream(std::ostream& o, const std::string& vname) const; /** Printing with 'body' as the name of the variable/constraint. */ std::ostream& printToStream(std::ostream& o) const; }; /** A Declared variable. * A variable is identified by its name, which is supposed to be unique in the MZN representation. * In an NL file, variables are identified by their index. However, those index are dependent on * the variable ordering, which can only be known once all variables are known. Hence, the * computation of the index can only be achieved at a later stage. A variable is always associated * to a bound, even if none are specified (See LNBound above)/ */ class NLVar { public: /** Variable name. */ std::string name; /** Is the variable an integer variable? Else is a floating point variable. */ bool isInteger = false; /** Is this variable flagged to be reported? */ bool toReport = false; /** Is the variable appearing in a nonlinear constraint (including logical constraint, L segment). */ bool isInNLConstraint = false; /** Is the variable appearing non linearly in the objective? */ bool isInNLObjective = false; /** Number of occurrences in Jacobian. */ unsigned int jacobianCount = 0; /** The bound over this variable. * Used when producing the unique 'b' segment of the NL file. */ NLBound bound; /* *** *** *** Constructors *** *** *** */ NLVar() = default; /** Constructor with declare time information */ NLVar(std::string name, bool isInteger, bool to_report, NLBound bound) : name(std::move(name)), isInteger(isInteger), toReport(to_report), bound(bound) {} /** Copy constructor, with update on bound */ NLVar copyWithBound(NLBound bound) const; }; /** A NLArray: * We do not use "real" array. * This type only serves when sending the result back to minizinc */ class NLArray { public: /** Array item; if the string is empty, use the value. */ class Item { public: std::string variable; double value; }; /** Array name */ std::string name; /** Dimensions part, e.g. array2d( '0..4', '0..5' [ .... ]) */ std::vector dimensions; /** Related variables */ std::vector items; /** Is this an array or integers or floats? */ bool isInteger = false; }; /** A token from an 'expression graph'. * An expression graph is express in Polish Prefix Notation: operator followed by operand. * A token represent an operator or an operand. * See the definition of the various enum. */ class NLToken { public: /** Kind of token. */ enum Kind { NUMERIC, // "n42.42" a numeric constant, double VARIABLE, // "v4" reference to a decision variable 0<= i < nb_vars (see header) or a // defined variable for i>=nb_vars STRING, // "h11:some string" Probably unused in our case. FUNCALL, // "f0 3" Call a defined function (index 0, 3 args). Probably unused in // our case. OP, // "o5" An operation defined by its operation code MOP // "o7\n3" Operator with multiple operand. The number of operands (3) is on // the next line ("\n")? }; /** Opcode for operator with a fixed number of operands. */ enum OpCode { OPPLUS = 0, OPMINUS = 1, OPMULT = 2, OPDIV = 3, OPREM = 4, OPPOW = 5, OPLESS = 6, FLOOR = 13, CEIL = 14, ABS = 15, OPUMINUS = 16, OPOR = 20, OPAND = 21, LT = 22, LE = 23, EQ = 24, GE = 28, GT = 29, NE = 30, OPNOT = 34, OPIFnl = 35, OP_tanh = 37, OP_tan = 38, OP_sqrt = 39, OP_sinh = 40, OP_sin = 41, OP_log10 = 42, OP_log = 43, OP_exp = 44, OP_cosh = 45, OP_cos = 46, OP_atanh = 47, OP_atan2 = 48, OP_atan = 49, OP_asinh = 50, OP_asin = 51, OP_acosh = 52, OP_acos = 53, OPintDIV = 55, OPprecision = 56, OPround = 57, OPtrunc = 58, OPATLEAST = 62, OPATMOST = 63, OPPLTERM = 64, OPIFSYM = 65, OPEXACTLY = 66, OPNOTATLEAST = 67, OPNOTATMOST = 68, OPNOTEXACTLY = 69, OPIMPELSE = 72, OP_IFF = 73, OPSOMESAME = 75, OP1POW = 76, OP2POW = 77, OPCPOW = 78, OPFUNCALL = 79, OPNUM = 80, OPHOL = 81, OPVARVAL = 82, N_OPS = 83, }; /** Opcodes for operand taking multiple arguments. */ enum MOpCode { MINLIST = 11, MAXLIST = 12, OPSUMLIST = 54, OPCOUNT = 59, OPNUMBEROF = 60, OPNUMBEROFs = 61, ANDLIST = 70, ORLIST = 71, OPALLDIFF = 74, }; /** Obtain the name of an operator from its opcode. */ static const char* getName(OpCode oc); /** Obtain the name of an operator (with multiple operands) from its opcode. */ static const char* getName(MOpCode moc); /* *** *** *** Fields *** *** *** */ Kind kind; double numericValue; // if kind==NUMERIC int argCount; // if kind==FUNCALL or kind==MOP std::string str; // if kind==STRING or kind=VARIABLE (variable name) or kind=FUNCALL (function name) OpCode oc; // if kind==OP MOpCode moc; // if kind==MOP /* *** *** *** Constructor and helpers *** *** *** */ NLToken() = default; static NLToken n(double value); static NLToken v(std::string vname); static NLToken o(OpCode opc); static NLToken mo(MOpCode mopc, int nb); /* *** *** *** Query *** *** *** */ bool isVariable() const; bool isConstant() const; /* *** *** *** Printable *** *** *** */ std::ostream& printToStream(std::ostream& o, const NLFile& nl_file) const; }; /** A algebraic constraint. * Contains both a linear and a non linear part. * We do not handle network constraints. */ class NLAlgCons { public: /** Constraint name, also acts as identifier. */ std::string name; /** Bound on the algebraic constraint. * Used when producing the unique r of the NL file. */ NLBound range; /** Expression graph, used for the non linear part. * Used to produce a new, standalone, C segment. * If the expression graph is empty (linear constraint), produce the expression graph 'n0' */ std::vector expressionGraph = {}; /** Jacobian, used for the linear part. Identify a variable by its name and associate a * coefficent. Used to produce a new, standalone, J segment. */ std::vector> jacobian = {}; /** Method to build the var_coeff vector. * The NLFile is used to access the variables through their name in order to increase their * jacobian count. */ void setJacobian(const std::vector& vnames, const std::vector& coeffs, NLFile* nl_file); /* *** *** *** Helpers *** *** *** */ /** A constraint is considered linear if the expressionGraph is empty. */ bool isLinear() const; /* *** *** *** Printable *** *** *** */ std::ostream& printToStream(std::ostream& o, const NLFile& nl_file) const; }; /** A logical constraint. * Contains only a non linear part. * We do not handle network constraints. * Logical constraint stands on their own and do not need any identifier. * However, for consistency sake, we still keep their name. */ class NLLogicalCons { public: /** Constraint name, also acts as identifier. */ std::string name; /** Index */ int index = -1; /** Expression graph, used for the non linear part. * Used to produce a new, standalone, L segment. * If the expression graph is empty (linear constraint), produce the expression graph 'n0' */ std::vector expressionGraph = {}; /* *** *** *** Constructor *** *** *** */ NLLogicalCons(int idx) : index(idx) {} /* *** *** *** Printable *** *** *** */ std::ostream& printToStream(std::ostream& o, const NLFile& nl_file) const; }; /** The header. */ class NLHeader { public: /* *** *** *** Printable *** *** *** */ static std::ostream& printToStream(std::ostream& o, const NLFile& nl_file); }; /** An Objective * In an NL file, we can have several of those. * However, in flatzinc, only one is allowed, so we only have one. * Note that in NL, we do not have a "satisfy" objective, only a minimize or maximize one. * We translate the "satisfy" with "minimize n0". */ class NLObjective { public: enum MinMax { UNDEF = -2, SATISFY = -1, MINIMIZE = 0, MAXIMIZE = 1, }; /* *** *** *** Fields *** *** *** */ MinMax minmax = UNDEF; std::vector expressionGraph = {}; // If empty, produce a 'n0' when printing /* *** *** *** Gradient *** *** *** */ /** Gradient, used for the linear part. Identify a variable by its name and associate a * coefficent. Used to produce a new, standalone, G segment. */ std::vector> gradient = {}; /** Method to build the var_coeff vector. */ void setGradient(const std::vector& vnames, const std::vector& coeffs); int gradientCount() const; /* *** *** *** Helpers *** *** *** */ bool isDefined() const; bool isLinear() const; bool isOptimisation() const; /* *** *** *** Constructor *** *** *** */ NLObjective() = default; /* *** *** *** Printable *** *** *** */ std::ostream& printToStream(std::ostream& o, const NLFile& nl_file) const; }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/nl/nl_solreader.hh0000644000175000017500000001011313757304533023037 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include #include #include // Reading a .sol file. // Note: I did not find any description of the format, so I did a bit of reverse engineering. // A sol file looks like this (first line is the 'message...' line) /* message from the solver Options 3 1 1 0 1 0 2 2 1 2 objno 0 0 */ // A sol file does not contains comments, and the blank line between the message and 'Options' is // meaningfull. Now, with our own comments. /* message from the solver # Starts on first line. Can span several line as long as their is no blank line # the blank line marks the end of the message Options # Inform about option used by the solver (?). May be absent. 3 # Number of options. 1 # opt 1 Note: I did not fully understand this, but reading "hooking your solver" 1 # opt 2 suggests that we can (probably) ignore that. 0 # opt 3 1 # Number A of dual before "suf_sos()" (before solving ?) 0 # Number of dual after. Seems to be either A or 0. Will probably always be 0 (???) 2 # Number B of primal before "suf_sos()" (before solving ?) 2 # Number of primal after. Seems to be either B or 0 1 # No dual. So this is the result for the first primal (variable indice 0) 2 # result for variable indice 1 objno 0 0 # Objectif 0 */ // Result code can be : // (from https://github.com/ampl/mp/blob/master/include/mp/common.h) // UNKNOWN = -1, // SOLVED = 0, // Optimal sol found for an optim problem or a feasible solution found for a // satisfaction problem. UNCERTAIN = 100, // Solution returned but it can be non-optimal or even // infeasible. INFEASIBLE = 200, UNBOUNDED = 300, // Problem is unbounded. LIMIT = 400, // // Stopped by a limit, e.g. on iterations or time. FAILURE = 500, // A solver error. // INTERRUPTED = 600 // Interrupted by the user. namespace MiniZinc { /** Declaration of the exit codes. */ enum NL_Solver_Status { PARSE_ERROR = -2, // We are adding our own error code for parsing UNKNOWN = -1, SOLVED = 0, // Optimal sol found for an optim problem or a feasible solution found for a // satisfaction problem. UNCERTAIN = 100, // Solution returned but it can be non-optimal or even infeasible. INFEASIBLE = 200, UNBOUNDED = 300, // Problem is unbounded. LIMIT = 400, // Stopped by a limit, e.g. on iterations or time. FAILURE = 500, // A solver error. INTERRUPTED = 600 // Interrupted by the user. }; /** Represent a solution read from a file '.sol'. */ class NLSol { public: // --- --- --- Fields std::string message; NL_Solver_Status status; std::vector values; // --- --- --- Constructors NLSol() = default; NLSol(std::string mes, NL_Solver_Status st, std::vector res) : message(std::move(mes)), status(st), values(std::move(res)) {} // --- --- --- Static functions static NLSol parseSolution(std::istream& in); }; /** Our version of Solns2Out **/ class NLSolns2Out { private: Solns2Out* _out; NLFile& _nlFile; std::ofstream _dummyOfstream; // Controls for feedRawDataChunk bool _inLine; bool _verbose; public: NLSolns2Out(Solns2Out* out0, NLFile& nl_file0, bool verbose0) : _out(out0), _nlFile(nl_file0), _inLine(false), _verbose(verbose0) {} void parseSolution(const std::string& filename); bool feedRawDataChunk(const char* data); std::ostream& getLog(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/nl/nl_file.hh0000644000175000017500000005736113757304533022016 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Main author: Matthieu Herrmann, Monash University, Melbourne, Australia. 2019 */ #pragma once #include #include #include #include #include #include #include // This files declare data-structure describing the various components of a nl files. // A nl files is composed of two main parts: a header and a list of segments. // The header contains statistics and meta information about the model. // The segments allow to describe the model, i.e. the variables, the constraints and objectives. // The order of the segments and, when relevant, the order of their content // (e.g. a segment declaring a list of variables) matters. /** NL File. * Good to know: * * We use string as variable unique identifier. * Given a MZN variable declaration (can be obtain from a MZN variable), the 'getVarName' * helper produces the string. * * In our case, we only have one 'solve' per file. * * NL file use double everywhere. Hence, even with dealing with integer variable, we store * the information with double. * */ namespace MiniZinc { // --- --- --- NL Files class NLFile { public: /* *** *** *** Helpers *** *** *** */ /** Create a string representing the name (and unique identifier) from an identifier. */ static std::string getVarName(const Id* id); /** Create a string representing the name (and unique identifier) of a variable from a variable * declaration. */ static std::string getVarName(const VarDecl& vd); /** Create a string representing the name (and unique identifier) of a constraint from a specific * call expression. */ static std::string getConstraintName(const Call& c); /** Extract an array literal from an expression. */ static const ArrayLit& getArrayLit(const Expression* e); /** Create a vector of double from a vector containing Expression being integer literal IntLit. */ static std::vector fromVecInt(const ArrayLit& v_int); /** Create a vector of double from a vector containing Expression being float literal FloatLit. */ static std::vector fromVecFloat(const ArrayLit& v_fp); /** Create a vector of variable names from a vector containing Expression being identifier Id. */ static std::vector fromVecId(const ArrayLit& v_id); /* *** *** *** Phase 1: collecting data from MZN *** *** *** */ // Variables collection, identified by name // Needs ordering, see phase 2 std::map variables = {}; // Algebraic constraints collection, identified by name // Needs ordering, see phase 2 std::map constraints = {}; // Logical constraints do not need ordering: std::vector logicalConstraints = {}; // Objective field. Only one, so we do not need ordering. NLObjective objective = {}; // Output arrays std::vector outputArrays = {}; /** Add a solve goal in the NL File. In our case, we can only have one and only one solve goal. */ void addSolve(SolveI::SolveType st, const Expression* e); /** Add a variable declaration in the NL File. * This function pre-analyse the declaration VarDecl, then delegate to addVarDeclInteger or * addVarDeclFloat. Analyse a variable declaration 'vd' of type 'ti' with an 'rhs'. The variable * declaration gives us access to the variable name while the type allows us to discriminate * between integer, floating point value and arrays. Array are ignored (not declared): if we * encouter an array in a constraint, we can find the array through the variable (ot it is a * litteral). Notes: - We use -Glinear, so we do not have boolean. * - This will change TODO keep checking comment and code consistency. * * RHS is for arrays: it contains the definition of the array. * * The type also gives us the domain, which can be: * NULL: no restriction over the variable * SetLit: Gives us a lower and upper bound * If a variable is bounded only on one side, then the domain is NULL and the bound is expressed * through a constraint. */ void addVarDecl(const VarDecl& vd, const TypeInst& ti, const Expression& rhs); /** Add an integer variable declaration to the NL File. */ void addVarDeclInteger(const std::string& name, const IntSetVal* isv, bool toReport); /** Add a floating point variable declaration to the NL File. */ void addVarDeclFloat(const std::string& name, const FloatSetVal* fsv, bool toReport); // --- --- --- Constraints analysis /** Add a constraint to the NL File. * This method is a dispatcher for all the other constraints methods below. */ void analyseConstraint(const Call& c); // --- --- --- Helpers /** Create a token from an expression representing a variable. * ONLY USE FOR CONSTRAINT, NOT OBJECTIVES! (UPDATE VARIABLES FLAG FOR CONSTRAINTS) */ static NLToken getTokenFromVar(const Expression* e); /** Create a token from an expression representing either a variable or an integer numeric value. * ONLY USE FOR CONSTRAINT, NOT OBJECTIVES! */ static NLToken getTokenFromVarOrInt(const Expression* e); /** Create a token from an expression representing either a variable or a floating point numeric * value. ONLY USE FOR CONSTRAINT, NOT OBJECTIVES! */ static NLToken getTokenFromVarOrFloat(const Expression* e); /** Update an expression graph (only by appending token) with a linear combination * of coefficients and variables. * ONLY USE FOR CONSTRAINTS, NOT OBJECTIVES! */ static void makeSigmaMult(std::vector& expressionGraph, const std::vector& coeffs, const std::vector& vars); // --- --- --- Linear Builders // Use an array of literals 'coeffs' := c.arg(0), an array of variables 'vars' := c.arg(1), // and a variable or literal 'value' := c.arg(2). // [coeffs] and value are fixed (no variable allowed). // The call is needed to create the name. However, the extraction of the coefficients and the // value is left to the calling function as this could be use with both integer and floating point // (we only have floating point in NL) /** Create a linear constraint [coeffs] *+ [vars] = value. */ void linconsEq(const Call& c, const std::vector& coeffs, const std::vector& vars, const NLToken& value); /** Create a linear constraint [coeffs] *+ [vars] <= value. */ void linconsLe(const Call& c, const std::vector& coeffs, const std::vector& vars, const NLToken& value); /** Create a linear logical constraint [coeffs] *+ [vars] PREDICATE value. * Use a generic comparison operator. * Warnings: - Creates a logical constraint * - Only use for conmparisons that cannot be expressed with '=' xor '<='. */ void linconsPredicate(const Call& c, NLToken::OpCode oc, const std::vector& coeffs, const std::vector& vars, const NLToken& value); // --- --- --- Non Linear Builders // For predicates, uses 2 variables or literals: x := c.arg(0), y := c.arg(1) // x PREDICATE y // For unary operations, uses 2 variables or literals: x := c.arg(0), y := c.arg(1) // OPEARTOR x = y // For binary operations, uses 3 variables or literals: x := c.arg(0), y := c.arg(1), and z := // c.arg(2). x OPERATOR y = z /** Create a non linear constraint x = y * Use the jacobian and the bound on constraint to translate into x - y = 0 * Simply update the bound if one is a constant. */ void nlconsEq(const Call& c, const NLToken& x, const NLToken& y); /** Create a non linear constraint x <= y * Use the jacobian and the bound on constraint to translate into x - y <= 0 * Simply update the bound if one is a constant. */ void nlconsLe(const Call& c, const NLToken& x, const NLToken& y); /** Create a non linear constraint with a predicate: x PREDICATE y * Use a generic comparison operator. * Warnings: - Creates a logical constraint * - Only use for conmparisons that cannot be expressed with '=' xor '<='. */ void nlconsPredicate(const Call& c, NLToken::OpCode oc, const NLToken& x, const NLToken& y); /** Create a non linear constraint with a binary operator: x OPERATOR y = z */ void nlconsOperatorBinary(const Call& c, NLToken::OpCode oc, const NLToken& x, const NLToken& y, const NLToken& z); /** Create a non linear constraint with a binary operator: x OPERATOR y = z. * OPERATOR is now a Multiop, with a count of 2 (so the choice of the method to use depends on * the LN implementation) */ void nlconsOperatorBinary(const Call& c, NLToken::MOpCode moc, const NLToken& x, const NLToken& y, const NLToken& z); /** Create a non linear constraint with an unary operator: OPERATOR x = y */ void nlconsOperatorUnary(const Call& c, NLToken::OpCode oc, const NLToken& x, const NLToken& y); /** Create a non linear constraint, specialized for log2 unary operator: Log2(x) = y */ void nlconsOperatorUnaryLog2(const Call& c, const NLToken& x, const NLToken& y); // --- --- --- Integer Linear Constraints /** Linar constraint: [coeffs] *+ [vars] = value */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_lin_eq(const Call& c); /** Linar constraint: [coeffs] *+ [vars] =< value */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_lin_le(const Call& c); /** Linar constraint: [coeffs] *+ [vars] != value */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_lin_ne(const Call& c); // --- --- --- Integer Non Linear Predicate Constraints /** Non linear constraint x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_eq(const Call& c); /** Non linear constraint x <= y */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_le(const Call& c); /** Non linear constraint x != y */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_ne(const Call& c); // --- --- --- Integer Non Linear Binary Operator Constraints /** Non linear constraint x + y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_plus(const Call& c); /** Non linear constraint x * y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_times(const Call& c); /** Non linear constraint x / y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_div(const Call& c); /** Non linear constraint x mod y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consint_mod(const Call& c); /** Non linear constraint x pow y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void int_pow(const Call& c); /** Non linear constraint max(x, y) = z */ // NOLINTNEXTLINE(readability-identifier-naming) void int_max(const Call& c); /** Non linear constraint min(x, y) = z */ // NOLINTNEXTLINE(readability-identifier-naming) void int_min(const Call& c); // --- --- --- Integer Non Linear Unary Operator Constraints // NOLINTNEXTLINE(readability-identifier-naming) void int_abs(const Call& c); // --- --- --- Floating Point Linear Constraints /** Linar constraint: [coeffs] *+ [vars] = value */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_lin_eq(const Call& c); /** Linar constraint: [coeffs] *+ [vars] = value */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_lin_le(const Call& c); /** Linar constraint: [coeffs] *+ [vars] != value */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_lin_ne(const Call& c); /** Linar constraint: [coeffs] *+ [vars] < value */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_lin_lt(const Call& c); // --- --- --- Floating Point Non Linear Predicate Constraints /** Non linear constraint x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_eq(const Call& c); /** Non linear constraint x <= y */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_le(const Call& c); /** Non linear constraint x != y */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_ne(const Call& c); /** Non linear constraint x < y */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_lt(const Call& c); // --- --- --- Floating Point Non Linear Binary Operator Constraints /** Non linear constraint x + y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_plus(const Call& c); /** Non linear constraint x - y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_minus(const Call& c); /** Non linear constraint x * y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_times(const Call& c); /** Non linear constraint x / y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_div(const Call& c); /** Non linear constraint x mod y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void consfp_mod(const Call& c); /** Non linear constraint x pow y = z */ // NOLINTNEXTLINE(readability-identifier-naming) void float_pow(const Call& c); /** Non linear constraint max(x, y) = z */ // NOLINTNEXTLINE(readability-identifier-naming) void float_max(const Call& c); /** Non linear constraint min(x, y) = z */ // NOLINTNEXTLINE(readability-identifier-naming) void float_min(const Call& c); // --- --- --- Floating Point Non Linear Unary Operator Constraints /** Non linear constraint abs x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_abs(const Call& c); /** Non linear constraint acos x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_acos(const Call& c); /** Non linear constraint acosh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_acosh(const Call& c); /** Non linear constraint asin x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_asin(const Call& c); /** Non linear constraint asinh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_asinh(const Call& c); /** Non linear constraint atan x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_atan(const Call& c); /** Non linear constraint atanh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_atanh(const Call& c); /** Non linear constraint cos x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_cos(const Call& c); /** Non linear constraint cosh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_cosh(const Call& c); /** Non linear constraint exp x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_exp(const Call& c); /** Non linear constraint ln x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_ln(const Call& c); /** Non linear constraint log10 x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_log10(const Call& c); /** Non linear constraint log2 x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_log2(const Call& c); /** Non linear constraint sqrt x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_sqrt(const Call& c); /** Non linear constraint sin x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_sin(const Call& c); /** Non linear constraint sinh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_sinh(const Call& c); /** Non linear constraint tan x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_tan(const Call& c); /** Non linear constraint tanh x = y */ // NOLINTNEXTLINE(readability-identifier-naming) void float_tanh(const Call& c); // --- --- --- Other /** Integer x to floating point y. Constraint x = y translated into x - y = 0. */ // NOLINTNEXTLINE(readability-identifier-naming) void int2float(const Call& c); /* *** *** *** Phase 2: processing *** *** *** */ void phase2(); // Ordering of variables according to "hooking your solver" /* Meaning of the names (total, then by appearance order in the tables below) n_var total number of variables nlvc number of variables appearing nonlinearly in constraints nlvo number of variables appearing nonlinearly in objectives nwv number of linear arcs niv number of "other" integer variables nbv number of binary variables Order of variables (yes, the way things are counted is... "special".) Category Count --- --- --- --- | --- --- --- --- --- nonlinear max(nlvc, nlvo) // See below for order on non linear variables linear arcs nwv // Not implemented other linear n_var − (max {nlvc, nlvo} + niv + nbv + nwv) // Linear Continuous binary nbv // Booleans other integer niv // Linear Integer Order of non linear variables (see 'nonlinear' above) Meaning of the names: nlvb number of variables appearing nonlinearly in both constraints and objectives nlvbi number of integer variables appearing nonlinearly in both constraints and objectives nlvc number of variables appearing nonlinearly in constraints nlvci number of integer variables appearing nonlinearly in constraints **only** nlvo number of variables appearing nonlinearly in objectives nlvoi number of integer variables appearing nonlinearly in objectives **only** Category Count --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- --- Continuous in BOTH an objective AND a constraint | nlvb - nlvbi Integer, in BOTH an objective AND a constraint | nlvbi Continuous, in constraints only | nlvc − (nlvb + nlvci) Integer, in constraints only | nlvci Continous, in objectives only | nlvo − (nlvc + nlvoi) Integer, in objectives only | nlvoi */ /** Non Linear Continuous Variables in BOTH an objective and a constraint. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nlcv_both = {}; /** Non Linear Integer Variables in BOTH an objective and a constraint. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nliv_both = {}; /** Non Linear Continuous Variables in CONStraints only. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nlcv_cons = {}; /** Non Linear Integer Variables in CONStraints only. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nliv_cons = {}; /** Non Linear Continuous Variables in OBJectives only. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nlcv_obj = {}; /** Non Linear Integer Variables in OBJectives only. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_nliv_obj = {}; /** Linear arcs. (Network not implemented) */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_larc_all = {}; /** Linear Continuous Variables (ALL of them). */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_lcv_all = {}; /** Binary Variables (ALL of them). */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_bv_all = {}; /** Linear Integer Variables (ALL of them). */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector vname_liv_all = {}; /** Contained all ordered variable names. Mapping variable index -> variable name */ std::vector vnames = {}; /** Mapping variable name -> variable index */ std::map variableIndexes = {}; // --- --- --- Simple tests bool hasIntegerVars() const; bool hasContinousVars() const; // --- --- --- Variables counts // When the phase 2 is done, all the following counts should be available. // taken from "hooking your solver" and used in the above explanatios /** Total number of variables. */ unsigned int varCount() const; /** Number of variables appearing nonlinearly in constraints. */ unsigned int lvcCount() const; /** Number of variables appearing nonlinearly in objectives. */ unsigned int lvoCount() const; /** Number of variables appearing nonlinearly in both constraints and objectives.*/ unsigned int lvbCount() const; /** Number of integer variables appearing nonlinearly in both constraints and objectives.*/ unsigned int lvbiCount() const; /** Number of integer variables appearing nonlinearly in constraints **only**.*/ unsigned int lvciCount() const; /** Number of integer variables appearing nonlinearly in objectives **only**.*/ unsigned int lvoiCount() const; /** Number of linear arcs .*/ unsigned int wvCount() const; /** Number of "other" integer variables.*/ unsigned int ivCount() const; /** Number of binary variables.*/ unsigned int bvCount() const; /** Accumulation of Jacobian counts. */ unsigned int jacobianCount() const; // Ordering of constraints according to "hooking your solver" /* Meaning of the names: n_con Total number of constraint nlc Number of nonlinear general constraint, including network constraint nlnc Number of nonlinear network constraint lnc Number of linear network constraint Order of constraints: Category Count --- --- --- --- --- | --- --- --- --- --- Nonlinear general nlc - nlnc Nonlinear network nlnc Linear network lnc Linear general n_con - (nlc + lnc) */ /** Nonlinear general constraints. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector cnames_nl_general = {}; /** Nonlinear network constraints. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector cnames_nl_network = {}; /** Linear network constraints. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector cnames_lin_network = {}; /** Linear general constraints. */ // NOLINTNEXTLINE(readability-identifier-naming) std::vector cnames_lin_general = {}; /** Contained all ordered algebraic (and network if they were implemented) constraints names. * Mapping constraint index -> constraint name */ std::vector cnames = {}; /** Mapping constraint name -> contraint index */ std::map constraintIndexes = {}; // Count of algebraic constraints: // The header needs to know how many range algebraic constraints and equality algebraic // constraints we have. /** Number of range algebraic constraints */ int algConsRangeCount = 0; /** equality algebraic constraints */ int algConsEqCount = 0; /* *** *** *** Constructor *** *** *** */ NLFile() = default; /* *** *** *** Printable *** *** *** */ /** Print the NLFile on a stream. * Note: this is not the 'Printable' interface as we do not pass any nl_file (that would be * 'this') as a reference. */ std::ostream& printToStream(std::ostream& o) const; private: unsigned int _jacobianCount = 0; }; } // End of NameSpace MiniZinc libminizinc-2.5.3/include/minizinc/solvers/nl/nl_solverfactory.hh0000644000175000017500000000063313757304533023767 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once namespace MiniZinc { class NLSolverFactoryInitialiser { public: NLSolverFactoryInitialiser(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/output.hh0000644000175000017500000000235513757304533017631 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { /// Remove all output annotations from \a vd void remove_is_output(VarDecl* vd); /// Copy output item to FlatZinc model void copy_output(EnvI& e); /// Copy all dependent variable declarations void output_vardecls(EnvI& env, Item* ci, Expression* e); /// Create initial output model void create_output(EnvI& e, FlatteningOptions::OutputMode outputMode, bool outputObjective, bool includeOutputItem, bool hasChecker); void check_output_par_fn(EnvI& e, Call* rhs); /// Finalise output model after flattening is complete void finalise_output(EnvI& e); /// Remove all links to variables in flat model from output model in \a env void cleanup_output(EnvI& env); ArrayLit* create__json_output(EnvI& env, bool outputObjective, bool includeOutputItem, bool hasChecker); } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/optimize_constraints.hh0000644000175000017500000000160413757304533022554 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include namespace MiniZinc { class OptimizeRegistry { public: enum ConstraintStatus { CS_NONE, CS_OK, CS_FAILED, CS_ENTAILED, CS_REWRITE }; typedef ConstraintStatus (*optimizer)(EnvI& env, Item* i, Call* c, Expression*& rewrite); protected: ASTStringMap _m; public: void reg(const ASTString& call, optimizer opt); ConstraintStatus process(EnvI& env, Item* i, Call* c, Expression*& rewrite); static OptimizeRegistry& registry(); }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/iter.hh0000644000175000017500000004217113757304533017234 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif namespace MiniZinc { namespace Ranges { /** * \brief Base for range iterators with explicit min and max * * The iterator provides members \a mi and \a ma for storing the * limits of the currently iterated range. The iterator * continues until \a mi becomes greater than \a ma. The member function * finish does exactly that. * * \ingroup FuncIterRanges */ template class MinMax { protected: /// Minimum of current range Val _mi; /// Maximum of current range Val _ma; /// %Set range such that iteration stops void finish(); public: /// \name Constructors and initialization //@{ /// Default constructor MinMax(); /// Initialize with range \a min to \a max MinMax(Val min, Val max); //@} /// \name Iteration control //@{ /// Test whether iterator is still at a range or done bool operator()() const; //@} /// \name Range access //@{ /// Return smallest value of range Val min() const; /// Return largest value of range Val max() const; /// Return width of range (distance between minimum and maximum) Val width() const; //@} }; template inline void MinMax::finish() { _mi = 1; _ma = 0; } template inline MinMax::MinMax() {} template inline MinMax::MinMax(Val min, Val max) : _mi(min), _ma(max) {} template inline bool MinMax::operator()() const { return _mi <= _ma; } template inline Val MinMax::min() const { return _mi; } template inline Val MinMax::max() const { return _ma; } template inline Val MinMax::width() const { if (_mi > _ma) { return 0; } if (_mi.isFinite() && _ma.isFinite()) { return _ma - _mi + 1; } return Val::infinity(); } template class Bounded { protected: I _i; Val _min; bool _useMin; Val _max; bool _useMax; Bounded(I& i, Val min0, bool umin0, Val max0, bool umax0); public: static Bounded miniter(I& i, Val min); static Bounded maxiter(I& i, Val max); static Bounded minmaxiter(I& i, Val min, Val max); /// \name Iteration control //@{ /// Test whether iterator is still at a range or done bool operator()() const; /// Move iterator to next range (if possible) void operator++(); //@} /// \name Range access //@{ /// Return smallest value of range Val min() const; /// Return largest value of range Val max() const; /// Return width of range (distance between minimum and maximum) Val width() const; //@} }; template inline Bounded::Bounded(I& i, Val min0, bool umin0, Val max0, bool umax0) : _i(i), _min(min0), _useMin(umin0), _max(max0), _useMax(umax0) { while (_i() && _useMin && _i.max() < _min) { ++_i; } } template inline Bounded Bounded::miniter(I& i, Val min) { return Bounded(i, min, true, 0, false); } template inline Bounded Bounded::maxiter(I& i, Val max) { return Bounded(i, 0, false, max, true); } template inline Bounded Bounded::minmaxiter(I& i, Val min, Val max) { return Bounded(i, min, true, max, true); } template inline bool Bounded::operator()() const { return _i() && (!_useMax || _i.min() <= _max); } template inline void Bounded::operator++() { ++_i; while (_i() && _useMin && _i.max() < _min) { ++_i; } } template inline Val Bounded::min() const { return _useMin ? std::max(_min, _i.min()) : _i.min(); } template inline Val Bounded::max() const { return _useMax ? std::min(_max, _i.max()) : _i.max(); } template inline Val Bounded::width() const { if (min() > max()) { return 0; } if (min().isFinite() && max().isFinite()) { return max() - min() + 1; } return Val::infinity(); } template class Const { protected: Val _min; Val _max; bool _done; public: Const(Val min0, Val max0); /// \name Iteration control //@{ /// Test whether iterator is still at a range or done bool operator()() const; /// Move iterator to next range (if possible) void operator++(); //@} /// \name Range access //@{ /// Return smallest value of range Val min() const; /// Return largest value of range Val max() const; /// Return width of range (distance between minimum and maximum) Val width() const; //@} }; template inline Const::Const(Val min0, Val max0) : _min(min0), _max(max0), _done(min0 > max0) {} template inline bool Const::operator()() const { return !_done; } template inline void Const::operator++() { _done = true; } template inline Val Const::min() const { return _min; } template inline Val Const::max() const { return _max; } template inline Val Const::width() const { if (min() > max()) { return 0; } if (min().isFinite() && max().isFinite()) { return max() - min() + 1; } return Val::infinity(); } /** * \brief Range iterator for computing union (binary) * * \ingroup FuncIterRanges */ template class Union : public MinMax { protected: /// First iterator I _i; /// Second iterator J _j; public: /// \name Constructors and initialization //@{ /// Default constructor Union(); /// Initialize with iterator \a i and \a j Union(I& i, J& j); /// Initialize with iterator \a i and \a j void init(I& i, J& j); //@} /// \name Iteration control //@{ /// Move iterator to next range (if possible) void operator++(); //@} }; /// Return whether an interval ending with \a x overlaps with an interval starting at \a y inline bool overlaps(const IntVal& x, const IntVal& y) { return x.plus(1) >= y; } /// Return whether an interval ending with \a x overlaps with an interval starting at \a y inline bool overlaps(const FloatVal& x, const FloatVal& y) { if (x.isPlusInfinity()) { return true; } if (y.isMinusInfinity()) { return true; } if (x.isFinite() && y.isFinite()) { return std::nextafter(x.toDouble(), INFINITY) >= y.toDouble(); } return x >= y; } inline IntVal next_higher(const IntVal& x) { return x.plus(1); } inline IntVal next_lower(const IntVal& x) { return x.minus(1); } inline FloatVal next_higher(const FloatVal& x) { if (x.isFinite()) { return std::nextafter(x.toDouble(), INFINITY); } return x; } inline FloatVal next_lower(const FloatVal& x) { if (x.isFinite()) { return std::nextafter(x.toDouble(), -INFINITY); } return x; } /* * Binary union * */ template inline void Union::operator++() { if (!_i() && !_j()) { MinMax::finish(); return; } if (!_i() || (_j() && (!overlaps(_j.max(), _i.min())))) { MinMax::_mi = _j.min(); MinMax::_ma = _j.max(); ++_j; return; } if (!_j() || (_i() && (!overlaps(_i.max(), _j.min())))) { MinMax::_mi = _i.min(); MinMax::_ma = _i.max(); ++_i; return; } MinMax::_mi = std::min(_i.min(), _j.min()); MinMax::_ma = std::max(_i.max(), _j.max()); ++_i; ++_j; next: if (_i() && (overlaps(MinMax::_ma, _i.min()))) { MinMax::_ma = std::max(MinMax::_ma, _i.max()); ++_i; goto next; } if (_j() && (overlaps(MinMax::_ma, _j.min()))) { MinMax::_ma = std::max(MinMax::_ma, _j.max()); ++_j; goto next; } } template inline Union::Union() {} template inline Union::Union(I& i, J& j) : _i(i), _j(j) { operator++(); } template inline void Union::init(I& i, J& j) { _i = i; _j = j; operator++(); } /** * \brief Range iterator for computing intersection (binary) * * \ingroup FuncIterRanges */ template class Inter : public MinMax { protected: /// First iterator I _i; /// Second iterator J _j; public: /// \name Constructors and initialization //@{ /// Default constructor Inter(); /// Initialize with iterator \a i and \a j Inter(I& i, J& j); /// Initialize with iterator \a i and \a j void init(I& i, J& j); //@} /// \name Iteration control //@{ /// Move iterator to next range (if possible) void operator++(); //@} }; /* * Binary intersection * */ template inline void Inter::operator++() { if (!_i() || !_j()) { goto done; } do { while (_i() && (_i.max() < _j.min())) { ++_i; } if (!_i()) { goto done; } while (_j() && (_j.max() < _i.min())) { ++_j; } if (!_j()) { goto done; } } while (_i.max() < _j.min()); // Now the intervals overlap: consume the smaller interval MinMax::_ma = std::min(_i.max(), _j.max()); MinMax::_mi = std::max(_i.min(), _j.min()); if (_i.max() < _j.max()) { ++_i; } else { ++_j; } return; done: MinMax::finish(); } template inline Inter::Inter() {} template inline Inter::Inter(I& i, J& j) : _i(i), _j(j) { operator++(); } template inline void Inter::init(I& i, J& j) { _i = i; _j = j; operator++(); } /** * \brief Range iterator for computing set difference * * \ingroup FuncIterRanges */ template class Diff : public MinMax { protected: /// Iterator from which to subtract I _i; /// Iterator to be subtracted J _j; public: /// \name Constructors and initialization //@{ /// Default constructor Diff(); /// Initialize with iterator \a i and \a j Diff(I& i, J& j); /// Initialize with iterator \a i and \a j void init(I& i, J& j); //@} /// \name Iteration control //@{ /// Move iterator to next range (if possible) void operator++(); //@} }; template inline void Diff::operator++() { // Precondition: mi <= ma // Task: find next mi greater than ma while (true) { if (!_i()) { break; } bool isInfinite = (!MinMax::_ma.isFinite() && MinMax::_ma > 0); MinMax::_mi = next_higher(MinMax::_ma); MinMax::_ma = _i.max(); if (isInfinite || MinMax::_mi > _i.max()) { ++_i; if (!_i()) { break; } MinMax::_mi = _i.min(); MinMax::_ma = _i.max(); } while (_j() && (_j.max() < MinMax::_mi)) { ++_j; } if (_j() && (_j.min() <= MinMax::_ma)) { // Now the interval [mi ... ma] must be shrunken // Is [mi ... ma] completely consumed? if ((MinMax::_mi >= _j.min()) && (MinMax::_ma <= _j.max())) { continue; } // Does [mi ... ma] overlap on the left? if (_j.min() <= MinMax::_mi) { MinMax::_mi = next_higher(_j.max()); // Search for max! ++_j; if (_j() && (_j.min() <= MinMax::_ma)) { MinMax::_ma = next_lower(_j.min()); } } else { MinMax::_ma = next_lower(_j.min()); } } return; } MinMax::finish(); } template inline Diff::Diff() {} template inline Diff::Diff(I& i, J& j) : _i(i), _j(j) { if (!_i()) { MinMax::finish(); } else { MinMax::_mi = next_lower(_i.min()); MinMax::_ma = MinMax::_mi; operator++(); } } template inline void Diff::init(I& i, J& j) { _i = i; _j = j; if (!_i()) { MinMax::finish(); } else { MinMax::_mi = next_lower(_i.min()); MinMax::_ma = MinMax::_mi; operator++(); } } /** * \brief Value iterator from range iterator * * \ingroup FuncIterValues */ template class ToValues { protected: /// Range iterator used I _i; /// Current value IntVal _cur; /// End of current range IntVal _max; /// Initialize iterator void start(); public: /// \name Constructors and initialization //@{ /// Default constructor ToValues(); /// Initialize with values from range iterator \a i ToValues(I& i); /// Initialize with values from range iterator \a i void init(I& i); //@} /// \name Iteration control //@{ /// Test whether iterator is still at a value or done bool operator()() const; /// Move iterator to next value (if possible) void operator++(); //@} /// \name Value access //@{ /// Return current value IntVal val() const; //@} }; template inline ToValues::ToValues() {} template inline void ToValues::start() { if (_i()) { _cur = _i.min(); _max = _i.max(); } else { _cur = 1; _max = 0; } } template inline ToValues::ToValues(I& i) : _i(i) { start(); } template inline void ToValues::init(I& i) { _i = i; start(); } template inline bool ToValues::operator()() const { return (_cur <= _max); } template inline void ToValues::operator++() { ++_cur; if (_cur > _max) { ++_i; if (_i()) { _cur = _i.min(); _max = _i.max(); } } } template inline IntVal ToValues::val() const { return _cur; } /** * \defgroup FuncIterRangesOp Operations on range iterators * * \ingroup FuncIterRanges */ //@{ /// Cardinality of the set represented by range iterator \a i template IntVal cardinality(I& i); /// Check whether range iterators \a i and \a j are equal template bool equal(I& i, J& j); /// Check whether range iterator \a i is subset of range iterator \a j template bool subset(I& i, J& j); /// Check whether range iterators \a i and \a j are disjoint template bool disjoint(I& i, J& j); /// Comapre two iterators with each other enum CompareStatus { CS_SUBSET, ///< First is subset of second iterator CS_DISJOINT, ///< Intersection is empty CS_NONE ///< Neither of the above }; /// Check whether range iterator \a i is a subset of \a j, or whether they are disjoint template CompareStatus compare(I& i, J& j); //@} template inline IntVal cardinality(I& i) { IntVal s = 0; while (i()) { if (i.width().isFinite()) { s += i.width(); ++i; } else { return IntVal::infinity(); } } return s; } template inline bool equal(I& i, J& j) { // Are i and j equal? while (i() && j()) { if ((i.min() == j.min()) && (i.max() == j.max())) { ++i; ++j; } else { return false; } } return !i() && !j(); } template inline bool subset(I& i, J& j) { // Is i subset of j? while (i() && j()) { if (j.max() < i.min()) { ++j; } else if ((i.min() >= j.min()) && (i.max() <= j.max())) { ++i; } else { return false; } } return !i(); } template inline bool disjoint(I& i, J& j) { // Are i and j disjoint? while (i() && j()) { if (j.max() < i.min()) { ++j; } else if (i.max() < j.min()) { ++i; } else { return false; } } return true; } template inline CompareStatus compare(I& i, J& j) { bool subset = true; bool disjoint = true; while (i() && j()) { if (j.max() < i.min()) { ++j; } else if (i.max() < j.min()) { ++i; subset = false; } else if ((i.min() >= j.min()) && (i.max() <= j.max())) { ++i; disjoint = false; } else if (i.max() <= j.max()) { ++i; disjoint = false; subset = false; } else if (j.max() <= i.max()) { ++j; disjoint = false; subset = false; } } if (i()) { subset = false; } if (subset) { return CS_SUBSET; } return disjoint ? CS_DISJOINT : CS_NONE; } template inline bool less(I& i, J& j) { while (i()) { if (!j()) { return false; } if (i.min() < j.min()) { return true; } if (i.min() > j.min()) { return false; } if (i.max() < j.max()) { return true; } if (i.max() > j.max()) { ++j; return j(); } ++i; ++j; } return static_cast(j()); } template inline bool less_eq(I& i, J& j) { while (i()) { if (!j()) { return false; } if (i.min() < j.min()) { return true; } if (i.min() > j.min()) { return false; } if (i.max() < j.max()) { return true; } if (i.max() > j.max()) { ++j; return j(); } ++i; ++j; } return true; } } // namespace Ranges } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/algorithms/0000755000175000017500000000000013757304533020114 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/algorithms/min_cut.h0000644000175000017500000000063113757304533021723 0ustar kaolkaol#pragma once #include #include namespace Algorithms { /// An interface to some min-cut algorithm for undirected graphs class MinCut { public: /// INPUT int nNodes = 0; std::vector > edges; std::vector weights; /// OUTPUT std::vector parities; double wMinCut = 1e100; /// Invocation static void solve(); }; } // namespace Algorithmslibminizinc-2.5.3/include/minizinc/param_config.hh0000644000175000017500000000362313757304533020715 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jason Nguyen */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef __MINIZINC_PARAM_CONFIG_HH__ #define __MINIZINC_PARAM_CONFIG_HH__ #include #include #include #include #include #include #include namespace MiniZinc { /// Configuration for solver parameters class ParamConfig { protected: std::vector _values; std::unordered_set _blacklist; std::unordered_map _boolSwitches; void addValue(const ASTString& flag, Expression* e); static std::string flagName(const ASTString& flag); static std::string modelToString(Model& model); public: ParamConfig() {} /// Load a configuration from a JSON file void load(const std::string& filename); /// Add given parameter to blacklist void blacklist(const std::string& disallowed); /// Add given parameters to blacklist void blacklist(const std::vector& disallowed); /// Add boolean switch /// When the key is found in the config, then if it's false the negated flag is used void negatedFlag(const std::string& flag, const std::string& negated); /// Return the arguments represented by this configuration const std::vector& argv(); }; class ParamException : public Exception { public: /// Construct with message \a msg ParamException(const std::string& msg) : Exception(msg) {} /// Destructor ~ParamException() throw() override {} /// Return description const char* what() const throw() override { return "MiniZinc: solver parameter error"; } }; } // namespace MiniZinc #endif libminizinc-2.5.3/include/minizinc/support/0000755000175000017500000000000013757304533017457 5ustar kaolkaollibminizinc-2.5.3/include/minizinc/support/regex.hh0000644000175000017500000000245213757304533021115 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Jip J. Dekker */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #ifdef HAS_GECODE // Regex Parser Requirements #include #include #include #include #include #include #undef ERROR // This is a workaround for a bug in flex that only shows up // with the Microsoft C++ compiler #if defined(_MSC_VER) #define YY_NO_UNISTD_H #ifdef __cplusplus extern "C" int isatty(int); #endif #endif // The Microsoft C++ compiler marks certain functions as deprecated, // so let's take the alternative definitions #if defined(_MSC_VER) #define strdup _strdup #define fileno _fileno #endif // Anonymous struct for when yyparse is exported typedef struct REContext REContext; // Parser generated header #include using namespace Gecode; using namespace MiniZinc; // Parsing function std::unique_ptr regex_from_string(const std::string& regex_str, const IntSetVal& domain); #endif // HAS_GECODE libminizinc-2.5.3/include/minizinc/statistics.hh0000644000175000017500000000217713757304533020465 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include namespace MiniZinc { class Statistics { protected: // time in milliseconds unsigned long long _time; // search nodes unsigned long long _nodes; // failures/ backtracks unsigned long long _failures; // current objective value double _objective; public: Statistics() : _time(0), _nodes(0), _failures(0) {} virtual void print(std::ostream& os); void time(unsigned long long t); void nodes(unsigned long long n); void failures(unsigned long long f); void objective(double o); unsigned long long time() const; unsigned long long nodes() const; unsigned long long failures() const; double objective() const; Statistics& operator+=(Statistics& s); virtual void cleanup() { _time = _nodes = _failures = 0; } }; } // namespace MiniZinc libminizinc-2.5.3/include/minizinc/timer.hh0000644000175000017500000000254213757304533017407 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #include #include namespace MiniZinc { class Timer { protected: std::chrono::steady_clock::time_point _last; public: /// Construct timer Timer() : _last(std::chrono::steady_clock::now()) {} /// Reset timer void reset() { _last = std::chrono::steady_clock::now(); } /// Return milliseconds since timer was last reset long long int ms() const { return std::chrono::duration_cast(std::chrono::steady_clock::now() - _last) .count(); } /// Return seconds since timer was last reset double s() const { return std::chrono::duration_cast >( std::chrono::steady_clock::now() - _last) .count(); } std::string stoptime() const { std::ostringstream oss; oss << std::setprecision(2) << std::fixed << s() << " s"; return oss.str(); } }; } // namespace MiniZinc libminizinc-2.5.3/LICENSE.txt0000644000175000017500000004103513757304533014326 0ustar kaolkaolIf not noted otherwise in individual file headers, all files that make up the libminizinc distribution are released under the Mozilla Public License Version 2.0, a copy of which can be found below. Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. libminizinc-2.5.3/changes.rst0000644000175000017500000025712113757304533014652 0ustar kaolkaolMiniZinc Change Log ------------------- For detailed bug reports consult the issue tracker at https://github.com/MiniZinc/libminizinc/issues. .. _v2.5.3: `Version 2.5.3 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 24 November 2020) Changes: ^^^^^^^^ - Fully reify -> (x != y) in the linear library. - Allow printing of comprehensions using introduced variables. - Allow increasing/decreasing over multidimensional arrays. - Add mzn_ignore_symmetry_breaking_constraints and mzn_ignore_redundant_constraints options, allowing the symmetry_breaking_constraint and redundant_constraint predicates to be overridden, so that those constraints can be disabled independent of the solver library that's being used (:bugref:`429`). - Add automatic coercion of strings in JSON input data to enum constants where needed. - Add automatic coercion of lists in JSON input data to sets where needed. Bug fixes: ^^^^^^^^^^ - Fix int_lin_eq_imp in the linear library. - Use variable declaration location for invalid type-inst error messages without locations. - Rewrite par versions of fzn_count_* into var versions, allowing solvers that only redefine the bar version to use their built-in propagators even if the value to count is fixed at compile time (:bugref:`427`). - Add multi-level array construction for enumerated types when outputting in JSON format. - Ensure that functions can only be used as par if their return type is par (:bugref:`431`). - Fix parser default location macro, preventing loss of location filenames in some cases. - Fix parser rule for non-opt sets to give the correct starting location. - Fix fzn_bin_packing_capa_reif.mzn and fzn_bin_packing_load_reif.mzn (:bugref:`435`). - Update decl for binary and unary operators when creating par versions of functions (:bugref:`437`). - Only throw type errors for enum type identifier mismatch in strict enums mode. - Only post cumulative constraints if there is at least one task, preventing an assertion about the lower bound from failing. Changes in the IDE: ^^^^^^^^^^^^^^^^^^^ - Only reset config window item focus if it is still focused, preventing spurious changes in focus during code checking. - Fix handling of final statuses, including UNSAT (:idebugref:`123`). - Remove -s flag support from Gecode Gist solver configuration (:idebugref:`125`). - Fix crash when saving a project with no solver selected (:idebugref:`127`). - Correctly remove temporary parameter configuration files after use (:idebugref:`128`, :idebugref:`129`). - Fix the time limit readout in the status bar when solving. .. _v2.5.2: `Version 2.5.2 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 6 November 2020) Changes: ^^^^^^^^ - Use full reification in int_ne_imp. - Add support for redefining 2d element constraints in the solver library. - Produce warning when shadowing a variable in a let or comprehension in the same function (or toplevel) scope (:bugref:`419`). - Rewrite symmetric_all_different to inverse (:bugref:`426`). - Add link icons to globals etc in the reference documentation (:bugref:`425`). - Make the nodes statistic show the total number of nodes across all restarts for SCIP. - Add support for multidimensional arrays in counting constraints (:bugref:`413`). - Allow .json files to be specified using the --data option (in addition to .dzn files). - When specifying relative paths inside parameter configuration files, resolve them relative to the config file. Bug fixes: ^^^^^^^^^^ - Correctly add file extension to plugin libraries when omitted. - Fix JSON array index coercion when the first index is undefined. - Catch ResultUndefined exception when evaluating cv par expressions, and turn into undefined result. - Fix trailing for lets and comprehensions, resolving some issues with recursive functions containing lets and/or comprehensions. - Only create par version of functions that do not refer to any toplevel variables (:bugref:`418`). - Keep correct location information for identifiers. - Print warnings from solns2out. - Fix the removal of reverse mapped arrays when they contain aliases. - Disallow macro replacement when call has reification implementation. - Fix the behaviour of passing an invalid version hint to --solver. Changes in the IDE: ^^^^^^^^^^^^^^^^^^^ - Properly resize extra flags table after adding parameters (:idebugref:`119`). - Use the minimal configuration to check the model interface (:idebugref:`118`). - Allow omitting builtin solver version in project JSON. - Don't mark as modified when loading non-synced solver configurations. - Ensure the last open configuration in a project is selected when loaded. - Fix the default values of solution truncation and output window clearing. - Process unrecognised extra flags from old project configurations. - Fix watching for modification of the additional data box. - Fix the alignment of line numbers. - Make behaviour controls more narrow to accommodate smaller window sizes. - Defocus config window widgets when updating solver config so values of currently edited fields are updated. - Pass user input data correctly during compilation. - Remove solns2out options from MiniZinc call when compiling. .. _v2.5.1: `Version 2.5.1 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 22 October 2020) Changes: ^^^^^^^^ - Rewrite alldifferent_except_0 to fzn_alldifferent_except_0, to enable solvers to implement that constraint if it is available (:bugref:`414`). - Propagate domains for variables even when reverse-mapped. This ensures that variables with multiple encodings can be created with the tightest possible bounds. - Fail instead of producing empty domains when simplifying int_le constraints. - Allow parsing of nested objects in parameter configuration files. - Add --backend-flags option to provide a uniform way of passing flags to an underlying solver. - Add extra flags support to the MIP solver interfaces, allowing parameters to be set in the IDE. - Improve automatic detection of the Xpress solver and license file. - Allow the use of spaces in the --solver flag argument. - Automatically add the last part of the solver ID as a tag. - Improve handling of var functions in output, automatically creating par versions of var functions if possible. Bug fixes: ^^^^^^^^^^ - Fix parsing of empty multidimensional JSON arrays. - Allow use of --parallel long form option in MIP solvers. - Fix item lookup when increasing annotation usage in annotate builtin. - Fix JSON array coercion to handle arrays with 1 unknown index. - Don't try to access array dimensions for output of empty multi-dimensional arrays. - Print verbose version information to stderr instead of stdout. - Fix context handling when flattening par expressions that contain variables (:bugref:`415`). - Flatten string expressions if they contain variable parts in assert/abort/trace calls. - Fix breakage on older versions of Windows due to UTF-8 conversion failing. - Remove defines_var/is_defined_var annotations when simplifying boolean constraints. - Fix transfer of cv status from where parts to newly generated conjunctions during typechecking. - Fix multiple issues with the defined_var / is_defined_var annotations. - Move all included files from stdlib into solver_redefinitions.mzn, so that solver redefinitions are not marked as belonging to the standard library (:bugref:`416`). - Fix documentation group for standard annotations (:bugref:`417`). - Show correct version of solver plugins which have their DLLs specified using a command-line parameter (:bugref:`411`). - Fix arbitrary flag support for NL solvers. - Kill child processes if exception occurs during solns2out on Unix-like platforms. Changes in the IDE: ^^^^^^^^^^^^^^^^^^^ - Fix typo when passing solver statistics option to minizinc (:idebugref:`112`). - Fix missing statistics output (:idebugref:`112`). - Add support for colour themes (:idebugref:`110`). - Don't prompt for saving after adding/removing files from the Untitled project. - Fix running of compiled FlatZinc files. - Show error message when trying to load an invalid configuration file. - Ensure all output is sent to the output console, and that fragments in standard error output appear when a newline is written to standard output (:idebugref:`114`). - Fix running of solver configurations from the project explorer. - Improve performance of adding a large number of extra flags at once. - Add support for 64-bit integer extra flags. - Add support for setting both solver backend flags and MiniZinc command flags (:idebugref:`113`). - Improve interface for adding extra parameters, allowing search/filter and multiselection of known parameters. .. _v2.5.0: `Version 2.5.0 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 6 October 2020) Language, tool and library changes: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Allow `reading command line arguments from JSON config file `__. - Add support for `enum constructors `__. - Put subprocesses in their own process group so that they don't receive signals from both the console and MiniZinc. - Implement soft and hard process timeouts on Windows, allow triggering of shutdown from named pipe on Windows for the IDE. - Make MiniZinc unicode-aware on Windows. - Better error messages for index set mismatches. - Report similar identifiers when matching fails. - Better error messages when a call cannot be matched to an existing function or predicate. - Print error stack if top of stack is a single identifier (i.e., error occurred while flattening a variable declaration). - Add new separate flags for intermediate and all solutions. -i enables intermediate solutions for optimisation problems and --all-satisfaction enables all solutions for satisfaction problems. Changes in interfaces to solvers: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Solvers which only support intermediate solutions now can now support the standard flag -i rather than -a. - Restructure the `MiniZinc standard library `__. Changes in MIP solver backends: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Remove non-conforming -n flags for MIP solver configs standard flags. - Improve autodetection of Gurobi DLL. - Find Gurobi 9.0.2 when building. - Don't create gurobi log. - Interface to concurrent solves in Gurobi (--readConcurrentParam). - Add -DMinMaxGeneral option for min/max as fzn_array_float_minimum for Gurobi - Find SCIP 7.0 on Windows - Use -Glinear library, built-in cumulative by default for SCIP. - Use quadratics in Gurobi and SCIP by default. - Add options --xpress-root and --xpress-password for finding Xpress installation directory and licence file. - Add MIQCP quadratic constraints for Gurobi and SCIP. Changes dealing with option types: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Add opt versions of several globals. - Define weak equality for var opt bool. - Add set_in definitions for var opt int. - Add opt versions of enumerated type functions (to_enum, enum_next, enum_prev etc). - Enable set literals with optional values (which will be ignored), including var set literals with var opt int elements. - Add opt version of float_dom to stdlib. - Change unary not for opt bool to use absorption lifting. - Add array2set functions on var opt int arrays. - Add opt versions of dom, dom_array and dom_bounds_array. - Add missing logical operators to var opt bool. Changes in the MiniZinc IDE: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Remove support for the old binary storage format of projects. These must be opened and re-saved with version 2.4.3 to remain compatible. - Include experimental CP-profiler through the \*MiniZinc\* > \*Profile search\* option for supported solvers. - Redesign the solver configuration window. - Use parameter configuration files rather than passing command-line options directly. - Show solver configurations and checkers in their own sections in the project explorer. - Allow multiselection in the project explorer for running particular sets of files. - Allow MiniZinc to manage subprocesses by itself. - Allow non-privileged installs of the IDE on Windows. - Correctly remove files from old installations of the IDE on Windows. - Enable scroll bars in the preferences dialog to allow for low resolution displays. - Prompt to save modified files before performing MOOC submissions or running models. - Fix infinite recursion when a model file for a MOOC submission doesn't exist. - Use --output-mode checker for MOOC solution submission where supported. - Fully support unicode on Windows. Minor changes: ^^^^^^^^^^^^^^ - Clean up code base and format using clang-format and clang-tidy. - Update WebAssembly build for new versions of emscripten. - Support --cp-profiler option to activate search profiler for IDE. - Add --solver-json to output single solver config as JSON. - Coerce JSON arrays to match the MiniZinc TypeInst. - Add more informative README file. - Split shared MIP cpp code into seperate CMake object target. - Compile with POSITION_INDEPENDENT_CODE targets by default. - Change ASTString to use String Interning. - Add included_files output to model interface. - Update Bison parsers to be compatible with Bison 3.7. - Allow annotating enum declarations. - Add support for --c_d and --a_d options to set recomputation commit/adaption distance for Gecode presolver. - Place float_set_in in a version redefinition documentation group. - Place int_pow_fixed into a version redefinitions group. - Move set_in(var int, set of int) to the Integer FlatZinc Builtins. - Make "show" display contents of arrays rather than array identifiers if the array is var - Add support for checking statistics after solving has finished. - Include preferences set by IDE repository. - Add has_ann(var, ann) annotation introspection builtin. - Use reverse mapped version for output if FlatZinc contains an aliased variable. - Remove NDEBUG flag from the compile flags added by CPLEX and Gurobi. - Use integer variables in decomposition for array_int_element, array_var_int_element, array_int_minimum, and array_int_maximum. - More preprocessing for pow(int, int). - Add is_same builtin. - Add multiobjective annotation for Gurobi and Yuck (in std/experimental.mzn). - Add --output-mode checker, which outputs exactly the variables that are required for a given solution checker. - Improve propagation of annotations, especially for redefined forall, exists, clause, xor - Make omitting RHS from output_only variable a type error. - Add support for var set comprehensions - Make sets inside set literals a type error (rather than evaluation error). - Aggregate bool_not into exists/clause, use bool_not(e) for clause([],[e]) expressions - Cleanup the common-subexpression elimination table. - Generate bool_not calls (instead of bool_eq_reif) and add both "x=not y" and "y=not x" into the CSE map, to avoid double negations. - Add arg_max and arg_min builtins for boolean arrays. - Remove -O flag from ozn file naming. - Allow var items in checkers to be omitted from the model. - Add builtins for binary operators that have a var redefinition. - When an integer or bool variable has a singleton domain, use the value. This enables more overloading to par functions. - Check if domain becomes empty when binding variable to value, avoiding empty domains (such as 1..0) in FlatZinc. - Ignore unknown JSON data items instead of throwing an error. - Add trace_logstream and logstream_to_string builtins. These can be used for writing model checkers/graders, but also for general logging. - Clean up CMake configuration - Allow any installed solver to be used with the test suite, add ability to test for expected ozn output. .. _bug-fixes-1: Bug fixes: ^^^^^^^^^^ - Fix error message for type errors in domains that are integer literals (:bugref:`408`). - Fix comprehensions over option types, which could cause crashes and incorrect flattening (:bugref:`407`). - Fix the usage count of annotations added using the annotate function - Flatten "in" expressions in comprehensions when required. - Check if operator is built-in after evaluating arguments, to make sure it is rewritten into the correct predicate. - Use dom(x) instead of lb(x)..ub(x) for opt int. - Use eval_par to compute bounds for par expressions since they might be opt. - Use library defined operators where available. - Fix -O flag parsing for optimisation level. - Fix par set inequality calculation. - Flatten domain expressions that contain variables. - Catch ResultUndefined when flattening an array with an undefined expression in a generator - Fix source paths in MD5 generation scripts. - Fix crash when reporting undefined result in assignment generator. - Only add coercion for normal generators, not for assignment generators. - Check output var status on actual item being removed. - Include absolute path instead of filename in multipass processing. - Coerce comprehension generators if necessary, so that slicing notation can be used there. - Fix copying of comprehensions with followIds. - Fix the method signature of printStatistics for Geas. - Ensure the definition of reverse mappers are copied into the output model. - Print solns2out statistics to stdout to comply with MiniZinc spec. - Minor doc-fix for global_cardinality_closed. - Make statistics output comply with MiniZinc spec. - Fix reverse function to work with empty arrays - Fix the coercion of boolean sum in aggregation. - Remove eval_par on var expressions in show builtin. - Fix the table construction for the Geas solver interface - Fixed wrong sign in Boolean linear constraints in Geas solver interface. - Fix istrue and isfalse by using flat_cv_exp if necessary. - Fix the excess flattening of items marked for removal. - Do not add newline to output when killing FlatZinc solver process, since this may be in the middle of a line - Fix typo in loop for Geas solver instance. - Don't call doAddVars when there are no variables, fixing a crash in MIP solvers for empty models. - Do not copy type of lhs onto rhs when parsing solutions. This tagged some literals as cv(), which broke the evaluation. - Fix flattening of all par set literals. - Fix error macro to be compatible with newer versions of Bison (:bugref:`389`). - Fix printing of if-then-else expressions without an else branch. - Fix allowed solvers option in test suite. - Make bind only create an int_eq constraint if a variable has a reverse mapper. - Fix automatic coercions to keep cv type attribute of their argument (:bugref:`387`). - Fix copying of output_only variables to the output model. - Only print checker output for unique solutions. - Fix rewriting of lin_exp into int/float_lin_eq. - Fix flattening of calls and let expressions that have par type but contain var expressions. - Use eval_bool instead of eval_par for boolean evaluation. - Remove the direct assignment to a domain if it has a reverse mapper. - Fix arg_max and arg_min for array index sets not starting at 1. - Add missing set_superset_reif FlatZinc predicate. - Fix counting of non-fixed variables in Boolean constraints. Could previously lead to incorrect simplifications. - Enable eval_floatset for SetLits that contain an IntSetVal. This is used during chain compression and could previously result in incorrect domains. - Fix bugs in chain compressor caused by modifying multimaps while iterating over them. - Fix crash when cleaning up after running builtin Gecode. - MIPdomains: don't assume equations have no literals. - Only fix domain after flattening bool_eq. - Only return singleton domain as value for non-optional variables. - When evaluating identifier that is bound to a fixed value, check that the value is inside the domain to correctly detect model inconsistency. - Add missing assert and trace builtin overloads. - Flatten expressions that may contain variables in par where clauses. - Fix segmentation fault when the declaration of an array is passed to setComputedDomains with the -g parameter. - Consider single-valued domain variables to be fixed - Add missing definition of to_enum for arrays of sets. - Evaluate partiality of arguments even if call was already in CSE table (:bugref:`374`). .. _v2.4.3: `Version 2.4.3 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 4 March 2020) .. _changes-1: Changes: ^^^^^^^^ - Enable CPLEX 12.10. - Add checker output to generated output items. - Short-circuit evaluation for mixed par/var conjunctions, disjunctions, and clauses. - Add inverse_in_range global. - Pretty printing set ranges now uses union instead of ++ to be compatible with DZN. - Add array2set for par bool and float arrays - The \_objective variable is no longer added to FlatZinc input files. - JSON representation of sets with ranges can now be parsed (previously they could only be output). - Check index sets to arguments of global_cardinality_low_up. - Xpress and SCIP are not compiled as plugins and no longer require recompilation to enable. - If-then-else for opt are no longer written in terms of the non-opt version, allowing them to return absent. .. _bug-fixes-2: Bug fixes: ^^^^^^^^^^ - Fix checking of domains and index sets in par arrays inside lets. - Remove duplicate call stack items to improve error messages. - Ignore absent values when computing domains. - Generate call for actual binary operator (after optimising double negation). Fixes :bugref:`364`. - Fix non-associative operators on optional values. - Only output optional parameters in model interface if they were undefined (rather than assigned to <>). - Fix some issues with evaluating par opt expressions. - Make solution checkers work for multi-dimensional arrays and arrays with enum index sets - Fix Boolean aggregation for expressions that are defined recursively. - Use correct index set for nosets set_lt and similar (partial fix for :bugref:`369`) - Fix coercion of sets to arrays (previously, coercing a set of X to an array of X to an array of Y did not work correctly). - Fix infinite loop when printing infinite set range - Add assertion so that array2set can only be used for arrays with bounds (:bugref:`370`, :bugref:`371`). - Fix typing and pretty printing of par bool sets. - Use output_array dims for output vars in FlatZinc files (previously, a type-checker error would occur when running a solver through MiniZinc on a FlatZinc file with multidimensional arrays). - The Xpress backend was made functional again. - Fix segmentation fault in output_only type-checking. - Compute correct array enum type for array slices (:bugref:`372`). - Fix behaviour of using undefined expressions in var comprehensions guarded against by where clauses (previously, these undefined expressions would bubble up regardless of the where clause, constraining the model). - IDE: Disable menu items that don't make sense when all tabs are closed, fix behaviour of stop button when all tabs closed (fixes several crashes). - IDE: Add x86_64 suffix to linux package name (:idebugref:`96`). - IDE: Make boolean extra solver options with a default of true functional. - IDE: Only read linter results if it exited normally (:idebugref:`97`). - IDE: Resolve paths in \_mooc to paths (allowing submission of models in subdirectories). .. _v2.4.2: `Version 2.4.2 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 10 January 2020) .. _changes-2: Changes: ^^^^^^^^ - The test suite is now integrated into the continuous integration system. .. _bug-fixes-3: Bug fixes: ^^^^^^^^^^ - Fix flattening of negated disjunctions (:bugref:`359`). - Fix simplification of Boolean constraints (repeated simplification could sometimes crash). - Fix memory management during flattening of conditionals (:bugref:`358`). - Fix type inference for rewriting of sums into count constraints, and only apply the rewriting for var type-insts. - Fix handling of solution checkers (these used to produce spurious error messages). - IDE: Fix syntax highlighting of keywords, and add syntax highlighting for interpolated strings. - IDE: Redraw when switching to/from dark mode, and fix dark mode header colours. - IDE: Fix "Select all" menu item. .. _v2.4.1: `Version 2.4.1 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 20 December 2019) .. _changes-3: Changes: ^^^^^^^^ - Improve compiler optimisation for some linear, multiplication and Boolean constraints. - Improved translation of lex and all_equal constraints when the arrays have no or only one variable. - IDE: Display error message when submission to MOOC provider fails. - IDE: Make "previous tab" and "next tab" actions cycle rather than stop at first/last tab. .. _bug-fixes-4: Bug fixes: ^^^^^^^^^^ - Fixed regular expression constraint for expressions containing negated character classes (^ operator). - Fix element constraint in nosets.mzn library when set domains are not contiguous. - Correctly identify Windows paths starting with // or \\\\ as absolute (this enables the parser to open files stored on network drives). - Use set_in constraints (rather than int_in) for internal Gecode-based presolver. This fixes some issues when compiling with -O3. - The optimisation phase of the compiler now fully substitutes par bool variables (these can be introduced into the FlatZinc during multipass compilation). (:bugref:`357`) - Fixed the reference counting for variables that are re-used in multipass compilation. (:bugref:`357`) - Remove incorrect error handling when parsing from strings rather than files. Partially fixes (:bugref:`357`) - Made the is_fixed builtin work for more types. (:bugref:`356`) - Enable rewriting of sum(i in x)(i=c) op d and count(x,y) op z into global counting constraints. - Split up count global constraints into separate files for reified versions. - Use contiguous range for array index set in set_lt for nosets.mzn. - Negate results of conditionals if required. (:bugref:`355`) - Partiality of conditional needs to be translated in root context (even if conditional itself is negated). (:bugref:`355`) - Don't copy function into output again if it was already copied (and made par) before. (:bugref:`323`) - Define card function on var sets in terms of set_card FlatZinc builtin. - Don't set bounds for set variables in internal Gecode presolver. - IDE: Fix shift left and shift right indentation behaviour when selecting text backwards. - IDE: Fix OpenSSL library in binary distribution to enable update checks and submission to MOOCs again. .. _v2.4.0: `Version 2.4.0 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 13 December 2019) .. _changes-4: Changes: ^^^^^^^^ - The compiler now detects counting constraints in expressions such as count(i in x)(i=3) <= 4 and rewrites them into global counting constraints. This is now the preferred way to specify counting. The atmost/atleast/exactly constraints on integer variables have been deprecated, and versions of count predicates with par variables have been added. FlatZinc solvers that supported atmost/atleast/exactly should now support the corresponding fzn_count_?_par predicates. - The compiler now supports the command line option --output-detailed-timing, which provides timing information for each toplevel constraint item, or for each line of code when used in conjunction with the --keep-paths option. - The library now contains annotations for deprecated library functions. - A par version of the inverse function has been added (include inverse_fn.mzn to use it). - The common case of sums of optional variables is now handled more efficiently. This case often arises from generator expressions with variable where clauses. - Added set_to_ranges built-ins to enable efficient iteration over sets. These are used to implement set_in for float variables, which was missing before. - The Gurobi and CPLEX backends now support the --random-seed command line option. - The Gurobi and CPLEX backends now use nodefile for search trees exceeding 500 MB (--nodefilestart can change this value and --nodefiledir the folder.) - The MIPDomains optimisations have been switched back on by default. The optimisations have also been strengthened for some special cases. - Without the MIPdomains postprocessing, linearisation of variable domains with holes now uses set_in instead of individual not-equal constraints, which may result in more compact FlatZinc. - Linearisation of multiplication can now consider the exact domain of a factor. - The product functions have been made non-recursive in order to support longer arrays. - Bounds inference for results of if-then-else expressions has been improved. - Support for optional float variables has been added. - The interfaces to CBC, CPLEX and Gurobi now report correctly that they support verbose output during solving (so that the "verbose solving" option is available from the MiniZinc IDE). - IDE: Parse timing and statistics output produced by compiler, and display as profiling information next to each line in the model. - IDE: Enable run/compile action on data files. This automatically selects the model file if there is only one, or presents a dialog for selecting the model if there are multiple. - IDE: Select first data file in parameter dialog if there was no previous selection, and always focus parameter dialog. - IDE: Highlight current line. - IDE: Support .json as file extension for data files. - IDE: Remember whether wrap around, case sensitivity and regular expression was selected in find/replace dialog, pre-select the find/replace text when find/replace widget is openend, and close find/replace widget when ESC is pressed while editor has focus. .. _bug-fixes-5: Bug fixes: ^^^^^^^^^^ - Fixed output handling on Windows (output is now processed on the main thread, so that exceptions thrown during output are printed correctly, and memory management is thread safe). - Fixed decomposition of reified mdd constraint, and strengthened decompositions of mdd and cost_mdd. - Fix handling of variable re-definitions (e.g. converting sets to arrays of bools), which would previously sometimes result in variables being removed although they were required for output, or the reverse mapping function not being available in the output model. - Include regular.mzn from regular_regexp.mzn. (:bugref:`351`) - Inlining of function calls has been moved from the flattener into the type checker, and it now is more strict about which functions can be inlined in order to avoid overloading issues. - Updated fzn_count_{neq,leq,lt,geq,gt}, fzn_global_cardinality_low_up{,_reif} to use use the count_eq predicate. (:bugref:`334`, :bugref:`335`) - Fixed the documentation for several constraints, which did not display as bullet point lists as intended. - Copy function/predicate declarations into FlatZinc without annotations, since most FlatZinc parsers would not expect annotations and fail to parse. - Process right hand side of par VarDecls to make sure any identifiers it uses are copied into the output model. Fixes :bugref:`336`. - Fix type checking for conditionals where the else branch has enum type but the then branch has int type. - Make the deopt function return correct enum instead of int type. - Fix for path handling when 'needRangeDomains' is active. Avoids infinite recursion in the compiler. - Fix race condition in temporary file generator for Windows. (:bugref:`349`) - Register fzn\_ names for Gecode presolver. Fixes command line flags -O3 and above. - Fix par evaluation of float and bool set comprehensions. - Fix documentation of array_bool_xor. Fixes :docbugref:`13`. - Fix the round() built-in to correctly round negative numbers - Fix computation of intersection of domains when assigning an array to an array variable. Fixes :bugref:`310`. - Add defines_var annotations for functional global constraints. Fixes :bugref:`345`. - Add set_lt_reif/set_le_reif to flatzinc builtins library. Fixes :bugref:`338`. - Clarify set order based on spec. Fixes :bugref:`339`. - Don't return already removed VarDecl objects from CSE. Fixes :bugref:`346`. - Do not post y!=0 constraint if 0 is not in the domain (workaround for a limitation in the handling of basic float constraints). Fixes :bugref:`344`. - Help type checker by making deopt/occurs argument types explicit. Fixes :bugref:`331`. - Fix transfer of domains when aliasing one variable to another - MIP: fix for aux_float_ne_if_1 - MIP: int_(eq/ne)_imp: don't force eq_encode without MIPdomains - Fix a typo in the definition of fzn_at_least_int{,_reif} - Fix dependency problem in the gecode_presolver table specification - Add seq_precede_chain.mzn to globals.mzn. Fixes :bugref:`332`. - Don't assign right hand side of set variables if domain is singleton. Fixes :bugref:`330`. - Don't invalidate float bound just because an expression contains an integer. - Fix copying of let expressions. - Put lexer and parser helper functions into MiniZinc namespace to avoid linker issues. Fixes :bugref:`325`. - Reset array index sets defined in lets inside recursive function calls. - Arrays copied into output model need to have par type-inst. Fixes :bugref:`322`. - Don't complain when same function is registered twice. Fixes :bugref:`323`. - Fix partiality handling of if-then-else expressions. - Track whether variable is used in an output array before making decision to compress implication chains. Fixes :bugref:`318`. - IDE: Fix dark mode detection on macOS 10.15, improve dark mode colors a bit and fixed some dark mode bugs. - IDE: Make background compilation of a model (used to display syntax and type errors) a bit more stable. - IDE: Avoid infinite loop in wrap around replace all. - IDE: Fix memory management for HTML visualisation windows, and resize docked HTML visualisation widgets to take up equal space. .. _v2.3.2: `Version 2.3.2 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 12 September 2019) .. _changes-5: Changes: ^^^^^^^^ - Add warm starts and subtour cuts to CBC interface. - Add documentation and assertion requiring that mdds are deterministic, and add nondeterministic variant of mdd constraint. - Add -s to the standard flags supported by MIP interfaces. - Add flag --output-output-item to include user specified output item in the formatted JSON and DZN output. .. _bug-fixes-6: Bug fixes: ^^^^^^^^^^ - Fix a bug that could leave unused variables in the resulting FlatZinc. - bounded_dpath should rewrite to fzn_bounded_dpath. Fixes :bugref:`300`. - Fix definition of sum_set. - Check if overloaded function required for output. Fixes :bugref:`303`. - Move regular constraint with set argument to its own file. - Flatten assignment generators if necessary. - Simplify fzn_value_precede_chain_int and avoid use of element predicate. Fixes :bugref:`307`. - Only initialise par opt variables as absent if they are not arrays. - Fix the description of the neural_net predicate. - Fix regular constraint with regular expressions (stopped working in 2.3.0). - Fix the model interface output to include the same variables as the generated output statement. - Fix CSE for removed variable declarations. Could lead to reified constraints not being compiled correctly when the control variable got fixed to true. .. _v2.3.1: `Version 2.3.1 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 10 July 2019) .. _bug-fixes-7: Bug fixes: ^^^^^^^^^^ - Report error when trying to assign an array literal to an array variable with incompatible index set. - Fix partial evaluation of expressions, so that only par expressions are fully evaluated. Fixes :bugref:`298`. - Remove carriage returns when reading piped solver output on Windows. - Canonicalize paths of executables to avoid spurious warnings about multiple executables for the same solver. - Add implementations for != on arrays. - Compute quotient bounds before decomposition of int_div in linearisation library. - Propagate domain constraints on variables that are aliased (previously domain constraints could get lost). - Propagate domain constraints from left-hand-side to right-hand-side in variable assignments. - piecewise-linear: reuse decomposition for X when only Y-values change. - nosets: add set_in_imp(var set) and simplify set_in_reif, set_eq(var set, var set). - linearisation: improved compilation of set_in constraints. - MiniZinc IDE: Remove incorrect symbolic link and fix qt.conf for some bundled distributions. - MiniZinc IDE: Fix check for availability of dark mode on older versions of macOS. - MiniZinc IDE: Fix a typo in the cheat sheet. - MiniZinc IDE: Provide more robust solution for checking the model parameters, which will get rid of some "internal error" messages. - MiniZinc IDE: Always show directory selection dialog in the Windows installer. Addresses :idebugref:`89`. - MiniZinc IDE: Improved the configuration files for some bundled solvers, provides nicer configuration interface. .. _v2.3.0: `Version 2.3.0 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 26 June 2019) Major changes: ^^^^^^^^^^^^^^ - The compiler can now generate FlatZinc with half reified constraints. See https://www.minizinc.org/doc-2.3.0/en/fzn-spec.html#reified-and-half-reified-predicates for more details. - The standard library of global constraints has been reorganised, making it easier for solvers to override just the bits that they support. See https://www.minizinc.org/doc-2.3.0/en/fzn-spec.html#solver-specific-libraries for more details. - There is experimental support for solvers that can read AMPL NL files. See https://www.minizinc.org/doc-2.3.0/en/solvers.html#non-linear-solvers for details. .. _minor-changes-1: Minor changes: ^^^^^^^^^^^^^^ - The JSON input and output has been improved, with full support for enums and optional types. - A new compiler option -g has been added, which turns variable domain changes into constraints (useful for debugging models). - The SCIP interface has been updated, with support for indicator constraints, bounds disjunctions and a native cumulative constraint. - Error reporting has been improved, with location information available for errors in par float expressions as well as include items. - The timeout command line parameter now also applies to compilation itself (:bugref:`281`). - Operations on par float values are now checked for overflows. - The arg_min/arg_max constraints have been improved, with new special versions for Boolean variables, and a better standard decomposition. - if-then-else-endif expressions with variable conditions are now compiled to a predicate call (rather than handled by the compiler), which enables solver libraries to implement these as native constraints or special decompositions. - Dividing a variable by a constant is now translated as a multiplication (to keep the constraints linear). - A new piecewise_linear predicate has been added to the library to make it easier to specify piecewise linear constraints. - Print number of solutions as mzn-stat after solving (:bugref:`244`). - Make search annotations work for arbitrary array index sets. - MiniZinc IDE: The IDE will now check MiniZinc code for syntax and type errors, and the editor performs simple code completion for MiniZinc keywords - MiniZinc IDE: The find/replace dialog is now an inline widget and supports incremental search. - MiniZinc IDE: Now supports dark mode on macOS. - MiniZinc IDE: Add support for extra solver flags (parsed from solver configuration). .. _bug-fixes-8: Bug fixes: ^^^^^^^^^^ - Translate let expressions that contain constraints or variables as var type-inst. Fixes :bugref:`263`. - Fix JSON array parsing by counting elements instead of commas. - Fix parsing of the -p flag (:bugref:`271`). - Fix type checking for array declarations with single enum type inst identifier. E.g. array[$$T] of $U previously matched any multi-dimensional array, and now only matches one-dimensional arrays with any enum index set. - Fix computation of function return type when using type inst variables (:bugref:`272`). - Evaluate each variable declaration only once in a par let expression. - Check domain constraints on variable declarations in par let expressions. - Try .exe/.bat on windows when using (constructed) absolute paths. - Fix array slicing to support empty slices (:bugref:`275`). - Fix a bug in the parser that could cause crashes on certain syntax errors. - Fix the type of bool2int for arrays. - Initialise counter for introduced variable ids based on names in original model. This avoids reusing variable names if the user model contains names such as X_INTRODUCED_0_. - Fix compilation of nested clause/exist constraints, and improve handling of negation. Tries to use primitive negation instead of creating negated constraints. Should help with half-reification by creating more positive contexts. - Reorder fields in basic data structures to reduce padding on 64 bit platforms (improved memory footprint). - Perform type coercion after desugaring array slicing. - Translate arguments to bool2int, exists, forall in positive context even if those functions are redefined. - Don't evaluate par array literals twice (inefficient, and can lead to incorrect results when using random number generators). - Terminate child processes when minizinc process is terminated by signal. - Fix function return value array index check for empty arrays (:bugref:`286`). - Fix translation of constant false where clause in array comprehension. - Report error when json multi-dimensional array is not rectangular. - Check index sets of function arguments (:bugref:`273`). - Ignore partiality variables from CSE table when compiling \_reif and \_imp predicates (:bugref:`269`). - Flatten comprehensions with variable generators or where conditions before evaluating any par functions on them (:bugref:`259`). - Add missing redefinitions of basic operators and search annotations for optional integers. - Resolve filenames given on the command line relative to working directory, and warn if file in working directory has same name as included file from the library. Fixes :bugref:`276`. - Update nosets library with a valid redefinition of set_less over booleans. - Fix translation of showJSON (:bugref:`294`). - Only apply set2array coercion for supported types, otherwise report error (:bugref:`295`). - Improve special case reasoning for abs on strictly negative variables. - Add bounds for floating point min/max result in the standard library. - MiniZinc IDE: Ensure cursor is visible (editor scrolls to cursor position) when pressing tab or enter. Fixes :idebugref:`71` :idebugref:`71`. - MiniZinc IDE: Re-dock configuration editor when closing un-docked window. - MiniZinc IDE: Handle quotes when parsing additional solver command line arguments. Fixes :idebugref:`77`. - MiniZinc IDE: Add workaround for the missing libnss requirements. Fixes :idebugref:`79`. - MiniZinc IDE: Allow spaces in $DIR in MiniZincIDE.sh Fixes :idebugref:`81`. .. _v2.2.3: `Version 2.2.3 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 31 October 2018) .. _bug-fixes-9: Bug fixes: ^^^^^^^^^^ - Fix some typos in the library documentation. - Fix solution checking. - Fix line numbers in parsed locations on 64 bit platforms. - Fix bounds computation for calls. - Fix translation of var where clauses with more than 3 par components. - IDE: Only run solution checker if it is enabled in the solver configuration dialog. .. _v2.2.2: `Version 2.2.2 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 26 October 2018) .. _changes-6: Changes: ^^^^^^^^ - Some changes to the optimisation phase of the compiler, to take into account more variables and constraints. - Preliminary support for MIP cuts based on graph algorithms (only available when compiled with boost C++ libraries; not part of the binary distribution). - Set Release as default build type when nothing is specified (for CMake platforms that do not support multiple build types, like Makefiles). - Add builtins outputJSON() and outputJSONParameters() for creating an array of strings that capture the output and parameters of the model as JSON. - On Linux and macOS, add /usr/share/minizinc/solvers and /usr/local/share/minizinc/solvers to list of paths where solver configuration files can be placed. - Add OSICBC_INCLUDEDIR and OSICBC_LIBDIR cmake flags. - Output search paths for solver configurations using --solvers command line option. - Add support for Gurobi 8.1 - Support parsing from stdin and files at the same time. - IDE: Add line/column display in status bar. - IDE: Optional parameters don't have to be defined in input dialog. - IDE: Provide mzn-json-init / mzn-json-init-end handlers to initialise HTML window before first solution is produced. - IDE: Add version information and minimum system version into Info.plist on macOS. - IDE: Manage multiple open visualisation windows, and implement re-solve function that can be initiated from a visualisation. - Binary bundle: Gecode updated to version 6.1.0, Chuffed updated to version 0.10.3 .. _bug-fixes-10: Bug fixes: ^^^^^^^^^^ - Fix crash when flattening top-level array comprehensions with var where clauses. - Support input files with more than 1M lines. - Special case handling for array literals in top-level foralls: flatten in root context. - Fix translation of if-then-else for branches with undefined right hand sides. - Only propagate defines_var annotation to the variable that's actually being defined (not others that arise from the same decomposition). - Don't flatten arguments of predicates like symmetry_breaking_constraint. - Remove output_var and output_array annotations from user models (these could cause crashes). - Fix precedences for weak operators (~+, ~-, ~=, ~*). - Fix min and max for opt var arrays to work when the bounds of the arrays are unknown. - Fix a bug in bounds computations for function calls. - Add missing superset FlatZinc builtin. - Fix includes in file values.hh for some platforms. - Fix a garbage collection issue when printing solutions. - Deal with the case that a variable that's required for output is assigned to a par variable. - Throw type error when an array has only absent values. - Flatten all arrays in FlatZinc, also those coming from functional definitions. - Use list of strings as mzn_solver_path entry in the preferences json file. - Fix crash when output variable is defined using recursive function - IDE: Fix race condition in constructor of HTMLWindow. .. _v2.2.1: `Version 2.2.1 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 6 September 2018) .. _changes-7: Changes: ^^^^^^^^ - all_different, all_equal, {int,set,float,bool}_search now accept multi-dimensional arrays. - Add exponentiation operator (^). - Improve layout of generated library documentation for some constraints. - Relax typechecking to allow assignment of empty array ([]) to multi-dimensional array variables. This is required to make empty arrays work in JSON data files. - Enumerated types can now be initialised using lists of strings. This enables enumerated type support in JSON. .. _bug-fixes-11: Bug fixes: ^^^^^^^^^^ - Cumulative constraint for linear solvers now accepts empty arrays. - show2d/show3d functions now do not add quotes around array elements and work for empty arrays. - Add support for slicing of arrays with enumerated types. - Fix slicing of 1d arrays. - Fix bounds computation for float variable declarations. - When FlatZinc solver is terminated due to a timeout, do not report this as an error. - Fix pretty-printing of multi-dimensional arrays where dimensions other than the first one are empty. - Add support for where clauses on generator assignment expressions. - MiniZinc IDE: Improve dark mode by changing line numbers to dark background. - MiniZinc IDE: Make parameter input dialog scrollable. - MiniZinc IDE: Fix solution compression limit, and output one solution per block of compressed solutions. .. _v2.2.0: `Version 2.2.0 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 24 August 2018) This is a major release of MiniZinc, introducing many new features and improvements. Major new features: ^^^^^^^^^^^^^^^^^^^ - **New minizinc command line tool** Previous releases contained a ``minizinc`` command line tool that was not much more than a simple script that could execute the compiler, solver and output processor. The ``minizinc`` executable in version 2.2.0 is now the main frontend to compilation and solving and integrates all of the functionality. It has access to all installed MiniZinc solvers (both internal solvers and those interfaced through FlatZinc files), and can automatically select the required options (e.g., to include the solver-specific MiniZinc globals library). You can get a list of available solvers using the ``--solvers`` command line option, and select a solver using ``--solver``. The ``minizinc`` executable can now also be used as a replacement for ``mzn2fzn`` (using ``-c``) and ``solns2out`` (using ``--ozn-file``). - **Multi-pass compilation** The compiler can now perform multiple passes in order to improve the target FlatZinc code. This can be controlled using the ``-O`` command line flags (``-O0`` to ``-O4``). Multi-pass compilation is particularly useful when the target solver requires sophisticated decomposition of global constraints (such as for MIP solvers). - **Solution checking** You can now supply an additional model that will be used to check each solution produced by your main model. This can be useful for teaching MiniZinc (to give students automatic feedback) and if your main model is very complex but checking that a solution is correct is easy. - **MIP solvers:** support for FICO Xpress, and loading IBM ILOG CPLEX as a plugin We have added support for FICO Xpress (this requires compiling MiniZinc from sources). CPLEX can now be loaded as a plugin, which means that the binary distribution of MiniZinc has built-in CPLEX support (just bring your own CPLEX dll). - **Language extensions** The MiniZinc language has been extended with two new features. - Array slicing introduces syntax to conveniently select rows, columns or entire slices of arrays. For example, ``x[3,..]`` selects the third row of array ``x``, while ``x[..,4]`` selects the fourth column, and ``x[3..5,2..7]`` selects a slice of rows 3 to 5 and columns 2 to 7. - Generator expressions can now contain multiple where clauses, e.g. ``forall (i in S where foo(i), j in T where i < j) (bar(i,j))`` This enables more efficient compilation compared to evaluating all where clauses in the inner-most generator. In addition to iteration (``i in S``), generators can now contain assignment expressions (``j=foo(i)``). This enables intermediate definitions that can then be used in further generators. Changes and minor features: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The value of the objective can now be added automatically to the output using the ``--output-objective`` command line option. Using ``--output-mode dzn``, this allows automatic output of all the free variables of the model. - Models that do not contain a solve item are now accepted and treated as ``solve satisfy`` - Support for naming constraints and expressions (using ``::"name"`` syntax) - Error messages have been improved, they now contain more accurate location information. - The compiler can be instructed to accept multiple assignments to the same parameter (as long as they are all identical), using the ``--allow-multiple-assignments`` command line option. - Annotations for supplying warm start values have been added to the standard library (currently supported by the MIP solvers Gurobi and IBM ILOG CPLEX). - The compiler now accepts multiple .mzn files as input. - Memory consumption and garbage collection performance has been improved. - The conditional expression has been extended to support ``if then endif`` (where ```` is bool) - Decomposition of one variable type to another (e.g. set into array of bool) has been improved. - MIP solvers Gurobi and IBM ILOG CPLEX use node files when over 3GB working memory - Gurobi and CPLEX support the MIPfocus parameter - Gurobi supports MiniZinc search annotations by setting fixed branching priorities .. _bug-fixes-12: Bug fixes: ^^^^^^^^^^ Consult the bug tracker at https://github.com/MiniZinc/libminizinc/issues .. _v2.1.7: `Version 2.1.7 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 10 January 2018) .. _changes-8: Changes: ^^^^^^^^ - Improved linearisation for some element constraints. - Improve performance of optimisation phase by using a queue instead of a stack. - Add --dll option for Gurobi backend to specify the Gurobi DLL to load. - Add more defines_var annotations. .. _bug-fixes-13: Bug fixes: ^^^^^^^^^^ - Fix generation of variable names in output model (sometimes could contain duplicates). - Fix enum type inference for array literals with empty sets as their first arguments. Fixes :bugref:`180`. - Fix incorrect simplification of float domain constraints. Fixes :bugref:`159`. - Fix ceil builtin for float values. - Add superset decomposition for solvers that do not support set variables. - Fix three bugs in the garbage collector. - Fix a bug in flattening that would create duplicate variables when a variable declaration referred to another one in its type-inst. - Fix a crash in flattening of partial functions. Fixes :bugref:`187`. - Add missing deopt builtins for all par types. - Fix output for arrays of sets of enums. - Define more functions on par opt types. Fixes :bugref:`188`. - Fix type checker to accept arrays of opt set values. - Support printing of opt enum types. Fixes :bugref:`189`. - Fix evaluation of comprehensions in recursive functions. - Fix output of Gurobi backend when used in conjunction with solns2out. - Fix pthread linking for mzn-cbc. - Catch type error when set literal is declared that contains another set. IDE changes and bug fixes: ^^^^^^^^^^^^^^^^^^^^^^^^^^ - Fix problem where files with a . in the filename could not be run. - Fix font settings (were not saved reliably on some platforms). - Enable generic interface for submitting assignments (not just to Coursera). - Fix output handling for solvers that do not run mzn2fzn. - Fix hidden solution display when there are exactly as many solutions as the configured threshold for hiding solutions. - Add configuration option to print timing information for each solution. .. _v2.1.6: `Version 2.1.6 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 22 September 2017) .. _bug-fixes-14: Bug fixes: ^^^^^^^^^^ - Fully evaluate parameters before binding formal arguments when evaluating call expressions. Fixes :bugref:`177`. - Fix incorrect simplification of Boolean constraints assigned to variables that are assigned to false. - Fix bug in flattening of linear equations that contain the same variable on both sides. - Fix un-trailing for let expressions, which could sometimes cause incorrect code to be emitted when lets are evaluated in nested loops. Fixes :bugref:`166`. - Fix bug in JSON output of one-dimensional array literals. - Fix unification of enum type-inst variables. .. _v2.1.5: `Version 2.1.5 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 17 May 2017) .. _changes-9: Changes: ^^^^^^^^ - Some improvements to the linearisation library. - Make parser read multiple .mzn files correctly. - Enable better bounds computation for array access expressions on fixed arrays. - Perform better constant folding during optimisation phase. Fixes :bugref:`155`. - Don't rewrite pow function into multiplication in the case of power of 2. - Save some memory by making certain internal data structures more compact. - Improve source code location of identifiers in generator calls (should give more precise error messages). - Produce an error message when a comprehension attempts to iterate over an infinite set. - Produce better error messages for operations on infinite values (previously some errors did not contain a source code location). - Speed up garbage collection by pre-allocating some memory. .. _bug-fixes-15: Bug fixes: ^^^^^^^^^^ - Fix range check for float literals in arrays. - Fix a bug where a constraint could be removed incorrectly. Fixes :bugref:`150`. - Include variables for dzn and json output from all included models, not just the main model. Fixes :bugref:`153`. - Produce multi-dimensional arrays in json output. Fixes :bugref:`156` and :bugref:`157`. - Remove incorrect closing bracket from json output. Fixes :bugref:`154`. - Fix bounds computation of par int and float arrays. - Don't allow var access to arrays of strings or annotations (since that would require an element constraint and var string / var ann types). - Introduce int2float constraints where necessary for some linearisations. .. _v2.1.4: `Version 2.1.4 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 13 March 2017) .. _changes-10: Changes: ^^^^^^^^ - Add warning for MIP solvers that do not support -a option for satisfaction problems. - Print introduced variable names with additional underscore to make debugging FlatZinc easier. Fixes :bugref:`147`. - Add support for pow function in linearisation library. - Add support for parallel solving with CBC. - Flatten top-level conjunctions in the order defined in the model. .. _bug-fixes-16: Bug fixes: ^^^^^^^^^^ - Fix major race condition that would crash the IDE when it didn't detect that a solver process had finished. - Improve HTML output in the IDE by making sure every line is terminated by a newline. - Fix a garbage collection bug that could cause dangling pointers when expressions were copied. - Fix type checker to allow empty arrays to be assigned to variables declared as arrays of enums. - Fix infeasibility check in MIP translation for some inequality constraints. - Improved defines_var annotations for reified xor constraints. Fixes :bugref:`146`. - Fix output of empty integer sets and deal with empty arrays in output models. - Fix MIP translation when boolean variables were removed due to aliasing. - Improve corner cases for linearisation of cumulative constraint. - Properly report undefinedness in par bool expressions. - Enable some additional constant folding during flattening. Fixes :bugref:`149`. .. _v2.1.3: `Version 2.1.3 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 6 February 2017) .. _changes-11: Changes: ^^^^^^^^ - Remove more internal annotations from the generated FlatZinc. - Detect failure earlier if optimisation pass leads to fixing of variables outside their domains. .. _bug-fixes-17: Bug fixes: ^^^^^^^^^^ - Fix CBC backend to correctly print UNSAT message for models where the compiler already detected unsatisfiability, and print solution separators even where there is no other output. - Add missing var_dom function for arrays of optional integer variables. Fixes :bugref:`133`. - Fix aliasing for optional integer variables. Fixes :bugref:`132`. - Remove all annotations from output model. - Fix computation of return type for functions that return arrays of enums. - Don't output newline if user-defined solution separator or status message is empty - Fix return type computation for functions where return type contains enums. - Check finiteness of float literals and bounds. Fixes :bugref:`138`. - More checks for function return values. Fixes :bugref:`136`. - Fix var int comprehensions (now triggers error message instead of crash for var set of int comprehensions). Fixes :bugref:`135`. - Fix output of variables with quoted identifiers. - Fix flattening of let expressions that contain variables with undefined (i.e., partial) right hand side. - Make printing of error messages to stdout or stderr more consistent across executables. - Fix type checking of initialisation of enum types. - Improve error messages for array access and index set errors. Fixes :bugref:`131`. - Fix definition of multi-dimensional element constraints to impose correct bounds on index variables. - Fix binding analysis during type checking, which did not handle the shadowing of top-level declarations by comprehension generators correctly. Fixes :bugref:`129`. .. _v2.1.2: `Version 2.1.2 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 20 December 2016) .. _bug-fixes-18: Bug fixes: ^^^^^^^^^^ - Fix a bug in the type checking for generators that iterate over arrays of enums. - Fix a bug in the output handling of arrays of enums. - Fix handling of multiple output items (only the last item was compiled, now the concatenation is used for output as defined in the specification). .. _v2.1.1: `Version 2.1.1 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 14 December 2016) .. _changes-12: Changes: ^^^^^^^^ - Add missing min/max functions for set variables. Can be redefined to solver builtins using the new redefinitions-2.1.1.mzn library file. - Add support for option type expressions as objective functions. - Automatically coerce arrays constructed using ++ to any enum index set (in addition to array literals and comprehensions). .. _bug-fixes-19: Bug fixes: ^^^^^^^^^^ - Include cmath header to fix compilation issues with some compilers. Fixes :bugref:`125`. - Fix a garbage collection bug in the type checking for enumerated types that would sometimes lead to crashes or incorrect error messages. - Fix type checking of comprehensions that involve enumerated types. - Fix bounds computation for var sets of enumerated types. - Support anon_enum function as documented. .. _v2.1.0: `Version 2.1.0 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 17 November 2016) .. _changes-13: Changes: ^^^^^^^^ - MiniZinc now supports enumerated types. - Solvers can be interfaced directly to the MiniZinc library, and MiniZinc comes with direct support for the CBC, Gurobi and CPLEX MIP solvers. - The linearisation library has been updated, resulting in much better FlatZinc being generated for MIP solvers. - Data files can be in JSON format, and MiniZinc can produce JSON output (using the --output-mode command line option). - Variables can be annotated as ::add_to_output instead of writing an output item. - The compiler can output information about the parameters and output variables of a model (using the --model-interface-only option). - Floats are handled better (detecting infinities and handling sets of floats). - Bounds can be computed for more expressions (instead of failing with an error message). .. _bug-fixes-20: Bug fixes: ^^^^^^^^^^ - Fix a bug in optimization that could remove variables even if they are used. Fixes :bugref:`123`. - Fix float variable declarations with sets of floats as domains. Fixes :bugref:`117` and :bugref:`98`. - Fix type checking and evaluation of asserts with array arguments. Fixes :bugref:`109`. - Fix abs(var float) declaration to work on floats without declared bounds. Fixes :bugref:`106`. - Fix a bug in the computation of int and float bounds that could result in incorrect bounds in some cases. Fixes :bugref:`94`. - Fix garbage collection when creating output models. Fixes :bugref:`77`. - Fix binary operators on optional variables (in some cases comparison operators were reversed). - Fix optimization of unconstrained variables (could sometimes lead to constraints being removed although they were not subsumed). .. _v2.0.14: `Version 2.0.14 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 31 July 2016) .. _changes-14: Changes: ^^^^^^^^ - Less aggressive aggregation of linear expressions in cases where it leads to much less efficient FlatZinc. - Don't create temporary variable for an array literal if it is discarded immediately anyway. - Only create new partiality variable for if-then-else expression if there's at least one var condition. - Replace recursive definitions of array_intersect and array_union with iterative ones. .. _bug-fixes-21: Bug fixes: ^^^^^^^^^^ - Don't report warnings about partiality when using extended generator expressions. - Include cmath to enable building with some versions of gcc. - Constrain result of function call based on function return type if necessary. - Make sure linear expressions generated during binding of variables are properly flattened (including simplification of the linear expression) .. _v2.0.13: `Version 2.0.13 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 26 March 2016) .. _bug-fixes-22: Bug fixes: ^^^^^^^^^^ - Fix a bug in the Common Subexpression Elimination table of the compiler, which could lead to some constraints being dropped (especially when using linear redefinitions). - The output model sometimes did not include all required definitions, in particular when array declarations used identifiers to specify the dimensions. - The generated FlatZinc sometimes still contained bool variables that were not connected to the rest of the model, which could produce incorrect solutions being printed. - Fix a bug where warnings (e.g. about partial functions) could lead to crashes. - Fix the bounds computation for integer and float variables, which could produce incorrect bounds for linear expressions. Fixes :bugref:`94`. - Fix a bug in the IDE that caused solver output to be shown incompletely in some cases. .. _v2.0.12: `Version 2.0.12 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 25 February 2016) .. _changes-15: Changes: ^^^^^^^^ - Partial functions are now always evaluated in their Boolean context, independent of whether they are par or var. If the result of a partial function is statically known to be undefined (such as division by zero or array access out of bounds), and it is used in a constraint expression, this now results in a warning instead of an error. Warnings can be turned off using the ::maybe_partial annotation. Fixes :bugref:`43` and :bugref:`74`. .. _bug-fixes-23: Bug fixes: ^^^^^^^^^^ - Fix a bug in the optimisation phase related to unification of aliased variables. - Fix short-circuit evaluation of Boolean expressions. - Fix a bug in the optimisation phase related to repeated simplification of some Boolean expressions. - Handle errors in output produced by solver without solns2out crashing. Fixes :bugref:`80`. - Fix a bug in the integer bounds computation that caused bool2int with an embedded conditional to crash. - Fix a problem with short-circuit compilation of == expressions when one side was a var opt bool. - Stop compilation when model is failed. Fixes a bug where mzn2fzn would sometimes not clean up the FlatZinc enough for the solver. .. _v2.0.11: `Version 2.0.11 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 15 January 2016) .. _bug-fixes-24: Bug fixes: ^^^^^^^^^^ - Fix parsing of hex and octal literals. Fixes :bugref:`71`. - Fix compilation of extended comprehensions. Fixes :bugref:`72`. - Fix computation of float array access bounds. - Fix aggregation of clauses (could sometimes ignore the negative literals). .. _v2.0.10: `Version 2.0.10 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 9 December 2015) .. _bug-fixes-25: Bug fixes: ^^^^^^^^^^ - Fix a bug in the optimiser that could lead to undefined variables in the generated FlatZinc. Fixes :bugref:`70`. .. _v2.0.9: `Version 2.0.9 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 6 December 2015) .. _bug-fixes-26: Bug fixes: ^^^^^^^^^^ - Need to take return type into account when copying functions to output model. Fixes :bugref:`55`. - Evaluate calls that result in arrays using eval_arraylit. Fixes :bugref:`57`. - Move inverse function to its own library file, so that it remains available when a solver provides an alternative for the inverse predicate. - Optimisation phase now recursively checks constraints when elements in an array become fixed. - Fix CMakeLists file to work for paths that contain spaces. - Distinguish between infix operators and regular functions in the generated html documentation. Fixes :bugref:`61`. - Made parser more robust against incorrect code. - Fix increment/decrement operators for IntVals and make all operations throw correct overflow exceptions. - Fix automatic type coercion for variables declared in let expressions. - Fix a crash when printing some error messages. - Fix compute_div_bounds builtin to return correct result for a division by zero. - Fix optimisation of Boolean constraints to use pointer equality instead of structural equality (same expression can occur multiple times in the FlatZinc). - Only optimise constraints that have not been removed yet. - Fix declaration of functional version of bin_packing_load. Fixes :bugref:`64`. - Set type of arrays returned from polymorphic functions. Fixes :bugref:`65`. - Fix parsing of quoted unary operator calls. - Only compute set functions when bounds are valid. Fixes :bugref:`66`. - Compute proper bounds for if-then-else expressions. - Report error when no reified version of a constraint is available. Fixes :bugref:`67`. - Fix type checking of annotations on binary operators. - Keep annotations when rewriting linear constraints and remove is_defined_var annotations from fixed variables. Fixes :bugref:`69`. .. _changes-16: Changes: ^^^^^^^^ Integer, Boolean and float literals are now cached to achieve better memory performance for some models. Improve performance of parsing integer literals. Improve handling of clause constraints. Add source files of MiniZinc specification to the repository. Limit maximum array size to enable better error messages. Add implied_constraint predicate as a synonym for redundant_constraint. .. _v2.0.8: `Version 2.0.8 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 19 October 2015) .. _bug-fixes-27: Bug fixes: ^^^^^^^^^^ - Fix incorrect negation of some reified comparisons. - Make lb/ub functions work in more cases. - Fix several bugs in the optimisation phase (could lead to incorrect FlatZinc and crashes). - Fix a problem with reverse mapper functions when the result of the reverse mapper can be fixed to a constant. .. _v2.0.7: `Version 2.0.7 `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (released 5 October 2015) .. _changes-17: Changes: ^^^^^^^^ - Improved propagation of Boolean constants in the optimisation phase. This should result in far fewer aliases and improves simplification of conjunctions, disjunctions and clauses. - Add special case handling for integer division by 1. .. _bug-fixes-28: Bug fixes: ^^^^^^^^^^ - Fix FlatZinc generator phase, need to turn all array literal arguments into 1-based single dimensional arrays. - Fix compilation of if-then-else expressions with var conditions (which didn't implement proper partiality/totality semantics). Fixes :bugref:`42`. - Provide correct bounds for weak opt var arithmetic. Fixes :bugref:`51`. - Need to be able to handle unflattened annotations. Fixes :bugref:`53`. - Fix generation of output model (needs to ignore items that have been removed previously). - Add missing lb(var set of int) builtin. Fixes :bugref:`47`. - Check that var set declarations have a finite element type. Fixes :bugref:`46`. - Fix translation context for binary operators on arrays. - Need to access IntVal::infinity as a function, otherwise depending on linker etc it may become 0 in some cases. Fixes :bugref:`40`. - Change pretty printer to use one less digit when printing float literals. This fixes :bugref:`41` (or at least provides a workaround), but some double constants may still be rounded incorrectly when pretty printing and reading them back in. The real fix will be to output hex float literals (coming soon). - Distinguish between generalised comprehensions (iterating over sets) and iterating over arrays. Fixes compilation of comprehensions where iteration over an array is combined with var where clauses. Fixes :bugref:`45`. - Fix bug in creation of output model where sometimes chains of variable definitions could lead to crashes. - Avoi creating mutually recursive definitions in some corner cases, which could cause the compiler to run into infinite loops. - Don't copy vardecl items to output model that are already there. Fixes :bugref:`44`. - Remove domain from array declarations in FlatZinc (avoids problems with domains where holes need to be removed and when there are infinities in the domains) - Fix flattening of equality operator between non-opt and opt vars. - Check that model contains a single solve and output item during type checking (previously, multiple output items were not detected and resulted in incorrect .ozn files). - Fix flattening of xor (arguments need to be in mixed context). - Use is_fixed in cumulative definition. - Fix bug where a par right hand side of a variable mentioned in the output would cause a crash. - Fix variable dependency tracking during rewriting in the optimisation phase. Could previously lead to variables being removed that are still required. Fixes :bugref:`54`. .. _v2.0.6: Version 2.0.6 ~~~~~~~~~~~~~ (released 2 August 2015) .. _changes-18: Changes: ^^^^^^^^ - Add parser support for hexadecimal floating point constants. .. _bug-fixes-29: Bug fixes: ^^^^^^^^^^ - Fix bounds computation for some calls (abs, int_times). - Fix flattening of some array declarations (when right hand side is an identifier). - Add four missing GC locks (could lead to incorrect garbage collection). - Compact output model only after optimisation phase (could lead to incorrect items being removed from output model). .. _v2.0.5: Version 2.0.5 ~~~~~~~~~~~~~ (released 31 July 2015) .. _changes-19: Changes: ^^^^^^^^ - Improve the standard decomposition for the cumulative constraint. - Better handling of binary operators during type checking and flattening, can sometimes avoid stack overflows (e.g. for large conjunctions). - Make ++ operator left associative (avoid stack overflows in the parser). - Add ::domain annotations to linear constraints generated from multi-dimensional element constraints. - Greatly improved linearisation library. .. _bug-fixes-30: Bug fixes: ^^^^^^^^^^ - Fix recursive function calls that contain let expressions. - Fix compilation of comprehensions inside parametric functions. - Fix a memory leak in solns2out. - Fix a problem in the evaluation of binary operators. - Fix a bug in the flattening of array literals. - Fix a bug that would crash the parser on certain syntax errors in let expressions. .. _v2.0.4: Version 2.0.4 ~~~~~~~~~~~~~ (released 1 July 2015) .. _changes-20: Changes: ^^^^^^^^ - Models can now be read from standard input (using the "-" or "--input-from-stdin" command line options). Thanks to Sebastian Kosch. - Improved handling of bool2int during FlatZinc generation. .. _bug-fixes-31: Bug fixes: ^^^^^^^^^^ - Fix unification of aliased variables which could sometimes result in variables being removed although had a constraining right hand side. - Fix evaluation of set comprehensions. - Fix command line flag --no-output-ozn - Fix performance problem when evaluating array expressions inside lets. - Fix flattening of bool_xor redefinitions. - Fix partial evaluation of some array access expressions with var indexes. - Fix definition of geost constraint. - User-defined functions are now copied correctly into the output model if they are referenced in the output item. - Set comprehensions are fully evaluated. .. _v2.0.3: Version 2.0.3 ~~~~~~~~~~~~~ (Internal release that did not contain some essential fixes) .. _v2.0.2: Version 2.0.2 ~~~~~~~~~~~~~ (released 26 May 2015) .. _changes-21: Changes: ^^^^^^^^ - The optimiser now removes simple domain constraints from the FlatZinc - The compiler now checks for integer overflows in all built-in operations - Report an error when the FlatZinc or ozn file cannot be opened for writing - Add support for 3d array literals (e.g. [\| \|1,2|3,4|,|5,6|7,8\| \|] ) - Add show2d and show3d functions for formatting array output - Add row/col functions for variable arrays (fixes :bugref:`2`) - Introduce builtins for creating random distributions - Add reverse library function - Postpone flattening of some reified constraints - Slightly improved compilation of partial function calls when it can be inferred at compile time that their result is undefined - Allow functions with empty argument lists to be declared as function int: foo(); instead of just function int: foo; - Improve error reporting, in particular for errors in comprehensions - Enable expressions a..b where a and b are integer variables - Add redundant_constraint and symmetry_breaking_constraint builtins, these can be rewritten by solver libraries to allow e.g. local search solvers to ignore redundant constraints. - Improve flattening of predicates that simply return their arguments (makes the redundant_constraint and symmetry_breaking_constraint predicates work in more situations). - Replace command line option --only-range-domains by optional boolean value so that solver libraries can set the flag directly in their redefinitions file. - Stop flattening immediately when a model has been found to contain an inconsistency. - Improve flattening of array access expressions, in particular for nested array accesses that can be combined into a single element constraint - Add command line option -s or --statistics to print statistics about the generated FlatZinc - Improve bounds computation for if-then-else expressions - Clause arguments are compiled in positive and negative contexts instead of mixed. That means that predicates that introduce free variables can now be used in the positive part of a clause. .. _bug-fixes-32: Bug fixes: ^^^^^^^^^^ - Fix simplification of linear expressions, negative coefficients could sometimes result in incorrect bounds - Fix bounds computation for unary minus operator - Add missing par set comparison builtins - Fix bounds computation for extended comprehension syntax - Fix a bug in the garbage collector that could sometimes lead to premature deletion of expressions - Fix bounds computation for set difference - Fix duplication of some arrays in the FlatZinc (fixes :bugref:`3`) - Fix bounds inference for variables bound to empty sets (fixes :bugref:`3`) - Fix bug in error reporting function, which would sometimes not report the entire call stack - Fix the generation of fresh variable names for generator expressions - Fix subtype check to allow empty arrays as subtype of arrays of sets - Fix crash when using assert/2 - Fix bug when function used in output referred to par variable - Fix bug in type checker, the detection of cyclic definitions was not correct and could lead to stack overflows - Fix parser to accept expressions with two consecutive array accesses (like x[3][4], which are valid MiniZinc if x is an array of sets) - Fix error reporting when an evaluation error occurs within a comprehension generator - Report type error on some ambiguous function calls - Report type error on var sets with element type other than int - Report type error when trying to coerce a var set into an array - Report error when calling function with a value that is outside the declared parameter bounds - Fix arg_sort builtin to implement the correct semantics - Fix sort_by builtin to sort in non-decreasing order, and work with floats - Fix bug in type checker, now automatic coercions in functions defined with type variables (like the comparison operators) work correctly - Check that index sets match for arrays assigned in let expressions - Fix bug in bounds inference for integer expressions with annotations - Fix propagation of defines_var annotation to be pushed through calls - Fix parser to accept empty 2d and 3d array literals - Fix flattening to remove defines_var annotations with par argument, e.g. defines_var(2), which could be introduced by the optimisation pass - Fix output model creation for variables that have been redefined, and remove more unused variables from the FlatZinc. - Fix bug in the garbage collector that could result in function items not being kept alive in rare cases. .. _v2.0.1: Version 2.0.1 ~~~~~~~~~~~~~ (released 15 December 2014) Major bugs and changes: ^^^^^^^^^^^^^^^^^^^^^^^ - Fix optimisation phase, which was previously incorrectly removing variables - Add support for trigonometric functions (built-ins were missing in 2.0.0) and pow (var versions were missing) - Fix equality operator on par arrays - All expressions in output model are now made par - Improve bounds computation for float variables - Fix translation of functions that need automatic coercion of their return value - Fix the array_lb and array_ub builtins, which would return incorrect bounds in some cases Minor bugs and changes: ^^^^^^^^^^^^^^^^^^^^^^^ - Add space between "array" and "[" in the pretty printer, to be compatible with 1.6 output - Output all par declarations before the var declarations in FlatZinc - Fix parser, which could sometimes crash on invalid input - Improve efficiency of bounds computation on some float expressions - Add special case handling for division by 1 - Add missing float_times definition to the flatzinc builtins - Use correct version of var_dom for float variables - Output information about which files are included in verbose mode - Only compute bounds for "then" expressions if the "if" is not fixed to false .. _v2.0.0: Version 2.0.0 ~~~~~~~~~~~~~ (released 9 December 2014) MiniZinc 2.0 contains many new features and is based on a complete rewrite of the MiniZinc-to-FlatZinc compiler. If you are currently using the previous version 1.6, the new tools can be used as drop-in replacements. The generated FlatZinc is compatible with version 1.6, so all FlatZinc solvers should work without changes. MiniZinc language changes ^^^^^^^^^^^^^^^^^^^^^^^^^ - MiniZinc now supports user-defined functions. Details have been published in the paper "MiniZinc with Functions". Both functions and predicates can be recursive. - MiniZinc now supports option types. Details have been published in the paper "Modelling with Option Types in MiniZinc". - Let expressions have been generalised. They can now contain constraint items in addition to variable declarations. - Array index sets can be declared using arbitrary set expressions as long as they evaluate to contiguous ranges. - The if-then-else expression has been generalised to allow the condition to be a var bool expression (instead of only par bool). - Array and set comprehensions as well as generator calls can now iterate over variables and use var bool where conditions. - Any bool expression can now automatically coerce to an int expression, likewise for int and float. This means that you don't have to write bool2int or int2float in you models any more. - Equality constraints can now be posted between array expressions. - Arbitrary expressions can now be included ("interpolated") into strings, using the syntax "some text \\(e) some more text", where e is any expression. It is the same as writing "some text "++show(e)++" some more text". New built-in functions ^^^^^^^^^^^^^^^^^^^^^^ - Array functions: array1d, arrayXd, row, col, has_index, has_element, sort_by, sort, arg_sort, arg_min, arg_max New global constraints ^^^^^^^^^^^^^^^^^^^^^^ - arg_max, arg_min - arg_sort - k-dimensional diffn - disjunctive - geost - knapsack - network_flow - regular with NFAs - symmetric all different - optional scheduling constraints: alternative, span, disjunctive, cumulative - functional versions of many global constraints New tool chain ^^^^^^^^^^^^^^ - There are a few new builtins that solvers can reimplement, these are listed in the redefinitions-2.0 file. - Include items use a different method for finding included files. Paths are now interpreted as relative to the file that has the include item. That way, the mzn2fzn compiler can be called from a different working directory. - A new tool, mzn2doc, can produce html output from the documentation comments. The MiniZinc distribution contains the documentation for global constraints and builtins generated directly from the library source code. libminizinc-2.5.3/.gitlab-ci.yml0000644000175000017500000003014113757304533015133 0ustar kaolkaolstages: - build - test - trigger .download_vendor: &download_vendor - curl --location --header "PRIVATE-TOKEN:$ACCESS_TOKEN" --silent https://gitlab.com/api/v4/snippets/1796163/raw | tr -d '\r' > download.sh - sh download.sh vendor master vendor:${MZNARCH} vendor.zip - unzip -q vendor.zip .download_vendor: &download_vendor_win - curl -o download.sh --location --header "PRIVATE-TOKEN:%ACCESS_TOKEN%" --silent https://gitlab.com/api/v4/snippets/1796163/raw - dos2unix download.sh - sh download.sh vendor master vendor:%MZNARCH% vendor.zip - unzip -q vendor.zip .download_bundle: &download_bundle - curl --location --header "PRIVATE-TOKEN:$ACCESS_TOKEN" --silent https://gitlab.com/api/v4/snippets/1796163/raw | tr -d '\r' > download.sh - sh download.sh vendor master bundle:${MZNARCH} vendor.zip - unzip -q vendor.zip .download_bundle: &download_bundle_win - curl -o download.sh --location --header "PRIVATE-TOKEN:%ACCESS_TOKEN%" --silent https://gitlab.com/api/v4/snippets/1796163/raw - dos2unix download.sh - sh download.sh vendor master bundle:%MZNARCH% vendor.zip - unzip -q vendor.zip variables: # CCache settings CCACHE_DIR: "$CI_PROJECT_DIR/.ccache" CCACHE_MAXSIZE: "100M" default: interruptible: true # ----------- Build MiniZinc ----------- .build: stage: build before_script: - *download_vendor script: - cmake -S . -B build -G"$CMAKE_ARCH" -DCMAKE_BUILD_TYPE=Release -DBUILD_REF=$CI_PIPELINE_ID -DUSE_PROPRIETARY=OFF -DGecode_ROOT="$CI_PROJECT_DIR/vendor/gecode" -DGurobi_ROOT="$CI_PROJECT_DIR/vendor/gurobi" -DCPlex_ROOT="$CI_PROJECT_DIR/vendor/CPLEX_Studio/cplex" -DOsiCBC_ROOT="$CI_PROJECT_DIR/vendor/cbc" -DSCIP_ROOT="$CI_PROJECT_DIR/vendor/scip" -DXpress_ROOT="$CI_PROJECT_DIR/vendor/xpressmp" -DCMAKE_INSTALL_PREFIX="$CI_PROJECT_DIR/minizinc" - cmake --build build --config Release --target install artifacts: paths: [minizinc/] cache: key: "$CI_JOB_STAGE:$CI_JOB_NAME" paths: [.ccache, vendor.zip*] only: [tags, merge_requests, pipelines, develop, master] build:linux: extends: .build image: dekker1/minibuild:cpp variables: MZNARCH: "linux" CMAKE_ARCH: "Ninja" tags: [linux, docker] build:musl: extends: .build image: dekker1/minibuild:alpine variables: MZNARCH: "musl" CMAKE_ARCH: "Ninja" tags: [linux, docker] build:osx: extends: .build variables: MZNARCH: "osx" CMAKE_ARCH: "Ninja" tags: [osx, cmake, cpp] build:win64: extends: .build variables: MZNARCH: "win64" CMAKE_ARCH: "Ninja" BUILDCACHE_DIR: "$CI_PROJECT_DIR/.ccache" BUILDCACHE_MAX_CACHE_SIZE: "104857600" before_script: - *download_vendor_win script: - cmake -S . -B build -G"%CMAKE_ARCH%" -DCMAKE_BUILD_TYPE=Release -DBUILD_REF=%CI_PIPELINE_ID% -DCCACHE_PROGRAM:STRING=buildcache -DUSE_PROPRIETARY=OFF -DGecode_ROOT="%CI_PROJECT_DIR%/vendor/gecode" -DGurobi_ROOT="%CI_PROJECT_DIR%/vendor/gurobi" -DCPlex_ROOT="%CI_PROJECT_DIR%/vendor/CPLEX_Studio/cplex" -DOsiCBC_ROOT="%CI_PROJECT_DIR%/vendor/cbc" -DSCIP_ROOT="%CI_PROJECT_DIR%/vendor/scip" -DXpress_ROOT="%CI_PROJECT_DIR%/vendor/xpressmp" -DCMAKE_INSTALL_PREFIX="%CI_PROJECT_DIR%/minizinc" - cmake --build build --config Release --target install cache: key: "build_win64" tags: [win64, cmake, cpp, ninja, buildcache] build:wasm_complete: extends: .build image: emscripten/emsdk variables: MZNARCH: "wasm" CMAKE_ARCH: "Unix Makefiles" script: - apt-get update && apt-get install -qq python3 - emcmake cmake -S . -B build -G"$CMAKE_ARCH" -DCMAKE_FIND_ROOT_PATH="/" -DCMAKE_BUILD_TYPE=MinSizeRel -v -DBUILD_REF=$CI_PIPELINE_ID -DUSE_PROPRIETARY=OFF -DGecode_ROOT="$CI_PROJECT_DIR/vendor/gecode" -DGurobi_ROOT="$CI_PROJECT_DIR/vendor/gurobi" -DCPlex_ROOT="$CI_PROJECT_DIR/vendor/CPLEX_Studio/cplex" -DOsiCBC_ROOT="$CI_PROJECT_DIR/vendor/cbc" -DSCIP_ROOT="$CI_PROJECT_DIR/vendor/scip" -DXpress_ROOT="$CI_PROJECT_DIR/vendor/xpressmp" -DCMAKE_INSTALL_PREFIX="$CI_PROJECT_DIR/minizinc" - cmake --build build --config MinSizeRel --target install tags: [docker, high-mem] when: manual build:wasm_minimal: extends: .build image: emscripten/emsdk variables: MZNARCH: "wasm" CMAKE_ARCH: "Unix Makefiles" script: - apt-get update && apt-get install -qq python3 - emcmake cmake -S . -B build -G"$CMAKE_ARCH" -DCMAKE_BUILD_TYPE=MinSizeRel -v -DBUILD_REF=$CI_PIPELINE_ID -DUSE_PROPRIETARY=OFF -DGecode_ROOT="$CI_PROJECT_DIR/vendor/gecode" -DGurobi_ROOT="$CI_PROJECT_DIR/vendor/gurobi" -DCPlex_ROOT="$CI_PROJECT_DIR/vendor/CPLEX_Studio/cplex" -DOsiCBC_ROOT="$CI_PROJECT_DIR/vendor/cbc" -DSCIP_ROOT="$CI_PROJECT_DIR/vendor/scip" -DXpress_ROOT="$CI_PROJECT_DIR/vendor/xpressmp" -DCMAKE_INSTALL_PREFIX="$CI_PROJECT_DIR/minizinc" - cmake --build build --config MinSizeRel --target install tags: [docker] when: manual # ----------- Test Suite ----------- test:format: stage: test image: dekker1/minibuild:clang-format script: - cmake -S . -B build -GNinja -DCLANG_FORMAT_EXECUTABLE="run-clang-format" -DCLANG_FORMAT_FLAGS="--color always" - cmake --build build --target format tags: [linux, docker] only: changes: - "**/*.{cpp,c,h,hh,hpp}" - .clang-format refs: - merge_requests needs: [] test:analyse: extends: .build stage: test image: dekker1/minibuild:clang-tidy variables: MZNARCH: "linux" CMAKE_ARCH: "Ninja" script: - cmake -S . -B build -G"$CMAKE_ARCH" -DCMAKE_CXX_CLANG_TIDY="clang-tidy" -DCMAKE_BUILD_TYPE="Debug" -DGecode_ROOT="$CI_PROJECT_DIR/vendor/gecode" -DGurobi_ROOT="$CI_PROJECT_DIR/vendor/gurobi" -DCPlex_ROOT="$CI_PROJECT_DIR/vendor/CPLEX_Studio/cplex" -DOsiCBC_ROOT="$CI_PROJECT_DIR/vendor/cbc" -DSCIP_ROOT="$CI_PROJECT_DIR/vendor/scip" -DXpress_ROOT="$CI_PROJECT_DIR/vendor/xpressmp" - cmake --build build --config Debug tags: [linux, docker] only: changes: - "**/*.{cpp,c,h,hh,hpp}" - .clang-tidy refs: - merge_requests needs: [] .tests: stage: test variables: PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" MZN_SOLVER_PATH: "$CI_PROJECT_DIR/vendor/chuffed/share/minizinc/solvers/:$CI_PROJECT_DIR/vendor/gecode" before_script: - *download_bundle # TODO: Add gecode configuration to the Gecode solver - "echo '{\"id\":\"org.gecode.gecode\",\"name\":\"Gecode\",\"description\":\"Gecode FlatZinc executable\",\"version\":\"6.1.1\",\"mznlib\":\"share/gecode/mznlib\",\"executable\":\"bin/fzn-gecode\",\"tags\":[\"cp\",\"int\",\"float\",\"set\",\"restart\"],\"stdFlags\":[\"-a\",\"-f\",\"-n\",\"-p\",\"-r\",\"-s\",\"-t\"],\"extraFlags\":[[\"-c-d\",\"Recomputation commit distance\",\"int\",\"8\"],[\"-a-d\",\"Recomputation adaption distance\",\"int\",\"2\"],[\"-decay\",\"Decay factor\",\"float\",\"0.99\"],[\"-node\",\"Node cutoff\",\"int\",\"0\"],[\"-fail\",\"Failure cutoff\",\"int\",\"0\"],[\"-restart\",\"Restart sequence type\",\"opt:none:constant:linear:luby:geometric\",\"none\"],[\"-restart-base\",\"Base for geometric restart sequence\",\"float\",\"1.5\"],[\"-restart-scale\",\"Scale factor for restart sequence\",\"int\",\"250\"],[\"-nogoods\",\"Use no-goods from restarts\",\"bool\",\"false\"],[\"-nogoods-limit\",\"Depth limit for no-good extraction\",\"int\",\"128\"]],\"supportsMzn\":false,\"supportsFzn\":true,\"needsSolns2Out\":true,\"needsMznExecutable\":false,\"needsStdlibDir\":false,\"isGUIApplication\":false}' > vendor/gecode/gecode.msc" - export PATH=$CI_PROJECT_DIR/minizinc/bin:$PATH - minizinc --solvers - cd tests - python3 -m venv env - source env/bin/activate - pip install -r requirements.txt after_script: - echo "Test results at https://minizinc.gitlab.io/-/minizinc/-/jobs/${CI_JOB_ID}/artifacts/tests/output/report.html" artifacts: when: always paths: - tests/output reports: junit: tests/output/junit*.xml cache: key: "$CI_JOB_STAGE:$CI_JOB_NAME" paths: [.cache/pip, vendor.zip*] only: [merge_requests, pipelines, master] # Linux specific config .tests_linux: extends: .tests image: python:latest variables: MZNARCH: "linux" tags: [linux, docker] dependencies: ["build:linux"] needs: ["build:linux"] # OSX specific config .tests_osx: extends: .tests variables: MZNARCH: "osx" tags: [osx] dependencies: ["build:osx"] needs: ["build:osx"] # Windows specific config .tests_win64: extends: .tests variables: MZNARCH: "win64" MZN_SOLVER_PATH: "$CI_PROJECT_DIR/vendor/chuffed/share/minizinc/solvers;$CI_PROJECT_DIR/vendor/gecode" before_script: - *download_bundle_win # TODO: Add gecode configuration to the Gecode solver - 'echo {"id":"org.gecode.gecode","name":"Gecode","description":"Gecode FlatZinc executable","version":"6.1.1","mznlib":"share/gecode/mznlib","executable":"bin/fzn-gecode","tags":["cp","int","float","set","restart"],"stdFlags":["-a","-f","-n","-p","-r","-s","-t"],"extraFlags":[["-c-d","Recomputation commit distance","int","8"],["-a-d","Recomputation adaption distance","int","2"],["-decay","Decay factor","float","0.99"],["-node","Node cutoff","int","0"],["-fail","Failure cutoff","int","0"],["-restart","Restart sequence type","opt:none:constant:linear:luby:geometric","none"],["-restart-base","Base for geometric restart sequence","float","1.5"],["-restart-scale","Scale factor for restart sequence","int","250"],["-nogoods","Use no-goods from restarts","bool","false"],["-nogoods-limit","Depth limit for no-good extraction","int","128"]],"supportsMzn":false,"supportsFzn":true,"needsSolns2Out":true,"needsMznExecutable":false,"needsStdlibDir":false,"isGUIApplication":false} > vendor/gecode/gecode.msc' - set PATH=%CI_PROJECT_DIR%/minizinc/bin;%PATH% - cd tests - python -m venv env - call env\Scripts\activate.bat - pip install -r requirements.txt after_script: - 'echo Test results at https://minizinc.gitlab.io/-/minizinc/-/jobs/%CI_JOB_ID%/artifacts/tests/output/report.html' tags: [win64] dependencies: ["build:win64"] needs: ["build:win64"] cache: key: test_win64 .tests_fast: script: - pytest .tests_full: script: - pytest --all-suites when: manual test:linux:fast: extends: [.tests_linux, .tests_fast] test:linux:full: extends: [.tests_linux, .tests_full] test:osx:fast: extends: [.tests_osx, .tests_fast] test:osx:full: extends: [.tests_osx, .tests_full] test:win64:fast: extends: [.tests_win64, .tests_fast] cache: key: test_win64_fast test:win64:full: extends: [.tests_win64, .tests_full] cache: key: test_win64_full # ----------- Documentation ----------- documentation: stage: test image: guidotack/sphinx-doc:latest variables: MZNARCH: "linux" before_script: - *download_bundle script: - cp $CI_PROJECT_DIR/share/minizinc/gecode_presolver/gecode.mzn $CI_PROJECT_DIR/share/minizinc/std/ - cp $CI_PROJECT_DIR/vendor/chuffed/share/minizinc/chuffed/chuffed.mzn $CI_PROJECT_DIR/share/minizinc/std/ - echo 'include "globals.mzn"; include "gecode.mzn"; include "chuffed.mzn";' > $CI_PROJECT_DIR/share/minizinc/std/all.mzn - ./minizinc/bin/mzn2doc --rst-output --include-stdlib --output-base $CI_PROJECT_DIR/docs/en/lib $CI_PROJECT_DIR/share/minizinc/std/all.mzn - ./minizinc/bin/mzn2doc --rst-output --include-stdlib --output-base $CI_PROJECT_DIR/docs/chi/lib $CI_PROJECT_DIR/share/minizinc/std/all.mzn - cd $CI_PROJECT_DIR/docs/en - make html latexpdf - cd $CI_PROJECT_DIR/docs/chi - make html latexpdf - mkdir -p $CI_PROJECT_DIR/docs-deploy/en - mkdir -p $CI_PROJECT_DIR/docs-deploy/chi - cp -r $CI_PROJECT_DIR/docs/en/_build/html/* $CI_PROJECT_DIR/docs-deploy/en/ - cp $CI_PROJECT_DIR/docs/en/_build/latex/MiniZinc.pdf $CI_PROJECT_DIR/docs-deploy/en/MiniZinc\ Handbook.pdf - cp -r $CI_PROJECT_DIR/docs/chi/_build/html/* $CI_PROJECT_DIR/docs-deploy/chi/ - cp $CI_PROJECT_DIR/docs/chi/_build/latex/MiniZinc.pdf $CI_PROJECT_DIR/docs-deploy/chi/MiniZinc\ Handbook.pdf artifacts: paths: - docs-deploy tags: - linux - docker only: [tags, merge_requests, pipelines, develop, master] dependencies: ["build:linux"] needs: ["build:linux"] # ----------- Trigger FindMUS pipeline ----------- trigger:findmus: stage: trigger trigger: project: minizinc/FindMUS branch: develop only: [develop] libminizinc-2.5.3/mzn2doc.cpp0000644000175000017500000002664013757304533014570 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include #include #include #include using namespace MiniZinc; using namespace std; bool beginswith(const string& s, const string& t) { return s.compare(0, t.length(), t) == 0; } int main(int argc, char** argv) { string filename; vector includePaths; bool flag_verbose = false; bool flag_include_stdlib = false; bool flag_index = true; bool flag_rst = false; int toplevel_groups = 0; string output_base; string header_file; string footer_file; string std_lib_dir; if (char* MZNSTDLIBDIR = getenv("MZN_STDLIB_DIR")) { std_lib_dir = string(MZNSTDLIBDIR); } string globals_dir; if (argc < 2) { goto error; } try { for (int i = 1; i < argc; i++) { if (string(argv[i]) == string("-h") || string(argv[i]) == string("--help")) { goto error; } if (string(argv[i]) == string("--version")) { std::cout << "MiniZinc documentation generator, version " << MZN_VERSION_MAJOR << "." << MZN_VERSION_MINOR << "." << MZN_VERSION_PATCH << std::endl; std::cout << "Copyright (C) 2014-2017 Monash University, NICTA, Data61" << std::endl; std::exit(EXIT_SUCCESS); } if (beginswith(string(argv[i]), "-I")) { string include(argv[i]); if (include.length() > 2) { includePaths.push_back(include.substr(2) + string("/")); } else { i++; if (i == argc) { goto error; } includePaths.push_back(argv[i] + string("/")); } } else if (string(argv[i]) == string("-v") || string(argv[i]) == string("--verbose")) { flag_verbose = true; } else if (string(argv[i]) == "--stdlib-dir") { i++; if (i == argc) { goto error; } std_lib_dir = argv[i]; } else if (beginswith(string(argv[i]), "-G")) { string filename(argv[i]); if (filename.length() > 2) { globals_dir = filename.substr(2); } else { i++; if (i == argc) { goto error; } globals_dir = argv[i]; } } else if (string(argv[i]) == "--toplevel-groups") { i++; if (i == argc) { goto error; } toplevel_groups = atoi(argv[i]); } else if (string(argv[i]) == "--html-header" || string(argv[i]) == "--rst-header") { i++; if (i == argc) { goto error; } header_file = string(argv[i]); } else if (string(argv[i]) == "--html-footer" || string(argv[i]) == "--rst-footer") { i++; if (i == argc) { goto error; } footer_file = string(argv[i]); } else if (string(argv[i]) == "--include-stdlib") { flag_include_stdlib = true; } else if (string(argv[i]) == "--no-index") { flag_index = false; } else if (string(argv[i]) == "--globals-dir" || string(argv[i]) == "--mzn-globals-dir") { i++; if (i == argc) { goto error; } globals_dir = argv[i]; } else if (string(argv[i]) == "--output-base") { i++; if (i == argc) { goto error; } output_base = argv[i]; } else if (string(argv[i]) == "--rst-output") { flag_rst = true; toplevel_groups = 0; } else { std::string input_file(argv[i]); if (input_file.length() <= 4) { std::cerr << "Error: cannot handle file " << input_file << "." << std::endl; goto error; } size_t last_dot = input_file.find_last_of('.'); std::string extension; if (last_dot != string::npos) { extension = input_file.substr(last_dot, string::npos); } if (extension == ".mzn") { if (filename.empty()) { filename = input_file; } else { std::cerr << "Error: Multiple .mzn files given." << std::endl; goto error; } } else if (extension == ".dzn" || extension == ".json") { std::cerr << "Error: cannot generate documentation for data files." << std::endl; } else { std::cerr << "Error: cannot handle file extension " << extension << "." << std::endl; goto error; } } } if (filename.empty()) { std::cerr << "Error: no model file given." << std::endl; goto error; } if (std_lib_dir.empty()) { SolverConfigs solver_configs(std::cerr); std_lib_dir = solver_configs.mznlibDir(); } if (std_lib_dir.empty()) { std::cerr << "Error: unknown minizinc standard library directory.\n" << "Specify --stdlib-dir on the command line or set the\n" << "MZN_STDLIB_DIR environment variable.\n"; std::exit(EXIT_FAILURE); } if (!globals_dir.empty()) { includePaths.push_back(std_lib_dir + "/" + globals_dir + "/"); } includePaths.push_back(std_lib_dir + "/std/"); for (auto& includePath : includePaths) { if (!FileUtils::directory_exists(includePath)) { std::cerr << "Cannot access include directory " << includePath << "\n"; std::exit(EXIT_FAILURE); } } if (output_base.empty()) { output_base = filename.substr(0, filename.length() - 4); } { string header; size_t header_title = std::string::npos; size_t title_size = std::string("@TITLE").size(); if (!header_file.empty()) { std::ifstream hs(FILE_PATH(header_file)); if (!hs.good()) { std::cerr << "Cannot open header file " << header_file << "\n"; std::exit(EXIT_FAILURE); } std::string str((std::istreambuf_iterator(hs)), std::istreambuf_iterator()); header = str; header_title = str.find("@TITLE"); } string footer; if (!footer_file.empty()) { std::ifstream hs(FILE_PATH(footer_file)); if (!hs.good()) { std::cerr << "Cannot open footer file " << footer_file << "\n"; std::exit(EXIT_FAILURE); } std::string str((std::istreambuf_iterator(hs)), std::istreambuf_iterator()); footer = str; } std::stringstream errstream; if (flag_verbose) { std::cerr << "Parsing '" << filename << "'" << std::endl; } std::vector filenames; filenames.push_back(filename); Env env; if (Model* m = parse(env, filenames, vector(), "", "", includePaths, false, false, true, flag_verbose, errstream)) { try { env.model(m); if (flag_verbose) { std::cerr << "Done parsing." << std::endl; } if (flag_verbose) { std::cerr << "Typechecking ..."; } vector typeErrors; MiniZinc::typecheck(env, m, typeErrors, true, false); if (!typeErrors.empty()) { for (auto& typeError : typeErrors) { if (flag_verbose) { std::cerr << std::endl; } std::cerr << typeError.loc() << ":" << std::endl; std::cerr << typeError.what() << ": " << typeError.msg() << std::endl; } exit(EXIT_FAILURE); } if (flag_verbose) { std::cerr << " done" << std::endl; } std::string basename = output_base; std::string basedir; size_t lastSlash = output_base.find_last_of('/'); if (lastSlash != std::string::npos) { basedir = basename.substr(0, lastSlash) + "/"; basename = basename.substr(lastSlash + 1, std::string::npos); } std::vector docs; if (flag_rst) { docs = RSTPrinter::printRST(env.envi(), m, basename, toplevel_groups, flag_include_stdlib, flag_index); } else { docs = HtmlPrinter::printHtml(env.envi(), m, basename, toplevel_groups, flag_include_stdlib, flag_index); } for (auto& doc : docs) { std::ofstream os(FILE_PATH(basedir + doc.filename() + (flag_rst ? ".rst" : ".html"))); std::string header_replace = header; if (header_title != std::string::npos) { header_replace = header_replace.replace(header_title, title_size, doc.title()); } os << header_replace; os << doc.document(); os << footer; os.close(); } } catch (LocationException& e) { if (flag_verbose) { std::cerr << std::endl; } std::cerr << e.loc() << ":" << std::endl; std::cerr << e.what() << ": " << e.msg() << std::endl; exit(EXIT_FAILURE); } catch (Exception& e) { if (flag_verbose) { std::cerr << std::endl; } std::cerr << e.what() << ": " << e.msg() << std::endl; exit(EXIT_FAILURE); } } else { if (flag_verbose) { std::cerr << std::endl; } std::copy(istreambuf_iterator(errstream), istreambuf_iterator(), ostreambuf_iterator(std::cerr)); exit(EXIT_FAILURE); } } if (flag_verbose) { std::cerr << "Done." << std::endl; } return 0; } catch (...) { std::cerr << " UNHANDLED EXCEPTION." << std::endl; exit(EXIT_FAILURE); } error: std::string executable_name(argv[0]); executable_name = executable_name.substr(executable_name.find_last_of("/\\") + 1); std::cerr << "Usage: " << executable_name << " [] [-I ] .mzn [.dzn ...]" << std::endl << std::endl << "Options:" << std::endl << " --help, -h\n Print this help message" << std::endl << " --version\n Print version information" << std::endl << " --include-stdlib\n Include the standard libraries in the output" << std::endl << " -v, --verbose\n Print progress statements" << std::endl << " --stdlib-dir \n Path to MiniZinc standard library directory" << std::endl << " -G --globals-dir --mzn-globals-dir\n Search for included files in /." << std::endl << " --single-page\n Print entire documentation on a single HTML page." << std::endl << " --no-index\n Do not generate an index of all symbols." << std::endl << " --rst-output\n Generate ReStructuredText rather than HTML." << std::endl << " --html-header, --html-footer, --rst-header, --rst-footer\n Header/footer files " "to include in output." << std::endl << std::endl << "Output options:" << std::endl << std::endl << " --output-base \n Base name for output files" << std::endl; exit(EXIT_FAILURE); } libminizinc-2.5.3/.gitignore0000644000175000017500000000070113757304533014466 0ustar kaolkaol*.o *~ mzn2fzn solns2out makefile Makefile include/minizinc/parser.tab.hh lib/lexer.yy.cpp lib/parser.tab.cpp core build/ res/ vendor/ CMakeCache.txt CMakeFiles CMakeScripts cmake_install.cmake install_manifest.txt libminizinc.build libminizinc.xcodeproj CMakeLists.txt.user *.bak *.out *.err .vscode/c_cpp_properties.json .vscode/ipch tests/output tests/env tests/.pytest_cache __pycache__/ .mypy_cache/ .vscode/settings.json _build/ *.pyc .cache/ libminizinc-2.5.3/minizinc.cpp0000644000175000017500000000537213757304533015033 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Gleb Belov */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This (main) file coordinates flattening and solving. * The corresponding modules are flexibly plugged in * as derived classes, prospectively from DLLs. * A flattening module should provide MinZinc::GetFlattener() * A solving module should provide an object of a class derived from SolverFactory. * Need to get more flexible for multi-pass & multi-solving stuff TODO */ #include #include #include #include #include #include #include #include using namespace MiniZinc; #ifdef _WIN32 #include int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) { InterruptListener::run(); #else int main(int argc, const char** argv) { #endif Timer starttime; bool fSuccess = false; try { MznSolver slv(std::cout, std::cerr); try { std::vector args(argc - 1); #ifdef _WIN32 for (int i = 1; i < argc; i++) { args[i - 1] = FileUtils::wide_to_utf8(argv[i]); } fSuccess = (slv.run(args, "", FileUtils::wide_to_utf8(argv[0])) != SolverInstance::ERROR); #else for (int i = 1; i < argc; i++) { args[i - 1] = argv[i]; } fSuccess = (slv.run(args, "", argv[0]) != SolverInstance::ERROR); #endif } catch (const LocationException& e) { if (slv.getFlagVerbose()) { std::cerr << std::endl; } std::cerr << e.loc() << ":" << std::endl; std::cerr << e.what() << ": " << e.msg() << std::endl; } catch (const Exception& e) { if (slv.getFlagVerbose()) { std::cerr << std::endl; } std::string what = e.what(); std::cerr << what << (what.empty() ? "" : ": ") << e.msg() << std::endl; } catch (const std::exception& e) { if (slv.getFlagVerbose()) { std::cerr << std::endl; } std::cerr << e.what() << std::endl; } catch (...) { if (slv.getFlagVerbose()) { std::cerr << std::endl; } std::cerr << " UNKNOWN EXCEPTION." << std::endl; } if (slv.getFlagVerbose()) { std::cerr << " Done ("; std::cerr << "overall time " << starttime.stoptime() << ")." << std::endl; } return static_cast(!fSuccess); } catch (const Exception& e) { std::string what = e.what(); std::cerr << what << (what.empty() ? "" : ": ") << e.msg() << std::endl; std::exit(EXIT_FAILURE); } } // int main() libminizinc-2.5.3/share/0000755000175000017500000000000013757304533013602 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/0000755000175000017500000000000013757304533015422 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/g12_lazyfd/0000755000175000017500000000000013757304533017364 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/g12_lazyfd/redefinitions.mzn0000644000175000017500000000334413757304533022760 0ustar kaolkaol% FlatZinc built-in redefinitions for G12/LazyFD. predicate array_bool_element(var int : idx, array[int] of bool : arr, var bool : v) = let { int : N = length(arr), array[1..N] of var bool : tmp = [idx = I | I in 1..N] } in exists(I in 1..N)(tmp[I]) /\ forall(I in 1..N) (tmp[I] -> v = arr[I]); predicate array_var_bool_element(var int : idx, array[int] of var bool : arr, var bool : v) = let { int : N = length(arr), array[1..N] of var bool : tmp = [idx = I | I in 1..N] } in exists(I in 1..N)(tmp[I]) /\ forall(I in 1..N) (tmp[I] -> v = arr[I]); predicate array_bool_xor(array[int] of var bool: bs) = let { int: bs_lower = min(index_set(bs)), int: bs_upper = max(index_set(bs)), int: n = length(bs) } in if n == 1 then bs[bs_lower] else if n == 2 then bs[bs_lower] xor bs[bs_upper] else if n == 3 then bs[bs_lower] = (bs[bs_lower + 1] = bs[bs_upper]) else let { int: cs_lower = bs_lower + 1, int: cs_upper = bs_upper - 1, array [cs_lower..cs_upper] of var bool: cs } in forall(i in cs_lower..cs_upper-1)( cs[i+1] = bs[i+1] xor cs[i] ) /\ (cs[cs_lower] = bs[bs_lower] xor bs[bs_lower + 1]) /\ (bs[bs_upper] xor cs[cs_upper]) endif endif endif; predicate int_abs(var int: a, var int: b) = b >= 0 /\ b >= a /\ b >= -a /\ (b <= a \/ b <= - a); predicate int_mod(var int: a, var int: b, var int: c) = let { int : bnd = max([lb(a), ub(a), -lb(a), -ub(a)]), var -bnd .. bnd : z } in ( b >= 0 -> c >= 0 /\ c < b) /\ ( b <= 0 -> c <= 0 /\ c > b) /\ b * z + c = a; libminizinc-2.5.3/share/minizinc/g12_lazyfd/all_different_int.mzn0000644000175000017500000000175613757304533023573 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate all_different_int(array[int] of var int: x) = g12lazy_int_all_different(x); %-----------------------------------------------------------------------------% % The implementation of the all_different constraint in the G12/LazyFD solver. % This should not be called directly, instead the definition above should % be used. predicate g12lazy_int_all_different(array[int] of var int: x); % G12/LazyFD doesn't provide a reified all_different so we use the following % definition if g12lazy_int_all_different is called from a reified context. % predicate g12lazy_int_all_different_reif(array[int] of var int: x, var bool: r) = r <-> forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/geas/0000755000175000017500000000000013757304533016341 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/geas/redefinitions.mzn0000644000175000017500000000637213757304533021741 0ustar kaolkaol%% New annotations annotation assume(array[int] of var bool: b); annotation int_priority(array[int] of var int: xs, array[int] of ann: br, ann: sel); annotation bool_priority(array[int] of var bool: xs, array[int] of ann: br, ann: sel); %% Half Reifications predicate int_eq_imp(var int: a, var int: b, var bool: r); predicate int_ne_imp(var int: a, var int: b, var bool: r); predicate int_le_imp(var int: a, var int: b, var bool: r); predicate int_lt_imp(var int: a, var int: b, var bool: r); predicate int_lin_eq_imp(array [int] of int: as, array [int] of var int: bs, int: c, var bool: r); predicate int_lin_ne_imp(array [int] of int: as, array [int] of var int: bs, int: c, var bool: r); predicate int_lin_le_imp(array [int] of int: as, array [int] of var int: bs, int: c, var bool: r); predicate bool_eq_imp(var bool: a, var bool: b, var bool: r); predicate bool_ne_imp(var bool: a, var bool: b, var bool: r); predicate bool_le_imp(var bool: a, var bool: b, var bool: r); predicate bool_lt_imp(var bool: a, var bool: b, var bool: r); predicate bool_or_imp(var bool: a, var bool: b, var bool: r); predicate bool_and_imp(var bool: a, var bool: b, var bool: r); predicate bool_xor_imp(var bool: a, var bool: b, var bool: r); predicate bool_clause_imp(array [int] of var bool: as, array [int] of var bool: bs, var bool: b); predicate array_bool_or_imp(array [int] of var bool: as, var bool: r); predicate array_bool_and_imp(array [int] of var bool: as, var bool: r); predicate bool_lin_eq_imp(array [int] of int: as, array [int] of var bool: bs, var int: c, var bool: r); predicate bool_lin_le_imp(array [int] of int: as, array [int] of var bool: bs, var int: c, var bool: r); predicate bool_lin_lt_imp(array [int] of int: as, array [int] of var bool: bs, var int: c, var bool: r); predicate bool_lin_ne_imp(array [int] of int: as, array [int] of var bool: bs, var int: c, var bool: r); %% Special cases for binary-ish x, y. predicate int_lin_eq_reif( array [int] of int: cs, array [int] of var int: xs, int: k, var bool: r) = let { var bool: a; var bool: b } in (r <-> (a /\ b)) /\ int_lin_le_reif(cs, xs, k, a) /\ int_lin_le_reif([-c | c in cs], xs, -k, b); predicate bool_xor(var bool: x, var bool: y, var bool: r) = bool_clause([x,y],[r]) /\ bool_clause([],[x,y,r]) /\ bool_clause([x, r], [y]) /\ bool_clause([y, r], [x]); predicate set_in_reif(var int: x, set of int: s, var bool: r) = if card(s) = max(s) - min(s) + 1 then r <-> (x >= min(s) /\ x <= max(s)) else bool_clause([x = k | k in s], [r]) /\ forall (k in s) (x = k -> r) endif; predicate int_pow(var int: x, var int: y, var int: z) = let { array [dom(x), dom(y)] of int: A = array2d( dom(x), dom(y), [ pow(a, b) | a in dom(x), b in dom(y) ] ); } in z = A[x, y]; predicate int_pow(var int: x, int: y, var int: z) = if y = 0 then z = 1 elseif y = 1 then z = x else let { var int: zp ::is_defined_var ; constraint int_pow(x, y div 2, zp) :: defines_var(zp); } in if y mod 2 = 0 then z = zp * zp else z = x * zp * zp endif endif; libminizinc-2.5.3/share/minizinc/geas/fzn_all_different_int.mzn0000644000175000017500000000022513757304533023413 0ustar kaolkaolpredicate fzn_all_different_int(array [int] of var int: x) = geas_all_different_int(x); predicate geas_all_different_int(array [int] of var int: x); libminizinc-2.5.3/share/minizinc/geas/fzn_disjunctive.mzn0000644000175000017500000000057113757304533022276 0ustar kaolkaol%predicate geas_disjunctive_var(array[int] of var int: s, % array[int] of var int: d); predicate geas_disjunctive(array[int] of var int: s, array[int] of int: d); %predicate disjunctive(array[int] of var int: s, array[int] of var int: d) = % geas_disjunctive_var(s, d); predicate fzn_disjunctive(array[int] of var int: s, array[int] of int: d) = geas_disjunctive(s, d); libminizinc-2.5.3/share/minizinc/geas/redefinitions-2.0.mzn0000644000175000017500000000206213757304533022226 0ustar kaolkaol% This file contains redefinitions of standard builtins that can be overridden % by solvers. predicate bool_clause_reif(array[int] of var bool: as, array[int] of var bool: bs, var bool: b) = clause(as,bs++[b]) /\ forall (i in index_set(as)) (as[i] -> b) /\ forall (i in index_set(bs)) (bs[i] \/ b); predicate array_float_maximum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_float_minimum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); libminizinc-2.5.3/share/minizinc/geas/fzn_inverse.mzn0000644000175000017500000000033513757304533021420 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_inverse(array [int] of var int: x, array [int] of var int: y) = alldifferent(x) /\ alldifferent(y) /\ forall (i in index_set(x), j in index_set(y)) (x[i] = j <-> y[j] = i); libminizinc-2.5.3/share/minizinc/geas/fzn_value_precede_int.mzn0000644000175000017500000000045213757304533023422 0ustar kaolkaolpredicate fzn_value_precede_int(int: s, int: t, array[int] of var int: x) = let { var index_set(x): pos_s; constraint forall (i in index_set(x)) ( (pos_s <= i) -> (x[i] = s) \/ (pos_s < i) ); } in forall(i in index_set(x)) ( (x[i] = t) -> (pos_s < i) ); libminizinc-2.5.3/share/minizinc/geas/fzn_cumulative.mzn0000644000175000017500000000115713757304533022126 0ustar kaolkaolpredicate geas_cumulative_var(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b); predicate geas_cumulative(array[int] of var int: s, array[int] of int: d, array[int] of int: r, int: b); predicate fzn_cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = geas_cumulative_var(s, d, r, b); %% TODO: once disjunctive propagator is fixed, add %% special case for b = 1. predicate fzn_cumulative(array[int] of var int: s, array[int] of int: d, array[int] of int: r, int: b) = geas_cumulative(s, d, r, b); libminizinc-2.5.3/share/minizinc/geas/fzn_alldifferent_except_0.mzn0000644000175000017500000000024313757304533024171 0ustar kaolkaolpredicate fzn_alldifferent_except_0(array [int] of var int: x) = geas_all_different_except_0(x); predicate geas_all_different_except_0(array [int] of var int: x); libminizinc-2.5.3/share/minizinc/geas/fzn_global_cardinality.mzn0000644000175000017500000000127013757304533023567 0ustar kaolkaolpredicate fzn_global_cardinality(array[int] of var int: x, array[int] of int: cover, array[int] of int: count) = geas_global_cardinality(x, cover, count); predicate fzn_global_cardinality(array[int] of var int: x, array[int] of int: cover, array[int] of var int: count) = forall (i in index_set(cover)) ( count[i] = sum (j in index_set(x)) (bool2int(x[j] = cover[i])) ); predicate geas_global_cardinality(array[int] of var int: x, array[int] of int: cover, array[int] of int: count); libminizinc-2.5.3/share/minizinc/geas/fzn_table_int.mzn0000644000175000017500000000062113757304533021704 0ustar kaolkaolpredicate geas_table_int(array [int] of var int: x, array [int] of int: t); predicate fzn_table_int(array [int] of var int: x, array [int, int] of int: t) = assert (index_set_2of2(t) == index_set(x), "The second dimension of the table must equal the number of variables " ++ "in the first argument", geas_table_int(x, [ t[i,j] | i in index_set_1of2(t), j in index_set_2of2(t) ]) ); libminizinc-2.5.3/share/minizinc/linear/0000755000175000017500000000000013757304533016674 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/linear/fzn_lex_less_bool_reif.mzn0000644000175000017500000000124613757304533024140 0ustar kaolkaolinclude "../std/fzn_lex_less_bool_reif.mzn"; predicate fzn_lex_less_bool_imp(array[int] of var bool: x, array[int] of var bool: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = max(ux - lx, uy - ly), array[0..size+1] of var bool: b } in (c -> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); libminizinc-2.5.3/share/minizinc/linear/redefinitions-2.2.1.mzn0000644000175000017500000000040013757304533022714 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.2.1 % that can be overridden by solvers. /** @group flatzinc.int Constrains \a z = \(\a x ^ {\a y}\) */ predicate int_pow_fixed(var int: x, int: y, var int: z) = int_pow( x, y, z ); libminizinc-2.5.3/share/minizinc/linear/fzn_regular.mzn0000644000175000017500000001075313757304533021746 0ustar kaolkaol/** @group globals.extensional The sequence of values in array \a x (which must all be in the range 1..\a S) is accepted by the DFA of \a Q states with input 1..\a S and transition function \a d (which maps (1..\a Q, 1..\a S) -> 0..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). We reserve state 0 to be an always failing state. */ predicate fzn_regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F) = % my_trace(" regular: index_set(x)=" ++ show(index_set(x)) % ++ ", dom_array(x)=" ++ show(dom_array(x)) % ++ ", dom_array(a)=" ++ show(1..Q) % ++ "\n") /\ let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)), int: n = max(index_set(x)) + 1, array[m..n] of var 1..Q: a, constraint a[m] = q0 /\ % Set a[0]. a[n] in F, % Check the final state is in F. constraint forall(i in index_set(x)) ( x[i] in 1..S % Do this in case it's a var. /\ %% trying to eliminate non-reachable states: let { set of int: va_R = { d[va, vx] | va in dom(a[i]), vx in dom(x[i]) } diff { 0 } %% Bug in MZN 2.0.4 } in a[i+1] in va_R ) } in let { constraint forall(i in [n-i | i in 1..length(x)]) ( a[i] in { va | va in dom(a[i]) where exists(vx in dom(x[i]))(d[va, vx] in dom(a[i+1])) } /\ x[i] in { vx | vx in dom(x[i]) where exists(va in dom(a[i]))(d[va, vx] in dom(a[i+1])) } ) } in forall(i in index_set(x)) ( let { set of int: va_R = { d[va, vx] | va in dom(a[i]), vx in dom(x[i]) } diff { 0 } %% Bug in MZN 2.0.4 } in % my_trace(" S" ++ show(i) % ++ ": dom(a[i])=" ++ show(dom(a[i])) % ++ ", va_R="++show(va_R) % ++ ", index_set_2of2(eq_a) diff va_R=" ++ show(index_set_2of2(eq_a) diff va_R) % ++ ", dom(a[i+1])=" ++ show(dom(a[i+1])) % ) /\ a[i+1] in va_R %/\ a[i+1] in min(va_R)..max(va_R) ) % /\ my_trace(" regular -- domains after prop: index_set(x)=" ++ show(index_set(x)) % ++ ", dom_array(x)=" ++ show(dom_array(x)) % ++ ", dom_array(a)=" ++ show(dom_array(a)) % ++ "\n") % /\ my_trace("\n") /\ let { array[int, int] of var int: eq_a=eq_encode(a), array[int, int] of var int: eq_x=eq_encode(x), } in forall(i in index_set(x)) ( % a[i+1] = d[a[i], x[i]] % Determine a[i+1]. if card(dom(a[i]))*card(dom(x[i])) > nMZN__UnarySizeMax_1step_regular then %% Implication decomposition: forall(va in dom(a[i]), vx in dom(x[i]))( if d[va, vx] in dom(a[i+1]) then eq_a[i+1, d[va, vx]] >= eq_a[i, va] + eq_x[i, vx] - 1 %% The only-if part of conj else 1 >= eq_a[i, va] + eq_x[i, vx] endif ) else %% Network-flow decomposition: %% {regularIP07} M.-C. C{\^o}t{\'e}, B.~Gendron, and L.-M. Rousseau. %% \newblock Modeling the regular constraint with integer programming. let { % array[int, int] of set of int: VX_a12 = %% set of x for given a1 that produce a2 % array2d(1..S, 1..Q, [ { vx | vx in 1..S where d[va1, vx]==va2 } | va1 in dom(a[i]), va2 in dom(a[i+1]) ]); array[int, int] of var int: ppAX = eq_encode(a[i], x[i]); } in forall (va2 in dom(a[i+1])) ( eq_a[i+1, va2] = sum(va1 in dom(a[i]), vx in dom(x[i]) where d[va1, vx]==va2) (ppAX[va1, vx]) ) /\ forall(va1 in dom(a[i]), vx in dom(x[i]))( if not (d[va1, vx] in dom(a[i+1])) then ppAX[va1, vx] == 0 else true endif ) endif ); libminizinc-2.5.3/share/minizinc/linear/redefs_lin_imp.mzn0000644000175000017500000001406013757304533022402 0ustar kaolkaolinclude "redefs_lin_halfreifs.mzn"; include "redefs_lin_reifs.mzn"; %% var, var predicate int_le_imp(var int: x, var int: y, var bool: b) = if is_fixed(b) then if fix(b) then x<=y else true endif elseif ub(x)<=lb(y) then true elseif lb(x)>ub(y) then (not b) else aux_int_le_if_1(x, y, b) endif; %% var, var predicate int_lt_imp(var int: x, var int: y, var bool: b) = if is_fixed(x) then int_le_imp(x + 1, y, b) else int_le_imp(x, y - 1, b) endif; %% var, var predicate int_eq_imp(var int: x, var int: y, var bool: b) = if is_fixed(b) then if fix(b) then (x = y) else true endif elseif card( dom(x) intersect dom(y) ) > 0 then if is_fixed(x) then if is_fixed(y) then b -> (fix(x) = fix(y)) else int_eq_imp(y, fix(x), b) endif elseif is_fixed(y) then int_eq_imp(x, fix(y), b) else %% Simple disjunction aux_int_eq_if_1(x, y, b) endif else not b endif; %% var, const predicate int_eq_imp(var int: x, int: y, var bool: b) = if is_fixed(b) then if fix(b) then (x = y) else true endif elseif y in dom(x) then if is_fixed(x) then b -> (y = fix(x)) else aux_int_eq_if_1(x, y, b) %% Simple disjunction endif else not b endif; %%%%%%%%%%%%%%%%%%%%%%%%%%%% NOTE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%% Omitting int_(lin)_ne_imp %%%%%%%%%%%%%%%%%%% %% so it falls back to _reif, full reification, for performance %% %% TODO also for floats %% %-----------------------------------------------------------------------------% %% lin_expr, const predicate int_lin_le_imp(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = if (d = 0) /\ (length(c) = 2) /\ (abs(c[1]) = 1) /\ (c[1] = -1 * c[2]) then if (c[1] < 0) then int_le_imp(x[2], x[1], b) else int_le_imp(x[1], x[2], b) endif elseif fPostprocessDomains /\ fPostproDom_DIFF then int_le_imp(sum(i in index_set(x))(c[i] * x[i]), d, b) elseif fAvoidNI then aux_float_le_if_1(sum2float(c, x), d, b) else aux_int_le_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; predicate int_lin_lt_imp(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = if true then abort("int_lin_lt_imp not supposed to be called") else int_lin_le_imp(c, x, d - 1, b) endif; %% lin_expr, const predicate int_lin_eq_imp(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = if (d = 0) /\ (length(c) = 2) /\ (abs(c[1]) = 1) /\ (c[1] = -1 * c[2]) then int_eq_imp(x[1], x[2], b) elseif fPostprocessDomains /\ fPostproDom_DIFF then int_eq_imp(sum(i in index_set(x))(c[i] * x[i]), d, b) elseif fAvoidNI then aux_float_eq_if_1(sum2float(c, x), d, b) else aux_int_eq_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; %-----------------------------------------------------------------------------% %% var float, var float predicate float_le_imp(var float: x, var float: y, var bool: b) = if is_fixed(b) then if fix(b) then x <= y else true endif elseif ub(x) <= lb(y) then true elseif lb(x) > ub(y) then (not b) else aux_float_le_if_1(x, y, b) endif; %% var float, var float predicate float_lt_imp(var float: x, var float: y, var bool: b) = if is_fixed(b) then if fix(b) then (x < y) else true endif else aux_float_lt_if_1(x, y, b) endif; %% var float, var float predicate float_eq_imp(var float: x, var float: y, var bool: b) = if is_fixed(b) then if fix(b) then (x = y) else true endif elseif (ub(x) < lb(y)) \/ (lb(x) > ub(y)) then not b elseif is_fixed(x) /\ is_fixed(y) then b -> (fix(x) == fix(y)) else aux_float_eq_if_1(x, y, b) endif; %% var float, var float predicate float_ne_imp(var float: x, var float: y, var bool: b) = if is_fixed(b) then if fix(b) then (x != y) else true endif elseif (ub(x) < lb(y)) \/ (lb(x) > ub(y)) then true elseif is_fixed(x) /\ is_fixed(y) then b -> (fix(x) != fix(y)) else aux_float_ne_if_1(x, y, b) endif; %-----------------------------------------------------------------------------% predicate float_lin_eq_imp(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if (d = 0.0) /\ (length(c) = 2) /\ (abs(c[1]) = 1.0) /\ (c[1] = -1.0 * c[2]) then float_eq_imp(x[1], x[2], b) elseif fPostprocessDomains /\ fPostproDom_DIFF then float_eq_imp(sum(i in index_set(x))(c[i] * x[i]), d, b) else aux_float_eq_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; predicate float_lin_ne_imp(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if (d = 0.0) /\ (length(c) = 2) /\ (abs(c[1]) = 1.0) /\ (c[1] = -1.0 * c[2]) then float_ne_imp(x[1], x[2], b) elseif fPostprocessDomains /\ fPostproDom_DIFF then float_ne_imp(sum(i in index_set(x))(c[i] * x[i]), d, not b) else aux_float_ne_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; predicate float_lin_le_imp(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if (d = 0.0) /\ (length(c) = 2) /\ (abs(c[1]) = 1.0) /\ (c[1] = -1.0 * c[2]) then if (c[1] < 0.0) then float_le_imp(x[2], x[1], b) else float_le_imp(x[1], x[2], b) endif elseif fPostprocessDomains /\ fPostproDom_DIFF then float_le_imp(sum(i in index_set(x))(c[i] * x[i]), d, b) else aux_float_le_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; predicate float_lin_lt_imp(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if (d = 0.0) /\ (length(c) = 2) /\ (abs(c[1]) = 1.0) /\ (c[1] = -1.0 * c[2]) then if (c[1] < 0.0) then float_lt_imp(x[2], x[1], b) else float_lt_imp(x[1], x[2], b) endif elseif fPostprocessDomains /\ fPostproDom_DIFF then float_lt_imp(sum(i in index_set(x))(c[i] * x[i]), d, b) else aux_float_lt_if_1(sum(i in index_set(x))(c[i] * x[i]), d, b) endif; libminizinc-2.5.3/share/minizinc/linear/fzn_lex_lesseq_bool.mzn0000644000175000017500000000424013757304533023456 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_bool(array[int] of var bool: x, array[int] of var bool: y) = % if (min(card(index_set(x)), card(index_set(y))) <= 25) then % let { int: size = min(card(index_set(x)), card(index_set(y))); % } in % sum(i in 0..size-1)(pow(2, (size-1-i)) * bool2int(x[i+min(index_set(x))])) % <= sum(i in 0..size-1)(pow(2, (size-1-i)) * bool2int(y[i+min(index_set(y))])) % else % my_trace ("lex_lesseq_bool(\(x), \(y))") /\ let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in b[0] /\ forall(i in 0..size) ( b[i] -> ( ( ( x[lx + i] <= y[ly + i] ) ) /\ % bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) <= 2 /\ % ( b[i] -> ( x[lx + i] < y[ly + i] \/ b[i+1] ) ) % /\ ( bool2int(b[i]) <= bool2int(x[lx + i] < y[ly + i]) + bool2int(b[i+1]) ) /\ % bool2int(b[i]) + (1-bool2int(x[lx + i])) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 % /\ bool2int(b[i]) + bool2int(x[lx + i]) + bool2int(y[ly + i]) + (1-bool2int(b[i+1])) <= 3 %% This guy is dominated by the 1st one above but helps: % /\ bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 ) /\ b[size+1] = (ux-lx <= uy-ly) % endif ; % forall(i in 0..size) ( % ( b[i] == ( x[lx + i] <= y[ly + i] ) ) % /\ % if i < size then % ( b[i] == ( x[lx + i] < y[ly + i] \/ b[i+1] % ) ) else true endif % ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear/options.mzn0000644000175000017500000002275013757304533021123 0ustar kaolkaol/* % Controls % */ %-----------------------------------------------------------------------------% %---------- USER and LAZY CUTS -----------------------------------------------% /* PLEASE NOTE: If you export FZN file with lazy_constraint/user_cut annotations, their declarations are not exported currently (as of 7.11.17). WORKAROUND: when solving that fzn, add -G linear, e.g., as follows: mzn-cplex -G linear model.fzn * For Gurobi, the constraints marked as MIP_cut and/or MIP_lazy are added * into the overall model and marked with the foll values of Lazy attribute: * ::MIP_lazy 1 * ::MIP_cut ::MIP_lazy 2 * ::MIP_cut 3 */ ann: user_cut; ann: lazy_constraint; %%% comment away the below assignments (leaving, e.g., ann: MIP_cut;) to have them as normal constraints %%% In particular, they may be used by redundant_constraint() and symmetry_breaking_constraint(), see redefs-2.0.2.mzn ann: MIP_cut = user_cut; %% MIP_cut: make sure no feasible solutions are cut off %% -- seems better on average but in CPLEX, wrong LB e.g. on carpet-cutting ann: MIP_lazy = lazy_constraint; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "GENERAL" constraints %%%%%%%%%%%%%%%%%%%%%%%%%%%%% opt bool: fIndConstr; %% User option, e.g., with -D %% Attention: as of MZN 2.4.3, you also need -DfMIPdomains=false bool: fMZN__UseIndicators = %% Pass on indicator constraints if absent( fIndConstr ) then false else deopt( fIndConstr ) endif; %% CPLEX 12.6.2 Concert: reifs give wrong result on 2012/amaze, so using implications only %% MAX/MIN opt bool: MinMaxGeneral; %% User option, e.g., with -D %% pass on min/max to the backend as fzn_array_float_minimum bool: MZN__MinMaxGeneral = if absent(MinMaxGeneral) then false else deopt(MinMaxGeneral) endif; %% CUMULATIVE opt bool: CumulativeSolverConfig; %% As set in share/minizinc/Preferences.json opt bool: Cumulative; %% User option, e.g., with -D bool: MZN__Cumulative_Fixed_d_r = if occurs(Cumulative) then deopt(Cumulative) elseif occurs(CumulativeSolverConfig) then deopt(CumulativeSolverConfig) else false endif; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Quadratic expressions %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------------------- % %% Forward float_times as fzn_float_times opt bool: QuadrFloatSolverConfig; %% As set in share/minizinc/Preferences.json opt bool: QuadrFloat; %% User option, e.g., with -D bool: MZN__QuadrFloat = if occurs(QuadrFloat) then deopt(QuadrFloat) elseif occurs(QuadrFloatSolverConfig) then deopt(QuadrFloatSolverConfig) else false endif; %% Forward int_times as fzn_int_times opt bool: QuadrIntSolverConfig; %% As set in share/minizinc/Preferences.json opt bool: QuadrInt; %% User option, e.g., with -D bool: QuadrIntFinal = if occurs(QuadrInt) then deopt(QuadrInt) elseif occurs(QuadrIntSolverConfig) then deopt(QuadrIntSolverConfig) else false endif; opt int: QuadrIntCard; %% Convert int_times to fzn_int_times if the minimum %% of x, y's domain cardinalities as at least QuadrIntCard int: MZN__QuadrIntCard = if occurs(QuadrIntCard) then deopt(QuadrIntCard) elseif QuadrIntFinal then 0 else infinity endif; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Subtour elimination in circuit %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------------------- % opt int: nSECcuts; %% 0,1: use MTZ formulation int: nMZN__fSECcuts = %% 1,2: pass on circuit constraints to the MIP_solverinstance's cut gen if absent( nSECcuts ) then 0 else deopt( nSECcuts ) endif; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MIPdomains %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------------------- % %% Paper: % Belov, Stuckey, Tack, Wallace. Improved Linearization of Constraint Programming Models. CP 2016 Proceedings. %%% The below option enables translation of domain constraints into the ...POST predicates. %%% The code in MIPdomains.cpp processes them and also non-contiguous domains %%% (only-range-domains is then standardly off). MIPdomains.cpp needs all the required %%% __POST predicates to be declared to kick in. opt bool: fMIPDomains; %% unified decomposition constraints (...__POST) to FlatZinc opt bool: fMIPdomains; %% Can be defined from cmdline: -D "fMIPdomains=false" bool: fPostprocessDomains = %% True to pass all domain-related if absent( fMIPdomains ) /\ absent( fMIPDomains ) then true elseif not absent( fMIPdomains ) then deopt( fMIPdomains ) else deopt( fMIPDomains ) endif; opt bool: fMIPdomAux; bool: fPostproDom_AUX = %% Specialized for aux_ constr if absent( fMIPdomAux ) then false else deopt( fMIPdomAux ) endif; opt bool: fMIPdomDiff; bool: fPostproDom_DIFF = %% Specialized for differences: x z=x-y<0 if absent( fMIPdomDiff ) then false %% seems best for Gurobi, worse for CBC else deopt( fMIPdomDiff ) endif; mzn_opt_only_range_domains = not fPostprocessDomains; %% currently unused %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Avoid creating new int vars %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------------------- % opt bool: fAvoidNewInts; bool: fAvoidNI = %% Actually this is only for ..._lin_..., not for just x-y if absent( fAvoidNewInts ) then false else deopt( fAvoidNewInts ) endif; opt bool: fNewVarsInAuxEq; bool: fAuxIntEqOLD00 = if absent(fNewVarsInAuxEq) then false else deopt(fNewVarsInAuxEq) endif; bool: fAuxFloatEqOLD00 = if absent(fNewVarsInAuxEq) then false else deopt(fNewVarsInAuxEq) endif; %%%%%%%%%%%%%%%%%%%%% Redundant constraints ---------------------------------------------- % bool: fMZN__IgnoreRedundantCumulative=false; %% NOT WORKING NOW, use redefs_2.0.2.mzn: %%%%% bool: fMZN__IgnoreAllUserRedundant=false; %% ignore all user-spec redundant constr %%%%%%%%%%%%%%%%%%%%% Element, minimuum convex hull --------------------------------------- % opt bool: fXBZCuts01; %% orders 0, 1 opt bool: fXBZCutGen; %% only works if Cuts01 bool: fElementCutsXZ=false; %% Use simple XZ & XZB cuts for element bool: fElementCutsXZB = if absent(fXBZCuts01) then false else deopt(fXBZCuts01) endif; bool: fMinimumCutsXZ=false; %% Use simple XZ & XZB cuts for minimum bool: fMinimumCutsXZB = if absent(fXBZCuts01) then false else deopt(fXBZCuts01) endif; bool: fUseXBZCutGen = if absent(fXBZCutGen) then false else deopt(fXBZCutGen) endif; % ----------------------------------------------------------------------------------------- % bool: fIntTimesBool=true; %% Special handling of multiplication with a boolean(*const) %-----------------------------------------------------------------------------% % If not postprocessing domains: For unary encoding: maximal domain length to invoke it int: nMZN__UnarySizeMax_intTimes=20; int: nMZN__UnarySizeMax_cumul=2000; int: nMZN__UnarySizeMax_1step_regular=20000; %% network-flow decomp in the regular constraint int: nMZN__UnaryLenMin__ALL=1; %% can be used by the indiv. cases int: nMZN__UnaryLenMax__ALL=2000; %% can be used by the indiv. cases % Some more detailed parameters int: nMZN__UnaryLenMin_leq = 1; int: nMZN__UnaryLenMin_neq = nMZN__UnaryLenMin__ALL; int: nMZN__UnaryLenMin_eq = nMZN__UnaryLenMin__ALL; int: nMZN__UnaryLenMax_leq = -1; int: nMZN__UnaryLenMax_neq = nMZN__UnaryLenMax__ALL; int: nMZN__UnaryLenMax_eq = nMZN__UnaryLenMax__ALL; int: nMZN__UnaryLenMax_setIn = nMZN__UnaryLenMax__ALL; int: nMZN__UnaryLenMax_setInReif = nMZN__UnaryLenMax__ALL; %-----------------------------------------------------------------------------% % Strict inequality % The relative epsilon %%% Has the problem that when relating to upper bound of various differences, %%% getting different absolute eps...? %% float: float_lt_EPS_coef__ = 1e-03; ABANDONED 12.4.18 due to #207 %%% Absolute one, used everywhere %%% Might make no sense for floats with smaller domains etc. opt float: float_EPS; float: float_lt_EPS = if absent( float_EPS ) then 1e-6 else deopt( float_EPS ) endif; %-----------------------------------------------------------------------------% %%% Set =true to PRINT TRACING messages for some constraints: opt bool: fMIPTrace; bool: mzn__my_trace_on = if absent( fMIPTrace ) then false else deopt( fMIPTrace ) endif; test my_trace(string: msg) ::promise_total = if mzn__my_trace_on then trace(msg) else true endif; test my_trace(string: msg, bool: bb) ::promise_total = if mzn__my_trace_on then trace(msg, bb) else bb endif; function var bool: my_trace(string: msg, var bool: bb) ::promise_total = if mzn__my_trace_on then trace(msg, bb) else bb endif; %%% Set =true to PRINT TRACING messages for the currently debugged constraints: opt bool: fMIPTraceDBG; bool: mzn__my_trace__DBG_on = if absent( fMIPTraceDBG ) then false else deopt( fMIPTraceDBG ) endif; test my_trace__DBG(string: msg) ::promise_total = if mzn__my_trace__DBG_on then trace(msg) else true endif; libminizinc-2.5.3/share/minizinc/linear/redefs_bool_imp.mzn0000644000175000017500000000442513757304533022557 0ustar kaolkaolinclude "redefs_lin_halfreifs.mzn"; % SIMPLE BOOLEAN LOGIC % TODO: why not check "is_fixed(r)" everywhere?? predicate bool_eq_imp(var bool: p, var bool: q, var bool: r) = if is_fixed(r) then if fix(r) then p = q else true endif else let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r) } in x + z <= y + 1 /\ y + z <= x + 1 endif; predicate bool_ne_imp(var bool: p, var bool: q, var bool: r) = bool_xor_imp(p, q, r); predicate bool_le_imp(var bool: p, var bool: q, var bool: r) = let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r), } in 1 - x + y >= z; predicate bool_lt_imp(var bool: p, var bool: q, var bool: r) = bool_and_imp(not p, q, r); predicate bool_or_imp(var bool: p, var bool: q, var bool: r) = array_bool_or_imp([p,q], r); predicate bool_and_imp(var bool: p, var bool: q, var bool: r) = array_bool_and_imp([p,q],r); predicate bool_xor_imp(var bool: p, var bool: q, var bool: r) = let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r), } in x + y >= z /\ x + y + z <= 2; % BOOLEAN ARRAY OPERATIONS predicate array_bool_or_imp(array[int] of var bool: a, var bool: b) = if forall( i in index_set( a ) )( is_fixed(a[i]) /\ not fix(a[i]) ) then not b elseif exists( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then true else let { array[index_set(a)] of var bool: a1; var int: x = bool2int(b), } in forall(i in index_set(a)) (a1[i] -> a[i]) /\ sum(a1) = x endif; predicate array_bool_and_imp(array[int] of var bool: a, var bool: b) = if is_fixed(b) then if fix(b) then forall(i in index_set(a))( a[i] ) else true endif elseif forall( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then true else let { var int: x = bool2int(b), array[index_set(a)] of var int: c = array1d(index_set(a), [ bool2int(a[i] ) | i in index_set(a) ]) } in forall(i in index_set(c)) ( c[i] >= x ) endif; %% No var int d, sorry TODO: why not??? predicate bool_lin_eq_imp(array[int] of int: c, array[int] of var bool: x, int: d, var bool: b) = aux_int_eq_if_1(sum(i in index_set(x))( c[i]*bool2int(x[i]) ), d, bool2int(b)); libminizinc-2.5.3/share/minizinc/linear/redefinitions.mzn0000644000175000017500000006777013757304533022305 0ustar kaolkaol/* % FlatZinc built-in redefinitions for linear solvers. % % AUTHORS % Sebastian Brand % Gleb Belov (2015-) % cf. Belov, Stuckey, Tack, Wallace. Improved Linearization of Constraint Programming Models. CP 2016. */ %----------------------------- BOOL2INT --------------------------------% function var bool: reverse_map(var int: x) = (x==1); function bool: reverse_map(int: x) = (x==1); predicate mzn_reverse_map_var(var bool: b) = let { var int: x = bool2int(b) } in true; function var int: bool2int(var bool: x) :: promise_total = let { var 0..1: b2i; constraint (x = reverse_map(b2i)) ::is_reverse_map ; } in b2i; predicate bool_eq(var bool: x, var bool: y) = %% trace(" bool_eq: \(x), \(y) \n") /\ bool2int(x)==bool2int(y); predicate bool2int(var bool: x, var int: y) = y = bool2int(x); %---------------------------- BASIC (HALF)REIFS -----------------------------% include "options.mzn"; include "redefs_bool_reifs.mzn"; include "redefs_bool_imp.mzn"; include "domain_encodings.mzn"; include "redefs_lin_reifs.mzn"; include "redefs_lin_imp.mzn"; include "redefs_lin_halfreifs.mzn"; include "nosets.mzn"; %% For set_le, set_lt ... Usind std/nosets %% as long as the linearization is good. %-----------------------------------------------------------------------------% % Strict inequality % Uncomment the following redefinition for FlatZinc MIP solver interfaces that % do not support strict inequality. Note that it does not preserve equivalence % (some solutions of the original problem may become invalid). predicate float_lt(var float: x, var float: y) = % (x - y) <= (-float_lt_EPS_coef__)*max(abs(ub(x - y)), abs(ub(y-x))); x <= y - float_lt_EPS; predicate float_lin_lt(array[int] of float: c, array[int] of var float: x, float: d) = float_lt(sum(i in index_set(x))( c[i]*x[i] ), d); %-----------------------------------------------------------------------------% % Minimum, maximum, absolute value % Use unary as well? TODO predicate int_abs(var int: x, var int: z) = %% The simplifications seem worse on league.mzn model90-18-20.dzn: %% but the .lp seem to differ just by order...?? TODO if lb(x)>=0 then z==x elseif ub(x)<=0 then z==-x else let { var bool: p } in z >= x /\ z >= -x /\ z >= 0 /\ % This is just for preprocessor z <= max([ub(x), -lb(x)]) /\ % And this % z <= x \/ z <= -x %% simple aux_int_le_if_1(z, x, p) /\ %% even simpler aux_int_le_if_0(z, -x, p) /\ int_le_reif(0, x, p) % with reifs %int_eq_reif(z, x, p) /\ %int_eq_reif(z, -x, not p) endif ; predicate int_min(var int: x, var int: y, var int: z) = array_int_minimum(z, [x, y]); predicate int_max(var int: x, var int: y, var int: z) = array_int_maximum(z, [x, y]); predicate float_abs(var float: x, var float: z) = if lb(x)>=0.0 then z==x elseif ub(x)<=0.0 then z==-x else let { var bool: p } in z >= x /\ z >= -x /\ z >= 0.0 /\ % This is just for preprocessor z <= max([ub(x), -lb(x)]) /\ % And this % z <= x \/ z <= -x aux_float_le_if_1(z, x, (p)) /\ aux_float_le_if_0(z, -x, (p)) % /\ % float_le_reif(0.0, x, p) % with reifs - no point for floats? TODO % float_eq_reif(z, x, p) /\ % float_eq_reif(z, -x, not p) endif; predicate float_min(var float: x, var float: y, var float: z) = array_float_minimum(z, [x, y]); predicate float_max(var float: x, var float: y, var float: z) = array_float_maximum(z, [x, y]); predicate array_int_minimum_I(var int: m, array[int] of var int: x) = let { int: n = length(x), constraint assert(1 == min(index_set(x)), " array_int_minimum_I: argument indexed not from 1??"), int: iMinUB = arg_min([ub(x[i]) | i in 1..n]), int: MinUB = ub(x[iMinUB]), set of int: sLBLess = { i | i in 1..n where lb(x[i])0 then sLBLess else sLBLess union { iMinUB } endif, } in if 1==card(sActive) then m == x[min(sActive)] elseif MZN__MinMaxGeneral then fzn_array_float_minimum(m, x) %% Send to backend else let { array[1..n] of var int: p = [ if i in sActive then let { var 0..1: pi } in pi else 0 endif | i in 1..n ], constraint 1==sum(p), constraint m >= lb_array(x), constraint m <= MinUB, } in forall (i in index_set(x)) ( if i in sActive %% for at least 1 element then m<=x[i] /\ aux_int_ge_if_1(m, x[i], p[i]) endif ) %% -- exclude too big x[i] endif; predicate array_float_minimum_I(var float: m, array[int] of var float: x) = let { int: n = length(x), constraint assert(1 == min(index_set(x)), " array_float_minimum_I: argument indexed not from 1??"), int: iMinUB = arg_min([ub(x[i]) | i in 1..n]), float: MinUB = ub(x[iMinUB]), set of int: sLBLess = { i | i in 1..n where lb(x[i])0 then sLBLess else sLBLess union { iMinUB } endif, } in if 1==card(sActive) then m == x[min(sActive)] elseif MZN__MinMaxGeneral then fzn_array_float_minimum(m, x) %% Send to backend else let { array[1..n] of var int: p = [ if i in sActive then let { var 0..1: pi } in pi else 0 endif | i in 1..n ], constraint 1==sum(p), constraint m >= lb_array(x), constraint m <= MinUB, } in forall (i in index_set(x)) ( if i in sActive %% for at least 1 element then m<=x[i] /\ aux_float_ge_if_1(m, x[i], p[i]) endif ) %% -- exclude too big x[i] /\ if card(sActive)>1 /\ fMinimumCutsXZ then let { array[int] of float: AL = [ lb(x[i]) | i in 1..n], array[int] of int: srt = sort_by([i | i in 1..n], AL), %indices of lb in sorted order array[int] of float: AL_srt = [AL[srt[i]] | i in 1..n], array[int] of float: AU_srt = [ub(x[srt[i]]) | i in 1..n], array[int] of float: AM_srt = AL_srt ++ [MinUB] %% -- these are z-levels of extreme points } in forall (i in 2..n+1 where AM_srt[i]<=MinUB /\ %% this is a new "start level" AM_srt[i]!=AM_srt[i-1] )( %% and would produce a new cut m >= AM_srt[i] - sum(j in 1..i-1 where AL_srt[j]1 /\ fMinimumCutsXZB then array_var_float_element__XBZ_lb([ -x[i] | i in sActive ], [ p[i] | i in sActive ], -m) :: MIP_cut else true endif endif; %-----------------------------------------------------------------------------% % Multiplication and division predicate int_div(var int: x, var int: y, var int: q) = q == aux_int_division_modulo_fn(x,y)[1]; predicate int_mod(var int: x, var int: y, var int: r) = r == aux_int_division_modulo_fn(x,y)[2]; function array[int] of var int: aux_int_division_modulo_fn(var int: x, var int: y) = let { %% Domain of q set of int: dom_q = if lb(y)*ub(y)>0 then let { set of int: EP = { ub(x) div ub(y), ub(x) div lb(y), lb(x) div ub(y), lb(x) div lb(y) }, } in min(EP)..max(EP) else let { int: mm = max( abs(lb(x)), abs(ub(x)) ), } in -mm..mm %% TODO case when -1 or 1 not in dom(x) endif, var dom_q: q; int: by = max(abs(lb(y)), abs(ub(y))); var -by+1..by-1: r; constraint x = y * q + r, constraint 0 <= x -> 0 <= r, %% which is 0 > x \/ 0 <= r constraint x < 0 -> r <= 0, %% which is x >= 0 \/ r <= 0 % abs(r) < abs(y) var 1.. max(abs(lb(y)), abs(ub(y))): w = abs(y), constraint w > r /\ w > -r, } in [ q, r ]; %% Can also have int_times(var float, var int) ......... TODO predicate int_times(var int: x, var int: y, var int: z) = if is_fixed(x) then z==fix(x)*y %%%%% Need to use fix() otherwise added to CSE & nothing happens elseif is_fixed(y) then z==x*fix(y) elseif is_same(x, y) then z == pow(x, 2) elseif 0..1==dom(x) /\ 0..1==dom(y) then bool_and__INT(x,y,z) elseif card(dom(x))==2 /\ card(dom(y))==2 /\ 0 in dom(x) /\ 0 in dom(y) then let { var 0..1: xn; var 0..1: yn; var 0..1: zn; constraint x=xn*max(dom(x) diff {0}); constraint y=yn*max(dom(y) diff {0}); constraint z=zn*max(dom(x) diff {0})*max(dom(y) diff {0}); } in bool_and__INT(xn,yn,zn) elseif min(card(dom(x)), card(dom(y))) >= MZN__QuadrIntCard then fzn_int_times(x, y, z) elseif card(dom(x)) * card(dom(y)) > nMZN__UnarySizeMax_intTimes \/ ( fIntTimesBool /\ ( %% Peter's idea for *bool. More optimal but worse values on carpet cutting. (card(dom(x))==2 /\ 0 in dom(x)) \/ (card(dom(y))==2 /\ 0 in dom(y)) ) ) then %% PARAM %% ALSO NO POINT IF <=4. TODO if card(dom(x)) > card(dom(y)) \/ ( card(dom(x))==card(dom(y)) /\ 0 in dom(y) /\ not (0 in dom(x)) ) then int_times(y,x,z) else let { set of int: s = lb(x)..ub(x), set of int: r = {lb(x)*lb(y), lb(x)*ub(y), ub(x)*lb(y), ub(x)*ub(y)}, array[s] of var min(r)..max(r): ady = array1d(s, [ if d in dom(x) then d*y else min(r) endif | d in s ]) } in ady[x] = z %% use element() endif else int_times_unary(x, { }, y, z) endif; %% domx__ can be used to narrow domain... NOT IMPL. predicate int_times_unary(var int: x, set of int: domx__, var int: y, var int: z) = let { set of int: r = {lb(x)*lb(y), lb(x)*ub(y), ub(x)*lb(y), ub(x)*ub(y)}, %% set of int: domx = if card(domx__)>0 then domx__ else dom(x) endif, array[int, int] of var int: pp=eq_encode(x, y) } in z>=min(r) /\ z<=max(r) /\ z==sum(i in index_set_1of2(pp), j in index_set_2of2(pp)) (i * j * pp[i, j]) /\ forall(i in index_set_1of2(pp), j in index_set_2of2(pp) where not ((i*j) in dom(z)) )(pp[i, j]==0) ; predicate int_times_unary__NOFN(var int: x, set of int: domx__, var int: y, var int: z) = let { set of int: r = {lb(x)*lb(y), lb(x)*ub(y), ub(x)*lb(y), ub(x)*ub(y)}, %% set of int: domx = if card(domx__)>0 then domx__ else dom(x) endif, array[int] of var int: pX = eq_encode(x), array[int] of var int: pY = eq_encode(y), array[int] of int: valX = [ v | v in index_set(pX) ], %% NOT domx. array[int] of int: valY = [ v | v in index_set(pY) ], %% -- according to eq_encode! array[index_set(valX), index_set(valY)] of var 0..1: pp %% both dim 1.. } in if is_fixed(x) \/ is_fixed(y) then z==x*y else z>=min(r) /\ z<=max(r) /\ sum(pp)==1 /\ z==sum(i in index_set(valX), j in index_set(valY)) (valX[i] * valY[j] * pp[i, j]) /\ forall(i in index_set(valX)) ( pX[valX[i]] == sum(j in index_set(valY))( pp[i, j] ) ) /\ forall(j in index_set(valY)) ( pY[valY[j]] == sum(i in index_set(valX))( pp[i, j] ) ) endif; predicate float_times(var float: x, var float: y, var float: z) = if is_fixed(x) then z==fix(x)*y %%%%% Need to use fix() otherwise added to CSE & nothing happens elseif is_fixed(y) then z==x*fix(y) elseif MZN__QuadrFloat then fzn_float_times(x, y, z) else abort("Unable to create linear formulation for the `float_times(\(x), \(y), \(z))` constraint." ++ " Define QuadrFloat=true if your linear solver supports quadratic constraints," ++ " or use integer variables.") endif; %%%Define int_pow predicate int_pow( var int: x, var int: y, var int: r ) = let { array[ int, int ] of int: x2y = array2d( lb(x)..ub(x), lb(y)..ub(y), [ pow( X, Y ) | X in lb(x)..ub(x), Y in lb(y)..ub(y) ] ) } in r == x2y[ x, y ]; %%% Adding a version returning float for efficiency /** @group builtins.arithmetic Return \(\a x ^ {\a y}\) */ function var float: pow_float(var int: x, var int: y) = let { int: yy = if is_fixed(y) then fix(y) else -1 endif; } in if yy = 0 then 1 elseif yy = 1 then x else let { var float: r ::is_defined_var; constraint int_pow_float(x,y,r) ::defines_var(r); } in r endif; %%%Define int_pow_float predicate int_pow_float( var int: x, var int: y, var float: r ) = let { array[ int, int ] of float: x2y = array2d( lb(x)..ub(x), lb(y)..ub(y), [ pow( X, Y ) | X in lb(x)..ub(x), Y in lb(y)..ub(y) ] ) } in r == x2y[ x, y ]; %-----------------------------------------------------------------------------% % Array 'element' constraints predicate array_bool_element(var int: x, array[int] of bool: a, var bool: z) = array_int_element(x, arrayXd(a, [bool2int(a[i]) | i in index_set(a)]), bool2int(z)); predicate array_var_bool_element(var int: x, array[int] of var bool: a, var bool: z) = array_var_int_element(x, arrayXd(a, [bool2int(a[i]) | i in index_set(a)]), bool2int(z)); predicate array_int_element(var int: i00, array[int] of int: a, var int: z) = let { set of int: ix = index_set(a), constraint i00 in { i | i in ix where a[i] in dom(z) }, } in %%% Tighten domain of i00 before dMin/dMax let { int: dMin = min(i in dom(i00))(a[i]), int: dMax = max(i in dom(i00))(a[i]), } in if dMin==dMax then z==dMin else z >= dMin /\ z <= dMax /\ let { int: nUBi00 = max(dom(i00)), int: nLBi00 = min(dom(i00)), int: nMinDist = min(i in nLBi00 .. nUBi00-1)(a[i+1]-a[i]), int: nMaxDist = max(i in nLBi00 .. nUBi00-1)(a[i+1]-a[i]), } in if nMinDist == nMaxDist then %% The linear case z == a[nLBi00] + nMinDist*(i00-nLBi00) else let { array[int] of var int: p = eq_encode(i00) %% this needs i00 in ix } %% Faster flattening than (i==i00) @2a9df1f7 in sum(i in dom(i00))( a[i] * p[i] ) == z endif endif; predicate array_var_int_element(var int: i00, array[int] of var int: a, var int: z) = let { constraint i00 in { i | i in index_set(a) where 0 < card(dom(a[i]) intersect dom(z)) }, } in %% finish domain first let { int: minLB=min(i in dom(i00))(lb(a[i])), int: maxUB=max(i in dom(i00))(ub(a[i])) } in if minLB==maxUB then z==minLB else z >= minLB /\ z <= maxUB /\ if {0,1}==dom(i00) /*ub(i00)-lb(i00)==1*/ /*2==card( dom( i00 ) )*/ then aux_int_eq_if_1(z, a[lb(i00)], (ub(i00)-i00)) /\ aux_int_eq_if_1(z, a[ub(i00)], (i00-lb(i00))) else let { array[int] of var int: p = eq_encode(i00) %% this needs i00 in ix } %% Faster flattening than (i==i00) @2a9df1f7 in forall (i in dom(i00))( aux_int_eq_if_1(z, a[i], p[i]) ) endif endif; predicate array_float_element(var int: i00, array[int] of float: a, var float: z) = let { set of int: ix = index_set(a), constraint i00 in { i | i in ix where a[i]>=lb(z) /\ a[i]<=ub(z) }, } in %%% Tighten domain of i00 before dMin/dMax let { float: dMin = min(i in dom(i00))(a[i]), float: dMax = max(i in dom(i00))(a[i]), } in if dMin==dMax then z==dMin else z >= dMin /\ z <= dMax /\ let { int: nUBi00 = max(dom(i00)), int: nLBi00 = min(dom(i00)), float: nMinDist = min(i in nLBi00 .. nUBi00-1)(a[i+1]-a[i]), float: nMaxDist = max(i in nLBi00 .. nUBi00-1)(a[i+1]-a[i]), } in if nMinDist == nMaxDist then %% The linear case z == a[nLBi00] + nMinDist*(i00-nLBi00) else let { array[int] of var int: p = eq_encode(i00) %% this needs i00 in ix } %% Faster flattening than (i==i00) @2a9df1f7 in sum(i in dom(i00))( a[i] * p[i] ) == z endif endif; predicate array_var_float_element(var int: i00, array[int] of var float: a, var float: z) = let { set of int: ix = index_set(a), constraint i00 in { i | i in ix where lb(a[i])<=ub(z) /\ ub(a[i])>=lb(z) }, } in %% finish domain first let { float: minLB=min(i in dom(i00))(lb(a[i])), float: maxUB=max(i in dom(i00))(ub(a[i])) } in if minLB==maxUB then z==minLB else z >= minLB /\ z <= maxUB /\ if {0,1}==dom(i00) /*ub(i00)-lb(i00)==1*/ /*2==card( dom( i00 ) )*/ then aux_float_eq_if_1(z, a[lb(i00)], (ub(i00)-i00)) /\ aux_float_eq_if_1(z, a[ub(i00)], (i00-lb(i00))) else %%% The convexified bounds seem slow for ^2 and ^3 equations: % sum(i in dom(i01))( lb(a[i]) * (i==i00) ) <= z /\ %% convexify lower bounds % sum(i in dom(i01))( ub(a[i]) * (i==i00) ) >= z /\ %% convexify upper bounds let { array[int] of var int: p = eq_encode(i00) %% this needs i00 in ix } %% Faster flattening than (i==i00) @2a9df1f7 in forall (i in dom(i00))( aux_float_eq_if_1(z, a[i], p[i]) ) %% Cuts: /\ if fElementCutsXZ then array_var_float_element__ROOF([ a[i] | i in dom(i00) ], z) :: MIP_cut %% these 2 as user cuts - too slow /\ array_var_float_element__ROOF([ -a[i] | i in dom(i00) ], -z) :: MIP_cut %% or even skip them else true endif /\ if fElementCutsXZB then array_var_float_element__XBZ_lb([ a[i] | i in dom(i00) ], [ p[i] | i in dom(i00) ], z) :: MIP_cut /\ array_var_float_element__XBZ_lb([ -a[i] | i in dom(i00) ], [ p[i] | i in dom(i00) ], -z) :: MIP_cut else true endif endif endif; %%% Facets on the upper surface of the z-a polytope %%% Possible parameter: maximal number of first cuts taken only predicate array_var_float_element__ROOF(array[int] of var float: a, var float: z) = let { set of int: ix = index_set(a), int: n = length(a), array[int] of float: AU = [ ub(a[i]) | i in 1..n], array[int] of int: srt_ub = sort_by([i | i in 1..n], AU), %indices of ub sorted up array[int] of float: AU_srt_ub = [ub(a[srt_ub[i]]) | i in 1..n], array[int] of float: AL_srt_ub = [lb(a[srt_ub[i]]) | i in 1..n], array[int] of float: MaxLBFrom = [ max(j in index_set(AL_srt_ub) where j>=i)(AL_srt_ub[j]) | i in 1..n ], %% direct, O(n^2) array[int] of float: ULB = [ if 1==i then MaxLBFrom[1] else max([AU_srt_ub[i-1], MaxLBFrom[i]]) endif | i in 1..n ] } in %%% "ROOF" forall (i in 1..n where if i==n then true else ULB[i]!=ULB[i+1] endif %% not the same base bound )( z <= ULB[i] + sum( j in i..n where AU_srt_ub[i] != AL_srt_ub[i] ) %% not a const ( (AU_srt_ub[j]-ULB[i]) * (a[srt_ub[j]]-AL_srt_ub[j]) / (AU_srt_ub[j]-AL_srt_ub[j]) ) ) ; predicate array_var_float_element__XBZ_lb(array[int] of var float: x, array[int] of var int: b, var float: z) = if fUseXBZCutGen then array_var_float_element__XBZ_lb__cutgen(x, b, z) :: MIP_cut else %% Adding some cuts a priori, also to make solver extract the variables let { int: i1 = min(index_set(x)) } in (z <= sum(i in index_set(x))(ub(x[i]) * b[i])) %:: MIP_cut -- does not work to put them here TODO /\ forall(i in index_set(x) intersect i1..(i1+19)) %% otherwise too many on amaze2 ( assert(lb(x[i]) == -ub(-x[i]) /\ ub(x[i]) == -lb(-x[i]), " negated var's bounds should swap " ) /\ z <= x[i] + sum(j in index_set(x) where i!=j)((ub(x[j])-lb(x[i]))*b[j])) %:: MIP_cut %% (ub_j-lb_i) * b_j /\ forall(i in index_set(x) intersect i1..(i1+19)) ( z <= ub(x[i])*b[i] + sum(j in index_set(x) where i!=j)(x[j]+lb(x[j])*(b[j]-1)) ) %:: MIP_cut /\ (z <= sum(i in index_set(x))(x[i] + lb(x[i]) * (b[i]-1))) %:: MIP_cut endif; %-----------------------------------------------------------------------------% % Set constraints %% ----------------------------------------------- (NO) SETS ---------------------------------------------- % XXX only for a fixed set here, general see below. % Normally not called because all plugged into the domain. % Might be called instead of set_in(x, var set of int s) if s gets fixed? predicate set_in(var int: x, set of int: s__) = let { set of int: s = if has_bounds(x) then s__ intersect dom(x) else s__ endif, constraint min(s) <= x, constraint x <= max(s), } in if s = min(s)..max(s) then true elseif fPostprocessDomains then set_in__POST(x, s) else %% Update eq_encode let { array[int] of var int: p = eq_encode(x); } in forall(i in index_set(p) diff s)(p[i]==0) % let { % array[int] of int: sL = [ e | e in s where not (e - 1 in s) ]; % array[int] of int: sR = [ e | e in s where not (e + 1 in s) ]; % array [index_set(sR)] of var 0..1: B; % constraint assert(length(sR)==length(sL), "N of lb and ub of sub-intervals of a set should be equal"); % } in % sum(B) = 1 %% use indicators % /\ % x >= sum(i in index_set(sL))(B[i]*sL[i]) % /\ % x <= sum(i in index_set(sR))(B[i]*sR[i]) endif; %%% for a fixed set predicate set_in_reif(var int: x, set of int: s__, var bool: b) = if is_fixed(b) then if fix(b) then x in s__ else x in dom(x) diff s__ endif elseif has_bounds(x) /\ not (s__ subset dom(x)) then b <-> x in s__ intersect dom(x) %% Use CSE else let { set of int: s = if has_bounds(x) then s__ intersect dom(x) else s__ endif, } in ( if dom(x) subset s then b==true elseif card(dom(x) intersect s)==0 then b==false elseif fPostprocessDomains then set_in_reif__POST(x, s, b) %% Bad. Very much so for CBC. 27.06.2019: elseif s == min(s)..max(s) then %% b <-> (min(s) <= x /\ x <= max(s)) else if card(dom(x))<=nMZN__UnaryLenMax_setInReif then %% PARAM TODO let { array[int] of var int: p = eq_encode(x); } in sum(i in s intersect dom(x))(p[i]) == bool2int(b) else bool2int(b) == fVarInBigSetOfInt(x, s) endif endif ) endif; % Alternative predicate alt_set_in_reif(var int: x, set of int: s, var bool: b) = b <-> exists(i in 1..length([ 0 | e in s where not (e - 1 in s) ]))( let { int: l = [ e | e in s where not (e - 1 in s) ][i], int: r = [ e | e in s where not (e + 1 in s) ][i] } in l <= x /\ x <= r ); %%% for a fixed set predicate set_in_imp(var int: x, set of int: s__, var bool: b) = if is_fixed(b) then if fix(b) then x in s__ else true endif elseif has_bounds(x) /\ not (s__ subset dom(x)) then b -> x in s__ intersect dom(x) %% Use CSE else let { set of int: s = if has_bounds(x) then s__ intersect dom(x) else s__ endif, } in ( if dom(x) subset s then true elseif card(dom(x) intersect s)==0 then b==false elseif s == min(s)..max(s) then (b -> min(s) <= x) /\ (b -> x <= max(s)) else if card(dom(x))<=nMZN__UnaryLenMax_setInReif then %% PARAM TODO let { array[int] of var int: p = eq_encode(x); } in sum(i in s intersect dom(x))(p[i]) >= bool2int(b) else bool2int(b) <= fVarInBigSetOfInt(x, s) endif endif ) endif; function var 0..1: fVarInBigSetOfInt(var int: x, set of int: s) = let { array[int] of int: sL = [ e | e in s where not (e - 1 in s) ]; array[int] of int: sR = [ e | e in s where not (e + 1 in s) ]; constraint assert(length(sR)==length(sL), "N of lb and ub of sub-intervals of a set should be equal"); } in sum(i in index_set(sL)) (bool2int(x>=sL[i] /\ x<=sR[i])); %% use indicators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OTHER SET STUFF COMING FROM nosets.mzn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% annotation bool_search(array[$X] of var bool: x, ann:a1, ann:a2, ann:a3) = let { array[int] of var bool: xx = array1d(x) } in int_search([bool2int(xx[i]) | i in index_set(xx)],a1,a2,a3); annotation warm_start( array[int] of var bool: x, array[int] of bool: v ) = warm_start( [ bool2int(x[i]) | i in index_set(x) ], [ bool2int(v[i]) | i in index_set(v) ] ); annotation sat_goal(var bool: b) = int_max_goal(b); annotation int_max_goal(var int: x); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DOMAIN POSTPROCESSING BUILT-INS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Single variable: x = d <-> x_eq_d[d] predicate equality_encoding__POST(var int: x, array[int] of var int: x_eq_d); %%%%%%% var int: b: bool2int is a reverse_map, not passed to .fzn predicate set_in__POST(var int: x, set of int: s__); predicate set_in_reif__POST(var int: x, set of int: s__, var int: b); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOGICAL CONSTRAINTS TO THE SOLVER %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% var int: b: bool2int is a reverse_map, not passed to .fzn => REPEAT TESTS. TODO predicate int_lin_eq_reif__IND(array[int] of int: c, array[int] of var int: x, int: d, var int: b); predicate int_lin_le_reif__IND(array[int] of int: c, array[int] of var int: x, int: d, var int: b); predicate int_lin_ne__IND(array[int] of int: c, array[int] of var int: x, int: d); predicate aux_int_le_zero_if_0__IND(var int: x, var int: b); predicate float_lin_le_reif__IND(array[int] of float: c, array[int] of var float: x, float: d, var int: b); predicate aux_float_eq_if_1__IND(var float: x, var float: y, var int: b); predicate aux_float_le_zero_if_0__IND(var float: x, var int: b); predicate array_int_minimum__IND(var int: m, array[int] of var int: x); predicate array_int_maximum__IND(var int: m, array[int] of var int: x); predicate array_float_minimum__IND(var float: m, array[int] of var float: x); predicate array_float_maximum__IND(var float: m, array[int] of var float: x); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% XBZ cut generator, currently CPLEX only %%%%%%%%%%%%%%%%%%%%%%%%%% predicate array_var_float_element__XBZ_lb__cutgen(array[int] of var float: x, array[int] of var int: b, var float: z); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Quadratic expressions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 predicate fzn_float_times(var float: a, var float: b, var float: c); predicate fzn_int_times(var int: a, var int: b, var int: c); predicate fzn_array_float_minimum(var float: m, array[int] of var float: x); libminizinc-2.5.3/share/minizinc/linear/fzn_if_then_else_float.mzn0000644000175000017500000000043513757304533024112 0ustar kaolkaolpredicate fzn_if_then_else_float(array[int] of var bool: c, array[int] of float: x, var float: y) = let { array[index_set(c)] of var 0..1: d; } in forall (i in index_set(c)) (sum(j in 1..i-1)(c[j])+d[i] >= c[i]) /\ sum(d)=1 /\ y = sum (i in index_set(c)) ( d[i]*x[i] ); libminizinc-2.5.3/share/minizinc/linear/fzn_all_different_int.mzn0000644000175000017500000000152513757304533023752 0ustar kaolkaol%-----------------------------------------------------------------------------% % 'all_different' constrains an array of objects to be all different. % % Linear version: equality encoding; see e.g. [Refalo, CP 2000] % % For a given d in dom(x), at most one i with x_i = d can exist. %-----------------------------------------------------------------------------% include "domain_encodings.mzn"; predicate fzn_all_different_int(array[int] of var int: x) = if length(x)<=1 then true else let { array[int,int] of var 0..1: x_eq_d = eq_encode(x) } in ( % my_trace(" all_different_int: x[" ++ show(index_set(x)) ++ "]\n") /\ forall(d in index_set_2of2(x_eq_d))( sum(i in index_set_1of2(x_eq_d))( x_eq_d[i,d] ) <= 1 ) ) endif; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear/domain_encodings.mzn0000644000175000017500000001033613757304533022725 0ustar kaolkaol/*%-----------------------------------------------------------------------------% % Domain encodings %-----------------------------------------------------------------------------% */ % Linear equality encoding % Single variable: x = d <-> x_eq_d[d] predicate equality_encoding(var int: x, array[int] of var int: x_eq_d) = x in index_set(x_eq_d) /\ sum(d in dom(x))( x_eq_d[d] ) = 1 /\ sum(d in dom(x))( d * x_eq_d[d] ) = x /\ % my_trace( "eq_enc: \(x), index_set(pp)=" ++ show(index_set( x_eq_d )) ++ "\n" ) /\ if fPostprocessDomains then equality_encoding__POST(x, x_eq_d) else true endif ; % Two variables: x = d /\ y = e <-> x_eq_d[d] /\ y_eq_e[e] /\ xy_eq_de[d, e] predicate equality_encoding(var int: x, var int: y, array[int] of var int: x_eq_d, array[int] of var int: y_eq_e, array[int, int] of var int: xy_eq_de ) = x in index_set(x_eq_d) /\ y in index_set(y_eq_e) /\ index_set(x_eq_d) == index_set_1of2(xy_eq_de) /\ index_set(y_eq_e) == index_set_2of2(xy_eq_de) /\ sum(d in dom(x), e in dom(y))( xy_eq_de[d, e] ) = 1 /\ forall(d in dom(x)) (sum(e in dom(y))( xy_eq_de[d, e] ) = x_eq_d[d]) /\ forall(e in dom(y)) (sum(d in dom(x))( xy_eq_de[d, e] ) = y_eq_e[e]) ; % Array of variables: x[i] = d <-> x_eq_d[i,d] predicate equality_encoding(array[int] of var int: x, array[int, int] of var int: x_eq_d) = forall(i in index_set(x))( x[i] in index_set_2of2(x_eq_d) /\ sum(d in index_set_2of2(x_eq_d))( x_eq_d[i,d] ) = 1 /\ sum(d in index_set_2of2(x_eq_d))( d * x_eq_d[i,d] ) = x[i] ); function var int: eq_new_var(var int: x, int: i) ::promise_total = if i in dom(x) then let { var 0..1: xi; } in xi else 0 endif; function array[int] of var int: eq_encode(var int: x) ::promise_total = let { array[int] of var int: y = array1d(lb(x)..ub(x),[eq_new_var(x,i) | i in lb(x)..ub(x)]); constraint equality_encoding(x,y); % constraint % if card(dom(x))>0 then % my_trace(" eq_encode: dom(\(x)) = " ++ show(dom(x)) ++ ", card( dom(\(x)) ) = " ++ show(card(dom(x))) ++ "\n") % else true endif; %% constraint assert(card(dom(x))>1, " eq_encode: card(dom(\(x))) == " ++ show(card(dom(x)))); } in y; function array[int] of int: eq_encode(int: x) ::promise_total = array1d(lb(x)..ub(x),[ if i=x then 1 else 0 endif | i in lb(x)..ub(x)]); %%% The same for 2 variables: function var int: eq_new_var(var int: x, int: i, var int: y, int: j) ::promise_total = if i in dom(x) /\ j in dom(y) then let { var 0..1: xi; } in xi else 0 endif; function array[int, int] of var int: eq_encode(var int: x, var int: y) ::promise_total = let { array[int] of var int: pX = eq_encode(x), array[int] of var int: pY = eq_encode(y), array[int, int] of var int: pp = array2d(index_set(pX), index_set(pY), [eq_new_var(x,i,y,j) | i in index_set(pX), j in index_set(pY)]); constraint equality_encoding(x, y, pX, pY, pp); } in pp; function array[int, int] of int: eq_encode(int: x, int: y) ::promise_total = % let { % constraint if card(dom(x))*card(dom(y))>200 then % my_trace(" eq_encode: dom(\(x)) = " ++ show(dom(x)) ++ ", dom(\(y)) = " ++ show(dom(y)) ++ "\n") % else true endif; % } in array2d(lb(x)..ub(x), lb(y)..ub(y), [if i==x /\ j==y then 1 else 0 endif | i in lb(x)..ub(x), j in lb(y)..ub(y)]); function array[int,int] of var int: eq_encode(array[int] of var int: x) ::promise_total = let { array[index_set(x),lb_array(x)..ub_array(x)] of var int: y = array2d(index_set(x),lb_array(x)..ub_array(x), [ let { array[int] of var int: xi = eq_encode(x[i]) } in if j in index_set(xi) then xi[j] else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)] ) } in y; function array[int,int] of int: eq_encode(array[int] of int: x) ::promise_total = array2d(index_set(x),lb_array(x)..ub_array(x),[ if j=x[i] then 1 else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)]); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear/redefs_bool_reifs.mzn0000644000175000017500000001312613757304533023100 0ustar kaolkaol/* % FlatZinc built-in redefinitions for linear solvers. % % AUTHORS % Sebastian Brand % Gleb Belov */ %-----------------------------------------------------------------------------% % % Logic operations % Use indicators for reifs (CPLEX)? Seems weak. % %-----------------------------------------------------------------------------% predicate bool_not(var bool: p) = bool2int(p)=0; predicate bool_not(var bool: p, var bool: q) = bool2int(p) + bool2int(q) = 1; predicate bool_and(var bool: p, var bool: q, var bool: r) = % my_trace(" bool_and: \(p) /\\ \(q) <-> \(r) \n") /\ if false then int_lin_le_reif__IND( [-1, -1], [p, q], -2, r) else array_bool_and( [p, q], r ) % bool_and__INT(bool2int(p), bool2int(q), bool2int(r)) endif; predicate bool_and__INT(var int: x, var int: y, var int: z) = x + y <= z + 1 /\ %% x + y >= z * 2; % weak x >= z /\ y >= z; % strong predicate bool_or(var bool: p, var bool: q, var bool: r) = if false then int_lin_le_reif__IND( [-1, -1], [p, q], -1, r) elseif true then array_bool_or( [p, q], r ) else let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r) } in x + y >= z /\ % x + y <= z * 2; % weak x <= z /\ y <= z % strong endif; predicate bool_xor(var bool: p, var bool: q) = 1==p+q; predicate bool_xor(var bool: p, var bool: q, var bool: r) = if false then % int_lin_eq_reif__IND( [1, 1], [p, q], 1, r) /\ true else let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r) } in x <= y + z /\ y <= x + z /\ z <= x + y /\ x + y + z <= 2 endif; predicate bool_eq_reif(var bool: p, var bool: q, var bool: r) = %% trace(" bool_eq_reif: \(p), \(q), \(r) \n") /\ if is_fixed(r) then % frequent case if fix(r) = true then p = q else bool_not(p,q) endif elseif is_fixed(q) then if fix(q) = true then p = r else bool_not(p,r) endif elseif is_fixed(p) then if fix(p) = true then q = r else bool_not(q,r) endif elseif false then % int_lin_eq_reif__IND( [1, -1], [p, q], 0, r) /\ true else let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r) } in x + y <= z + 1 /\ x + z <= y + 1 /\ y + z <= x + 1 /\ x + y + z >= 1 endif; predicate bool_ne_reif(var bool: p, var bool: q, var bool: r) = bool_xor(p, q, r); predicate bool_le(var bool: p, var bool: q) = let { var int: x = bool2int(p), var int: y = bool2int(q) } in x <= y; predicate bool_le_reif(var bool: p, var bool: q, var bool: r) = if false then % int_lin_le_reif__IND( [1, -1], [p, q], 0, r) /\ true else let { var int: x = bool2int(p), var int: y = bool2int(q), var int: z = bool2int(r) } in 1 - x + y >= z /\ %% /\ 1 - x + y <= z * 2 not needed 1 - x <= z /\ y <= z % strong endif; predicate bool_lt(var bool: p, var bool: q) = not p /\ q; predicate bool_lt_reif(var bool: p, var bool: q, var bool: r) = (not p /\ q) <-> r; %-----------------------------------------------------------------------------% %% Reified disjunction predicate array_bool_or(array[int] of var bool: a, var bool: b) = if exists( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then b elseif is_fixed(b) then % frequent case if fix(b) = true then sum(i in index_set(a))( bool2int(a[i]) ) >= 1 %% >=1 seems better for MIPDomains... 5.4.19 else forall(i in index_set(a))( not a[i] ) endif else let { var int: x = bool2int(b), array[1..length(a)] of var int: c = [ bool2int(a[i]) | i in index_set(a) ] } in sum(c) >= x /\ % sum(c) <= x * length(a) % weak forall (i in index_set(a)) (x >= c[i]) % strong endif; %% Reified conjunction predicate array_bool_and(array[int] of var bool: a, var bool: b) = if exists( i in index_set( a ) )( is_fixed(a[i]) /\ not fix(a[i]) ) then not b elseif is_fixed(b) then % frequent case if fix(b) = false then sum(i in index_set(a))( bool2int(a[i]) ) <= length(a)-1 else forall(i in index_set(a))( a[i] ) endif else let { var int: x = bool2int(b), array[1..length(a)] of var int: c = [ bool2int(a[i]) | i in index_set(a) ] } in length(a) - sum(c) >= 1 - x /\ % length(a) - sum(c) <= (1 - x) * length(a); % weak forall (i in index_set(a)) (x <= c[i]) % strong endif; % predicate array_bool_xor(array[int] of var bool: a) = .. sum(a) is odd .. predicate array_bool_xor(array[int] of var bool: a) = let { var 0..(length(a)-1) div 2: m, var 1..((length(a)-1) div 2)*2+1: ss = sum(i in index_set(a))( bool2int(a[i]) ) } in ss == 1 + 2 * m; predicate bool_clause(array[int] of var bool: p, array[int] of var bool: n) = sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1; predicate bool_lin_eq(array[int] of int: c, array[int] of var bool: x, var int: d) :: promise_total = sum(i in index_set(x))( c[i]*bool2int(x[i]) ) == d; predicate bool_lin_eq_reif(array[int] of int: c, array[int] of var bool: x, int: d, var bool: b) = %% No var int d, sorry aux_int_eq_iff_1(sum(i in index_set(x))( c[i]*bool2int(x[i]) ), d, bool2int(b)); libminizinc-2.5.3/share/minizinc/linear/fzn_inverse_reif.mzn0000644000175000017500000000050513757304533022757 0ustar kaolkaolpredicate fzn_inverse_reif(array[int] of var int: f, array[int] of var int: invf, var bool: b) = b <-> forall(i in index_set(f), j in index_set(invf)) ( f[i] in index_set(invf) /\ invf[j] in index_set(f) /\ (j == f[i] <-> i == invf[j]) ); libminizinc-2.5.3/share/minizinc/linear/fzn_subcircuit.mzn0000644000175000017500000000422513757304533022456 0ustar kaolkaolinclude "alldifferent.mzn"; /** @group globals Constrains the elements of \a x to define a subcircuit where \a x[\p i] = \p j means that \p j is the successor of \p i and \a x[\p i] = \p i means that \p i is not in the circuit. */ %% Linear version predicate fzn_subcircuit(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: u = max(S), int: n = card(S), array[S] of var 1..n: order, array[S] of var bool: ins = array1d(S,[ x[i] != i | i in S]), var l..u+1: firstin = min([ u+1 + bool2int(ins[i])*(i-u-1) | i in S]), %% ... var S: lastin, var bool: empty = (firstin == u+1), } in alldifferent(x) /\ % NO alldifferent(order) /\ % If the subcircuit is empty then each node points at itself. % (empty <-> forall(i in S)(not ins[i])) /\ % If the subcircuit is non-empty then order numbers the subcircuit. % ((not empty) <-> %% Another way to express minimum. % forall(i in l..u+1)( % i==firstin <-> ins[i] % /\ forall(j in S where j firstin /\ % The lastin node points at firstin. x[lastin] = firstin /\ % And both are in ins[lastin] /\ ins[firstin] /\ % The successor of each node except where it is firstin is % numbered one more than the predecessor. % forall(i in S) ( % (ins[i] /\ x[i] != firstin) -> order[x[i]] = order[i] + 1 % ) /\ %%% MTZ model. Note that INTEGER order vars seem better!: forall (i,j in S where i!=j) ( order[i] - order[j] + n*bool2int( x[i]==j /\ i!=lastin ) % + (n-2)*bool2int(x[j]==i) %% the Desrochers & Laporte '91 term <= n-1 ) /\ % Each node that is not in is numbered after the lastin node. forall(i in S) ( true % (not ins[i]) <-> (n == order[i]) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear/redefinitions-2.0.mzn0000644000175000017500000000141113757304533022556 0ustar kaolkaolpredicate bool_clause_reif(array[int] of var bool: p, array[int] of var bool: n, var bool: c) = c = ( sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1 ); predicate array_int_minimum(var int: m, array[int] of var int: x) = array_int_minimum_I( m, [ x[i] | i in index_set(x)]); predicate array_int_maximum(var int: m, array[int] of var int: x) = array_int_minimum_I(-m, [-x[i] | i in index_set(x)]); predicate array_float_minimum(var float: m, array[int] of var float: x) = array_float_minimum_I( m, [ x[i] | i in index_set(x)]); predicate array_float_maximum(var float: m, array[int] of var float: x) = array_float_minimum_I(-m, [-x[i] | i in index_set(x)]); libminizinc-2.5.3/share/minizinc/linear/fzn_inverse.mzn0000644000175000017500000000117013757304533021751 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains two arrays of int variables to represent inverse functions. % All the values in each array must be within the index set of the other array. % % Linear version. %-----------------------------------------------------------------------------% include "fzn_inverse_in_range.mzn"; predicate fzn_inverse(array[int] of var int: f, array[int] of var int: invf) = forall(i in index_set(f)) ( f[i] in index_set(invf) ) /\ forall(j in index_set(invf)) ( invf[j] in index_set(f) ) /\ fzn_inverse_in_range(f, invf); libminizinc-2.5.3/share/minizinc/linear/fzn_lex_lesseq_bool_reif.mzn0000644000175000017500000000432413757304533024466 0ustar kaolkaolpredicate fzn_lex_lesseq_bool_reif(array[int] of var bool: x, array[int] of var bool: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = max(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (c <-> b[0]) /\ forall(i in 0..size) ( ( b[i] -> ( x[lx + i] <= y[ly + i] ) ) /\ bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) <= 2 /\ ( b[i] -> ( x[lx + i] < y[ly + i] \/ b[i+1] ) ) /\ bool2int(b[i]) + (1-bool2int(x[lx + i])) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 /\ bool2int(b[i]) + bool2int(x[lx + i]) + bool2int(y[ly + i]) + (1-bool2int(b[i+1])) <= 3 /\ bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 ) /\ b[size+1] = (ux-lx <= uy-ly) % endif ; predicate fzn_lex_lesseq_bool_imp(array[int] of var bool: x, array[int] of var bool: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = max(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (c -> b[0]) /\ forall(i in 0..size) ( ( b[i] -> ( x[lx + i] <= y[ly + i] ) ) /\ bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) <= 2 /\ ( b[i] -> ( x[lx + i] < y[ly + i] \/ b[i+1] ) ) /\ bool2int(b[i]) + (1-bool2int(x[lx + i])) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 /\ bool2int(b[i]) + bool2int(x[lx + i]) + bool2int(y[ly + i]) + (1-bool2int(b[i+1])) <= 3 /\ bool2int(b[i]) + bool2int(x[lx + i]) + (1-bool2int(y[ly + i])) + (1-bool2int(b[i+1])) <= 3 ) /\ b[size+1] = (ux-lx <= uy-ly) ; libminizinc-2.5.3/share/minizinc/linear/CHANGELOG.txt0000644000175000017500000000043113757304533020722 0ustar kaolkaol 2015-07-20 Special handling of array_int_element which is a linear fn. No much diff on ProjPlanning_12_8. [REVERTED] Replaced array_int_element by the old (forall(.. -> ..)) 82s vs 45s on ProjPlanning_12_8libminizinc-2.5.3/share/minizinc/linear/redefinitions-2.0.2.mzn0000644000175000017500000000226613757304533022727 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.0.2 % that can be overridden by solvers. predicate symmetry_breaking_constraint(var bool: b) = (b) %:: MIP_lazy %:: MIP_cut %% MIP_cut wrong in CPLEX 12.6.3 %% Symm breaking as lazy is 1% better in Gurobi 6.5.2 on the Challenges 2012-2015 %% But caused a bug in 7.5.1 - switched off %% true %% TO omit all symmetry_breaking_constraint's ; %% Make sure no feasible solutions are cut off: predicate redundant_constraint(var bool: b) = (b) %:: MIP_cut % true %% To omit all redundant_constraint's ; %% Linearized element: just call without shifting predicate array_var_bool_element_nonshifted(var int: idx, array[int] of var bool: x, var bool: c) = array_var_bool_element(idx,x,c); predicate array_var_int_element_nonshifted(var int: idx, array[int] of var int: x, var int: c) = array_var_int_element(idx,x,c); predicate array_var_float_element_nonshifted(var int: idx, array[int] of var float: x, var float: c) = array_var_float_element(idx,x,c); predicate array_var_set_element_nonshifted(var int: idx, array[int] of var set of int: x, var set of int: c) = array_var_set_element(idx,x,c); libminizinc-2.5.3/share/minizinc/linear/fzn_inverse_in_range.mzn0000644000175000017500000000031413757304533023612 0ustar kaolkaolpredicate fzn_inverse_in_range(array[int] of var int: f, array[int] of var int: invf) = forall(i in index_set(f), j in index_set(invf)) ( (j == f[i] <-> i == invf[j]) ); libminizinc-2.5.3/share/minizinc/linear/fzn_if_then_else_int.mzn0000644000175000017500000000042713757304533023600 0ustar kaolkaolpredicate fzn_if_then_else_int(array[int] of var bool: c, array[int] of int: x, var int: y) = let { array[index_set(c)] of var 0..1: d; } in forall (i in index_set(c)) (sum(j in 1..i-1)(c[j])+d[i] >= c[i]) /\ sum(d)=1 /\ y = sum (i in index_set(c)) ( d[i]*x[i] ); libminizinc-2.5.3/share/minizinc/linear/fzn_sliding_sum.mzn0000644000175000017500000000105613757304533022616 0ustar kaolkaol/** @group globals Requires that in each subsequence \a vs[\p i], ..., \a vs[\p i + \a seq - 1] the sum of the values belongs to the interval [\a low, \a up]. */ predicate fzn_sliding_sum(int: low, int: up, int: seq, array[int] of var int: vs) = let { int: lx = min(index_set(vs)), int: ux = max(index_set(vs)), } in forall (i in lx .. ux - seq + 1) ( let { var int: sum_of_l = sum(j in i..i + seq - 1) (vs[j]) } in low <= sum_of_l /\ sum_of_l <= up ); libminizinc-2.5.3/share/minizinc/linear/redefs_lin_reifs.mzn0000644000175000017500000003644713757304533022742 0ustar kaolkaol/* % FlatZinc built-in redefinitions for linear solvers. % % AUTHORS % Sebastian Brand % Gleb Belov */ %-----------------------------------------------------------------------------% % % Linear equations and inequations % TODO Use indicators for (half)reifs. % Otherwise and more using unary encoding for reasonable domains % %-----------------------------------------------------------------------------% % Domains: reduce all to aux_ stuff? %% never use Concert's reif feature %% var, var predicate int_le_reif(var int: x, var int: y, var bool: b) = %% trace(" int_le_reif VV: \(x), \(y), \(b) \n") /\ if is_fixed(b) then if true==fix(b) then x<=y else x>y endif elseif ub(x)<=lb(y) then b==true elseif lb(x)>ub(y) then b==false elseif fPostprocessDomains /\ fPostproDom_DIFF then int_le_reif__POST(x-y, 0, b) else int_le_reif__NOPOST(x, y, b) endif ; %% const, var predicate int_le_reif(int: x, var int: y, var bool: b) = %% trace(" int_le_reif CV: \(x), \(y), \(b) \n") /\ if is_fixed(b) then if true==fix(b) then x<=y else x>y endif elseif ub(x)<=lb(y) then b==true elseif lb(x)>ub(y) then b==false elseif not (x in dom(y)) then %% dom(y) has holes let { set of int: sDom2 = dom(y) intersect x+1..infinity, constraint assert( card( sDom2 ) > 0, "Variable: dom(\(y)) = \(dom(y)), but dom() intersect \(x)..inf: \(sDom2)\n" ), } in b <-> min( sDom2 ) <= y elseif fPostprocessDomains then int_ge_reif__POST(y, x, b) else int_le_reif(-y, -x, b) endif ; %% var, const predicate int_le_reif(var int: x, int: y, var bool: b) = %% trace(" int_le_reif VC: \(x), \(y), \(b) \n") /\ if is_fixed(b) then if true==fix(b) then x<=y else x>y endif elseif ub(x)<=lb(y) then b==true elseif lb(x)>ub(y) then b==false elseif not (y in dom(x)) then %% dom(x) has holes let { set of int: sDom2 = dom(x) intersect -infinity..y-1, constraint assert( card( sDom2 ) > 0, "Variable: dom(\(x)) = \(dom(x)), but dom() intersect -inf..\(y): \(sDom2)\n" ), } in b <-> x <= max( sDom2 ) else if fPostprocessDomains then int_le_reif__POST(x, y, b) else int_le_reif__NOPOST(x, y, b) endif endif ; %% var int, var int predicate int_le_reif__NOPOST(var int: x, var int: y, var bool: b) = aux_int_le_if_1(x, y, b) /\ %% This can call POSTs... TODO aux_int_gt_if_0(x, y, b) ; %% var, var predicate int_lt_reif(var int: x, var int: y, var bool: b) = %% int_le_reif(x-y, -1, b); %% This would produce a new variable x-y and possibly POST it %% but it looks like differences should not be if is_fixed( x ) then int_le_reif(x+1, y, b) else int_le_reif(x, y-1, b) endif; %% var, var predicate int_ne(var int: x, var int: y) = if fPostproDom_DIFF then int_ne(x-y, 0) else int_ne__SIMPLE(x-y, 0) endif; %% var, const predicate int_ne(var int: x, int: y) = if y in dom(x) then if y==ub(x) then x <= y-1 elseif y==lb(x) then x >= y+1 elseif fPostprocessDomains then int_ne__POST(x, y) elseif card(dom(x))y) endif; %% var, var predicate int_eq_reif(var int: x, var int: y, var bool: b) = %% trace(" int_eq_reif VV: \(x), \(y), \(b) \n") /\ if is_fixed(b) then if fix(b) then x==y else x!=y endif elseif card(dom(x) intersect dom(y))>0 then if is_fixed(x) then if is_fixed(y) then b <-> fix(x)==fix(y) else int_eq_reif(y, fix(x), b) endif elseif is_fixed(y) then int_eq_reif(x, fix(y), b) elseif fPostprocessDomains /\ fPostproDom_DIFF then int_eq_reif(x-y, 0, b) else aux_int_eq_iff_1(x, y, b) endif else not b endif; %% var, const predicate int_eq_reif(var int: x, int: y, var bool: b) = %% trace(" int_eq_reif VC: \(x), \(y), \(b) \n") /\ if is_fixed(b) then if fix(b) then x==y else x!=y endif elseif y in dom(x) then if is_fixed(x) then b <-> y==fix(x) elseif card(dom(x))==2 then x == max(dom(x) diff {y}) + b*(y - max(dom(x) diff {y})) %% This should directly connect b to var 0..1: x elseif fPostprocessDomains then int_eq_reif__POST(x, y, b) %%% THIS seems pretty complex, especially for binaries, and does not connect to eq_encoding (/ MIPD?) %% elseif y==lb(x) then %% int_lt_reif(y, x, not b) %% elseif y==ub(x) then %% int_lt_reif(x, y, not b) elseif card(dom(x))y endif elseif false then float_lin_le_reif__IND( [1.0, -1.0], [x, y], 0.0, b) elseif ub(x) <= y then b == true elseif lb(x) > y then b == false elseif fPostprocessDomains then float_le_reif__POST(x, y, b, float_lt_EPS) else float_le_reif__NOPOST(x, y, b) endif; %% const, var float predicate float_le_reif(float: x, var float: y, var bool: b) = if is_fixed(b) then if true==fix(b) then x<=y else x>y endif elseif false then float_lin_le_reif__IND( [1.0, -1.0], [x, y], 0.0, b) elseif ub(x) <= lb(y) then b == true elseif lb(x) > ub(y) then b == false elseif fPostprocessDomains then float_ge_reif__POST(y, x, b, float_lt_EPS) else float_le_reif(-y, -x, b) endif; %% var float, var float predicate float_le_reif(var float: x, var float: y, var bool: b) = if is_fixed(b) then if true==fix(b) then x<=y else x>y endif elseif ub(x)<=lb(y) then b==true elseif lb(x)>ub(y) then b==false elseif fPostprocessDomains /\ fPostproDom_DIFF then float_le_reif(x-y, 0.0, b) else float_le_reif__NOPOST(x-y, 0, b) endif ; %% var float, var float predicate float_le_reif__NOPOST(var float: x, var float: y, var bool: b) = aux_float_le_if_1(x, y, (b)) /\ %% Can call __POSTs TODO aux_float_gt_if_0(x, y, (b)) ; %% TODO predicate float_lt_reif(var float: x, var float: y, var bool: b) = %% Actually = float_le_reif(x, y-eps, b). if is_fixed(b) then if true==fix(b) then x=y endif elseif fPostprocessDomains /\ fPostproDom_DIFF then aux_float_lt_zero_iff_1__POST(x - y, b, float_lt_EPS) else aux_float_lt_if_1(x, y, (b)) /\ aux_float_ge_if_0(x, y, (b)) endif; %% var, const predicate float_ne(var float: x, float: y) = if fPostprocessDomains then float_ne__POST(x, y, float_lt_EPS) else float_ne__SIMPLE(x, y) endif; predicate float_ne__SIMPLE(var float: x, var float: y) = if true then let { var 0..1: p } in aux_float_lt_if_1(x, y, (p)) /\ aux_float_gt_if_0(x, y, (p)) else %TODO: Why is this not half-reified? 1 == (x>y) + (xub(y) then b == false elseif is_fixed(x) /\ is_fixed(y) then b == (fix(x) == fix(y)) elseif fPostprocessDomains /\ fPostproDom_DIFF then float_eq_reif__POST(x-y, 0, b, float_lt_EPS) else aux_float_eq_iff_1(x, y, (bool2int(b))) endif; predicate float_ne_reif(var float: x, var float: y, var bool: b) = float_eq_reif(x, y, not (b)); %-----------------------------------------------------------------------------% predicate float_lin_eq_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if fPostprocessDomains /\ fPostproDom_DIFF then float_eq_reif(sum(i in index_set(x))( c[i]*x[i] ), d, b) else aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, b) endif; predicate float_lin_ne_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if fPostprocessDomains /\ fPostproDom_DIFF then float_ne_reif(sum(i in index_set(x))( c[i]*x[i] ), d, not b) else aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, not b) endif; predicate float_lin_le_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = if fPostprocessDomains /\ fPostproDom_DIFF then float_le_reif(sum(i in index_set(x))( c[i]*x[i] ), d, b) else float_le_reif__NOPOST(sum(i in index_set(x))( c[i]*x[i] ), d, b) endif; predicate float_lin_lt_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = float_lt_reif(sum(i in index_set(x))( c[i]*x[i] ), d, b); %-----------------------------------------------------------------------------% % Auxiliary: equality reified onto a 0/1 variable predicate aux_int_eq_iff_1(var int: x, var int: y, var int: p) = if is_fixed(p) then if 1==fix(p) then x==y else x!=y endif elseif fPostprocessDomains /\ fPostproDom_DIFF then abort(" aux_int_eq_iff_1 should not be used with full domain postprocessing") elseif false then true elseif fAuxIntEqOLD00 then let { array[1..2] of var 0..1: q } in aux_int_le_if_1(x, y, p) /\ aux_int_ge_if_1(x, y, p) /\ aux_int_lt_if_0(x, y, q[1]) /\ aux_int_gt_if_0(x, y, q[2]) /\ sum(q) == p + 1 else %% redundant p == (x<=y /\ y<=x) /\ 1+p == (x<=y) + (y<=x) endif; predicate aux_int_eq_iff_1__float(var float: x, float: y, var int: p) = if fAuxIntEqOLD00 then assert( false, "Don't use aux_int_eq_iff_1__float" ) /* let { array[1..2] of var 0..1: q } in aux_int_le_if_1(x, y, p) /\ aux_int_ge_if_1(x, y, p) /\ aux_int_lt_if_0(x, y, q[1]) /\ aux_int_gt_if_0(x, y, q[2]) /\ sum(q) == p + 1 */ else assert( false, "Don't use aux_int_eq_iff_1__float with fAuxIntEqOLD00" ) endif; % Alternative 2 predicate aux_int_eq_iff_1__WEAK1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q_458 } in aux_int_lt_if_0(x - p, y, q_458[1]) /\ aux_int_gt_if_0(x + p, y, q_458[2]) /\ sum(q_458) <= 2 - 2*p /\ sum(q_458) <= 1 + p; % Alternative 1 predicate alt_1_aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q } in aux_int_lt_if_0(x - p, y, q[1]) /\ aux_int_gt_if_0(x + p, y, q[2]) /\ q[1] <= 1 - p /\ q[2] <= 1 - p /\ sum(q) <= 1 + p; predicate aux_float_eq_iff_1(var float: x, var float: y, var int: p) = if is_fixed(p) then if 1==fix(p) then x==y else x!=y endif elseif fPostprocessDomains /\ fPostproDom_DIFF then abort(" aux_float_eq_iff_1 should not be used with full domain postprocessing") elseif fAuxFloatEqOLD00 then let { array[1..2] of var 0..1: q } in aux_float_le_if_1(x, y, p) /\ aux_float_ge_if_1(x, y, p) /\ aux_float_lt_if_0(x, y, (q[1])) /\ aux_float_gt_if_0(x, y, (q[2])) /\ sum(i in 1..2)((q[i])) == 1 + p else %% redundant p == (x<=y /\ y<=x) /\ 1+p == (x<=y) + (y<=x) endif; % ----------------------------- Domains postpro --------------------------- %%%%%%%%%%%%%%%%%% predicate int_le_reif__POST(var int: x, var int: y, var int: b); %%%%%%%%%%%%%%%%%% predicate int_le_reif__POST(int: x, var int: y, var int: b); %%%%%%% var int: b: bool2int is a reverse_map, not passed to .fzn %% var, const predicate int_le_reif__POST(var int: x, int: y, var int: b); %% var, const predicate int_ge_reif__POST(var int: x, int: y, var int: b); %% var, const predicate int_eq_reif__POST(var int: x, int: y, var int: b); %% var, const predicate int_ne__POST(var int: x, int: y); %%%%%%%%%%%%%%%%%% predicate float_le_reif__POST(var float: x, var float: y, var int: b); %%%%%%%%%%%%%%%%%% predicate float_le_reif__POST(float: x, var float: y, var int: b); %% var, const predicate float_le_reif__POST(var float: x, float: y, var int: b, float: epsRel); %% var, const predicate float_ge_reif__POST(var float: x, float: y, var int: b, float: epsRel); %% var, var predicate aux_float_lt_zero_iff_1__POST(var float: x, var int: b, float: epsRel); %% var, const predicate float_eq_reif__POST(var float: x, float: y, var int: b, float: epsRel); %% var, const predicate float_ne__POST(var float: x, float: y, float: epsRel); libminizinc-2.5.3/share/minizinc/linear/redefs_lin_halfreifs.mzn0000644000175000017500000002074213757304533023564 0ustar kaolkaol/* % FlatZinc built-in redefinitions for linear solvers. % % AUTHORS % Sebastian Brand % Gleb Belov */ %-----------------------------------------------------------------------------% % Auxiliary: indicator constraints % p -> x # 0 where p is a 0/1 variable and # is a comparison % Base cases %% used e.g. in element predicate aux_float_eq_if_1(var float: x, var float: y, var int: p) = if is_fixed(p) then if 1==fix(p) then x==y else true endif elseif is_fixed(x) /\ is_fixed(y) then %%% Needed to avoid constant domain var if fix(x)!=fix(y) then p==0 else true endif elseif is_fixed(x-y) then %%% Hypothetically possible to land here if 0.0!=fix(x-y) then p==0 else true endif elseif fPostprocessDomains /\ fPostproDom_AUX /\ fPostproDom_DIFF then aux_float_eq_zero_if_1__POST(x - y, p, p) elseif fMZN__UseIndicators then aux_float_eq_if_1__IND(x, y, p) else aux_float_le_if_1(x, y, p) /\ aux_float_ge_if_1(x, y, p) endif; predicate aux_int_eq_if_1(var int: x, var int: y, var int: p) = if is_fixed(p) then if fix(p) = 1 then (x = y) else true endif elseif is_fixed(x) /\ is_fixed(y) then if fix(x) != fix(y) then (p = 0) else true endif % elseif is_fixed(x-y) then % TODO: Necessary for integers?? % if 0.0!=fix(x-y) then p==0 else true endif % elseif fPostprocessDomains /\ fPostproDom_AUX /\ fPostproDom_DIFF then % % TODO MIPDomains % elseif fMZN__UseIndicators then % TODO: Necessary for integers?? % aux_float_eq_if_1__IND(x, y, p) else aux_int_le_if_1(x, y, p) /\ aux_int_ge_if_1(x, y, p) endif; predicate aux_float_ne_if_1(var float: x, var float: y, var int: p) = if is_fixed(p) then if fix(p) = 1 then (x != y) else true endif elseif is_fixed(x) /\ is_fixed(y) then %%% Needed to avoid constant domain var if (fix(x) = fix(y)) then (p = 0) else true endif elseif is_fixed(x-y) then %%% Hypothetically possible to land here if (0.0 = fix(x-y)) then (p = 0) else true endif % TODO: What is necessary for not equals? % elseif fPostprocessDomains /\ fPostproDom_AUX /\ fPostproDom_DIFF then % aux_float_ne_zero_if_1__POST(x - y, p, p) % elseif fMZN__UseIndicators then % aux_float_ne_if_1__IND(x, y, p) else let { array[1..2] of var bool: q } in ( q[1] -> (x < y) ) /\ ( q[2] -> (x > y) ) /\ (sum(q) = p) endif; predicate aux_int_ne_if_1(var int: x, var int: y, var int: p) = if is_fixed(p) then if fix(p) = 1 then (x != y) else true endif elseif is_fixed(x) /\ is_fixed(y) then if fix(x) = fix(y) then (p = 0) else true endif % elseif is_fixed(x-y) then % TODO: Necessary for integers?? % if 0.0!=fix(x-y) then p==0 else true endif % elseif fPostprocessDomains /\ fPostproDom_AUX /\ fPostproDom_DIFF then % % TODO MIPDomains % elseif fMZN__UseIndicators then % TODO: Necessary for integers?? % aux_float_eq_if_1__IND(x, y, p) else let { array[1..2] of var bool: q } in ( q[1] -> (x < y) ) /\ ( q[2] -> (x > y) ) /\ (sum(q) = p) endif; predicate aux_int_le_zero_if_0(var int: x, var int: p) = if is_fixed(p) then if 0==fix(p) then x<=0 else true endif %% 0==fix !! elseif lb(x)>0 then p==1 elseif not (0 in dom(x)) then let { constraint assert( ub(x) < infinity, "aux_int_le_zero_if_0: variable \(x)'s domain: dom(\(x)) = \(dom(x)), should have finite upper bound\n" ), set of int: sDomNeg = dom(x) intersect -infinity..-1, constraint assert( card( sDomNeg ) > 0, "Variable \(x): dom(\(x)) = \(dom(x)), but dom() intersect -inf..-1: \(sDomNeg)\n" ), } in aux_int_le_if_0( x, max( sDomNeg ), p ) elseif fPostprocessDomains /\ fPostproDom_AUX then aux_int_le_zero_if_1__POST(x, 1-p) elseif fMZN__UseIndicators then aux_int_le_zero_if_0__IND(x, p) else assert( ub(x)0.0 then p==1 elseif fPostprocessDomains /\ fPostproDom_AUX then aux_float_le_zero_if_1__POST(x, 1-p, 1-p) elseif fMZN__UseIndicators then aux_float_le_zero_if_0__IND(x, p) else x <= ub(x) * p endif; predicate aux_float_lt_zero_if_0(var float: x, var int: p) = assert( has_bounds(x), "Variable \(x) needs finite bounds for a big-M constraint" ) /\ if is_fixed(p) then if 0==fix(p) then x<0.0 else true endif elseif lb(x)>=0.0 then p==1 elseif fPostprocessDomains /\ fPostproDom_AUX then aux_float_lt_zero_if_1__POST(x, 1-p, 1-p, float_lt_EPS) elseif fMZN__UseIndicators then aux_float_le_zero_if_0__IND(x+float_lt_EPS, p) %% Here just absolute EPS, TODO else %% let { float: rho = float_lt_EPS_coef__ * max(abs(ub(x)), abs(lb(x))) } % same order of magnitude as ub(x) let { float: rho = float_lt_EPS } % absolute eps in %%% This one causes 2x- derivation of EPS: %% x < (ub(x) + rho) * p %%% Better? x <= (ub(x) + rho) * p - rho %%% This just uses absolute eps: %% x < (ub(x) + float_lt_EPS) * p endif; % Derived cases predicate aux_int_le_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, p); predicate aux_int_ge_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, p); predicate aux_int_le_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, 1 - p); predicate aux_int_ge_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, 1 - p); predicate aux_int_lt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, p); predicate aux_int_gt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x + 1, p); predicate aux_int_lt_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, 1 - p); predicate aux_int_gt_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x + 1, 1 - p); %% int: switching differences to float to avoid creating integer vars /* Used anywhere? predicate aux_int_le_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(x - y, p); predicate aux_int_ge_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(y - x, p); predicate aux_int_le_if_1(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(x - y, 1 - p); predicate aux_int_ge_if_1(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(y - x, 1 - p); predicate aux_int_lt_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(x - y + 1.0, p); predicate aux_int_gt_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(y - x + 1.0, p); predicate aux_int_lt_if_1(var float: x, float: y, var int: p) = aux_float_le_zero_if_0(x - y + 1.0, 1 - p); */ predicate aux_float_le_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(x - y, p); predicate aux_float_ge_if_0(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(y - x, p); predicate aux_float_le_if_1(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(x - y, 1 - p); predicate aux_float_ge_if_1(var float: x, var float: y, var int: p) = aux_float_le_zero_if_0(y - x, 1 - p); predicate aux_float_lt_if_0(var float: x, var float: y, var int: p) = aux_float_lt_zero_if_0(x - y, p); predicate aux_float_gt_if_0(var float: x, var float: y, var int: p) = aux_float_lt_zero_if_0(y - x, p); predicate aux_float_lt_if_1(var float: x, var float: y, var int: p) = aux_float_lt_zero_if_0(x - y, 1 - p); predicate aux_float_gt_if_1(var float: x, var float: y, var int: p) = aux_float_lt_zero_if_0(y - x, 1 - p); % -------------------------- Domains postpro --------------------------- %% To avoid looking if an original int var x-y exists and has eq_encode: %% Passing both int and float version of the indicator for flexibility: predicate aux_float_eq_zero_if_1__POST(var float: x, var int: pI, var float: p); predicate aux_int_le_zero_if_1__POST(var int: x, var int: p); predicate aux_float_le_zero_if_1__POST(var float: x, var int: pI, var float: p); predicate aux_float_lt_zero_if_1__POST(var float: x, var int: pI, var float: p, float: eps); libminizinc-2.5.3/share/minizinc/linear/fzn_cumulative.mzn0000644000175000017500000000752213757304533022463 0ustar kaolkaol/** @group globals.scheduling Requires that a set of tasks given by start times \a s, durations \a d, and resource requirements \a r, never require more than a global resource bound \a b at any one time. Assumptions: - forall \p i, \a d[\p i] >= 0 and \a r[\p i] >= 0 Linear version. */ predicate fzn_cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = if mzn_in_redundant_constraint() /\ fMZN__IgnoreRedundantCumulative then true else let { set of int: tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 }, set of int: times = dom_array( [ s[i] | i in tasks ] ) } in if 0==card(tasks) then /*true*/ 0==card(index_set(s)) \/ b>=0 elseif MZN__Cumulative_Fixed_d_r /\ is_fixed(d) /\ is_fixed(r) /\ is_fixed(b) then fzn_cumulative_fixed_d_r(s, fix(d), fix(r), fix(b)) elseif nMZN__UnarySizeMax_cumul>=card(times)*card(tasks) then cumulative_time_decomp(s, d, r, b, times) else cumulative_task_decomp(s, d, r, b) endif endif; %% Can be called with a given set of times: predicate cumulative_set_times(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b, set of int: TIMES01) = assert(index_set(s) == index_set(d) /\ index_set(s) == index_set(r), "cumulative: the 3 array arguments must have identical index sets", assert(lb_array(d) >= 0 /\ lb_array(r) >= 0, "cumulative: durations and resource usages must be non-negative", let { set of int: tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 }, set of int: times = dom_array( [ s[i] | i in tasks ] ) intersect TIMES01 } in if false then cumulative_time_decomp(s, d, r, b, times) else cumulative_task_decomp(s, d, r, b) endif )); predicate cumulative_time_decomp(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b, set of int: TIMES01) = let { set of int: tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 }, set of int: times = { i | i in min([ lb(s[i]) | i in tasks ]) .. max([ ub(s[i]) + ub(d[i]) | i in tasks ]) where i in TIMES01 } } in forall( t in times ) ( b >= sum( i in tasks ) ( if is_fixed(d[i]) then bool2int( s[i] in t-fix(d[i])+1..t ) else bool2int( s[i] <= t /\ t < s[i] + d[i] ) endif * r[i] ) ); predicate cumulative_task_decomp(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in forall( j in tasks) ( b-r[j] >= sum( i in tasks where i != j /\ lb(s[i])<=ub(s[j]) /\ lb(s[j]) forall(i in index_set(f), j in index_set(invf)) ( (j == f[i] <-> i == invf[j]) ); libminizinc-2.5.3/share/minizinc/linear/fzn_alldifferent_except_0.mzn0000644000175000017500000000122113757304533024521 0ustar kaolkaol/** @group globals.alldifferent Constrain the array of integers \a vs to be all different except those elements that are assigned the value 0. */ predicate fzn_alldifferent_except_0(array[int] of var int: vs) = % forall(i, j in index_set(vs) where i < j) ( % (vs[i] != 0 /\ vs[j] != 0) -> vs[i] != vs[j] % ); if length(vs)<=1 then true else let { array[int,int] of var 0..1: x_eq_d = eq_encode(vs) } in ( % my_trace(" alldifferent_except_0: x[" ++ show(index_set(vs)) ++ "]\n") /\ forall(d in index_set_2of2(x_eq_d) diff {0})( sum(i in index_set_1of2(x_eq_d))( x_eq_d[i,d] ) <= 1 ) ) endif; libminizinc-2.5.3/share/minizinc/linear/subcircuit_wDummy.mzn0000644000175000017500000000573213757304533023147 0ustar kaolkaol/* Linearized version * Uses a predicate which constructs a subcircuit which always includes an extra dummy vertex * Is worse than the just slightly adapted standard variant... */ include "alldifferent.mzn"; /** @group globals Constrains the elements of \a x to define a subcircuit where \a x[\p i] = \p j means that \p j is the successor of \p i and \a x[\p i] = \p i means that \p i is not in the circuit. */ %% Linear version predicate subcircuit(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: u = max(S), int: n = card(S), constraint forall(i in S)(x[i] in l..u), array[l..u+1] of var l..u+1: xx, constraint forall(i in S)(xx[i] in dom(x[i]) union {u+1}), } in alldifferent(x) /\ subcircuit_wDummy(xx) /\ forall( i in S, j in dom(x[i]) )( %% also when i==j? eq_encode(x[i])[j] >= 2*eq_encode(xx[i])[j] + eq_encode(xx[i])[u+1] + eq_encode(xx[u+1])[j] - 1 %% -1 /\ eq_encode(x[i])[j] >= eq_encode(xx[i])[j] /\ eq_encode(x[i])[j] <= eq_encode(xx[i])[j] + eq_encode(xx[i])[u+1] /\ eq_encode(x[i])[j] <= eq_encode(xx[i])[j] + eq_encode(xx[u+1])[j] ) /\ forall( i in S )( eq_encode(x[i])[i] == eq_encode(xx[i])[i] ) ; %% Should include at least 2 nodes if >0? %% xx[n] is dummy predicate subcircuit_wDummy(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: u = max(S), int: n = card(S), set of int: S__ = S diff {u}, %% the real nodes array[S__] of var 2..n: order, %% constraint order[n]==1, %% fix the dummy %% var bool: empty = (firstin == u+1), no, break 2-cycles with dummy } in alldifferent(x) /\ % NO alldifferent(order) /\ %%% MTZ model. Note that INTEGER order vars seem better!: forall( i in S__, j in dom(x[i]) where i!=j /\ j!=u )( order[i] - order[j] + (n-1)*eq_encode(x[i])[j] % + (n-3)*bool2int(x[j]==i) %% the Desrochers & Laporte '91 term % --- strangely enough it is much worse on vrp-s2-v2-c7_vrp-v2-c7_det_ADAPT_1_INVERSE.mzn! <= n-2 ) /\ %% Break 2-cycles with dummy: forall( i in S__ )( eq_encode(x[i])[u] + eq_encode(x[u])[i] <= 1 /\ %% Ensure dummy is in: if i in dom(x[i]) then eq_encode(x[i])[i] >= eq_encode(x[u])[u] else true endif ) /\ % Symmetry? Each node that is not in is numbered after the lastin node. forall(i in S) ( true % (not ins[i]) <-> (n == order[i]) ) ; predicate subcircuit_reif(array[int] of var int: x, var bool: b) = abort("Reified subcircuit/1 is not supported."); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear/fzn_circuit.mzn0000644000175000017500000000350313757304533021742 0ustar kaolkaolinclude "alldifferent.mzn"; /** @group globals Constrains the elements of \a x to define a circuit where \a x[\p i] = \p j means that \p j is the successor of \p i. */ % Linear version. predicate fzn_circuit(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: u = max(S), int: n = card(S), constraint forall( i in S )( x[i] in S diff {i} ), %% Self-mapping and exclude i->i before alldifferent } in alldifferent(x) /\ % alldifferent(order) /\ if nMZN__fSECcuts>0 then let { array [int, int] of var int: eq_x = eq_encode( x ), constraint assert( l==min( index_set_2of2( eq_x ) ), "circuit: index set mismatch" ), %% self-mapping constraint assert( u==max( index_set_2of2( eq_x ) ), "circuit: index set mismatch" ), } in circuit__SECcuts( eq_x ) else true endif /\ if nMZN__fSECcuts<2 then %%% MTZ model. Note that INTEGER order vars seem better!: let { array[l+1..l+n-1] of var 2..n: order, } in forall (i,j in l+1..l+n-1 where i!=j /\ j in dom(x[i])) ( order[i] - order[j] + (n-1)* bool2int(x[i]==j) + (n-3)*bool2int(x[j]==i) %% the Desrochers & Laporte '91 term %%%% --- strangely enough it is much worse on vrp-s2-v2-c7_vrp-v2-c7_det_ADAPT_1_INVERSE.mzn! <= n-2 ) else true endif %% ... but seems improved with this (leaving also for SEC) /\ if n>2 then forall (i,j in S where i parent[n] = 0) /\ forall(n in NODE) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in NODE) % each in node except root must have a parent (ns[n] -> (n = r \/ parent[n] > 0)) /\ forall(n in NODE) % each in node with a parent must be in and also its parent (parent[n] > 0 -> (ns[n] /\ ns[parent[n]])) /\ forall(n in NODE) % each except with a parent is one more than its parent (parent[n] > 0 -> dist[n] = dist[parent[n]] + 1) /\ forall(n in NODE) % each node with a parent must have that edge in (parent[n] > 0 -> exists(e in 1..E)(es[e] /\ from[e] = parent[n] /\ to[e] = n)) /\ subgraph(N,E,from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_eq_reif.mzn0000644000175000017500000000031113757304533022434 0ustar kaolkaolpredicate fzn_count_eq_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = b <-> count_eq(x,y)=c; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_leq_par_reif.mzn0000644000175000017500000000035513757304533023462 0ustar kaolkaolinclude "fzn_count_leq_reif.mzn"; predicate fzn_count_leq_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_leq_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_sum_set_reif.mzn0000644000175000017500000000032713757304533022305 0ustar kaolkaolpredicate fzn_sum_set_reif(array[int] of int: vs, array[int] of int: ws, var set of int: x, var int: s, var bool: b) = b <-> s == sum(j in index_set(vs)) ( bool2int(j in x) * ws[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_regular_nfa_set.mzn0000644000175000017500000000145413757304533022763 0ustar kaolkaolpredicate fzn_regular_nfa(array[int] of var int: x, int: Q, set of int: S, array[int,int] of set of int: d, int: q0, set of int: F) = let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)), int: n = max(index_set(x)) + 1, array[m..n] of var 1..Q: a } in a[m] = q0 /\ % Set a[0]. forall(i in index_set(x)) ( x[i] in S /\ % Do this in case it's a var. a[i+1] in d[a[i], x[i]] % Determine a[i+1]. ) /\ a[n] in F; % Check the final state is in F. libminizinc-2.5.3/share/minizinc/std/alternative.mzn0000644000175000017500000000172213757304533021262 0ustar kaolkaolinclude "fzn_alternative.mzn"; include "fzn_alternative_reif.mzn"; /** @group globals.scheduling Alternative constraint for optional tasks. Task (\a s0,\a d0) spans the optional tasks (\a s[\p i],\a d[\p i]) in the array arguments and at most one can occur */ predicate alternative(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d) = assert(index_set(s) = index_set(d), "alternative: index sets of third and fourth argument must be identical", fzn_alternative(s0, d0, s, d) ); predicate alternative_reif(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d, var bool: b) = assert(index_set(s) = index_set(d), "alternative: index sets of third and fourth argument must be identical", fzn_alternative_reif(s0, d0, s, d, b) ); libminizinc-2.5.3/share/minizinc/std/fzn_int_set_channel.mzn0000644000175000017500000000060513757304533022755 0ustar kaolkaolpredicate fzn_int_set_channel(array[int] of var int: x, array[int] of var set of int: y) = forall(i in index_set(x)) (x[i] in index_set(y)) /\ forall(j in index_set(y)) (y[j] subset index_set(x)) /\ forall(i in index_set(x), j in index_set(y)) (x[i] = j <-> i in y[j]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/regular_nfa.mzn0000644000175000017500000000534113757304533021232 0ustar kaolkaolinclude "fzn_regular_nfa.mzn"; include "fzn_regular_nfa_reif.mzn"; include "fzn_regular_nfa_set.mzn"; include "fzn_regular_nfa_set_reif.mzn"; /** @group globals.extensional The sequence of values in array \a x (which must all be in the range 1..\a S) is accepted by the NFA of \a Q states with input 1..\a S and transition function \a d (which maps (1..\a Q, 1..\a S) -> set of 1..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). */ predicate regular_nfa(array[int] of var int: x, int: Q, int: S, array[int,int] of set of int: d, int: q0, set of int: F) = assert(Q > 0, "regular_nfa: 'Q' must be greater than zero", assert(S > 0, "regular_nfa: 'S' must be greater than zero", assert(index_set_1of2(d) = 1..Q /\ index_set_2of2(d) == 1..S, "regular_nfa: the transition function 'd' must be [1..Q,1..S]", assert(forall([d[i, j] subset 1..Q | i in 1..Q, j in 1..S]), "regular_nfa: transition function 'd' points to states outside 1..Q", % Nb: we need the parentheses around the expression otherwise the % parser thinks it's a generator call! assert((q0 in 1..Q), "regular: start state 'q0' not in 1..Q", assert(F subset 1..Q, "regular: final states in 'F' contain states outside 1..Q", fzn_regular_nfa(x,Q,S,d,q0,F) )))))); /** @group globals.extensional The sequence of values in array \a x (which must all be in the range \a S) is accepted by the NFA of \a Q states with input \a S and transition function \a d (which maps (1..\a Q, \a S) -> set of 1..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). */ predicate regular_nfa(array[int] of var int: x, int: Q, set of int: S, array[int,int] of set of int: d, int: q0, set of int: F) = assert(Q > 0, "regular_nfa: 'Q' must be greater than zero", assert(card(S) > 0, "regular_nfa: 'S' must be non empty", assert(S = min(S)..max(S), "regular_nfa: 'S' must be a range", assert(index_set_1of2(d) = 1..Q /\ index_set_2of2(d) == S, "regular_nfa: the transition function 'd' must be [1..Q,S]", assert(forall([d[i, j] subset 1..Q | i in 1..Q, j in S]), "regular_nfa: transition function 'd' points to states outside 1..Q", % Nb: we need the parentheses around the expression otherwise the % parser thinks it's a generator call! assert((q0 in 1..Q), "regular: start state 'q0' not in 1..Q", assert(F subset 1..Q, "regular: final states in 'F' contain states outside 1..Q", fzn_regular_nfa(x,Q,S,d,q0,F) ))))))); libminizinc-2.5.3/share/minizinc/std/fzn_symmetric_all_different.mzn0000644000175000017500000000023413757304533024510 0ustar kaolkaolinclude "all_different.mzn"; include "inverse.mzn"; predicate fzn_symmetric_all_different(array[int] of var int:x) = all_different(x) /\ inverse(x,x); libminizinc-2.5.3/share/minizinc/std/fzn_strictly_decreasing_bool.mzn0000644000175000017500000000055313757304533024676 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict decreasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_decreasing_bool(array[int] of var bool: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] > x[i]); libminizinc-2.5.3/share/minizinc/std/write.mzn0000644000175000017500000000150513757304533020075 0ustar kaolkaolinclude "fzn_write.mzn"; include "fzn_write_reif.mzn"; /** @group globals.array Creates a new array \a O from an input array \a I with a change at position \a i to take value \a v \a I is an array of integers \a O is an array of integers with same index set as \a I \a i is an index for \a I \a v is an integer value */ predicate write(array[int] of var int: I, var int: i, var int: v, array[int] of var int: O) = assert(index_set(O) = index_set(I),"writet: index set of I must be same as O") /\ fzn_write(I, i, v, O); function array[int] of var int: write(array[int] of var int: I, var int: i, var int: v) = let { array[index_set(I)] of var int: O; constraint fzn_write(I,i,v,O); } in O; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_bin_packing_capa.mzn0000644000175000017500000000100713757304533023045 0ustar kaolkaolpredicate fzn_bin_packing_capa(array[int] of int: c, array[int] of var int: bin, array[int] of int: w) = forall( i in index_set(bin) ) ( min(index_set(c)) <= bin[i] /\ bin[i] <= max(index_set(c)) ) /\ forall( b in index_set(c) ) ( c[b] >= sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] = b ) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/reachable.mzn0000644000175000017500000001076113757304533020655 0ustar kaolkaolinclude "fzn_reachable_int.mzn"; include "fzn_reachable_int_reif.mzn"; include "fzn_reachable_enum.mzn"; include "fzn_reachable_enum_reif.mzn"; include "fzn_dreachable_int.mzn"; include "fzn_dreachable_int_reif.mzn"; include "fzn_dreachable_enum.mzn"; include "fzn_dreachable_enum_reif.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be reachable from \a r. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dreachable(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"dreachable: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"dreachable: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"dreachable: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"dreachable: index set of es must be 1..\(E)") /\ fzn_dreachable(N,E,from,to,r,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be reachable from \a r. @param from: the leaving node for each edge @param to: the entering node for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dreachable(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dreachable: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dreachable: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in to must be in index set of ns") /\ fzn_dreachable(from,to,r,ns,es); %-----------------------------------------------------------------------------% /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be reachable from \a r. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate reachable(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"reachable: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"reachable: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"reachable: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"reachable: index set of es must be 1..\(E)") /\ fzn_reachable(N,E,from,to,r,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be reachable from \a r. @param from: the leaving node for each edge @param to: the entering node for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate reachable(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"reachable: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"reachable: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"reachable: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"reachable: nodes in to must be in index set of ns") /\ fzn_reachable(from,to,r,ns,es); libminizinc-2.5.3/share/minizinc/std/fzn_count_eq_par.mzn0000644000175000017500000000031613757304533022276 0ustar kaolkaolinclude "fzn_count_eq.mzn"; predicate fzn_count_eq_par(array[int] of var int: x, int: y, int: c) = fzn_count_eq(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_sum_pred.mzn0000644000175000017500000000040013757304533021427 0ustar kaolkaolpredicate fzn_sum_pred(var int: i, array[int] of set of int: sets, array[int] of int: cs, var int: s) = let { array[index_set(sets)] of int: sums = [ sum(k in sets[j])(cs[k]) | j in index_set(sets) ]; } in sums[i] = s; libminizinc-2.5.3/share/minizinc/std/table_bool.mzn0000644000175000017500000000126313757304533021046 0ustar kaolkaolinclude "fzn_table_bool.mzn"; include "fzn_table_bool_reif.mzn"; %-----------------------------------------------------------------------------% % A table constraint: table(x, t) represents the constraint x in t where we % consider each row in t to be a tuple and t as a set of tuples. %-----------------------------------------------------------------------------% predicate table_bool(array[int] of var bool: x, array[int, int] of bool: t) = fzn_table_bool(x, t); predicate table_bool_reif(array[int] of var bool: x, array[int, int] of bool: t, var bool: b) = fzn_table_bool_reif(x, t, b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_least_set_reif.mzn0000644000175000017500000000061013757304533023270 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_least_set_reif(int: n, array[int] of var set of int: x, set of int: v, var bool: b) = b <-> sum(i in index_set(x)) ( bool2int(x[i] == v) ) >= n; libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_bool_reif.mzn0000644000175000017500000000200113757304533023446 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_bool_reif(array[int] of var bool: x, array[int] of var bool: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/all_equal_set.mzn0000644000175000017500000000106513757304533021556 0ustar kaolkaolinclude "fzn_all_equal_set.mzn"; include "fzn_all_equal_set_reif.mzn"; %-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate all_equal_set(array[int] of var set of int: x) = if length(x) <=1 then true else fzn_all_equal_set(x) endif; predicate all_equal_set_reif(array[int] of var set of int: x, var bool: b) = if length(x) <= 1 then b=true else fzn_all_equal_set_reif(x,b) endif; libminizinc-2.5.3/share/minizinc/std/fzn_bin_packing_capa_reif.mzn0000644000175000017500000000114113757304533024051 0ustar kaolkaolpredicate fzn_bin_packing_capa_reif(array[int] of int: c, array[int] of var int: bin, array[int] of int: w, var bool: b) = b <-> ( forall( i in index_set(bin) ) ( min(index_set(c)) <= bin[i] /\ bin[i] <= max(index_set(c)) ) /\ forall( assigned_bin in index_set(c) ) ( c[assigned_bin] >= sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] = assigned_bin ) ) )); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/lex_less_int.mzn0000644000175000017500000000133613757304533021435 0ustar kaolkaolinclude "lex_less.mzn"; include "fzn_lex_less_int.mzn"; include "fzn_lex_less_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_less_int(array[int] of var int: x, array[int] of var int: y) = fzn_lex_less_int(x, y); predicate lex_lt_int(array[int] of var int: x, array[int] of var int: y) = lex_less(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_table_bool_reif.mzn0000644000175000017500000000072613757304533022733 0ustar kaolkaol%-----------------------------------------------------------------------------% % A table constraint: table(x, t) represents the constraint x in t where we % consider each row in t to be a tuple and t as a set of tuples. %-----------------------------------------------------------------------------% predicate fzn_table_bool_reif(array[int] of var bool: x, array[int, int] of bool: t, var bool: b) = abort("Reified table/2 for Booleans is not supported."); libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_closed_reif.mzn0000644000175000017500000000064313757304533026003 0ustar kaolkaolinclude "global_cardinality.mzn"; predicate fzn_global_cardinality_closed_reif(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts, var bool: b) = b <-> ( forall(i in index_set(x))( x[i] in { d | d in cover } ) /\ global_cardinality(x, cover, counts) ); libminizinc-2.5.3/share/minizinc/std/fzn_among_reif.mzn0000644000175000017500000000024013757304533021721 0ustar kaolkaolpredicate fzn_among_reif(var int: n, array[int] of var int: x, set of int: v, var bool: b) = b <-> ( n == sum(i in index_set(x)) ( bool2int(x[i] in v) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_network_flow_cost.mzn0000644000175000017500000000113413757304533023366 0ustar kaolkaolpredicate fzn_network_flow_cost(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of int: weight, array[int] of var int: flow, var int: cost) = let { int: source_node = 1; int: sink_node = 2; set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in cost = sum(i in ARCS) (flow[i] * weight[i]) /\ forall (i in NODES) ( sum (j in ARCS where i == arc[j,source_node]) (flow[j]) - sum (j in ARCS where i == arc[j,sink_node]) (flow[j]) = balance[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_sum_set.mzn0000644000175000017500000000027613757304533021303 0ustar kaolkaolpredicate fzn_sum_set(array[int] of int: vs, array[int] of int: ws, var set of int: x, var int: s) = s == sum(j in index_set(vs)) ( bool2int(vs[j] in x) * ws[j] ); libminizinc-2.5.3/share/minizinc/std/strictly_decreasing.mzn0000644000175000017500000000173613757304533023012 0ustar kaolkaolinclude "fzn_strictly_decreasing_int.mzn"; include "fzn_strictly_decreasing_int_reif.mzn"; include "fzn_strictly_decreasing_bool.mzn"; include "fzn_strictly_decreasing_bool_reif.mzn"; include "analyse_all_different.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict decreasing order %-----------------------------------------------------------------------------% predicate strictly_decreasing(array[$X] of var bool: x) = analyse_all_different(array1d(x)) /\ fzn_strictly_decreasing_bool(array1d(x)); predicate strictly_decreasing_reif(array[$X] of var bool: x, var bool: b) = fzn_strictly_decreasing_bool_reif(array1d(x),b); predicate strictly_decreasing(array[$X] of var int: x) = analyse_all_different(array1d(x)) /\ fzn_strictly_decreasing_int(array1d(x)); predicate strictly_decreasing_reif(array[$X] of var int: x, var bool: b) = fzn_strictly_decreasing_int_reif(array1d(x),b); libminizinc-2.5.3/share/minizinc/std/atleast.mzn0000644000175000017500000000022413757304533020375 0ustar kaolkaol% The actual definitions are in at_least.mzn. % This file is used to handle the case where users include % "atleast.mzn"; % include "at_least.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_diffn_nonstrict.mzn0000644000175000017500000000066113757304533023013 0ustar kaolkaolpredicate fzn_diffn_nonstrict(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy) = forall(i,j in index_set(x) where i < j)( dx[i] = 0 \/ dx[j] = 0 \/ dy[i]=0 \/ dy[j]=0 \/ x[i] + dx[i] <= x[j] \/ y[i] + dy[i] <= y[j] \/ x[j] + dx[j] <= x[i] \/ y[j] + dy[j] <= y[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_bool_reif.mzn0000644000175000017500000000061613757304533023746 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_bool_reif(array[int] of var bool: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_mdd.mzn0000644000175000017500000000356313757304533020372 0ustar kaolkaolpredicate fzn_mdd(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % value of variable array[int] of int: to % edge entering node 0..N where 0 = T node ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of var bool: bn; array[EDGE] of var bool: be; set of int: D = dom_array(x); } in bn[0] /\ % true node is true bn[1] /\ % root must hold % T1 each node except the true node enforces an outgoing edge forall(n in NODE)(bn[n] -> exists(e in EDGE where from[e] = n)(be[e])) /\ % T23 each edge enforces its endpoints forall(e in EDGE)((be[e] -> bn[from[e]]) /\ (be[e] -> bn[to[e]])) /\ % T4 each edge enforces its label forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ % P1 each node enforces its outgoing edges forall(e in EDGE)(bn[from[e]] /\ x[level[from[e]]] in label[e] -> be[e]) /\ % P2 each node except the root enforces an incoming edge exists(e in EDGE where to[e] = 0)(be[e]) /\ forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ % P3 each label has a support forall(i in 1..L, d in D) (x[i] = d -> exists(e in EDGE where level[from[e]] = i /\ d in label[e])(be[e])) /\ % P4 exactly one node at each level forall(i in 1..L) (sum(n in NODE where level[n] = i)(bn[n]) = 1); libminizinc-2.5.3/share/minizinc/std/sliding_sum.mzn0000644000175000017500000000053613757304533021263 0ustar kaolkaolinclude "fzn_sliding_sum.mzn"; include "fzn_sliding_sum_reif.mzn"; /** @group globals Requires that in each subsequence \a vs[\p i], ..., \a vs[\p i + \a seq - 1] the sum of the values belongs to the interval [\a low, \a up]. */ predicate sliding_sum(int: low, int: up, int: seq, array[int] of var int: vs) = fzn_sliding_sum(low, up, seq, vs); libminizinc-2.5.3/share/minizinc/std/fzn_seq_precede_chain_int.mzn0000644000175000017500000000071013757304533024110 0ustar kaolkaolpredicate fzn_seq_precede_chain_int(array[int] of var int: X) = let { int : l = lb_array (X) ; % least possible value int : u = ub_array (X) ; % greatest possible value int : f = min ( index_set (X )); array [ index_set (X) ] of var l .. u: H; } in H[f] <= 1 /\ H[f] = max (X[f], 0) /\ forall ( i in index_set ( X) diff {f} ) ( H[i] <= H[i-1] + 1 /\ H[i] = max (X[i], H[i-1]) ); libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_set_reif.mzn0000644000175000017500000000062413757304533023605 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_set_reif(array[int] of var set of int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/increasing_set.mzn0000644000175000017500000000062113757304533021736 0ustar kaolkaolinclude "fzn_increasing_set.mzn"; include "fzn_increasing_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate increasing_set(array[int] of var set of int: x) = fzn_increasing_set(x); libminizinc-2.5.3/share/minizinc/std/at_least.mzn.deprecated.mzn0000644000175000017500000000023413757304533023437 0ustar kaolkaolpredicate at_least(int: n, array[int] of var int: x, int: v) ::mzn_deprecated("2.4.0","https://www.minizinc.org/doc-2.4.0/en/lib-globals.html#deprecated"); libminizinc-2.5.3/share/minizinc/std/fzn_write_reif.mzn0000644000175000017500000000046713757304533021765 0ustar kaolkaolpredicate fzn_write_reif(array[int] of var int: I, var int: i, var int: v, array[int] of var int: O, var bool: b) = b <-> forall(j in index_set(I)) (O[j] = if j = i then v else I[j] endif); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_strictly_decreasing_bool_reif.mzn0000644000175000017500000000060313757304533025677 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict decreasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_decreasing_bool_reif(array[int] of var bool: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] > x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_disjoint_reif.mzn0000644000175000017500000000016413757304533022450 0ustar kaolkaolpredicate fzn_disjoint_reif(var set of int: s1, var set of int: s2, var bool: b) = b <-> s1 intersect s2 == {}; libminizinc-2.5.3/share/minizinc/std/value_precede_chain_int.mzn0000644000175000017500000000032713757304533023563 0ustar kaolkaolinclude "fzn_value_precede_chain_int.mzn"; include "fzn_value_precede_chain_int_reif.mzn"; predicate value_precede_chain_int(array[int] of int: c, array[int] of var int: x) = fzn_value_precede_chain_int(c, x); libminizinc-2.5.3/share/minizinc/std/element_int.mzn0000644000175000017500000000046213757304533021247 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' is the ith element of the array 'x'. %-----------------------------------------------------------------------------% predicate element_int(var int: i, array[int] of var int: x, var int: y) = y = x[i]; libminizinc-2.5.3/share/minizinc/std/global_cardinality_fn.mzn0000644000175000017500000000101513757304533023245 0ustar kaolkaolinclude "global_cardinality.mzn"; /** @group globals.counting Returns the number of occurrences of \a cover[\p i] in \a x. */ function array[$Y] of var int: global_cardinality(array[$X] of var int: x, array[$Y] of int: cover) :: promise_total = let { array[int] of int: cover1d = array1d(cover); array[index_set(cover1d)] of var 0..length(x): counts; constraint global_cardinality(array1d(x),array1d(cover),array1d(counts)) } in arrayXd(cover,counts); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_int.mzn0000644000175000017500000000056413757304533023772 0ustar kaolkaolpredicate fzn_if_then_else_var_int(array[int] of var bool: c, array[int] of var int: x, var int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_count_gt_reif.mzn0000644000175000017500000000057613757304533022456 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_gt_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = let { var int: z = count(x,y) } in b <-> z < c; % This needs to be written with a let rather than count(x,y) < c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_most_set_reif.mzn0000644000175000017500000000060613757304533023147 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_most_set_reif(int: n, array[int] of var set of int: x, set of int: v, var bool: b) = b <-> sum(i in index_set(x)) ( bool2int(x[i] == v) ) <= n; libminizinc-2.5.3/share/minizinc/std/member_bool.mzn0000644000175000017500000000056413757304533021231 0ustar kaolkaolinclude "fzn_member_bool.mzn"; include "fzn_member_bool_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate member_bool(array[int] of var bool: x, var bool: y) = fzn_member_bool(x, y); libminizinc-2.5.3/share/minizinc/std/fzn_dreachable_int_reif.mzn0000644000175000017500000000057113757304533023553 0ustar kaolkaolpredicate fzn_dreachable_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dreachable constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/subcircuit.mzn0000644000175000017500000000102113757304533021110 0ustar kaolkaolinclude "fzn_subcircuit.mzn"; include "fzn_subcircuit_reif.mzn"; /** @group globals Constrains the elements of \a x to define a subcircuit where \a x[\p i] = \p j means that \p j is the successor of \p i and \a x[\p i] = \p i means that \p i is not in the circuit. */ predicate subcircuit(array[int] of var int: x) = fzn_subcircuit(x); predicate subcircuit_reif(array[int] of var int: x, var bool: b) = fzn_subcircuit_reif(x, b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_neq_par.mzn0000644000175000017500000000031713757304533022455 0ustar kaolkaolinclude "fzn_count_neq.mzn"; predicate fzn_count_neq_par(array[int] of var int: x, int: y, int: c) = fzn_count_neq(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/count_eq.mzn0000644000175000017500000000242113757304533020556 0ustar kaolkaolinclude "fzn_count_eq.mzn"; include "fzn_count_eq_par.mzn"; include "fzn_count_eq_reif.mzn"; include "fzn_count_eq_par_reif.mzn"; /** @group globals.counting Constrains \a c to be the number of occurrences of \a y in \a x. */ predicate count_eq(array[$X] of var int: x, var int: y, var int: c) = fzn_count_eq(array1d(x),y,c); /** @group globals.counting Constrains \a c to be the number of occurrences of \a y in \a x. */ predicate count_eq(array[$X] of var int: x, int: y, int: c) = fzn_count_eq_par(array1d(x),y,c); predicate count_eq(array[$X] of int: x, int: y, int: c) = c=count_eq(x,y); /** @group globals.counting Returns the number of occurrences of \a y in \a x. */ function var int: count_eq(array[$X] of var int: x, var int: y) ::promise_total = let { var 0..length(x): c; constraint fzn_count_eq(array1d(x),y,c); } in c; function int: count_eq(array[$X] of int: x, int: y) = sum(v in array1d(x))(v = y); predicate count_eq_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_eq_reif(array1d(x), y, c, b); predicate count_eq_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_eq_par_reif(array1d(x), y, c, b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/lex2.mzn0000644000175000017500000000045413757304533017617 0ustar kaolkaolinclude "fzn_lex2.mzn"; include "fzn_lex2_reif.mzn"; /** @group globals.lexicographic Require adjacent rows and adjacent columns in the array \a x to be lexicographically ordered. Adjacent rows and adjacent columns may be equal. */ predicate lex2(array[int, int] of var int: x) = fzn_lex2(x); libminizinc-2.5.3/share/minizinc/std/fzn_count_lt_reif.mzn0000644000175000017500000000057613757304533022463 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_lt_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = let { var int: z = count(x,y) } in b <-> z > c; % This needs to be written with a let rather than count(x,y) > c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/strict_lex2.mzn0000644000175000017500000000051313757304533021203 0ustar kaolkaolinclude "fzn_strict_lex2.mzn"; include "fzn_strict_lex2_reif.mzn"; /** @group globals.lexicographic Require adjacent rows and adjacent columns in the array \a x to be lexicographically ordered. Adjacent rows and adjacent columns cannot be equal. */ predicate strict_lex2(array[int, int] of var int: x) = fzn_strict_lex2(x); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.2.1.mzn0000644000175000017500000000037013757304533022242 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.2.1 % that can be overridden by solvers. predicate int_pow_fixed(var int: x, int: y, var int: z) = if y=0 then z=1 elseif y=1 then z=x else z=product([x | i in 1..y]) endif; libminizinc-2.5.3/share/minizinc/std/writes_seq.mzn0000644000175000017500000000225113757304533021127 0ustar kaolkaolinclude "fzn_writes_seq.mzn"; include "fzn_writes_seq_reif.mzn"; /** @group globals.array Creates a new array \a O from an input array \a I with a sequence of changes at positions \a P to take values \a V \a I is an array of integers \a O is an array of integers with same index set as \a I \a P is an array of index values in \a I \a V is an array of integer values */ predicate writes_seq(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O) = assert(index_set(O) = index_set(I),"writes: index set of I must be same as O") /\ assert(index_set(P) = index_set(V),"writes: index set of P must be same as V") /\ fzn_writes_seq(I, P, V, O); function array[int] of var int: writes_seq(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V) = let { array[index_set(I)] of var int: O; constraint assert(index_set(P) = index_set(V),"writes: index set of P must be same as V"); constraint fzn_writes_seq(I,P,V,O); } in O; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/range.mzn0000644000175000017500000000104113757304533020032 0ustar kaolkaolinclude "fzn_range.mzn"; include "fzn_range_reif.mzn"; /** @group globals Requires that the image of function \a x (represented as an array) on set of values \a s is \a t. ub(\a s) must be a subset of index_set(\a x) otherwise an assertion failure will occur. */ predicate range(array[int] of var int: x, var set of int: s, var set of int: t) = assert(ub(s) subset index_set(x), "range: upper bound of 's' must be a subset of the index set of 'x'", fzn_range(x, s, t) ); libminizinc-2.5.3/share/minizinc/std/fzn_tree_int_reif.mzn0000644000175000017500000000051413757304533022435 0ustar kaolkaolpredicate fzn_tree_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified tree constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_strict_lex2.mzn0000644000175000017500000000123513757304533022062 0ustar kaolkaolinclude "lex_less.mzn"; predicate fzn_strict_lex2(array[int, int] of var int: x) = let { int: lbx1 = min(index_set_1of2(x)), int: ubx1 = max(index_set_1of2(x)), int: lbx2 = min(index_set_2of2(x)), int: ubx2 = max(index_set_2of2(x)) } in ( forall(i in lbx1 + 1 .. ubx1) ( lex_less([x[i - 1, j] | j in index_set_2of2(x)], [x[i, j] | j in index_set_2of2(x)] ) ) /\ forall(j in lbx2 + 1 .. ubx2) ( lex_less([x[i, j - 1] | i in index_set_1of2(x)], [x[i, j ] | i in index_set_1of2(x)] ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_set.mzn0000644000175000017500000000107313757304533023276 0ustar kaolkaolpredicate fzn_value_precede_set(int: s, int: t, array[int] of var set of int: x) = let { int: imin = min(index_set(x)), int: imax = max(index_set(x)), array[imin..imax + 1] of var bool: b } in ( forall (i in imin..imax) ( let { var bool: xis = (s in x[i] /\ not (t in x[i])) } in (xis -> (b[i + 1] == true)) /\ ((not xis) -> (b[i] == b[i + 1])) /\ ((not b[i]) -> (s in x[i] \/ not (t in x[i]))) ) /\ b[imin] == false ); libminizinc-2.5.3/share/minizinc/std/fzn_regular.mzn0000644000175000017500000000142613757304533021263 0ustar kaolkaolpredicate fzn_regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F) = let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)), int: n = max(index_set(x)) + 1, array[m..n] of var 1..Q: a } in a[m] = q0 /\ % Set a[0]. forall(i in index_set(x)) ( x[i] in 1..S /\ % Do this in case it's a var. a[i+1] = d[a[i], x[i]] % Determine a[i+1]. ) /\ a[n] in F; % Check the final state is in F. libminizinc-2.5.3/share/minizinc/std/global_cardinality_closed.mzn0000644000175000017500000000127513757304533024123 0ustar kaolkaolinclude "fzn_global_cardinality_closed.mzn"; include "fzn_global_cardinality_closed_reif.mzn"; /** @group globals.counting Requires that the number of occurrences of \a cover[\p i] in \a x is \a counts[\p i]. The elements of \a x must take their values from \a cover. */ predicate global_cardinality_closed(array[$X] of var int: x, array[$Y] of int: cover, array[$Y] of var int: counts) = assert(index_sets_agree(cover, counts), "global_cardinality_closed: " ++ "cover and counts must have identical index sets", fzn_global_cardinality_closed(array1d(x), array1d(cover), array1d(counts)) ); libminizinc-2.5.3/share/minizinc/std/fzn_partition_set_reif.mzn0000644000175000017500000000043413757304533023511 0ustar kaolkaolinclude "all_disjoint.mzn"; predicate fzn_partition_set_reif(array[int] of var set of int: S, set of int: universe, var bool: b) = b <-> ( all_disjoint(S) /\ universe == array_union(i in index_set(S)) ( S[i] ) ); libminizinc-2.5.3/share/minizinc/std/comparison_rel_array.mzn0000644000175000017500000000236713757304533023164 0ustar kaolkaol%-----------------------------------------------------------------------------% % Reflect an array of comparison values onto a comparison value variable using % a lexicographic interpretation of the array. The comparison values are % encoded as follows: > | = | < as -1 | 0 | +1. % Uses of this constraint are generated by Cadmium transformations that % simplify ordering constraints on expressions of complex types. %-----------------------------------------------------------------------------% predicate comparison_rel_array(array[int] of var -1..1: rels, var -1..1: rel) = let { var int: firstneg = arg_min(rels); var int: firstpos = arg_max(rels); } in % if they only consist of one number then return it if firstneg = firstpos then rel = rels[min(index_set(rels))] else %% if there are no -1 then it must be +1 if rels[firstneg] = 0 then rel = +1 %% otherwise if ther are no +1 it must be -1 elseif rels[firstpos] = 0 then rel = -1 %% otherwise if a neg appears earlier than -1 elseif firstneg < firstpos then rel = -1 %% otherwise +1 else rel = +1 endif; libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_set.mzn0000644000175000017500000000057413757304533022604 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_set(array[int] of var set of int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_bin_packing_load.mzn0000644000175000017500000000106513757304533023064 0ustar kaolkaolpredicate fzn_bin_packing_load(array[int] of var int: load, array[int] of var int: bin, array[int] of int: w) = sum(load) = sum(w) /\ forall( i in index_set(bin) ) ( min(index_set(load)) <= bin[i] /\ bin[i] <= max(index_set(load)) ) /\ forall( b in index_set(load) ) ( load[b] = sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] = b ) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_reachable_enum.mzn0000644000175000017500000000135413757304533022554 0ustar kaolkaolinclude "subgraph.mzn"; predicate fzn_reachable(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = let { int: E = length(es); set of int: NODE = min(index_set(ns))..max(index_set(ns)); array[1..2*E] of NODE: dfrom = from ++ to; array[1..2*E] of NODE: dto = to ++ from; array[1..2*E] of var bool: des = es ++ es; array[NODE] of var bool: dns = array1d(NODE,ns); var NODE: dr = r; } in /* duplicate the edges so that we can use directed graph reachability */ fzn_dreachable(dfrom,dto,dr,dns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_gt.mzn0000644000175000017500000000054613757304533021446 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_gt(array[int] of var int: x, var int: y, var int: c) = let { var int: z = count(x,y) } in z < c; % This needs to be written with a let rather than count(x,y) < c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_strictly_decreasing_int_reif.mzn0000644000175000017500000000060113757304533025534 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict decreasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_decreasing_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] > x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_geost.mzn0000644000175000017500000000230513757304533020740 0ustar kaolkaolinclude "fzn_geost_nonoverlap_k.mzn"; predicate fzn_geost( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind ) = % A few useful definitions let { set of int: DIMS = 1..k; set of int: SHAPES = 1..length(shape); set of int: OBJECTS = index_set(kind); } in forall(o1, o2 in OBJECTS where o1 < o2)( forall(s1 in dom(kind[o1]), s2 in dom(kind[o2]))( (kind[o1] = s1 /\ kind[o2] = s2 -> forall(r1 in shape[s1], r2 in shape[s2])( fzn_geost_nonoverlap_k( [ x[o1,j] + rect_offset[r1,j] | j in DIMS ], [ rect_size[r1,j] | j in DIMS ], [ x[o2,j] + rect_offset[r2,j] | j in DIMS ], [ rect_size[r2,j] | j in DIMS ] ) ) ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_set_member_reif.mzn0000644000175000017500000000046313757304533022751 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_set_member_reif(var set of int: x, var int: y, var bool: b) = b <-> y in x; libminizinc-2.5.3/share/minizinc/std/knapsack.mzn0000644000175000017500000000174413757304533020543 0ustar kaolkaolinclude "fzn_knapsack.mzn"; include "fzn_knapsack_reif.mzn"; /** @group globals.packing Requires that items are packed in a knapsack with certain weight and profit restrictions. Assumptions: - Weights \a w and profits \a p must be non-negative - \a w, \a p and \a x must have the same index sets @param w: weight of each type of item @param p: profit of each type of item @param x: number of items of each type that are packed @param W: sum of sizes of all items in the knapsack @param P: sum of profits of all items in the knapsack */ predicate knapsack(array[int] of int: w, array[int] of int:p, array[int] of var int:x, var int: W, var int: P) = assert(index_set(w) = index_set(p) /\ index_set(w) = index_set(x), "index set of weights must be equal to index set of profits and index set of items", assert(lb_array(w) >= 0, "weights must be non-negative", assert(lb_array(p) >= 0, "profits must be non-negative", fzn_knapsack(w, p, x, W, P) ))); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_opt_bool.mzn0000644000175000017500000000060313757304533025007 0ustar kaolkaolpredicate fzn_if_then_else_var_opt_bool(array[int] of var bool: c, array[int] of var opt bool: x, var opt bool: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_bool.mzn0000644000175000017500000000171213757304533022777 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_bool(array[int] of var bool: x, array[int] of var bool: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_range_reif.mzn0000644000175000017500000000075713757304533021731 0ustar kaolkaolpredicate fzn_range_reif(array[int] of var int: x, var set of int: s, var set of int: t, var bool: b) = b <-> ( % All values in 's' must map to a value in 't'. forall(i in ub(s)) ( i in s -> x[i] in t ) /\ % All values in 't' must be mapped from a value in 's'. forall(i in ub(t)) ( i in t -> exists(j in ub(s)) ( j in s /\ x[j] == i ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_set_reif.mzn0000644000175000017500000000201213757304533023310 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_set_reif(array[int] of var set of int: x, array[int] of var set of int: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_int.mzn0000644000175000017500000000167513757304533022320 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_int(array[int] of var int: x, array[int] of var int: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_least_set.mzn0000644000175000017500000000056013757304533022267 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_least_set(int: n, array[int] of var set of int: x, set of int: v) = sum(i in index_set(x)) ( bool2int(x[i] == v) ) >= n; libminizinc-2.5.3/share/minizinc/std/count_fn.mzn0000644000175000017500000000056213757304533020560 0ustar kaolkaolinclude "count.mzn"; /** @group globals.counting Returns the number of occurrences of \a y in \a x. */ function var int: count(array[$X] of var int: x, var int: y) ::promise_total = let { var 0..length(x): c::is_defined_var; constraint count(array1d(x),y,c)::defines_var(c); } in c; function int: count(array[$X] of int: x, int: y) = count(i in array1d(x))(i=y); libminizinc-2.5.3/share/minizinc/std/fzn_dtree_enum.mzn0000644000175000017500000000333713757304533021754 0ustar kaolkaolinclude "subgraph.mzn"; predicate fzn_dtree(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = let { set of int: EDGE = index_set(es); array[index_set(ns)] of var 0..length(ns)-1: dist; /* distance from root */ array[index_set(ns)] of var index_set(ns): parent; /* parent */ } in ns[r] /\ % the root must be chosen dist[r] = 0 /\ % root is at distance 0 parent[r] = r /\ % root is its own parent forall(n in index_set(ns)) % nonselected nodes have parent 0 (not ns[n] -> parent[n] = n) /\ forall(n in index_set(ns)) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in index_set(ns)) % each in node except root must have a parent (ns[n] -> (n = r \/ parent[n] != n)) /\ forall(n in index_set(ns)) % each in node with a parent must be in and also its parent (parent[n] != n -> (ns[n] /\ ns[parent[n]])) /\ forall(n in index_set(ns)) % each except with a parent is one more than its parent (parent[n] != n -> dist[n] = dist[parent[n]] + 1) /\ forall(n in index_set(ns)) % each node with a parent must have that edge in (parent[n] != n -> exists(e in EDGE where to[e] = n)(es[e] /\ from[e] = parent[n])) /\ forall(e in EDGE) % each edge must be part of the parent relation (es[e] -> parent[to[e]] = from[e]) /\ sum(e in EDGE)(es[e]) = sum(n in index_set(ns))(ns[n]) - 1 /\ % redundant relationship of trees subgraph(from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_diffn_nonstrict_reif.mzn0000644000175000017500000000074313757304533024021 0ustar kaolkaolpredicate fzn_diffn_nonstrict_reif(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy, var bool: b) = b <-> forall(i,j in index_set(x) where i < j)( dx[i] = 0 \/ dx[j] = 0 \/ dy[i]=0 \/ dy[j]=0 \/ x[i] + dx[i] <= x[j] \/ y[i] + dy[i] <= y[j] \/ x[j] + dx[j] <= x[i] \/ y[j] + dy[j] <= y[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_dpath_int.mzn0000644000175000017500000000047713757304533023301 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_dpath(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = dpath(N,E,from,to,s,t,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); libminizinc-2.5.3/share/minizinc/std/fzn_geost_smallest_bb.mzn0000644000175000017500000000234413757304533023312 0ustar kaolkaolpredicate fzn_geost_smallest_bb( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u ) = % Two useful definitions let { set of int: DIMS = 1..k; set of int: OBJECTS = index_set(kind); } in ( % Posting the geost constraint fzn_geost_bb(k, rect_size, rect_offset, shape, x, kind, l, u) /\ % Posting the smallest bounding box constraints forall(j in DIMS)( % Lower boundary exists(o in OBJECTS, s in dom(kind[o]))( kind[o] = s /\ exists(r in shape[s])( x[o,j] + rect_offset[r,j] == l[j] ) ) /\ % Upper boundary exists(o in OBJECTS, s in dom(kind[o]))( kind[o] = s /\ exists(r in shape[s])( x[o,j] + rect_offset[r,j] + rect_size[r,j] == u[j] ) ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_set.mzn0000644000175000017500000000057213757304533023122 0ustar kaolkaolpredicate fzn_if_then_else_set(array[int] of var bool: c, array[int] of set of int: x, var set of int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/analyse_all_different.mzn0000644000175000017500000000010613757304533023251 0ustar kaolkaolpredicate analyse_all_different(array[int] of var opt int: x) = true; libminizinc-2.5.3/share/minizinc/std/fzn_tree_int.mzn0000644000175000017500000000130613757304533021430 0ustar kaolkaolinclude "subgraph.mzn"; predicate fzn_tree(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = let { array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des; } in /* ensure that the directed edges selected agree with undirected edges */ forall(e in 1..E)(es[e] <-> (des[e] \/ des[e+E])) /\ /* duplicate the edges so that the we can use directed graph reachability */ fzn_dtree(N,2*E,dfrom,dto,r,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_bool.mzn0000644000175000017500000000055713757304533023265 0ustar kaolkaolpredicate fzn_if_then_else_bool(array[int] of var bool: c, array[int] of bool: x, var bool: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/all_different.mzn0000644000175000017500000000206613757304533021544 0ustar kaolkaolinclude "fzn_all_different_int.mzn"; include "fzn_all_different_int_reif.mzn"; include "fzn_all_different_set.mzn"; include "fzn_all_different_set_reif.mzn"; include "analyse_all_different.mzn"; /** @group globals.alldifferent Constrain the array of integers \a x to be all different. */ predicate all_different(array[$X] of var int: x) = analyse_all_different(array1d(x)) /\ fzn_all_different_int(array1d(x)); predicate all_different_reif(array[int] of var int: x, var bool: b) = fzn_all_different_int_reif(x, b); /** @group globals.alldifferent Constrain the array of sets of integers \a x to be all different. */ predicate all_different(array[$X] of var set of int: x) = fzn_all_different_set(array1d(x)); % Synonyms for the above. predicate all_different_reif(array[$X] of var set of int: x, var bool: b) = fzn_all_different_set_reif(array1d(x), b); % Synonyms for the above. predicate alldifferent(array[$X] of var int: x) = all_different(array1d(x)); predicate alldifferent(array[$X] of var set of int: x) = all_different(array1d(x)); libminizinc-2.5.3/share/minizinc/std/lex_less_bool.mzn0000644000175000017500000000134313757304533021574 0ustar kaolkaolinclude "lex_less.mzn"; include "fzn_lex_less_bool.mzn"; include "fzn_lex_less_bool_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_less_bool(array[int] of var bool: x, array[int] of var bool: y) = fzn_lex_less_bool(x, y); predicate lex_lt_bool(array[int] of var bool: x, array[int] of var bool: y) = lex_less(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/cost_mdd.mzn0000644000175000017500000001113013757304533020532 0ustar kaolkaolinclude "fzn_cost_mdd.mzn"; include "fzn_cost_mdd_reif.mzn"; /** @group globals.extensional Requires that \a x defines a path in the cost MDD with total edge weight \a totalcost. @param N: the number of nodes, the root node is node 1 @param level: the level of each node, the root is level 1, T is level \a length(x)+1 @param E: the number of edges @param from: the leaving node (1..\a N)for each edge @param label: the set of value of the x variable for each edge @param cost: the cost for each edge @param to: the entering node for each edge, where 0 = T node @param totalcost: the total cost of the path defined by \a x */ predicate cost_mdd(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % values of variable on edge array[int] of int: cost, % cost of using edge array[int] of int: to, % edge entering node 0..N where 0 = T node var int: totalcost % total cost of path ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of int: levele = array1d(0..N,[L+1]++level); } in assert(index_set(level) = NODE, "cost_mdd: level argument must be of length N = \(N)") /\ assert(level[1] = 1, "cost_mdd: level of root (1) must be 1") /\ forall(n in 2..N)(assert(level[n] != 1, "cost_mdd: level of non root node (\(n)) must not be 1")) /\ assert(index_set(from) = EDGE, "cost_mdd: from argument must be of length E = \(E)") /\ assert(index_set(to) = EDGE, "cost_mdd: to argument must be of length E = \(E)") /\ assert(index_set(label) = EDGE, "cost_mdd: label argument must be of length E = \(E)") /\ assert(index_set(cost) = EDGE, "cost_mdd: cost argument must be of length E = \(E)") /\ forall(e in EDGE)(assert(from[e] in NODE, "cost_mdd: from[\(e)] must be in \(NODE)")) /\ forall(e in EDGE)(assert(to[e] in 0..N, "cost_mdd: to[\(e)] must be in 0..\(N)")) /\ forall(e in EDGE)(assert(level[from[e]]+1 = levele[to[e]], "cost_mdd: mdd level of from[\(e)] = \(level[from[e]])" ++ "must be 1 less than level of to[\(e)] = \(levele[to[e]])")) /\ forall(e1,e2 in EDGE where e1 < e2 /\ from[e1] = from[e2]) (assert(label[e1] intersect label[e2] = {}, "cost_mdd: Two edges \(e1) and \(e2) leaving node \(from[e1]) with overlapping labels")) /\ fzn_cost_mdd(x,N,level,E,from,label,cost,to,totalcost); predicate cost_mdd_reif(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % values of variable on edge array[int] of int: cost, % cost of using edge array[int] of int: to, % edge entering node 0..N where 0 = T node var int: totalcost, % total cost of path var bool: b % reification variable ) = fzn_cost_mdd_reif(x, N, level, E, from, label, cost, to, totalcost, b); % Example consider an MDD over 3 variables % 5 nodes and 8 edges % level 1 root = 1 % level 2 2 3 % level 3 4 5 % level 4 T % with edges (from,label,cost,to) given by % (1,{1,3},3,2), (1,{2},1,3), % (2,{2},4,4), (2,{3},2,5), % (3,{3},3,4), (3,{2},5,5), % (4,{1,5},2,0), % (5,{2,4,6},4,0) % this is defined by the call % cost_mdd([x1,x2,x3],5,[1,2,2,3,3],8,[1,1,2,2,3,3,4,5], % [{1,3},{2},{2},{3},{3},{2},{1,5},{2,4,6}],[3,1,4,2,3,5,2,4],[2,3,4,5,4,5,0,0],tc) libminizinc-2.5.3/share/minizinc/std/seq_precede_chain.mzn0000644000175000017500000000113113757304533022357 0ustar kaolkaolinclude "fzn_seq_precede_chain_int.mzn"; include "fzn_seq_precede_chain_int_reif.mzn"; include "fzn_seq_precede_chain_set.mzn"; include "fzn_seq_precede_chain_set_reif.mzn"; /** @group globals.lexicographic Requires that \a i precedes \a i+1 in the array \a x for all positive \a i. */ predicate seq_precede_chain(array[int] of var int: x) = fzn_seq_precede_chain_int(x); /** @group globals.lexicographic Requires that \a i appears in a set in array \a x before \a i+1 for all positive \a i */ predicate seq_precede_chain(array[int] of var set of int: x) = fzn_seq_precede_chain_set(x); libminizinc-2.5.3/share/minizinc/std/fzn_arg_sort_float_reif.mzn0000644000175000017500000000056013757304533023632 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_arg_sort_float_reif(array[int] of var float:x, array[int] of var int:p, var bool: b) = b <-> ( all_different(p) /\ forall(j in 1..length(x)-1) (x[p[j]] <= x[p[j+1]] /\ (x[p[j]] == x[p[j+1]] -> p[j] < p[j+1])) ); libminizinc-2.5.3/share/minizinc/std/fzn_diffn_reif.mzn0000644000175000017500000000071213757304533021712 0ustar kaolkaolpredicate fzn_diffn_reif(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy, var bool: b) = b <-> forall(i,j in index_set(x) where i < j)( x[i] + dx[i] <= x[j] \/ y[i] + dy[i] <= y[j] \/ x[j] + dx[j] <= x[i] \/ y[j] + dy[j] <= y[i] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_sliding_sum_reif.mzn0000644000175000017500000000154713757304533023150 0ustar kaolkaolpredicate fzn_sliding_sum_reif(int: low, int: up, int: seq, array[int] of var int: vs, var bool: b) = /* CS decomposition: see S. Brand, N. Narodytska, C-G. Quimper, P.J. Stuckey, and T. Walsh. Encodings of the sequence constraint. In C. Bessiere, editor, Proceedings of the 13th International Conference on Principles and Practice of Constraint Programming, volume 4741 of LNCS, pages 210–224. Springer-Verlag, 2007. */ let { int: lx = min(index_set(vs)); int: ux = max(index_set(vs)); array[lx-1..ux] of var int: S; } in S[lx-1] = 0 /\ forall (i in lx .. ux) ( S[i] = vs[i] + S[i-1] ) /\ b <-> forall (i in lx-1 .. ux - seq) ( S[i] <= S[i+seq] - low /\ S[i+seq] <= S[i] + up ); libminizinc-2.5.3/share/minizinc/std/arg_max.mzn0000644000175000017500000000503313757304533020361 0ustar kaolkaolinclude "arg_max_int.mzn"; include "arg_max_bool.mzn"; include "arg_max_float.mzn"; /** @group globals Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_max(array[$$E] of var int: x) = let { constraint length(x) > 0; } in arg_max_total(x); /** @group globals Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_max(array[$$E] of var bool: x) = let { constraint length(x) > 0; } in arg_max_total(x); /** @group globals Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_max(array[$$E] of var float: x) = let { constraint length(x) > 0; } in arg_max_total(x); function var $$E: arg_max_total(array[$$E] of var int: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint maximum_arg_int(x, i); } in i endif; function var $$E: arg_max_total(array[$$E] of var bool: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint maximum_arg_bool(x, i); } in i endif; function var $$E: arg_max_total(array[$$E] of var float: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint maximum_arg_float(x, i); } in i endif; /** @group globals Constrain \a i to be the index of the maximum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate maximum_arg(array[int] of var int: x, var int: i) = maximum_arg_int(x, i); /** @group globals Constrain \a i to be the index of the maximum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate maximum_arg(array[int] of var bool: x, var int: i) = maximum_arg_bool(x, i); /** @group globals Constrain \a i to be the index of the maximum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate maximum_arg(array[int] of var float: x, var int: i) = maximum_arg_float(x, i); libminizinc-2.5.3/share/minizinc/std/fzn_at_most1_reif.mzn0000644000175000017500000000025713757304533022357 0ustar kaolkaolpredicate fzn_at_most1_reif(array[int] of var set of int: s, var bool: b) = b <-> forall(i,j in index_set(s) where i < j) ( card(s[i] intersect s[j]) <= 1 ); libminizinc-2.5.3/share/minizinc/std/among_fn.mzn0000644000175000017500000000052013757304533020523 0ustar kaolkaolinclude "fzn_among.mzn"; /** @group globals.counting Returns the number of variables in \a x that take one of the values in \a v. */ function var int: among(array[int] of var int:x, set of int:v) :: promise_total = let { var 0..length(x): n ::is_defined_var; constraint fzn_among(n,x,v) ::defines_var(n); } in n; libminizinc-2.5.3/share/minizinc/std/fzn_geost_smallest_bb_reif.mzn0000644000175000017500000000251113757304533024313 0ustar kaolkaolinclude "fzn_geost_bb.mzn"; include "fzn_geost_bb_reif.mzn"; predicate fzn_geost_smallest_bb_reif( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u , var bool: b ) = % Two useful definitions let { set of int: DIMS = 1..k; set of int: OBJECTS = index_set(kind); } in b <-> ( % Posting the geost constraint fzn_geost_bb(k, rect_size, rect_offset, shape, x, kind, l, u) /\ % Posting the smallest bounding box constraints forall(j in DIMS)( % Lower boundary exists(o in OBJECTS, s in dom(kind[o]))( kind[o] = s /\ exists(r in shape[s])( x[o,j] + rect_offset[r,j] == l[j] ) ) /\ % Upper boundary exists(o in OBJECTS, s in dom(kind[o]))( kind[o] = s /\ exists(r in shape[s])( x[o,j] + rect_offset[r,j] + rect_size[r,j] == u[j] ) ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_at_most_int_reif.mzn0000644000175000017500000000055513757304533023151 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_most_int_reif(int: n, array[int] of var int: x, int: v, var bool: b) = b <-> count(x,v) <= n; libminizinc-2.5.3/share/minizinc/std/member_int.mzn0000644000175000017500000000055613757304533021071 0ustar kaolkaolinclude "fzn_member_int.mzn"; include "fzn_member_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate member_int(array[int] of var int: x, var int: y) = fzn_member_int(x, y); libminizinc-2.5.3/share/minizinc/std/fzn_arg_sort_int.mzn0000644000175000017500000000041013757304533022304 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_arg_sort_int(array[int] of var int:x, array[int] of var int:p) = all_different(p) /\ forall(j in 1..length(x)-1) (x[p[j]] <= x[p[j+1]] /\ (x[p[j]] == x[p[j+1]] -> p[j] < p[j+1])); libminizinc-2.5.3/share/minizinc/std/partition_set.mzn0000644000175000017500000000045513757304533021632 0ustar kaolkaolinclude "fzn_partition_set.mzn"; include "fzn_partition_set_reif.mzn"; /** @group globals Constrains the sets in array \a S to partition the \a universe. */ predicate partition_set(array[int] of var set of int: S, set of int: universe) = fzn_partition_set(S, universe); libminizinc-2.5.3/share/minizinc/std/fzn_count_eq.mzn0000644000175000017500000000032413757304533021433 0ustar kaolkaolpredicate fzn_count_eq(array[int] of var int: x, var int: y, var int: c) = c = sum(i in index_set(x)) ( bool2int(x[i] == y) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_cumulative_opt_reif.mzn0000644000175000017500000000420413757304533023664 0ustar kaolkaolpredicate fzn_cumulative_opt_reif(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in if 0==card(Tasks) then bb <-> ( 0==card(index_set(s)) \/ b>=0 ) else let { int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( if late - early > 5000 then fzn_cumulative_opt_task_reif(s, d, r, b, bb) else fzn_cumulative_opt_time_reif(s, d, r, b, bb) endif ) endif ; predicate fzn_cumulative_opt_time_reif(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 }, int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( bb <-> forall( t in early..late ) ( b >= sum( i in Tasks ) ( bool2int(occurs(s[i]) /\ deopt(s[i]) <= t /\ t < deopt(s[i]) + d[i]) * r[i] ) ) ); predicate fzn_cumulative_opt_task_reif(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in ( bb <-> forall( j in Tasks ) ( occurs(s[j]) -> b >= r[j] + sum( i in Tasks where i != j ) ( bool2int(occurs(s[i]) /\ deopt(s[i]) <= deopt(s[j]) /\ deopt(s[j]) < deopt(s[i]) + d[i] ) * r[i] ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_count_lt_par.mzn0000644000175000017500000000031413757304533022306 0ustar kaolkaolinclude "fzn_count_lt.mzn"; predicate fzn_count_lt_par(array[int] of var int: x, int: y, int: c) = fzn_count_lt(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_piecewise_linear.mzn0000644000175000017500000000242513757304533023131 0ustar kaolkaol/* * Function fzn_piecewise_linear_base creates * interval representation of x, * which is reusable if we have several pwls * on the same set of breakpoints */ function array[int, int] of var 0.0..1.0: fzn_piecewise_linear_base( var float: x, array[int] of float: xi) ::promise_total = let { set of int: is = index_set(xi), set of int: is_1 = is diff { max(is) }, array[is_1] of var 0.0..1.0: s, %% Segment variables array[is_1] of var 0..1: f, constraint 1 == sum(f), constraint forall(i in is_1)(f[i] >= s[i]), constraint x == sum(i in is_1)(xi[i] * f[i] + (xi[i+1]-xi[i]) * s[i]), } in array2d(1..2, is_1, f++s); predicate fzn_piecewise_linear(var float: x, var float: y, array[int] of float: xi, array[int] of float: vi) = let { set of int: is = index_set(xi), constraint assert(is == index_set(vi) /\ 0 ( sum(load) = sum(w) /\ forall( i in index_set(bin) ) ( min(index_set(load)) <= bin[i] /\ bin[i] <= max(index_set(load)) ) /\ forall( assigned_bin in index_set(load) ) ( load[assigned_bin] = sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] = assigned_bin ) ) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_neq_reif.mzn0000644000175000017500000000060113757304533022614 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_neq_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = let { var int: z = count(x,y) } in b <-> z != c; % This needs to be written with a let rather than count(x,y) != c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_nvalue_reif.mzn0000644000175000017500000000041013757304533022111 0ustar kaolkaolpredicate fzn_nvalue_reif(var int: n, array[int] of var int: x, var bool: b) = let { int: lx = lb_array(x), int: ux = ub_array(x), } in b <-> n == sum(j in lx..ux) ( bool2int(exists(i in index_set(x)) ( x[i] = j )) ); libminizinc-2.5.3/share/minizinc/std/at_most1.mzn0000644000175000017500000000070413757304533020472 0ustar kaolkaolinclude "fzn_at_most1.mzn"; include "fzn_at_most1_reif.mzn"; /** @group globals.counting Requires that each pair of sets in \a s overlap in at most one element. */ predicate at_most1(array[$X] of var set of int: s) = fzn_at_most1(array1d(s)); predicate at_most1_reif(array[$X] of var set of int: s, var bool: b) = fzn_at_most1_reif(array1d(s), b); % Synonym for the above. predicate atmost1(array[$X] of var set of int: s) = at_most1(s); libminizinc-2.5.3/share/minizinc/std/global_cardinality.mzn0000644000175000017500000000110013757304533022555 0ustar kaolkaolinclude "fzn_global_cardinality.mzn"; include "fzn_global_cardinality_reif.mzn"; /** @group globals.counting Requires that the number of occurrences of \a cover[\p i] in \a x is \a counts[\p i]. */ predicate global_cardinality(array[$X] of var int: x, array[$Y] of int: cover, array[$Y] of var int: counts) = assert(index_sets_agree(cover, counts), "global_cardinality: cover and counts must have identical index sets", fzn_global_cardinality(array1d(x), array1d(cover), array1d(counts)) ); libminizinc-2.5.3/share/minizinc/std/fzn_regular_set.mzn0000644000175000017500000000143513757304533022136 0ustar kaolkaolpredicate fzn_regular(array[int] of var int: x, int: Q, set of int: S, array[int,int] of int: d, int: q0, set of int: F) = let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)), int: n = max(index_set(x)) + 1, array[m..n] of var 1..Q: a } in a[m] = q0 /\ % Set a[0]. forall(i in index_set(x)) ( x[i] in S /\ % Do this in case it's a var. a[i+1] = d[a[i], x[i]] % Determine a[i+1]. ) /\ a[n] in F; % Check the final state is in F. libminizinc-2.5.3/share/minizinc/std/fzn_subgraph_enum.mzn0000644000175000017500000000051213757304533022454 0ustar kaolkaolpredicate fzn_subgraph(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = forall(e in index_set(from)) ( (es[e] -> ns[from[e]]) /\ (es[e] -> ns[to[e]]) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_piecewise_linear_reif.mzn0000644000175000017500000000053413757304533024135 0ustar kaolkaolpredicate fzn_piecewise_linear_reif(var float: x, var float: y, array[int] of float: xi, array[int] of float: vi, var bool: b) = abort("Reified piecewise_linear constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/value_precede_int.mzn0000644000175000017500000000027313757304533022421 0ustar kaolkaolinclude "fzn_value_precede_int.mzn"; include "fzn_value_precede_int_reif.mzn"; predicate value_precede_int(int: s, int: t, array[int] of var int: x) = fzn_value_precede_int(s, t, x);libminizinc-2.5.3/share/minizinc/std/fzn_increasing_bool.mzn0000644000175000017500000000056613757304533022763 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_bool(array[int] of var bool: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/lex_greater.mzn0000644000175000017500000000242313757304533021244 0ustar kaolkaolinclude "lex_less.mzn"; /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically greater than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greater(array[int] of var bool: x, array[int] of var bool: y) = lex_less(y, x); /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically greater than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greater(array[int] of var int: x, array[int] of var int: y) = lex_less(y, x); /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically greater than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greater(array[int] of var float: x, array[int] of var float: y) = lex_less(y, x); /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically greater than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greater(array[int] of var set of int: x, array[int] of var set of int: y) = lex_less(y, x); libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_float.mzn0000644000175000017500000000057013757304533023112 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_float(array[int] of var float: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_alldifferent_except_reif.mzn0000644000175000017500000000032113757304533024627 0ustar kaolkaolpredicate fzn_alldifferent_except_reif(array[int] of var int: vs,set of int: S, var bool: b) = b <-> forall(i, j in index_set(vs) where i < j) ( (vs[i] in S /\ vs[j] in S) \/ vs[i] != vs[j] ); libminizinc-2.5.3/share/minizinc/std/redefinitions.mzn0000644000175000017500000000013513757304533021603 0ustar kaolkaol% This file contains redefinitions of standard builtins that can be overridden % by solvers. libminizinc-2.5.3/share/minizinc/std/fzn_diffn_k.mzn0000644000175000017500000000150713757304533021222 0ustar kaolkaolpredicate fzn_diffn_k(array[int,int] of var int: box_posn, array[int,int] of var int: box_size) = let { set of int: DIMS= index_set_2of2(box_posn) } in forall(b1, b2 in index_set_1of2(box_posn) where b1 < b2) (fzn_diffn_nonoverlap_k([ box_posn[b1,j] | j in DIMS ], [ box_size[b1,j] | j in DIMS ], [ box_posn[b2,j] | j in DIMS ], [ box_size[b2,j] | j in DIMS ] ) ); predicate fzn_diffn_nonoverlap_k(array[int] of var int: x1, array[int] of var int: w1, array[int] of var int: x2, array[int] of var int: w2) = exists(j in index_set(x1)) (x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j]); libminizinc-2.5.3/share/minizinc/std/decreasing_set.mzn0000644000175000017500000000055313757304533021724 0ustar kaolkaolinclude "fzn_decreasing_set.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate decreasing_set(array[int] of var set of int: x) = fzn_decreasing_set(x); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_float.mzn0000644000175000017500000000056213757304533023433 0ustar kaolkaolpredicate fzn_if_then_else_float(array[int] of var bool: c, array[int] of float: x, var float: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_subgraph_int.mzn0000644000175000017500000000051713757304533022307 0ustar kaolkaolpredicate fzn_subgraph(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of var bool: ns, array[int] of var bool: es) = forall(e in 1..E) ( (es[e] -> ns[from[e]]) /\ (es[e] -> ns[to[e]]) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/arg_min_bool.mzn0000644000175000017500000000036613757304533021376 0ustar kaolkaolinclude "fzn_arg_min_bool.mzn"; predicate minimum_arg_bool(array[int] of var bool: x, var int: i) = fzn_minimum_arg_bool(x, i); predicate minimum_arg_bool_reif(array[int] of var bool: x, var int: i, var bool: b) = b <-> i=arg_min(x); libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_strict.mzn0000644000175000017500000000042313757304533023535 0ustar kaolkaolpredicate fzn_disjunctive_strict(array[int] of var int: s, array[int] of var int: d) = forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i s=y; libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_low_up_closed.mzn0000644000175000017500000000077313757304533026367 0ustar kaolkaolpredicate fzn_global_cardinality_low_up_closed(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound) = forall(i in index_set(x))( x[i] in { d | d in array2set(cover) } ) /\ global_cardinality_low_up(x, cover, lbound, ubound) /\ % Implied condition length(x) in sum(lbound)..sum(ubound); include "global_cardinality_low_up.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_strict_reif.mzn0000644000175000017500000000054513757304533024547 0ustar kaolkaolpredicate fzn_disjunctive_strict_reif(array[int] of var int: s, array[int] of var int: d, var bool: b) = b <-> ( forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i i <= j) /\ % lower bound d[l] = (x[l] = uy) /\ forall(j in l+1..u)(d[j] <-> (d[j-1] \/ (x[j] = uy))) /\ forall(j in l..u)(not d[j] -> i >= j+1) % upper bound else let { float: ly = lb_array(x); array[l..u] of var ly..uy: y; array[l..u] of var l..u: mi; } in y[l] = x[l] /\ mi[l] = l /\ i = mi[u] /\ forall (j in l+1 .. u) ( y[j] == max(x[j],y[j-1]) /\ mi[j] = if y[j-1] >= x[j] then mi[j-1] else j endif ) endif; libminizinc-2.5.3/share/minizinc/std/fzn_diffn.mzn0000644000175000017500000000064213757304533020707 0ustar kaolkaolpredicate fzn_diffn(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy) = forall(i,j in index_set(x) where i < j)( x[i] + dx[i] <= x[j] \/ y[i] + dy[i] <= y[j] \/ x[j] + dx[j] <= x[i] \/ y[j] + dy[j] <= y[i] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_different_int.mzn0000644000175000017500000000052613757304533023272 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate fzn_all_different_int(array[int] of var int: x) = forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_opt.mzn0000644000175000017500000000053513757304533023033 0ustar kaolkaolpredicate fzn_disjunctive_opt(array[int] of var opt int: s, array[int] of var int: d) = forall (i,j in index_set(d) where i exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/fzn_mdd_reif.mzn0000644000175000017500000000462413757304533021376 0ustar kaolkaolpredicate fzn_mdd_reif(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % value of variable array[int] of int: to, % edge entering node 0..N where 0 = T node var bool: b % reification value ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of var bool: bn; array[EDGE] of var bool: be; set of int: D = dom_array(x); } in (b <-> bn[0]) /\ % true node is result bn[1] /\ % root is always true % T1 each node except the true enforces an outgoing edge forall(n in NODE)(bn[n] -> (exists(e in EDGE where from[e] = n)(be[e]) \/ b = 0)) /\ % T23 each edge enforces its endpoints forall(e in EDGE)((be[e] -> bn[from[e]]) /\ (be[e] -> bn[to[e]])) /\ % T4 each edge enforces its label forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ % P1 each node enforces its outgoing edges forall(e in EDGE)(bn[from[e]] /\ x[level[from[e]]] in label[e] -> be[e]) /\ % P2 each node except the root enforces an incoming edge (bn[0] -> exists(e in EDGE where to[e] = 0)(be[e])) /\ forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ % P3 each label has a support, either an edge or to give false forall(i in 1..L, d in D) (x[i] = d -> forall(n in NODE where level[n] = i, e in EDGE where from[e] = n /\ d in label[e]) (bn[n] -> be[e]) /\ forall(n in NODE where level[n] = i /\ not exists(e in EDGE where from[e] = n) (d in label[e])) (bn[n] -> b = 0)) /\ % P4 at most one node at every level is true (redundant) forall(i in 1..L) (sum(n in NODE where level[n] = i)(bn[n]) <= 1); libminizinc-2.5.3/share/minizinc/std/fzn_circuit_reif.mzn0000644000175000017500000000031013757304533022260 0ustar kaolkaolpredicate fzn_circuit_reif(array[int] of var int: x, var bool: b) = abort("Reified circuit/1 is not supported."); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_int_reif.mzn0000644000175000017500000000031113757304533024274 0ustar kaolkaolpredicate fzn_value_precede_int_reif(int: s, int: t, array[int] of var int: x, var bool: b) = abort("Reified value_precede/3 for integers is not supported."); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_opt_float.mzn0000644000175000017500000000060613757304533025164 0ustar kaolkaolpredicate fzn_if_then_else_var_opt_float(array[int] of var bool: c, array[int] of var opt float: x, var opt float: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_increasing_float_reif.mzn0000644000175000017500000000062013757304533024131 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_float_reif(array[int] of var float: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/decreasing_float.mzn0000644000175000017500000000055213757304533022235 0ustar kaolkaolinclude "fzn_decreasing_float.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate decreasing_float(array[int] of var float: x) = fzn_decreasing_float(x); libminizinc-2.5.3/share/minizinc/std/fzn_dpath_enum_reif.mzn0000644000175000017500000000051213757304533022746 0ustar kaolkaolpredicate fzn_dpath_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dpath constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_bool.mzn0000644000175000017500000000056613757304533022745 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_bool(array[int] of var bool: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_increasing_int.mzn0000644000175000017500000000056413757304533022620 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_int(array[int] of var int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_increasing_set_reif.mzn0000644000175000017500000000062313757304533023622 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_set_reif(array[int] of var set of int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_member_int.mzn0000644000175000017500000000050313757304533021736 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_int(array[int] of var int: x, var int: y) = exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/symmetric_all_different.mzn0000644000175000017500000000103513757304533023633 0ustar kaolkaolinclude "analyse_all_different.mzn"; include "fzn_symmetric_all_different.mzn"; include "fzn_symmetric_all_different_reif.mzn"; /** @group globals.alldifferent Requires the array of integers \a x to be all different, and for all \p i, \a x[\p i]=j \(\rightarrow\) \a x[\p j]=\p i. */ predicate symmetric_all_different(array[int] of var int:x) = analyse_all_different(x) /\ fzn_symmetric_all_different(x); predicate symmetric_all_different_reif(array[int] of var int:x, var bool: b) = fzn_symmetric_all_different_reif(x,b); libminizinc-2.5.3/share/minizinc/std/fzn_dwst_reif.mzn0000644000175000017500000000052213757304533021604 0ustar kaolkaolpredicate fzn_dwst_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: es, var int: K, var bool: b) = abort("Reified dwst constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/at_most_int.mzn0000644000175000017500000000077713757304533021275 0ustar kaolkaolinclude "fzn_at_most_int.mzn"; include "fzn_at_most_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate at_most_int(int: n, array[int] of var int: x, int: v) = fzn_at_most_int(n, x, v); predicate at_most_int_reif(int: n, array[int] of var int: x, int: v, var bool: b) = fzn_at_most_int_reif(n, x, v, b); libminizinc-2.5.3/share/minizinc/std/fzn_member_float.mzn0000644000175000017500000000051113757304533022250 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_float(array[int] of var float: x, var float: y) = exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/disjunctive_strict.mzn0000644000175000017500000000117413757304533022664 0ustar kaolkaolinclude "fzn_disjunctive_strict.mzn"; include "fzn_disjunctive_strict_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s and durations \a d do not overlap in time. Tasks with duration 0 CANNOT be scheduled at any time, but only when no other task is running. Assumptions: - forall \p i, \a d[\p i] >= 0 */ predicate disjunctive_strict(array[int] of var int: s, array[int] of var int: d) = assert(index_set(s) == index_set(d), "disjunctive: the array arguments must have identical index sets", fzn_disjunctive_strict(s,d) ); libminizinc-2.5.3/share/minizinc/std/fzn_increasing_bool_reif.mzn0000644000175000017500000000061613757304533023764 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_bool_reif(array[int] of var bool: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/at_least_set.mzn0000644000175000017500000000104213757304533021406 0ustar kaolkaolinclude "fzn_at_least_set.mzn"; include "fzn_at_least_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate at_least_set(int: n, array[int] of var set of int: x, set of int: v) = fzn_at_least_set(n, x, v); predicate at_least_set_reif(int: n, array[int] of var set of int: x, set of int: v, var bool: b) = fzn_at_least_set_reif(n, x, v, b); libminizinc-2.5.3/share/minizinc/std/at_least_int.mzn0000644000175000017500000000100613757304533021405 0ustar kaolkaolinclude "fzn_at_least_int.mzn"; include "fzn_at_least_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate at_least_int(int: n, array[int] of var int: x, int: v) = fzn_at_least_int(n, x, v); predicate at_least_int_reif(int: n, array[int] of var int: x, int: v, var bool: b) = fzn_at_least_int_reif(n, x, v, b); libminizinc-2.5.3/share/minizinc/std/cost_regular.mzn0000644000175000017500000000327413757304533021441 0ustar kaolkaolinclude "fzn_cost_regular.mzn"; include "fzn_cost_regular_reif.mzn"; /** @group globals.extensional The sequence of values in array \a x (which must all be in the range 1..\a S) is accepted by the DFA of \a Q states with input 1..\a S and transition function \a d (which maps (1..\a Q, 1..\a S) -> 0..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). We reserve state 0 to be an always failing state. Each edge has an associated cost \a c, and \a C is the sum of costs taken on the accepting path for \a x. */ predicate cost_regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F, array[int,int] of int: c, var int: C) = assert(Q > 0, "cost_regular: 'Q' must be greater than zero", assert(S > 0, "cost_regular: 'S' must be greater than zero", assert(index_set_1of2(d) = 1..Q /\ index_set_2of2(d) == 1..S, "cost_regular: the transition function 'd' must be [1..Q,1..S]", assert(index_set_1of2(c) = 1..Q /\ index_set_2of2(c) == 1..S, "cost_regular: the transition cost function 'c' must be [1..Q,1..S]", assert(forall([d[i, j] in 0..Q | i in 1..Q, j in 1..S]), "cost_regular: transition function 'd' points to states outside 0..Q", % Nb: we need the parentheses around the expression otherwise the % parser thinks it's a generator call! assert((q0 in 1..Q), "cost_regular: start state 'q0' not in 1..Q", assert(F subset 1..Q, "cost_regular: final states in 'F' contain states outside 1..Q", fzn_cost_regular(x,Q,S,d,q0,F,c,C) ))))))); libminizinc-2.5.3/share/minizinc/std/fzn_dsteiner_reif.mzn0000644000175000017500000000057113757304533022444 0ustar kaolkaolpredicate fzn_dsteiner_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var int: K, var bool: b) = abort("Reified steiner constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_regular_nfa.mzn0000644000175000017500000000144513757304533022110 0ustar kaolkaolpredicate fzn_regular_nfa(array[int] of var int: x, int: Q, int: S, array[int,int] of set of int: d, int: q0, set of int: F) = let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)), int: n = max(index_set(x)) + 1, array[m..n] of var 1..Q: a } in a[m] = q0 /\ % Set a[0]. forall(i in index_set(x)) ( x[i] in 1..S /\ % Do this in case it's a var. a[i+1] in d[a[i], x[i]] % Determine a[i+1]. ) /\ a[n] in F; % Check the final state is in F. libminizinc-2.5.3/share/minizinc/std/fzn_exactly_int.mzn0000644000175000017500000000052513757304533022144 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_exactly_int(int: n, array[int] of var int: x, int: v) = n == count(x, v); libminizinc-2.5.3/share/minizinc/std/count_geq.mzn0000644000175000017500000000165013757304533020730 0ustar kaolkaolinclude "fzn_count_geq_par.mzn"; include "fzn_count_geq.mzn"; include "fzn_count_geq_par_reif.mzn"; include "fzn_count_geq_reif.mzn"; /** @group globals.counting Constrains \a c to be greater than or equal to the number of occurrences of \a y in \a x. */ predicate count_geq(array[$X] of var int: x, var int: y, var int: c) = fzn_count_geq(array1d(x),y,c); /** @group globals.counting Constrains \a c to be greater than or equal to the number of occurrences of \a y in \a x. */ predicate count_geq(array[$X] of var int: x, int: y, int: c) = fzn_count_geq_par(array1d(x),y,c); predicate count_geq_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_geq_reif(array1d(x),y,c,b); predicate count_geq_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_geq_par_reif(array1d(x),y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/nosets.mzn0000644000175000017500000003523613757304533020266 0ustar kaolkaol%%% Inclusion of this file eliminates set variables by converting them into arrays of var bool. % AUTHORS % Guido Tack % Gleb Belov % predicate mzn_reverse_map_var(var set of int: x) = let { array[int] of var bool: b = set2bools(x) } in true; function var set of int: reverse_map_ab2si(array[int] of var bool: b); function set of int: reverse_map_ab2si(array[int] of bool: b) ::promise_total = { i | i in index_set(b) where b[i] }; array[int] of var bool: set2bools(var set of int: x) ::promise_total = if is_fixed(x) then set2bools(fix(x)) else let { array[int] of var bool: b = array1d( min(ub(x))..max(ub(x)), [ set2bools_bit( x, i ) | i in min(ub(x))..max(ub(x)) ] ); constraint (x = reverse_map_ab2si(b)) :: is_reverse_map; } in b endif; array[int] of var bool: set2bools(var set of int: x, set of int: ubx) ::promise_total = if is_fixed(x) then set2bools(fix(x), ubx) else let { array[int] of var bool: b0 = set2bools( x ); %% Call in any case ?? TODO array[int] of var bool: b = array1d( min(ubx)..max(ubx), [ if i in ubx then set2bools_bit( x, i ) else false endif | i in min(ubx)..max(ubx) ] ); } in b endif; array[int] of bool: set2bools(set of int: x) ::promise_total = array1d(min(x)..max(x),[i in x | i in min(x)..max(x)]); array[int] of bool: set2bools(set of int: x, set of int: ubx) ::promise_total = array1d(min(ubx)..max(ubx),[i in x | i in min(ubx)..max(ubx)]); function var bool: set2bools_bit( var set of int: x, int: i ) ::promise_total = if i in ub(x) then let { var bool: bi; } in bi else false endif; predicate set_eq(var set of int: x, var set of int: y) ::promise_total = if not has_ub_set(x) /\ not has_ub_set(y) then assert(false, "set_eq: cannot determine bounds of set variables") elseif not has_ub_set(x) then set_eq(y,x) else let { constraint y subset x, %% Constrain domains first constraint x subset y, } in let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in forall (i in index_set(bx) union index_set(by)) ( if not (i in index_set(bx)) then not by[i] %% Should be impossible elseif not (i in index_set(by)) then not bx[i] else bx[i]=by[i] endif ) endif; predicate set_eq_reif(var set of int: x, var set of int: y, var bool: b) ::promise_total = if is_fixed(b) then if true==fix(b) then x==y else x!=y endif else let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in b <-> forall (i in index_set(bx) union index_set(by)) ( if not (i in index_set(bx)) then not by[i] elseif not (i in index_set(by)) then not bx[i] else bx[i]=by[i] endif ) endif; predicate set_eq_imp(var set of int: x, var set of int: y, var bool: b) = if is_fixed(b) then if fix(b) then (x = y) else true endif else let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in b -> forall (i in index_set(bx) union index_set(by)) ( if not (i in index_set(bx)) then not by[i] elseif not (i in index_set(by)) then not bx[i] else bx[i]=by[i] endif ) endif; predicate set_ne(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in exists (i in index_set(bx) union index_set(by)) ( if not (i in index_set(bx)) then by[i] elseif not (i in index_set(by)) then bx[i] else bx[i]!=by[i] endif ); predicate set_ne_reif(var set of int: x, var set of int: y, var bool: b) ::promise_total = set_eq_reif( x, y, not b ); predicate set_ne_imp(var set of int: x, var set of int: y, var bool: b) = if is_fixed(b) then if fix(b) then (x != y) else true endif else let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in b -> exists (i in index_set(bx) union index_set(by)) ( if not (i in index_set(bx)) then by[i] elseif not (i in index_set(by)) then bx[i] else (bx[i] != by[i]) endif ) endif; % Set comparisons are often used just to avoid symmetries. predicate set_le(var set of int: x, var set of int: y) = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (xb[u] -> yb[u]); } in b[l]; predicate set_le_reif(var set of int: x, var set of int: y, var bool: r) = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (xb[u] -> yb[u]); } in r <-> b[l]; predicate set_le_imp(var set of int: x, var set of int: y, var bool: r) = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (xb[u] -> yb[u]); } in r -> b[l]; predicate set_lt(var set of int: x, var set of int: y) ::promise_total = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (not xb[u] /\ yb[u]); } in b[l]; predicate set_lt_reif(var set of int: x, var set of int: y, var bool: r) ::promise_total = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (not xb[u] /\ yb[u]); } in r <-> b[l]; predicate set_lt_imp(var set of int: x, var set of int: y, var bool: r) ::promise_total = let { set of int: U = ub(x) union ub(y); int: l = min(U); int: u = max(U); array[l..u] of var bool: xb = array1d(l..u, [i in x | i in l..u]); var l-1..u: xmax = max(x union {l-1}); array[l..u] of var bool: yb = array1d(l..u, [i in y | i in l..u]); var l-1..u: ymax = max(y union {l-1}); array[l..u] of var bool: b; constraint forall(i in l..u-1) ( b[i] = let {var 1..4: cmp = 2*xb[i] + yb[i] + 1} in [b[i+1], xmax < i, ymax > i, b[i+1]][cmp] ); constraint b[u] = (not xb[u] /\ yb[u]); } in r -> b[l]; predicate set_subset(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in forall (i in index_set(bx)) ( if not (i in index_set(by)) then not bx[i] else bx[i] -> by[i] endif ); predicate set_subset_reif(var set of int: x, var set of int: y, var bool: b) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in b <-> forall (i in index_set(bx)) ( if not (i in index_set(by)) then not bx[i] else bx[i] -> by[i] endif ); predicate set_subset_imp(var set of int: x, var set of int: y, var bool: b) = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); } in b -> forall (i in index_set(bx)) ( if not (i in index_set(by)) then not bx[i] else bx[i] -> by[i] endif ); %%% Map the subset operation to superset predicate set_superset(var set of int: x, var set of int: y) ::promise_total = set_subset( y, x ); predicate set_superset_reif(var set of int: x, var set of int: y, var bool: b) ::promise_total = set_subset_reif( y, x, b ); predicate set_superset_imp(var set of int: x, var set of int: y, var bool: b) = set_subset_imp(y,x,b); function var set of int: set_intersect(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); var set of (index_set(bx) intersect index_set(by)): z; array[int] of var bool: bz = set2bools(z); constraint forall (i in index_set(bz)) ( bz[i] = (bx[i] /\ by[i]) ); } in z; function var set of int: set_union(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); var set of (index_set(bx) union index_set(by)): z; array[int] of var bool: bz = set2bools(z); constraint forall (i in index_set(bx) union index_set(by)) ( if (i in index_set(bx)) then if (i in index_set(by)) then bz[i] = (bx[i] \/ by[i]) else bz[i] = bx[i] endif else bz[i] = by[i] endif ); } in z; function var set of int: set_diff(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); var set of ub(x) diff lb(y): z; array[int] of var bool: bz = set2bools(z); constraint forall (i in ub(z)) ( bz[i] = (bx[i] /\ (not by[i])) ); } in z; function var set of int: set_symdiff(var set of int: x, var set of int: y) ::promise_total = let { array[int] of var bool: bx = set2bools(x); array[int] of var bool: by = set2bools(y); var set of (ub(x) diff lb(y)) union (ub(y) diff lb(x)): z; array[int] of var bool: bz = set2bools(z); constraint forall (i in ub(z)) ( bz[i] = (bx[i] xor by[i]) ); } in z; predicate set_card(var set of int: x, var int: c) = let { array[int] of var bool: bx = set2bools(x); } in bool_lin_eq([1 | i in index_set(bx)],[bx[i] | i in index_set(bx)],c); predicate set_in(int: x, var set of int: y) ::promise_total = let { array[int] of var bool: by = set2bools(y); } in by[x]; predicate set_in(var int: x, var set of int: y) ::promise_total = let { array[int] of var bool: by = set2bools(y); } in by[x]; predicate set_in_reif(int: x, var set of int: y, var bool: b) ::promise_total = if x in ub(y) then b <-> set2bools(y)[x] else not b endif; predicate set_in_reif(var int: x, var set of int: y, var bool: b) ::promise_total = b <-> set2bools(y)[x]; predicate set_in_imp(var int: x, var set of int: y, var bool: b) = b -> set2bools(y)[x]; function array[int] of var bool: setarray2bools(array[int] of var set of int: x) = if length(x)=0 then [] else set2bools(x[1])++setarray2bools([x[i]|i in 2..length(x)]) endif; %% Par version no sense predicate array_var_set_element(var int: x, array[int] of var set of int: y, var set of int: z) ::promise_total = let { constraint x in { i | i in index_set( y ) where lb(y[i]) subset ub(z) /\ lb(z) subset ub(y[i]) }; set of int: sUB = array_union( [ ub(y[i]) | i in dom(x) ] ); set of int: sLB = array_intersect( [ lb(y[i]) | i in dom(x) ] ); constraint z subset sUB, constraint sLB subset z, } in forall (k in ub(z)) ( set2bools(z)[k] == if k in sUB then if k in sLB then true else array1d( lb(x)..ub(x), [ if k in ub(y[i]) then set2bools(y[i])[k] else false endif | i in lb(x)..ub(x) ] )[x] endif else false endif ) /\ forall (k in sUB diff ub(z))( if k in sLB then false %% fail the constraint else not array1d( lb(x)..ub(x), [ if k in ub(y[i]) then set2bools(y[i])[k] else false endif | i in lb(x)..ub(x) ] )[x] endif ); predicate array_set_element(var int: x, array[int] of set of int: y, var set of int: z) ::promise_total = let { constraint x in { i | i in index_set( y ) where y[i] subset ub(z) /\ lb(z) subset y[i] }; set of int: sUB = array_union( [ y[i] | i in dom(x) ] ); set of int: sLB = array_intersect( [ y[i] | i in dom(x) ] ); constraint z subset sUB, constraint sLB subset z, } in forall (k in ub(z)) ( set2bools(z)[k] == if k in sUB then if k in sLB then true else array1d( lb(x)..ub(x), [ if k in ub(y[i]) then set2bools(y[i])[k] else false endif | i in lb(x)..ub(x) ] )[x] endif else false endif ) /\ forall (k in sUB diff ub(z))( if k in sLB then false %% fail the constraint else not array1d( lb(x)..ub(x), [ if k in ub(y[i]) then set2bools(y[i])[k] else false endif | i in lb(x)..ub(x) ] )[x] endif ); annotation set_search(array[$X] of var set of int: x, ann: a1, ann: a2, ann: a3) = let { array[int] of var set of int: xx = array1d(x) } in seq_search( [ bool_search(set2bools(xx[i]),a1,a2,a3) | i in index_set(xx) ] ); annotation warm_start( array[int] of var set of int: x, array[int] of set of int: v ) = warm_start_array( [ let { array[int] of var bool: xb = set2bools(x[i]), set of int: is_var = ub(x[i]) diff lb(x[i]), int: iV = i - min(index_set(x)) + if 0 ( forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/piecewise_linear.mzn0000644000175000017500000000137313757304533022255 0ustar kaolkaolinclude "fzn_piecewise_linear.mzn"; include "fzn_piecewise_linear_reif.mzn"; /** @group globals Return a piecewise-linear interpolation of the given point sequence as a function of \a x */ function var float: piecewise_linear(var float: x, array[int] of float: xi, array[int] of float: vi) ::promise_total = let { var float: res, constraint piecewise_linear(x,res,xi,vi), } in res; /** @group globals Constrains \a y(\a x) to be a piecewise-linear interpolation of the provided point sequence. */ predicate piecewise_linear(var float: x, var float: y, array[int] of float: xi, array[int] of float: vi) = fzn_piecewise_linear(x, y, xi, vi); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_float_reif.mzn0000644000175000017500000000200613757304533023625 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_float_reif(array[int] of var float: x, array[int] of var float: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_reif.mzn0000644000175000017500000000062013757304533024445 0ustar kaolkaolinclude "count.mzn"; predicate fzn_global_cardinality_reif(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts, var bool: b) = b <-> ( forall(i in index_set(cover))( count(x, cover[i], counts[i]) ) /\ % Implied constraint length(x) >= sum(counts) ); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_opt_int.mzn0000644000175000017500000000060013757304533024643 0ustar kaolkaolpredicate fzn_if_then_else_var_opt_int(array[int] of var bool: c, array[int] of var opt int: x, var opt int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_arg_sort_int_reif.mzn0000644000175000017500000000053713757304533023323 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_arg_sort_int_reif(array[int] of var int:x, array[int] of var int:p, var bool:b) = b <-> ( all_different(p) /\ forall(j in 1..length(x)-1) (x[p[j]] <= x[p[j+1]] /\ (x[p[j]] == x[p[j+1]] -> p[j] < p[j+1])) ); libminizinc-2.5.3/share/minizinc/std/fzn_bin_packing.mzn0000644000175000017500000000060013757304533022057 0ustar kaolkaolpredicate fzn_bin_packing(int: c, array[int] of var int: bin, array[int] of int: w) = forall( b in lb_array(bin)..ub_array(bin) ) ( c >= sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] == b ) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_set.mzn0000644000175000017500000000207113757304533022636 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_set(array[int] of var set of int: x, array[int] of var set of int: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_int_reif.mzn0000644000175000017500000000061513757304533023604 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_strictly_decreasing_int.mzn0000644000175000017500000000055113757304533024533 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict decreasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_decreasing_int(array[int] of var int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] > x[i]); libminizinc-2.5.3/share/minizinc/std/alldifferent_except.mzn0000644000175000017500000000075613757304533022761 0ustar kaolkaolinclude "fzn_alldifferent_except.mzn"; include "fzn_alldifferent_except_reif.mzn"; /** @group globals.alldifferent Constrain the array of integers \a vs to be all different except those elements that appear in the set \a S. */ predicate alldifferent_except(array[$X] of var int: vs, set of int: S) = fzn_alldifferent_except(array1d(vs),S); predicate alldifferent_except_reif(array[$X] of var int: vs, set of int: S, var bool: b) = fzn_alldifferent_except_reif(array1d(vs),S,b); libminizinc-2.5.3/share/minizinc/std/fzn_mdd_nondet_reif.mzn0000644000175000017500000000327613757304533022747 0ustar kaolkaolpredicate fzn_mdd_nondet_reif(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % value of variable array[int] of int: to, % edge entering node 0..N where 0 = T node var bool: b % reification value ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of var bool: bn; array[EDGE] of var bool: be; set of int: D = dom_array(x); } in bn[0] /\ % true node is true (b <-> bn[1]) /\ % root gives truth value % T1 each node except the root enforces an outgoing edge forall(n in NODE)(bn[n] -> exists(e in EDGE where from[e] = n)(be[e])) /\ % T23 each edge enforces its endpoints forall(e in EDGE)((be[e] -> bn[from[e]]) /\ (be[e] -> bn[to[e]])) /\ % T4 each edge enforces its label forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ % P2 each node except the root enforces an incoming edge exists(e in EDGE where to[e] = 0)(be[e]) /\ forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ % P3 each label has a support forall(i in 1..L, d in D) (x[i] = d -> exists(e in EDGE where level[from[e]] = i /\ d in label[e])(be[e])); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_dpath_enum.mzn0000644000175000017500000000047013757304533023444 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_dpath(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K) = dpath(from,to,s,t,ns,es) /\ K = sum(e in index_set(es))(es[e]*w[e]); libminizinc-2.5.3/share/minizinc/std/lex_lesseq_float.mzn0000644000175000017500000000135613757304533022300 0ustar kaolkaolinclude "fzn_lex_lesseq_float.mzn"; include "fzn_lex_lesseq_float_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_lesseq_float(array[int] of var float: x, array[int] of var float: y) = fzn_lex_lesseq_float(x, y); predicate lex_leq_float(array[int] of var float: x, array[int] of var float: y) = lex_lesseq_float(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/lex_less_set.mzn0000644000175000017500000000136413757304533021437 0ustar kaolkaolinclude "lex_less.mzn"; include "fzn_lex_less_set.mzn"; include "fzn_lex_less_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_less_set(array[int] of var set of int: x, array[int] of var set of int: y) = fzn_lex_less_set(x, y); predicate lex_lt_set(array[int] of var set of int: x, array[int] of var set of int: y) = lex_less(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/decreasing_bool.mzn0000644000175000017500000000061713757304533022065 0ustar kaolkaolinclude "fzn_decreasing_bool.mzn"; include "fzn_decreasing_bool_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate decreasing_bool(array[int] of var bool: x) = fzn_decreasing_bool(x); libminizinc-2.5.3/share/minizinc/std/inverse.mzn0000644000175000017500000000123113757304533020412 0ustar kaolkaolinclude "fzn_inverse.mzn"; include "fzn_inverse_reif.mzn"; include "analyse_all_different.mzn"; /** @group globals.channeling Constrains two arrays of int variables, \a f and \a invf, to represent inverse functions. All the values in each array must be within the index set of the other array. */ predicate inverse(array[int] of var int: f, array[int] of var int: invf) = analyse_all_different(f) /\ analyse_all_different(invf) /\ fzn_inverse(f, invf); predicate inverse_reif(array[int] of var int: f, array[int] of var int: invf, var bool: b) = fzn_inverse_reif(f, invf, b); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_float.mzn0000644000175000017500000000057213757304533024304 0ustar kaolkaolpredicate fzn_if_then_else_var_float(array[int] of var bool: c, array[int] of var float: x, var float: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/inverse_in_range.mzn0000644000175000017500000000145313757304533022262 0ustar kaolkaolinclude "fzn_inverse_in_range.mzn"; include "fzn_inverse_in_range_reif.mzn"; /** @group globals.channeling If the \a i th variable of the collection \a X is assigned to \a j and if \a j is in the index set of \a Y then the \a j th variable of the collection \a Y is assigned to \a i. Conversely, if the \a j th variable of the collection \a Y is assigned to \a i and if \a i is in the index set of \a X then the \a i th variable of the collection \a X is assigned to \a j. */ predicate inverse_in_range(array[int] of var int: f, array[int] of var int: invf) = fzn_inverse_in_range(f, invf); predicate inverse_in_range_reif(array[int] of var int: f, array[int] of var int: invf, var bool: b) = fzn_inverse_in_range_reif(f, invf, b); libminizinc-2.5.3/share/minizinc/std/cumulative_opt.mzn0000644000175000017500000000173013757304533022003 0ustar kaolkaolinclude "fzn_cumulative_opt.mzn"; include "fzn_cumulative_opt_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s, durations \a d, and resource requirements \a r, never require more than a global resource bound \a b at any one time. Start times are optional variables, so that absent tasks do not need to be scheduled. Assumptions: - forall \p i, \a d[\p i] >= 0 and \a r[\p i] >= 0 */ predicate cumulative(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = assert(index_set(s) == index_set(d) /\ index_set(s) == index_set(r), "cumulative: the 3 array arguments must have identical index sets", if length(s) >= 1 then assert(lb_array(d) >= 0 /\ lb_array(r) >= 0, "cumulative: durations and resource usages must be non-negative", fzn_cumulative_opt(s,d,r,b) ) endif ); libminizinc-2.5.3/share/minizinc/std/fzn_alldifferent_except.mzn0000644000175000017500000000104413757304533023625 0ustar kaolkaolinclude "global_cardinality_low_up.mzn"; predicate fzn_alldifferent_except(array[int] of var int: vs, set of int: S) = %% if the variables in vs are bounded then use the gcc decomposition if forall(i in index_set(vs))(has_bounds(vs[i])) then let { set of int: A = dom_array(vs) diff S; } in global_cardinality_low_up(vs, A, [0 | i in A], [1 | i in A]) else %% otherwise use the neq decomposition forall(i, j in index_set(vs) where i < j) ((vs[i] in S /\ vs[j] in S) \/ vs[i] != vs[j]) endif; libminizinc-2.5.3/share/minizinc/std/fzn_member_bool.mzn0000644000175000017500000000050613757304533022102 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_bool(array[int] of var bool: x, var bool: y) = exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/arg_min_int.mzn0000644000175000017500000000035713757304533021235 0ustar kaolkaolinclude "fzn_arg_min_int.mzn"; predicate minimum_arg_int(array[int] of var int: x, var int: i) = fzn_minimum_arg_int(x, i); predicate minimum_arg_int_reif(array[int] of var int: x, var int: i, var bool: b) = b <-> i=arg_min(x); libminizinc-2.5.3/share/minizinc/std/inverse_set.mzn0000644000175000017500000000070413757304533021271 0ustar kaolkaolinclude "fzn_inverse_set.mzn"; include "fzn_inverse_set_reif.mzn"; /** @group globals.channeling Constrains two arrays of set of int variables, \a f and \a invf, so that a \p j in f[\p i] iff \p i in invf[\p j]. All the values in each array's sets must be within the index set of the other array. */ predicate inverse_set(array[int] of var set of int: f, array[int] of var set of int: invf) = fzn_inverse_set(f,invf); libminizinc-2.5.3/share/minizinc/std/global_cardinality_closed_fn.mzn0000644000175000017500000000114313757304533024600 0ustar kaolkaolinclude "global_cardinality_closed.mzn"; /** @group globals.counting Returns an array with number of occurrences of \a cover[\p i] in \a x. The elements of \a x must take their values from \a cover. */ function array[$Y] of var int: global_cardinality_closed(array[$X] of var int: x, array[$Y] of int: cover) :: promise_total = let { array[int] of int: cover1d = array1d(cover); array[index_set(cover1d)] of var 0..length(x): counts; constraint global_cardinality_closed(array1d(x),cover1d,counts); } in arrayXd(cover,counts); libminizinc-2.5.3/share/minizinc/std/fzn_count_leq_par.mzn0000644000175000017500000000031713757304533022453 0ustar kaolkaolinclude "fzn_count_leq.mzn"; predicate fzn_count_leq_par(array[int] of var int: x, int: y, int: c) = fzn_count_leq(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_opt_bool.mzn0000644000175000017500000000057313757304533024145 0ustar kaolkaolpredicate fzn_if_then_else_opt_bool(array[int] of var bool: c, array[int] of opt bool: x, var opt bool: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_member_set.mzn0000644000175000017500000000052113757304533021737 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array of set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_set(array[int] of var set of int: x, var set of int: y) = exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/fzn_link_set_to_booleans.mzn0000644000175000017500000000020613757304533024011 0ustar kaolkaolpredicate fzn_link_set_to_booleans(var set of int: s, array[int] of var bool: b) = forall(i in index_set(b)) ( b[i] <-> i in s ); libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive.mzn0000644000175000017500000000043313757304533022146 0ustar kaolkaolpredicate fzn_disjunctive(array[int] of var int: s, array[int] of var int: d) = forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i parent[n] = n) /\ forall(n in index_set(ns)) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in index_set(ns)) % each in node except root must have a parent (ns[n] -> (n = r \/ parent[n] != n)) /\ forall(n in index_set(ns)) % each in node with a parent must be in and also its parent (parent[n] != n -> (ns[n] /\ ns[parent[n]])) /\ forall(n in index_set(ns)) % each except with a parent is one more than its parent (parent[n] != n -> dist[n] = dist[parent[n]] + 1) /\ forall(n in index_set(ns)) % each node with a parent must have that edge in (parent[n] != n -> exists(e in index_set(from) where to[e] = n)(es[e] /\ from[e] = parent[n])) /\ subgraph(from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_least_int_reif.mzn0000644000175000017500000000055713757304533023301 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_least_int_reif(int: n, array[int] of var int: x, int: v, var bool: b) = b <-> count(x, v) >= n; libminizinc-2.5.3/share/minizinc/std/fzn_reachable_int.mzn0000644000175000017500000000112613757304533022377 0ustar kaolkaolinclude "subgraph.mzn"; predicate fzn_reachable(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = let { array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des = es ++ es; } in /* duplicate the edges so that the we can use directed graph reachability */ fzn_dreachable(N,2*E,dfrom,dto,r,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_write.mzn0000644000175000017500000000043113757304533020747 0ustar kaolkaolpredicate fzn_write(array[int] of var int: I, var int: i, var int: v, array[int] of var int: O) = forall(j in index_set(I)) (O[j] = if j = i then v else I[j] endif); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_opt_reif.mzn0000644000175000017500000000062513757304533024040 0ustar kaolkaolpredicate fzn_disjunctive_opt_reif(array[int] of var opt int: s, array[int] of var int: d, var bool: b) = b <-> forall (i,j in index_set(d) where i ( path(N,E,from,to,s,t,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]) ); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_path_enum_reif.mzn0000644000175000017500000000053213757304533024304 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_path_reif(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K, var bool: b) = b <-> ( path(from,to,s,t,ns,es) /\ K = sum(e in index_set(es))(es[e]*w[e]) ); libminizinc-2.5.3/share/minizinc/std/fzn_seq_precede_chain_set.mzn0000644000175000017500000000023313757304533024111 0ustar kaolkaolpredicate fzn_seq_precede_chain_set_reif(array[int] of var set of int: X, var bool: b) = abort("Reified seq_precede_chain constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_low_up_reif.mzn0000644000175000017500000000071613757304533026040 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_global_cardinality_low_up_reif(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound, var bool: b) = b <-> forall(i in index_set(cover))( count(x, cover[i]) in lbound[i]..ubound[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_wst.mzn0000644000175000017500000000070113757304533020432 0ustar kaolkaolinclude "tree.mzn"; predicate fzn_wst(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: es, var int: K) = let { var 1..N: r; /* root of tree */ array[1..N] of bool: ns = [true | n in 1..N]; } in tree(N,E,from,to,r,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_increasing_set.mzn0000644000175000017500000000057313757304533022621 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_set(array[int] of var set of int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/at_most.mzn0000644000175000017500000000206513757304533020413 0ustar kaolkaolinclude "fzn_at_most_int.mzn"; include "fzn_at_most_int_reif.mzn"; include "fzn_at_most_set.mzn"; include "fzn_at_most_set_reif.mzn"; /** @group globals.deprecated Requires at most \a n variables in \a x to take the value \a v. This constraint is deprecated. Use count(i in x)(i=v) <= n instead. */ predicate at_most(int: n, array[int] of var int: x, int: v) = fzn_at_most_int(n, x, v); predicate at_most_reif(int: n, array[int] of var int: x, int: v, var bool: b) = fzn_at_most_int_reif(n, x, v, b); /** @group globals.counting Requires at most \a n variables in \a x to take the value \a v. */ predicate at_most(int: n, array[$X] of var set of int: x, set of int: v) = fzn_at_most_set(n, array1d(x), v); predicate at_most_reif(int: n, array[$X] of var set of int: x, set of int: v, var bool: b) = fzn_at_most_set_reif(n, array1d(x), v,b); % Synonyms for the above. predicate atmost(int: n, array[int] of var int: x, int: v) = at_most(n, x, v); predicate atmost(int: n, array[$X] of var set of int: x, set of int: v) = at_most(n, x, v); libminizinc-2.5.3/share/minizinc/std/fzn_path_enum_reif.mzn0000644000175000017500000000061413757304533022605 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_path_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified path constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_transitive_closure.mzn0000644000175000017500000000270013757304533023542 0ustar kaolkaolinclude "subgraph.mzn"; function array[$$N,$$N] of var bool: fzn_transitive_closure(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = let { array[index_set(ns)] of var 0..card(index_set(ns))-1: dist; /* distance from root */ array[index_set(ns)] of var index_set(ns): parent; /* parent */ } in ns[r] /\ % the root must be chosen dist[r] = 0 /\ % root is at distance 0 parent[r] = r /\ % root is its own parent forall(n in index_set(ns)) % nonselected nodes have parent 0 (not ns[n] -> parent[n] = n) /\ forall(n in index_set(ns)) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in index_set(ns)) % each in node except root must have a parent (ns[n] -> (n = r \/ parent[n] != n)) /\ forall(n in index_set(ns)) % each in node with a parent must be in and also its parent (parent[n] != n -> (ns[n] /\ ns[parent[n]])) /\ forall(n in index_set(ns)) % each except with a parent is one more than its parent (parent[n] != n -> dist[n] = dist[parent[n]] + 1) /\ forall(n in index_set(ns)) % each node with a parent must have that edge in (parent[n] != n -> exists(e in index_set(from) where to[e] = n)(es[e] /\ from[e] = parent[n])) /\ subgraph(from,to,ns,es); libminizinc-2.5.3/share/minizinc/std/fzn_regular_set_reif.mzn0000644000175000017500000000037313757304533023143 0ustar kaolkaolpredicate fzn_regular_reif(array[int] of var int: x, int: Q, set of int: S, array[int,int] of int: d, int: q0, set of int: F, var bool: b) = abort("Reified regular constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_inverse_reif.mzn0000644000175000017500000000057713757304533022310 0ustar kaolkaolpredicate fzn_inverse_reif(array[int] of var int: f, array[int] of var int: invf, var bool: b) = b <-> ( forall(i in index_set(f)) ( f[i] in index_set(invf) /\ (invf[f[i]] == i) ) /\ forall(j in index_set(invf)) ( invf[j] in index_set(f) /\ (f[invf[j]] == j) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_dpath_int.mzn0000644000175000017500000000057213757304533021575 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_dpath(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es) = dtree(N,E,from,to,s,ns,es) /\ dtree(N,E,to,from,t,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/arg_max_int.mzn0000644000175000017500000000036013757304533021231 0ustar kaolkaolinclude "fzn_arg_max_int.mzn"; predicate maximum_arg_int(array[int] of var int: x, var int: i) = fzn_maximum_arg_int(x, i); predicate maximum_arg_int_reif(array[int] of var int: x, var int: i, var bool: b) = b <-> i=arg_max(x); libminizinc-2.5.3/share/minizinc/std/roots_fn.mzn0000644000175000017500000000053613757304533020577 0ustar kaolkaolinclude "roots.mzn"; /** @group globals Returns \a s such that \a x[\p i] in \a t for all \p i in \a s */ function var set of int: roots(array[int] of var int: x, var set of int: t) :: promise_total = let { var set of index_set(x): s ::is_defined_var; constraint roots(x,s,t) ::defines_var(s); } in s; libminizinc-2.5.3/share/minizinc/std/all_equal.mzn0000644000175000017500000000156413757304533020707 0ustar kaolkaolinclude "fzn_all_equal_int.mzn"; include "fzn_all_equal_int_reif.mzn"; include "fzn_all_equal_set.mzn"; include "fzn_all_equal_set_reif.mzn"; /** @group globals.alldifferent Constrain the array of integers \a x to be all equal */ predicate all_equal(array[$X] of var int: x) = if length(x) <= 1 then true else fzn_all_equal_int(array1d(x)) endif; predicate all_equal_reif(array[$X] of var int: x, var bool: b) = if length(x) <= 1 then b = true else fzn_all_equal_int_reif(array1d(x),b) endif; /** @group globals.alldifferent Constrain the array of sets of integers \a x to be all equal */ predicate all_equal(array[$X] of var set of int: x) = if length(x) <= 1 then true else fzn_all_equal_set(array1d(x)) endif; predicate all_equal_reif(array[$X] of var set of int: x, var bool: b) = if length(x) <= 1 then b = true else fzn_all_equal_set_reif(array1d(x),b) endif; libminizinc-2.5.3/share/minizinc/std/count_leq.mzn0000644000175000017500000000164213757304533020736 0ustar kaolkaolinclude "fzn_count_leq_par.mzn"; include "fzn_count_leq.mzn"; include "fzn_count_leq_par_reif.mzn"; include "fzn_count_leq_reif.mzn"; /** @group globals.counting Constrains \a c to be less than or equal to the number of occurrences of \a y in \a x. */ predicate count_leq(array[$X] of var int: x, var int: y, var int: c) = fzn_count_leq(array1d(x),y,c); /** @group globals.counting Constrains \a c to be less than or equal to the number of occurrences of \a y in \a x. */ predicate count_leq(array[$X] of var int: x, int: y, int: c) = fzn_count_leq_par(array1d(x),y,c); predicate count_leq_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_leq_reif(array1d(x),y,c,b); predicate count_leq_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_leq_par_reif(array1d(x),y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/all_different_int.mzn0000644000175000017500000000076313757304533022420 0ustar kaolkaolinclude "fzn_all_different_int.mzn"; include "fzn_all_different_int_reif.mzn"; %-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate all_different_int(array[int] of var int: x) = fzn_all_different_int(x); predicate all_different_int_reif(array[int] of var int: x, var bool: b) = fzn_all_different_int_reif(x, b); libminizinc-2.5.3/share/minizinc/std/flatzinc_builtins.mzn0000644000175000017500000005727613757304533022506 0ustar kaolkaol%-----------------------------------------------------------------------------% % % FlatZinc builtins % % This section contains declarations for the standard FlatZinc builtins. % They can be redefined by providing a custom redefinitions.mzn in the % solver globals library. % include "stdlib/stdlib_ann.mzn"; /*** @groupdef flatzinc FlatZinc builtins These are the standard constraints that need to be supported by FlatZinc solvers (or redefined in the redefinitions.mzn file). */ /*** @groupdef flatzinc.int Integer FlatZinc builtins */ /** @group flatzinc.int Constrains \a b to be the absolute value of \a a */ predicate int_abs(var int: a, var int: b); /** @group flatzinc.int Constrains \a a to be equal to \a b */ predicate int_eq(var int: a, var int: b); /** @group flatzinc.int Constrains (\a a=\a b) \( \leftrightarrow \) \a r */ predicate int_eq_reif(var int: a, var int: b, var bool: r); /** @group flatzinc.int Constrains \a a to be less than or equal to \a b */ predicate int_le(var int: a, var int: b); /** @group flatzinc.int Constrains (\a a ≤ \a b) \( \leftrightarrow \) \a r */ predicate int_le_reif(var int: a, var int: b, var bool: r); /** @group flatzinc.int Constrains \( \a c = \sum_i \a as[i]*\a bs[i] \) */ predicate int_lin_eq(array[int] of int: as, array[int] of var int: bs, int: c); /** @group flatzinc.int Constrains \( \a r \leftrightarrow (\a c = \sum_i \a as[i]*\a bs[i]) \) */ predicate int_lin_eq_reif(array[int] of int: as, array[int] of var int: bs,int: c, var bool: r); /** @group flatzinc.int Constrains \( \a c \neq \sum_i \a as[i]*\a bs[i] \) */ predicate int_lin_ne(array[int] of int: as, array[int] of var int: bs, int: c); /** @group flatzinc.int Constrains \( \a r \leftrightarrow (\a c \neq \sum_i \a as[i]*\a bs[i]) \) */ predicate int_lin_ne_reif(array[int] of int: as, array[int] of var int: bs,int: c, var bool: r); /** @group flatzinc.int Constrains \( \sum \) \a as[\p i]*\a bs[\p i] ≤ \a c */ predicate int_lin_le(array[int] of int: as, array[int] of var int: bs, int: c); /** @group flatzinc.int Constrains \a r \( \leftrightarrow \) (\( \sum \) \a as[\p i]*\a bs[\p i] ≤ \a c) */ predicate int_lin_le_reif(array[int] of int: as, array[int] of var int: bs,int: c, var bool: r); /** @group flatzinc.int Constrains \a a ≠ \a b */ predicate int_ne(var int: a, var int: b); /** @group flatzinc.int \a r \( \leftrightarrow \) (\a a ≠ \a b) */ predicate int_ne_reif(var int: a, var int: b, var bool: r); /** @group flatzinc.int Constrains \a a + \a b = \a c */ predicate int_plus(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains \a a / \a b = \a c */ predicate int_div(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains \a a < \a b */ predicate int_lt(var int: a, var int: b); /** @group flatzinc.int Constrains \a r \( \leftrightarrow \) (\a a < \a b) */ predicate int_lt_reif(var int: a, var int: b, var bool: r); /** @group flatzinc.int Constrains max(\a a, \a b) = \a c */ predicate int_max(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains min(\a a, \a b) = \a c */ predicate int_min(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains \a a % \a b = \a c */ predicate int_mod(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains \a a * \a b = \a c */ predicate int_times(var int: a, var int: b, var int: c); /** @group flatzinc.int Constrains \a z = \(\a x ^ {\a y}\) */ predicate int_pow(var int: x, var int: y, var int: z); /** @group flatzinc.int Constrains \a x \( \in \) \a S */ predicate set_in(var int: x, set of int: S); /*** @groupdef flatzinc.bool Bool FlatZinc builtins */ /** @group flatzinc.bool Constrains \( \a b \in \{0,1\} \) and \( \a a \leftrightarrow \a b=1 \) */ predicate bool2int(var bool: a, var int: b); /** @group flatzinc.bool Constrains \( \a r \leftrightarrow \a a \land \a b \) */ predicate bool_and(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \( \bigvee_i \a as[i] \lor \bigvee_j \lnot \a bs[j] \) */ predicate bool_clause(array[int] of var bool: as, array[int] of var bool: bs); /** @group flatzinc.bool Constrains \a a = \a b */ predicate bool_eq(var bool: a, var bool: b); /** @group flatzinc.bool Constrains \a r \( \leftrightarrow \) (\a a = \a b) */ predicate bool_eq_reif(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \a a ≤ \a b */ predicate bool_le(var bool: a, var bool: b); /** @group flatzinc.bool Constrains \a r \( \leftrightarrow \) (\a a ≤ \a b) */ predicate bool_le_reif(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \( \a c = \sum_i \a as[i]*\a bs[i] \) */ predicate bool_lin_eq(array[int] of int: as, array[int] of var bool: bs, var int: c); /** @group flatzinc.bool Constrains \( \sum_i \a as[i]*\a bs[i] \leq \a c \) */ predicate bool_lin_le(array[int] of int: as, array[int] of var bool: bs, int: c); /** @group flatzinc.bool Constrains \a a < \a b */ predicate bool_lt(var bool: a, var bool: b); /** @group flatzinc.bool Constrains \a r \( \leftrightarrow \) (\a a < \a b) */ predicate bool_lt_reif(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \a a ≠ \a b */ predicate bool_not(var bool: a, var bool: b); /** @group flatzinc.bool Constrains \( \a r \leftrightarrow \a a \lor \a b \) */ predicate bool_or(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \( \a r \leftrightarrow \a a \oplus \a b \) */ predicate bool_xor(var bool: a, var bool: b, var bool: r); /** @group flatzinc.bool Constrains \a a \( \oplus \) \a b */ predicate bool_xor(var bool: a, var bool: b); /*** @groupdef flatzinc.set Set FlatZinc builtins */ /** @group flatzinc.set Constrains \a x \( \in \) \a S */ predicate set_in(var int: x, var set of int: S); /** @group flatzinc.set Constrains \a x = |\a S| */ predicate set_card(var set of int: S, var int: x); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x \in \a S) \) */ predicate set_in_reif(var int: x, set of int: S, var bool: r); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x \in \a S) \) */ predicate set_in_reif(var int: x, var set of int: S, var bool: r); /** @group flatzinc.set Constrains \a x \( \subseteq \) \a y */ predicate set_subset(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \a x \( \supseteq \) \a y */ predicate set_superset(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x \subseteq \a y) \) */ predicate set_subset_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x \subseteq \a y) \) */ predicate set_superset_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \a x ≤ \a y (lexicographic order of the sorted lists of elements) */ predicate set_le(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x \leq \a y) \) (lexicographic order of the sorted lists of elements) */ predicate set_le_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \a x < \a y (lexicographic order of the sorted lists of elements) */ predicate set_lt(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \( \a r \leftrightarrow (\a x < \a y) \) (lexicographic order of the sorted lists of elements) */ predicate set_lt_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \a x = \a y */ predicate set_eq(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \a r \( \leftrightarrow \) (\a x = \a y) */ predicate set_eq_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \a x ≠ \a y */ predicate set_ne(var set of int: x, var set of int: y); /** @group flatzinc.set Constrains \a r \( \leftrightarrow \) (\a x ≠ \a y) */ predicate set_ne_reif(var set of int: x, var set of int: y, var bool: r); /** @group flatzinc.set Constrains \a r = \a x \( \cap \) \a y */ predicate set_intersect(var set of int: x, var set of int: y, var set of int: r); /** @group flatzinc.set Constrains \a r = \a x \( \cup \) \a y */ predicate set_union(var set of int: x, var set of int: y, var set of int: r); /** @group flatzinc.set Constrains \a r = \a x \( \setminus \) \a y */ predicate set_diff(var set of int: x, var set of int: y, var set of int: r); /** @group flatzinc.set Constrains \a r to be the symmetric difference of \a x and \a y */ predicate set_symdiff(var set of int: x, var set of int: y, var set of int: r); /*** @groupdef flatzinc.float Float FlatZinc builtins */ /** @group flatzinc.float Constrains \a b to be the absolute value of \a a */ predicate float_abs(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = acos(\a a) */ predicate float_acos(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = acosh(\a a) */ predicate float_acosh(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = asin(\a a) */ predicate float_asin(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = asinh(\a a) */ predicate float_asinh(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = atan(\a a) */ predicate float_atan(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = atanh(\a a) */ predicate float_atanh(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = cos(\a a) */ predicate float_cos(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = cosh(\a a) */ predicate float_cosh(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = exp(\a a) */ predicate float_exp(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = ln(\a a) */ predicate float_ln(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = log10(\a a) */ predicate float_log10(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = log2(\a a) */ predicate float_log2(var float: a, var float: b); /** @group flatzinc.float Constrains \(\a b = \sqrt{\a a}\) */ predicate float_sqrt(var float: a, var float: b); /** @group flatzinc.float Constrains \a z = \(\a x ^ {\a y}\) */ predicate float_pow(var float: x, var float: y, var float: z); /** @group flatzinc.float Constrains \a b = sin(\a a) */ predicate float_sin(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = sinh(\a a) */ predicate float_sinh(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = tan(\a a) */ predicate float_tan(var float: a, var float: b); /** @group flatzinc.float Constrains \a b = tanh(\a a) */ predicate float_tanh(var float: a, var float: b); /** @group flatzinc.float Constrains \a a = \a b */ predicate float_eq(var float: a, var float: b); /** @group flatzinc.float Constrains \a r \( \leftrightarrow \) (\a a = \a b) */ predicate float_eq_reif(var float: a, var float: b, var bool: r); /** @group flatzinc.float Constrains \a a ≤ \a b */ predicate float_le(var float: a, var float: b); /** @group flatzinc.float Constrains \a r \( \leftrightarrow \) (\a a ≤ \a b) */ predicate float_le_reif(var float: a, var float: b, var bool: r); /** @group flatzinc.float Constrains \a a < \a b */ predicate float_lt(var float: a, var float: b); /** @group flatzinc.float Constrains \a r \( \leftrightarrow \) (\a a < \a b) */ predicate float_lt_reif(var float: a, var float: b, var bool: r); /** @group flatzinc.float Constrains \a a ≠ \a b */ predicate float_ne(var float: a, var float: b); /** @group flatzinc.float Constrains \a r \( \leftrightarrow \) (\a a ≠ \a b) */ predicate float_ne_reif(var float: a, var float: b, var bool: r); /** @group flatzinc.float Constrains \( \a a \in\ [ \a b, \a c ] \) */ predicate float_in(var float: a, float: b, float: c); /** @group flatzinc.float Constrains \a r \( \leftrightarrow \) \( \a a \in\ [ \a b, \a c ] \) */ predicate float_in_reif(var float: a, float: b, float: c, var bool: r); /** @group flatzinc.float Constrains the domain of \a x using the values in \a as, using each pair of values \a as[2*\p i-1]..\a as[2*\p i] for \p i in 1..\p n/2 as a possible range */ predicate float_dom(var float: x, array[int] of float: as); /** @group flatzinc.float Constrains \( \a c = \sum_i \a as[i]*\a bs[i] \) */ predicate float_lin_eq(array[int] of float: as, array[int] of var float: bs, float: c); /** @group flatzinc.float Constrains \( \a r \leftrightarrow (\a c = \sum_i \a as[i]*\a bs[i]) \) */ predicate float_lin_eq_reif(array[int] of float: as, array[int] of var float: bs, float: c, var bool: r); /** @group flatzinc.float Constrains \( \sum_i \a as[i]*\a bs[i] \leq \a c \) */ predicate float_lin_le(array[int] of float: as, array[int] of var float: bs, float: c); /** @group flatzinc.float Constrains \( \a r \leftrightarrow (\sum_i \a as[i]*\a bs[i] \leq \a c) \) */ predicate float_lin_le_reif(array[int] of float: as, array[int] of var float: bs, float: c, var bool: r); /** @group flatzinc.float Constrains \( \sum_i \a as[i]*\a bs[i] < \a c \) */ predicate float_lin_lt(array[int] of float: as, array[int] of var float: bs, float: c); /** @group flatzinc.float Constrains \( \a r \leftrightarrow (\sum_i \a as[i]*\a bs[i] < \a c) \) */ predicate float_lin_lt_reif(array[int] of float: as, array[int] of var float: bs, float: c, var bool: r); /** @group flatzinc.float Constrains \( \a c \neq \sum_i \a as[i]*\a bs[i] \) */ predicate float_lin_ne(array[int] of float: as, array[int] of var float: bs, float: c); /** @group flatzinc.float Constrains \( \a r \leftrightarrow (\a c \neq \sum_i \a as[i]*\a bs[i]) \) */ predicate float_lin_ne_reif(array[int] of float: as, array[int] of var float: bs, float: c, var bool: r); /** @group flatzinc.float Constrains max(\a a, \a b) = \a c */ predicate float_max(var float: a, var float: b, var float: c); /** @group flatzinc.float Constrains min(\a a, \a b) = \a c */ predicate float_min(var float: a, var float: b, var float: c); /** @group flatzinc.float Constrains \a a + \a b = \a c */ predicate float_plus(var float: a, var float: b, var float: c); /** @group flatzinc.float Constrains \a a / \a b = \a c */ predicate float_div(var float: a, var float: b, var float: c); /** @group flatzinc.float Constrains \a a * \a b = \a c */ predicate float_times(var float: a, var float: b, var float: c); /** @group flatzinc.float Constrains \a y=\a x */ predicate int2float(var int: x, var float: y); % Array constraints /** @group flatzinc.bool Constrains \( \a r \leftrightarrow \bigwedge_i \a as[i]\) */ predicate array_bool_and(array[int] of var bool: as, var bool: r); /** @group flatzinc.bool Constrains \( \a r \leftrightarrow \bigvee_i \a as[i]\) */ predicate array_bool_or(array[int] of var bool: as, var bool: r); /** @group flatzinc.bool Constrains \( \oplus_i\ \a as[i]\) */ predicate array_bool_xor(array[int] of var bool: as); /** @group flatzinc.bool Constrains \a as[\a b] = \a c */ predicate array_bool_element(var int: b, array[int] of bool: as, var bool: c); /** @group flatzinc.int Constrains \a as[\a b] = \a c */ predicate array_int_element(var int: b, array[int] of int: as, var int: c); /** @group flatzinc.float Constrains \a as[\a b] = \a c */ predicate array_float_element(var int: b, array[int] of float: as, var float: c); /** @group flatzinc.set Constrains \a as[\a b] = \a c */ predicate array_set_element(var int: b, array[int] of set of int: as, var set of int: c); /** @group flatzinc.bool Constrains \a as[\a b] = \a c */ predicate array_var_bool_element(var int: b, array[int] of var bool: as, var bool: c); /** @group flatzinc.int Constrains \a as[\a b] = \a c */ predicate array_var_int_element(var int: b, array[int] of var int: as, var int: c); /** @group flatzinc.float Constrains \a as[\a b] = \a c */ predicate array_var_float_element(var int: b, array[int] of var float: as, var float: c); /** @group flatzinc.set Constrains \a as[\a b] = \a c */ predicate array_var_set_element(var int: b, array[int] of var set of int: as, var set of int: c); /** @group flatzinc.int Constrains \a m to be the maximum value of the (non-empty) array \a x */ predicate array_int_maximum(var int: m, array[int] of var int: x); /** @group flatzinc.float Constrains \a m to be the maximum value of the (non-empty) array \a x */ predicate array_float_maximum(var int: m, array[int] of var int: x); /** @group flatzinc.int Constrains \a m to be the minimum value of the (non-empty) array \a x */ predicate array_int_minimum(var int: m, array[int] of var int: x); /** @group flatzinc.float Constrains \a m to be the minimum value of the (non-empty) array \a x */ predicate array_float_minimum(var int: m, array[int] of var int: x); /*** @groupdef flatzinc.two FlatZinc builtins added in MiniZinc 2.0.0. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.0.0. Solvers that support these natively need to include a file called redefinitions-2.0.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.two Reified clause constraint. Constrains \( \a b \leftrightarrow \bigvee_i \a as[i] \lor \bigvee_j \lnot \a bs[j] \) */ predicate bool_clause_reif(array[int] of var bool: as, array[int] of var bool: bs, var bool: b); /** @group flatzinc.two Constrains \a m to be the maximum value in array \a x. */ predicate array_int_maximum(var int: m, array[int] of var int: x); /** @group flatzinc.two Constrains \a m to be the maximum value in array \a x. */ predicate array_float_maximum(var float: m, array[int] of var float: x); /** @group flatzinc.two Constrains \a m to be the minimum value in array \a x. */ predicate array_int_minimum(var int: m, array[int] of var int: x); /** @group flatzinc.two Constrains \a m to be the minimum value in array \a x. */ predicate array_float_minimum(var float: m, array[int] of var float: x); /*** @groupdef flatzinc.twootwo FlatZinc builtins added in MiniZinc 2.0.2. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.0.2. Solvers that support these natively need to include a file called redefinitions-2.0.2.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twootwo Element constraint on array with MiniZinc index set, constrains \a x[\a idx] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_bool_element_nonshifted(var int: idx, array[int] of var bool: x, var bool: c); /** @group flatzinc.twootwo Element constraint on array with MiniZinc index set, constrains \a x[\a idx] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_int_element_nonshifted(var int: idx, array[int] of var int: x, var int: c); /** @group flatzinc.twootwo Element constraint on array with MiniZinc index set, constrains \a x[\a idx] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_float_element_nonshifted(var int: idx, array[int] of var float: x, var float: c); /** @group flatzinc.twootwo Element constraint on array with MiniZinc index set, constrains \a x[\a idx] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_set_element_nonshifted(var int: idx, array[int] of var set of int: x, var set of int: c); /*** @groupdef flatzinc.twoone FlatZinc builtins added in MiniZinc 2.1.0. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.1.0. Solvers that support these natively need to include a file called redefinitions-2.1.0.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twoone Constrains \a a ≤ \a x ≤ \a b */ predicate float_in(var float: x, float: a, float: b); /** @group flatzinc.twoone Constrains \a x to take one of the values in \a as */ predicate float_dom(var float: x, array[int] of float: as); /*** @groupdef flatzinc.twooneone FlatZinc builtins added in MiniZinc 2.1.1. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.1.1. Solvers that support these natively need to include a file called redefinitions-2.1.1.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twooneone Returns variable constrained to be equal to the minimum of the set \a s. An alternative implementation can be found in the comments of the source code. */ function var $$E: min(var set of $$E: s); /** @group flatzinc.twooneone Returns variable constrained to be equal to the maximum of the set \a s. An alternative implementation can be found in the comments of the source code. */ function var $$E: max(var set of $$E: s); /*** @groupdef flatzinc.twotwoone FlatZinc builtins added in MiniZinc 2.2.1. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.2.1. Solvers that support these natively need to include a file called redefinitions-2.2.1.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twotwoone Constrains \a z = \(\a x ^ {\a y}\) */ predicate int_pow_fixed(var int: x, int: y, var int: z); /*** @groupdef flatzinc.twothreethree FlatZinc builtins added in MiniZinc 2.3.3. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.3.3. Solvers that support these natively need to include a file called redefinitions-2.3.3.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twothreethree Constrains \a x \( \in \) \a S */ predicate float_set_in(var float: x, set of float: S); /*** @groupdef flatzinc.twofivetwo FlatZinc builtins added in MiniZinc 2.5.2. These functions and predicates define built-in operations of the MiniZinc language that have been added in MiniZinc 2.5.2. Solvers that support these natively need to include a file called redefinitions-2.5.2.mzn in their solver library that redefines these predicates as builtins. */ /** @group flatzinc.twofivetwo Element constraint on 2d array with MiniZinc index set, constrains \a x[\a idx1,idx2] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_int_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var int: x, var int: c); /** @group flatzinc.twofivetwo Element constraint on 2d array with MiniZinc index set, constrains \a x[\a idx1,idx2] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_bool_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var bool: x, var bool: c); /** @group flatzinc.twofivetwo Element constraint on 2d array with MiniZinc index set, constrains \a x[\a idx1,idx2] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_float_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var float: x, var float: c); /** @group flatzinc.twofivetwo Element constraint on 2d array with MiniZinc index set, constrains \a x[\a idx1,idx2] = \a c This can be overridden in a solver that can perform the index calculation more efficiently than using a MiniZinc decomposition. */ predicate array_var_set_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var set of int: x, var set of int: c); libminizinc-2.5.3/share/minizinc/std/diffn_k.mzn0000644000175000017500000000144213757304533020343 0ustar kaolkaolinclude "fzn_diffn_k.mzn"; include "fzn_diffn_k_reif.mzn"; /** @group globals.packing Constrains \p k-dimensional boxes to be non-overlapping. For each box \p i and dimension \p j, \a box_posn[\p i, \p j] is the base position of the box in dimension \p j, and \a box_size[\p i, \p j] is the size in that dimension. Boxes whose size is 0 in any dimension still cannot overlap with any other box. */ predicate diffn_k(array[int,int] of var int: box_posn, array[int,int] of var int: box_size) = let { set of int: DIMS= index_set_2of2(box_posn) } in assert(index_set_2of2(box_size) = DIMS /\ index_set_1of2(box_posn) = index_set_1of2(box_size), "diffn: index sets of arguments are incorrect", fzn_diffn_k(box_posn, box_size) ); libminizinc-2.5.3/share/minizinc/std/fzn_subcircuit.mzn0000644000175000017500000000304313757304533021773 0ustar kaolkaolinclude "alldifferent.mzn"; predicate fzn_subcircuit(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: u = max(S), int: n = card(S), array[S] of var 1..n: order, array[S] of var bool: ins = array1d(S,[ x[i] != i | i in S]), var l..u+1: firstin = min([ u+1 + bool2int(ins[i])*(i-u-1) | i in S]), var S: lastin, var bool: empty = (firstin > u), } in alldifferent(x) /\ alldifferent(order) /\ % If the subcircuit is empty then each node points at itself. % (empty -> forall(i in S)(not ins[i])) /\ % If the subcircuit is non-empty then order numbers the subcircuit. % ((not empty) -> % The firstin node is numbered 1. order[firstin] = 1 /\ % The lastin node is greater than firstin. lastin > firstin /\ % The lastin node points at firstin. x[lastin] = firstin /\ % And both are in ins[lastin] /\ ins[firstin] /\ % The successor of each node except where it is firstin is % numbered one more than the predecessor. forall(i in S) ( (ins[i] /\ x[i] != firstin) -> order[x[i]] = order[i] + 1 ) /\ % Each node that is not in is numbered after the lastin node. forall(i in S) ( ins[i] \/ order[lastin] < order[i] ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_int_set_channel_reif.mzn0000644000175000017500000000073313757304533023764 0ustar kaolkaolpredicate fzn_int_set_channel_reif(array[int] of var int: x, array[int] of var set of int: y, var bool: b) = b <-> ( forall(i in index_set(x)) (x[i] in index_set(y)) /\ forall(j in index_set(y)) (y[j] subset index_set(x)) /\ forall(i in index_set(x), j in index_set(y)) (x[i] = j <-> i in y[j]) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_equal_int_reif.mzn0000644000175000017500000000054313757304533023437 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate fzn_all_equal_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i, j in index_set(x) where i < j) ( x[i] = x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_among.mzn0000644000175000017500000000020513757304533020715 0ustar kaolkaolpredicate fzn_among(var int: n, array[int] of var int: x, set of int: v) = n == sum(i in index_set(x)) ( bool2int(x[i] in v) ); libminizinc-2.5.3/share/minizinc/std/fzn_subgraph_enum_reif.mzn0000644000175000017500000000060313757304533023462 0ustar kaolkaolpredicate fzn_subgraph_reif(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = b <-> forall(e in index_set(from)) ( (es[e] -> ns[from[e]]) /\ (es[e] -> ns[to[e]]) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_geq_reif.mzn0000644000175000017500000000060113757304533022605 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_geq_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = let { var int: z = count(x,y) } in b <-> z <= c; % This needs to be written with a let rather than count(x,y) <= c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_seq_precede_chain_set_reif.mzn0000644000175000017500000000021113757304533025112 0ustar kaolkaolpredicate fzn_seq_precede_chain_set(array[int] of var set of int: X) = abort("Reified seq_precede_chain constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/network_flow.mzn0000644000175000017500000000361013757304533021462 0ustar kaolkaolinclude "fzn_network_flow.mzn"; include "fzn_network_flow_reif.mzn"; include "fzn_network_flow_cost.mzn"; include "fzn_network_flow_cost_reif.mzn"; /** @group globals Defines a network flow constraint. @param arc: a directed arc of the flow network. Arc \p i connects node \a arc[\p i,1] to node \a arc[\p i,2]. @param balance: the difference between input and output flow for each node. @param flow: the flow going through each arc. */ predicate network_flow(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of var int: flow) = let { set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in assert ( ARCS == index_set(flow) /\ lb_array(arc) >= min(NODES) /\ ub_array(arc) <= max(NODES), "network_flow: wrong sizes of input array parameters", fzn_network_flow(arc, balance, flow) ); /** @group globals Defines a network flow constraint with cost. @param arc: a directed arc of the flow network. Arc \p i connects node \a arc[\p i,1] to node \a arc[\p i,2]. @param balance: the difference between input and output flow for each node. @param weight: the unit cost of the flow through the arc. @param flow: the flow going through each arc. @param cost: the overall cost of the flow. */ predicate network_flow_cost(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of int: weight, array[int] of var int: flow, var int: cost) = let { set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in assert ( ARCS == index_set(flow) /\ ARCS == index_set(weight) /\ lb_array(arc) >= min(NODES) /\ ub_array(arc) <= max(NODES), "network_flow: wrong sizes of input array parameters", fzn_network_flow_cost(arc, balance, weight, flow, cost) ); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.0.mzn0000644000175000017500000000335013757304533022102 0ustar kaolkaol% This file contains redefinitions of standard builtins that can be overridden % by solvers. predicate bool_clause_reif(array[int] of var bool: as, array[int] of var bool: bs, var bool: b) = clause(as,bs++[b]) /\ forall (i in index_set(as)) (as[i] -> b) /\ forall (i in index_set(bs)) (bs[i] \/ b); predicate array_int_maximum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_float_maximum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_int_minimum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); predicate array_float_minimum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); libminizinc-2.5.3/share/minizinc/std/fzn_table_int_opt.mzn0000644000175000017500000000123113757304533022437 0ustar kaolkaolpredicate fzn_table_int_opt(array[int] of var opt int: x, array[int, int] of opt int: t) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: lt = min(index_set_1of2(t)), int: ut = max(index_set_1of2(t)), var lt..ut: i, array[l..u, lt..ut] of opt int: t_transposed = array2d(l..u, lt..ut, [ t[k,j] | j in l..u, k in lt..ut ]) } in forall(j in l..u) ( % Having the variable index component at the left position % means that the nD-to-1D array translation during Mzn-to-Fzn % will generate at most an offset constraint, instead of a % scaling + offset constraint. t_transposed[j,i] ~= x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_alternative.mzn0000644000175000017500000000042713757304533022140 0ustar kaolkaolinclude "span.mzn"; predicate fzn_alternative(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d) = sum(i in index_set(s))(bool2int(occurs(s[i]))) = occurs(s0) /\ span(s0,d0,s,d); libminizinc-2.5.3/share/minizinc/std/bin_packing_capa.mzn0000644000175000017500000000302113757304533022166 0ustar kaolkaolinclude "fzn_bin_packing_capa.mzn"; include "fzn_bin_packing_capa_reif.mzn"; /** @group globals.packing Requires that each item \p i with weight \a w[\p i], be put into \a bin[\p i] such that the sum of the weights of the items in each bin \p b does not exceed the capacity \a c[\p b]. Assumptions: - forall \p i, \a w[\p i] >=0 - forall \p b, \a c[\p b] >=0 */ predicate bin_packing_capa(array[int] of int: c, array[int] of var int: bin, array[int] of int: w) = assert(index_set(bin) = index_set(w), "bin_packing_capa: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing_capa: the weights must be non-negative", assert(lb_array(c) >= 0, "bin_packing_capa: the capacities must be non-negative", fzn_bin_packing_capa(c, bin, w) ))); predicate bin_packing_capa_reif(array[int] of int: c, array[int] of var int: bin, array[int] of int: w, var bool: b) = assert(index_set(bin) = index_set(w), "bin_packing_capa: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing_capa: the weights must be non-negative", assert(lb_array(c) >= 0, "bin_packing_capa: the capacities must be non-negative", fzn_bin_packing_capa_reif(c, bin, w, b) ))); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_path_enum.mzn0000644000175000017500000000140113757304533021573 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_path(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es) = let { int: E = length(es); array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des; } in /* ensure that the directed edges selected agree with undirected edges */ forall(e in 1..E)(es[e-1+min(index_set(es))] <-> (des[e] \/ des[e+E])) /\ /* duplicate the edges so that the we can use directed graph path */ fzn_dpath(dfrom,dto,s,t,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_distribute.mzn0000644000175000017500000000042413757304533021775 0ustar kaolkaolinclude "count_eq.mzn"; predicate fzn_distribute(array[int] of var int: card, array[int] of var int: value, array[int] of var int: base) = forall (i in index_set(card)) ( count(base, value[i], card[i]) ); libminizinc-2.5.3/share/minizinc/std/member.mzn0000644000175000017500000000157413757304533020220 0ustar kaolkaolinclude "member_bool.mzn"; include "member_float.mzn"; include "member_int.mzn"; include "member_set.mzn"; include "set_member.mzn"; /** @group globals Requires that \a y occurs in the array \a x. */ predicate member(array[int] of var bool: x, var bool: y) = member_bool(x, y); /** @group globals Requires that \a y occurs in the array \a x. */ predicate member(array[int] of var float: x, var float: y) = member_float(x, y); /** @group globals Requires that \a y occurs in the array \a x. */ predicate member(array[int] of var int: x, var int: y) = member_int(x, y); /** @group globals Requires that \a y occurs in the array \a x. */ predicate member(array[int] of var set of int: x, var set of int: y) = member_set(x, y); /** @group globals Requires that \a y occurs in the set \a x. */ predicate member(var set of int: x, var int: y) = set_member(x, y); libminizinc-2.5.3/share/minizinc/std/int_set_channel.mzn0000644000175000017500000000076113757304533022103 0ustar kaolkaolinclude "fzn_int_set_channel.mzn"; include "fzn_int_set_channel_reif.mzn"; /** @group globals.channeling Requires that array of int variables \a x and array of set variables \a y are related such that (\a x[\p i] = \p j) \( \leftrightarrow \) (\p i in \a y[\p j]). */ predicate int_set_channel(array[int] of var int: x, array[int] of var set of int: y) = fzn_int_set_channel(x,y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_disjoint_reif.mzn0000644000175000017500000000027513757304533023303 0ustar kaolkaolinclude "fzn_disjoint.mzn"; predicate fzn_all_disjoint_reif(array[int] of var set of int: S, var bool: b) = b <-> forall(i,j in index_set(S) where i < j) ( fzn_disjoint(S[i], S[j]) ); libminizinc-2.5.3/share/minizinc/std/fzn_dtree_enum_reif.mzn0000644000175000017500000000052513757304533022755 0ustar kaolkaolpredicate fzn_dtree_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dtree constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/inverse_fn.mzn0000644000175000017500000000076213757304533021105 0ustar kaolkaolinclude "inverse.mzn"; /** @group globals.channeling Given a function \a f represented as an array, return the inverse function. */ function array[$$E] of var $$F: inverse(array[$$F] of var $$E: f) = let { array[lb_array(f)..ub_array(f)] of var index_set(f): invf; constraint inverse(f,invf); } in invf; /** @group globals.channeling Given a function \a f represented as an array, return the inverse function. */ function array[$$E] of $$F: inverse(array[$$F] of $$E: f); libminizinc-2.5.3/share/minizinc/std/fzn_table_int_reif.mzn0000644000175000017500000000716513757304533022576 0ustar kaolkaol%-----------------------------------------------------------------------------% % A table constraint table(x, t) represents the constraint x in t where we % consider each row in t to be a tuple and t as a set of tuples. %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% % Reified version % % We only support special cases of a few variables. % % The approach is to add the Boolean variable to the list of variables and % create an extended table. The extended table covers all combinations of % assignments to the original variables, and every entry in it is padded with a % value that depends on whether that entry occurs in the original table. % % For example, the original table constraint % % x y % --- % 2 3 % 5 8 % 4 1 % % reified with a Boolean b is turned into a table constraint of the form % % x y b % --------- % 2 3 true % 5 8 true % 4 1 true % ... false % ... false % for all other pairs (x,y) % ... false % predicate fzn_table_int_reif(array[int] of var int: x, array[int, int] of int: t, var bool: b) = let { int: n_vars = length(x) } in assert(n_vars in 1..5, "'table' constraints in a reified context " ++ "are only supported for 1..5 variables.", if n_vars = 1 then x[1] in { t[it,1] | it in index_set_1of2(t) } <-> b else let { set of int: ix = index_set(x), set of int: full_size = 1..product(i in ix)( dom_size(x[i]) ), array[full_size, 1..n_vars + 1] of int: t_b = array2d(full_size, 1..n_vars + 1, if n_vars = 2 then [ let { array[ix] of int: tpl = [i1,i2] } in (tpl ++ [bool2int(aux_is_in_table(tpl,t))])[p] | i1 in dom(x[1]), i2 in dom(x[2]), p in 1..n_vars + 1 ] else if n_vars = 3 then [ let { array[ix] of int: tpl = [i1,i2,i3] } in (tpl ++ [bool2int(aux_is_in_table(tpl,t))])[p] | i1 in dom(x[1]), i2 in dom(x[2]), i3 in dom(x[3]), p in 1..n_vars + 1 ] else if n_vars = 4 then [ let { array[ix] of int: tpl = [i1,i2,i3,i4] } in (tpl ++ [bool2int(aux_is_in_table(tpl,t))])[p] | i1 in dom(x[1]), i2 in dom(x[2]), i3 in dom(x[3]), i4 in dom(x[4]), p in 1..n_vars + 1 ] else % if n_vars = 5 then [ let { array[ix] of int: tpl = [i1,i2,i3,i4,i5] } in (tpl ++ [bool2int(aux_is_in_table(tpl,t))])[p] | i1 in dom(x[1]), i2 in dom(x[2]), i3 in dom(x[3]), i4 in dom(x[4]), i5 in dom(x[5]), p in 1..n_vars + 1 ] endif endif endif ) } in fzn_table_int(x ++ [bool2int(b)], t_b) endif ); test aux_is_in_table(array[int] of int: e, array[int, int] of int: t) = exists(i in index_set_1of2(t))( forall(j in index_set(e))( t[i,j] = e[j] ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_disjoint.mzn0000644000175000017500000000024513757304533022273 0ustar kaolkaolinclude "fzn_disjoint.mzn"; predicate fzn_all_disjoint(array[int] of var set of int: S) = forall(i,j in index_set(S) where i < j) ( fzn_disjoint(S[i], S[j]) ); libminizinc-2.5.3/share/minizinc/std/lex_less_float.mzn0000644000175000017500000000135613757304533021752 0ustar kaolkaolinclude "lex_less.mzn"; include "fzn_lex_less_float.mzn"; include "fzn_lex_less_float_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_less_float(array[int] of var float: x, array[int] of var float: y) = fzn_lex_less_float(x, y); predicate lex_lt_float(array[int] of var float: x, array[int] of var float: y) = lex_less(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_dtree_int_reif.mzn0000644000175000017500000000051413757304533022601 0ustar kaolkaolpredicate fzn_dtree_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dtree constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/arg_min.mzn0000644000175000017500000000503513757304533020361 0ustar kaolkaolinclude "arg_min_int.mzn"; include "arg_min_bool.mzn"; include "arg_min_float.mzn"; /** @group globals Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_min(array[$$E] of var int: x) = let { constraint length(x) > 0; } in arg_min_total(x); /** @group globals Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_min(array[$$E] of var bool: x) = let { constraint length(x) > 0; } in arg_min_total(x); /** @group globals Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function var $$E: arg_min(array[$$E] of var float: x) = let { constraint length(x) > 0; } in arg_min_total(x); function var $$E: arg_min_total(array[$$E] of var int: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint minimum_arg_int(x, i); } in i endif; function var $$E: arg_min_total(array[$$E] of var bool: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint minimum_arg_bool(x, i); } in i endif; function var $$E: arg_min_total(array[$$E] of var float: x) :: promise_total = if length(x) = 0 then 0 else let { var min(index_set(x)) .. max(index_set(x)): i; constraint minimum_arg_float(x, i); } in i endif; /** @group globals Constrain \a i to be the index of the minimum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate minimum_arg(array[int] of var int: x, var int: i) = minimum_arg_int(x, i); /** @group globals Constrain \a i to be the index of the minimum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate minimum_arg(array[int] of var bool: x, var int: i) = minimum_arg_bool(x, i); /** @group globals Constrain \a i to be the index of the minimum value in the array \a x. When breaking ties the least index is returned. Assumption: |\a x| > 0 */ predicate minimum_arg(array[int] of var float: x, var int: i) = minimum_arg_float(x, i); libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_float_reif.mzn0000644000175000017500000000216613757304533024162 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_float_reif(array[int] of var float: x, array[int] of var float: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/exactly_int.mzn0000644000175000017500000000060413757304533021265 0ustar kaolkaolinclude "fzn_exactly_int.mzn"; include "fzn_exactly_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate exactly_int(int: n, array[int] of var int: x, int: v) = fzn_exactly_int(n, x, v); libminizinc-2.5.3/share/minizinc/std/fzn_member_bool_reif.mzn0000644000175000017500000000053613757304533023112 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_bool_reif(array[int] of var bool: x, var bool: y, var bool: b) = b <-> exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/nvalue_fn.mzn0000644000175000017500000000037413757304533020723 0ustar kaolkaolinclude "nvalue.mzn"; /** @group globals.alldifferent Returns the number of distinct values in \a x. */ function var int: nvalue(array[$X] of var int: x) = let { var 0..length(x): n::is_defined_var; constraint nvalue(n,x)::defines_var(n); } in n; libminizinc-2.5.3/share/minizinc/std/fzn_count_neq.mzn0000644000175000017500000000055113757304533021613 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_neq(array[int] of var int: x, var int: y, var int: c) = let { var int: z = count(x,y) } in z != c; % This needs to be written with a let rather than count(x,y) != c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_wst_reif.mzn0000644000175000017500000000050313757304533021437 0ustar kaolkaolpredicate fzn_wst_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: es, var int: K, var bool: b) = abort("Reified wst constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_inverse.mzn0000644000175000017500000000045613757304533021277 0ustar kaolkaolpredicate fzn_inverse(array[int] of var int: f, array[int] of var int: invf) = forall(i in index_set(f)) ( f[i] in index_set(invf) /\ (invf[f[i]] == i) ) /\ forall(j in index_set(invf)) ( invf[j] in index_set(f) /\ (f[invf[j]] == j) ); libminizinc-2.5.3/share/minizinc/std/disjunctive_strict_opt.mzn0000644000175000017500000000134313757304533023544 0ustar kaolkaolinclude "fzn_disjunctive_strict_opt.mzn"; include "fzn_disjunctive_strict_opt_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s and durations \a d do not overlap in time. Tasks with duration 0 CANNOT be scheduled at any time, but only when no other task is running. Start times are optional variables, so that absent tasks do not need to be scheduled. Assumptions: - forall \p i, \a d[\p i] >= 0 */ predicate disjunctive_strict(array[int] of var opt int: s, array[int] of var int: d) = assert(index_set(s) == index_set(d), "disjunctive: the array arguments must have identical index sets", fzn_disjunctive_strict_opt(s,d) ); libminizinc-2.5.3/share/minizinc/std/lex_lesseq_bool.mzn0000644000175000017500000000134213757304533022121 0ustar kaolkaolinclude "fzn_lex_lesseq_bool.mzn"; include "fzn_lex_lesseq_bool_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_lesseq_bool(array[int] of var bool: x, array[int] of var bool: y) = fzn_lex_lesseq_bool(x, y); predicate lex_leq_bool(array[int] of var bool: x, array[int] of var bool: y) = lex_lesseq_bool(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/stdlib/0000755000175000017500000000000013757304533017475 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_sort.mzn0000644000175000017500000000607213757304533022560 0ustar kaolkaol/*** @groupdef stdlib.sort Array sorting operations */ /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of var opt $T: sort_by(array[$$E] of var opt $T: x, array[$$E] of int: y); /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of var $T: sort_by(array[$$E] of var $T: x, array[$$E] of int: y); /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of $T: sort_by(array[$$E] of $T: x, array[$$E] of int: y); /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of var opt $T: sort_by(array[$$E] of var opt $T: x, array[$$E] of float: y); /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of var $T: sort_by(array[$$E] of var $T: x, array[$$E] of float: y); /** @group stdlib.sort Return array \a x sorted by the values in \a y in non-decreasing order The sort is stable, i.e. if \a y[\p i] = \a y[\p j] with \p i < \p j, then \a x[\p i] will appear in the output before \a x[\p j]. */ function array[$$E] of $T: sort_by(array[$$E] of $T: x, array[$$E] of float: y); /** @group stdlib.sort Return values from array \a x sorted in non-decreasing order */ function array[$$E] of int: sort(array[$$E] of int: x); /** @group stdlib.sort Return values from array \a x sorted in non-decreasing order */ function array[$$E] of float: sort(array[$$E] of float: x); /** @group stdlib.sort Return values from array \a x sorted in non-decreasing order */ function array[$$E] of bool: sort(array[$$E] of bool: x); /** @group stdlib.sort Returns the permutation \a p which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ function array[int] of $$E: arg_sort(array[$$E] of int:x) = sort_by([i | i in index_set(x)], x); /** @group stdlib.sort Returns the permutation \a p which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ function array[int] of $$E: arg_sort(array[$$E] of float:x) = sort_by([i | i in index_set(x)], x); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_language.mzn0000644000175000017500000000570213757304533023353 0ustar kaolkaol/*** @groupdef stdlib.language Language information These functions return information about the MiniZinc system. */ /** @group stdlib.language Return MiniZinc version encoded as an integer (major*10000+minor*1000+patch). */ function int: mzn_compiler_version(); /** @group stdlib.language Return string representation of \a v given an integer major*10000+minor*1000+patch */ function string: mzn_version_to_string(int: v) = show(v div 10000)++"."++show((v div 1000) mod 10)++"."++show(v mod 100); /** @group stdlib.language If defined, this can be used to check that the MiniZinc compiler supports all the features used in the model. */ opt int: mzn_min_version_required; constraint assert(absent(mzn_min_version_required) \/ deopt(mzn_min_version_required) <= mzn_compiler_version(), "This model requires MiniZinc version "++mzn_version_to_string(deopt(mzn_min_version_required))++" but you are running version "++mzn_version_to_string(mzn_compiler_version())); /*** @groupdef stdlib.options Compiler options */ % TODO: Is this still in use? /** @group stdlib.options Whether to only generate domains that are contiguous ranges */ opt bool: mzn_opt_only_range_domains; /** @group stdlib.options Check whether to only generate domains that are contiguous ranges */ test mzn_check_only_range_domains() = if absent(mzn_opt_only_range_domains) then false else deopt(mzn_opt_only_range_domains) endif; /** @group stdlib.options Whether to generate defines_var annotations */ opt bool: mzn_opt_annotate_defines_var; /** @group stdlib.options Check whether to generate defines_var annotations */ test mzn_check_annotate_defines_var() = if absent(mzn_opt_annotate_defines_var) then true else deopt(mzn_opt_annotate_defines_var) endif; /** @group stdlib.options Whether to ignore symmetry breaking constraints If not specified or set to false, it depends on the solver library whether constraints that are wrapped in a symmetry_breaking_constraint call are in fact compiled. If set to true, they are not compiled, independent of the solver library. */ opt bool: mzn_ignore_symmetry_breaking_constraints; /** @group stdlib.options Check whether to ignore symmetry breaking constraints */ test mzn_check_ignore_symmetry_breaking_constraints() = if absent(mzn_ignore_symmetry_breaking_constraints) then false else deopt(mzn_ignore_symmetry_breaking_constraints) endif; /** @group stdlib.options Whether to ignore redundant constraints If not specified or set to false, it depends on the solver library whether constraints that are wrapped in a redundant_constraint call are in fact compiled. If set to true, they are not compiled, independent of the solver library. */ opt bool: mzn_ignore_redundant_constraints; /** @group stdlib.options Check whether to ignore redundant constraints */ test mzn_check_ignore_redundant_constraints() = if absent(mzn_ignore_redundant_constraints) then false else deopt(mzn_ignore_redundant_constraints) endif; libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_enum.mzn0000644000175000017500000000773213757304533022541 0ustar kaolkaol/*** @groupdef stdlib.enum Functions for enums */ %TODO: Document these function set of int: anon_enum(int: n) = 1..n; function set of int: anon_enum(array[int] of string: x); /** @group stdlib.enum Return next greater enum value of \a x in enum \a e */ function $$E: enum_next(set of $$E: e, $$E: x); /** @group stdlib.enum Return next greater enum value of \a x in enum \a e */ function opt $$E: enum_next(set of $$E: e, opt $$E: x) = if occurs(x) then enum_next(e,deopt(x)) else <> endif; /** @group stdlib.enum Return next greater enum value of \a x in enum \a e */ function var $$E: enum_next(set of $$E: e, var $$E: x) = let { constraint x < max(e) } in x+1; /** @group stdlib.enum Return next greater enum value of \a x in enum \a e */ function var opt $$E: enum_next(set of $$E: e, var opt $$E: x) = if occurs(x) then enum_next(e,deopt(x)) else <> endif; /** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */ function $$E: enum_prev(set of $$E: e, $$E: x); /** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */ function opt $$E: enum_prev(set of $$E: e, opt $$E: x) = if occurs(x) then enum_prev(e,deopt(x)) else <> endif; /** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */ function var $$E: enum_prev(set of $$E: e, var $$E: x) = let { constraint x > min(e) } in x-1; /** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */ function var opt $$E: enum_prev(set of $$E: e, var opt $$E: x) = if occurs(x) then enum_prev(e,deopt(x)) else <> endif; /** @group stdlib.enum Convert \a x to enum type \a X */ function $$E: to_enum(set of $$E: X, int: x); /** @group stdlib.enum Convert \a x to enum type \a X */ function opt $$E: to_enum(set of $$E: X, opt int: x) = if occurs(x) then to_enum(X, deopt(x)) else <> endif; /** @group stdlib.enum Convert \a x to enum type \a X */ function var $$E: to_enum(set of $$E: X, var int: x) = let { constraint x in X } in x; /** @group stdlib.enum Convert \a x to enum type \a X */ function var opt $$E: to_enum(set of $$E: X, var opt int: x) = if occurs(x) then to_enum(X, deopt(x)) else <> endif; /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of $$E: to_enum(set of $$E: X, array[$U] of int: x) = let { array[int] of int: xx = array1d(x) } in arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]); /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of opt $$E: to_enum(set of $$E: X, array[$U] of opt int: x) = let { array[int] of opt int: xx = array1d(x) } in arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]); /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of var $$E: to_enum(set of $$E: X, array[$U] of var int: x) = let { array[int] of var int: xx = array1d(x) } in arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]); /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of var opt $$E: to_enum(set of $$E: X, array[$U] of var opt int: x) = let { array[int] of var opt int: xx = array1d(x) } in arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]); /** @group stdlib.enum Convert \a x to enum type \a X */ function set of $$E: to_enum(set of $$E: X, set of int: x) = { to_enum(X,i) | i in x }; %/** @group stdlib.enum Convert \a x to enum type \a X */ function var set of $$E: to_enum(set of $$E: X, var set of int: x) = let { var set of X: y; constraint x subset X; constraint forall (i in X) (i in x <-> i in y); } in y; /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of set of $$E: to_enum(set of $$E: X, array[$U] of set of int: x) = let { array[int] of set of int: xx = array1d(x) } in arrayXd(x, [ to_enum(X, xx[i]) | i in index_set(xx)]); /** @group stdlib.enum Convert \a x to enum type \a X */ function array[$U] of var set of $$E: to_enum(set of $$E: X, array[$U] of var set of int: x) = let { array[int] of var set of int: xx = array1d(x) } in arrayXd(x, [ to_enum(X, xx[i]) | i in index_set(xx)]); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_set.mzn0000644000175000017500000001254613757304533022367 0ustar kaolkaol/*** @groupdef stdlib.set Set operations These functions implement the basic operations on sets. */ /** @group stdlib.set Test if \a x is an element of the set \a y */ function bool: 'in'( int: x, set of int: y); /** @group stdlib.set \a x is an element of the set \a y */ function var bool: 'in'(var int: x, var set of int: y); /** @group stdlib.set Test if \a x is an element of the set \a y */ function bool: 'in'( float: x, set of float: y); /** @group stdlib.set Test if \a x is an element of the set \a y */ function var bool: 'in'(var float: x, set of float: y); /** @group stdlib.set Test if \a x is a subset of \a y */ function bool: 'subset'( set of $T: x, set of $T: y); /** @group stdlib.set \a x is a subset of \a y */ function var bool: 'subset'(var set of int: x, var set of int: y); /** @group stdlib.set Test if \a x is a superset of \a y */ function bool: 'superset'( set of $T: x, set of $T: y); /** @group stdlib.set \a x is a superset of \a y */ function var bool: 'superset'(var set of int: x, var set of int: y); /** @group stdlib.set Return the union of sets \a x and \a y */ function set of $T: 'union'( set of $T: x, set of $T: y); /** @group stdlib.set Return the union of sets \a x and \a y */ function var set of $$T: 'union'(var set of $$T: x, var set of $$T: y); /** @group stdlib.set Return the intersection of sets \a x and \a y */ function set of $T: 'intersect'( set of $T: x, set of $T: y); /** @group stdlib.set Return the intersection of sets \a x and \a y */ function var set of $$T: 'intersect'(var set of $$T: x, var set of $$T: y); /** @group stdlib.set Return the set difference of sets \(\a x \setminus \a y \) */ function set of $T: 'diff'( set of $T: x, set of $T: y); /** @group stdlib.set Return the set difference of sets \(\a x \setminus \a y \) */ function var set of $$T: 'diff'(var set of $$T: x, var set of $$T: y); /** @group stdlib.set Return the symmetric set difference of sets \a x and \a y */ function set of $T: 'symdiff'( set of $T: x, set of $T: y); /** @group stdlib.set Return the symmetric set difference of sets \a x and \a y */ function var set of $$T: 'symdiff'(var set of $$T: x, var set of $$T: y); /** @group stdlib.set Return the set \(\{\a a,\ldots,\a b\}\) */ function set of $$E: '..'($$E: a,$$E: b); /** @group stdlib.set Return the set \(\{\a a,\ldots,\a b\}\) */ function set of float: '..'(float: a,float: b); /** @group stdlib.set Return the set \(\{\a a,\ldots,\a b\}\) */ function set of bool: '..'(bool: a,bool: b) = if a then if b then {true} else {} endif elseif b then {false,true} else {false} endif; function var set of int: '..'(var int: a, var int: b) ::promise_total = let { var set of min(lb(a),lb(b))..max(ub(a),ub(b)): s; constraint forall (i in ub(s)) (i in s <-> (a <= i /\ i <= b)); } in s; /** @group stdlib.set Return the cardinality of the set \a x */ function int: card( set of $T: x); /** @group stdlib.set Return the cardinality of the set \a x */ function var int: card(var set of int: x) ::promise_total = let { var 0..card(ub(x)): c; constraint set_card(x,c); } in c; /** @group stdlib.set Return the union of the sets in array \a x */ function set of $U: array_union(array[$T] of set of $U: x); /** @group stdlib.set Return the union of the sets in array \a x */ function var set of int: array_union(array[int] of var set of int: x) ::promise_total = if length(x)=0 then {} elseif length(x)=1 then x[min(index_set(x))] else let { int: l=min(index_set(x)); int: u=max(index_set(x)); array[l..u-1] of var set of ub_array(x): y; constraint y[l]=x[l] union x[l+1]; constraint forall (i in l+2..u) (y[i-1]=y[i-2] union x[i]); } in y[u-1] endif; /** @group stdlib.set Return the intersection of the sets in array \a x */ function set of $U: array_intersect(array[$T] of set of $U: x); /** @group stdlib.set Return the intersection of the sets in array \a x */ function var set of int: array_intersect(array[int] of var set of int: x) ::promise_total = if length(x)=0 then assert(false,"can't be!",-infinity..infinity) elseif length(x)=1 then x[min(index_set(x))] else let { int: l=min(index_set(x)); int: u=max(index_set(x)); array[l..u-1] of var set of ub_array(x): y; constraint y[l]=x[l] intersect x[l+1]; constraint forall (i in l+2..u) (y[i-1]=y[i-2] intersect x[i]); } in y[u-1] endif; /** @group stdlib.set Return the minimum of the set \a s */ function var $$E: min(var set of $$E: s); /** @group stdlib.set Return the maximum of the set \a s */ function var $$E: max(var set of $$E: s); /* Rewrite set membership on float variables to correct FlatZinc builtin */ predicate set_in(var float: x, set of float: S) = float_set_in(x, S); /** @group stdlib.set Return a sorted list of the non-overlapping ranges in \a S */ function array[int] of int: set_to_ranges(set of int: S); /** @group stdlib.set Return a sorted list of the non-overlapping ranges in \a S */ function array[int] of float: set_to_ranges(set of float: S); /** @group stdlib.set Return a sorted list of the non-overlapping ranges in \a S */ function array[int] of bool: set_to_ranges(set of bool: S) = if S={false} then [false,false] elseif S={true} then [true,true] else [false,true] endif; libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_string.mzn0000644000175000017500000001463513757304533023103 0ustar kaolkaol/*** @groupdef stdlib.string String operations These functions implement operations on strings. */ /** @group stdlib.string Convert \a x into a string */ function string: show(var opt set of $T: x); /** @group stdlib.string Convert \a x into a string */ function string: show(var opt $T: x); /** @group stdlib.string Convert \a x into a string */ function string: show(array[$U] of var opt $T: x); function string: showDzn(var opt set of $T: x); function string: showDzn(var opt $T: x); function string: showDzn(array[$U] of var opt $T: x); function string: showDznId(string: x); function string: showCheckerOutput(); /** @group stdlib.string Formatted to-string conversion for integers Converts the integer \a x into a string right justified by the number of characters given by \a w, or left justified if \a w is negative. */ function string: show_int(int: w, var int: x); /** @group stdlib.string Formatted to-string conversion for floats. Converts the float \a x into a string right justified by the number of characters given by \a w, or left justified if \a w is negative. The number of digits to appear after the decimal point is given by \a p. It is a run-time error for \a p to be negative. */ function string: show_float(int: w, int: p, var float: x); /** @group stdlib.string Convert two-dimensional array \a x into a string */ function string: show2d(array[int,int] of var opt $T: x) = let { int: rows=card(index_set_1of2(x)); int: cols=card(index_set_2of2(x)); array[int] of string: s = [show(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)]; int: max_length = max([string_length(s[i]) | i in index_set(s)]) } in "[| "++ concat([format_justify_string(max_length,s[(i-1)*cols+j])++ if j'( $T: x, $T: y); /** @group stdlib.compare Return if \a x is greater than \a y */ function var bool: '>'(var $T: x,var $T: y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than the value of \a y. */ function var bool: '>'(var opt int: x, var opt int: y) = absent(x) \/ absent(y) \/ deopt(x) > deopt(y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than the value of \a y. */ function bool: '>'(opt int: x, opt int: y) = absent(x) \/ absent(y) \/ deopt(x) > deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than the value of \a y. */ function var bool: '>'(var opt float: x, var opt float: y) = absent(x) \/ absent(y) \/ deopt(x) > deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than the value of \a y. */ function bool: '>'(opt float: x, opt float: y) = absent(x) \/ absent(y) \/ deopt(x) > deopt(y); /** @group stdlib.compare Return if \a x is less than or equal to \a y */ function bool: '<='( $T: x, $T: y); /** @group stdlib.compare Return if \a x is less than or equal to \a y */ function var bool: '<='(var $T: x, var $T: y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is less than or equal to the value of \a y. */ function var bool: '<='(var opt int: x, var opt int: y) = absent(x) \/ absent(y) \/ deopt(x) <= deopt(y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is less than or equal to the value of \a y. */ function bool: '<='(opt int: x, opt int: y) = absent(x) \/ absent(y) \/ deopt(x) <= deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is less than or equal to the value of \a y. */ function var bool: '<='(var opt float: x, var opt float: y) = absent(x) \/ absent(y) \/ deopt(x) <= deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is less than or equal to the value of \a y. */ function bool: '<='(opt float: x, opt float: y) = absent(x) \/ absent(y) \/ deopt(x) <= deopt(y); /** @group stdlib.compare Return if \a x is greater than or equal to \a y */ function bool: '>='( $T: x, $T: y); /** @group stdlib.compare Return if \a x is greater than or equal to \a y */ function var bool: '>='(var $T: x,var $T: y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than or equal to the value of \a y. */ function var bool: '>='(var opt int: x, var opt int: y) = absent(x) \/ absent(y) \/ deopt(x) >= deopt(y); /** @group stdlib.compare Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than or equal to the value of \a y. */ function bool: '>='(opt int: x, opt int: y) = absent(x) \/ absent(y) \/ deopt(x) >= deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than or equal to the value of \a y. */ function var bool: '>='(var opt float: x, var opt float: y) = absent(x) \/ absent(y) \/ deopt(x) >= deopt(y); /** @group stdlib.arithmetic Weak comparison: true iff either \a x or \a y is absent, or both occur and the value of \a x is greater than or equal to the value of \a y. */ function bool: '>='(opt float: x, opt float: y) = absent(x) \/ absent(y) \/ deopt(x) >= deopt(y); /** @group stdlib.compare Return if \a x is equal to \a y */ function bool: '='( $T: x, $T: y); /** @group stdlib.compare Return if \a x is equal to \a y */ function bool: '='(opt $T: x, opt $T: y) = absent(x) /\ absent(y) \/ occurs(x) /\ occurs(y) /\ deopt(x) = deopt(y); /** @group stdlib.compare Return if \a x is equal to \a y */ function var bool: '='(var $T: x,var $T: y); /** @group stdlib.compare Return if \a x is equal to \a y */ function var bool: '='(var opt $T: x,var opt $T: y); /** @group stdlib.compare Return if \a x is not equal to \a y */ function bool: '!='( $T: x, $T: y); /** @group stdlib.compare Return if \a x is not equal to \a y */ function bool: '!='(opt $T: x, opt $T: y) = not (x = y); /** @group stdlib.compare Return if \a x is not equal to \a y */ function var bool: '!='(var $T: x, var $T: y); /** @group stdlib.compare Return if \a x is not equal to \a y */ function var bool: '!='(var opt $T: x, var opt $T: y); % Special case comparison operators for integer variable and float constant function var bool: '<='(var int: x, float: y) = (x <= floor(y)); function var bool: '>='(var int: x, float: y) = (x >= ceil(y)); function var bool: '<='(float: x, var int: y) = (y >= ceil(x)); function var bool: '>='(float: x, var int: y) = (y <= floor(x)); function var bool: '<'(var int: x, float: y) = (x <= ceil(y)-1); function var bool: '>'(float: x, var int: y) = (y <= ceil(x)-1); function var bool: '>'(var int: x, float: y) = (x >= floor(y)+1); function var bool: '<'(float: x, var int: y) = (y >= floor(x)+1); function var bool: '='(var int: x, float: y) = if ceil(y)=floor(y) then x=ceil(y) else false endif; function var bool: '='(float: x, var int: y) = if ceil(x)=floor(x) then y=ceil(x) else false endif; function var bool: '!='(var int: x, float: y) = if ceil(y)=floor(y) then x != ceil(y) else true endif; function var bool: '!='(float: x, var int: y) = if ceil(x)=floor(x) then y != ceil(x) else true endif; function bool: '<='(int: x, float: y) = (x <= floor(y)); function bool: '>='(int: x, float: y) = (x >= ceil(y)); function bool: '<='(float: x, int: y) = (y >= ceil(x)); function bool: '>='(float: x, int: y) = (y <= floor(x)); function bool: '<'(int: x, float: y) = (x <= ceil(y)-1); function bool: '>'(float: x, int: y) = (y <= ceil(x)-1); function bool: '>'(int: x, float: y) = (x >= floor(y)+1); function bool: '<'(float: x, int: y) = (y >= floor(x)+1); function bool: '='(int: x, float: y) = if ceil(y)=floor(y) then x=ceil(y) else false endif; function bool: '='(float: x, int: y) = if ceil(x)=floor(x) then y=ceil(x) else false endif; function bool: '!='(int: x, float: y) = if ceil(y)=floor(y) then x != ceil(y) else true endif; function bool: '!='(float: x, int: y) = if ceil(x)=floor(x) then y != ceil(x) else true endif; /** @group stdlib.compare Return if array \a x is lexicographically smaller than array \a y */ function bool: '<'(array[$U] of $T: x,array[$U] of $T: y); /** @group stdlib.compare Return if array \a x is lexicographically smaller than array \a y */ function var bool: '<'(array[$U] of var $T: x,array[$U] of var $T: y); /** @group stdlib.compare Return if array \a x is lexicographically greater than array \a y */ function bool: '>'(array[$U] of $T: x,array[$U] of $T: y); /** @group stdlib.compare Return if array \a x is lexicographically greater than array \a y */ function var bool: '>'(array[$U] of var $T: x,array[$U] of var $T: y); /** @group stdlib.compare Return if array \a x is lexicographically smaller than or equal to array \a y */ function bool: '<='(array[$U] of $T: x,array[$U] of $T: y); /** @group stdlib.compare Return if array \a x is lexicographically smaller than or equal to array \a y */ function var bool: '<='(array[$U] of var $T: x,array[$U] of var $T: y); /** @group stdlib.compare Return if array \a x is lexicographically greater than or equal to array \a y */ function bool: '>='(array[$U] of $T: x,array[$U] of $T: y); function var bool: '>='(array[$U] of var $T: x,array[$U] of var $T: y); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function bool: '='(array[$T] of int: x,array[$T] of int: y) = let { array[int] of int: xx = array1d(x); array[int] of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function var bool: '='(array[$T] of var int: x,array[$T] of var int: y) = let { array[int] of var int: xx = array1d(x); array[int] of var int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function bool: '='(array[$T] of bool: x,array[$T] of bool: y) = let { array[int] of bool: xx = array1d(x); array[int] of bool: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function var bool: '='(array[$T] of var bool: x,array[$T] of var bool: y) = let { array[int] of var bool: xx = array1d(x); array[int] of var bool: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function bool: '='(array[$T] of set of int: x,array[$T] of set of int: y) = let { array[int] of set of int: xx = array1d(x); array[int] of set of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function var bool: '='(array[$T] of var set of int: x,array[$T] of var set of int: y) = let { array[int] of var set of int: xx = array1d(x); array[int] of var set of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function bool: '='(array[$T] of float: x,array[$T] of float: y) = let { array[int] of float: xx = array1d(x); array[int] of float: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is equal to array \a y */ function var bool: '='(array[$T] of var float: x,array[$T] of var float: y) = let { array[int] of var float: xx = array1d(x); array[int] of var float: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", forall (i in index_set(xx)) (xx[i]=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function bool: '!='(array[$T] of int: x,array[$T] of int: y) = let { array[int] of int: xx = array1d(x); array[int] of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function var bool: '!='(array[$T] of var int: x,array[$T] of var int: y) = let { array[int] of var int: xx = array1d(x); array[int] of var int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function bool: '!='(array[$T] of bool: x,array[$T] of bool: y) = let { array[int] of bool: xx = array1d(x); array[int] of bool: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function var bool: '!='(array[$T] of var bool: x,array[$T] of var bool: y) = let { array[int] of var bool: xx = array1d(x); array[int] of var bool: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function bool: '!='(array[$T] of set of int: x,array[$T] of set of int: y) = let { array[int] of set of int: xx = array1d(x); array[int] of set of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function var bool: '!='(array[$T] of var set of int: x,array[$T] of var set of int: y) = let { array[int] of var set of int: xx = array1d(x); array[int] of var set of int: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function bool: '!='(array[$T] of float: x,array[$T] of float: y) = let { array[int] of float: xx = array1d(x); array[int] of float: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); /** @group stdlib.compare Return if array \a x is not equal to array \a y */ function var bool: '!='(array[$T] of var float: x,array[$T] of var float: y) = let { array[int] of var float: xx = array1d(x); array[int] of var float: yy = array1d(y); } in assert(index_sets_agree(x,y), "array index sets do not match", exists (i in index_set(xx)) (xx[i]!=yy[i]) ); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_debug.mzn0000644000175000017500000001320413757304533022652 0ustar kaolkaol/*** @groupdef stdlib.debug Assertions and debugging functions These functions help debug models and check that input data conforms to the expectations. */ /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function $T: assert(bool: b, string: msg, $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function opt $T: assert(bool: b, string: msg, opt $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function var $T: assert(bool: b, string: msg, var $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function var opt $T: assert(bool: b, string: msg, var opt $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function array[$U] of $T: assert(bool: b, string: msg, array[$U] of $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function array[$U] of opt $T: assert(bool: b, string: msg, array[$U] of opt $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function array[$U] of var $T: assert(bool: b, string: msg, array[$U] of var $T: x); /** @group stdlib.debug If \a b is true, return \a x, otherwise abort with message \a msg. */ function array[$U] of var opt $T: assert(bool: b, string: msg, array[$U] of var opt $T: x); /** @group stdlib.debug If \a b is true, return true, otherwise abort with message \a msg. */ function bool: assert(bool: b, string: msg); /** @group stdlib.debug Return \a x, and print message \a msg. */ function $T: trace(string: msg, $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function opt $T: trace(string: msg, opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function var $T: trace(string: msg, var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function var opt $T: trace(string: msg, var opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of $T: trace(string: msg, array [$U] of $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of opt $T: trace(string: msg, array [$U] of opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of var $T: trace(string: msg, array [$U] of var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of var opt $T: trace(string: msg, array [$U] of var opt $T: x); /** @group stdlib.debug Return true, and print message \a msg. */ function bool: trace(string: msg); /** @group stdlib.debug Return \a x, and print message \a msg. */ function $T: trace_stdout(string: msg, $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function opt $T: trace_stdout(string: msg, opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function var $T: trace_stdout(string: msg, var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function var opt $T: trace_stdout(string: msg, var opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of $T: trace_stdout(string: msg, array [$U] of $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of opt $T: trace_stdout(string: msg, array [$U] of opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of var $T: trace_stdout(string: msg, array [$U] of var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg. */ function array [$U] of var opt $T: trace_stdout(string: msg, array [$U] of var opt $T: x); /** @group stdlib.debug Return true, and print message \a msg. */ function bool: trace_stdout(string: msg); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function $T: trace_logstream(string: msg, $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function opt $T: trace_logstream(string: msg, opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function var $T: trace_logstream(string: msg, var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function var opt $T: trace_logstream(string: msg, var opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function array [$U] of $T: trace_logstream(string: msg, array [$U] of $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function array [$U] of opt $T: trace_logstream(string: msg, array [$U] of opt $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function array [$U] of var $T: trace_logstream(string: msg, array [$U] of var $T: x); /** @group stdlib.debug Return \a x, and print message \a msg to logging stream. */ function array [$U] of var opt $T: trace_logstream(string: msg, array [$U] of var opt $T: x); /** @group stdlib.debug Return true, and print message \a msg to logging stream. */ function bool: trace_logstream(string: msg); /** @group stdlib.debug Return logging stream as string */ function string: logstream_to_string(); /** @group stdlib.debug With debug build of the MiniZinc compiler, call MiniZinc::mzn_break_here when flattening this expression to make debugging easier. This annotation is ignored by the release build. */ annotation mzn_break_here; /** @group stdlib.debug Abort evaluation and print message \a msg. */ function bool: abort(string: msg); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_coercion.mzn0000644000175000017500000001300213757304533023361 0ustar kaolkaol/*** @groupdef stdlib.coercion Coercions These functions implement coercions, or channeling, between different types. */ /** @group stdlib.coercion Return \( \lceil{ \a x} \rceil \) */ function int: ceil(float: x); /** @group stdlib.coercion Return \( \lfloor{ \a x} \rfloor \) */ function int: floor(float: x); /** @group stdlib.coercion Return \a x rounded to nearest integer */ function int: round(float: x); /** @group stdlib.coercion Return Boolean \a b coerced to an integer */ function int: bool2int(bool: b); /** @group stdlib.coercion Return optional 0/1 integer that is absent iff \a x is absent, and 1 iff \a x occurs and is true. */ function var opt int: bool2int(var opt bool: x) ::promise_total = let { var opt 0..1: xi; constraint absent(xi)=absent(x); constraint deopt(xi)=bool2int(deopt(x)); } in xi; /** @group stdlib.coercion Return Boolean \a b coerced to a float */ function float: bool2float(bool: b) = if b then 1.0 else 0.0 endif; /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of floats */ function array[$T] of float: bool2float(array[$T] of bool: x) ::promise_total = let { array[int] of bool: xx = array1d(x) } in arrayXd(x,[bool2float(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of floats */ function array[$T] of var float: bool2float(array[$T] of var bool: x) ::promise_total = let { array[int] of var bool: xx = array1d(x) } in arrayXd(x,[bool2float(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return Boolean \a b coerced to an integer */ function var int: bool2int(var bool: b); /** @group stdlib.coercion Return array of Booleans \a b coerced to an array of integers */ function array[$T] of var int: bool2int(array[$T] of var bool: b); /** @group stdlib.coercion Return Boolean \a b coerced to a float */ function var float: bool2float(var bool: b) = int2float(bool2int(b)); /** @group stdlib.coercion Return integer \a x coerced to a float */ function float: int2float(int: x); /** @group stdlib.coercion Return integer \a x coerced to a float */ function var float: int2float(var int: x) ::promise_total; /** @group stdlib.arithmetic Return optional 0/1 float that is absent iff \a x is absent, and 1 iff \a x occurs and is true. */ function var opt float: bool2float(var opt bool: x) ::promise_total = let { var opt 0.0..1.0: xi; constraint absent(xi)=absent(x); constraint deopt(xi)=bool2float(deopt(x)); } in xi; /** @group stdlib.arithmetic Return optional 0/1 integer that is absent iff \a x is absent, and 1 iff \a x occurs and is true. */ function var opt float: int2float(var opt int: x) ::promise_total = let { var opt int2float(lb(x))..int2float(ub(x)): xi; constraint absent(xi)=absent(x); constraint deopt(xi)=int2float(deopt(x)); } in xi; function set of int: bool2int(set of bool: b) = if b={false,true} then {0,1} elseif b={false} then {0} elseif b={true} then {1} else {} endif; /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of integers */ function array[$T] of int: bool2int(array[$T] of bool: x) ::promise_total = let { array[int] of bool: xx = array1d(x) } in arrayXd(x,[bool2int(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of sets of Booleans \a x coerced to an array of sets of integers */ function array[$T] of set of int: bool2int(array[$T] of set of bool: x) ::promise_total = let { array[int] of set of bool: xx = array1d(x) } in arrayXd(x,[bool2int(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of integers */ function array[$T] of var int: bool2int(array[$T] of var bool: x) ::promise_total = let { array[int] of var bool: xx = array1d(x) } in arrayXd(x,[bool2int(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of integers */ function array[$T] of var opt int: bool2int(array[$T] of var opt bool: x) ::promise_total = let { array[int] of var opt bool: xx = array1d(x) } in arrayXd(x,[bool2int(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of Booleans \a x coerced to an array of floats */ function array[$T] of var opt float: bool2float(array[$T] of var opt bool: x) ::promise_total = let { array[int] of var opt bool: xx = array1d(x) } in arrayXd(x,[bool2float(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of integers \a x coerced to an array of floats */ function array[$T] of float: int2float(array[$T] of int: x) ::promise_total = let { array[int] of int: xx = array1d(x) } in arrayXd(x,[int2float(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of integers \a x coerced to an array of floats */ function array[$T] of var float: int2float(array[$T] of var int: x) ::promise_total = let { array[int] of var int: xx = array1d(x) } in arrayXd(x,[int2float(xx[i]) | i in index_set(xx)]); /** @group stdlib.coercion Return array of optional integers \a x coerced to an array of optional floats */ function array[$T] of var opt float: int2float(array[$T] of var opt int: x) ::promise_total = let { array[int] of var opt int: xx = array1d(x) } in arrayXd(x,[int2float(xx[i]) | i in index_set(xx)]); % Only supported for set of int: % function array[int] of $T: set2array(set of $T); /** @group stdlib.coercion Return a set of integers \a x coerced to an array of integers */ function array[int] of $$E: set2array(set of $$E: x); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_opt.mzn0000644000175000017500000002731713757304533022400 0ustar kaolkaol/*** @groupdef stdlib.optiontypes Option type support These functions and predicates implement the standard library for working with option types. Note that option type support is still incomplete. */ /** @group stdlib.optiontypes Return value of \a x if \a x is not absent. Aborts when evaluated on absent value. */ function $T: deopt(opt $T: x); /** @group stdlib.optiontypes Return value of \a x if \a x is not absent. Aborts when evaluated on absent value. */ function $$T: deopt(opt $$T: x); /** @group stdlib.optiontypes Return value \a x unchanged (since \a x is guaranteed to be non-optional). */ function var $T: deopt(var $T: x) = x; /** @group optiontypes Test if \a x is not absent (always returns true) */ test occurs(var $T: x) = true; /** @group optiontypes Test if \a x is not absent */ test occurs(opt $T: x); /** @group optiontypes Test if \a x is absent (always returns false) */ test absent(var $T: x) = false; /** @group optiontypes Test if \a x is absent */ test absent(opt $T: x) = not occurs(x); /*** @groupdef stdlib.optiontypes.bool Option type support for Booleans */ /** @group stdlib.optiontypes.bool True iff \a x is not absent */ function var bool : occurs(var opt bool: x) ::promise_total = occurs_bool(x); function bool : occurs_bool(opt bool: x) ::promise_total = occurs(x); function bool : occurs_bool(var bool: x) ::promise_total = true; function var bool : occurs_bool(var opt bool: x) ::promise_total = let { var bool : b = occurs_internal_bool(x); var bool : dx = deopt_internal_bool(x); constraint (x = reverse_map_var_opt_bool(b,dx)) :: is_reverse_map; } in b; /** @group stdlib.optiontypes.bool Return value of \a x (assumes that \a x is not absent) */ function var bool : deopt(var opt bool : x) ::promise_total = deopt_bool(x); function bool : deopt_bool(opt bool : x) ::promise_total = deopt(x); function var bool : deopt_bool(var bool : x) ::promise_total = x; function var bool : deopt_bool(var opt bool : x) ::promise_total = let { var bool : b = occurs_internal_bool(x); var bool : dx = deopt_internal_bool(x); constraint (x = reverse_map_var_opt_bool(b,dx)) :: is_reverse_map; } in dx; /** @group stdlib.optiontypes.bool True iff \a x is absent */ predicate absent(var opt bool: x) = not occurs(x); function var bool: occurs_internal_bool(var opt bool: x) ::promise_total = let { var bool : b; } in b; function var bool : deopt_internal_bool(var opt bool : x) ::promise_total = let { var bool: y } in y; function var opt bool: reverse_map_var_opt_bool(var bool: occ, var bool: d); function opt bool: reverse_map_var_opt_bool(bool: occ, bool: d) ::promise_total = if occ then d else <> endif; predicate mzn_reverse_map_var(var opt bool: x) = let { var bool : b = occurs_internal_bool(x); var bool : dx = deopt_internal_bool(x); constraint (x = reverse_map_var_opt_bool(b,dx)) :: is_reverse_map; } in true; /** @group stdlib.optiontypes.bool Weak equality. True if either \a x or \a y are absent, or present and equal.*/ function var bool: '~='(var opt bool: x, var opt bool: y) ::promise_total = absent(x) \/ absent(y) \/ deopt(x)=deopt(y); /*** @groupdef stdlib.optiontypes.int Option type support for integers */ /** @group stdlib.optiontypes.int True iff \a x is not absent */ function var bool : occurs(var opt int : x) ::promise_total = occurs_int(x); function bool : occurs_int(opt int : x) ::promise_total = occurs(x); function bool : occurs_int(var int : x) ::promise_total = true; function var bool : occurs_int(var opt int : x) ::promise_total = let { var bool : b = occurs_internal_int(x); var int : dx = deopt_internal_int(x); constraint (x = reverse_map_var_opt_int(b,dx)) :: is_reverse_map; } in b; function var bool : occurs_int(var opt bool : x) ::promise_total = occurs(x); function bool : occurs_int(opt bool : x) ::promise_total = occurs(x); function bool : occurs_int(var bool : x) ::promise_total = true; /** @group stdlib.optiontypes.int Return value of \a x (assumes that \a x is not absent) */ function var $$E : deopt(var opt $$E : x) ::promise_total = deopt_int(x); function int : deopt_int(opt int : x) ::promise_total = deopt(x); function var int : deopt_int(var int : x) ::promise_total = x; function var int : deopt_int(var opt int : x) ::promise_total = let { var bool : b = occurs_internal_int(x); var int : dx = deopt_internal_int(x); constraint (x = reverse_map_var_opt_int(b,dx)) :: is_reverse_map; } in dx; function var bool : deopt_int(var opt bool : x) ::promise_total = deopt(x); function var bool : deopt_int(var bool : x) ::promise_total = x; function bool : deopt_int(opt bool : x) ::promise_total = deopt(x); /** @group stdlib.optiontypes.int True iff \a x is absent */ function var bool: absent(var opt int: x) ::promise_total = not occurs(x); function var bool: occurs_internal_int(var opt int: x) ::promise_total = let { var bool : b; } in b; function var int : deopt_internal_int(var opt int : x) ::promise_total = let { var dom(x): y } in y; function var opt int: reverse_map_var_opt_int(var bool: occ, var int: d); function opt int: reverse_map_var_opt_int(bool: occ, int: d) ::promise_total = if occ then d else <> endif; predicate mzn_reverse_map_var(var opt int: x) = let { var bool : b = occurs_internal_int(x); var int : dx = deopt_internal_int(x); constraint (x = reverse_map_var_opt_int(b,dx)) :: is_reverse_map; } in true; /** @group stdlib.optiontypes.int Weak addition. Return sum of \a x and \a y if both are present, otherwise return absent. */ function var opt int: '~+'(var opt int: x, var opt int: y) ::promise_total = let { int: l = if lb(x)=-infinity \/ lb(y)=-infinity then -infinity else lb(x)+lb(y) endif; int: u = if ub(x)=infinity \/ ub(y)=infinity then infinity else ub(x)+ub(y) endif; var opt l..u: result; constraint absent(x) \/ absent(y) -> result = <>; constraint absent(x) \/ absent(y) \/ result = deopt(x)+deopt(y); } in result; /** @group stdlib.optiontypes.int Weak subtraction. Return difference of \a x and \a y if both are present, otherwise return absent. */ function var opt int: '~-'(var opt int: x, var opt int: y) ::promise_total = let { int: l = if lb(x)=-infinity \/ ub(y)=infinity then -infinity else lb(x)-ub(y) endif; int: u = if ub(x)=infinity \/ lb(y)=-infinity then infinity else ub(x)-lb(y) endif; var opt l..u: result; constraint absent(x) \/ absent(y) -> result = <>; constraint absent(x) \/ absent(y) \/ result = deopt(x)-deopt(y); } in result; /** @group stdlib.optiontypes.int Weak multiplication. Return product of \a x and \a y if both are present, otherwise return absent. */ function var opt int: '~*'(var opt int: x, var opt int: y) ::promise_total = if absent(x) \/ absent(y) then <> else deopt(x)*deopt(y) endif; /** @group stdlib.optiontypes.int Weak equality. True if either \a x or \a y are absent, or present and equal.*/ function var bool: '~='(var opt int: x, var opt int: y) ::promise_total = absent(x) \/ absent(y) \/ deopt(x)=deopt(y); /* Internal function used to optimize over option type objective */ function var int: objective_deopt_(var opt int: x, bool: direction) = let { int: worst = if direction then lb(x)-1 else ub(x)+1 endif; } in if occurs(x) then deopt(x) else worst endif; /*** @groupdef stdlib.optiontypes.float Option type support for floats */ /** @group stdlib.optiontypes.float True iff \a x is not absent */ function var bool : occurs(var opt float : x) ::promise_total = occurs_float(x); function bool : occurs_float(opt float : x) ::promise_total = occurs(x); function bool : occurs_float(opt int : x) ::promise_total = occurs(x); function bool : occurs_float(opt bool : x) ::promise_total = occurs(x); function bool : occurs_float(var float : x) ::promise_total = true; function var bool : occurs_float(var opt float : x) ::promise_total = let { var bool : b = occurs_internal_float(x); var float : dx = deopt_internal_float(x); constraint (x = reverse_map_var_opt_float(b,dx)) :: is_reverse_map; } in b; function var bool : occurs_float(var opt int : x) ::promise_total = occurs_int(x); function bool : occurs_float(var int : x) ::promise_total = true; function var bool : occurs_float(var opt bool : x) ::promise_total = occurs_bool(x); function bool : occurs_float(var bool : x) ::promise_total = true; /** @group stdlib.optiontypes.float Return value of \a x (assumes that \a x is not absent) */ function var float : deopt(var opt float : x) ::promise_total = deopt_float(x); function var float : deopt_float(var float : x) ::promise_total = x; function var float : deopt_float(var opt float : x) ::promise_total = let { var bool : b = occurs_internal_float(x); var float : dx = deopt_internal_float(x); constraint (x = reverse_map_var_opt_float(b,dx)) :: is_reverse_map; } in dx; function var int : deopt_float(var opt int : x) ::promise_total = deopt_int(x); function var int : deopt_float(var int : x) ::promise_total = x; function var bool : deopt_float(var opt bool : x) ::promise_total = deopt_bool(x); function var bool : deopt_float(var bool : x) ::promise_total = x; function float : deopt_float(opt float : x) ::promise_total = deopt(x); function int : deopt_float(opt int : x) ::promise_total = deopt(x); function bool : deopt_float(opt bool : x) ::promise_total = deopt(x); /** @group stdlib.optiontypes.float True iff \a x is absent */ function var bool: absent(var opt float: x) ::promise_total = not occurs(x); function var bool: occurs_internal_float(var opt float: x) ::promise_total = let { var bool : b; } in b; function var float : deopt_internal_float(var opt float : x) ::promise_total = let { var lb(x)..ub(x): y } in y; function var opt float: reverse_map_var_opt_float(var bool: occ, var float: d); % :NOTE: Must define in cpp? function opt float: reverse_map_var_opt_float(bool: occ, float: d) ::promise_total = if occ then d else <> endif; predicate mzn_reverse_map_var(var opt float: x) = let { var bool : b = occurs_internal_float(x); var float : dx = deopt_internal_float(x); constraint (x = reverse_map_var_opt_float(b,dx)) :: is_reverse_map; } in true; /** @group stdlib.optiontypes.float Weak addition. Return sum of \a x and \a y if both are present, otherwise return absent. */ function var opt float: '~+'(var opt float: x, var opt float: y) ::promise_total = let { float: l = if lb(x)=-infinity \/ lb(y)=-infinity then -infinity else lb(x)+lb(y) endif; float: u = if ub(x)=infinity \/ ub(y)=infinity then infinity else ub(x)+ub(y) endif; var opt l..u: result; constraint absent(x) \/ absent(y) -> result = <>; constraint absent(x) \/ absent(y) \/ result = deopt(x)+deopt(y); } in result; /** @group stdlib.optiontypes.float Weak subtraction. Return difference of \a x and \a y if both are present, otherwise return absent. */ function var opt float: '~-'(var opt float: x, var opt float: y) ::promise_total = let { float: l = if lb(x)=-infinity \/ ub(y)=infinity then -infinity else lb(x)-ub(y) endif; float: u = if ub(x)=infinity \/ lb(y)=-infinity then infinity else ub(x)-lb(y) endif; var opt l..u: result; constraint absent(x) \/ absent(y) -> result = <>; constraint absent(x) \/ absent(y) \/ result = deopt(x)-deopt(y); } in result; /** @group stdlib.optiontypes.float Weak multiplication. Return product of \a x and \a y if both are present, otherwise return absent. */ function var opt float: '~*'(var opt float: x, var opt float: y) ::promise_total = if absent(x) \/ absent(y) then <> else deopt(x)*deopt(y) endif; /** @group stdlib.optiontypes.float Weak equality. True if either \a x or \a y are absent, or present and equal.*/ function var bool: '~='(var opt float: x, var opt float: y) ::promise_total = absent(x) \/ absent(y) \/ deopt(x)=deopt(y); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_internal.mzn0000644000175000017500000016345113757304533023412 0ustar kaolkaol%-----------------------------------------------------------------------------% % % Internal compiler functions % % These functions are used internally by the compiler. % % domain constraints predicate var_dom(var int:x, set of int: s) = if has_bounds(x) /\ dom(x) subset s then true else x in s endif; predicate var_dom(var opt int:x, set of int: s) = let { var int: dx = deopt(x); set of int: new_dom = dom(dx) intersect s; } in if new_dom = {} then absent(x) else dx in new_dom endif; predicate var_dom(array[$T] of var opt int: x, set of int: d) = let { array[int] of var opt int: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); predicate var_dom(var set of int: x, set of int: s) = if has_ub_set(x) /\ ub(x) subset s then true else set_subset(x,s) endif; predicate var_dom(var float:x, float: l, float: u) = if has_bounds(x) /\ lb(x) >= l /\ ub(x) <= u then true else x >= l /\ x <= u endif; predicate var_dom(var float:x, set of float: d) = x in d; test var_dom(float:x, float: l, float: u) = x >= l /\ x <= u; test var_dom(float:x, set of float: d) = x in d; predicate var_dom(array[$T] of var set of int: x, set of int: d) = let { array[int] of var set of int: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); predicate var_dom(array[$T] of var int: x, set of int: d) = let { array[int] of var int: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); predicate var_dom(array[$T] of var float: x, float: l, float: u) = let { array[int] of var float: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],l,u)); predicate var_dom(array[$T] of var float: x, set of float: d) = let { array[int] of var float: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); test var_dom(array[$T] of set of int: x, set of int: d) = let { array[int] of set of int: xx = array1d(x) } in forall (i in index_set(xx)) (xx[i] subset d); test var_dom(array[$T] of int: x, set of int: d) = let { array[int] of int: xx = array1d(x) } in forall (i in index_set(xx)) (xx[i] in d); test var_dom(array[$T] of float: x, float: l, float: u) = let { array[int] of float: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],l,u)); test var_dom(array[$T] of float: x, set of float: d) = let { array[int] of float: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); predicate set_in(array[$T] of var int: X, set of int: s) = forall(x in array1d(X)) (x in s); predicate int_eq(array[$T] of var int: X, int: s) = forall(x in array1d(X)) (x = s); predicate float_eq(array[$T] of var int: X, float: s) = forall(x in array1d(X)) (x = s); predicate int_le(array[$T] of var int: X, int: s) = forall(x in array1d(X)) (x <= s); predicate int_le(int:s, array[$T] of var int: X) = forall(x in array1d(X)) (x >= s); predicate float_le(array[$T] of var float: X, float: s) = forall(x in array1d(X)) (x <= s); predicate float_le(float:s, array[$T] of var float: X) = forall(x in array1d(X)) (x >= s); predicate array_var_int_element(var int: x, array[int] of int: y, var int: z) = array_int_element(x,y,z); predicate array_var_bool_element(var int: x, array[int] of bool: y, var bool: z) = array_bool_element(x,y,z); predicate array_var_float_element(var int: x, array[int] of float: y, var float: z) = array_float_element(x,y,z); predicate array_var_set_element(var int: x, array[int] of set of int: y, var set of int: z) = array_set_element(x,y,z); predicate bool_opt_eq(var opt bool: x, var opt bool: y) = deopt(x)=deopt(y) /\ occurs(x)=occurs(y); /** True iff both \a b0 and \a b1 are absent or both are present and have the same value. */ predicate bool_eq(var opt bool: b0, var opt bool: b1) = (absent(b0) /\ absent(b1)) \/ (occurs(b0) /\ occurs(b1) /\ deopt(b0)=deopt(b1)); /** True iff \a b0 occurs and is equal to \a b1 */ predicate bool_eq(var opt bool: b0, var bool: b1) = occurs(b0) /\ deopt(b0)=b1; /** True iff \a b1 occurs and is equal to \a b0 */ predicate bool_eq(var bool: b0, var opt bool: b1) = occurs(b1) /\ deopt(b1)=b0; predicate bool_xor_reif(var bool: a, var bool: b, var bool: c) = bool_xor(a,b,c); predicate int_opt_eq(var opt int: x, var opt int: y) = deopt(x) = deopt(y) /\ occurs(x) = occurs(y); /** True iff both \a x and \a y are absent or both are present and have the same value. */ predicate int_eq(var opt int: x, var opt int: y) = (absent(x) /\ absent(y)) \/ (occurs(x) /\ occurs(y) /\ (deopt(x)=deopt(y))::maybe_partial); /** True iff only one of \a x and \a y is absent or both are present and have different values. */ predicate int_ne(var opt int : x, var opt int : y) = (absent(x) != absent(y)) \/ (occurs(x) /\ occurs(y) /\ (deopt(x)!=deopt(y))::maybe_partial); /** Constrains \a x \( \in \) \a S */ predicate set_in(var opt int: x, set of int: S) = if occurs(x) then deopt(x) in S endif; /** Constrains \a x \( \in \) \a S */ predicate set_in(var opt int: x, var set of int: S) = if occurs(x) then deopt(x) in S endif; % :NOTE: does it apply to float? /* predicate var_dom(var opt float:x, set of float: s) = let { var float: dx = deopt(x); set of float: new_dom = dom(dx) intersect s; } in if new_dom = {} then absent(x) else dx in new_dom endif; predicate var_dom(array[$T] of var opt float: x, set of float: d) = let { array[int] of var opt float: xx = array1d(x) } in forall (i in index_set(xx)) (var_dom(xx[i],d)); */ predicate float_dom(var opt float: x, array[int] of float: as) = let { var bool : b = occurs_internal_float(x); var float : dx = deopt_internal_float(x); constraint (x = reverse_map_var_opt_float(b,dx)) :: is_reverse_map; } in float_dom(dx, as); predicate float_opt_eq(var opt float: x, var opt float: y) = deopt(x) = deopt(y) /\ occurs(x) = occurs(y); /** True iff both \a x and \a y are absent or both are present and have the same value. */ predicate float_eq(var opt float: x, var opt float: y) = (absent(x) /\ absent(y)) \/ (occurs(x) /\ occurs(y) /\ (deopt(x)=deopt(y))::maybe_partial); /** True iff only one of \a x and \a y is absent or both are present and have different values. */ predicate float_ne(var opt float : x, var opt float : y) = (absent(x) != absent(y)) \/ (occurs(x) /\ occurs(y) /\ (deopt(x)!=deopt(y))::maybe_partial); predicate xorall_reif(array[int] of var bool: b, var bool: c) = let { var bool: nc ::is_defined_var; constraint xorall([nc]++b) ::defines_var(nc); } in c = not nc; function var int: lin_exp(array[int] of int, array[int] of var int, int); function var float: lin_exp(array[int] of float, array[int] of var float, float); test mzn_in_root_context(var $T); test mzn_in_redundant_constraint(); /* Internal function used to optimize over option type objective */ function var float: objective_deopt_(var opt float: x, bool: direction) = let { float: worst = if direction then lb(x)-1 else ub(x)+1 endif; } in if occurs(x) then deopt(x) else worst endif; %-----------------------------------------------------------------------------% % % Element constraint implementations % % MiniZinc compiles element constraints using a series of intermediate % functions that test whether the constraint is total and perform array slicing % for multi-dimensional element constraints. % %%%%%%%%%%%%%%%%%%% % Element on ints function var int: element_t(var int: idx, array[int] of var int: x) :: promise_total = let { var dom_bounds_array(x): r ::is_defined_var; constraint idx in index_set(x); constraint array_var_int_element_nonshifted(idx,x,r) ::defines_var(r); } in r; function var int: element_mt(var int: idx, array[int] of var int: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; var min(index_set(x))..max(index_set(x)): idx2; constraint idx in index_set(x) -> idx2=idx; constraint idx in index_set(x) \/ idx2=min(index_set(x)); constraint array_var_int_element_nonshifted(idx2,x,r) ::defines_var(r); } in r; function var int: element_t(var int: idx1, var int: idx2, array[int,int] of var int: x) :: promise_total = let { var dom_bounds_array(x): r ::is_defined_var; constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); constraint array_var_int_element2d_nonshifted(idx1,idx2,x,r) ::defines_var(r); } in r; function var int: element_mt(var int: idx1, var int: idx2, array[int,int] of var int: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; var min(index_set_1of2(x))..max(index_set_1of2(x)): idx1_2; var min(index_set_2of2(x))..max(index_set_2of2(x)): idx2_2; constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) -> (idx1_2=idx1 /\ idx2_2=idx2); constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) \/ (idx1_2=min(index_set_1of2(x)) /\ idx2_2=min(index_set_2of2(x))); constraint array_var_int_element2d_nonshifted(idx1_2,idx2_2,x,r) ::defines_var(r); } in r; function var int: element(var int: idx, array[int] of var int: x) = if mzn_in_root_context(idx) then let { constraint idx in index_set(x) } in element_t(idx,x) elseif (has_bounds(idx) /\ lb(idx) >= min(index_set(x)) /\ ub(idx) <= max(index_set(x))) then element_t(idx,x) else let { constraint idx in index_set(x) } in element_mt(idx,x) endif; function var int: element(var int: idx1, var int: idx2, array[int,int] of var int: x) = let { int: dim = card(index_set_2of2(x)); } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_t(idx1, idx2, x) elseif ((has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of2(x)) /\ ub(idx1) <= max(index_set_1of2(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of2(x)) /\ ub(idx2) <= max(index_set_2of2(x)))) then element_t(idx1,idx2,x) else let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_mt(idx1,idx2,x) endif; function var int: element(var int: idx1, var int: idx2, var int: idx3, array[int,int,int] of var int: x) = let { int: dim2 = card(index_set_2of3(x)); int: dim3 = card(index_set_3of3(x)); int: min = min(index_set_1of3(x))*dim2*dim3+ min(index_set_2of3(x))*dim3+ min(index_set_3of3(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of3(x)) /\ ub(idx1) <= max(index_set_1of3(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of3(x)) /\ ub(idx2) <= max(index_set_2of3(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of3(x)) /\ ub(idx3) <= max(index_set_3of3(x)))) then element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_mt( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) endif; function var int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, array[int,int,int,int] of var int: x) = let { int: dim2 = card(index_set_2of4(x)); int: dim3 = card(index_set_3of4(x)); int: dim4 = card(index_set_4of4(x)); int: min = min(index_set_1of4(x))*dim2*dim3*dim4+ min(index_set_2of4(x))*dim3*dim4+ min(index_set_3of4(x))*dim4+ min(index_set_4of4(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of4(x)) /\ ub(idx1) <= max(index_set_1of4(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of4(x)) /\ ub(idx2) <= max(index_set_2of4(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of4(x)) /\ ub(idx3) <= max(index_set_3of4(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of4(x)) /\ ub(idx4) <= max(index_set_4of4(x))) ) then element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_mt( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) endif; function var int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, array[int,int,int,int,int] of var int: x) = let { int: dim2 = card(index_set_2of5(x)); int: dim3 = card(index_set_3of5(x)); int: dim4 = card(index_set_4of5(x)); int: dim5 = card(index_set_5of5(x)); int: min = min(index_set_1of5(x))*dim2*dim3*dim4*dim5+ min(index_set_2of5(x))*dim3*dim4*dim5+ min(index_set_3of5(x))*dim4*dim5+ min(index_set_4of5(x))*dim5+ min(index_set_5of5(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of5(x)) /\ ub(idx1) <= max(index_set_1of5(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of5(x)) /\ ub(idx2) <= max(index_set_2of5(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of5(x)) /\ ub(idx3) <= max(index_set_3of5(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of5(x)) /\ ub(idx4) <= max(index_set_4of5(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of5(x)) /\ ub(idx5) <= max(index_set_5of5(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) endif; function var int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, var int: idx6, array[int,int,int,int,int,int] of var int: x) = let { int: dim2 = card(index_set_2of6(x)); int: dim3 = card(index_set_3of6(x)); int: dim4 = card(index_set_4of6(x)); int: dim5 = card(index_set_5of6(x)); int: dim6 = card(index_set_6of6(x)); int: min = min(index_set_1of6(x))*dim2*dim3*dim4*dim5*dim6+ min(index_set_2of6(x))*dim3*dim4*dim5*dim6+ min(index_set_3of6(x))*dim4*dim5*dim6+ min(index_set_4of6(x))*dim5*dim6+ min(index_set_5of6(x))*dim6+ min(index_set_6of6(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of6(x)) /\ ub(idx1) <= max(index_set_1of6(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of6(x)) /\ ub(idx2) <= max(index_set_2of6(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of6(x)) /\ ub(idx3) <= max(index_set_3of6(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of6(x)) /\ ub(idx4) <= max(index_set_4of6(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of6(x)) /\ ub(idx5) <= max(index_set_5of6(x))) /\ (has_bounds(idx6) /\ lb(idx6) >= min(index_set_6of6(x)) /\ ub(idx6) <= max(index_set_6of6(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) endif; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt int: element(var opt int: idx, array[int] of var int: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt int: element(var opt int: idx1, var opt int: idx2, array[int,int] of var int: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; /** Return \a x[\a idx] */ function var opt int: element(var int: idx, array[int] of var opt int: x) = let { var opt int: r; constraint occurs(r) = element(idx,array1d(index_set(x),[occurs(x[i]) | i in index_set(x)])); constraint deopt(r) = element(idx, array1d(index_set(x), [if is_fixed(absent(x[i])) /\ fix(absent(x[i])) then deopt(r) else deopt(x[i]) endif | i in index_set(x)])); } in r; /** Return \a x[\a idx1, \a idx2] */ function var opt int: element(var int: idx1, var int: idx2, array[int,int] of var opt int: x) = let { var opt int: r; constraint occurs(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[occurs(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)])); constraint deopt(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[if is_fixed(absent(x[i,j])) /\ fix(absent(x[i,j])) then deopt(r) else deopt(x[i,j]) endif | i in index_set_1of2(x), j in index_set_2of2(x)])); } in r; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt int: element(var opt int: idx, array[int] of var opt int: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt int: element(var opt int: idx1, var opt int: idx2, array[int,int] of var opt int: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; %%%%%%%%%%%%%%%%%%% % Element on floats function var float: element_t(var int: idx, array[int] of var float: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; constraint idx in index_set(x); constraint array_var_float_element_nonshifted(idx,x,r) ::defines_var(r); } in r; function var float: element_mt(var int: idx, array[int] of var float: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; var min(index_set(x))..max(index_set(x)): idx2; constraint idx in index_set(x) -> idx2=idx; constraint idx in index_set(x) \/ idx2=min(index_set(x)); constraint array_var_float_element_nonshifted(idx2,x,r) ::defines_var(r); } in r; function var float: element_t(var int: idx1, var int: idx2, array[int,int] of var float: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); constraint array_var_float_element2d_nonshifted(idx1,idx2,x,r) ::defines_var(r); } in r; function var float: element_mt(var int: idx1, var int: idx2, array[int,int] of var float: x) :: promise_total = let { var lb_array(x)..ub_array(x): r ::is_defined_var; var min(index_set_1of2(x))..max(index_set_1of2(x)): idx1_2; var min(index_set_2of2(x))..max(index_set_2of2(x)): idx2_2; constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) -> (idx1_2=idx1 /\ idx2_2=idx2); constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) \/ (idx1_2=min(index_set_1of2(x)) /\ idx2_2=min(index_set_2of2(x))); constraint array_var_float_element2d_nonshifted(idx1_2,idx2_2,x,r) ::defines_var(r); } in r; function var float: element(var int: idx, array[int] of var float: x) = if mzn_in_root_context(idx) then let { constraint idx in index_set(x) } in element_t(idx,x) elseif (has_bounds(idx) /\ lb(idx) >= min(index_set(x)) /\ ub(idx) <= max(index_set(x))) then element_t(idx,x) else let { constraint idx in index_set(x) } in element_mt(idx,x) endif; function var float: element(var int: idx1, var int: idx2, array[int,int] of var float: x) = let { int: dim = card(index_set_2of2(x)); } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_t(idx1,idx2,x) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of2(x)) /\ ub(idx1) <= max(index_set_1of2(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of2(x)) /\ ub(idx2) <= max(index_set_2of2(x))) ) then element_t(idx1,idx2,x) else let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_mt(idx1,idx2,x) endif; function var float: element(var int: idx1, var int: idx2, var int: idx3, array[int,int,int] of var float: x) = let { int: dim2 = card(index_set_2of3(x)); int: dim3 = card(index_set_3of3(x)); int: min = min(index_set_1of3(x))*dim2*dim3+ min(index_set_2of3(x))*dim3+ min(index_set_3of3(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of3(x)) /\ ub(idx1) <= max(index_set_1of3(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of3(x)) /\ ub(idx2) <= max(index_set_2of3(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of3(x)) /\ ub(idx3) <= max(index_set_3of3(x))) ) then element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_mt( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) endif; function var float: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, array[int,int,int,int] of var float: x) = let { int: dim2 = card(index_set_2of4(x)); int: dim3 = card(index_set_3of4(x)); int: dim4 = card(index_set_4of4(x)); int: min = min(index_set_1of4(x))*dim2*dim3*dim4+ min(index_set_2of4(x))*dim3*dim4+ min(index_set_3of4(x))*dim4+ min(index_set_4of4(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of4(x)) /\ ub(idx1) <= max(index_set_1of4(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of4(x)) /\ ub(idx2) <= max(index_set_2of4(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of4(x)) /\ ub(idx3) <= max(index_set_3of4(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of4(x)) /\ ub(idx4) <= max(index_set_4of4(x))) ) then element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_mt( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) endif; function var float: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, array[int,int,int,int,int] of var float: x) = let { int: dim2 = card(index_set_2of5(x)); int: dim3 = card(index_set_3of5(x)); int: dim4 = card(index_set_4of5(x)); int: dim5 = card(index_set_5of5(x)); int: min = min(index_set_1of5(x))*dim2*dim3*dim4*dim5+ min(index_set_2of5(x))*dim3*dim4*dim5+ min(index_set_3of5(x))*dim4*dim5+ min(index_set_4of5(x))*dim5+ min(index_set_5of5(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of5(x)) /\ ub(idx1) <= max(index_set_1of5(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of5(x)) /\ ub(idx2) <= max(index_set_2of5(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of5(x)) /\ ub(idx3) <= max(index_set_3of5(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of5(x)) /\ ub(idx4) <= max(index_set_4of5(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of5(x)) /\ ub(idx5) <= max(index_set_5of5(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) endif; function var float: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, var int: idx6, array[int,int,int,int,int,int] of var float: x) = let { int: dim2 = card(index_set_2of6(x)); int: dim3 = card(index_set_3of6(x)); int: dim4 = card(index_set_4of6(x)); int: dim5 = card(index_set_5of6(x)); int: dim6 = card(index_set_6of6(x)); int: min = min(index_set_1of6(x))*dim2*dim3*dim4*dim5*dim6+ min(index_set_2of6(x))*dim3*dim4*dim5*dim6+ min(index_set_3of6(x))*dim4*dim5*dim6+ min(index_set_4of6(x))*dim5*dim6+ min(index_set_5of6(x))*dim6+ min(index_set_6of6(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of6(x)) /\ ub(idx1) <= max(index_set_1of6(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of6(x)) /\ ub(idx2) <= max(index_set_2of6(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of6(x)) /\ ub(idx3) <= max(index_set_3of6(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of6(x)) /\ ub(idx4) <= max(index_set_4of6(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of6(x)) /\ ub(idx5) <= max(index_set_5of6(x))) /\ (has_bounds(idx6) /\ lb(idx6) >= min(index_set_6of6(x)) /\ ub(idx6) <= max(index_set_6of6(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) endif; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt float: element(var opt int: idx, array[int] of var float: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt float: element(var opt int: idx1, var opt int: idx2, array[int,int] of var float: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; /** Return \a x[\a idx] */ function var opt float: element(var int: idx, array[int] of var opt float: x) = let { var opt float: r; constraint occurs(r) = element(idx,array1d(index_set(x),[occurs(x[i]) | i in index_set(x)])); constraint deopt(r) = element(idx,array1d(index_set(x),[deopt(x[i]) | i in index_set(x)])); } in r; /** Return \a x[\a idx1, \a idx2] */ function var opt float: element(var int: idx1, var int: idx2, array[int,int] of var opt float: x) = let { var opt float: r; constraint occurs(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[occurs(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)])); constraint deopt(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[deopt(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)])); } in r; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt float: element(var opt int: idx, array[int] of var opt float: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt float: element(var opt int: idx1, var opt int: idx2, array[int,int] of var opt float: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; %%%%%%%%%%%%%%%%% % Element on sets function var set of int: element_t(var int: idx, array[int] of var set of int: x) :: promise_total = let { var set of min(ub_array(x))..max(ub_array(x)): r ::is_defined_var; constraint idx in index_set(x); constraint array_var_set_element_nonshifted(idx,x,r) ::defines_var(r); } in r; function var set of int: element_mt(var int: idx, array[int] of var set of int: x) :: promise_total = let { var set of min(ub_array(x))..max(ub_array(x)): r ::is_defined_var; var min(index_set(x))..max(index_set(x)): idx2; constraint idx in index_set(x) -> idx2=idx; constraint idx in index_set(x) \/ idx2=min(index_set(x)); constraint array_var_set_element_nonshifted(idx2,x,r) ::defines_var(r); } in r; function var set of int: element_t(var int: idx1, var int: idx2, array[int,int] of var set of int: x) :: promise_total = let { var set of min(ub_array(x))..max(ub_array(x)): r ::is_defined_var; constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); constraint array_var_set_element2d_nonshifted(idx1,idx2,x,r) ::defines_var(r); } in r; function var set of int: element_mt(var int: idx1, var int: idx2, array[int,int] of var set of int: x) :: promise_total = let { var set of min(ub_array(x))..max(ub_array(x)): r ::is_defined_var; var min(index_set_1of2(x))..max(index_set_1of2(x)): idx1_2; var min(index_set_2of2(x))..max(index_set_2of2(x)): idx2_2; constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) -> (idx1_2=idx1 /\ idx2_2=idx2); constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) \/ (idx1_2=min(index_set_1of2(x)) /\ idx2_2=min(index_set_2of2(x))); constraint array_var_set_element2d_nonshifted(idx1_2,idx2_2,x,r) ::defines_var(r); } in r; function var set of int: element(var int: idx, array[int] of var set of int: x) = if mzn_in_root_context(idx) then let { constraint idx in index_set(x) } in element_t(idx,x) elseif (has_bounds(idx) /\ lb(idx) >= min(index_set(x)) /\ ub(idx) <= max(index_set(x))) then element_t(idx,x) else let { constraint idx in index_set(x) } in element_mt(idx,x) endif; function var set of int: element(var int: idx1, var int: idx2, array[int,int] of var set of int: x) = let { int: dim = card(index_set_2of2(x)); } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_t(idx1,idx2,x) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of2(x)) /\ ub(idx1) <= max(index_set_1of2(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of2(x)) /\ ub(idx2) <= max(index_set_2of2(x))) ) then element_t(idx1,idx2,x) else let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_mt(idx1,idx2,x) endif; function var set of int: element(var int: idx1, var int: idx2, var int: idx3, array[int,int,int] of var set of int: x) = let { int: dim2 = card(index_set_2of3(x)); int: dim3 = card(index_set_3of3(x)); int: min = min(index_set_1of3(x))*dim2*dim3+ min(index_set_2of3(x))*dim3+ min(index_set_3of3(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of3(x)) /\ ub(idx1) <= max(index_set_1of3(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of3(x)) /\ ub(idx2) <= max(index_set_2of3(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of3(x)) /\ ub(idx3) <= max(index_set_3of3(x))) ) then element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_mt( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) endif; function var set of int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, array[int,int,int,int] of var set of int: x) = let { int: dim2 = card(index_set_2of4(x)); int: dim3 = card(index_set_3of4(x)); int: dim4 = card(index_set_4of4(x)); int: min = min(index_set_1of4(x))*dim2*dim3*dim4+ min(index_set_2of4(x))*dim3*dim4+ min(index_set_3of4(x))*dim4+ min(index_set_4of4(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of4(x)) /\ ub(idx1) <= max(index_set_1of4(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of4(x)) /\ ub(idx2) <= max(index_set_2of4(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of4(x)) /\ ub(idx3) <= max(index_set_3of4(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of4(x)) /\ ub(idx4) <= max(index_set_4of4(x))) ) then element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_mt( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) endif; function var set of int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, array[int,int,int,int,int] of var set of int: x) = let { int: dim2 = card(index_set_2of5(x)); int: dim3 = card(index_set_3of5(x)); int: dim4 = card(index_set_4of5(x)); int: dim5 = card(index_set_5of5(x)); int: min = min(index_set_1of5(x))*dim2*dim3*dim4*dim5+ min(index_set_2of5(x))*dim3*dim4*dim5+ min(index_set_3of5(x))*dim4*dim5+ min(index_set_4of5(x))*dim5+ min(index_set_5of5(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of5(x)) /\ ub(idx1) <= max(index_set_1of5(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of5(x)) /\ ub(idx2) <= max(index_set_2of5(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of5(x)) /\ ub(idx3) <= max(index_set_3of5(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of5(x)) /\ ub(idx4) <= max(index_set_4of5(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of5(x)) /\ ub(idx5) <= max(index_set_5of5(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) endif; function var set of int: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, var int: idx6, array[int,int,int,int,int,int] of var set of int: x) = let { int: dim2 = card(index_set_2of6(x)); int: dim3 = card(index_set_3of6(x)); int: dim4 = card(index_set_4of6(x)); int: dim5 = card(index_set_5of6(x)); int: dim6 = card(index_set_6of6(x)); int: min = min(index_set_1of6(x))*dim2*dim3*dim4*dim5*dim6+ min(index_set_2of6(x))*dim3*dim4*dim5*dim6+ min(index_set_3of6(x))*dim4*dim5*dim6+ min(index_set_4of6(x))*dim5*dim6+ min(index_set_5of6(x))*dim6+ min(index_set_6of6(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of6(x)) /\ ub(idx1) <= max(index_set_1of6(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of6(x)) /\ ub(idx2) <= max(index_set_2of6(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of6(x)) /\ ub(idx3) <= max(index_set_3of6(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of6(x)) /\ ub(idx4) <= max(index_set_4of6(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of6(x)) /\ ub(idx5) <= max(index_set_5of6(x))) /\ (has_bounds(idx6) /\ lb(idx6) >= min(index_set_6of6(x)) /\ ub(idx6) <= max(index_set_6of6(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) endif; %%%%%%%%%%%%%%%%%% % Element on bools function var bool: element_t(var int: idx, array[int] of var bool: x) :: promise_total = let { var bool: r ::is_defined_var; constraint idx in index_set(x); constraint array_var_bool_element_nonshifted(idx,x,r) ::defines_var(r); } in r; function var bool: element_mt(var int: idx, array[int] of var bool: x) :: promise_total = let { var bool: r ::is_defined_var; var min(index_set(x))..max(index_set(x)): idx2; constraint idx in index_set(x) -> idx2=idx; constraint idx in index_set(x) \/ idx2=min(index_set(x)); constraint array_var_bool_element_nonshifted(idx2,x,r) ::defines_var(r); } in r; function var bool: element_t(var int: idx1, var int: idx2, array[int,int] of var bool: x) :: promise_total = let { var bool: r ::is_defined_var; constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); constraint array_var_bool_element2d_nonshifted(idx1,idx2,x,r) ::defines_var(r); } in r; function var bool: element_mt(var int: idx1, var int: idx2, array[int,int] of var bool: x) :: promise_total = let { var bool: r ::is_defined_var; var min(index_set_1of2(x))..max(index_set_1of2(x)): idx1_2; var min(index_set_2of2(x))..max(index_set_2of2(x)): idx2_2; constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) -> (idx1_2=idx1 /\ idx2_2=idx2); constraint (idx1 in index_set_1of2(x) /\ idx2 in index_set_2of2(x)) \/ (idx1_2=min(index_set_1of2(x)) /\ idx2_2=min(index_set_2of2(x))); constraint array_var_bool_element2d_nonshifted(idx1_2,idx2_2,x,r) ::defines_var(r); } in r; function var bool: element(var int: idx, array[int] of var bool: x) = if mzn_in_root_context(idx) then idx in index_set(x) /\ element_t(idx,x) elseif (has_bounds(idx) /\ lb(idx) >= min(index_set(x)) /\ ub(idx) <= max(index_set(x))) then element_t(idx,x) else idx in index_set(x) /\ element_mt(idx,x) endif; function var bool: element(var int: idx1, var int: idx2, array[int,int] of var bool: x) = let { int: dim = card(index_set_2of2(x)); } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_t(idx1, idx2, x) elseif ((has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of2(x)) /\ ub(idx1) <= max(index_set_1of2(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of2(x)) /\ ub(idx2) <= max(index_set_2of2(x)))) then element_t(idx1,idx2,x) else let { constraint idx1 in index_set_1of2(x); constraint idx2 in index_set_2of2(x); } in element_mt(idx1,idx2,x) endif; function var bool: element(var int: idx1, var int: idx2, var int: idx3, array[int,int,int] of var bool: x) = let { int: dim2 = card(index_set_2of3(x)); int: dim3 = card(index_set_3of3(x)); int: min = min(index_set_1of3(x))*dim2*dim3+ min(index_set_2of3(x))*dim3+ min(index_set_3of3(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of3(x)) /\ ub(idx1) <= max(index_set_1of3(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of3(x)) /\ ub(idx2) <= max(index_set_2of3(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of3(x)) /\ ub(idx3) <= max(index_set_3of3(x))) ) then element_t( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of3(x); constraint idx2 in index_set_2of3(x); constraint idx3 in index_set_3of3(x); } in element_mt( (idx1*(dim2*dim3)+idx2*dim3+idx3-min)::domain, array1d(x)) endif; function var bool: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, array[int,int,int,int] of var bool: x) = let { int: dim2 = card(index_set_2of4(x)); int: dim3 = card(index_set_3of4(x)); int: dim4 = card(index_set_4of4(x)); int: min = min(index_set_1of4(x))*dim2*dim3*dim4+ min(index_set_2of4(x))*dim3*dim4+ min(index_set_3of4(x))*dim4+ min(index_set_4of4(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of4(x)) /\ ub(idx1) <= max(index_set_1of4(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of4(x)) /\ ub(idx2) <= max(index_set_2of4(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of4(x)) /\ ub(idx3) <= max(index_set_3of4(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of4(x)) /\ ub(idx4) <= max(index_set_4of4(x))) ) then element_t( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of4(x); constraint idx2 in index_set_2of4(x); constraint idx3 in index_set_3of4(x); constraint idx4 in index_set_4of4(x); } in element_mt( (idx1*(dim2*dim3*dim4)+idx2*(dim3*dim4)+idx3*dim4+idx4-min)::domain, array1d(x)) endif; function var bool: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, array[int,int,int,int,int] of var bool: x) = let { int: dim2 = card(index_set_2of5(x)); int: dim3 = card(index_set_3of5(x)); int: dim4 = card(index_set_4of5(x)); int: dim5 = card(index_set_5of5(x)); int: min = min(index_set_1of5(x))*dim2*dim3*dim4*dim5+ min(index_set_2of5(x))*dim3*dim4*dim5+ min(index_set_3of5(x))*dim4*dim5+ min(index_set_4of5(x))*dim5+ min(index_set_5of5(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of5(x)) /\ ub(idx1) <= max(index_set_1of5(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of5(x)) /\ ub(idx2) <= max(index_set_2of5(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of5(x)) /\ ub(idx3) <= max(index_set_3of5(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of5(x)) /\ ub(idx4) <= max(index_set_4of5(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of5(x)) /\ ub(idx5) <= max(index_set_5of5(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of5(x); constraint idx2 in index_set_2of5(x); constraint idx3 in index_set_3of5(x); constraint idx4 in index_set_4of5(x); constraint idx5 in index_set_5of5(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5)+idx2*(dim3*dim4*dim5)+idx3*(dim4*dim5)+idx4*dim5+idx5-min)::domain, array1d(x)) endif; function var bool: element(var int: idx1, var int: idx2, var int: idx3, var int: idx4, var int: idx5, var int: idx6, array[int,int,int,int,int,int] of var bool: x) = let { int: dim2 = card(index_set_2of6(x)); int: dim3 = card(index_set_3of6(x)); int: dim4 = card(index_set_4of6(x)); int: dim5 = card(index_set_5of6(x)); int: dim6 = card(index_set_6of6(x)); int: min = min(index_set_1of6(x))*dim2*dim3*dim4*dim5*dim6+ min(index_set_2of6(x))*dim3*dim4*dim5*dim6+ min(index_set_3of6(x))*dim4*dim5*dim6+ min(index_set_4of6(x))*dim5*dim6+ min(index_set_5of6(x))*dim6+ min(index_set_6of6(x))-1; } in if mzn_in_root_context(idx1) then let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) elseif ( (has_bounds(idx1) /\ lb(idx1) >= min(index_set_1of6(x)) /\ ub(idx1) <= max(index_set_1of6(x))) /\ (has_bounds(idx2) /\ lb(idx2) >= min(index_set_2of6(x)) /\ ub(idx2) <= max(index_set_2of6(x))) /\ (has_bounds(idx3) /\ lb(idx3) >= min(index_set_3of6(x)) /\ ub(idx3) <= max(index_set_3of6(x))) /\ (has_bounds(idx4) /\ lb(idx4) >= min(index_set_4of6(x)) /\ ub(idx4) <= max(index_set_4of6(x))) /\ (has_bounds(idx5) /\ lb(idx5) >= min(index_set_5of6(x)) /\ ub(idx5) <= max(index_set_5of6(x))) /\ (has_bounds(idx6) /\ lb(idx6) >= min(index_set_6of6(x)) /\ ub(idx6) <= max(index_set_6of6(x))) ) then element_t( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) else let { constraint idx1 in index_set_1of6(x); constraint idx2 in index_set_2of6(x); constraint idx3 in index_set_3of6(x); constraint idx4 in index_set_4of6(x); constraint idx5 in index_set_5of6(x); constraint idx6 in index_set_6of6(x); } in element_mt( (idx1*(dim2*dim3*dim4*dim5*dim6)+idx2*(dim3*dim4*dim5*dim6)+idx3*(dim4*dim5*dim6)+idx4*(dim5*dim6)+idx5*dim6+idx6-min)::domain, array1d(x)) endif; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt bool: element(var opt int: idx, array[int] of var bool: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt bool: element(var opt int: idx1, var opt int: idx2, array[int,int] of var bool: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; /** Return \a x[\a idx] */ function var opt bool: element(var int: idx, array[int] of var opt bool: x) = let { var opt bool: r; constraint occurs(r) = element(idx,array1d(index_set(x),[occurs(x[i]) | i in index_set(x)])); constraint deopt(r) = element(idx,array1d(index_set(x),[deopt(x[i]) | i in index_set(x)])); } in r; /** Return \a x[\a idx1, \a idx2] */ function var opt bool: element(var int: idx1, var int: idx2, array[int,int] of var opt bool: x) = let { var opt bool: r; constraint occurs(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[occurs(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)])); constraint deopt(r) = element(idx1,idx2, array2d(index_set_1of2(x),index_set_2of2(x),[deopt(x[i,j]) | i in index_set_1of2(x), j in index_set_2of2(x)])); } in r; /** Return absent if \a idx is absent, otherwise return \a x[\a idx] */ function var opt bool: element(var opt int: idx, array[int] of var opt bool: x) = if absent(idx) then <> else element(deopt(idx),x) endif; /** Return absent if \a idx1 or \a idx2 is absent, otherwise return \a x[\a idx1, \a idx2] */ function var opt bool: element(var opt int: idx1, var opt int: idx2, array[int,int] of var opt bool: x) = if absent(idx1) \/ absent(idx2) then <> else element(deopt(idx1),deopt(idx2),x) endif; %-----------------------------------------------------------------------------% % % Internal functions for implementing div, mod etc function set of int:compute_div_bounds(var int: x, var int: y); function var int: div_t(var int: x, var int: y) :: promise_total = let { var (compute_div_bounds(x,y)): z ::is_defined_var; constraint y != 0; constraint int_div(x,y,z) ::defines_var(z); } in z; function var int: div_mt(var int: x, var int: y) :: promise_total = let { var ((dom(y) diff {0}) union {1}): yy = if y=0 then 1 else y endif; } in div_t(x,yy); function var float: fldiv_t(var float: x, float: y) :: promise_total = x*(1.0/y); function var float: fldiv_t(var float: x, var float: y) :: promise_total = let { var float: z ::is_defined_var; % TODO: Compute division boundaries constraint if lb(y) <= 0 /\ ub(y) >= 0 then y != 0.0 endif; constraint float_div(x, y, z) ::defines_var(z); } in z; function var float: fldiv_mt(var float: x, var float: y) :: promise_total = let { var (lb(y)..ub(y) diff {0.0}) union {1.0}: yy = if (y = 0.0) then 1.0 else y endif; } in fldiv_t(x, yy); function var int: mod_t(var int: x, var int: y) :: promise_total = let { var -(max(ub(y),-lb(y)))..max(ub(y),-lb(y)): z; constraint y != 0; constraint int_mod(x,y,z); } in z; function var int: mod_mt(var int: x, var int: y) :: promise_total = let { var {1} union dom(y): yy = if y=0 then 1 else y endif; } in mod_t(x,yy); function var int: product_rec(array[int] of var int: x) = if length(x)=0 then 1 elseif length(x)=1 then x[min(index_set(x))] else let { array[int] of var int: xx = array1d(x); array[index_set(xx)] of var int: y; constraint y[1] = xx[1]; constraint forall (i in 2..length(y)) (y[i]=y[i-1]*xx[i]); } in y[length(y)] endif; function var float: product_rec(array[int] of var float: x) = if length(x)=0 then 1.0 elseif length(x)=1 then x[min(index_set(x))] else let { array[int] of var float: xx = array1d(x); array[index_set(xx)] of var float: y; constraint y[1] = xx[1]; constraint forall (i in 2..length(y)) (y[i]=y[i-1]*xx[i]); } in y[length(y)] endif; function var int: max_t(array[int] of var int: x) :: promise_total = if length(x)=0 then 0 elseif length(x)=1 then x[min(index_set(x))] elseif length(x)=2 then max(x[1],x[2]) else let { var lb_array(x)..ub_array(x): m ::is_defined_var; constraint array_int_maximum(m,x) ::defines_var(m); } in m endif; function var int: min_t(array[int] of var int: x) :: promise_total = if length(x)=0 then 0 elseif length(x)=1 then x[1] elseif length(x)=2 then min(x[1],x[2]) else let { var lb_array(x)..ub_array(x): m ::is_defined_var; constraint array_int_minimum(m,x) ::defines_var(m); } in m endif; function var float: max_t(array[int] of var float: x) :: promise_total = if length(x)=0 then 0.0 elseif length(x)=1 then x[min(index_set(x))] elseif length(x)=2 then max(x[1],x[2]) else let { var lb_array(x)..ub_array(x): m ::is_defined_var; constraint array_float_maximum(m,x) ::defines_var(m); } in m endif; function var float: min_t(array[int] of var float: x) :: promise_total = if length(x)=0 then 0.0 elseif length(x)=1 then x[1] elseif length(x)=2 then min(x[1],x[2]) else let { var lb_array(x)..ub_array(x): m ::is_defined_var; constraint array_float_minimum(m,x) ::defines_var(m); } in m endif; /* These predicates are used to intercept symmetry_breaking_constraint and * redundant_constraint calls in user models, so that they can be ignored * if the corresponding options have been set. */ predicate mzn_symmetry_breaking_constraint(var bool: b); predicate mzn_redundant_constraint(var bool: b); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_array.mzn0000644000175000017500000007557713757304533022727 0ustar kaolkaol/*** @groupdef stdlib.array Array operations These functions implement the basic operations on arrays. */ /** @group stdlib.array Return the concatenation of arrays \a x and \a y */ function array[int] of $T: '++'(array[int] of $T: x, array[int] of $T: y); /** @group stdlib.array Return the concatenation of arrays \a x and \a y */ function array[int] of opt $T: '++'(array[int] of opt $T: x, array[int] of opt $T: y); /** @group stdlib.array Return the concatenation of arrays \a x and \a y */ function array[int] of var $T: '++'(array[int] of var $T: x, array[int] of var $T: y); /** @group stdlib.array Return the concatenation of arrays \a x and \a y */ function array[int] of var opt $T: '++'(array[int] of var opt $T: x, array[int] of var opt $T: y); /** @group stdlib.array Return the length of array \a x Note that the length is defined as the number of elements in the array, regardless of its dimensionality. */ function int: length(array[$T] of var opt $U: x); /** @group stdlib.array Return the array \a x in reverse order The resulting array has the same index set as \a x. */ function array[$$E] of $T: reverse(array[$$E] of $T: x) = if length(x)=0 then [] else let { int: l = max(index_set(x))+min(index_set(x)) } in array1d(index_set(x),[x[l-i] | i in index_set(x)]) endif; /** @group stdlib.array Return the array \a x in reverse order The resulting array has the same index set as \a x. */ function array[$$E] of opt $T: reverse(array[$$E] of opt $T: x) = if length(x)=0 then [] else let { int: l = max(index_set(x))+min(index_set(x)) } in array1d(index_set(x),[x[l-i] | i in index_set(x)]) endif; /** @group stdlib.array Return the array \a x in reverse order The resulting array has the same index set as \a x. */ function array[$$E] of var $T: reverse(array[$$E] of var $T: x) = if length(x)=0 then [] else let { int: l = max(index_set(x))+min(index_set(x)) } in array1d(index_set(x),[x[l-i] | i in index_set(x)]) endif; /** @group stdlib.array Return the array \a x in reverse order The resulting array has the same index set as \a x. */ function array[$$E] of var opt $T: reverse(array[$$E] of var opt $T: x) = if length(x)=0 then [] else let { int: l = max(index_set(x))+min(index_set(x)) } in array1d(index_set(x),[x[l-i] | i in index_set(x)]) endif; /** @group stdlib.array Test if \a x and \a y have the same index sets */ test index_sets_agree(array[$T] of var opt $U: x, array[$T] of var opt $W: y); /** @group stdlib.array Return index set of one-dimensional array \a x */ function set of $$E: index_set(array[$$E] of var opt $U: x); /** @group stdlib.array Return index set of first dimension of two-dimensional array \a x */ function set of $$E: index_set_1of2(array[$$E,int] of var opt $U: x); /** @group stdlib.array Return index set of second dimension of two-dimensional array \a x */ function set of $$E: index_set_2of2(array[int,$$E] of var opt $U: x); /** @group stdlib.array Return index set of first dimension of 3-dimensional array \a x */ function set of $$E: index_set_1of3(array[$$E,int,int] of var opt $U: x); /** @group stdlib.array Return index set of second dimension of 3-dimensional array \a x */ function set of $$E: index_set_2of3(array[int,$$E,int] of var opt $U: x); /** @group stdlib.array Return index set of third dimension of 3-dimensional array \a x */ function set of $$E: index_set_3of3(array[int,int,$$E] of var opt $U: x); /** @group stdlib.array Return index set of first dimension of 4-dimensional array \a x */ function set of $$E: index_set_1of4(array[$$E,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of second dimension of 4-dimensional array \a x */ function set of $$E: index_set_2of4(array[int,$$E,int,int] of var opt $U: x); /** @group stdlib.array Return index set of third dimension of 4-dimensional array \a x */ function set of $$E: index_set_3of4(array[int,int,$$E,int] of var opt $U: x); /** @group stdlib.array Return index set of fourth dimension of 4-dimensional array \a x */ function set of $$E: index_set_4of4(array[int,int,int,$$E] of var opt $U: x); /** @group stdlib.array Return index set of first dimension of 5-dimensional array \a x */ function set of $$E: index_set_1of5(array[$$E,int,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of second dimension of 5-dimensional array \a x */ function set of $$E: index_set_2of5(array[int,$$E,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of third dimension of 5-dimensional array \a x */ function set of $$E: index_set_3of5(array[int,int,$$E,int,int] of var opt $U: x); /** @group stdlib.array Return index set of fourth dimension of 5-dimensional array \a x */ function set of $$E: index_set_4of5(array[int,int,int,$$E,int] of var opt $U: x); /** @group stdlib.array Return index set of fifth dimension of 5-dimensional array \a x */ function set of $$E: index_set_5of5(array[int,int,int,int,$$E] of var opt $U: x); /** @group stdlib.array Return index set of first dimension of 6-dimensional array \a x */ function set of $$E: index_set_1of6(array[$$E,int,int,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of second dimension of 6-dimensional array \a x */ function set of $$E: index_set_2of6(array[int,$$E,int,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of third dimension of 6-dimensional array \a x */ function set of $$E: index_set_3of6(array[int,int,$$E,int,int,int] of var opt $U: x); /** @group stdlib.array Return index set of fourth dimension of 6-dimensional array \a x */ function set of $$E: index_set_4of6(array[int,int,int,$$E,int,int] of var opt $U: x); /** @group stdlib.array Return index set of fifth dimension of 6-dimensional array \a x */ function set of $$E: index_set_5of6(array[int,int,int,int,$$E,int] of var opt $U: x); /** @group stdlib.array Return index set of sixth dimension of 6-dimensional array \a x */ function set of $$E: index_set_6of6(array[int,int,int,int,int,$$E] of var opt $U: x); /** @group stdlib.array Return array \a x coerced to index set 1..length(\a x). Coercions are performed by considering the array \a x in row-major order. */ function array[int] of $V: array1d(array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to index set 1..length(\a x). Coercions are performed by considering the array \a x in row-major order. */ function array[int] of opt $V: array1d(array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to index set 1..length(\a x). Coercions are performed by considering the array \a x in row-major order. */ function array[int] of var $V: array1d(array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to index set 1..length(\a x). Coercions are performed by considering the array \a x in row-major order. */ function array[int] of var opt $V: array1d(array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to one-dimensional array with index set \a S. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E] of $V: array1d(set of $$E: S, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to one-dimensional array with index set \a S. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E] of opt $V: array1d(set of $$E: S, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to one-dimensional array with index set \a S. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E] of var $V: array1d(set of $$E: S, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to one-dimensional array with index set \a S. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E] of var opt $V: array1d(set of $$E: S, array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to two-dimensional array with index sets \a S1 and \a S2. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F] of $V: array2d(set of $$E: S1, set of $$F: S2, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to two-dimensional array with index sets \a S1 and \a S2. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F] of opt $V: array2d(set of $$E: S1, set of $$F: S2, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to two-dimensional array with index sets \a S1 and \a S2. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F] of var $V: array2d(set of $$E: S1, set of $$F: S2, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to two-dimensional array with index sets \a S1 and \a S2. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F] of var opt $V: array2d(set of $$E: S1, set of $$F: S2, array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to three-dimensional array with index sets \a S1, \a S2 and \a S3. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G] of $V: array3d(set of $$E: S1, set of $$F: S2, set of $$G: S3, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to three-dimensional array with index sets \a S1, \a S2 and \a S3. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G] of opt $V: array3d(set of $$E: S1, set of $$F: S2, set of $$G: S3, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to three-dimensional array with index sets \a S1, \a S2 and \a S3. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G] of var $V: array3d(set of $$E: S1, set of $$F: S2, set of $$G: S3, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to three-dimensional array with index sets \a S1, \a S2 and \a S3. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G] of var opt $V: array3d(set of $$E: S1, set of $$F: S2, set of $$G: S3, array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to 4-dimensional array with index sets \a S1, \a S2, \a S3 and \a S4. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H] of $V: array4d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to 4-dimensional array with index sets \a S1, \a S2, \a S3 and \a S4. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H] of opt $V: array4d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to 4-dimensional array with index sets \a S1, \a S2, \a S3 and \a S4. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H] of var $V: array4d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to 4-dimensional array with index sets \a S1, \a S2, \a S3 and \a S4. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H] of var opt $V: array4d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to 5-dimensional array with index sets \a S1, \a S2, \a S3, \a S4 and \a S5. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I] of $V: array5d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to 5-dimensional array with index sets \a S1, \a S2, \a S3, \a S4 and \a S5. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I] of opt $V: array5d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to 5-dimensional array with index sets \a S1, \a S2, \a S3, \a S4 and \a S5. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I] of var $V: array5d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to 5-dimensional array with index sets \a S1, \a S2, \a S3, \a S4 and \a S5. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I] of var opt $V: array5d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, array[$U] of var opt $V: x); /** @group stdlib.array Return array \a x coerced to 6-dimensional array with index sets \a S1, \a S2, \a S3, \a S4, \a S5 and \a S6. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I,$$J] of $V: array6d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, set of $$J: S6, array[$U] of $V: x); /** @group stdlib.array Return array \a x coerced to 6-dimensional array with index sets \a S1, \a S2, \a S3, \a S4, \a S5 and \a S6. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I,$$J] of opt $V: array6d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, set of $$J: S6, array[$U] of opt $V: x); /** @group stdlib.array Return array \a x coerced to 6-dimensional array with index sets \a S1, \a S2, \a S3, \a S4, \a S5 and \a S6. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I,$$J] of var $V: array6d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, set of $$J: S6, array[$U] of var $V: x); /** @group stdlib.array Return array \a x coerced to 6-dimensional array with index sets \a S1, \a S2, \a S3, \a S4, \a S5 and \a S6. Coercions are performed by considering the array \a x in row-major order. */ function array[$$E,$$F,$$G,$$H,$$I,$$J] of var opt $V: array6d(set of $$E: S1, set of $$F: S2, set of $$G: S3, set of $$H: S4, set of $$I: S5, set of $$J: S6, array[$U] of var opt $V: x); /** @group stdlib.array Forces a arrayNd call to throw an error if the new index sets are offsets of the current index sets. */ annotation array_check_form; /** @group stdlib.array Return array \a y coerced to array with same number of dimensions and same index sets as array \a x. Coercions are performed by considering the array \a y in row-major order. */ function array[$T] of $V: arrayXd(array[$T] of var opt $X: x, array[$U] of $V: y); /** @group stdlib.array Return array \a y coerced to array with same number of dimensions and same index sets as array \a x. Coercions are performed by considering the array \a y in row-major order. */ function array[$T] of opt $V: arrayXd(array[$T] of var opt $X: x, array[$U] of opt $V: y); /** @group stdlib.array Return array \a y coerced to array with same number of dimensions and same index sets as array \a x. Coercions are performed by considering the array \a y in row-major order. */ function array[$T] of var $V: arrayXd(array[$T] of var opt $X: x, array[$U] of var $V: y); /** @group stdlib.array Return array \a y coerced to array with same number of dimensions and same index sets as array \a x. Coercions are performed by considering the array \a y in row-major order. */ function array[$T] of var opt $V: arrayXd(array[$T] of var opt $X: x, array[$U] of var opt $V: y); /** @group stdlib.array Return row \a r of array \a x */ function array[$$E] of $T: row(array[int, $$E] of $T: x, int: r) = x[r,..]; /** @group stdlib.array Return row \a r of array \a x */ function array[$$E] of opt $T: row(array[int, $$E] of opt $T: x, int: r) = x[r,..]; /** @group stdlib.array Return row \a r of array \a x */ function array[$$E] of var $T: row(array[int, $$E] of var $T: x, int: r) = x[r,..]; /** @group stdlib.array Return row \a r of array \a x */ function array[$$E] of var opt $T: row(array[int, $$E] of var opt $T: x, int: r) = x[r,..]; /** @group stdlib.array Return column \a c of array \a x */ function array[$$E] of $T: col(array[$$E,int] of $T: x, int: c) = x[..,c]; /** @group stdlib.array Return column \a c of array \a x */ function array[$$E] of opt $T: col(array[$$E,int] of opt $T: x, int: c) = x[..,c]; /** @group stdlib.array Return column \a c of array \a x */ function array[$$E] of var $T: col(array[$$E,int] of var $T: x, int: c) = x[..,c]; /** @group stdlib.array Return column \a c of array \a x */ function array[$$E] of var opt $T: col(array[$$E,int] of var opt $T: x, int: c) = x[..,c]; /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 1d array with index set \a dims1 */ function array[int] of $T: slice_1d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 2d array with index sets \a dims1 and \a dims2 */ function array[int,int] of $T: slice_2d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2 and \a dims3 */ function array[int,int,int] of $T: slice_3d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4 */ function array[int,int,int] of $T: slice_4d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5 */ function array[int,int,int] of $T: slice_5d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5, \a dims6 */ function array[int,int,int] of $T: slice_6d(array[$E] of $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5, set of int: dims6); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 1d array with index set \a dims1 */ function array[int] of opt $T: slice_1d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 2d array with index sets \a dims1 and \a dims2 */ function array[int,int] of opt $T: slice_2d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2 and \a dims3 */ function array[int,int,int] of opt $T: slice_3d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4 */ function array[int,int,int] of opt $T: slice_4d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5 */ function array[int,int,int] of opt $T: slice_5d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5, \a dims6 */ function array[int,int,int] of opt $T: slice_6d(array[$E] of opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5, set of int: dims6); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 1d array with index set \a dims1 */ function array[int] of var $T: slice_1d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 2d array with index sets \a dims1 and \a dims2 */ function array[int,int] of var $T: slice_2d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2 and \a dims3 */ function array[int,int,int] of var $T: slice_3d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4 */ function array[int,int,int] of var $T: slice_4d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5 */ function array[int,int,int] of var $T: slice_5d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5, \a dims6 */ function array[int,int,int] of var $T: slice_6d(array[$E] of var $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5, set of int: dims6); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 1d array with index set \a dims1 */ function array[int] of var opt $T: slice_1d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 2d array with index sets \a dims1 and \a dims2 */ function array[int,int] of var opt $T: slice_2d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2 and \a dims3 */ function array[int,int,int] of var opt $T: slice_3d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4 */ function array[int,int,int] of var opt $T: slice_4d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5 */ function array[int,int,int] of var opt $T: slice_5d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5); /** @group stdlib.array Return slice of array \a x specified by sets \a s, coerced to new 3d array with index sets \a dims1, \a dims2, \a dims3, \a dims4, \a dims5, \a dims6 */ function array[int,int,int] of var opt $T: slice_6d(array[$E] of var opt $T: x, array[int] of set of int: s, set of int: dims1, set of int: dims2, set of int: dims3, set of int: dims4, set of int: dims5, set of int: dims6); /** @group stdlib.array Test if \a i is in the index set of \a x */ test has_index(int: i, array[int] of var opt $T: x) = i in index_set(x); /** @group stdlib.array Test if \a e is an element of array \a x */ test has_element($T: e, array[int] of $T: x) = exists (i in index_set(x)) (x[i]=e); /** @group stdlib.array Test if \a e is an element of array \a x */ test has_element($T: e, array[int] of opt $T: x) = exists (i in index_set(x)) (x[i]=e); /** @group stdlib.array Test if \a e is an element of array \a x */ predicate has_element($T: e, array[$$E] of var opt $T: x) = exists (i in index_set(x)) (x[i]=e); /** @group stdlib.array Return the set containing the elements of \a x */ function var set of $$T: array2set(array[int] of var $$T: x) ::promise_total = let { set of int: D = dom_array(x); constraint assert(min(D) > -infinity /\ max(D) < infinity, "array2set needs finite bounds on argument array"); var set of D: y = array_union([ let { var set of dom(x[i]): s; constraint x[i] in s /\ card(s)=1; } in s | i in index_set(x)]); } in y; function var set of $$T: array2set(array[int] of var opt $$T: x) ::promise_total = let { set of int: D = dom_array(x); constraint assert(min(D) > -infinity /\ max(D) < infinity, "array2set needs finite bounds on argument array"); var set of D: y = array_union([ let { var set of dom(x[i]): s; constraint if occurs(x[i]) then deopt(x[i]) in s /\ card(s)=1 else card(s)=0 endif; } in s | i in index_set(x)]); } in y; /** @group stdlib.array Return the set containing the elements of \a x */ function set of $$T: array2set(array[int] of $$T: x) = { x[i] | i in index_set(x) }; /** @group stdlib.array Return the set containing the elements of \a x */ function set of $$T: array2set(array[int] of opt $$T: x) = { deopt(x[i]) | i in index_set(x) where occurs(x[i]) }; /** @group stdlib.array Return the set containing the elements of \a x */ function set of bool: array2set(array[int] of bool: x) = let { bool: f = exists(b in x)(not b); bool: t = exists(b in x)(b); } in if f /\ t then {false,true} elseif f then {false} elseif t then {true} else {} endif; /** @group stdlib.array Return the set containing the elements of \a x */ function set of float: array2set(array[int] of float: x) = { x[i] | i in index_set(x) }; libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_random.mzn0000644000175000017500000001021613757304533023044 0ustar kaolkaol/*** @groupdef stdlib.random Random Number Generator builtins These functions implement random number generators from different probability distributions. */ /** @group stdlib.random Return a sample from the normal distribution defined by \(\a mean, \a std\) */ function float: normal(float: mean, float: std); /** @group stdlib.random Return a sample from the normal distribution defined by \(\a mean, \a std\) */ function float: normal(int: mean, float: std); /** @group stdlib.random Return a sample from the uniform distribution defined by \(\a lowerbound, \a upperbound\) */ function float: uniform(float: lowerbound, float: upperbound); /** @group stdlib.random Return a sample from the uniform distribution defined by \(\a lowerbound, \a upperbound\) */ function int: uniform(int: lowerbound, int: upperbound); /** @group stdlib.random Return a sample from the poisson distribution defined by \a mean */ function int: poisson(float: mean); /** @group stdlib.random Return a sample from the poisson distribution defined by an integer \a mean */ function int: poisson(int: mean); /** @group stdlib.random Return a sample from the gamma distribution defined by \(\a alpha, \a beta\) */ function float: gamma(float: alpha, float: beta); /** @group stdlib.random Return a sample from the gamma distribution defined by \(\a alpha, \a beta\) */ function float: gamma(int: alpha, float: beta); /** @group stdlib.random Return a sample from the Weibull distribution defined by \(\a shape, \a scale\) */ function float: weibull(float: shape, float: scale); /** @group stdlib.random Return a sample from the Weibull distribution defined by \(\a shape, \a scale\) */ function float: weibull(int: shape, float: scale); /** @group stdlib.random Return a sample from the exponential distribution defined by \(\a lambda\) */ function float: exponential(int: lambda); /** @group stdlib.random Return a sample from the exponential distribution defined by \(\a lambda\) */ function float: exponential(float: lambda); /** @group stdlib.random Return a sample from the lognormal distribution defined by \(\a mean, \a std\) */ function float: lognormal(float: mean, float: std); /** @group stdlib.random Return a sample from the lognormal distribution defined by \(\a mean, \a std\) */ function float: lognormal(int: mean, float: std); /** @group stdlib.random Return a sample from the chi-squared distribution defined by the degree of freedom \(\a n\) */ function float: chisquared(int: n); /** @group stdlib.random Return a sample from the chi-squared distribution defined by the degree of freedom \(\a n\) */ function float: chisquared(float: n); /** @group stdlib.random Return a sample from the cauchy distribution defined by \(\a mean, \a scale\) */ function float: cauchy(float: mean, float: scale); /** @group stdlib.random Return a sample from the cauchy distribution defined by \(\a mean, \a scale\) */ function float: cauchy(int: mean, float: scale); /** @group stdlib.random Return a sample from the Fisher-Snedecor F-distribution defined by the degrees of freedom \(\a d1, \a d2\) */ function float: fdistribution(float: d1, float: d2); /** @group stdlib.random Return a sample from the Fisher-Snedecor F-distribution defined by the degrees of freedom \(\a d1, \a d2\) */ function float: fdistribution(int: d1, int: d2); /** @group stdlib.random Return a sample from the student's t-distribution defined by the sample size \(\a n\) */ function float: tdistribution(float: n); /** @group stdlib.random Return a sample from the student's t-distribution defined by the sample size \(\a n\) */ function float: tdistribution(int: n); /** @group stdlib.random Return a sample from the discrete distribution defined by the array of weights \(\a weights\) that assigns a weight to each integer starting from zero */ function int: discrete_distribution(array[int] of int: weights); /** @group stdlib.random Return a boolean sample from the Bernoulli distribution defined by probability \(\a p\) */ function bool: bernoulli(float: p); /** @group stdlib.random Return a sample from the binomial distribution defined by sample number \a t and probability \a p */ function int: binomial(int: t, float: p); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_reflect.mzn0000644000175000017500000001415513757304533023216 0ustar kaolkaol/*** @groupdef stdlib.reflect Reflection operations These functions return information about declared or inferred variable bounds and domains. */ /** @group stdlib.reflect Return lower bound of \a x */ function int: lb(var int: x); /** @group stdlib.reflect Return upper bound of \a x */ function int: ub(var int: x); /** @group stdlib.reflect Return lower bound of \a x */ function int: lb(var opt int: x); /** @group stdlib.reflect Return upper bound of \a x */ function int: ub(var opt int: x); /** @group stdlib.reflect Return lower bound of \a x */ function float: lb(var float: x); /** @group stdlib.reflect Return upper bound of \a x */ function float: ub(var float: x); /** @group stdlib.reflect Return lower bound of \a x */ function float: lb(var opt float: x); /** @group stdlib.reflect Return upper bound of \a x */ function float: ub(var opt float: x); /** @group stdlib.reflect Return lower bound of \a x */ function set of int: lb(var set of int: x); /** @group stdlib.reflect Return upper bound of \a x */ function set of int: ub(var set of int: x); /** @group stdlib.reflect Return array of lower bounds of the elements in array \a x */ function array[$U] of int: lb(array[$U] of var int: x) = arrayXd(x,[lb(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return array of upper bounds of the elements in array \a x */ function array[$U] of int: ub(array[$U] of var int: x) = arrayXd(x,[ub(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return array of lower bounds of the elements in array \a x */ function array[$U] of float: lb(array[$U] of var float: x) = arrayXd(x,[lb(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return array of upper bounds of the elements in array \a x */ function array[$U] of float: ub(array[$U] of var float: x) = arrayXd(x,[ub(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return array of lower bounds of the elements in array \a x */ function array[$U] of set of int: lb(array[$U] of var set of int: x) = arrayXd(x,[lb(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return array of upper bounds of the elements in array \a x */ function array[$U] of set of int: ub(array[$U] of var set of int: x) = arrayXd(x,[ub(xx) | xx in array1d(x)]); /** @group stdlib.reflect Return minimum of all lower bounds of the elements in array \a x */ function int: lb_array(array[$U] of var opt int: x); /** @group stdlib.reflect Return maximum of all upper bounds of the elements in array \a x */ function int: ub_array(array[$U] of var opt int: x); /** @group stdlib.reflect Return minimum of all lower bounds of the elements in array \a x */ function float: lb_array(array[$U] of var opt float: x); /** @group stdlib.reflect Return maximum of all upper bounds of the elements in array \a x */ function float: ub_array(array[$U] of var opt float: x); /** @group stdlib.reflect Return intersection of all lower bounds of the elements in array \a x */ function set of int: lb_array(array[$U] of var set of int: x); /** @group stdlib.reflect Return union of all upper bounds of the elements in array \a x */ function set of int: ub_array(array[$U] of var set of int: x); /** @group stdlib.reflect Return domain of \a x */ function set of int: dom(var int: x); /** @group stdlib.reflect Return domain of \a x */ function set of int: dom(var opt int: x); function set of int: dom(var bool: b) = if is_fixed(b) then if fix(b) then {1} else {0} endif else {0,1} endif; /** @group stdlib.reflect Return union of all domains of the elements in array \a x */ function set of int: dom_array(array[$T] of var int: x); /** @group stdlib.reflect Return union of all domains of the elements in array \a x */ function set of int: dom_array(array[$T] of var opt int: x); /** @group stdlib.reflect Return approximation of union of all domains of the elements in array \a x */ function set of int: dom_bounds_array(array[$T] of var int: x); /** @group stdlib.reflect Return approximation of union of all domains of the elements in array \a x */ function set of int: dom_bounds_array(array[$T] of var opt int: x); /** @group stdlib.reflect Return cardinality of the domain of \a x */ function int: dom_size(var int: x) = card(dom(x)); /** @group stdlib.reflect Test if variable \a x has declared, finite bounds */ function par bool: has_bounds(var int: x); /** @group stdlib.reflect Test if variable \a x has declared, finite bounds */ function par bool: has_bounds(var float: x); /** @group stdlib.reflect Test if variable \a x has a declared, finite upper bound */ function par bool: has_ub_set(var set of int: x); /** @group stdlib.reflect Check if the value of \a x is fixed at this point in evaluation. If it is fixed, return its value, otherwise abort. */ function $T: fix(var opt $T: x); /** @group stdlib.reflect Check if the value of every element of the array \a x is fixed at this point in evaluation. If all are fixed, return an array of their values, otherwise abort. */ function array[$U] of $T: fix(array[$U] of var opt $T: x); /** @group stdlib.reflect Test if \a x is fixed */ function bool: is_fixed(var opt $T: x); /** @group stdlib.reflect Test if \a x is fixed */ function bool: is_fixed(set of $T: x); /** @group stdlib.reflect Test if \a x is fixed */ function bool: is_fixed(var set of int: x); /** @group stdlib.reflect Test if every element of array \a x is fixed */ function bool: is_fixed(array[$U] of var opt $T: x); /** @group stdlib.reflect Test if \a x is annotated \a a */ function bool: has_ann(var opt $T: x, ann: a); /** @group stdlib.reflect Test if \a x is annotated \a a */ function bool: has_ann(var set of $T: x, ann: a); /** @group stdlib.reflect Test if \a x is annotated \a a */ function bool: has_ann(var set of int: x, ann: a); /** @group stdlib.reflect Annotate declaration of \a x with annotation \a a */ function bool: annotate(var opt $T: x, ann: a); /** @group stdlib.reflect Annotate declaration of \a x with annotation \a a */ function bool: annotate(set of $T: x, ann: a); /** @group stdlib.reflect Annotate declaration of \a x with annotation \a a */ function bool: annotate(var set of int: x, ann: a); /** @group stdlib.reflect Test if \a x and \a y are the same variable */ function bool: is_same(var opt $T: x, var opt $U: y); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_ann.mzn0000644000175000017500000004123213757304533022342 0ustar kaolkaol/*** @groupdef stdlib.annotations Annotations These annotations control evaluation and solving behaviour. */ /*** @groupdef stdlib.annotations.general General annotations */ /** @group stdlib.annotations.general Declare function as total, i.e. it does not put any constraints on its arguments. */ annotation promise_total; /** @group stdlib.annotations.general Declare that expression may have undefined result (to avoid warnings) */ annotation maybe_partial; /** @group stdlib.annotations.general Declare that the annotated variable should be added to the output of the model. This annotation only has an effect when the model does not have an output item. */ annotation add_to_output; /** @group stdlib.annotations.general Declare that the annotated variable should be only used for output. This annotation can be used to define variables that are required for solution checkers, or that are necessary for the output item. The annotated variable must be par. */ annotation output_only; /** @group stdlib.annotations.general Declare that the annotated variable is required for checking solutions. */ annotation mzn_check_var; /** @group stdlib.annotations.general Declare that the annotated variable is required for checking solutions and has an enum type. */ annotation mzn_check_enum_var(array[int] of set of int); /** @group stdlib.annotations.general Declare a name for the annotated expression. */ annotation mzn_expression_name(string); /** @group stdlib.annotations.general Declare a name for the annotated constraint. */ annotation mzn_constraint_name(string); /** @group stdlib.annotations.general State that a function is deprecated. */ annotation mzn_deprecated(string: version, string: explanation); function $T: mzn_deprecate(string: name, string: version, string: msg, $T: x); function var $T: mzn_deprecate(string: name, string: version, string: msg, var $T: x); function var opt $T: mzn_deprecate(string: name, string: version, string: msg, var opt $T: x); function array[$U] of $T: mzn_deprecate(string: name, string: version, string: msg, array[$U] of $T: x); function array[$U] of var $T: mzn_deprecate(string: name, string: version, string: msg, array[$U] of var $T: x); function array[$U] of var opt $T: mzn_deprecate(string: name, string: version, string: msg, array[$U] of var opt $T: x); /** @group stdlib.annotations.general Declare the annotated variable as being functionally defined. This annotation is introduced into FlatZinc code by the compiler. */ annotation is_defined_var; /** @group stdlib.annotations.general Declare a variable as being introduced by the compiler. */ annotation var_is_introduced; /** @group stdlib.annotations.general Declare variable: \a c as being functionally defined by the annotated constraint. This annotation is introduced into FlatZinc code by the compiler. */ annotation defines_var(var $t: c); /** @group stdlib.annotations.general Declare that the annotated array should be printed by the solver with the given index sets \a a. This annotation is introduced into FlatZinc code by the compiler. */ annotation output_array(array[$u] of set of int:a); /** @group stdlib.annotations.general Declare that the annotated variable should be printed by the solver. This annotation is introduced into FlatZinc code by the compiler. */ annotation output_var; /** @group stdlib.annotations.general Declare that the annotated expression is used to map an expression back from FlatZinc to MiniZinc. */ annotation is_reverse_map; /** @group stdlib.annotations.general Document the function or variable declaration item with the string \a s. */ annotation doc_comment(string: s); /** @group stdlib.annotations.general Representation of the call-stack when the annotated item was introduced, as a string \a s. Can be used to uniquely identify variables and constraints across different compilations of a model that may have different names. This annotations is introduced into FlatZinc code by the compiler and is retained if --keep-paths argument is used. */ annotation mzn_path(string: s); /** @group stdlib.annotations.general Used to attach a name \a s to an expression, this should also propagate to any sub-expressions or decomposition of the annotated expression. String annotations on expressions are re-written as expression_name annotations */ annotation expression_name(string: s); /** @group stdlib.annotations.general Used to attach a name \a s to a constraint and its decomposition. String annotations on constraint keywords are re-written as constraint_name annotations */ annotation constraint_name(string: s); /** @group stdlib.annotations.general Used internally by the compiler */ annotation mzn_rhs_from_assignment; /** @group stdlib.annotations.general Marks a constraint as a recorded domain changing constraint (when mzn2fzn called with -g flag */ annotation domain_change_constraint; /*** @groupdef stdlib.annotations.prop Propagation strength annotations */ /** @group stdlib.annotations.prop Annotate a constraint to use domain propagation */ annotation domain; /** @group stdlib.annotations.prop Annotate a constraint to use bounds propagation */ annotation bounds; /*** @groupdef stdlib.annotations.search Search annotations */ /** @group stdlib.annotations.search Sequentially perform the searches specified in array \a s */ annotation seq_search(array[int] of ann: s); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, value choice strategy \a choice, and exploration strategy \a explore. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation int_search( array[$X] of var int: x, ann: select, ann: choice, ann: explore, ); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, and value choice strategy \a choice. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation int_search( array[$X] of var int: x, ann: select, ann: choice ) = int_search(x,select,choice,complete); /** @group stdlib.annotations.search Search annotation for optional integer variables */ annotation int_search(array[int] of var opt int: x, ann: a1, ann: a2, ann: a3) = int_search([if occurs(x[i]) then deopt(x[i]) else 0 endif | i in index_set(x)],a1,a2,a3); /** @group stdlib.annotations.search Search annotation for optional integer variables */ annotation int_search(array[int] of var opt int: x, ann: a1, ann: a2) = int_search([if occurs(x[i]) then deopt(x[i]) else 0 endif | i in index_set(x)],a1,a2); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, value choice strategy \a choice, and exploration strategy \a explore. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation bool_search( array[$X] of var bool: x, ann: select, ann: choice, ann: explore ); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, and value choice strategy \a choice. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation bool_search( array[$X] of var bool: x, ann: select, ann: choice ) = bool_search(x,select,choice,complete); /** @group stdlib.annotations.search Search annotation for optional Boolean variables */ annotation bool_search(array[int] of var opt bool: x, ann: a1, ann: a2, ann: a3) = bool_search([if occurs(x[i]) then deopt(x[i]) else false endif | i in index_set(x)],a1,a2,a3); /** @group stdlib.annotations.search Search annotation for optional Boolean variables */ annotation bool_search(array[int] of var opt bool: x, ann: a1, ann: a2) = bool_search([if occurs(x[i]) then deopt(x[i]) else false endif | i in index_set(x)],a1,a2); /** @group stdlib.annotations.search Specify search on variables \a x, with precision \a prec, variable selection strategy \a select, value choice strategy \a choice, and exploration strategy \a explore. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation float_search( array[$X] of var float: x, float: prec, ann: select, ann: choice, ann: explore ); /** @group stdlib.annotations.search Specify search on variables \a x, with precision \a prec, variable selection strategy \a select, and value choice strategy \a choice. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation float_search( array[$X] of var float: x, float: prec, ann: select, ann: choice ) = float_search(x,prec,select,choice,complete); /** @group stdlib.annotations.search Search annotation for optional float variables */ annotation float_search(array[int] of var opt float: x, ann: a1, ann: a2, ann: a3) = float_search([if occurs(x[i]) then deopt(x[i]) else 0 endif | i in index_set(x)],a1,a2,a3); /** @group stdlib.annotations.search Search annotation for optional float variables */ annotation float_search(array[int] of var opt float: x, ann: a1, ann: a2) = float_search([if occurs(x[i]) then deopt(x[i]) else 0 endif | i in index_set(x)],a1,a2); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, value choice strategy \a choice, and exploration strategy \a explore. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation set_search( array[$X] of var set of int: x, ann: select, ann: choice, ann: explore ); /** @group stdlib.annotations.search Specify search on variables \a x, with variable selection strategy \a select, and value choice strategy \a choice. If \a x is a multi-dimensional array, it is coerced to one-dimensional in row-major order (as with the array1d function). */ annotation set_search( array[$X] of var set of int: x, ann: select, ann: choice ) = set_search(x,select,choice,complete); /*** @groupdef stdlib.annotations.search.varsel Variable selection annotations */ /** @group stdlib.annotations.search.varsel Search variables in the given order */ annotation input_order; /** @group stdlib.annotations.search.varsel Choose the variable with the smallest domain */ annotation first_fail; /** @group stdlib.annotations.search.varsel Choose the variable with the largest domain */ annotation anti_first_fail; /** @group stdlib.annotations.search.varsel Choose the variable with the smallest value in its domain */ annotation smallest; /** @group stdlib.annotations.search.varsel Choose the variable with the largest value in its domain */ annotation largest; /** @group stdlib.annotations.search.varsel Choose the variable with the largest number of attached constraints */ annotation occurrence; /** @group stdlib.annotations.search.varsel Choose the variable with the smallest domain, breaking ties using the number of attached constraints */ annotation most_constrained; /** @group stdlib.annotations.search.varsel Choose the variable with largest difference between the two smallest values in its domain */ annotation max_regret; /** @group stdlib.annotations.search.varsel Choose the variable with largest domain, divided by the number of attached constraints weighted by how often they have caused failure */ annotation dom_w_deg; /** @group stdlib.annotations.search.varsel Choose the variable with the highest impact so far during the search */ annotation impact; /*** @groupdef stdlib.annotations.search.choice Value choice annotations */ /** @group stdlib.annotations.search.choice Assign values in ascending order */ annotation indomain; /** @group stdlib.annotations.search.choice Assign the smallest value in the domain */ annotation indomain_min; /** @group stdlib.annotations.search.choice Assign the largest value in the domain */ annotation indomain_max; /** @group stdlib.annotations.search.choice Assign the value in the domain closest to the mean of its current bounds */ annotation indomain_middle; /** @group stdlib.annotations.search.choice Assign the middle value in the domain, or the smaller of the two middle values in case of an even number of elements in the domain */ annotation indomain_median; /** @group stdlib.annotations.search.choice Assign a random value from the domain */ annotation indomain_random; /** @group stdlib.annotations.search.choice Bisect the domain, excluding the upper half first */ annotation indomain_split; /** @group stdlib.annotations.search.choice Bisect the domain, randomly selecting which half to exclude first */ annotation indomain_split_random; /** @group stdlib.annotations.search.choice Bisect the domain, excluding the lower half first */ annotation indomain_reverse_split; /** @group stdlib.annotations.search.choice If the domain consists of several contiguous intervals, reduce the domain to the first interval. Otherwise bisect the domain. */ annotation indomain_interval; /** @group stdlib.annotations.search.choice Exclude the smallest value from the domain */ annotation outdomain_min; /** @group stdlib.annotations.search.choice Exclude the largest value from the domain */ annotation outdomain_max; /** @group stdlib.annotations.search.choice Exclude the middle value from the domain */ annotation outdomain_median; /** @group stdlib.annotations.search.choice Exclude a random value from the domain */ annotation outdomain_random; /*** @groupdef stdlib.annotations.search.explore Exploration strategy annotations */ /** @group stdlib.annotations.search.explore Perform a complete search */ annotation complete; /*** @groupdef stdlib.annotations.search.restart Restart annotations */ /** @group stdlib.annotations.search.restart Restart with Luby sequence scaled by \a scale */ annotation restart_luby(int: scale); /** @group stdlib.annotations.search.restart Restart with geometric sequence with parameters \a base and \a scale */ annotation restart_geometric(float: base, int: scale); /** @group stdlib.annotations.search.restart Restart with linear sequence scaled by \a scale */ annotation restart_linear(int: scale); /** @group stdlib.annotations.search.restart Restart after constant number of nodes \a scale */ annotation restart_constant(int: scale); /** @group stdlib.annotations.search.restart Do not restart */ annotation restart_none; /*** @groupdef stdlib.annotations.warmstart Warm start annotations To be put on the solve item, similar to search annotations. A variable can be mentioned several times and in different annotations but only one of the values is taken */ /** @group stdlib.annotations.warmstart Specify an array \a w of warm_start annotations or other warm_start_array annotations. Can be useful to keep the annotation order in FlatZinc for manual updating. Note: if you have search annotations as well, put warm_starts into seq_search in order to have precedence between both, which may matter. */ annotation warm_start_array( array[int] of ann: w ); /** @group stdlib.annotations.warmstart Specify warm start values \a v for an array of booleans \a x */ annotation warm_start( array[int] of var bool: x, array[int] of bool: v ); /** @group stdlib.annotations.warmstart Specify warm start values \a v for an array of integers \a x */ annotation warm_start( array[int] of var int: x, array[int] of int: v ); /** @group stdlib.annotations.warmstart Specify warm start values \a v for an array of floats \a x */ annotation warm_start( array[int] of var float: x, array[int] of float: v ); /** @group stdlib.annotations.warmstart Specify warm start values \a v for an array of sets \a x */ annotation warm_start( array[int] of var set of int: x, array[int] of set of int: v ); /*** @groupdef stdlib.special Special constraints These predicates allow users to mark constraints as e.g. symmetry breaking or redundant, so that solvers can choose to implement them differently. We cannot easily use annotations for this purpose, since annotations are propagated to all constraints in a decomposition, which may be incorrect for redundant or symmetry breaking constraints in the presence of common subexpression elimination (CSE). */ /** @group stdlib.special Mark \a b as a symmetry breaking constraint */ predicate symmetry_breaking_constraint(var bool: b); /** @group stdlib.special Mark \a b as a redundant constraint */ predicate redundant_constraint(var bool: b); /** @group stdlib.special Mark \a b as an implied constraint (synonym for redundant_constraint) */ predicate implied_constraint(var bool: b) = redundant_constraint(b); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_ite.mzn0000644000175000017500000001434513757304533022354 0ustar kaolkaol/*** @groupdef stdlib.ifthenelse Conditionals These functions implement conditional (if-then-else-endif) constraints. */ /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of int: x, var int: y) = fzn_if_then_else_int(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var int: x, var int: y) = fzn_if_then_else_var_int(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of opt int: x, var opt int: y) = fzn_if_then_else_opt_int(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var opt int: x, var opt int: y) = fzn_if_then_else_var_opt_int(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of bool: x, var bool: y) = fzn_if_then_else_bool(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var bool: x, var bool: y) = fzn_if_then_else_var_bool(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of opt bool: x, var opt bool: y) = fzn_if_then_else_opt_bool(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var opt bool: x, var opt bool: y) = fzn_if_then_else_var_opt_bool(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of float: x, var float: y) = fzn_if_then_else_float(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var float: x, var float: y) = fzn_if_then_else_var_float(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of opt float: x, var opt float: y) = fzn_if_then_else_opt_float(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of set of int: x, var set of int: y) = fzn_if_then_else_set(c, x, y); /** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ y=x[i] \}\) This constraint is generated by the compiler for if-then-else expressions. The last entry in the \a c array is always the constant true, corresponding to the else case. */ predicate if_then_else(array[int] of var bool: c, array[int] of var set of int: x, var set of int: y) = fzn_if_then_else_var_set(c, x, y); /** @group stdlib.ifthenelse Conditional partiality constraint This constraint is generated by the compiler for if-then-else expressions with potentially undefined cases. The last entry in the \a c array is always the constant true, corresponding to the else case. The \a d[i] variable represents whether case \p i is defined. Constrains that if \b is defined, then the selected case must be defined, and if the selected case is undefined, then \a b must be undefined. */ predicate if_then_else_partiality(array[int] of var bool: c, array[int] of var bool: d, var bool: b) = fzn_if_then_else_partiality(c, d, b); libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_math.mzn0000644000175000017500000006471313757304533022530 0ustar kaolkaol/*** @groupdef stdlib.arithmetic Arithmetic Builtins These builtins implement arithmetic operations. */ /** @group stdlib.arithmetic Return \a x + \a y */ function int: '+'( int: x, int: y); /** @group stdlib.arithmetic Return \a x + \a y */ function var int: '+'(var int: x, var int: y); /** @group stdlib.arithmetic Return \a x + \a y */ function float: '+'( float: x, float: y); /** @group stdlib.arithmetic Return \a x + \a y */ function var float: '+'(var float: x,var float: y); /** @group stdlib.arithmetic Optional addition. Return sum of \a x and \a y, with absent replaced by 0. */ function var int: '+'(var opt int: x, var opt int: y) ::promise_total = if occurs(x) then deopt(x) else 0 endif + if occurs(y) then deopt(y) else 0 endif; /** @group stdlib.arithmetic Optional addition. Return sum of \a x and \a y, with absent replaced by 0. */ function int: '+'(opt int: x, opt int: y) ::promise_total = if occurs(x) then deopt(x) else 0 endif + if occurs(y) then deopt(y) else 0 endif; /** @group stdlib.arithmetic Optional addition. Return sum of \a x and \a y, with absent replaced by 0. */ function var float: '+'(var opt float: x, var opt float: y) ::promise_total = if occurs(x) then deopt(x) else 0 endif + if occurs(y) then deopt(y) else 0 endif; /** @group stdlib.arithmetic Optional addition. Return sum of \a x and \a y, with absent replaced by 0. */ function float: '+'(opt float: x, opt float: y) ::promise_total = if occurs(x) then deopt(x) else 0 endif + if occurs(y) then deopt(y) else 0 endif; /** @group stdlib.arithmetic Return \a x - \a y */ function int: '-'( int: x, int: y); /** @group stdlib.arithmetic Return \a x - \a y */ function var int: '-'(var int: x, var int: y); /** @group stdlib.arithmetic Return \a x - \a y */ function float: '-'( float: x, float: y); /** @group stdlib.arithmetic Return \a x - \a y */ function var float: '-'(var float: x,var float: y); /** @group stdlib.arithmetic Optional subtraction. Return absent if \a x is absent, \a x if \a y is absent, difference of \a x and \a y if both are present. */ function var opt int: '-'(var opt int: x, var opt int: y) ::promise_total = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x)-deopt(y) endif; function var int: '-'(var int: x, var opt int: y) ::promise_total = if absent(y) then x else x-deopt(y) endif; /** @group stdlib.arithmetic Optional subtraction. Return absent if \a x is absent, \a x if \a y is absent, difference of \a x and \a y if both are present. */ function var opt float: '-'(var opt float: x, var opt float: y) ::promise_total = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x)-deopt(y) endif; function var float: '-'(var float: x, var opt float: y) ::promise_total = if absent(y) then x else x-deopt(y) endif; /** @group stdlib.arithmetic Optional subtraction. Return absent if \a x is absent, \a x if \a y is absent, difference of \a x and \a y if both are present. */ function opt int: '-'(opt int: x, opt int: y) ::promise_total = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x)-deopt(y) endif; function int: '-'(int: x, opt int: y) ::promise_total = if absent(y) then x else x-deopt(y) endif; /** @group stdlib.arithmetic Optional subtraction. Return absent if \a x is absent, \a x if \a y is absent, difference of \a x and \a y if both are present. */ function opt float: '-'(opt float: x, opt float: y) ::promise_total = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x)-deopt(y) endif; function float: '-'(float: x, opt float: y) ::promise_total = if absent(y) then x else x-deopt(y) endif; /** @group stdlib.arithmetic Return \a x * \a y */ function int: '*'( int: x, int: y); /** @group stdlib.arithmetic Return \a x * \a y */ function var int: '*'(var int: x, var int: y); /** @group stdlib.arithmetic Optional multiplication. Return product of \a x and \a y, with absent replaced by 1. */ function var int: '*'(var opt int: x, var opt int: y) ::promise_total = if occurs(x) then deopt(x) else 1 endif * if occurs(y) then deopt(y) else 1 endif; /** @group stdlib.arithmetic Optional multiplication. Return product of \a x and \a y, with absent replaced by 1. */ function int: '*'(opt int: x, opt int: y) ::promise_total = if occurs(x) then deopt(x) else 1 endif * if occurs(y) then deopt(y) else 1 endif; /** @group stdlib.arithmetic Optional multiplication. Return product of \a x and \a y, with absent replaced by 1. */ function var float: '*'(var opt float: x, var opt float: y) ::promise_total = if occurs(x) then deopt(x) else 1 endif * if occurs(y) then deopt(y) else 1 endif; /** @group stdlib.arithmetic Optional multiplication. Return product of \a x and \a y, with absent replaced by 1. */ function float: '*'(opt float: x, opt float: y) ::promise_total = if occurs(x) then deopt(x) else 1 endif * if occurs(y) then deopt(y) else 1 endif; /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function int: '^'( int: x, int: y); /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function var int: '^'(var int: x, var int: y); /** @group stdlib.arithmetic Return \a x * \a y */ function float: '*'( float: x, float: y); /** @group stdlib.arithmetic Return \a x * \a y */ function var float: '*'(var float: x,var float: y); /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function float: '^'( float: x, float: y); /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function var float: '^'(var float: x,var float: y); /** @group stdlib.arithmetic Return negative \a x */ function int: '-'( int: x); /** @group stdlib.arithmetic Return negative \a x */ function var int: '-'(var int: x); /** @group stdlib.arithmetic Return negative \a x */ function float: '-'( float: x); /** @group stdlib.arithmetic Return negative \a x */ function var float: '-'(var float: x); /** @group stdlib.arithmetic Return result of integer division \a x / \a y */ function int: 'div'(int: x,int: y); /** @group stdlib.arithmetic Return result of integer division \a x / \a y */ function var int: 'div'(var int: x,var int: y) = if mzn_in_root_context(y) then div_t(x,y) elseif not (0 in dom(y)) then div_t(x,y) else let { constraint y != 0 } in div_mt(x,y) endif; /** @group stdlib.arithmetic Optional division. Return absent if \a x is absent, \a x if \a y is absent, \a x divided by \a y if both are present. */ function var opt int: 'div'(var opt int: x, var opt int: y) = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x) div deopt(y) endif; function var int: 'div'(var int: x, var opt int: y) = if absent(y) then x else x div deopt(y) endif; /** @group stdlib.arithmetic Optional division. Return absent if \a x is absent, \a x if \a y is absent, \a x divided by \a y if both are present. */ function opt int: 'div'(opt int: x, opt int: y) = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x) div deopt(y) endif; function int: 'div'(int: x, opt int: y) = if absent(y) then x else x div deopt(y) endif; /** @group stdlib.arithmetic Return remainder of integer division \a x % \a y */ function int: 'mod'(int: x,int: y); /** @group stdlib.arithmetic Return remainder of integer division \a x % \a y */ function var int: 'mod'(var int: x,var int: y) = if mzn_in_root_context(y) then mod_t(x,y) elseif not (0 in dom(y)) then mod_t(x,y) else let { constraint y != 0 } in mod_mt(x,y) endif; /** @group stdlib.arithmetic Optional modulo. Return absent if \a x or \a y is absent, \a x modulo \a y if both are present. */ function var opt int: 'mod'(var opt int: x, var opt int: y) = if occurs(x) /\ occurs(y) then deopt(x) mod deopt(y) else <> endif; /** @group stdlib.arithmetic Optional modulo. Return absent if \a x or \a y is absent, \a x modulo \a y if both are present. */ function opt int: 'mod'(opt int: x, opt int: y) = if occurs(x) /\ occurs(y) then deopt(x) mod deopt(y) else <> endif; /** @group stdlib.arithmetic Return result of floating point division \a x / \a y */ function float: '/'( float: x, float: y); /** @group stdlib.arithmetic Return result of floating point division \a x / \a y */ function var float: '/'(var float: x,var float: y) = if mzn_in_root_context(y) then fldiv_t(x,y) elseif lb(y) > 0.0 \/ ub(y) < 0.0 then fldiv_t(x,y) else let { constraint y != 0.0 } in fldiv_mt(x,y) endif; /** @group stdlib.arithmetic Optional division. Return absent if \a x is absent, \a x if \a y is absent, \a x divided by \a y if both are present. */ function var opt float: '/'(var opt float: x, var opt float: y) = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x) / deopt(y) endif; function var float: '/'(var float: x, var opt float: y) = if absent(y) then x else x / deopt(y) endif; /** @group stdlib.arithmetic Optional division. Return absent if \a x is absent, \a x if \a y is absent, \a x divided by \a y if both are present. */ function opt float: '/'(opt float: x, opt float: y) = if absent(x) then <> elseif absent(y) then deopt(x) else deopt(x) / deopt(y) endif; function float: '/'(float: x, opt float: y) = if absent(y) then x else x / deopt(y) endif; /** @group stdlib.arithmetic Return number of true elments in array \a x */ function int: count(array[$T] of bool: x) = sum([bool2int(y) | y in array1d(x)]); /** @group stdlib.arithmetic Return number of true elments in array \a x */ function var int: count(array[$T] of var bool: x) = sum([bool2int(y) | y in array1d(x)]); /** @group stdlib.arithmetic Return sum of elements in array \a x */ function int: sum(array[$T] of int: x); /** @group stdlib.arithmetic Return sum of elements in array \a x */ function var int: sum(array[$T] of var int: x); /** @group stdlib.arithmetic Return sum of elements in array \a x */ function float: sum(array[$T] of float: x); /** @group stdlib.arithmetic Return sum of elements in array \a x */ function var float: sum(array[$T] of var float: x); /** @group stdlib.arithmetic Return sum of non-absent elements of \a x. */ function var int: sum(array[int] of var opt int: x) = sum (i in index_set(x)) (let { var int: dx = deopt(x[i]) } in if occurs(x[i]) then dx else 0 endif); /** @group stdlib.arithmetic Return sum of non-absent elements of \a x. */ function int: sum(array[int] of opt int: x) = sum (i in index_set(x)) (if occurs(x[i]) then deopt(x[i]) else 0 endif); /** @group stdlib.arithmetic Return sum of non-absent elements of \a x. */ function var float: sum(array[int] of var opt float: x) = sum (i in index_set(x)) (let { var float: dx = deopt(x[i]) } in if occurs(x[i]) then dx else 0 endif); /** @group stdlib.arithmetic Return sum of non-absent elements of \a x. */ function float: sum(array[int] of opt float: x) = sum (i in index_set(x)) (if occurs(x[i]) then deopt(x[i]) else 0 endif); /** @group stdlib.arithmetic Return product of elements in array \a x */ function int: product(array[$T] of int: x); /** @group stdlib.arithmetic Return product of elements in array \a x */ function var int: product(array[$T] of var int: x) = product_rec(array1d(x)); /** @group stdlib.arithmetic Return product of non-absent elements of \a x. */ function var int: product(array[int] of var opt int: x) = product (i in index_set(x)) (let { var int: dx = deopt(x[i]) } in if occurs(x[i]) then dx else 1 endif); /** @group stdlib.arithmetic Return product of non-absent elements of \a x. */ function int: product(array[int] of opt int: x) = product (i in index_set(x)) (if occurs(x[i]) then deopt(x[i]) else 1 endif); /** @group stdlib.arithmetic Return product of elements in array \a x */ function float: product(array[$T] of float: x); /** @group stdlib.arithmetic Return product of elements in array \a x */ function var float: product(array[$T] of var float: x) = product_rec(array1d(x)); /** @group stdlib.arithmetic Return product of non-absent elements of \a x. */ function var float: product(array[int] of var opt float: x) = product (i in index_set(x)) (let { var float: dx = deopt(x[i]) } in if occurs(x[i]) then dx else 1 endif); /** @group stdlib.arithmetic Return product of non-absent elements of \a x. */ function float: product(array[int] of opt float: x) = product (i in index_set(x)) (if occurs(x[i]) then deopt(x[i]) else 1 endif); /** @group stdlib.arithmetic Return minimum of \a x and \a y */ function $T: min( $T: x, $T: y); /** @group stdlib.arithmetic Return minimum of elements in array \a x */ function $T: min(array[$U] of par $T: x); /** @group stdlib.arithmetic Return minimum of elements in \a x that are not absent, or absent if all elements in \a x are absent. */ function var opt int: min(array[int] of var opt int: x) ::promise_total = let { var opt lb_array(x)..ub_array(x): m; var lb_array(x)..ub_array(x): xmax; constraint if ub(xmax) != infinity then xmax = ub(xmax) else forall (i in index_set(x)) (xmax >= deopt(x[i])) endif; constraint occurs(m) <-> exists (i in index_set(x)) (occurs(x[i])); constraint occurs(m) -> deopt(m) = min([if occurs(xi) then deopt(xi) else xmax endif | xi in x]); } in m; /** @group stdlib.arithmetic Return minimum of elements in \a x that are not absent, or absent if all elements in \a x are absent. */ % :NOTE: since -oo is always a lb for float variables, should we instead return -oo if all absent? function var opt float: min(array[int] of var opt float: x) ::promise_total = let { var opt lb_array(x)..ub_array(x): m; var lb_array(x)..ub_array(x): xmax; constraint if ub(xmax) != infinity then xmax = ub(xmax) else forall (i in index_set(x)) (xmax >= deopt(x[i])) endif; constraint occurs(m) <-> exists (i in index_set(x)) (occurs(x[i])); constraint occurs(m) -> deopt(m) = min([if occurs(xi) then deopt(xi) else xmax endif | xi in x]); } in m; /** @group stdlib.arithmetic Return maximum of \a x and \a y */ function $T: max( $T: x, $T: y); /** @group stdlib.arithmetic Return maximum of elements in array \a x */ function $T: max(array[$U] of $T: x); /** @group stdlib.arithmetic Return maximum of elements in \a x that are not absent, or absent if all elements in \a x are absent. */ function var opt int: max(array[int] of var opt int: x) ::promise_total = let { var opt lb_array(x)..ub_array(x): m; var lb_array(x)..ub_array(x): xmin; constraint if lb(xmin) != -infinity then xmin = lb(xmin) else forall (i in index_set(x)) (xmin <= deopt(x[i])) endif; constraint occurs(m) <-> exists (i in index_set(x)) (occurs(x[i])); constraint occurs(m) -> deopt(m) = max([if occurs(xi) then deopt(xi) else xmin endif | xi in x]); } in m; /** @group stdlib.arithmetic Return minimum of elements in set \a x */ function $$E: min(set of $$E: x); /** @group stdlib.arithmetic Return maximum of elements in set \a x */ function $$E: max(set of $$E: x); /** @group stdlib.arithmetic Return maximum of \a x and \a y */ function var int: max(var int: x, var int: y) :: promise_total = let { var max(lb(x),lb(y))..max(ub(x),ub(y)): m ::is_defined_var; constraint int_max(x,y,m) ::defines_var(m); } in m; /** @group stdlib.arithmetic Return maximum of elements in array \a x */ function var int: max(array[$U] of var int: x) = let { array[int] of var int: xx = array1d(x); constraint length(x) >= 1; } in max_t(xx); /** @group stdlib.arithmetic Return maximum of elements in \a x that are not absent, or absent if all elements in \a x are absent. */ function var opt float: max(array[int] of var opt float: x) ::promise_total = let { var opt lb_array(x)..ub_array(x): m; var lb_array(x)..ub_array(x): xmin; constraint if lb(xmin) != -infinity then xmin = lb(xmin) else forall (i in index_set(x)) (xmin <= deopt(x[i])) endif; constraint occurs(m) <-> exists (i in index_set(x)) (occurs(x[i])); constraint occurs(m) -> deopt(m) = max([if occurs(xi) then deopt(xi) else xmin endif | xi in x]); } in m; /** @group stdlib.arithmetic Return minimum of \a x and \a y */ function var int: min(var int: x, var int: y) :: promise_total = let { var min(lb(x),lb(y))..min(ub(x),ub(y)): m ::is_defined_var; constraint int_min(x,y,m) ::defines_var(m); } in m; /** @group stdlib.arithmetic Return minimum of elements in array \a x */ function var int: min(array[$U] of var int: x) = let { array[int] of var int: xx = array1d(x); constraint length(x) >= 1; } in min_t(xx); % Floating point min and max % TODO: add bounds reasoning /** @group stdlib.arithmetic Return maximum of \a x and \a y */ function var float: max(var float: x, var float: y) :: promise_total = if has_bounds(x) /\ has_bounds(y) then let { var max(lb(x),lb(y))..max(ub(x),ub(y)): m ::is_defined_var; constraint float_max(x,y,m) ::defines_var(m); } in m else let { var float: m ::is_defined_var; constraint float_max(x,y,m) ::defines_var(m); } in m endif; /** @group stdlib.arithmetic Return maximum of elements in array \a x */ function var float: max(array[$U] of var float: x) = let { array[int] of var float: xx = array1d(x); constraint length(x) >= 1; } in max_t(xx); /** @group stdlib.arithmetic Return minimum of \a x and \a y */ function var float: min(var float: x, var float: y) :: promise_total = if has_bounds(x) /\ has_bounds(y) then let { var min(lb(x),lb(y))..min(ub(x),ub(y)): m ::is_defined_var; constraint float_min(x,y,m) ::defines_var(m); } in m else let { var float: m ::is_defined_var; constraint float_min(x,y,m) ::defines_var(m); } in m endif; /** @group stdlib.arithmetic Return minimum of elements in array \a x */ function var float: min(array[$U] of var float: x) = let { array[int] of var float: xx = array1d(x); constraint length(x) >= 1; } in min_t(xx); /** @group stdlib.arithmetic Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_min(array[$$E] of bool: x); /** @group stdlib.arithmetic Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_min(array[$$E] of int: x); /** @group stdlib.arithmetic Returns the index of the minimum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_min(array[$$E] of float: x); /** @group stdlib.arithmetic Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_max(array[$$E] of bool: x); /** @group stdlib.arithmetic Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_max(array[$$E] of int: x); /** @group stdlib.arithmetic Returns the index of the maximum value in the array \a x. When breaking ties the least index is returned. */ function $$E: arg_max(array[$$E] of float: x); /** @group stdlib.arithmetic Return absolute value of \a x */ function int: abs(int: x); /** @group stdlib.arithmetic Return absolute value of \a x */ function var int: abs(var int: x) :: promise_total = if has_bounds(x) /\ lb(x) >= 0 then x elseif has_bounds(x) /\ ub(x) <= 0 then -x else let { var 0..max(-lb(x),ub(x)): m ::is_defined_var; constraint int_abs(x,m) ::defines_var(m); } in m endif; /** @group stdlib.arithmetic Return absolute value of \a x */ function float: abs(float: x); /** @group stdlib.arithmetic Return absolute value of \a x */ function var float: abs(var float: x) :: promise_total = if has_bounds(x) then if lb(x) >= 0.0 then x elseif ub(x) <= 0.0 then -x else let { var 0.0..max(-lb(x),ub(x)): m ::is_defined_var; constraint float_abs(x,m) ::defines_var(m); } in m endif else let { var float: m ::is_defined_var; constraint m >= 0.0; constraint float_abs(x,m) ::defines_var(m); } in m endif; /** @group stdlib.arithmetic Return \(\sqrt{\a x}\) */ function float: sqrt(float: x); /** @group stdlib.arithmetic Return \(\sqrt{\a x}\) */ function var float: sqrt(var float: x) = let { constraint x >= 0.0; } in sqrt_t(x); function var float: sqrt_t(var float: x) ::promise_total = let { var float: r; var float: xx; constraint x < 0.0 -> xx = 1.0; constraint x < 0.0 \/ xx = x; constraint float_sqrt(xx,r); } in r; /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function int: pow(int: x, int: y); /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function var int: pow(var int: x, var int: y) = let { int: yy = if is_fixed(y) then fix(y) else -1 endif; } in if yy = 0 then 1 elseif yy = 1 then x elseif 0..1==dom(x) then x elseif -1..1==dom(x) /\ is_fixed(y) /\ 1 == fix(y) mod 2 then x else let { var int: r ::is_defined_var; constraint if is_fixed(y) then int_pow_fixed(x,fix(y),r) ::defines_var(r) else int_pow(x,y,r) ::defines_var(r) endif; } in r endif; /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function float: pow(float: x, float: y); /** @group stdlib.arithmetic Return \(\a x ^ {\a y}\) */ function var float: pow(var float: x, var float: y) = let { float: yy = if is_fixed(y) then fix(y) else -1.0 endif } in if yy = 0.0 then 1.0 elseif yy = 1.0 then x else let { var float: r ::is_defined_var; constraint float_pow(x,y,r) ::defines_var(r); } in r endif; /*** @groupdef stdlib.explog Exponential and logarithmic builtins These builtins implement exponential and logarithmic functions. */ /** @group stdlib.explog Return \(e ^ {\a x}\) */ function float: exp(float: x); /** @group stdlib.explog Return \(e ^ {\a x}\) */ function var float: exp(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_exp(x,r) ::defines_var(r); } in r; /** @group stdlib.explog Return \(\ln \a x\) */ function float: ln(float: x); /** @group stdlib.explog Return \(\ln \a x\) */ function var float: ln(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_ln(x,r) ::defines_var(r); } in r; /** @group stdlib.explog Return \(\log_{10} \a x\) */ function float: log10(float: x); /** @group stdlib.explog Return \(\log_{10} \a x\) */ function var float: log10(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_log10(x,r) ::defines_var(r); } in r; /** @group stdlib.explog Return \(\log_{2} \a x\) */ function float: log2(float: x); /** @group stdlib.explog Return \(\log_{2} \a x\) */ function var float: log2(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_log2(x,r) ::defines_var(r); } in r; /** @group stdlib.explog Return \(\log_{\a x} \a y\) */ function float: log(float: x, float: y); /*** @groupdef stdlib.trigonometric Trigonometric functions These builtins implement the standard trigonometric functions. */ /** @group stdlib.trigonometric Return \(\sin \a x\) */ function float: sin(float: x); /** @group stdlib.trigonometric Return \(\sin \a x\) */ function var float: sin(var float: x) ::promise_total = let { var -1.0..1.0: r ::is_defined_var; constraint float_sin(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\cos \a x\) */ function float: cos(float: x); /** @group stdlib.trigonometric Return \(\cos \a x\) */ function var float: cos(var float: x) ::promise_total = let { var -1.0..1.0: r ::is_defined_var; constraint float_cos(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\tan \a x\) */ function float: tan(float: x); /** @group stdlib.trigonometric Return \(\tan \a x\) */ function var float: tan(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_tan(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{asin}\ \a x\) */ function float: asin(float: x); /** @group stdlib.trigonometric Return \(\mbox{asin}\ \a x\) */ function var float: asin(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_asin(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{acos}\ \a x\) */ function float: acos(float: x); /** @group stdlib.trigonometric Return \(\mbox{acos}\ \a x\) */ function var float: acos(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_acos(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{atan}\ \a x\) */ function float: atan(float: x); /** @group stdlib.trigonometric Return \(\mbox{atan}\ \a x\) */ function var float: atan(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_atan(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\sinh \a x\) */ function float: sinh(float: x); /** @group stdlib.trigonometric Return \(\sinh \a x\) */ function var float: sinh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_sinh(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\cosh \a x\) */ function float: cosh(float: x); /** @group stdlib.trigonometric Return \(\cosh \a x\) */ function var float: cosh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_cosh(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\tanh \a x\) */ function float: tanh(float: x); /** @group stdlib.trigonometric Return \(\tanh \a x\) */ function var float: tanh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_tanh(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{asinh}\ \a x\) */ function float: asinh(float: x); /** @group stdlib.trigonometric Return \(\mbox{asinh}\ \a x\) */ function var float: asinh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_asinh(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{acosh}\ \a x\) */ function float: acosh(float: x); /** @group stdlib.trigonometric Return \(\mbox{acosh}\ \a x\) */ function var float: acosh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_acosh(x,r) ::defines_var(r); } in r; /** @group stdlib.trigonometric Return \(\mbox{atanh}\ \a x\) */ function float: atanh(float: x); /** @group stdlib.trigonometric Return \(\mbox{atanh}\ \a x\) */ function var float: atanh(var float: x) ::promise_total = let { var float: r ::is_defined_var; constraint float_atanh(x,r) ::defines_var(r); } in r; libminizinc-2.5.3/share/minizinc/std/stdlib/stdlib_logic.mzn0000644000175000017500000001133013757304533022657 0ustar kaolkaol/*** @groupdef stdlib.logic Logical operations Logical operations are the standard operators of Boolean logic. */ /** @group stdlib.logic Return truth value of \a x ∧ \a y */ function bool: '/\'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a x ∧ \a y with identity <> = True*/ function bool: '/\'(opt bool: x, opt bool: y) = (absent(x) \/ deopt(x)) /\ (absent(y) \/ deopt(y)); /** @group stdlib.logic Return truth value of \a x ∧ \a y */ function var bool: '/\'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of \a x ∧ \a y with identity <> = True*/ function var bool: '/\'(var opt bool: x, var opt bool: y) = (absent(x) \/ deopt(x)) /\ (absent(y) \/ deopt(y)); /** @group stdlib.logic Return truth value of \a x ∨ \a y */ function bool: '\/'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a x ∨ \a y with identity <> = False*/ function bool: '\/'(opt bool: x, opt bool: y) = (occurs(x) /\ deopt(x)) \/ (occurs(y) /\ deopt(y)); /** @group stdlib.logic Return truth value of \a x ∨ \a y */ function var bool: '\/'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of \a x ∨ \a y with identity <> = False*/ function var bool: '\/'(var opt bool: x, var opt bool: y) = (occurs(x) /\ deopt(x)) \/ (occurs(y) /\ deopt(y)); /** @group stdlib.logic Return truth value of \a x implies \a y */ function bool: '->'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a x implies \a y */ function var bool: '->'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of \a y implies \a x */ function bool: '<-'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a y implies \a x */ function var bool: '<-'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of \a x if-and-only-if \a y */ function bool: '<->'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a x if-and-only-if \a y */ function var bool: '<->'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of \a x xor \a y */ function bool: 'xor'( bool: x, bool: y); /** @group stdlib.logic Return truth value of \a x xor \a y */ function var bool: 'xor'(var bool: x, var bool: y); /** @group stdlib.logic Return truth value of the negation of \a x */ function bool: 'not'( bool: x); /** @group stdlib.logic Negation of \a x if it occurs, otherwise absent */ function opt bool: 'not'(opt bool: x) = if absent(x) then <> else not deopt(x) endif; /** @group stdlib.logic Return truth value of the negation of \a x */ function var bool: 'not'(var bool: x); /** @group stdlib.logic Negation of \a x if it occurs, otherwise absent */ function var opt bool: 'not'(var opt bool: x) = if absent(x) then <> else not deopt(x) endif; /** @group stdlib.logic Return truth value of \(\bigwedge_i \a x[i]\) */ function bool: forall(array[$T] of bool: x); /** @group stdlib.logic Return truth value of \(\bigwedge_i \a x[i]\) */ function var bool: forall(array[$T] of var bool: x); /** @group stdlib.logic True iff for any \p i, \a x[i] is absent or true */ predicate forall (array[int] of var opt bool: x) = forall ([absent(x[i]) \/ deopt(x[i]) | i in index_set(x)]); /** @group stdlib.logic Return truth value of \(\bigvee_i \a x[i]\) */ function bool: exists(array[$T] of bool: x); /** @group stdlib.logic Return truth value of \(\bigvee_i \a x[i]\) */ function var bool: exists(array[$T] of var bool: x); /** @group stdlib.logic True iff for at least one \p i, \a x[i] occurs and is true */ predicate exists (array[int] of var opt bool: x) = exists ([occurs(x[i]) /\ deopt(x[i]) | i in index_set(x)]); /** @group stdlib.logic Return truth value of \(\oplus_i \a x[i]\) */ function bool: xorall(array[$T] of bool: x); /** @group stdlib.logic Return truth value of \(\oplus_i \a x[i]\) */ function var bool: xorall(array[$T] of var bool: x) = array_bool_xor(array1d(x)); /** @group stdlib.logic Return truth value of \(\text{true}\oplus (\oplus_i \a x[i])\) */ function bool: iffall(array[$T] of bool: x); /** @group stdlib.logic Return truth value of \(\text{true}\oplus (\oplus_i \a x[i])\) */ function var bool: iffall(array[$T] of var bool: x) = array_bool_xor(array1d(x)++[true]); /** @group stdlib.logic Return truth value of \((\bigvee_i \a x[i]) \lor (\bigvee_j \lnot \a y[j])\) */ function var bool: clause(array[$T] of var bool: x, array[$T] of var bool: y); /** @group stdlib.logic Return truth value of \((\bigvee_i \a x[i]) \lor (\bigvee_j \lnot \a y[j])\) */ function var bool: clause(array[$T] of bool: x, array[$T] of bool: y); /** @group stdlib.logic Return negation of \a b */ function var bool: bool_not(var bool: b); libminizinc-2.5.3/share/minizinc/std/count_neq.mzn0000644000175000017500000000162013757304533020734 0ustar kaolkaolinclude "fzn_count_neq_par.mzn"; include "fzn_count_neq.mzn"; include "fzn_count_neq_par_reif.mzn"; include "fzn_count_neq_reif.mzn"; /** @group globals.counting Constrains \a c to be not equal to the number of occurrences of \a y in \a x. */ predicate count_neq(array[$X] of var int: x, var int: y, var int: c) = fzn_count_neq(array1d(x),y,c); /** @group globals.counting Constrains \a c to be not equal to the number of occurrences of \a y in \a x. */ predicate count_neq(array[$X] of var int: x, int: y, int: c) = fzn_count_neq_par(array1d(x),y,c); predicate count_neq_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_neq_reif(array1d(x),y,c,b); predicate count_neq_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_neq_par_reif(array1d(x),y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/disjunctive.mzn0000644000175000017500000000132313757304533021270 0ustar kaolkaolinclude "disjunctive_strict.mzn"; include "fzn_disjunctive.mzn"; include "fzn_disjunctive_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s and durations \a d do not overlap in time. Tasks with duration 0 can be scheduled at any time, even in the middle of other tasks. Assumptions: - forall \p i, \a d[\p i] >= 0 */ predicate disjunctive(array[int] of var int: s, array[int] of var int: d) = assert(index_set(s) == index_set(d), "disjunctive: the array arguments must have identical index sets", if (lb_array(d) > 0) then disjunctive_strict(s,d) else fzn_disjunctive(s,d) endif ); libminizinc-2.5.3/share/minizinc/std/fzn_count_neq_par_reif.mzn0000644000175000017500000000035513757304533023464 0ustar kaolkaolinclude "fzn_count_neq_reif.mzn"; predicate fzn_count_neq_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_neq_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/bounded_path.mzn0000644000175000017500000001335513757304533021405 0ustar kaolkaol/** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a path from \a s to \a t of weight \a K. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the cost of the path */ predicate bounded_dpath(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"bounded_dpath: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"bounded_dpath: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"bounded_dpath: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"bounded_dpath: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"bounded_dpath: index set of w must be 1..\(E)") /\ fzn_bounded_dpath(N,E,from,to,w,s,t,ns,es,K); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a path from \a s to \a t of weight \a K. @param from: the leaving node for each edge @param to: the entering node for each edge @param w: the weight of each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the cost of the path */ predicate bounded_dpath(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = index_set(to),"bounded_dpath: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"bounded_dpath: index set of from and es must be identical") /\ assert(index_set(w) = index_set(es),"bounded_dpath: index set of w and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"bounded_dpath: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"bounded_dpath: nodes in to must be in index set of ns") /\ fzn_bounded_dpath(from,to,w,s,t,ns,es,K); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be a path from \a s to \a t of weight \a K. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the cost of the path */ predicate bounded_path(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"bounded_path: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"bounded_path: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"bounded_path: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"bounded_path: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"bounded_path: index set of w must be 1..\(E)") /\ fzn_bounded_path(N,E,from,to,w,s,t,ns,es,K); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be a path from \a s to \a t of weight \a K. @param from: the leaving node for each edge @param to: the entering node for each edge @param w: the weight of each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the cost of the path */ predicate bounded_path(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = index_set(to),"bounded_path: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"bounded_path: index set of from and es must be identical") /\ assert(index_set(w) = index_set(es),"bounded_path: index set of w and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"bounded_path: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"bounded_path: nodes in to must be in index set of ns") /\ fzn_bounded_path(from,to,w,s,t,ns,es,K); include "fzn_bounded_path_int.mzn"; include "fzn_bounded_path_int_reif.mzn"; include "fzn_bounded_path_enum.mzn"; include "fzn_bounded_path_enum_reif.mzn"; include "fzn_bounded_dpath_int.mzn"; include "fzn_bounded_dpath_int_reif.mzn"; include "fzn_bounded_dpath_enum.mzn"; include "fzn_bounded_dpath_enum_reif.mzn"; %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_most1.mzn0000644000175000017500000000022413757304533021344 0ustar kaolkaolpredicate fzn_at_most1(array[int] of var set of int: s) = forall(i,j in index_set(s) where i < j) ( card(s[i] intersect s[j]) <= 1 ); libminizinc-2.5.3/share/minizinc/std/fzn_at_most_set.mzn0000644000175000017500000000055613757304533022146 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_most_set(int: n, array[int] of var set of int: x, set of int: v) = sum(i in index_set(x)) ( bool2int(x[i] == v) ) <= n; libminizinc-2.5.3/share/minizinc/std/fzn_set_member.mzn0000644000175000017500000000043313757304533021741 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_set_member(var set of int: x, var int: y) = y in x; libminizinc-2.5.3/share/minizinc/std/fzn_steiner.mzn0000644000175000017500000000062213757304533021270 0ustar kaolkaolinclude "tree.mzn"; predicate fzn_steiner(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = let { var 1..N: r; } in tree(N,E,from,to,r,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_least_int.mzn0000644000175000017500000000053013757304533022263 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires at least 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_least_int(int: n, array[int] of var int: x, int: v) = count(x, v) >= n; libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_bool_reif.mzn0000644000175000017500000000201413757304533024000 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_bool_reif(array[int] of var bool: x, array[int] of var bool: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/decreasing_int.mzn0000644000175000017500000000054513757304533021724 0ustar kaolkaolinclude "fzn_decreasing_int.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate decreasing_int(array[int] of var int: x) = fzn_decreasing_int(x); libminizinc-2.5.3/share/minizinc/std/at_most.mzn.deprecated.mzn0000644000175000017500000000023313757304533023310 0ustar kaolkaolpredicate at_most(int: n, array[int] of var int: x, int: v) ::mzn_deprecated("2.4.0","https://www.minizinc.org/doc-2.4.0/en/lib-globals.html#deprecated"); libminizinc-2.5.3/share/minizinc/std/fzn_knapsack.mzn0000644000175000017500000000045613757304533021417 0ustar kaolkaolpredicate fzn_knapsack(array[int] of int: w, array[int] of int:p, array[int] of var int:x, var int: W, var int: P) = forall (i in index_set(x)) (x[i] >= 0) /\ W >= 0 /\ P >= 0 /\ P = sum(i in index_set(p)) (x[i]*p[i]) /\ W = sum(i in index_set(w)) (x[i]*w[i]); libminizinc-2.5.3/share/minizinc/std/lex_less.mzn0000644000175000017500000000462613757304533020570 0ustar kaolkaolinclude "lex_less_bool.mzn"; include "lex_less_float.mzn"; include "lex_less_int.mzn"; include "lex_less_set.mzn"; /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically less than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_less(array[int] of var bool: x, array[int] of var bool: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] < y[min(index_set(y))] elseif length(x)=0 then length(y)>0 elseif length(y)=0 then false else lex_less_bool(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically less than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_less(array[int] of var int: x, array[int] of var int: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] < y[min(index_set(y))] elseif length(x)=0 then length(y)>0 elseif length(y)=0 then false else lex_less_int(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically less than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_less(array[int] of var float: x, array[int] of var float: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] < y[min(index_set(y))] elseif length(x)=0 then length(y)>0 elseif length(y)=0 then false else lex_less_float(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is strictly lexicographically less than array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_less(array[int] of var set of int: x, array[int] of var set of int: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] < y[min(index_set(y))] elseif length(x)=0 then length(y)>0 elseif length(y)=0 then false else lex_less_set(x, y) endif; % Alternative names for the above. % predicate lex_lt(array[int] of var bool: x, array[int] of var bool: y) = lex_less(x, y); predicate lex_lt(array[int] of var int: x, array[int] of var int: y) = lex_less(x, y); predicate lex_lt(array[int] of var float: x, array[int] of var float: y) = lex_less(x, y); predicate lex_lt(array[int] of var set of int: x, array[int] of var set of int: y) = lex_less(x, y); libminizinc-2.5.3/share/minizinc/std/increasing_bool.mzn0000644000175000017500000000061713757304533022103 0ustar kaolkaolinclude "fzn_increasing_bool.mzn"; include "fzn_increasing_bool_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate increasing_bool(array[int] of var bool: x) = fzn_increasing_bool(x); libminizinc-2.5.3/share/minizinc/std/fzn_cumulative_opt.mzn0000644000175000017500000000405113757304533022657 0ustar kaolkaolpredicate fzn_cumulative_opt(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in if 0==card(Tasks) then /*true*/ 0==card(index_set(s)) \/ b>=0 else let { int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( if late - early > 5000 then fzn_cumulative_opt_task(s, d, r, b) else fzn_cumulative_opt_time(s, d, r, b) endif ) endif ; predicate fzn_cumulative_opt_time(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 }, int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( forall( t in early..late ) ( b >= sum( i in Tasks ) ( bool2int(occurs(s[i]) /\ deopt(s[i]) <= t /\ t < deopt(s[i]) + d[i]) * r[i] ) ) ); predicate fzn_cumulative_opt_task(array[int] of var opt int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(occurs(s[i])) > 0 /\ ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in ( forall( j in Tasks ) ( occurs(s[j]) -> b >= r[j] + sum( i in Tasks where i != j ) ( bool2int(occurs(s[i]) /\ deopt(s[i]) <= deopt(s[j]) /\ deopt(s[j]) < deopt(s[i]) + d[i] ) * r[i] ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_strictly_increasing_bool.mzn0000644000175000017500000000055313757304533024714 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_increasing_bool(array[int] of var bool: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] < x[i]); libminizinc-2.5.3/share/minizinc/std/element_set.mzn0000644000175000017500000000052613757304533021251 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' is the ith element of the array 'x'. %-----------------------------------------------------------------------------% predicate element_set(var int: i, array[int] of var set of int: x, var set of int: y) = y = x[i]; libminizinc-2.5.3/share/minizinc/std/exactly.mzn0000644000175000017500000000101113757304533020404 0ustar kaolkaolinclude "exactly_int.mzn"; include "exactly_set.mzn"; /** @group globals.deprecated Requires exactly \a n variables in \a x to take the value \a v. This constraint is deprecated. Use count(i in x)(i=v) = n instead. */ predicate exactly(int: n, array[int] of var int: x, int: v) = exactly_int(n, x, v); /** @group globals.counting Requires exactly \a n variables in \a x to take the value \a v. */ predicate exactly(int: n, array[$X] of var set of int: x, set of int: v) = exactly_set(n, array1d(x), v); libminizinc-2.5.3/share/minizinc/std/mdd.mzn0000644000175000017500000000605013757304533017507 0ustar kaolkaolinclude "fzn_mdd.mzn"; include "fzn_mdd_reif.mzn"; /** @group globals.extensional Requires that \a x defines a path from root to true node T through the (deterministic) MDD defined by @param N: the number of nodes, the root node is node 1 @param level: the level of each node, the root is level 1, T is level \a length(x)+1 @param E: the number of edges @param from: the leaving node (1..\a N)for each edge @param label: the set of values of the \a x variable for each edge @param to: the entering node for each edge, where 0 = T node The MDD must be deterministic, i.e., there cannot be two edges with the same label leaving the same node. */ predicate mdd(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % possible values of variable array[int] of int: to % edge entering node 0..N where 0 = T node ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of int: levele = array1d(0..N,[L+1]++level); } in assert(index_set(level) = NODE, "mdd: third argument must be of length N = \(N)") /\ assert(index_set(from) = EDGE, "mdd: 5th argument must be of length E = \(E)") /\ assert(index_set(to) = EDGE, "mdd: 7th argument must be of length E = \(E)") /\ forall(e in EDGE)(assert(from[e] in NODE, "mdd: from[\(e)] must be in \(NODE)")) /\ forall(e in EDGE)(assert(to[e] in 0..N, "mdd: to[\(e)] must be in 0..\(N)")) /\ forall(e in EDGE)(assert(level[from[e]]+1 = levele[to[e]], "mdd level of from[\(e)] = \(level[from[e]])" ++ "must be 1 less than level of to[\(e)] = \(levele[to[e]])")) /\ forall(e1,e2 in EDGE where e1 < e2 /\ from[e1] = from[e2]) (assert(label[e1] intersect label[e2] = {}, "mdd: Two edges \(e1) and \(e2) leaving node \(from[e1]) with overlapping labels")) /\ fzn_mdd(x, N, level, E, from, label, to); % Example consider an MDD over 3 variables % 5 nodes and 12 edges % level 1 root = 1 % level 2 2 3 % level 3 4 5 % level 4 T % with edges (from,label,to) given by % (1,1,2), (1,2,3), (1,3,2) % (2,2,4), (2,3,5) % (3,3,4), (3,2,5) % (4,1,0), (4,5,0) % (5,2,0), (5,4,0), (5,6,0) % this is defined by the call % mdd([x1,x2,x3],5,[1,2,2,3,3],12,[1,1,1,2,2,3,3,4,4,5,5,5],[1,3,2,2,3,3,2,1,5,2,4,6],[2,2,3,4,5,4,5,0,0,0,0,0]) libminizinc-2.5.3/share/minizinc/std/fzn_dpath_enum.mzn0000644000175000017500000000332213757304533021743 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_dpath(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es) = let { set of int: EDGE = index_set(es); array[index_set(ns)] of var 0..length(ns)-1: dist; /* distance from root */ } in ns[s] /\ % source is selected ns[t] /\ % dest is selected dist[s] = 0 /\ % distance of source is zero forall(n in index_set(ns)) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in index_set(ns)) % 1 incoming edge ((ns[n] /\ n != s) -> exists(e in EDGE where to[e] = n)(es[e])) /\ forall(n in index_set(ns)) % 1 outgoing edge ((ns[n] /\ n != t) -> exists(e in EDGE where from[e] = n)(es[e])) /\ forall(n in index_set(ns)) % 1 incoming edge ((ns[n] /\ n != s) -> sum(e in EDGE where to[e] = n)(es[e]) <= 1) /\ forall(n in index_set(ns)) % 1 outgoing edge ((ns[n] /\ n != t) -> sum(e in EDGE where from[e] = n)(es[e]) <= 1) /\ % alternate for the previous 8 lines % forall(n in index_set(ns)) % 1 incoming edge % ((ns[n] /\ n != s) -> sum(e in EDGE where to[e] = n)(es[e]) = 1) /\ % forall(n in index_set(ns)) % 1 outgoing edge % ((ns[n] /\ n != t) -> sum(e in EDGE where from[e] = n)(es[e]) = 1) /\ forall(e in EDGE) (es[e] -> dist[to[e]] = dist[from[e]] + 1) /\ sum(n in index_set(ns))(ns[n]) = sum(e in EDGE)(es[e]) + 1 /\ subgraph(from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/regular.mzn0000644000175000017500000000250613757304533020406 0ustar kaolkaolinclude "fzn_regular.mzn"; include "fzn_regular_reif.mzn"; /** @group globals.extensional The sequence of values in array \a x (which must all be in the range 1..\a S) is accepted by the DFA of \a Q states with input 1..\a S and transition function \a d (which maps (1..\a Q, 1..\a S) -> 0..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). We reserve state 0 to be an always failing state. */ predicate regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F) = assert(Q > 0, "regular: 'Q' must be greater than zero", assert(S > 0, "regular: 'S' must be greater than zero", assert(index_set_1of2(d) = 1..Q /\ index_set_2of2(d) == 1..S, "regular: the transition function 'd' must be [1..Q,1..S]", assert(forall([d[i, j] in 0..Q | i in 1..Q, j in 1..S]), "regular: transition function 'd' points to states outside 0..Q", % Nb: we need the parentheses around the expression otherwise the % parser thinks it's a generator call! assert((q0 in 1..Q), "regular: start state 'q0' not in 1..Q", assert(F subset 1..Q, "regular: final states in 'F' contain states outside 1..Q", fzn_regular(x,Q,S,d,q0,F) )))))); libminizinc-2.5.3/share/minizinc/std/fzn_path_int_reif.mzn0000644000175000017500000000063713757304533022440 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_path_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified path constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_increasing_float.mzn0000644000175000017500000000057013757304533023130 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_float(array[int] of var float: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_dwst.mzn0000644000175000017500000000064113757304533020601 0ustar kaolkaolinclude "tree.mzn"; predicate fzn_dwst(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: es, var int: K) = let { array[1..N] of bool: ns = [true | n in 1..N]; } in dtree(N,E,from,to,r,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_leq_reif.mzn0000644000175000017500000000060113757304533022612 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_leq_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = let { var int: z = count(x,y) } in b <-> z >= c; % This needs to be written with a let rather than count(x,y) >= c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/lex_lesseq.mzn0000644000175000017500000000466713757304533021123 0ustar kaolkaolinclude "lex_lesseq_bool.mzn"; include "lex_lesseq_float.mzn"; include "lex_lesseq_int.mzn"; include "lex_lesseq_set.mzn"; /** @group globals.lexicographic Requires that the array \a x is lexicographically less than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_lesseq(array[int] of var bool: x, array[int] of var bool: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] <= y[min(index_set(y))] elseif length(x)=0 then true elseif length(y)=0 then false else lex_lesseq_bool(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is lexicographically less than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_lesseq(array[int] of var float: x, array[int] of var float: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] <= y[min(index_set(y))] elseif length(x)=0 then true elseif length(y)=0 then false else lex_lesseq_float(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is lexicographically less than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_lesseq(array[int] of var int: x, array[int] of var int: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] <= y[min(index_set(y))] elseif length(x)=0 then true elseif length(y)=0 then false else lex_lesseq_int(x, y) endif; /** @group globals.lexicographic Requires that the array \a x is lexicographically less than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_lesseq(array[int] of var set of int: x, array[int] of var set of int: y) = if length(x)=1 /\ length(y)=1 then x[min(index_set(x))] <= y[min(index_set(y))] elseif length(x)=0 then true elseif length(y)=0 then false else lex_lesseq_set(x, y) endif; % Alternative names for the above. % predicate lex_leq(array[int] of var bool: x, array[int] of var bool: y) = lex_lesseq(x, y); predicate lex_leq(array[int] of var int: x, array[int] of var int: y) = lex_lesseq(x, y); predicate lex_leq(array[int] of var float: x, array[int] of var float: y) = lex_lesseq(x, y); predicate lex_leq(array[int] of var set of int: x, array[int] of var set of int: y) = lex_lesseq(x, y); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.0.2.mzn0000644000175000017500000000165113757304533022244 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.0.2 % that can be overridden by solvers. predicate symmetry_breaking_constraint(var bool: b) = b; predicate redundant_constraint(var bool: b) = b; predicate array_var_bool_element_nonshifted(var int: idx, array[int] of var bool: x, var bool: c) = array_var_bool_element((idx-(min(index_set(x))-1))::domain,array1d(x),c); predicate array_var_int_element_nonshifted(var int: idx, array[int] of var int: x, var int: c) = array_var_int_element((idx-(min(index_set(x))-1))::domain,array1d(x),c); predicate array_var_float_element_nonshifted(var int: idx, array[int] of var float: x, var float: c) = array_var_float_element((idx-(min(index_set(x))-1))::domain,array1d(x),c); predicate array_var_set_element_nonshifted(var int: idx, array[int] of var set of int: x, var set of int: c) = array_var_set_element((idx-(min(index_set(x))-1))::domain,array1d(x),c); libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_set.mzn0000644000175000017500000000171313757304533022312 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_set(array[int] of var set of int: x, array[int] of var set of int: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/bin_packing.mzn0000644000175000017500000000252113757304533021206 0ustar kaolkaolinclude "fzn_bin_packing.mzn"; include "fzn_bin_packing_reif.mzn"; /** @group globals.packing Requires that each item \p i with weight \a w[\p i], be put into \a bin[\p i] such that the sum of the weights of the items in each bin does not exceed the capacity \a c. Assumptions: - forall \p i, \a w[\p i] >=0 - \a c >=0 */ predicate bin_packing(int: c, array[int] of var int: bin, array[int] of int: w) = assert(index_set(bin) == index_set(w), "bin_packing: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing: the weights must be non-negative", assert(c >= 0, "bin_packing: capacity must be non-negative", fzn_bin_packing(c, bin, w) ))); predicate bin_packing_reif(int: c, array[int] of var int: bin, array[int] of int: w, var bool: b) = assert(index_set(bin) == index_set(w), "bin_packing: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing: the weights must be non-negative", assert(c >= 0, "bin_packing: capacity must be non-negative", fzn_bin_packing_reif(c, bin, w, b) ))); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_cost_regular.mzn0000644000175000017500000000234113757304533022310 0ustar kaolkaolpredicate fzn_cost_regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F, array[int,int] of int: c, var int: C) = let { % If x has index set m..n-1, then a[m] holds the initial state % (q0), and a[i+1] holds the state we're in after processing % x[i]. If a[n] is in F, then we succeed (ie. accept the string). int: m = min(index_set(x)); int: n = max(index_set(x)) + 1; array[m..n] of var 1..Q: a; % cc[i+1] holds the accumulated cost of edges taken process up to x[i] array[m..n] of var int: cc; } in a[m] = q0 /\ % Set a[0]. cc[m] = 0 /\ % initially zero cost forall(i in index_set(x)) ( x[i] in 1..S /\ % Do this in case it's a var. a[i+1] = d[a[i], x[i]] /\ % Determine a[i+1]. cc[i+1] = c[a[i],x[i]] + cc[i] % Calculate new cost sum ) /\ a[n] in F /\ % Check the final state is in F. C = cc[n] % return final cost ; libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_opt_float.mzn0000644000175000017500000000057613757304533024322 0ustar kaolkaolpredicate fzn_if_then_else_opt_float(array[int] of var bool: c, array[int] of opt float: x, var opt float: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_geost_bb.mzn0000644000175000017500000000205013757304533021400 0ustar kaolkaolpredicate fzn_geost_bb( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u ) = % Two useful definitions let { set of int: DIMS = 1..k; set of int: OBJECTS = index_set(kind); } in % Posting the geost constraint fzn_geost(k, rect_size, rect_offset, shape, x, kind) /\ % Posting the bounding box constraints forall(o in OBJECTS)( forall(s in dom(kind[o]))( (kind[o] = s -> forall(r in shape[s], j in DIMS)( x[o,j] + rect_offset[r,j] >= l[j] /\ x[o,j] + rect_offset[r,j] + rect_size[r,j] <= u[j] ) ) ) ); libminizinc-2.5.3/share/minizinc/std/disjunctive_opt.mzn0000644000175000017500000000156213757304533022157 0ustar kaolkaolinclude "disjunctive_strict_opt.mzn"; include "fzn_disjunctive_opt.mzn"; include "fzn_disjunctive_opt_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s and durations \a d do not overlap in time. Tasks with duration 0 can be scheduled at any time, even in the middle of other tasks. Start times are optional variables, so that absent tasks do not need to be scheduled. Assumptions: - forall \p i, \a d[\p i] >= 0 */ predicate disjunctive(array[int] of var opt int: s, array[int] of var int: d) = assert(index_set(s) == index_set(d), "disjunctive: the array arguments must have identical index sets", forall (i in index_set(d)) (d[i] >= 0) /\ if (lb_array(d) > 0) then disjunctive_strict(s,d) else fzn_disjunctive_opt(s, d) endif ); libminizinc-2.5.3/share/minizinc/std/fzn_cost_regular_reif.mzn0000644000175000017500000000043413757304533023316 0ustar kaolkaolpredicate fzn_cost_regular_reif(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F, array[int,int] of int: c, var int: C, var bool: b) = abort("Reified cost_regular is not supported."); libminizinc-2.5.3/share/minizinc/std/fzn_table_bool.mzn0000644000175000017500000000211413757304533021717 0ustar kaolkaol%-----------------------------------------------------------------------------% % A table constraint: table(x, t) represents the constraint x in t where we % consider each row in t to be a tuple and t as a set of tuples. %-----------------------------------------------------------------------------% predicate fzn_table_bool(array[int] of var bool: x, array[int, int] of bool: t) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: lt = min(index_set_1of2(t)), int: ut = max(index_set_1of2(t)), var lt..ut: i, array[l..u, lt..ut] of bool: t_transposed = array2d(l..u, lt..ut, [ t[k,j] | j in l..u, k in lt..ut ]) } in forall(j in l..u) ( % Having the variable index component at the left position % means that the nD-to-1D array translation during Mzn-to-Fzn % will generate at most an offset constraint, instead of a % scaling + offset constraint. % t_transposed[j,i] = x[j] % % t[i,j] = x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_low_up.mzn0000644000175000017500000000057213757304533025033 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_global_cardinality_low_up(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound) = forall(i in index_set(cover))( count(x, cover[i]) in lbound[i]..ubound[i] ); libminizinc-2.5.3/share/minizinc/std/experimental.mzn0000644000175000017500000000241113757304533021435 0ustar kaolkaol%-----------------------------------------------------------------------------% % MiniZinc standard library. % Experimental stuff. %-----------------------------------------------------------------------------% % This file contains declarations of all functions, predicates and annotations % available in the base MiniZinc language. /*** @groupdef MAIN The MiniZinc library */ /*** @groupdef annotations.multiobj-experimental Multiobjective annotations */ /** @group annotations.multiobj-experimental Sequentially (lexicographically) optimize objectives specified in array \a s. The \a goal_hierarchy annotation is to be attached to the solve item, for example: \code solve :: goal_hierarchy([int_min_goal(load[1]), int_min_goal(load[2]), int_min_goal(load[3])]) satisfy; \endcode */ annotation goal_hierarchy(array[int] of ann); /** @group annotations.multiobj-experimental Possible arguments of the \a goal_hierarchy annotation */ annotation min_goal(var int: x); annotation min_goal(var float: x); annotation int_min_goal(var int: x); annotation float_min_goal(var float: x); annotation max_goal(var int: x); annotation max_goal(var float: x); annotation int_max_goal(var int: x); annotation float_max_goal(var float: x); annotation sat_goal(var bool: b); libminizinc-2.5.3/share/minizinc/std/cumulative.mzn0000644000175000017500000000266713757304533021133 0ustar kaolkaolinclude "all_different.mzn"; include "disjunctive.mzn"; include "fzn_cumulative.mzn"; include "fzn_cumulative_reif.mzn"; /** @group globals.scheduling Requires that a set of tasks given by start times \a s, durations \a d, and resource requirements \a r, never require more than a global resource bound \a b at any one time. Assumptions: - forall \p i, \a d[\p i] >= 0 and \a r[\p i] >= 0 */ predicate cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = assert(index_set(s) == index_set(d) /\ index_set(s) == index_set(r), "cumulative: the 3 array arguments must have identical index sets", if length(s) >= 1 then assert(lb_array(d) >= 0 /\ lb_array(r) >= 0, "cumulative: durations and resource usages must be non-negative", if %% the previous test will not work for resources usages like [2,3,3,4,4] with a bound of 4 since the 2 appears exactly once let { int: mr = lb_array(r); int: mri = arg_min([ lb(r[i]) | i in index_set(r) ]) } in forall(i in index_set(r)) (is_fixed(r[i]) /\ (fix(r[i]) + mr > ub(b) \/ i = mri)) then if forall(i in index_set(d))(is_fixed(d[i]) /\ fix(d[i]) == 1) then all_different(s) else disjunctive(s, d) endif else fzn_cumulative(s, d, r, b) endif ) endif); libminizinc-2.5.3/share/minizinc/std/fzn_inverse_set_reif.mzn0000644000175000017500000000072713757304533023160 0ustar kaolkaolpredicate fzn_inverse_set_reif(array[int] of var set of int: f, array[int] of var set of int: invf, var bool: b) = b <-> ( forall(i in index_set(f)) ( f[i] subset index_set(invf) ) /\ forall(j in index_set(invf)) ( invf[j] subset index_set(f) ) /\ forall(i in index_set(f), j in index_set(invf)) ( (j in f[i] <-> i in invf[j]) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_connected.mzn0000644000175000017500000000052513757304533021563 0ustar kaolkaolinclude "reachable.mzn"; predicate fzn_connected(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = let { var index_set(ns): r } in reachable(from, to, r, ns, es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_different_set.mzn0000644000175000017500000000053513757304533023273 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate fzn_all_different_set(array[int] of var set of int: x) = forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); libminizinc-2.5.3/share/minizinc/std/disjoint.mzn0000644000175000017500000000033713757304533020570 0ustar kaolkaolinclude "fzn_disjoint.mzn"; include "fzn_disjoint_reif.mzn"; /** @group globals Requires that sets \a s1 and \a s2 do not intersect. */ predicate disjoint(var set of int: s1, var set of int: s2) = fzn_disjoint(s1,s2); libminizinc-2.5.3/share/minizinc/std/regular_regexp.mzn0000644000175000017500000000242413757304533021757 0ustar kaolkaolinclude "fzn_regular_regexp.mzn"; include "regular.mzn"; /** @group globals.extensional The sequence of values in array \a x is accepted by the regular expression \a r. This constraint generates it's DFA equivalent. Regular expressions can use the following syntax: - Selection: - Concatenation: "12 34", 12 followed by 34. (Characters are assumed to be the part of the same number unless split by syntax or whitespace.) - Union: "7|11", a 7 or 11. - Groups: "7(6|8)", a 7 followed by a 6 or an 8. - Wildcard: ".", any value within the domain. - Classes: "[3-6 7]", a 3,4,5,6, or 7. - Negated classes: "[^3 5]", any value within the domain except for a 3 or a 5. - Quantifiers: - Asterisk: "12*", 0 or more times a 12. - Question mark: "5?", 0 or 1 times a 5. (optional) - Plus sign: "42+", 1 or more time a 42. - Exact: "1{3}", exactly 3 times a 1. - At least: "9{5,}", 5 or more times a 9. - Between: "7{3,5}", at least 3 times, but at most 5 times a 7. Members of enumerated types can be used in place of any integer (e.g., "A B", A followed by B). Enumerated identifiers still use whitespace for concatenation. */ predicate regular(array[int] of var int: x, string: r) = fzn_regular(x, r); libminizinc-2.5.3/share/minizinc/std/fzn_count_geq_par.mzn0000644000175000017500000000032113757304533022441 0ustar kaolkaolinclude "fzn_count_geq.mzn"; predicate fzn_count_geq_par(array[int] of var int: x, int: y, int: c) = fzn_count_geq(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_dconnected_reif.mzn0000644000175000017500000000051613757304533022734 0ustar kaolkaolpredicate fzn_dconnected_reif(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dconnected is not supported."); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/atmost1.mzn0000644000175000017500000000022413757304533020330 0ustar kaolkaol% The actual definitions are in at_most1.mzn. % This file is used to handle the case where users include % "atmost1.mzn"; % include "at_most1.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_count_lt_par_reif.mzn0000644000175000017500000000035213757304533023315 0ustar kaolkaolinclude "fzn_count_lt_reif.mzn"; predicate fzn_count_lt_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_lt_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_member_set_reif.mzn0000644000175000017500000000055113757304533022747 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array of set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_set_reif(array[int] of var set of int: x, var set of int: y, var bool: b) = b <-> exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/fzn_count_geq.mzn0000644000175000017500000000055113757304533021604 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_geq(array[int] of var int: x, var int: y, var int: c) = let { var int: z = count(x,y) } in z <= c; % This needs to be written with a let rather than count(x,y) <= c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/at_most_set.mzn0000644000175000017500000000103413757304533021261 0ustar kaolkaolinclude "fzn_at_most_set.mzn"; include "fzn_at_most_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate at_most_set(int: n, array[int] of var set of int: x, set of int: v) = fzn_at_most_set(n, x, v); predicate at_most_set_reif(int: n, array[int] of var set of int: x, set of int: v, var bool: b) = fzn_at_most_set_reif(n, x, v, b); libminizinc-2.5.3/share/minizinc/std/fzn_inverse_in_range.mzn0000644000175000017500000000155413757304533023141 0ustar kaolkaolinclude "global_cardinality.mzn"; predicate fzn_inverse_in_range(array[int] of var int: f, array[int] of var int: invf) = forall(i in index_set(f)) ( f[i] in index_set(invf) -> (invf[f[i]] == i) ) /\ forall(j in index_set(invf)) ( invf[j] in index_set(f) -> (f[invf[j]] == j) ) /\ redundant_constraint( strengthen_injection_for_inverse_in_range(f, invf) ) /\ redundant_constraint( strengthen_injection_for_inverse_in_range(invf, f) ); predicate strengthen_injection_for_inverse_in_range(array[int] of var int: f, array[int] of var int: invf) = let { set of int: sinvf = { i | i in index_set(invf) where dom(invf[i]) subset index_set(f) }, } in global_cardinality(f, [ i | i in sinvf ], [ 1 | i in sinvf ] ); libminizinc-2.5.3/share/minizinc/std/fzn_all_equal_set_reif.mzn0000644000175000017500000000055213757304533023440 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate fzn_all_equal_set_reif(array[int] of var set of int: x, var bool: b) = b <-> forall(i, j in index_set(x) where i < j) ( x[i] = x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_lex2.mzn0000644000175000017500000000123713757304533020474 0ustar kaolkaolinclude "lex_lesseq.mzn"; predicate fzn_lex2(array[int, int] of var int: x) = let { int: lbx1 = min(index_set_1of2(x)), int: ubx1 = max(index_set_1of2(x)), int: lbx2 = min(index_set_2of2(x)), int: ubx2 = max(index_set_2of2(x)) } in ( forall(i in lbx1 + 1 .. ubx1) ( lex_lesseq([x[i - 1, j] | j in index_set_2of2(x)], [x[i, j] | j in index_set_2of2(x)] ) ) /\ forall(j in lbx2 + 1 .. ubx2) ( lex_lesseq([x[i, j - 1] | i in index_set_1of2(x)], [x[i, j ] | i in index_set_1of2(x)] ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_opt_int.mzn0000644000175000017500000000057013757304533024001 0ustar kaolkaolpredicate fzn_if_then_else_opt_int(array[int] of var bool: c, array[int] of opt int: x, var opt int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/value_precede.mzn0000644000175000017500000000214113757304533021543 0ustar kaolkaolinclude "value_precede_int.mzn"; include "fzn_value_precede_int_opt.mzn"; include "value_precede_set.mzn"; /** @group globals.lexicographic Requires that \a s precede \a t in the array \a x. Precedence means that if any element of \a x is equal to \a t, then another element of \a x with a lower index is equal to \a s. */ predicate value_precede(int: s, int: t, array[int] of var int: x) = value_precede_int(s, t, x); /** @group globals.lexicographic Requires that \a s precede \a t in the array \a x. Precedence means that if any element of \a x is equal to \a t, then another element of \a x with a lower index is equal to \a s. */ predicate value_precede(int: s, int: t, array[int] of var opt int: x) = fzn_value_precede_int_opt(s, t, x); /** @group globals.lexicographic Requires that \a s precede \a t in the array \a x. Precedence means that if an element of \a x contains \a t but not \a s, then another element of \a x with lower index contains \a s but not \a t. */ predicate value_precede(int: s, int: t, array[int] of var set of int: x) = value_precede_set(s, t, x); libminizinc-2.5.3/share/minizinc/std/maximum.mzn0000644000175000017500000000061313757304533020417 0ustar kaolkaol/** @group globals Constrains \a m to be the maximum of the values in \a x. Assumptions: |\a x| > 0. */ predicate maximum(var int: m, array[int] of var int: x) = array_int_maximum(m, x); /** @group globals Constrains \a m to be the maximum of the values in \a x. Assumptions: |\a x| > 0. */ predicate maximum(var float: m, array[int] of var float: x) = array_float_maximum(m, x); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.5.2.mzn0000644000175000017500000000266613757304533022260 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.5.2 % that can be overridden by solvers. predicate array_var_int_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var int: x, var int: c) = let { int: dim = card(index_set_2of2(x)); int: min_flat = min(index_set_1of2(x))*dim+min(index_set_2of2(x))-1; } in array_var_int_element_nonshifted((idx1*dim+idx2-min_flat)::domain, array1d(x), c); predicate array_var_bool_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var bool: x, var bool: c) = let { int: dim = card(index_set_2of2(x)); int: min_flat = min(index_set_1of2(x))*dim+min(index_set_2of2(x))-1; } in array_var_bool_element_nonshifted((idx1*dim+idx2-min_flat)::domain, array1d(x), c); predicate array_var_float_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var float: x, var float: c) = let { int: dim = card(index_set_2of2(x)); int: min_flat = min(index_set_1of2(x))*dim+min(index_set_2of2(x))-1; } in array_var_float_element_nonshifted((idx1*dim+idx2-min_flat)::domain, array1d(x), c); predicate array_var_set_element2d_nonshifted(var int: idx1, var int: idx2, array[int,int] of var set of int: x, var set of int: c) = let { int: dim = card(index_set_2of2(x)); int: min_flat = min(index_set_1of2(x))*dim+min(index_set_2of2(x))-1; } in array_var_set_element_nonshifted((idx1*dim+idx2-min_flat)::domain, array1d(x), c); libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_float.mzn0000644000175000017500000000170513757304533022625 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_float(array[int] of var float: x, array[int] of var float: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_arg_min_int.mzn0000644000175000017500000000073013757304533022105 0ustar kaolkaolpredicate fzn_minimum_arg_int(array[int] of var int: x, var int: z) = % general case: min could be 0 or 1 let { int: l = min(index_set(x)) ; int: u = max(index_set(x)) ; int: n = u-l+1; array[int] of var int: xs = array1d(l..u,[ n*x[j]+j | j in l..u ]); var int: Mx = min(xs) ; } in forall (j in l..u) ( (z != j) = (Mx < xs[j]) ); %%% only the new decomposition from argmax paper CP2020 submission libminizinc-2.5.3/share/minizinc/std/fzn_regular_nfa_reif.mzn0000644000175000017500000000041313757304533023107 0ustar kaolkaolpredicate fzn_regular_nfa_reif(array[int] of var int: x, int: Q, int: S, array[int,int] of set of int: d, int: q0, set of int: F, var bool: b) = abort("Reified regular_nfa constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_sum_pred_reif.mzn0000644000175000017500000000044113757304533022441 0ustar kaolkaolpredicate fzn_sum_pred_reif(var int: i, array[int] of set of int: sets, array[int] of int: cs, var int: s, var bool: b) = let { array[index_set(sets)] of int: sums = [ sum(k in sets[j])(cs[k]) | j in index_set(sets) ]; } in b <-> sums[i] = s; libminizinc-2.5.3/share/minizinc/std/all_disjoint.mzn0000644000175000017500000000060713757304533021420 0ustar kaolkaolinclude "fzn_all_disjoint.mzn"; include "fzn_all_disjoint_reif.mzn"; /** @group globals.alldifferent Constrain the array of sets of integers \a S to be pairwise disjoint. */ predicate all_disjoint(array[$X] of var set of int: S) = fzn_all_disjoint(array1d(S)); predicate all_disjoint_reif(array[$X] of var set of int: S, var bool: b) = fzn_all_disjoint_reif(array1d(S), b); libminizinc-2.5.3/share/minizinc/std/fzn_nvalue.mzn0000644000175000017500000000036013757304533021110 0ustar kaolkaolpredicate fzn_nvalue(var int: n, array[int] of var int: x) = let { int: lx = lb_array(x), int: ux = ub_array(x), } in n == sum(j in lx..ux) ( bool2int(exists(i in index_set(x)) ( x[i] = j )) ); libminizinc-2.5.3/share/minizinc/std/fzn_diffn_k_reif.mzn0000644000175000017500000000156113757304533022227 0ustar kaolkaolpredicate fzn_diffn_k_reif(array[int,int] of var int: box_posn, array[int,int] of var int: box_size, var bool: b) = let { set of int: DIMS= index_set_2of2(box_posn) } in b <-> forall(b1, b2 in index_set_1of2(box_posn) where b1 < b2) (fzn_diffn_nonoverlap_k_for_reif([ box_posn[b1,j] | j in DIMS ], [ box_size[b1,j] | j in DIMS ], [ box_posn[b2,j] | j in DIMS ], [ box_size[b2,j] | j in DIMS ] ) ); predicate fzn_diffn_nonoverlap_k_for_reif(array[int] of var int: x1, array[int] of var int: w1, array[int] of var int: x2, array[int] of var int: w2) = exists(j in index_set(x1)) (x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j]); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_partiality.mzn0000644000175000017500000000071013757304533024503 0ustar kaolkaolpredicate fzn_if_then_else_partiality(array[int] of var bool: c, array[int] of var bool: def, var bool: b) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall(i in index_set(c)) ( (b /\ c[i] /\ d[i] -> def[i])) /\ forall (i in index_set(c)) (d[i] /\ c[i] /\ def[i] -> b); libminizinc-2.5.3/share/minizinc/std/sum_set.mzn0000644000175000017500000000057713757304533020432 0ustar kaolkaolinclude "fzn_sum_set.mzn"; include "fzn_sum_set_reif.mzn"; /** @group globals Requires that the sum of the weights \a ws[\p i1]..\a ws[\p iN] equals \a s, where \a vs[\p i1]..\a vs[\p iN] are the elements appearing in set \a x */ predicate sum_set(array[int] of int: vs, array[int] of int: ws, var set of int: x, var int: s) = fzn_sum_set(vs, ws, x, s); libminizinc-2.5.3/share/minizinc/std/fzn_all_equal_int.mzn0000644000175000017500000000051313757304533022427 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate fzn_all_equal_int(array[int] of var int: x) = forall(i, j in index_set(x) where i < j) ( x[i] = x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_int.mzn0000644000175000017500000000055413757304533023121 0ustar kaolkaolpredicate fzn_if_then_else_int(array[int] of var bool: c, array[int] of int: x, var int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/lex_greatereq.mzn0000644000175000017500000000243513757304533021575 0ustar kaolkaolinclude "lex_lesseq.mzn"; /** @group globals.lexicographic Requires that the array \a x is lexicographically greater than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greatereq(array[int] of var bool: x, array[int] of var bool: y) = lex_lesseq(y, x); /** @group globals.lexicographic Requires that the array \a x is lexicographically greater than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greatereq(array[int] of var int: x, array[int] of var int: y) = lex_lesseq(y, x); /** @group globals.lexicographic Requires that the array \a x is lexicographically greater than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greatereq(array[int] of var float: x, array[int] of var float: y) = lex_lesseq(y, x); /** @group globals.lexicographic Requires that the array \a x is lexicographically greater than or equal to array \a y. Compares them from first to last element, regardless of indices. */ predicate lex_greatereq(array[int] of var set of int: x, array[int] of var set of int: y) = lex_lesseq(y, x); libminizinc-2.5.3/share/minizinc/std/fzn_geost_bb_reif.mzn0000644000175000017500000000221313757304533022406 0ustar kaolkaolinclude "fzn_geost.mzn"; include "fzn_geost_reif.mzn"; predicate fzn_geost_bb_reif( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u , var bool: b ) = % Two useful definitions let { set of int: DIMS = 1..k; set of int: OBJECTS = index_set(kind); } in b <-> ( % Posting the geost constraint fzn_geost(k, rect_size, rect_offset, shape, x, kind) /\ % Posting the bounding box constraints forall(o in OBJECTS)( forall(s in dom(kind[o]))( (kind[o] = s -> forall(r in shape[s], j in DIMS)( x[o,j] + rect_offset[r,j] >= l[j] /\ x[o,j] + rect_offset[r,j] + rect_size[r,j] <= u[j] ) ) ) )); libminizinc-2.5.3/share/minizinc/std/fzn_count_geq_par_reif.mzn0000644000175000017500000000035513757304533023455 0ustar kaolkaolinclude "fzn_count_geq_reif.mzn"; predicate fzn_count_geq_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_geq_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_sliding_sum.mzn0000644000175000017500000000140113757304533022130 0ustar kaolkaolpredicate fzn_sliding_sum(int: low, int: up, int: seq, array[int] of var int: vs) = /* CS decomposition: see S. Brand, N. Narodytska, C-G. Quimper, P.J. Stuckey, and T. Walsh. Encodings of the sequence constraint. In C. Bessiere, editor, Proceedings of the 13th International Conference on Principles and Practice of Constraint Programming, volume 4741 of LNCS, pages 210–224. Springer-Verlag, 2007. */ let { int: lx = min(index_set(vs)); int: ux = max(index_set(vs)); array[lx-1..ux] of var int: S; } in S[lx-1] = 0 /\ forall (i in lx .. ux) ( S[i] = vs[i] + S[i-1] ) /\ forall (i in lx-1 .. ux - seq) ( S[i] <= S[i+seq] - low /\ S[i+seq] <= S[i] + up ); libminizinc-2.5.3/share/minizinc/std/fzn_dtree_int.mzn0000644000175000017500000000313413757304533021575 0ustar kaolkaolinclude "subgraph.mzn"; predicate fzn_dtree(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; array[NODE] of var 0..N-1: dist; /* distance from root */ array[NODE] of var 0..N: parent; /* parent */ } in ns[r] /\ % the root must be chosen dist[r] = 0 /\ % root is at distance 0 forall(n in NODE) % nonselected nodes have parent 0 (not ns[n] -> parent[n] <= 0) /\ forall(n in NODE) % nonselected nodes have distance 0 (not ns[n] -> dist[n] = 0) /\ forall(n in NODE) % each in node except root must have a parent (ns[n] -> (n = r \/ parent[n] > 0)) /\ forall(n in NODE) % each node with a parent then parent is in (parent[n] > 0 -> (ns[n] /\ ns[parent[n]])) /\ forall(n in NODE) % each node with a parent is one more than its parent (parent[n] > 0 -> dist[n] = dist[parent[n]] + 1) /\ forall(n in NODE) % each node with a parent must have that edge in (parent[n] > 0 -> exists(e in EDGE)(es[e] /\ from[e] = parent[n] /\ to[e] = n)) /\ forall(e in EDGE) % each edge must be part of the parent relation (es[e] -> parent[to[e]] = from[e]) /\ sum(e in EDGE)(es[e]) = sum(n in NODE)(ns[n]) - 1 /\ % redundant relationship of trees subgraph(N,E,from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/neural_net.mzn0000644000175000017500000000674313757304533021110 0ustar kaolkaolinclude "fzn_neural_net.mzn"; include "fzn_neural_net_reif.mzn"; enum NEURON_TYPE = { NT_RELU, NT_STEP, NT_LINEAR, NT_SOFTPLUS }; /** @group globals.learning constrain the output layer of a neural net to take the value defined by the input layer. the arguments are \a inputs: an array of float variables \a input_ids: array[int] of node \a outputs: an array of float variables \a output_ids: array[int] of node \a bias: array[node] of float \a edge_weight: array[edge] of float (dummy one at end!) \a edge_parent: array[edge] of neuron (start neuron for edge) \a first_edge: array[node] of 1..m+1 \a neuron_type: { NT_RELU, NT_STEP, NT_LINEAR, NT_SOFTPLUS } */ predicate neural_net(array[int] of var float: inputs, array[int] of int: input_ids, array[int] of var float: outputs, array[int] of int: output_ids, array[int] of float: bias, array[int] of float: edge_weight, array[int] of int: edge_parent, array[int] of int: first_edge, NEURON_TYPE: neuron_type) = assert(index_set(inputs) == index_set(input_ids), "neural_net: number of input vars not equal to number of input_ids") /\ assert(index_set(outputs) == index_set(output_ids), "neural_net: number of output vars not equal to number of output_ids") /\ let { set of int: node = index_set(bias) } in let { set of int: edge = index_set(edge_weight) } in assert(index_set(edge_parent) == edge, "neural_net: index sets of edge_weight and edge_parent do not agree") /\ assert(index_set(first_edge) == node, "neural_new: index sets of bias and first_edge do not agree") /\ forall(i in index_set(input_ids)) (assert(input_ids[i] in node, "neural_net: input_ids\(i) = \(input_ids[i]) not a correct node number")) /\ forall(i in index_set(output_ids)) (assert(output_ids[i] in node, "neural_net: output_ids\(i) = \(output_ids[i]) not a correct node number")) /\ forall(i in index_set(first_edge)) (assert(first_edge[i] in edge, "neural_net: first_edge\(i) = \(first_edge[i]) not a correct edge number")) /\ forall(i in index_set(edge_parent)) (assert(edge_parent[i] in edge, "neural_net: edge_parent\(i) = \(edge_parent[i]) not a correct node number")) /\ assert(mincreasing(first_edge), "neural_net: first_edge array is not in increasing order") /\ fzn_neural_net(inputs,input_ids,outputs,output_ids,bias, edge_weight,edge_parent,first_edge,neuron_type); test mincreasing(array[int] of int: x) = forall(i in index_set(x) diff { max(index_set(x)) }) (x[i] <= x[i+1]); predicate neural_net(array[int] of var float: inputs, array[int] of int: input_ids, array[int] of var float: outputs, array[int] of int: output_ids, array[int] of float: bias, array[int] of float: edge_weight, array[int] of int: edge_parent, array[int] of int: first_edge) = neural_net(inputs,input_ids,outputs,output_ids,bias, edge_weight,edge_parent,first_edge,NT_RELU); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_reachable_int_reif.mzn0000644000175000017500000000116313757304533023405 0ustar kaolkaolpredicate fzn_reachable_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = let { array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des = es ++ es; } in /* duplicate the edges so that the we can use directed graph reachability */ b <-> dreachable(N,2*E,dfrom,dto,r,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_subgraph_int_reif.mzn0000644000175000017500000000061013757304533023306 0ustar kaolkaolpredicate fzn_subgraph_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of var bool: ns, array[int] of var bool: es, var bool: b) = b <-> forall(e in 1..E) ( (es[e] -> ns[from[e]]) /\ (es[e] -> ns[to[e]]) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/stdlib.mzn0000644000175000017500000000314413757304533020225 0ustar kaolkaol%-----------------------------------------------------------------------------% % MiniZinc standard library. %-----------------------------------------------------------------------------% % This file contains declarations of all functions, predicates and annotations % available in the base MiniZinc language. /*** @groupdef MAIN The MiniZinc library */ %-----------------------------------------------------------------------------% % % FlatZinc builtins % % This section contains declarations for the standard FlatZinc builtins. They % can be redefined by providing a custom redefinitions.mzn in the solver % globals library. A standard redefinition is provided for FlatZinc builtins % after version 2.0. This redefinition can be overriden by providing a custom % redefinitions-.mzn include "flatzinc_builtins.mzn"; /*** @groupdef stdlib Standard Library These functions and predicates define built-in operations of the MiniZinc language. */ include "stdlib/stdlib_language.mzn"; include "stdlib/stdlib_ann.mzn"; include "stdlib/stdlib_opt.mzn"; include "stdlib/stdlib_compare.mzn"; include "stdlib/stdlib_math.mzn"; include "stdlib/stdlib_logic.mzn"; include "stdlib/stdlib_set.mzn"; include "stdlib/stdlib_ite.mzn"; include "stdlib/stdlib_array.mzn"; include "stdlib/stdlib_sort.mzn"; include "stdlib/stdlib_coercion.mzn"; include "stdlib/stdlib_string.mzn"; include "stdlib/stdlib_reflect.mzn"; include "stdlib/stdlib_debug.mzn"; include "stdlib/stdlib_enum.mzn"; include "stdlib/stdlib_random.mzn"; % Undocumented internal implementation used during compilation include "stdlib/stdlib_internal.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_strict_opt.mzn0000644000175000017500000000056313757304533024424 0ustar kaolkaolpredicate fzn_disjunctive_strict_opt(array[int] of var opt int: s, array[int] of var int: d) = forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i (b[i+1] == true)) /\ ((not xis) -> (b[i] == b[i+1])) /\ ((not b[i]) -> (x[i] != t)) ) /\ b[imin] == false ); libminizinc-2.5.3/share/minizinc/std/fzn_tree_enum.mzn0000644000175000017500000000131413757304533021601 0ustar kaolkaolpredicate fzn_tree(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = let { int: E = length(es); array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des; } in /* ensure that the directed edges selected agree with undirected edges */ forall(e in 1..E)(es[e-1+min(index_set(es))] <-> (des[e] \/ des[e+E])) /\ /* duplicate the edges so that the we can use directed graph reachability */ fzn_dtree(dfrom,dto,r,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/globals.mzn0000644000175000017500000000777413757304533020404 0ustar kaolkaol/*** @groupdef globals Global constraints These constraints represent high-level modelling abstractions, for which many solvers implement special, efficient inference algorithms. */ /*** @groupdef globals.alldifferent All-Different and related constraints @groupdef globals.lexicographic Lexicographic constraints @groupdef globals.sort Sorting constraints @groupdef globals.channeling Channeling constraints @groupdef globals.counting Counting constraints These constraints count and restrict how many times certain values occur in an array of variables. MiniZinc will automatically generate the basic counting constraints below from expressions such as \[count(i in x)(i=c) <= d\], so you can write models in this much more readable style instead of using these predicates. However, if your model contains multiple counting constraints over the same array, constraints like \[distribute\] or \[global_cardinality\] below may be useful. @groupdef globals.packing Packing constraints @groupdef globals.scheduling Scheduling constraints @groupdef globals.graph Graph constraints @groupdef globals.extensional Extensional constraints (table, regular etc.) @groupdef globals.learning Machine learning constraints @groupdef globals.deprecated Deprecated constraints */ include "all_different.mzn"; include "alldifferent_except_0.mzn"; include "all_disjoint.mzn"; include "all_equal.mzn"; include "alternative.mzn"; include "among.mzn"; include "among_fn.mzn"; include "arg_sort.mzn"; include "arg_min.mzn"; include "arg_max.mzn"; include "at_least.mzn"; include "at_most.mzn"; include "at_most1.mzn"; include "bin_packing.mzn"; include "bin_packing_capa.mzn"; include "bin_packing_load.mzn"; include "bin_packing_load_fn.mzn"; include "bounded_path.mzn"; include "circuit.mzn"; include "connected.mzn"; include "cost_mdd.mzn"; include "cost_regular.mzn"; include "count.mzn"; include "count_fn.mzn"; include "cumulative.mzn"; include "cumulative_opt.mzn"; include "dag.mzn"; include "decreasing.mzn"; include "diffn.mzn"; include "diffn_nonstrict.mzn"; include "diffn_k.mzn"; include "diffn_nonstrict_k.mzn"; include "disjoint.mzn"; include "disjunctive.mzn"; include "disjunctive_strict.mzn"; include "disjunctive_opt.mzn"; include "disjunctive_strict_opt.mzn"; include "distribute.mzn"; include "distribute_fn.mzn"; include "element.mzn"; include "exactly.mzn"; include "geost.mzn"; include "global_cardinality.mzn"; include "global_cardinality_fn.mzn"; include "global_cardinality_closed.mzn"; include "global_cardinality_closed_fn.mzn"; include "global_cardinality_low_up.mzn"; include "global_cardinality_low_up_closed.mzn"; include "increasing.mzn"; include "int_set_channel.mzn"; include "inverse.mzn"; include "inverse_fn.mzn"; include "inverse_in_range.mzn"; include "inverse_set.mzn"; include "knapsack.mzn"; include "lex_greater.mzn"; include "lex_greatereq.mzn"; include "lex_lesseq.mzn"; include "lex_less.mzn"; include "lex2.mzn"; include "link_set_to_booleans.mzn"; include "maximum.mzn"; include "mdd.mzn"; include "mdd_nondet.mzn"; include "member.mzn"; include "minimum.mzn"; include "network_flow.mzn"; include "neural_net.mzn"; include "nvalue.mzn"; include "nvalue_fn.mzn"; include "partition_set.mzn"; include "piecewise_linear.mzn"; include "range.mzn"; include "range_fn.mzn"; include "reachable.mzn"; include "regular.mzn"; include "regular_nfa.mzn"; include "regular_set.mzn"; include "regular_regexp.mzn"; include "roots.mzn"; include "roots_fn.mzn"; include "seq_precede_chain.mzn"; include "sliding_sum.mzn"; include "sort.mzn"; include "sort_fn.mzn"; include "span.mzn"; include "steiner.mzn"; include "strictly_decreasing.mzn"; include "strictly_increasing.mzn"; include "strict_lex2.mzn"; include "subcircuit.mzn"; include "subgraph.mzn"; include "sum_pred.mzn"; include "sum_set.mzn"; include "symmetric_all_different.mzn"; include "table.mzn"; include "tree.mzn"; include "value_precede.mzn"; include "value_precede_chain.mzn"; include "weighted_spanning_tree.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_range.mzn0000644000175000017500000000065313757304533020717 0ustar kaolkaolpredicate fzn_range(array[int] of var int: x, var set of int: s, var set of int: t) = % All values in 's' must map to a value in 't'. forall(i in ub(s)) ( i in s -> x[i] in t ) /\ % All values in 't' must be mapped from a value in 's'. forall(i in ub(t)) ( i in t -> exists(j in ub(s)) ( j in s /\ x[j] == i ) ); libminizinc-2.5.3/share/minizinc/std/fzn_lex2_reif.mzn0000644000175000017500000000126713757304533021504 0ustar kaolkaolinclude "lex_lesseq.mzn"; predicate fzn_lex2_reif(array[int, int] of var int: x, var bool: b) = let { int: lbx1 = min(index_set_1of2(x)), int: ubx1 = max(index_set_1of2(x)), int: lbx2 = min(index_set_2of2(x)), int: ubx2 = max(index_set_2of2(x)) } in b <-> ( forall(i in lbx1 + 1 .. ubx1) ( lex_lesseq([x[i - 1, j] | j in index_set_2of2(x)], [x[i, j] | j in index_set_2of2(x)] ) ) /\ forall(j in lbx2 + 1 .. ubx2) ( lex_lesseq([x[i, j - 1] | i in index_set_1of2(x)], [x[i, j ] | i in index_set_1of2(x)] ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_reachable_enum_reif.mzn0000644000175000017500000000142213757304533023555 0ustar kaolkaolpredicate fzn_reachable_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = let { int: E = length(es); set of int: NODE = min(index_set(ns))..max(index_set(ns)); array[1..2*E] of NODE: dfrom = from ++ to; array[1..2*E] of NODE: dto = to ++ from; array[1..2*E] of var bool: des = es ++ es; array[NODE] of var bool: dns = array1d(NODE,ns); var NODE: dr = r; } in /* duplicate the edges so that we can use directed graph reachability */ b <-> fzn_dreachable(dfrom,dto,dr,dns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_exactly_set_reif.mzn0000644000175000017500000000060513757304533023151 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_exactly_set_reif(int: n, array[int] of var set of int: x, set of int: v, var bool: b) = b <-> n == sum(i in index_set(x)) ( bool2int(x[i] == v) ); libminizinc-2.5.3/share/minizinc/std/fzn_distribute_reif.mzn0000644000175000017500000000063513757304533023006 0ustar kaolkaolpredicate fzn_distribute_reif(array[int] of var int: card, array[int] of var int: value, array[int] of var int: base, var bool: b) = b <-> forall (i in index_set(card)) ( card[i] == sum(j in index_set(base)) ( bool2int(value[i] = base[j]) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_count_leq.mzn0000644000175000017500000000055113757304533021611 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_leq(array[int] of var int: x, var int: y, var int: c) = let { var int: z = count(x,y) } in z >= c; % This needs to be written with a let rather than count(x,y) >= c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_lt.mzn0000644000175000017500000000054613757304533021453 0ustar kaolkaolinclude "count_fn.mzn"; predicate fzn_count_lt(array[int] of var int: x, var int: y, var int: c) = let { var int: z = count(x,y) } in z > c; % This needs to be written with a let rather than count(x,y) > c % so that the automatic rewriting of the latter doesn't kick in %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/member_float.mzn0000644000175000017500000000057213757304533021402 0ustar kaolkaolinclude "fzn_member_float.mzn"; include "fzn_member_float_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate member_float(array[int] of var float: x, var float: y) = fzn_member_float(x, y); libminizinc-2.5.3/share/minizinc/std/fzn_mdd_nondet.mzn0000644000175000017500000000315013757304533021731 0ustar kaolkaolpredicate fzn_mdd_nondet(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % value of variable array[int] of int: to % edge entering node 0..N where 0 = T node ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of var bool: bn; array[EDGE] of var bool: be; set of int: D = dom_array(x); } in bn[0] /\ % true node is true bn[1] /\ % root must hold % T1 each node except the root enforces an outgoing edge forall(n in NODE)(bn[n] -> exists(e in EDGE where from[e] = n)(be[e])) /\ % T23 each edge enforces its endpoints forall(e in EDGE)((be[e] -> bn[from[e]]) /\ (be[e] -> bn[to[e]])) /\ % T4 each edge enforces its label forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ % P2 each node except the root enforces an incoming edge exists(e in EDGE where to[e] = 0)(be[e]) /\ forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ % P3 each label has a support forall(i in 1..L, d in D) (x[i] = d -> exists(e in EDGE where level[from[e]] = i /\ d in label[e])(be[e])); libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_int.mzn0000644000175000017500000000204713757304533022640 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_int(array[int] of var int: x, array[int] of var int: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/count_gt.mzn0000644000175000017500000000162613757304533020571 0ustar kaolkaolinclude "fzn_count_gt_par.mzn"; include "fzn_count_gt.mzn"; include "fzn_count_gt_par_reif.mzn"; include "fzn_count_gt_reif.mzn"; /** @group globals.counting Constrains \a c to be strictly greater than the number of occurrences of \a y in \a x. */ predicate count_gt(array[$X] of var int: x, var int: y, var int: c) = fzn_count_gt(array1d(x),y,c); /** @group globals.counting Constrains \a c to be strictly greater than the number of occurrences of \a y in \a x. */ predicate count_gt(array[$X] of var int: x, int: y, int: c) = fzn_count_gt_par(array1d(x),y,c); predicate count_gt_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_gt_reif(array1d(x),y,c,b); predicate count_gt_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_gt_par_reif(array1d(x),y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_bin_packing_reif.mzn0000644000175000017500000000070413757304533023071 0ustar kaolkaolpredicate fzn_bin_packing_reif(int: c, array[int] of var int: bin, array[int] of int: w, var bool: b) = b <-> forall( assigned_bin in lb_array(bin)..ub_array(bin) ) ( c >= sum ( i in index_set(bin) ) ( w[i] * bool2int( bin[i] == assigned_bin ) ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_less_bool.mzn0000644000175000017500000000170113757304533022447 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is strictly lexicographically less than array 'y'. % Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_less_bool(array[int] of var bool: x, array[int] of var bool: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx < uy - ly); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_float_reif.mzn0000644000175000017500000000062013757304533024113 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_float_reif(array[int] of var float: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_connected_reif.mzn0000644000175000017500000000046213757304533022570 0ustar kaolkaolpredicate fzn_connected_reif(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified connected is not supported."); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_dsteiner.mzn0000644000175000017500000000060613757304533021436 0ustar kaolkaolinclude "tree.mzn"; predicate fzn_dsteiner(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = dtree(N,E,from,to,r,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/sort.mzn0000644000175000017500000000063013757304533017730 0ustar kaolkaolinclude "fzn_sort.mzn"; include "fzn_sort_reif.mzn"; /** @group globals.sort Requires that the multiset of values in \a x are the same as the multiset of values in \a y but \a y is in sorted order. */ predicate sort(array[int] of var int: x, array[int] of var int: y) = assert(card(index_set(x)) == card(index_set(y)), "sort: x and y must be same sized arrays", fzn_sort(x,y) ); libminizinc-2.5.3/share/minizinc/std/decreasing.mzn0000644000175000017500000000156013757304533021050 0ustar kaolkaolinclude "decreasing_bool.mzn"; include "decreasing_float.mzn"; include "decreasing_int.mzn"; include "decreasing_set.mzn"; /** @group globals.sort Requires that the array \a x is in decreasing order (duplicates are allowed). */ predicate decreasing(array[$X] of var bool: x) = decreasing_bool(array1d(x)); /** @group globals.sort Requires that the array \a x is in decreasing order (duplicates are allowed). */ predicate decreasing(array[$X] of var float: x) = decreasing_float(array1d(x)); /** @group globals.sort Requires that the array \a x is in decreasing order (duplicates are allowed). */ predicate decreasing(array[$X] of var int: x) = decreasing_int(array1d(x)); /** @group globals.sort Requires that the array \a x is in decreasing order (duplicates are allowed). */ predicate decreasing(array[$X] of var set of int: x) = decreasing_set(array1d(x)); libminizinc-2.5.3/share/minizinc/std/fzn_strictly_increasing_int_reif.mzn0000644000175000017500000000060113757304533025552 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_increasing_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] < x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_regular_reif.mzn0000644000175000017500000000036413757304533022270 0ustar kaolkaolpredicate fzn_regular_reif(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F, var bool: b) = abort("Reified regular constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_path_enum.mzn0000644000175000017500000000046613757304533023305 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_path(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K) = path(from,to,s,t,ns,es) /\ K = sum(e in index_set(es))(es[e]*w[e]); libminizinc-2.5.3/share/minizinc/std/fzn_count_gt_par.mzn0000644000175000017500000000031413757304533022301 0ustar kaolkaolinclude "fzn_count_gt.mzn"; predicate fzn_count_gt_par(array[int] of var int: x, int: y, int: c) = fzn_count_gt(x,y,c); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_decreasing_int.mzn0000644000175000017500000000056513757304533022603 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in decreasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_decreasing_int(array[int] of var int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] >= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_member_float_reif.mzn0000644000175000017500000000054113757304533023260 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate fzn_member_float_reif(array[int] of var float: x, var float: y, var bool: b) = b <-> exists(i in index_set(x)) ( x[i] == y ); libminizinc-2.5.3/share/minizinc/std/fzn_diffn_nonstrict_k.mzn0000644000175000017500000000171613757304533023327 0ustar kaolkaolpredicate fzn_diffn_nonstrict_k(array[int,int] of var int: box_posn, array[int,int] of var int: box_size) = let { set of int: DIMS= index_set_2of2(box_posn) } in forall(b1, b2 in index_set_1of2(box_posn) where b1 < b2) (fzn_diffn_nonstrict_nonoverlap_k([ box_posn[b1,j] | j in DIMS ], [ box_size[b1,j] | j in DIMS ], [ box_posn[b2,j] | j in DIMS ], [ box_size[b2,j] | j in DIMS ] ) ) ; predicate fzn_diffn_nonstrict_nonoverlap_k(array[int] of var int: x1, array[int] of var int: w1, array[int] of var int: x2, array[int] of var int: w2) = exists(j in index_set(x1)) (w1[j] = 0 \/ w2[j] = 0 \/ x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j]); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_path_int.mzn0000644000175000017500000000047413757304533023132 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_path(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = path(N,E,from,to,s,t,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]); libminizinc-2.5.3/share/minizinc/std/set_member.mzn0000644000175000017500000000054713757304533021072 0ustar kaolkaolinclude "fzn_set_member.mzn"; include "fzn_set_member_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate set_member(var set of int: x, var int: y) = fzn_set_member(x, y); libminizinc-2.5.3/share/minizinc/std/among.mzn0000644000175000017500000000064713757304533020052 0ustar kaolkaolinclude "among_fn.mzn"; include "fzn_among.mzn"; include "fzn_among_reif.mzn"; /** @group globals.counting Requires exactly \a n variables in \a x to take one of the values in \a v. */ predicate among(var int: n, array[$X] of var int: x, set of int: v) = fzn_among(n, array1d(x), v); predicate among_reif(var int: n, array[$X] of var int: x, set of int: v, var bool: b) = fzn_among_reif(n, array1d(x), v, b); libminizinc-2.5.3/share/minizinc/std/fzn_neural_net.mzn0000644000175000017500000000530613757304533021757 0ustar kaolkaolpredicate fzn_neural_net(array[int] of var float: inputs, array[int] of int: input_ids, array[int] of var float: outputs, array[int] of int: output_ids, array[int] of float: bias, array[int] of float: edge_weight, array[int] of int: edge_parent, array[int] of int: first_edge, NEURON_TYPE: neuron_type) = let { set of int: NODE = index_set(bias) } in let { set of int: INPUTS = array2set(input_ids) } in let { set of int: EDGE = index_set(edge_weight) } in let { array[NODE] of var float: neuron } in forall(i in index_set(inputs))(neuron[input_ids[i]] = inputs[i]) /\ forall(i in index_set(outputs))(neuron[output_ids[i]] = outputs[i]) /\ forall(i in NODE diff INPUTS) ( let { int: first = first_edge[i]; int: last = if i = max(NODE) then max(index_set(first_edge)) else first_edge[i+1] - 1 endif; array[int] of var float: ins = [neuron[edge_parent[j]] | j in first..last]; array[int] of float: ws = [ edge_weight[j] | j in first..last ]; float: b = bias[i]; } in neuron[i] = if neuron_type = NT_RELU then neuron_relu(ins,ws,b) elseif neuron_type = NT_STEP then neuron_step(ins,ws,b) elseif neuron_type = NT_LINEAR then neuron_linear(ins,ws,b) elseif neuron_type = NT_SOFTPLUS then neuron_softplus(ins,ws,b) else 0.0 endif ); %-----------------------------------------------------------------------------% function var float: neuron_relu(array[int] of var float: inputs, array[int] of float: weights, float: bias) = max(0.0, sum(i in index_set(inputs))(weights[i]*inputs[i]) + bias); function var float: neuron_step(array[int] of var float: inputs, array[int] of float: weights, float: bias) = (sum(i in index_set(inputs))(weights[i]*inputs[i]) + bias >= 0.0); function var float: neuron_linear(array[int] of var float: inputs, array[int] of float: weights, float: bias) = (sum(i in index_set(inputs))(weights[i]*inputs[i]) + bias); function var float: neuron_softplus(array[int] of var float: inputs, array[int] of float: weights, float: bias) = (ln(1 + exp(sum(i in index_set(inputs))(weights[i]*inputs[i]) + bias))); libminizinc-2.5.3/share/minizinc/std/increasing.mzn0000644000175000017500000000156113757304533021067 0ustar kaolkaolinclude "increasing_bool.mzn"; include "increasing_float.mzn"; include "increasing_int.mzn"; include "increasing_set.mzn"; /** @group globals.sort Requires that the array \a x is in increasing order (duplicates are allowed). */ predicate increasing(array[$X] of var bool: x) = increasing_bool(array1d(x)); /** @group globals.sort Requires that the array \a x is in increasing order (duplicates are allowed). */ predicate increasing(array[$X] of var float: x) = increasing_float(array1d(x)); /** @group globals.sort Requires that the array \a x is in increasing order (duplicates are allowed). */ predicate increasing(array[$X] of var int: x) = increasing_int(array1d(x)); /** @group globals.sort Requires that the array \a x is in increasing order (duplicates are allowed). */ predicate increasing(array[$X] of var set of int: x) = increasing_set(array1d(x)); libminizinc-2.5.3/share/minizinc/std/weighted_spanning_tree.mzn0000644000175000017500000000441213757304533023457 0ustar kaolkaolinclude "fzn_wst.mzn"; include "fzn_wst_reif.mzn"; include "fzn_dwst.mzn"; include "fzn_dwst_reif.mzn"; /** @group globals.graph Constrains the set of edges \a es of a given directed graph to be a weighted spanning tree rooted at \a r of weight \a W. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param r: the root node (which may be variable) @param es: a Boolean for each edge whether it is in the subgraph @param K: the weight of the tree */ predicate d_weighted_spanning_tree(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"dwst: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"dwst: index set of to must be 1..\(E)") /\ assert(index_set(es) = 1..E,"dwst: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"dwst: index set of w must be 1..\(E)") /\ fzn_dwst(N,E,from,to,w,r,es,K); /** @group globals.graph Constrains the set of edges \a es of a given undirected graph to be a weighted spanning tree of weight \a W. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param es: a Boolean for each edge whether it is in the subgraph @param K: the weight of the tree **/ predicate weighted_spanning_tree(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"wst: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"wst: index set of to must be 1..\(E)") /\ assert(index_set(es) = 1..E,"wst: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"dwst: index set of w must be 1..\(E)") /\ fzn_wst(N,E,from,to,w,es,K); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_all_different_set_reif.mzn0000644000175000017500000000056513757304533024303 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate fzn_all_different_set_reif(array[int] of var set of int: x, var bool: b) = b <-> forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); libminizinc-2.5.3/share/minizinc/std/sum_pred.mzn0000644000175000017500000000073613757304533020566 0ustar kaolkaolinclude "fzn_sum_pred.mzn"; include "fzn_sum_pred_reif.mzn"; /** @group globals Requires that the sum of \a cs[\p i1]..\a cs[\p iN] equals \a s, where \p i1..\p iN are the elements of the \a i th set in \a sets. Nb: not called 'sum' as in the constraints catalog because 'sum' is a MiniZinc built-in function. */ predicate sum_pred(var int: i, array[int] of set of int: sets, array[int] of int: cs, var int: s) = fzn_sum_pred(i, sets, cs, s); libminizinc-2.5.3/share/minizinc/std/solver_redefinitions.mzn0000644000175000017500000000266113757304533023203 0ustar kaolkaol%-----------------------------------------------------------------------------% % Solver redefinitions %-----------------------------------------------------------------------------% % This file contains all files that can be used by solver libraries to provide % or override redefinitions of FlatZinc builtins. include "redefinitions.mzn"; include "redefinitions-2.0.mzn"; include "redefinitions-2.0.2.mzn"; include "redefinitions-2.1.mzn"; include "redefinitions-2.1.1.mzn"; include "redefinitions-2.2.1.mzn"; include "redefinitions-2.3.3.mzn"; include "redefinitions-2.5.2.mzn"; % Inclusion of count constraints for internal redefinitions of hidden counting constraints include "count_eq.mzn"; include "count_geq.mzn"; include "count_leq.mzn"; include "count_neq.mzn"; include "count_gt.mzn"; include "count_lt.mzn"; include "count_fn.mzn"; include "fzn_if_then_else_int.mzn"; include "fzn_if_then_else_opt_int.mzn"; include "fzn_if_then_else_var_int.mzn"; include "fzn_if_then_else_var_opt_int.mzn"; include "fzn_if_then_else_bool.mzn"; include "fzn_if_then_else_opt_bool.mzn"; include "fzn_if_then_else_var_bool.mzn"; include "fzn_if_then_else_var_opt_bool.mzn"; include "fzn_if_then_else_float.mzn"; include "fzn_if_then_else_opt_float.mzn"; include "fzn_if_then_else_var_float.mzn"; include "fzn_if_then_else_var_opt_float.mzn"; include "fzn_if_then_else_set.mzn"; include "fzn_if_then_else_var_set.mzn"; include "fzn_if_then_else_partiality.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_network_flow_reif.mzn0000644000175000017500000000106413757304533023345 0ustar kaolkaolpredicate fzn_network_flow_reif(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of var int: flow, var bool: b) = let { int: source_node = 1; int: sink_node = 2; set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in b <-> forall (i in NODES) ( sum (j in ARCS where i == arc[j,source_node]) (flow[j]) - sum (j in ARCS where i == arc[j,sink_node]) (flow[j]) = balance[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_seq_precede_chain_int_reif.mzn0000644000175000017500000000022413757304533025115 0ustar kaolkaolpredicate fzn_seq_precede_chain_int_reif(array[int] of var int: X, var bool: b) = abort("Reified seq_precede_chain constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/minimum.mzn0000644000175000017500000000061313757304533020415 0ustar kaolkaol/** @group globals Constrains \a m to be the minimum of the values in \a x. Assumptions: |\a x| > 0. */ predicate minimum(var float: m, array[int] of var float: x) = array_float_minimum(m, x); /** @group globals Constrains \a m to be the minimum of the values in \a x. Assumptions: |\a x| > 0. */ predicate minimum(var int: m, array[int] of var int: x) = array_int_minimum(m, x); libminizinc-2.5.3/share/minizinc/std/arg_sort_int.mzn0000644000175000017500000000115013757304533021431 0ustar kaolkaolinclude "fzn_arg_sort_int.mzn"; include "fzn_arg_sort_int_reif.mzn"; predicate arg_sort_int(array[int] of var int:x, array[int] of var int:p) = assert(index_set(p) = 1..length(x), "arg_sort_int: second argument must have index 1..length(first argument)", fzn_arg_sort_int(x, p) ); predicate arg_sort_int(array[int] of var int:x, array[int] of var int:p, var bool:b) = assert(index_set(p) = 1..length(x), "arg_sort_int: second argument must have index 1..length(first argument)", fzn_arg_sort_int_reif(x, p, b) ); libminizinc-2.5.3/share/minizinc/std/count.mzn0000644000175000017500000000033613757304533020074 0ustar kaolkaolinclude "count_eq.mzn"; /** @group globals.counting Constrains \a c to be the number of occurrences of \a y in \a x. */ predicate count(array[$X] of var int: x, var int: y, var int: c) = count_eq(array1d(x), y, c); libminizinc-2.5.3/share/minizinc/std/sort_fn.mzn0000644000175000017500000000053113757304533020413 0ustar kaolkaolinclude "sort.mzn"; /** @group globals.sort Return a multiset of values that is the same as the multiset of values in \a x but in sorted order. */ function array[int] of var int: sort(array[int] of var int: x) ::promise_total = let { array[1..length(x)] of var lb_array(x)..ub_array(x): y; constraint sort(x,y); } in y; libminizinc-2.5.3/share/minizinc/std/fzn_subcircuit_reif.mzn0000644000175000017500000000035313757304533023001 0ustar kaolkaolinclude "alldifferent.mzn"; predicate fzn_subcircuit_reif(array[int] of var int: x, var bool: b) = abort("Reified subcircuit/1 is not supported."); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_strict_lex2_reif.mzn0000644000175000017500000000126513757304533023072 0ustar kaolkaolinclude "lex_less.mzn"; predicate fzn_strict_lex2_reif(array[int, int] of var int: x, var bool: b) = let { int: lbx1 = min(index_set_1of2(x)), int: ubx1 = max(index_set_1of2(x)), int: lbx2 = min(index_set_2of2(x)), int: ubx2 = max(index_set_2of2(x)) } in b <-> ( forall(i in lbx1 + 1 .. ubx1) ( lex_less([x[i - 1, j] | j in index_set_2of2(x)], [x[i, j] | j in index_set_2of2(x)] ) ) /\ forall(j in lbx2 + 1 .. ubx2) ( lex_less([x[i, j - 1] | i in index_set_1of2(x)], [x[i, j ] | i in index_set_1of2(x)] ) ) ); libminizinc-2.5.3/share/minizinc/std/all_different_set.mzn0000644000175000017500000000077413757304533022423 0ustar kaolkaolinclude "fzn_all_different_set.mzn"; include "fzn_all_different_set_reif.mzn"; %-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate all_different_set(array[int] of var set of int: x) = fzn_all_different_set(x); predicate all_different_set(array[int] of var set of int: x, var bool: b) = fzn_all_different_set_reif(x, b); libminizinc-2.5.3/share/minizinc/std/fzn_dreachable_enum_reif.mzn0000644000175000017500000000055413757304533023726 0ustar kaolkaolpredicate fzn_dreachable_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dreachable constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_dconnected.mzn0000644000175000017500000000052713757304533021731 0ustar kaolkaolinclude "reachable.mzn"; predicate fzn_dconnected(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = let { var index_set(ns): r } in dreachable(from, to, r, ns, es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/dag.mzn0000644000175000017500000000171713757304533017503 0ustar kaolkaolinclude "fzn_dag.mzn"; include "fzn_dag_reif.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a DAG. @param from: the leaving node for each edge @param to: the entering node for each edge @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dag(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dreachable: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dreachable: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in to must be in index set of ns") /\ fzn_dag(from,to,ns,es); libminizinc-2.5.3/share/minizinc/std/arg_max_float.mzn0000644000175000017500000000037413757304533021551 0ustar kaolkaolinclude "fzn_arg_max_float.mzn"; predicate maximum_arg_float(array[int] of var float: x, var int: i) = fzn_maximum_arg_float(x, i); predicate maximum_arg_float_reif(array[int] of var float: x, var int: i, var bool: b) = b <-> i=arg_max(x); libminizinc-2.5.3/share/minizinc/std/fzn_steiner_reif.mzn0000644000175000017500000000060613757304533022277 0ustar kaolkaolpredicate fzn_steiner_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: ns, array[int] of var bool: es, var int: K, var bool: b) = abort("Reified steiner constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/arg_min_float.mzn0000644000175000017500000000037313757304533021546 0ustar kaolkaolinclude "fzn_arg_min_float.mzn"; predicate minimum_arg_float(array[int] of var float: x, var int: i) = fzn_minimum_arg_float(x, i); predicate minimum_arg_float_reif(array[int] of var float: x, var int: i, var bool: b) = b <-> i=arg_min(x); libminizinc-2.5.3/share/minizinc/std/increasing_float.mzn0000644000175000017500000000062513757304533022254 0ustar kaolkaolinclude "fzn_increasing_float.mzn"; include "fzn_increasing_float_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate increasing_float(array[int] of var float: x) = fzn_increasing_float(x); libminizinc-2.5.3/share/minizinc/std/fzn_exactly_set.mzn0000644000175000017500000000055513757304533022150 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_exactly_set(int: n, array[int] of var set of int: x, set of int: v) = n == sum(i in index_set(x)) ( bool2int(x[i] == v) ); libminizinc-2.5.3/share/minizinc/std/fzn_cumulative.mzn0000644000175000017500000000355013757304533022000 0ustar kaolkaolpredicate fzn_cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in if 0==card(Tasks) then /*true*/ 0==card(index_set(s)) \/ b>=0 else let { int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( if late - early > 5000 then fzn_cumulative_task(s, d, r, b) else fzn_cumulative_time(s, d, r, b) endif ) endif ; predicate fzn_cumulative_time(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 }, int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( forall( t in early..late ) ( b >= sum( i in Tasks ) ( bool2int(s[i] <= t /\ t < s[i] + d[i]) * r[i] ) ) ); predicate fzn_cumulative_task(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in ( forall( j in Tasks ) ( b >= r[j] + sum( i in Tasks where i != j ) ( bool2int(s[i] <= s[j] /\ s[j] < s[i] + d[i] ) * r[i] ) ) ); libminizinc-2.5.3/share/minizinc/std/all_equal_int.mzn0000644000175000017500000000105013757304533021547 0ustar kaolkaolinclude "fzn_all_equal_int.mzn"; include "fzn_all_equal_int_reif.mzn"; %-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate all_equal_int(array[int] of var int: x) = if length(x) <= 1 then true else fzn_all_equal_int(x) endif; predicate all_equal_int_reif(array[int] of var int: x, var bool: b) = if length(x) <= 1 then b=true else fzn_all_equal_int_reif(x,b) endif; libminizinc-2.5.3/share/minizinc/std/steiner.mzn0000644000175000017500000000572113757304533020420 0ustar kaolkaolinclude "fzn_steiner.mzn"; include "fzn_steiner_reif.mzn"; include "fzn_dsteiner.mzn"; include "fzn_dsteiner_reif.mzn"; include "weighted_spanning_tree.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a weighted spanning tree rooted at \a r of weight \a W. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the weight of the tree */ predicate dsteiner(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: r, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"dsteiner: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"dsteiner: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"dsteiner: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"dsteiner: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"dsteiner: index set of w must be 1..\(E)") /\ if forall(n in 1..N)(is_fixed(ns[n]) /\ fix(ns[n])) then d_weighted_spanning_tree(N,E,from,to,w,r,es,K) else fzn_dsteiner(N,E,from,to,w,r,ns,es,K) endif; /** @group globals.graph Constrains the set of edges \a es of a given undirected graph to be a weighted spanning tree of weight \a W. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param w: the weight of each edge @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph @param K: the weight of the tree **/ predicate steiner(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, array[int] of var bool: ns, array[int] of var bool: es, var int: K) = assert(index_set(from) = 1..E,"steiner: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"steiner: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"steiner: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"steiner: index set of es must be 1..\(E)") /\ assert(index_set(w) = 1..E,"steiner: index set of w must be 1..\(E)") /\ if forall(n in 1..N)(is_fixed(ns[n]) /\ fix(ns[n])) then weighted_spanning_tree(N,E,from,to,w,es,K) else fzn_steiner(N,E,from,to,w,ns,es,K) endif; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/value_precede_chain_set.mzn0000644000175000017500000000033613757304533023564 0ustar kaolkaolinclude "fzn_value_precede_chain_set.mzn"; include "fzn_value_precede_chain_set_reif.mzn"; predicate value_precede_chain_set(array[int] of int: c, array[int] of var set of int: x) = fzn_value_precede_chain_set(c, x); libminizinc-2.5.3/share/minizinc/std/at_least.mzn0000644000175000017500000000211213757304533020532 0ustar kaolkaolinclude "fzn_at_least_int.mzn"; include "fzn_at_least_int_reif.mzn"; include "fzn_at_least_set.mzn"; include "fzn_at_least_set_reif.mzn"; /** @group globals.deprecated Requires at least \a n variables in \a x to take the value \a v. This constraint is deprecated. Use count(i in x)(i=v) >= n instead. */ predicate at_least(int: n, array[int] of var int: x, int: v) = fzn_at_least_int(n, x, v); predicate at_least_reif(int: n, array[int] of var int: x, int: v, var bool: b) = fzn_at_least_int_reif(n, x, v, b); /** @group globals.counting Requires at least \a n variables in \a x to take the value \a v. */ predicate at_least(int: n, array[$X] of var set of int: x, set of int: v) = fzn_at_least_set(n, array1d(x), v); predicate at_least_reif(int: n, array[$X] of var set of int: x, set of int: v, var bool: b) = fzn_at_least_set_reif(n, array1d(x), v, b); % Synonyms for the above. predicate atleast(int: n, array[int] of var int: x, int: v) = at_least(n, x, v); predicate atleast(int: n, array[$X] of var set of int: x, set of int: v) = at_least(n, x, v); libminizinc-2.5.3/share/minizinc/std/exactly_set.mzn0000644000175000017500000000062213757304533021266 0ustar kaolkaolinclude "fzn_exactly_set.mzn"; include "fzn_exactly_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate exactly_set(int: n, array[int] of var set of int: x, set of int: v) = fzn_exactly_set(n, x, v); libminizinc-2.5.3/share/minizinc/std/roots.mzn0000644000175000017500000000062613757304533020114 0ustar kaolkaolinclude "fzn_roots.mzn"; include "fzn_roots_reif.mzn"; /** @group globals Requires that \a x[\p i] in \a t for all \p i in \a s */ predicate roots(array[int] of var int: x, var set of int: s, var set of int: t) = assert(ub(s) subset index_set(x), "roots: upper bound of 's' must be a subset of the index set of 'x'", fzn_roots(x,s,t) ); libminizinc-2.5.3/share/minizinc/std/fzn_link_set_to_booleans_reif.mzn0000644000175000017500000000024013757304533025014 0ustar kaolkaolpredicate fzn_link_set_to_booleans_reif(var set of int: s, array[int] of var bool: b, var bool: bb) = bb <-> forall(i in index_set(b)) ( b[i] <-> i in s ); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_dpath_enum_reif.mzn0000644000175000017500000000053413757304533024452 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_dpath_reif(array[int] of $$N: from, array[int] of $$N: to, array[int] of int: w, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es, var int: K, var bool: b) = b <-> ( dpath(from,to,s,t,ns,es) /\ K = sum(e in index_set(es))(es[e]*w[e]) ); libminizinc-2.5.3/share/minizinc/std/fzn_count_eq_par_reif.mzn0000644000175000017500000000035413757304533023305 0ustar kaolkaolinclude "fzn_count_eq_reif.mzn"; predicate fzn_count_eq_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_eq_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_count_gt_par_reif.mzn0000644000175000017500000000035213757304533023310 0ustar kaolkaolinclude "fzn_count_gt_reif.mzn"; predicate fzn_count_gt_par_reif(array[int] of var int: x, int: y, int: c, var bool: b) = fzn_count_gt_reif(x,y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/redefinitions-2.3.3.mzn0000644000175000017500000000063713757304533022253 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.3.3 % that can be overridden by solvers. predicate float_set_in(var float: x, set of float: S) = let { array[int] of float: r1d = set_to_ranges(S); array[int,1..2] of float: r = array2d(1..length(r1d) div 2,1..2,r1d) } in exists (i in index_set_1of2(r)) ( if r[i,1]=r[i,2] then x=r[i,1] else (x>=r[i,1] /\ x<=r[i,2]) endif ); libminizinc-2.5.3/share/minizinc/std/fzn_knapsack_reif.mzn0000644000175000017500000000053713757304533022424 0ustar kaolkaolpredicate fzn_knapsack_reif(array[int] of int: w, array[int] of int:p, array[int] of var int:x, var int: W, var int: P, var bool: b) = b <-> ( forall (i in index_set(x)) (x[i] >= 0) /\ W >= 0 /\ P >= 0 /\ P = sum(i in index_set(p)) (x[i]*p[i]) /\ W = sum(i in index_set(w)) (x[i]*w[i]) ); libminizinc-2.5.3/share/minizinc/std/increasing_int.mzn0000644000175000017500000000061213757304533021735 0ustar kaolkaolinclude "fzn_increasing_int.mzn"; include "fzn_increasing_int_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate increasing_int(array[int] of var int: x) = fzn_increasing_int(x); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_set.mzn0000644000175000017500000000060213757304533023764 0ustar kaolkaolpredicate fzn_if_then_else_var_set(array[int] of var bool: c, array[int] of var set of int: x, var set of int: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_network_flow_cost_reif.mzn0000644000175000017500000000122713757304533024376 0ustar kaolkaolpredicate fzn_network_flow_cost_reif(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of int: weight, array[int] of var int: flow, var int: cost, var bool: b) = let { int: source_node = 1; int: sink_node = 2; set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in b <-> ( cost = sum(i in ARCS) (flow[i] * weight[i]) /\ forall (i in NODES) ( sum (j in ARCS where i == arc[j,source_node]) (flow[j]) - sum (j in ARCS where i == arc[j,sink_node]) (flow[j]) = balance[i] ) ); libminizinc-2.5.3/share/minizinc/std/fzn_inverse_in_range_reif.mzn0000644000175000017500000000061013757304533024136 0ustar kaolkaolpredicate fzn_inverse_in_range_reif(array[int] of var int: f, array[int] of var int: invf, var bool: b) = b <-> ( forall(i in index_set(f)) ( f[i] in index_set(invf) -> (invf[f[i]] == i) ) /\ forall(j in index_set(invf)) ( invf[j] in index_set(f) -> (f[invf[j]] == j) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_writes_reif.mzn0000644000175000017500000000075113757304533022144 0ustar kaolkaolpredicate fzn_writes_reif(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O, var bool: b) = b <-> ( forall(j in index_set(P))(O[P[j]] = V[j]) /\ forall(i in index_set(I)) (if forall(j in index_set(P))(P[j] != i) then O[i] = I[i] else true endif) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_set_reif.mzn0000644000175000017500000000030213757304533024275 0ustar kaolkaolpredicate fzn_value_precede_set_reif(int: s, int: t, array[int] of var set of int: x, var bool: b) = abort("Reified value_precede/3 for sets is not supported."); libminizinc-2.5.3/share/minizinc/std/count_lt.mzn0000644000175000017500000000162013757304533020570 0ustar kaolkaolinclude "fzn_count_lt.mzn"; include "fzn_count_lt_par.mzn"; include "fzn_count_lt_reif.mzn"; include "fzn_count_lt_par_reif.mzn"; /** @group globals.counting Constrains \a c to be strictly less than the number of occurrences of \a y in \a x. */ predicate count_lt(array[$X] of var int: x, var int: y, var int: c) = fzn_count_lt(array1d(x),y,c); /** @group globals.counting Constrains \a c to be strictly less than the number of occurrences of \a y in \a x. */ predicate count_lt(array[$X] of var int: x, int: y, int: c) = fzn_count_lt_par(array1d(x),y,c); predicate count_lt_reif(array[$X] of var int: x, var int: y, var int: c, var bool: b) = fzn_count_lt_reif(array1d(x),y,c,b); predicate count_lt_reif(array[$X] of var int: x, int: y, int: c, var bool: b) = fzn_count_lt_par_reif(array1d(x),y,c,b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_writes_seq_reif.mzn0000644000175000017500000000117613757304533023016 0ustar kaolkaolinclude "arg_max.mzn"; predicate fzn_writes_seq_reif(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O, var bool: b) = b <-> forall (i in index_set(I)) ( let { array[1..length(V)+1] of var int: Vi = array1d(1..length(V)+1, reverse(V) ++ [I[i]]); array[1..length(V)+1] of var bool: Pi = array1d(1..length(V)+1, reverse([P[j] == i | j in index_set(V)]) ++ [true]); } in O[i] = Vi[arg_max(Pi)] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_strictly_increasing_int.mzn0000644000175000017500000000055113757304533024551 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_increasing_int(array[int] of var int: x) = forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] < x[i]); libminizinc-2.5.3/share/minizinc/std/diffn.mzn0000644000175000017500000000136313757304533020033 0ustar kaolkaolinclude "fzn_diffn.mzn"; include "fzn_diffn_reif.mzn"; /** @group globals.packing Constrains rectangles \p i, given by their origins (\a x[\p i], \a y[\p i]) and sizes (\a dx[\p i], \a dy[\p i]), to be non-overlapping. Zero-width rectangles can still not overlap with any other rectangle. */ predicate diffn(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy) = assert( index_set(x) = index_set(y) /\ index_set(x) = index_set(dx) /\ index_set(x) = index_set(dy), "diffn: index set mismatch", fzn_diffn(x,y,dx,dy) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_alldifferent_except_0.mzn0000644000175000017500000000021113757304533024037 0ustar kaolkaolinclude "alldifferent_except.mzn"; predicate fzn_alldifferent_except_0(array[int] of var int: vs) = alldifferent_except(vs, {0}); libminizinc-2.5.3/share/minizinc/std/fzn_writes_seq.mzn0000644000175000017500000000110313757304533021777 0ustar kaolkaolinclude "arg_max.mzn"; predicate fzn_writes_seq(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O) = forall (i in index_set(I)) ( let { array[1..length(V)+1] of var int: Vi = array1d(1..length(V)+1, reverse(V) ++ [I[i]]); array[1..length(V)+1] of var bool: Pi = array1d(1..length(V)+1, reverse([P[j] == i | j in index_set(V)]) ++ [true]); } in O[i] = Vi[arg_max(Pi)] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/alldifferent.mzn0000644000175000017500000000024313757304533021400 0ustar kaolkaol% The actual definitions are in all_different.mzn. % This file is used to handle the case where users include % "alldifferent.mzn"; % include "all_different.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_chain_int.mzn0000644000175000017500000000117613757304533024443 0ustar kaolkaolinclude "seq_precede_chain.mzn"; predicate fzn_value_precede_chain_int(array[int] of int: T, array[int] of var int: X) = if min(index_set(T)) = 1 /\ forall (i in index_set(T))(T[i] = i) /\ max(T) = ub_array(X) then seq_precede_chain(X) else let { int: l = lb_array(X); int: u = ub_array(X); array[1.. u -l +1] of int : p = [sum([i | i in index_set(T) where T[i] = j]) | j in l..u]; array [int] of var 0..length(T): Y = array1d(index_set(X),[p[X[i]-l+1] | i in index_set(X)]); } in seq_precede_chain(Y) endif; libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_closed.mzn0000644000175000017500000000052513757304533024775 0ustar kaolkaolinclude "global_cardinality.mzn"; predicate fzn_global_cardinality_closed(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts) = forall(i in index_set(x))( x[i] in { d | d in cover } ) /\ global_cardinality(x, cover, counts); libminizinc-2.5.3/share/minizinc/std/subgraph.mzn0000644000175000017500000000413413757304533020557 0ustar kaolkaolinclude "fzn_subgraph_int.mzn"; include "fzn_subgraph_int_reif.mzn"; include "fzn_subgraph_enum.mzn"; include "fzn_subgraph_enum_reif.mzn"; /** @group globals.graph Constrains that \a ns and \a es is a subgraph of a given directed graph. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate subgraph(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"subgraph: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"subgraph: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"subgraph: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"subgraph: index set of es must be 1..\(E)") /\ fzn_subgraph(N,E,from,to,ns,es); /** @group globals.graph Constrains that \a ns and \a es is a subgraph of a given directed graph. @param from: the leaving node for each edge @param to: the entering node for each edge @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate subgraph(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"subgraph: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"subgraph: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"subgraph: elements in from must be in index set of ns") /\ assert(dom_array(to) subset index_set(ns),"subgraph: elements in to must be in index set of ns") /\ fzn_subgraph(from,to,ns,es); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_geost_nonoverlap_k.mzn0000644000175000017500000000044613757304533023521 0ustar kaolkaolpredicate fzn_geost_nonoverlap_k( array[int] of var int : x1, array[int] of int : w1, array[int] of var int : x2, array[int] of int : w2 ) = % Non-overlap constraint exists(j in index_set(x1))( x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_all_different_int_reif.mzn0000644000175000017500000000055613757304533024302 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate fzn_all_different_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_alldifferent_except_0_reif.mzn0000644000175000017500000000024013757304533025046 0ustar kaolkaolinclude "alldifferent_except.mzn"; predicate fzn_alldifferent_except_0_reif(array[int] of var int: vs, var bool: b) = alldifferent_except_reif(vs,{0},b); libminizinc-2.5.3/share/minizinc/std/global_cardinality_low_up.mzn0000644000175000017500000000144413757304533024155 0ustar kaolkaolinclude "fzn_global_cardinality_low_up.mzn"; include "fzn_global_cardinality_low_up_reif.mzn"; /** @group globals.counting Requires that for all \p i, the value \a cover[\p i] appears at least \a lbound[\p i] and at most \a ubound[\p i] times in the array \a x. */ predicate global_cardinality_low_up(array[$X] of var int: x, array[$Y] of int: cover, array[$Y] of int: lbound, array[$Y] of int: ubound) = assert( index_sets_agree(cover,lbound) /\ index_sets_agree(cover,ubound), "global_cardinality_low_up: " ++ "cover, lbound and ubound must have identical index sets", fzn_global_cardinality_low_up(array1d(x), array1d(cover), array1d(lbound), array1d(ubound)) ); libminizinc-2.5.3/share/minizinc/std/fzn_regular_regexp.mzn0000644000175000017500000000007413757304533022633 0ustar kaolkaolpredicate fzn_regular(array[int] of var int: x, string: r); libminizinc-2.5.3/share/minizinc/std/fzn_increasing_int_reif.mzn0000644000175000017500000000061413757304533023621 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in increasing order (duplicates are allowed). %-----------------------------------------------------------------------------% predicate fzn_increasing_int_reif(array[int] of var int: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] <= x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_network_flow.mzn0000644000175000017500000000100513757304533022333 0ustar kaolkaolpredicate fzn_network_flow(array[int,1..2] of int: arc, array[int] of int: balance, array[int] of var int: flow) = let { int: source_node = 1; int: sink_node = 2; set of int: ARCS = index_set_1of2(arc); set of int: NODES = index_set(balance); } in forall (i in NODES) ( sum (j in ARCS where i == arc[j,source_node]) (flow[j]) - sum (j in ARCS where i == arc[j,sink_node]) (flow[j]) = balance[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_partition_set.mzn0000644000175000017500000000033313757304533022502 0ustar kaolkaolinclude "all_disjoint.mzn"; predicate fzn_partition_set(array[int] of var set of int: S, set of int: universe) = all_disjoint(S) /\ universe == array_union(i in index_set(S)) ( S[i] ); libminizinc-2.5.3/share/minizinc/std/fzn_bounded_dpath_int_reif.mzn0000644000175000017500000000054313757304533024300 0ustar kaolkaolinclude "path.mzn"; predicate fzn_bounded_dpath_reif(int: N, int: E, array[int] of int: from, array[int] of int: to, array[int] of int: w, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es, var int: K, var bool: b) = b <-> ( dpath(N,E,from,to,s,t,ns,es) /\ K = sum(e in 1..E)(es[e]*w[e]) ); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.1.1.mzn0000644000175000017500000000364713757304533022253 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.1.1 % that can be overridden by solvers. function var $$E: min(var set of $$E: s) = let { var min(ub(s)) .. max(ub(s)): m = min([ e + (max(ub(s))+1-e)*(1 - (e in s)) | e in ub(s) ]) } in m; %% The following can be used as an alternative if the solver supports %% a FlatZinc builtin set_min: % predicate set_min(var set of int: s, var int: m); % % function var $$E: min(var set of $$E: s) = % if mzn_in_root_context(s) then min_t(s) else % let { constraint card(s) > 0 } in min_mt(s) endif; % % function var $$E: min_t(var set of $$E: s) ::promise_total = % let { % var min(ub(s))..max(ub(s)): ms ::is_defined_var; % constraint card(s) > 0; % constraint set_min(s,ms) ::defines_var(ms); % } in ms; % % function var $$E: min_mt(var set of $$E: s) ::promise_total = % let { % var set of ub(s) union {1}: x; % var bool: b = card(s) > 0; % constraint b -> x=s; % constraint b \/ 1 in x; % } in min_t(x); function var $$E: max(var set of $$E: s) = let { var min(ub(s)) .. max(ub(s)): m = max([ e + (min(ub(s))-1-e)*(1 - (e in s)) | e in ub(s) ]) } in m; %% The following can be used as an alternative if the solver supports %% a FlatZinc builtin set_max: % predicate set_max(var set of int: s, var int: m); % % function var $$E: max(var set of $$E: s) = % if mzn_in_root_context(s) then max_t(s) else % let { constraint card(s) > 0 } in max_mt(s) endif; % % function var $$E: max_t(var set of $$E: s) ::promise_total = % let { % var min(ub(s))..max(ub(s)): ms ::is_defined_var; % constraint card(s) > 0; % constraint set_max(s,ms) ::defines_var(ms); % } in ms; % % function var $$E: max_mt(var set of $$E: s) ::promise_total = % let { % var set of ub(s) union {1}: x; % var bool: b = card(s) > 0; % constraint b -> x=s; % constraint b \/ 1 in x; % } in max_t(x); libminizinc-2.5.3/share/minizinc/std/geost.mzn0000644000175000017500000002113613757304533020066 0ustar kaolkaolinclude "fzn_geost.mzn"; include "fzn_geost_reif.mzn"; include "fzn_geost_bb.mzn"; include "fzn_geost_bb_reif.mzn"; include "fzn_geost_smallest_bb.mzn"; include "fzn_geost_smallest_bb_reif.mzn"; include "fzn_geost_nonoverlap_k.mzn"; include "fzn_geost_nonoverlap_k_reif.mzn"; /** @group globals.packing A global non-overlap constraint for \a k dimensional objects. It enforces that no two objects overlap. @param k: the number of dimensions @param rect_size: the size of each box in \a k dimensions @param rect_offset: the offset of each box from the base position in \a k dimensions @param shape: the set of rectangles defining the \p i-th shape. @param x: the base position of each object. \a x[\p i,\p j] is the position of object \p i in. dimension \p j. @param kind: the shape used by each object. */ predicate geost( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind ) = assert( % Some sanity checks index_set_1of2( rect_size ) = index_set_1of2(rect_offset) /\ index_set_2of2( rect_size ) = 1..k /\ index_set_2of2( rect_offset ) = 1..k /\ index_set( shape ) = 1..length(shape) /\ index_set_1of2( x ) = index_set(kind) /\ index_set_2of2( x ) = 1..k /\ forall(i in index_set(shape))( shape[i] subset index_set_1of2(rect_size) ), % Error message "geost: index sets of arguments are incorrect", assert( % More sanity checks forall(i in index_set(shape))(card(shape[i]) > 0), % Error message "geost: sets in shape must be non-empty", fzn_geost(k, rect_size, rect_offset, shape, x, kind) )); % End assert statements /** @group globals.packing A global non-overlap constraint for \a k dimensional objects. It enforces that no two objects overlap, and that all objects fit within a global \a k dimensional bounding box. @param k: the number of dimensions @param rect_size: the size of each box in \a k dimensions @param rect_offset: the offset of each box from the base position in \a k dimensions @param shape: the set of rectangles defining the \p i-th shape. @param x: the base position of each object. \a x[\p i,\p j] is the position of object \p i in dimension \p j. @param kind: the shape used by each object. @param l: is an array of lower bounds, \a l[\p i] is the minimum bounding box for all objects in dimension \p i. @param u: is an array of upper bounds, \a u[\p i] is the maximum bounding box for all objects in dimension \p i. */ predicate geost_bb( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u ) = assert( % Some sanity checks index_set_1of2( rect_size ) = index_set_1of2(rect_offset) /\ index_set_2of2( rect_size ) = 1..k /\ index_set_2of2( rect_offset ) = 1..k /\ index_set( shape ) = 1..length(shape) /\ index_set_1of2( x ) = index_set(kind) /\ index_set_2of2( x ) = 1..k /\ forall(i in index_set(shape))( shape[i] subset index_set_1of2(rect_size) ), % Error message "geost_bb: index sets of arguments are incorrect", assert( % More sanity checks forall(i in index_set(shape))(card(shape[i]) > 0), % Error message "geost_bb: sets in shape must be non-empty", assert( % Sanity check index_set(l) = 1..k /\ index_set(u) = 1..k, % Error message "geost_bb: index set of bounds arrays is not 1.." ++ show(k), % Posting the geost constraint fzn_geost_bb(k, rect_size, rect_offset, shape, x, kind, l, u) ))); /** @group globals.packing A global non-overlap constraint for \a k dimensional objects. It enforces that no two objects overlap, and that all objects fit within a global \a k dimensional bounding box. In addition, it enforces that the bounding box is the smallest one containing all objects, i.e., each of the \a 2k boundaries is touched by at least by one object. @param k: the number of dimensions @param rect_size: the size of each box in \a k dimensions @param rect_offset: the offset of each box from the base position in \a k dimensions @param shape: the set of rectangles defining the \p i-th shape. @param x: the base position of each object. \a x[\p i,\p j] is the position of object \p i in dimension \p j. @param kind: the shape used by each object. @param l: is an array of lower bounds, \a l[\p i] is the minimum bounding box for all objects in dimension \p i. @param u: is an array of upper bounds, \a u[\p i] is the maximum bounding box for all objects in dimension \p i. */ predicate geost_smallest_bb( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , array[int ] of var int : l , array[int ] of var int : u ) = assert( % Some sanity checks index_set_1of2( rect_size ) = index_set_1of2(rect_offset) /\ index_set_2of2( rect_size ) = 1..k /\ index_set_2of2( rect_offset ) = 1..k /\ index_set( shape ) = 1..length(shape) /\ index_set_1of2( x ) = index_set(kind) /\ index_set_2of2( x ) = 1..k /\ forall(i in index_set(shape))( shape[i] subset index_set_1of2(rect_size) ), % Error message "geost_bb: index sets of arguments are incorrect", assert( % More sanity checks forall(i in index_set(shape))(card(shape[i]) > 0), % Error message "geost_bb: sets in shape must be non-empty", % A few useful definitions let { set of int: DIMS = 1..k; set of int: SHAPES = 1..length(shape); set of int: OBJECTS = index_set(kind); } in ( assert( % Sanity check index_set(l) = 1..k /\ index_set(u) = 1..k, % Error message "geost_bb: index set of bounds arrays is not 1.." ++ show(k), % Posting the geost constraint fzn_geost_smallest_bb(k, rect_size, rect_offset, shape, x, kind, l, u) )))); /** @group globals.packing A global non-overlap constraint for \a 2 dimensional objects. It enforces that no two objects overlap and zero-length objects do not appear in the middle of other objects. @param x1: first coordinate of each object @param w2: width in first dimension for each object @param x2: second coordinate of each object @param w2: width in second dimension for each object */ predicate geost_nonoverlap_k( array[int] of var int : x1, array[int] of int : w1, array[int] of var int : x2, array[int] of int : w2 ) = assert( % Some sanity checks index_set( x1 ) = index_set( w1 ) /\ index_set( x1 ) = index_set( x2 ) /\ index_set( x1 ) = index_set( w2 ), % Error message "geost_nonoverlap_k: index sets of arguments do not match", % Non-overlap constraint fzn_geost_nonoverlap_k(x1,w1,x2,w2) ); test geost_nonoverlap_k( array[int] of int: x1, array[int] of int: w1, array[int] of int: x2, array[int] of int: w2 ) = assert( % Some sanity checks index_set( x1 ) = index_set( w1 ) /\ index_set( x1 ) = index_set( x2 ) /\ index_set( x1 ) = index_set( w2 ), % Error message "geost_nonoverlap_k: index sets of arguments do not match", % Non-overlap test exists(j in index_set(x1))( x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j] ) ); libminizinc-2.5.3/share/minizinc/std/fzn_span_reif.mzn0000644000175000017500000000061113757304533021563 0ustar kaolkaolpredicate fzn_span_reif(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d, var bool: b) = b <-> ( (occurs(s0) <-> exists(i in index_set(s))(occurs(s[i]))) /\ s0 = min(s) /\ (absent(s0) -> d0 = 0) /\ s0 ~+ d0 = max([s[i] ~+ d[i] | i in index_set(s)]) ); libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality_low_up_closed_reif.mzn0000644000175000017500000000120113757304533027357 0ustar kaolkaolpredicate fzn_global_cardinality_low_up_closed_reif(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound, var bool: b) = b <-> ( forall(i in index_set(x))( x[i] in { d | d in array2set(cover) } ) /\ global_cardinality_low_up(x, cover, lbound, ubound) /\ % Implied condition length(x) in sum(lbound)..sum(ubound)); include "global_cardinality_low_up.mzn"; libminizinc-2.5.3/share/minizinc/std/fzn_cumulative_reif.mzn0000644000175000017500000000370313757304533023005 0ustar kaolkaolpredicate fzn_cumulative_reif(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in if 0==card(Tasks) then bb <-> ( 0==card(index_set(s)) \/ b>=0 ) else let { int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( if late - early > 5000 then fzn_cumulative_task_reif(s, d, r, b, bb) else fzn_cumulative_time_reif(s, d, r, b, bb) endif ) endif ; predicate fzn_cumulative_time_reif(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 }, int: early = min([ lb(s[i]) | i in Tasks ]), int: late = max([ ub(s[i]) + ub(d[i]) | i in Tasks ]) } in ( bb <-> forall( t in early..late ) ( b >= sum( i in Tasks ) ( bool2int(s[i] <= t /\ t < s[i] + d[i]) * r[i] ) ) ); predicate fzn_cumulative_task_reif(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b, var bool: bb) = let { set of int: Tasks = {i | i in index_set(s) where ub(r[i]) > 0 /\ ub(d[i]) > 0 } } in ( bb <-> forall( j in Tasks ) ( b >= r[j] + sum( i in Tasks where i != j ) ( bool2int(s[i] <= s[j] /\ s[j] < s[i] + d[i] ) * r[i] ) ) ); libminizinc-2.5.3/share/minizinc/std/value_precede_chain.mzn0000644000175000017500000000154013757304533022707 0ustar kaolkaolinclude "value_precede_chain_int.mzn"; include "value_precede_chain_set.mzn"; /** @group globals.lexicographic Requires that \a c[\p i] precedes \a c[\p i +1] in the array \a x. Precedence means that if any element of \a x is equal to \a c[\p i +1], then another element of \a x with a lower index is equal to \a c[\p i]. */ predicate value_precede_chain(array[int] of int: c, array[int] of var int: x) = value_precede_chain_int(c, x); /** @group globals.lexicographic Requires that \a c[\p i] precedes \a c[\p i +1] in the array \a x. Precedence means that if an element of \a x contains \a c[\p i +1] but not \a c[\p i], then another element of \a x with lower index contains \a c[\p i] but not \a c[\p i +1]. */ predicate value_precede_chain(array[int] of int: c, array[int] of var set of int: x) = value_precede_chain_set(c, x); libminizinc-2.5.3/share/minizinc/std/exactly.mzn.deprecated.mzn0000644000175000017500000000023313757304533023313 0ustar kaolkaolpredicate exactly(int: n, array[int] of var int: x, int: v) ::mzn_deprecated("2.4.0","https://www.minizinc.org/doc-2.4.0/en/lib-globals.html#deprecated"); libminizinc-2.5.3/share/minizinc/std/member_set.mzn0000644000175000017500000000057413757304533021072 0ustar kaolkaolinclude "fzn_member_set.mzn"; include "fzn_member_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' occurs in the array or set 'x'. %-----------------------------------------------------------------------------% predicate member_set(array[int] of var set of int: x, var set of int: y) = fzn_member_set(x, y); libminizinc-2.5.3/share/minizinc/std/arg_sort_float.mzn0000644000175000017500000000122213757304533021744 0ustar kaolkaolinclude "fzn_arg_sort_float.mzn"; include "fzn_arg_sort_float_reif.mzn"; predicate arg_sort_float(array[int] of var float:x, array[int] of var int:p) = assert(index_set(p) = 1..length(x), "arg_sort_float: second argument must have index 1..length(first argument)", fzn_arg_sort_float(x, p) ); predicate arg_sort_float_reif(array[int] of var float:x, array[int] of var int:p, var bool: b) = assert(index_set(p) = 1..length(x), "arg_sort_float: second argument must have index 1..length(first argument)", fzn_arg_sort_float_reif(x, p, b) ); libminizinc-2.5.3/share/minizinc/std/fzn_writes.mzn0000644000175000017500000000063313757304533021136 0ustar kaolkaolpredicate fzn_writes(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O) = forall(j in index_set(P))(O[P[j]] = V[j]) /\ forall(i in index_set(I)) (if forall(j in index_set(P))(P[j] != i) then O[i] = I[i] else true endif); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/nvalue.mzn0000644000175000017500000000036013757304533020233 0ustar kaolkaolinclude "fzn_nvalue.mzn"; include "fzn_nvalue_reif.mzn"; /** @group globals.alldifferent Requires that the number of distinct values in \a x is \a n. */ predicate nvalue(var int: n, array[$X] of var int: x) = fzn_nvalue(n, array1d(x)); libminizinc-2.5.3/share/minizinc/std/lex_lesseq_set.mzn0000644000175000017500000000136213757304533021763 0ustar kaolkaolinclude "fzn_lex_lesseq_set.mzn"; include "fzn_lex_lesseq_set_reif.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate lex_lesseq_set(array[int] of var set of int: x, array[int] of var set of int: y) = fzn_lex_lesseq_set(x, y); predicate lex_leq_set(array[int] of var set of int: x, array[int] of var set of int: y) = lex_lesseq_set(x, y); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_chain_set.mzn0000644000175000017500000000035413757304533024441 0ustar kaolkaolinclude "value_precede.mzn"; predicate fzn_value_precede_chain_set(array[int] of int: c, array[int] of var set of int: x) = forall (i in min(index_set(c)) + 1 .. max(index_set(c))) ( value_precede(c[i - 1], c[i], x) ); libminizinc-2.5.3/share/minizinc/std/global_cardinality_low_up_closed.mzn0000644000175000017500000000162313757304533025505 0ustar kaolkaolinclude "fzn_global_cardinality_low_up_closed.mzn"; include "fzn_global_cardinality_low_up_closed_reif.mzn"; /** @group globals.counting Requires that for all \p i, the value \a cover[\p i] appears at least \a lbound[\p i] and at most \a ubound[\p i] times in the array \a x. The elements of \a x must take their values from \a cover. */ predicate global_cardinality_low_up_closed(array[$X] of var int: x, array[$Y] of int: cover, array[$Y] of int: lbound, array[$Y] of int: ubound) = assert( index_sets_agree(cover,lbound) /\ index_sets_agree(cover,ubound), "global_cardinality_low_up_closed: " ++ "cover, lbound and ubound must have identical index sets", fzn_global_cardinality_low_up_closed(array1d(x), array1d(cover), array1d(lbound), array1d(ubound)) ); libminizinc-2.5.3/share/minizinc/std/fzn_inverse_set.mzn0000644000175000017500000000057113757304533022150 0ustar kaolkaolpredicate fzn_inverse_set(array[int] of var set of int: f, array[int] of var set of int: invf) = forall(i in index_set(f)) ( f[i] subset index_set(invf) ) /\ forall(j in index_set(invf)) ( invf[j] subset index_set(f) ) /\ forall(i in index_set(f), j in index_set(invf)) ( (j in f[i] <-> i in invf[j]) ); libminizinc-2.5.3/share/minizinc/std/diffn_nonstrict_k.mzn0000644000175000017500000000150513757304533022446 0ustar kaolkaolinclude "fzn_diffn_nonstrict_k.mzn"; include "fzn_diffn_nonstrict_k_reif.mzn"; /** @group globals.packing Constrains \p k-dimensional boxes to be non-overlapping. For each box \p i and dimension \p j, \a box_posn[\p i, \p j] is the base position of the box in dimension \p j, and \a box_size[\p i, \p j] is the size in that dimension. Boxes whose size is 0 in at least one dimension can be packed anywhere. */ predicate diffn_nonstrict_k(array[int,int] of var int: box_posn, array[int,int] of var int: box_size) = let { set of int: DIMS= index_set_2of2(box_posn) } in assert(index_set_2of2(box_size) = DIMS /\ index_set_1of2(box_posn) = index_set_1of2(box_size), "diffn: index sets of arguments are incorrect", fzn_diffn_nonstrict_k(box_posn, box_size) ) libminizinc-2.5.3/share/minizinc/std/arg_max_bool.mzn0000644000175000017500000000036413757304533021376 0ustar kaolkaolinclude "fzn_arg_max_bool.mzn"; predicate maximum_arg_bool(array[int] of var bool: x, var int: i) = fzn_maximum_arg_bool(x, i); predicate maximum_arg_bool_reif(array[int] of var bool: x, var int: i, var bool: b) = b <-> i=arg_max(x); libminizinc-2.5.3/share/minizinc/std/regular_set.mzn0000644000175000017500000000247613757304533021267 0ustar kaolkaolinclude "fzn_regular_set.mzn"; include "fzn_regular_set_reif.mzn"; /** @group globals.extensional The sequence of values in array \a x (which must all be in the set \a S) is accepted by the DFA of \a Q states with input \a S and transition function \a d (which maps (1..\a Q, \a S) -> 0..\a Q)) and initial state \a q0 (which must be in 1..\a Q) and accepting states \a F (which all must be in 1..\a Q). We reserve state 0 to be an always failing state. */ predicate regular(array[int] of var int: x, int: Q, set of int: S, array[int,int] of int: d, int: q0, set of int: F) = assert(Q > 0, "regular: 'Q' must be greater than zero", assert(card(S) > 0, "regular: 'S' must be non empty", assert(index_set_1of2(d) = 1..Q /\ index_set_2of2(d) == S, "regular: the transition function 'd' must be [1..Q,S]", assert(forall([d[i, j] in 0..Q | i in 1..Q, j in S]), "regular: transition function 'd' points to states outside 0..Q", % Nb: we need the parentheses around the expression otherwise the % parser thinks it's a generator call! assert((q0 in 1..Q), "regular: start state 'q0' not in 1..Q", assert(F subset 1..Q, "regular: final states in 'F' contain states outside 1..Q", fzn_regular(x,Q,S,d,q0,F) )))))); libminizinc-2.5.3/share/minizinc/std/fzn_neural_net_reif.mzn0000644000175000017500000000113113757304533022754 0ustar kaolkaolpredicate fzn_neural_net_reif(array[int] of var float: inputs, array[int] of int: input_ids, array[int] of var float: outputs, array[int] of int: output_ids, array[int] of float: bias, array[int] of float: edge_weight, array[int] of int: edge_parent, array[int] of int: first_edge, NEURON_TYPE: neuron_type, var bool: b) = abort("Reification of neural_net constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_arg_max_int.mzn0000644000175000017500000000073513757304533022114 0ustar kaolkaolpredicate fzn_maximum_arg_int(array[int] of var int: x, var int: z) = % general case: min could be 0 or 1 let { int: l = min(index_set(x)) ; int: u = max(index_set(x)) ; int: n = u-l+1; array[int] of var int: xs = array1d(l..u,[ n*x[j]+(u-j) | j in l..u ]); var int: Mx = max(xs) ; } in forall (j in l..u) ( (z != j) = (Mx > xs[j]) ); %%% only the new decomposition from argmax paper CP2020 submission libminizinc-2.5.3/share/minizinc/std/table_int.mzn0000644000175000017500000000127213757304533020705 0ustar kaolkaolinclude "fzn_table_int.mzn"; include "fzn_table_int_reif.mzn"; %-----------------------------------------------------------------------------% % A table constraint table(x, t) represents the constraint x in t where we % consider each row in t to be a tuple and t as a set of tuples. %-----------------------------------------------------------------------------% predicate table_int(array[int] of var int: x, array[int, int] of int: t) = fzn_table_int(x, t); predicate table_int_reif(array[int] of var int: x, array[int, int] of int: t, var bool: b) = fzn_table_int_reif(x, t, b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_int_reif.mzn0000644000175000017500000000214513757304533023644 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_int_reif(array[int] of var int: x, array[int] of var int: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_circuit.mzn0000644000175000017500000000113113757304533021255 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_circuit(array[int] of var int: x) = let { set of int: S = index_set(x), int: l = min(S), int: n = card(S), array[S] of var 1..n: order } in all_different(x) /\ all_different(order) /\ forall(i in S)(x[i] != i) /\ order[l] = 1 /\ %forall(i in S)(order[i] != n -> order[x[i]] = order[i] + 1) /\ %forall(i in S)(order[i] == n -> x[i] = l ); forall(i in S)(order[x[i]] = if order[i] = n then 1 else order[i] + 1 endif); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_at_most_int.mzn0000644000175000017500000000052513757304533022141 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires at most 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_at_most_int(int: n, array[int] of var int: x, int: v) = count(x,v) <= n; libminizinc-2.5.3/share/minizinc/std/fzn_arg_max_bool.mzn0000644000175000017500000000074013757304533022251 0ustar kaolkaolpredicate fzn_maximum_arg_bool(array[int] of var bool: x, var int: z) = % general case: min could be 0 or 1 let { int: l = min(index_set(x)) ; int: u = max(index_set(x)) ; int: n = u-l+1; array[int] of var int: xs = array1d(l..u,[ n*x[j]+(u-j) | j in l..u ]); var int: Mx = max(xs) ; } in forall (j in l..u) ( (z != j) = (Mx > xs[j]) ); %%% only the new decomposition from argmax paper CP2020 submission libminizinc-2.5.3/share/minizinc/std/fzn_disjoint.mzn0000644000175000017500000000013413757304533021440 0ustar kaolkaolpredicate fzn_disjoint(var set of int: s1, var set of int: s2) = s1 intersect s2 == {}; libminizinc-2.5.3/share/minizinc/std/fzn_diffn_nonstrict_k_reif.mzn0000644000175000017500000000177013757304533024334 0ustar kaolkaolpredicate fzn_diffn_nonstrict_k_reif(array[int,int] of var int: box_posn, array[int,int] of var int: box_size, var bool: b) = let { set of int: DIMS= index_set_2of2(box_posn) } in b <-> forall(b1, b2 in index_set_1of2(box_posn) where b1 < b2) (fzn_diffn_nonstrict_nonoverlap_k_for_reif([ box_posn[b1,j] | j in DIMS ], [ box_size[b1,j] | j in DIMS ], [ box_posn[b2,j] | j in DIMS ], [ box_size[b2,j] | j in DIMS ] ) ) ; predicate fzn_diffn_nonstrict_nonoverlap_k_for_reif(array[int] of var int: x1, array[int] of var int: w1, array[int] of var int: x2, array[int] of var int: w2) = exists(j in index_set(x1)) (w1[j] = 0 \/ w2[j] = 0 \/ x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j]); libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_float.mzn0000644000175000017500000000206313757304533023151 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_float(array[int] of var float: x, array[int] of var float: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in b[0] /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_dag.mzn0000644000175000017500000000116313757304533020353 0ustar kaolkaolpredicate fzn_dag(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = let { set of int: EDGE = index_set(es); array[index_set(ns)] of var 0..length(ns)-1: dist; /* distance of longest path */ } in forall(n in index_set(ns))(not ns[n] -> dist[n] = 0) /\ forall(e in EDGE) (es[e] -> dist[from[e]] + 1 <= dist[to[e]]) /\ % redundant constraint to ensure all distances are fixed forall(n in index_set(ns)) (dist[n] = max( [0] ++ [ (dist[from[e]] + 1)*es[e] | e in EDGE where to[e] = n ])) ; libminizinc-2.5.3/share/minizinc/std/fzn_path_int.mzn0000644000175000017500000000134113757304533021424 0ustar kaolkaolinclude "tree.mzn"; include "subgraph.mzn"; predicate fzn_path(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es) = let { array[1..2*E] of int: dfrom = from ++ to; array[1..2*E] of int: dto = to ++ from; array[1..2*E] of var bool: des; } in /* ensure that the directed edges selected agree with undirected edges */ forall(e in 1..E)(es[e] <-> (des[e] \/ des[e+E])) /\ /* duplicate the edges so that the we can use directed graph path */ fzn_dpath(N,2*E,dfrom,dto,s,t,ns,des); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_exactly_int_reif.mzn0000644000175000017500000000055513757304533023154 0ustar kaolkaolinclude "count_fn.mzn"; %-----------------------------------------------------------------------------% % Requires exactly 'n' variables in 'x' to take the value 'v'. %-----------------------------------------------------------------------------% predicate fzn_exactly_int_reif(int: n, array[int] of var int: x, int: v, var bool: b) = b <-> n == count(x, v); libminizinc-2.5.3/share/minizinc/std/fzn_roots_reif.mzn0000644000175000017500000000056513757304533022000 0ustar kaolkaolpredicate fzn_roots_reif(array[int] of var int: x, var set of int: s, var set of int: t, var bool: b) = b <-> ( % All values in 's' must map to a value in 't'. forall(i in ub(s)) ( i in s -> x[i] in t ) /\ forall(i in ub(t)) ( i in t -> forall(j in index_set(x)) (x[j] = i -> j in s ) ) ); libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_chain_set_reif.mzn0000644000175000017500000000025213757304533025443 0ustar kaolkaolpredicate fzn_value_precede_chain_set_reif(array[int] of int: c, array[int] of var set of int: x, var bool: b) = abort("Reified value_precede_chain is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_chain_int_reif.mzn0000644000175000017500000000025613757304533025446 0ustar kaolkaolpredicate fzn_value_precede_chain_int_reif(array[int] of int: T, array[int] of var int: X, var bool: b) = abort("Reified value_precede_chain constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/fzn_geost_reif.mzn0000644000175000017500000000242413757304533021747 0ustar kaolkaolinclude "fzn_geost_nonoverlap_k.mzn"; include "fzn_geost_nonoverlap_k_reif.mzn"; predicate fzn_geost_reif( int : k , array[int,int] of int : rect_size , array[int,int] of int : rect_offset , array[int ] of set of int : shape , array[int,int] of var int : x , array[int ] of var int : kind , var bool: b ) = % A few useful definitions let { set of int: DIMS = 1..k; set of int: SHAPES = 1..length(shape); set of int: OBJECTS = index_set(kind); } in b <-> forall(o1, o2 in OBJECTS where o1 < o2)( forall(s1 in dom(kind[o1]), s2 in dom(kind[o2]))( (kind[o1] = s1 /\ kind[o2] = s2 -> forall(r1 in shape[s1], r2 in shape[s2])( fzn_geost_nonoverlap_k( [ x[o1,j] + rect_offset[r1,j] | j in DIMS ], [ rect_size[r1,j] | j in DIMS ], [ x[o2,j] + rect_offset[r2,j] | j in DIMS ], [ rect_size[r2,j] | j in DIMS ] ) ) ) ) ); libminizinc-2.5.3/share/minizinc/std/writes.mzn0000644000175000017500000000224013757304533020255 0ustar kaolkaolinclude "fzn_writes.mzn"; include "fzn_writes_reif.mzn"; /** @group globals.array Creates a new array \a O from an input array \a I with a simultaneous change at positions \a P to values \a V \a I is an array of integers \a O is an array of integers with same index set as \a I \a P is an array of index values in \a I \a V is an array of integer values */ predicate writes(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V, array[int] of var int: O) = assert(index_set(O) = index_set(I),"writes: index set of I must be same as O") /\ assert(index_set(P) = index_set(V),"writes: index set of P must be same as V") /\ fzn_writes(I, P, V, O); function array[int] of var int: writes(array[int] of var int: I, array[int] of var int: P, array[int] of var int: V) = assert(index_set(P) = index_set(V),"writes: index set of P must be same as V") /\ let { array[index_set(I)] of var int: O; constraint fzn_writes(I,P,V,O); } in O; %-----------------------------------------------------------------------------%libminizinc-2.5.3/share/minizinc/std/fzn_strictly_increasing_int_opt.mzn0000644000175000017500000000125413757304533025434 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_increasing_int_opt(array[int] of var opt int: x) = let { array[int] of var opt int: xx = array1d(x); array[1..length(xx)] of var int: y; constraint forall(i in 1..length(xx)) ( y[i] = if occurs(xx[i]) then deopt(xx[i]) elseif i = 1 then lb_array(xx) - 1 else y[i-1] endif ); } in forall (i in 2..length(y) where occurs(xx[i])) ( deopt(xx[i]) > y[i-1] ); libminizinc-2.5.3/share/minizinc/std/fzn_roots.mzn0000644000175000017500000000047613757304533020774 0ustar kaolkaolpredicate fzn_roots(array[int] of var int: x, var set of int: s, var set of int: t) = % All values in 's' must map to a value in 't'. forall(i in ub(s)) ( i in s -> x[i] in t ) /\ forall(i in ub(t)) ( i in t -> forall(j in index_set(x)) (x[j] = i -> j in s ) ); libminizinc-2.5.3/share/minizinc/std/fzn_global_cardinality.mzn0000644000175000017500000000046413757304533023446 0ustar kaolkaolinclude "count.mzn"; predicate fzn_global_cardinality(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts) = forall(i in index_set(cover))( count(x, cover[i], counts[i]) ) /\ % Implied constraint length(x) >= sum(counts); libminizinc-2.5.3/share/minizinc/std/fzn_if_then_else_var_bool.mzn0000644000175000017500000000056713757304533024136 0ustar kaolkaolpredicate fzn_if_then_else_var_bool(array[int] of var bool: c, array[int] of var bool: x, var bool: y) = let { array[index_set(c)] of var bool: d; } in forall(i in index_set(c)) (if i > min(index_set(c)) then d[i] = (not c[i-1] /\ d[i-1]) else d[i] = true endif) /\ forall (i in index_set(c)) (c[i] /\ d[i] -> y=x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_dag_reif.mzn0000644000175000017500000000031413757304533021355 0ustar kaolkaolpredicate fzn_dag_reif(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified dag is not supported"); libminizinc-2.5.3/share/minizinc/std/element.mzn0000644000175000017500000000136613757304533020401 0ustar kaolkaolinclude "element_bool.mzn"; include "element_float.mzn"; include "element_int.mzn"; include "element_set.mzn"; %-----------------------------------------------------------------------------% % Requires that 'y' is the ith element of the array 'x'. %-----------------------------------------------------------------------------% predicate element(var int: i, array[int] of var bool: x, var bool: y) = element_bool(i, x, y); predicate element(var int: i, array[int] of var float: x, var float: y) = element_float(i, x, y); predicate element(var int: i, array[int] of var int: x, var int: y) = element_int(i, x, y); predicate element(var int: i, array[int] of var set of int: x, var set of int: y) = element_set(i, x, y); libminizinc-2.5.3/share/minizinc/std/fzn_geost_nonoverlap_k_reif.mzn0000644000175000017500000000050213757304533024517 0ustar kaolkaolpredicate fzn_geost_nonoverlap_k_reif( array[int] of var int : x1, array[int] of int : w1, array[int] of var int : x2, array[int] of int : w2, var bool: b ) = % Non-overlap constraint b <-> exists(j in index_set(x1))( x1[j] + w1[j] <= x2[j] \/ x2[j] + w2[j] <= x1[j] ); libminizinc-2.5.3/share/minizinc/std/strictly_increasing.mzn0000644000175000017500000000302113757304533023015 0ustar kaolkaolinclude "fzn_strictly_increasing_int.mzn"; include "fzn_strictly_increasing_int_opt.mzn"; include "fzn_strictly_increasing_int_reif.mzn"; include "fzn_strictly_increasing_bool.mzn"; include "fzn_strictly_increasing_bool_reif.mzn"; include "analyse_all_different.mzn"; %-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% /** @group globals.sort Requires that the array \a x is in a stricly increasing order (duplicates are *not* allowed). */ predicate strictly_increasing(array[$X] of var bool: x) = analyse_all_different(array1d(x)) /\ fzn_strictly_increasing_bool(array1d(x)); predicate strictly_increasing_reif(array[$X] of var bool: x, var bool: b) = fzn_strictly_increasing_bool_reif(array1d(x),b); /** @group globals.sort Requires that the array \a x is in a stricly increasing order (duplicates are *not* allowed). */ predicate strictly_increasing(array[$X] of var int: x) = analyse_all_different(array1d(x)) /\ fzn_strictly_increasing_int(array1d(x)); /** @group globals.sort Requires that the array \a x is in a stricly increasing order (duplicates are *not* allowed). */ predicate strictly_increasing(array[$X] of var opt int: x) = analyse_all_different(array1d(x)) /\ fzn_strictly_increasing_int_opt(array1d(x)); predicate strictly_increasing_reif(array[$X] of var int: x, var bool: b) = fzn_strictly_increasing_int_reif(array1d(x),b); libminizinc-2.5.3/share/minizinc/std/fzn_arg_min_bool.mzn0000644000175000017500000000073213757304533022250 0ustar kaolkaolpredicate fzn_minimum_arg_bool(array[int] of var bool: x, var int: z) = % general case: min could be 0 or 1 let { int: l = min(index_set(x)) ; int: u = max(index_set(x)) ; int: n = u-l+1; array[int] of var int: xs = array1d(l..u,[ n*x[j]+j | j in l..u ]); var int: Mx = min(xs) ; } in forall (j in l..u) ( (z != j) = (Mx < xs[j]) ); %%% only the new decomposition from argmax paper CP2020 submission libminizinc-2.5.3/share/minizinc/std/fzn_strictly_increasing_bool_reif.mzn0000644000175000017500000000060313757304533025715 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is in strict increasing order %-----------------------------------------------------------------------------% predicate fzn_strictly_increasing_bool_reif(array[int] of var bool: x, var bool: b) = b <-> forall(i in index_set(x) diff { min(index_set(x)) }) (x[i-1] < x[i]); libminizinc-2.5.3/share/minizinc/std/fzn_arg_sort_float.mzn0000644000175000017500000000041613757304533022625 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_arg_sort_float(array[int] of var float:x, array[int] of var int:p) = all_different(p) /\ forall(j in 1..length(x)-1) (x[p[j]] <= x[p[j+1]] /\ (x[p[j]] == x[p[j+1]] -> p[j] < p[j+1])); libminizinc-2.5.3/share/minizinc/std/fzn_tree_enum_reif.mzn0000644000175000017500000000052413757304533022610 0ustar kaolkaolpredicate fzn_tree_reif(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es, var bool: b) = abort("Reified tree constraint is not supported"); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_lex_lesseq_set_reif.mzn0000644000175000017500000000217213757304533023645 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that the array 'x' is lexicographically less than or equal to % array 'y'. Compares them from first to last element, regardless of indices %-----------------------------------------------------------------------------% predicate fzn_lex_lesseq_set_reif(array[int] of var set of int: x, array[int] of var set of int: y, var bool: c) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), int: size = min(ux - lx, uy - ly), array[0..size+1] of var bool: b } % b[i] is true if the lexicographical order holds from position i on. in (c <-> b[0]) /\ forall(i in 0..size) ( b[i] = ( x[lx + i] <= y[ly + i] /\ (x[lx + i] < y[ly + i] \/ b[i+1]) ) ) /\ b[size + 1] = (ux - lx <= uy - ly) ; %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/fzn_alternative_reif.mzn0000644000175000017500000000047313757304533023146 0ustar kaolkaolinclude "span.mzn"; predicate fzn_alternative_reif(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d, var bool: b) = b <-> ( sum(i in index_set(s))(bool2int(occurs(s[i]))) = occurs(s0) /\ span(s0,d0,s,d) ); libminizinc-2.5.3/share/minizinc/std/fzn_sort.mzn0000644000175000017500000000067113757304533020612 0ustar kaolkaolinclude "alldifferent.mzn"; include "increasing.mzn"; predicate fzn_sort(array[int] of var int: x, array[int] of var int: y) = let { int: lx = min(index_set(x)), int: ux = max(index_set(x)), int: ly = min(index_set(y)), int: uy = max(index_set(y)), array[lx..ux] of var ly..uy: p } in forall(i in index_set(x)) ( y[p[i]] == x[i] ) /\ alldifferent(p) /\ increasing(y); libminizinc-2.5.3/share/minizinc/std/alldifferent_except_0.mzn0000644000175000017500000000073113757304533023171 0ustar kaolkaolinclude "fzn_alldifferent_except_0.mzn"; include "fzn_alldifferent_except_0_reif.mzn"; /** @group globals.alldifferent Constrain the array of integers \a vs to be all different except those elements that are assigned the value 0. */ predicate alldifferent_except_0(array[$X] of var int: vs) = fzn_alldifferent_except_0(array1d(vs)); predicate alldifferent_except_0_reif(array[$X] of var int: vs, var bool: b) = fzn_alldifferent_except_0_reif(array1d(vs),b); libminizinc-2.5.3/share/minizinc/std/fzn_value_precede_int_opt.mzn0000644000175000017500000000025213757304533024155 0ustar kaolkaolpredicate fzn_value_precede_int_opt(int: s, int: t, array[int] of var opt int: x) = value_precede_int(s,t,[if occurs(y) then deopt(y) else max(s,t)+1 endif | y in x]); libminizinc-2.5.3/share/minizinc/std/mdd_nondet.mzn0000644000175000017500000000561513757304533021064 0ustar kaolkaolinclude "fzn_mdd_nondet.mzn"; include "fzn_mdd_nondet_reif.mzn"; /** @group globals.extensional Requires that \a x defines a path from root to true node T through the (nondeterministic) MDD defined by @param N: the number of nodes, the root node is node 1 @param level: the level of each node, the root is level 1, T is level \a length(x)+1 @param E: the number of edges @param from: the leaving node (1..\a N)for each edge @param label: the set of values of the \a x variable for each edge @param to: the entering node for each edge, where 0 = T node The MDD can be nondeterministic, i.e., there can be two edges with the same label leaving the same node. */ predicate mdd_nondet(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % possible values of variable array[int] of int: to % edge entering node 0..N where 0 = T node ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[0..N] of int: levele = array1d(0..N,[L+1]++level); } in assert(index_set(level) = NODE, "mdd: third argument must be of length N = \(N)") /\ assert(index_set(from) = EDGE, "mdd: 5th argument must be of length E = \(E)") /\ assert(index_set(to) = EDGE, "mdd: 7th argument must be of length E = \(E)") /\ forall(e in EDGE)(assert(from[e] in NODE, "mdd: from[\(e)] must be in \(NODE)")) /\ forall(e in EDGE)(assert(to[e] in 0..N, "mdd: to[\(e)] must be in 0..\(N)")) /\ forall(e in EDGE)(assert(level[from[e]]+1 = levele[to[e]], "mdd level of from[\(e)] = \(level[from[e]])" ++ "must be 1 less than level of to[\(e)] = \(levele[to[e]])")) /\ fzn_mdd_nondet(x, N, level, E, from, label, to); % Example consider an MDD over 3 variables % 5 nodes and 12 edges % level 1 root = 1 % level 2 2 3 % level 3 4 5 % level 4 T % with edges (from,label,to) given by % (1,1,2), (1,2,3), (1,3,2) % (2,2,4), (2,3,5) % (3,3,4), (3,2,5) % (4,1,0), (4,5,0) % (5,2,0), (5,4,0), (5,6,0) % this is defined by the call % mdd([x1,x2,x3],5,[1,2,2,3,3],12,[1,1,1,2,2,3,3,4,4,5,5,5],[1,3,2,2,3,3,2,1,5,2,4,6],[2,2,3,4,5,4,5,0,0,0,0,0]) libminizinc-2.5.3/share/minizinc/std/range_fn.mzn0000644000175000017500000000070713757304533020525 0ustar kaolkaolinclude "range.mzn"; /** @group globals Returns the image of function \a x (represented as an array) on set of values \a s. ub(\a s) must be a subset of index_set(\a x) otherwise an assertion failure will occur. */ function var set of int: range(array[int] of var int: x, var set of int: s) ::promise_total = let { var set of lb_array(x)..ub_array(x): t ::is_defined_var; constraint range(x,s,t) ::defines_var(t); } in t; libminizinc-2.5.3/share/minizinc/std/bin_packing_load_fn.mzn0000644000175000017500000000134513757304533022673 0ustar kaolkaolinclude "fzn_bin_packing_load.mzn"; /** @group globals.packing Returns the load of each bin resulting from packing each item \p i with weight \a w[\p i] into \a bin[\p i], where the load is defined as the sum of the weights of the items in each bin. Assumptions: - forall \p i, \a w[\p i] >=0 */ function array[int] of var int: bin_packing_load(array[int] of var int: bin, array[int] of int: w) :: promise_total = assert(index_set(bin) == index_set(w), "bin_packing_load: the bin and weight arrays must have identical index sets", let { array[dom_bounds_array(bin)] of var 0..sum(w): load; constraint fzn_bin_packing_load(load,bin,w); } in load ); libminizinc-2.5.3/share/minizinc/std/redefinitions-2.1.mzn0000644000175000017500000000055413757304533022106 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.1 % that can be overridden by solvers. predicate float_in(var float: x, float: a, float: b) = x >= a /\ x <= b; predicate float_dom(var float: x, array[int] of float: as) = let { array[int] of var bool: b = [float_in(x,as[2*i-1],as[2*i]) | i in 1..length(as) div 2] } in exists(b); libminizinc-2.5.3/share/minizinc/std/bin_packing_load.mzn0000644000175000017500000000241213757304533022204 0ustar kaolkaolinclude "bin_packing_load_fn.mzn"; include "fzn_bin_packing_load.mzn"; include "fzn_bin_packing_load_reif.mzn"; /** @group globals.packing Requires that each item \p i with weight \a w[\p i], be put into \a bin[\p i] such that the sum of the weights of the items in each bin \p b is equal to \a load[\p b]. Assumptions: - forall \p i, \a w[\p i] >=0 */ predicate bin_packing_load(array[int] of var int: load, array[int] of var int: bin, array[int] of int: w) = assert(index_set(bin) == index_set(w), "bin_packing_load: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing_load: the weights must be non-negative", fzn_bin_packing_load(load, bin, w) )); predicate bin_packing_load_reif(array[int] of var int: load, array[int] of var int: bin, array[int] of int: w, var bool: b) = assert(index_set(bin) == index_set(w), "bin_packing_load: the bin and weight arrays must have identical index sets", assert(lb_array(w) >= 0, "bin_packing_load: the weights must be non-negative", fzn_bin_packing_load_reif(load, bin, w, b) )); libminizinc-2.5.3/share/minizinc/std/fzn_all_equal_set.mzn0000644000175000017500000000052213757304533022430 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all equal. %-----------------------------------------------------------------------------% predicate fzn_all_equal_set(array[int] of var set of int: x) = forall(i, j in index_set(x) where i < j) ( x[i] = x[j] ); libminizinc-2.5.3/share/minizinc/std/fzn_cost_mdd.mzn0000644000175000017500000000573613757304533021426 0ustar kaolkaolpredicate fzn_cost_mdd(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % values of variable on edge array[int] of int: cost, % cost of using edge array[int] of int: to, % edge entering node 0..N where 0 = T node var int: totalcost % total cost of path ) = let { set of int: NODE = 1..N; set of int: EDGE = 1..E; int: L = length(x); array[1..L] of int: maxlevelcost = [ max(e in EDGE where level[from[e]] = l)(cost[e]) | l in 1..L]; array[1..L] of int: minlevelcost = [ min([0] ++ [ cost[e] | e in EDGE where level[from[e]] = l /\ cost[e] < 0])| l in 1..L] ; int: maxcost = sum(maxlevelcost); set of int: COST = sum(minlevelcost)..L*(maxcost+1); array[0..N] of var bool: bn; array[EDGE] of var bool: be; array[0..N] of var COST: ln; % distance from T array[0..N] of var COST: un; % distance from root } in bn[0] /\ % true node is true bn[1] /\ % root must hold % T1 each node except the root enforces an outgoing edge forall(n in NODE)(bn[n] -> exists(e in EDGE where from[e] = n)(be[e])) /\ % T23 each edge enforces its endpoints forall(e in EDGE)((be[e] -> bn[to[e]]) /\ (be[e] -> bn[to[e]])) /\ % T4 each edge enforces its label forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ % P1 each node enforces its outgoing edges forall(e in EDGE)(bn[from[e]] /\ x[level[from[e]]] in label[e] -> be[e]) /\ % P2 each node except the root enforces an incoming edge exists(e in EDGE where to[e] = 0)(be[e]) /\ forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ % P3 each label has a support forall(i in 1..L, d in dom(x[i])) (x[i] = d -> exists(e in EDGE where level[from[e]] = i /\ d in label[e])(be[e])) /\ % P4 exactly one node at each level forall(i in 1..L) (sum(n in NODE where level[n] = i)(bn[n]) = 1) /\ ln[0] = 0 /\ un[1] = 0 /\ forall(n in NODE) (ln[n] = min(e in EDGE where from[e] = n)(ln[to[e]] + cost[e] + (not be[e])*(maxcost+1 - cost[e]))) /\ forall(n in 2..N) (un[n] = min(e in EDGE where to[e] = n)(un[from[e]] + cost[e] + (not be[e])*(maxcost+1 - cost[e]))) /\ forall(e in EDGE)(be[e] -> un[from[e]] + cost[e] + ln[to[e]] <= maxcost) /\ totalcost = ln[1]; libminizinc-2.5.3/share/minizinc/std/span.mzn0000644000175000017500000000076613757304533017714 0ustar kaolkaolinclude "fzn_span.mzn"; include "fzn_span_reif.mzn"; /** @group globals.scheduling Span constraint for optional tasks. Task (\a s0,\a d0) spans the optional tasks (\a s[\p i],\a d[\p i]) in the array arguments. */ predicate span(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d) = assert(index_set(s) = index_set(d), "span: index sets of third and fourth argument must be identical", fzn_span(s0,d0,s,d) ); libminizinc-2.5.3/share/minizinc/std/element_bool.mzn0000644000175000017500000000046513757304533021413 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' is the ith element of the array 'x'. %-----------------------------------------------------------------------------% predicate element_bool(var int: i, array[int] of var bool: x, var bool: y) = y = x[i]; libminizinc-2.5.3/share/minizinc/std/element_float.mzn0000644000175000017500000000046713757304533021567 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that 'y' is the ith element of the array 'x'. %-----------------------------------------------------------------------------% predicate element_float(var int: i, array[int] of var float: x, var float: y) = y = x[i];libminizinc-2.5.3/share/minizinc/std/fzn_symmetric_all_different_reif.mzn0000644000175000017500000000034013757304533025513 0ustar kaolkaolinclude "all_different.mzn"; predicate fzn_symmetric_all_different_reif(array[int] of var int:x, var bool: b) = b <-> ( all_different(x) /\ forall(i, j in index_set(x) where i!=j) (x[i] = j -> x[j] = i) ); libminizinc-2.5.3/share/minizinc/std/fzn_regular_nfa_set_reif.mzn0000644000175000017500000000042213757304533023762 0ustar kaolkaolpredicate fzn_regular_nfa_reif(array[int] of var int: x, int: Q, set of int: S, array[int,int] of set of int: d, int: q0, set of int: F, var bool: b) = abort("Reified regular_nfa constraint is not supported"); libminizinc-2.5.3/share/minizinc/std/atmost.mzn0000644000175000017500000000022013757304533020243 0ustar kaolkaol% The actual definitions are in atmost.mzn. % This file is used to handle the case where users include % "atmost.mzn"; % include "at_most.mzn"; libminizinc-2.5.3/share/minizinc/std/tree.mzn0000644000175000017500000001056213757304533017705 0ustar kaolkaolinclude "fzn_tree_int.mzn"; include "fzn_tree_int_reif.mzn"; include "fzn_tree_enum.mzn"; include "fzn_tree_enum_reif.mzn"; include "fzn_dtree_int.mzn"; include "fzn_dtree_int_reif.mzn"; include "fzn_dtree_enum.mzn"; include "fzn_dtree_enum_reif.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a tree rooted at \a r. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dtree(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"dtree: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"dtree: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"dtree: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"dtree: index set of es must be 1..\(E)") /\ fzn_dtree(N,E,from,to,r,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be at tree rooted at \a r. @param from: the leaving node for each edge @param to: the entering node for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dtree(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dreachable: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dreachable: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in to must be in index set of ns") /\ fzn_dtree(from,to,r,ns,es); %-----------------------------------------------------------------------------% /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be a tree rooted at \a r. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate tree(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: r, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"tree: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"tree: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"tree: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"tree: index set of es must be 1..\(E)") /\ fzn_tree(N,E,from,to,r,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be at tree rooted at \a r. @param from: the leaving node for each edge @param to: the entering node for each edge @param r: the root node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate tree(array[int] of $$N: from, array[int] of $$N: to, var $$N: r, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dreachable: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dreachable: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dreachable: nodes in to must be in index set of ns") /\ fzn_tree(from,to,r,ns,es); libminizinc-2.5.3/share/minizinc/std/connected.mzn0000644000175000017500000000407613757304533020713 0ustar kaolkaolinclude "fzn_connected.mzn"; include "fzn_connected_reif.mzn"; include "fzn_dconnected.mzn"; include "fzn_dconnected_reif.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be connected. @param from: the leaving node for each edge @param to: the entering node for each edge @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dconnected(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dconnected: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dconnected: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dconnected: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dconnected: nodes in to must be in index set of ns") /\ fzn_dconnected(from,to,ns,es); %-----------------------------------------------------------------------------% /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be connected. @param from: is the leaving node for each edge @param to: is the entering node for each edge @param ns: is a Boolean for each node whether it is in the subgraph @param es: is a Boolean for each edge whether it is in the subgraph */ predicate connected(array[int] of $$N: from, array[int] of $$N: to, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"connected: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"connected: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"connected: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"connected: nodes in to must be in index set of ns") /\ fzn_connected(from,to,ns,es); libminizinc-2.5.3/share/minizinc/std/fzn_disjunctive_strict_opt_reif.mzn0000644000175000017500000000076413757304533025434 0ustar kaolkaolpredicate fzn_disjunctive_strict_opt_reif(array[int] of var opt int: s, array[int] of var int: d, var bool: b) = b <-> ( forall (i in index_set(d)) (d[i] >= 0) /\ forall (i,j in index_set(d) where i ( dtree(N,E,from,to,s,ns,es) /\ dtree(N,E,to,from,t,ns,es) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/std/arg_sort.mzn0000644000175000017500000000427013757304533020565 0ustar kaolkaolinclude "arg_sort_int.mzn"; include "arg_sort_float.mzn"; include "analyse_all_different.mzn"; /** @group globals.sort Returns the permutation \a p which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ function array[int] of var int: arg_sort(array[int] of var int:x) :: promise_total = if length(x) = 0 then [] else let { int: l = min(index_set(x)); int: u = max(index_set(x)); array[1..u-l+1] of var l..u: p; constraint analyse_all_different(p); constraint arg_sort_int(x,p); } in p endif; /** @group globals.sort Returns the permutation \a p which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ function array[int] of var int: arg_sort(array[int] of var float:x) :: promise_total = if length(x) = 0 then [] else let { int: l = min(index_set(x)); int: u = max(index_set(x)); array[1..u-l+1] of var l..u: p; constraint analyse_all_different(p); constraint arg_sort_float(x,p); } in p endif; /** @group globals.sort Constrains \a p to be the permutation which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ predicate arg_sort(array[int] of var int:x, array[int] of var int:p) = fzn_arg_sort_int(x,p); /** @group globals.sort Constrains \a p to be the permutation which causes \a x to be in sorted order hence \a x[\a p[\p i]] <= \a x[\a p[\p i+1]]. The permutation is the stable sort hence \a x[\a p[\p i]] = \a x[\a p[\p i+1]] \(\rightarrow\) \a p[\p i] < \a p[\p i+1]. */ predicate arg_sort(array[int] of var float:x, array[int] of var int:p) = arg_sort_float(x,p); libminizinc-2.5.3/share/minizinc/std/value_precede_set.mzn0000644000175000017500000000030313757304533022414 0ustar kaolkaolinclude "fzn_value_precede_set.mzn"; include "fzn_value_precede_set_reif.mzn"; predicate value_precede_set(int: s, int: t, array[int] of var set of int: x) = fzn_value_precede_set(s, t, x); libminizinc-2.5.3/share/minizinc/std/fzn_cost_mdd_reif.mzn0000644000175000017500000000156713757304533022431 0ustar kaolkaolpredicate fzn_cost_mdd_reif(array[int] of var int: x, % variables constrained by MDD int: N, % number of nodes root is node 1 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 int: E, % number of edges array[int] of int: from, % edge leaving node 1..N array[int] of set of int: label, % values of variable on edge array[int] of int: cost, % cost of using edge array[int] of int: to, % edge entering node 0..N where 0 = T node var int: totalcost, % total cost of path var bool: b % reification variable ) = abort("Reified cost_mdd/9 is not supported."); libminizinc-2.5.3/share/minizinc/std/link_set_to_booleans.mzn0000644000175000017500000000111213757304533023131 0ustar kaolkaolinclude "fzn_link_set_to_booleans.mzn"; include "fzn_link_set_to_booleans_reif.mzn"; /** @group globals.channeling Constrain the array of Booleans \a b to be a representation of the set \a s: \p i in \a s \( \leftrightarrow \) \a b[\p i]. The index set of \a b must be a superset of the possible values of \a s. */ predicate link_set_to_booleans(var set of int: s, array[int] of var bool: b) = assert(ub(s) subset index_set(b), "link_set_to_booleans: the index set of b must be a superset of the possible values of s", fzn_link_set_to_booleans(s,b) ); libminizinc-2.5.3/share/minizinc/std/fzn_span.mzn0000644000175000017500000000047313757304533020564 0ustar kaolkaolpredicate fzn_span(var opt int: s0, var int: d0, array[int] of var opt int: s, array[int] of var int: d) = (occurs(s0) <-> exists(i in index_set(s))(occurs(s[i]))) /\ s0 = min(s) /\ (absent(s0) -> d0 = 0) /\ s0 ~+ d0 = max([s[i] ~+ d[i] | i in index_set(s)]); libminizinc-2.5.3/share/minizinc/std/path.mzn0000644000175000017500000001107413757304533017701 0ustar kaolkaolinclude "fzn_path_int.mzn"; include "fzn_path_int_reif.mzn"; include "fzn_path_enum.mzn"; include "fzn_path_enum_reif.mzn"; include "fzn_dpath_int.mzn"; include "fzn_dpath_int_reif.mzn"; include "fzn_dpath_enum.mzn"; include "fzn_dpath_enum_reif.mzn"; /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a path from \a s to \a t. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dpath(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"dpath: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"dpath: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"dpath: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"dpath: index set of es must be 1..\(E)") /\ fzn_dpath(N,E,from,to,s,t,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given directed graph to be a path from \a s to \a t. @param from: the leaving node for each edge @param to: the entering node for each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate dpath(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"dpath: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"dpath: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"dpath: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"dpath: nodes in to must be in index set of ns") /\ fzn_dpath(from,to,s,t,ns,es); %-----------------------------------------------------------------------------% /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be a path from \a s to \a t. @param N: the number of nodes in the given graph @param E: the number of edges in the given graph @param from: the leaving node 1..\a N for each edge @param to: the entering node 1..\a N for each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate path(int: N, int: E, array[int] of int: from, array[int] of int: to, var int: s, var int: t, array[int] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = 1..E,"path: index set of from must be 1..\(E)") /\ assert(index_set(to) = 1..E,"path: index set of to must be 1..\(E)") /\ assert(index_set(ns) = 1..N,"path: index set of ns must be 1..\(N)") /\ assert(index_set(es) = 1..E,"path: index set of es must be 1..\(E)") /\ fzn_path(N,E,from,to,s,t,ns,es); /** @group globals.graph Constrains the subgraph \a ns and \a es of a given undirected graph to be a path from \a s to \a t. @param from: the leaving node for each edge @param to: the entering node for each edge @param s: the source node (which may be variable) @param t: the dest node (which may be variable) @param ns: a Boolean for each node whether it is in the subgraph @param es: a Boolean for each edge whether it is in the subgraph */ predicate path(array[int] of $$N: from, array[int] of $$N: to, var $$N: s, var $$N: t, array[$$N] of var bool: ns, array[int] of var bool: es) = assert(index_set(from) = index_set(to),"path: index set of from and to must be identical") /\ assert(index_set(from) = index_set(es),"path: index set of from and es must be identical") /\ assert(dom_array(from) subset index_set(ns),"path: nodes in from must be in index set of ns") /\ assert(dom_array(from) subset index_set(ns),"path: nodes in to must be in index set of ns") /\ fzn_path(from,to,s,t,ns,es); libminizinc-2.5.3/share/minizinc/std/fzn_arg_min_float.mzn0000644000175000017500000000163313757304533022423 0ustar kaolkaolpredicate fzn_minimum_arg_float(array[int] of var float: x, var int: i) = let { int: l = min(index_set(x)); int: u = max(index_set(x)); float: ly = lb_array(x); } in if exists(j in l..u)(ub(x[j]) = ly) then let { array[l..u] of var bool: d; } in % min is known to be ly x[i] = ly /\ % ith case must be equal to ub forall(j in l..u)(x[j] = ly -> i <= j) /\ % lower bound d[l] = (x[l] != ly) /\ forall(j in l+1..u)(d[j] <-> (d[j-1] /\ (x[j] != ly))) /\ forall(j in l..u)(d[j] -> i >= j+1) % upper bound else let { float: uy = ub_array(x); array[l..u] of var ly..uy: y; array[l..u] of var l..u: mi; } in y[l] = x[l] /\ mi[l] = l /\ i = mi[u] /\ forall (j in l+1 .. u) ( y[j] == min(x[j],y[j-1]) /\ mi[j] = if y[j-1] <= x[j] then mi[j-1] else j endif ) endif; libminizinc-2.5.3/share/minizinc/Preferences.json0000644000175000017500000000065013757304533020557 0ustar kaolkaol{ "tagDefaults": [ ["", "org.gecode.gecode"] ], "solverDefaults" : [ ["org.minizinc.mip.gurobi", "-DQuadrIntSolverConfig=true", ""], ["org.minizinc.mip.gurobi", "-DQuadrFloatSolverConfig=true", ""], ["org.minizinc.mip.scip", "-DCumulativeSolverConfig=true", ""], ["org.minizinc.mip.scip", "-DQuadrIntSolverConfig=true", ""], ["org.minizinc.mip.scip", "-DQuadrFloatSolverConfig=true", ""] ] } libminizinc-2.5.3/share/minizinc/linear_old/0000755000175000017500000000000013757304533017532 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/linear_old/redefinitions.mzn0000644000175000017500000004511213757304533023125 0ustar kaolkaol%-----------------------------------------------------------------------------% % FlatZinc built-in redefinitions for linear solvers. % % Sebastian Brand % Gleb Belov Corrected array_var_float_element and float_lin_lt_reif %-----------------------------------------------------------------------------% function var bool: reverse_map(var int: x) = (x==1); function bool: reverse_map(int: x) = (x==1); function var int: bool2int(var bool: x) :: promise_total = let { var 0..1: b2i; constraint (x = reverse_map(b2i)) ::is_reverse_map ; } in b2i; predicate bool_eq(var bool: x, var bool: y) = bool2int(x)==bool2int(y); %-----------------------------------------------------------------------------% % Strict inequality % % Uncomment the following redefinition for FlatZinc MIP solver interfaces that % do not support strict inequality. Note that it does not preserve equivalence % (some solutions of the original problem may become invalid). % predicate float_lt(var float: x, var float: y) = x + 1e-06 <= y; %-----------------------------------------------------------------------------% % % Logic operations % %-----------------------------------------------------------------------------% predicate bool_not(var bool: p, var bool: q) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q) } in x + y = 1; predicate bool_and(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y <= z + 1 /\ x + y >= z * 2; % x >= z /\ y >= z; % alternative predicate bool_or(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y >= z /\ x + y <= z * 2; % x <= z /\ y <= z; % alternative predicate bool_xor(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x <= y + z /\ y <= x + z /\ z <= x + y /\ x + y + z <= 2; predicate bool_eq_reif(var bool: p, var bool: q, var bool: r) = if is_fixed(q) then % frequent case if fix(q) = true then p = r else bool_not(p,r) endif else let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y <= z + 1 /\ x + z <= y + 1 /\ y + z <= x + 1 /\ x + y + z >= 1 endif; predicate bool_ne_reif(var bool: p, var bool: q, var bool: r) = bool_xor(p, q, r); predicate bool_le(var bool: p, var bool: q) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q) } in x <= y; predicate bool_le_reif(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in 1 - x + y >= z /\ 1 - x + y <= z * 2; % 1 - x <= z /\ y <= z; % alternative predicate bool_lt(var bool: p, var bool: q) = not p /\ q; predicate bool_lt_reif(var bool: p, var bool: q, var bool: r) = (not p /\ q) <-> r; %-----------------------------------------------------------------------------% predicate array_bool_or(array[int] of var bool: a, var bool: b) = if is_fixed(b) then % frequent case if fix(b) = true then sum(i in index_set(a))( bool2int(a[i]) ) >= 1 else forall(i in index_set(a))( not a[i] ) endif else let { var 0..1: x = bool2int(b), array[1..length(a)] of var 0..1: c = [ bool2int(a[i]) | i in index_set(a) ] } in sum(c) >= x /\ sum(c) <= x * length(a) endif; predicate array_bool_and(array[int] of var bool: a, var bool: b) = let { var 0..1: x = bool2int(b), array[1..length(a)] of var 0..1: c = [ bool2int(a[i]) | i in index_set(a) ] } in length(a) - sum(c) >= 1 - x /\ length(a) - sum(c) <= (1 - x) * length(a); predicate array_bool_xor(array[int] of var bool: a) = let { var 0..length(a): m } in sum(i in 1..length(a))( bool2int(a[i]) ) = 1 + 2 * m; predicate bool_clause(array[int] of var bool: p, array[int] of var bool: n) = sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1; % predicate array_bool_xor(array[int] of var bool: a) = .. sum(a) is odd .. %-----------------------------------------------------------------------------% % % Linear equations and inequations % %-----------------------------------------------------------------------------% predicate int_le_reif(var int: x, var int: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_int_le_if_1(x, y, p) /\ aux_int_gt_if_0(x, y, p); predicate int_lt_reif(var int: x, var int: y, var bool: b) = int_le_reif(x, y - 1, b); predicate int_ne(var int: x, var int: y) = let { var 0..1: p } in aux_int_lt_if_1(x, y, p) /\ aux_int_gt_if_0(x, y, p); predicate int_lin_ne(array[int] of int: c, array[int] of var int: x, int: d) = int_ne(sum(i in index_set(x))( c[i]*x[i] ),d); predicate int_eq_reif(var int: x, var int: y, var bool: b) = aux_int_eq_iff_1(x, y, bool2int(b)); predicate int_ne_reif(var int: x, var int: y, var bool: b) = aux_int_eq_iff_1(x, y, 1 - bool2int(b)); %-----------------------------------------------------------------------------% predicate int_lin_eq_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = aux_int_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, bool2int(b)); predicate int_lin_ne_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = aux_int_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, 1 - bool2int(b)); predicate int_lin_le_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_int_le_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_int_gt_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); predicate int_lin_lt_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = int_lin_le_reif(c, x, d - 1, b); %-----------------------------------------------------------------------------% predicate float_le_reif(var float: x, var float: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_float_le_if_1(x, y, int2float(p)) /\ aux_float_gt_if_0(x, y, int2float(p)); predicate float_lt_reif(var float: x, var float: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_float_lt_if_1(x, y, int2float(p)) /\ aux_float_ge_if_0(x, y, int2float(p)); predicate float_ne(var float: x, var float: y) = let { var 0..1: p } in aux_float_lt_if_1(x, y, int2float(p)) /\ aux_float_gt_if_0(x, y, int2float(p)); predicate float_eq_reif(var float: x, var float: y, var bool: b) = aux_float_eq_iff_1(x, y, int2float(bool2int(b))); predicate float_ne_reif(var float: x, var float: y, var bool: b) = aux_float_eq_iff_1(x, y, 1.0 - int2float(bool2int(b))); %-----------------------------------------------------------------------------% predicate float_lin_eq_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, int2float(bool2int(b))); predicate float_lin_ne_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, 1.0 - int2float(bool2int(b))); predicate float_lin_le_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = let { var 0.0..1.0: p = int2float(bool2int(b)) } in aux_float_le_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_float_gt_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); predicate float_lin_lt_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = let { var 0.0..1.0: p = int2float(bool2int(b)) } in aux_float_lt_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_float_ge_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); %-----------------------------------------------------------------------------% % Minimum, maximum, absolute value predicate int_abs(var int: x, var int: z) = let { var 0..1: p } in % z <= x \/ z <= -x aux_int_le_if_1(z, x, p) /\ aux_int_le_if_0(z, -x, p) /\ z >= x /\ z >= -x /\ z >= 0; predicate int_min(var int: x, var int: y, var int: z) = let { var 0..1: p } in % z >= x \/ z >= y aux_int_ge_if_1(z, x, p) /\ aux_int_ge_if_0(z, y, p) /\ z <= x /\ z <= y; predicate int_max(var int: x, var int: y, var int: z) = let { var 0..1: p } in % z <= x \/ z <= y aux_int_le_if_1(z, x, p) /\ aux_int_le_if_0(z, y, p) /\ z >= x /\ z >= y; predicate float_abs(var float: x, var float: z) = let { var 0..1: p } in % z <= x \/ z <= -x aux_float_le_if_1(z, x, int2float(p)) /\ aux_float_le_if_0(z, -x, int2float(p)) /\ z >= x /\ z >= -x /\ z >= 0.0; predicate float_min(var float: x, var float: y, var float: z) = let { var 0..1: p } in % z >= x \/ z >= y aux_float_ge_if_1(z, x, int2float(p)) /\ aux_float_ge_if_0(z, y, int2float(p)) /\ z <= x /\ z <= y; predicate float_max(var float: x, var float: y, var float: z) = let { var 0..1: p } in % z <= x \/ z <= y aux_float_le_if_1(z, x, int2float(p)) /\ aux_float_le_if_0(z, y, int2float(p)) /\ z >= x /\ z >= y; %-----------------------------------------------------------------------------% % Multiplication and division predicate int_div(var int: x, var int: y, var int: q) = let { var 0..max(abs(lb(y)), abs(ub(y))) - 1: r } in aux_int_division_modulo(x,y,q,r); predicate int_mod(var int: x, var int: y, var int: r) = let { int: bx = max(abs(lb(x)), abs(ub(x))); var -bx..bx: q; int: by = max(abs(lb(y)), abs(ub(y))); constraint r in -by..by; } in aux_int_division_modulo(x,y,q,r); predicate aux_int_division_modulo(var int: x, var int: y, var int: q, var int: r) = x = y * q + r /\ let { array[1..2] of var 0..1: p } in % 0 < x -> 0 <= r which is 0 >= x \/ 0 <= r aux_int_le_if_1(x, 0, p[1]) /\ aux_int_ge_if_0(r, 0, p[1]) /\ % x < 0 -> r <= 0 which is x >= 0 \/ r <= 0 aux_int_ge_if_1(x, 0, p[2]) /\ aux_int_le_if_0(r, 0, p[2]) /\ % abs(r) < abs(y) let { var 1.. max(abs(lb(y)), abs(ub(y))): w = abs(y) } in w > r /\ w > -r; predicate int_times(var int: x, var int: y, var int: z) = if card(dom(x)) > card(dom(y)) then int_times(y,x,z) else let { set of int: s = lb(x)..ub(x), set of int: r = {lb(x)*lb(y), lb(x)*ub(y), ub(x)*lb(y), ub(x)*ub(y)}, array[s] of var min(r)..max(r): ady = array1d(s, [ d*y | d in s ]) } in ady[x] = z endif; %-----------------------------------------------------------------------------% % Array 'element' constraints predicate array_bool_element(var int: x, array[int] of bool: a, var bool: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_var_bool_element(var int: x, array[int] of var bool: a, var bool: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_int_element(var int: x, array[int] of int: a, var int: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_var_int_element(var int: x, array[int] of var int: a, var int: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_float_element(var int: x, array[int] of float: a, var float: z) = let { set of int: ix = index_set(a), array[ix] of var 0..1: x_eq_d } in sum(i in ix)( x_eq_d[i] ) = 1 /\ sum(i in ix)( i * x_eq_d[i] ) = x /\ sum(i in ix)( a[i] * int2float(x_eq_d[i]) ) = z; predicate array_var_float_element(var int: x, array[int] of var float: a, var float: z) = let { set of int: ix = index_set(a), array[ix] of var 0..1: x_eq_d } in sum(i in ix)( x_eq_d[i] ) = 1 /\ sum(i in ix)( i * x_eq_d[i] ) = x /\ forall(i in ix)( % x_eq_d[i] -> a[i] = a2[i] a[i] - z >= (lb(a[i])-ub(z))*int2float(1-x_eq_d[i]) /\ z - a[i] >= (lb(z)-ub(a[i]))*int2float(1-x_eq_d[i]) ); %-----------------------------------------------------------------------------% % Domain constraints % XXX only for a fixed set predicate set_in(var int: x, set of int: s) = if s = min(s)..max(s) then min(s) <= x /\ x <= max(s) else exists(e in s)( x = e ) endif; % XXX only for a fixed set predicate set_in_reif(var int: x, set of int: s, var bool: b) = b <-> exists(i in 1..length([ 0 | e in s where not (e - 1 in s) ]))( let { int: l = [ e | e in s where not (e - 1 in s) ][i], int: r = [ e | e in s where not (e + 1 in s) ][i] } in l <= x /\ x <= r ); % Alternative predicate alt_set_in_reif(var int: x, set of int: s, var bool: b) = b <-> if s = min(s)..max(s) then min(s) <= x /\ x <= max(s) else exists(e in s)( x = e ) endif; %-----------------------------------------------------------------------------% % Auxiliary: equality reified onto a 0/1 variable predicate aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q_458 } in aux_int_lt_if_0(x - p, y, q_458[1]) /\ aux_int_gt_if_0(x + p, y, q_458[2]) /\ sum(q_458) <= 2 - 2*p /\ sum(q_458) <= 1 + p; % Alternative 1 predicate alt_1_aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q } in aux_int_lt_if_0(x - p, y, q[1]) /\ aux_int_gt_if_0(x + p, y, q[2]) /\ q[1] <= 1 - p /\ q[2] <= 1 - p /\ sum(q) <= 1 + p; % Alternative 2 predicate alt_2_aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q } in aux_int_le_if_1(x, y, p) /\ aux_int_ge_if_1(x, y, p) /\ aux_int_lt_if_0(x, y, q[1]) /\ aux_int_gt_if_0(x, y, q[2]) /\ sum(q) <= p + 1; predicate aux_float_eq_iff_1(var float: x, var float: y, var float: p) = let { array[1..2] of var 0..1: q } in aux_float_le_if_1(x, y, p) /\ aux_float_ge_if_1(x, y, p) /\ aux_float_lt_if_0(x, y, int2float(q[1])) /\ aux_float_gt_if_0(x, y, int2float(q[2])) /\ int2float(sum(q)) <= 1.0 + p; %-----------------------------------------------------------------------------% % Auxiliary: indicator constraints % p -> x # 0 where p is a 0/1 variable and # is a comparison % Base cases predicate aux_int_le_zero_if_0(var int: x, var int: p) = x <= ub(x) * p; predicate aux_float_le_zero_if_0(var float: x, var float: p) = x <= ub(x) * p; predicate aux_float_lt_zero_if_0(var float: x, var float: p) = let { float: rho = 1e-02 * abs(ub(x)) } % same order of magnitude as ub(x) in x < (ub(x) + rho) * p; % Derived cases predicate aux_int_le_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, p); predicate aux_int_ge_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, p); predicate aux_int_le_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, 1 - p); predicate aux_int_ge_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, 1 - p); predicate aux_int_lt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, p); predicate aux_int_gt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x + 1, p); predicate aux_int_lt_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, 1 - p); predicate aux_float_le_if_0(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(x - y, p); predicate aux_float_ge_if_0(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(y - x, p); predicate aux_float_le_if_1(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(x - y, 1.0 - p); predicate aux_float_ge_if_1(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(y - x, 1.0 - p); predicate aux_float_lt_if_0(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(x - y, p); predicate aux_float_gt_if_0(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(y - x, p); predicate aux_float_lt_if_1(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(x - y, 1.0 - p); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% annotation bool_search(array[int] of var bool: x, ann:a1, ann:a2, ann:a3) = int_search([bool2int(x[i]) | i in index_set(x)],a1,a2,a3); predicate array_int_maximum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_float_maximum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_int_minimum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); predicate array_float_minimum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); mzn_opt_only_range_domains = true; libminizinc-2.5.3/share/minizinc/linear_old/linear/0000755000175000017500000000000013757304533021004 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/linear_old/linear/redefinitions.mzn0000644000175000017500000004511213757304533024377 0ustar kaolkaol%-----------------------------------------------------------------------------% % FlatZinc built-in redefinitions for linear solvers. % % Sebastian Brand % Gleb Belov Corrected array_var_float_element and float_lin_lt_reif %-----------------------------------------------------------------------------% function var bool: reverse_map(var int: x) = (x==1); function bool: reverse_map(int: x) = (x==1); function var int: bool2int(var bool: x) :: promise_total = let { var 0..1: b2i; constraint (x = reverse_map(b2i)) ::is_reverse_map ; } in b2i; predicate bool_eq(var bool: x, var bool: y) = bool2int(x)==bool2int(y); %-----------------------------------------------------------------------------% % Strict inequality % % Uncomment the following redefinition for FlatZinc MIP solver interfaces that % do not support strict inequality. Note that it does not preserve equivalence % (some solutions of the original problem may become invalid). % predicate float_lt(var float: x, var float: y) = x + 1e-06 <= y; %-----------------------------------------------------------------------------% % % Logic operations % %-----------------------------------------------------------------------------% predicate bool_not(var bool: p, var bool: q) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q) } in x + y = 1; predicate bool_and(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y <= z + 1 /\ x + y >= z * 2; % x >= z /\ y >= z; % alternative predicate bool_or(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y >= z /\ x + y <= z * 2; % x <= z /\ y <= z; % alternative predicate bool_xor(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x <= y + z /\ y <= x + z /\ z <= x + y /\ x + y + z <= 2; predicate bool_eq_reif(var bool: p, var bool: q, var bool: r) = if is_fixed(q) then % frequent case if fix(q) = true then p = r else bool_not(p,r) endif else let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in x + y <= z + 1 /\ x + z <= y + 1 /\ y + z <= x + 1 /\ x + y + z >= 1 endif; predicate bool_ne_reif(var bool: p, var bool: q, var bool: r) = bool_xor(p, q, r); predicate bool_le(var bool: p, var bool: q) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q) } in x <= y; predicate bool_le_reif(var bool: p, var bool: q, var bool: r) = let { var 0..1: x = bool2int(p), var 0..1: y = bool2int(q), var 0..1: z = bool2int(r) } in 1 - x + y >= z /\ 1 - x + y <= z * 2; % 1 - x <= z /\ y <= z; % alternative predicate bool_lt(var bool: p, var bool: q) = not p /\ q; predicate bool_lt_reif(var bool: p, var bool: q, var bool: r) = (not p /\ q) <-> r; %-----------------------------------------------------------------------------% predicate array_bool_or(array[int] of var bool: a, var bool: b) = if is_fixed(b) then % frequent case if fix(b) = true then sum(i in index_set(a))( bool2int(a[i]) ) >= 1 else forall(i in index_set(a))( not a[i] ) endif else let { var 0..1: x = bool2int(b), array[1..length(a)] of var 0..1: c = [ bool2int(a[i]) | i in index_set(a) ] } in sum(c) >= x /\ sum(c) <= x * length(a) endif; predicate array_bool_and(array[int] of var bool: a, var bool: b) = let { var 0..1: x = bool2int(b), array[1..length(a)] of var 0..1: c = [ bool2int(a[i]) | i in index_set(a) ] } in length(a) - sum(c) >= 1 - x /\ length(a) - sum(c) <= (1 - x) * length(a); predicate array_bool_xor(array[int] of var bool: a) = let { var 0..length(a): m } in sum(i in 1..length(a))( bool2int(a[i]) ) = 1 + 2 * m; predicate bool_clause(array[int] of var bool: p, array[int] of var bool: n) = sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1; % predicate array_bool_xor(array[int] of var bool: a) = .. sum(a) is odd .. %-----------------------------------------------------------------------------% % % Linear equations and inequations % %-----------------------------------------------------------------------------% predicate int_le_reif(var int: x, var int: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_int_le_if_1(x, y, p) /\ aux_int_gt_if_0(x, y, p); predicate int_lt_reif(var int: x, var int: y, var bool: b) = int_le_reif(x, y - 1, b); predicate int_ne(var int: x, var int: y) = let { var 0..1: p } in aux_int_lt_if_1(x, y, p) /\ aux_int_gt_if_0(x, y, p); predicate int_lin_ne(array[int] of int: c, array[int] of var int: x, int: d) = int_ne(sum(i in index_set(x))( c[i]*x[i] ),d); predicate int_eq_reif(var int: x, var int: y, var bool: b) = aux_int_eq_iff_1(x, y, bool2int(b)); predicate int_ne_reif(var int: x, var int: y, var bool: b) = aux_int_eq_iff_1(x, y, 1 - bool2int(b)); %-----------------------------------------------------------------------------% predicate int_lin_eq_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = aux_int_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, bool2int(b)); predicate int_lin_ne_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = aux_int_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, 1 - bool2int(b)); predicate int_lin_le_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_int_le_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_int_gt_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); predicate int_lin_lt_reif(array[int] of int: c, array[int] of var int: x, int: d, var bool: b) = int_lin_le_reif(c, x, d - 1, b); %-----------------------------------------------------------------------------% predicate float_le_reif(var float: x, var float: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_float_le_if_1(x, y, int2float(p)) /\ aux_float_gt_if_0(x, y, int2float(p)); predicate float_lt_reif(var float: x, var float: y, var bool: b) = let { var 0..1: p = bool2int(b) } in aux_float_lt_if_1(x, y, int2float(p)) /\ aux_float_ge_if_0(x, y, int2float(p)); predicate float_ne(var float: x, var float: y) = let { var 0..1: p } in aux_float_lt_if_1(x, y, int2float(p)) /\ aux_float_gt_if_0(x, y, int2float(p)); predicate float_eq_reif(var float: x, var float: y, var bool: b) = aux_float_eq_iff_1(x, y, int2float(bool2int(b))); predicate float_ne_reif(var float: x, var float: y, var bool: b) = aux_float_eq_iff_1(x, y, 1.0 - int2float(bool2int(b))); %-----------------------------------------------------------------------------% predicate float_lin_eq_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, int2float(bool2int(b))); predicate float_lin_ne_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = aux_float_eq_iff_1(sum(i in index_set(x))( c[i]*x[i] ), d, 1.0 - int2float(bool2int(b))); predicate float_lin_le_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = let { var 0.0..1.0: p = int2float(bool2int(b)) } in aux_float_le_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_float_gt_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); predicate float_lin_lt_reif(array[int] of float: c, array[int] of var float: x, float: d, var bool: b) = let { var 0.0..1.0: p = int2float(bool2int(b)) } in aux_float_lt_if_1(sum(i in index_set(x))( c[i] * x[i] ), d, p) /\ aux_float_ge_if_0(sum(i in index_set(x))( c[i] * x[i] ), d, p); %-----------------------------------------------------------------------------% % Minimum, maximum, absolute value predicate int_abs(var int: x, var int: z) = let { var 0..1: p } in % z <= x \/ z <= -x aux_int_le_if_1(z, x, p) /\ aux_int_le_if_0(z, -x, p) /\ z >= x /\ z >= -x /\ z >= 0; predicate int_min(var int: x, var int: y, var int: z) = let { var 0..1: p } in % z >= x \/ z >= y aux_int_ge_if_1(z, x, p) /\ aux_int_ge_if_0(z, y, p) /\ z <= x /\ z <= y; predicate int_max(var int: x, var int: y, var int: z) = let { var 0..1: p } in % z <= x \/ z <= y aux_int_le_if_1(z, x, p) /\ aux_int_le_if_0(z, y, p) /\ z >= x /\ z >= y; predicate float_abs(var float: x, var float: z) = let { var 0..1: p } in % z <= x \/ z <= -x aux_float_le_if_1(z, x, int2float(p)) /\ aux_float_le_if_0(z, -x, int2float(p)) /\ z >= x /\ z >= -x /\ z >= 0.0; predicate float_min(var float: x, var float: y, var float: z) = let { var 0..1: p } in % z >= x \/ z >= y aux_float_ge_if_1(z, x, int2float(p)) /\ aux_float_ge_if_0(z, y, int2float(p)) /\ z <= x /\ z <= y; predicate float_max(var float: x, var float: y, var float: z) = let { var 0..1: p } in % z <= x \/ z <= y aux_float_le_if_1(z, x, int2float(p)) /\ aux_float_le_if_0(z, y, int2float(p)) /\ z >= x /\ z >= y; %-----------------------------------------------------------------------------% % Multiplication and division predicate int_div(var int: x, var int: y, var int: q) = let { var 0..max(abs(lb(y)), abs(ub(y))) - 1: r } in aux_int_division_modulo(x,y,q,r); predicate int_mod(var int: x, var int: y, var int: r) = let { int: bx = max(abs(lb(x)), abs(ub(x))); var -bx..bx: q; int: by = max(abs(lb(y)), abs(ub(y))); constraint r in -by..by; } in aux_int_division_modulo(x,y,q,r); predicate aux_int_division_modulo(var int: x, var int: y, var int: q, var int: r) = x = y * q + r /\ let { array[1..2] of var 0..1: p } in % 0 < x -> 0 <= r which is 0 >= x \/ 0 <= r aux_int_le_if_1(x, 0, p[1]) /\ aux_int_ge_if_0(r, 0, p[1]) /\ % x < 0 -> r <= 0 which is x >= 0 \/ r <= 0 aux_int_ge_if_1(x, 0, p[2]) /\ aux_int_le_if_0(r, 0, p[2]) /\ % abs(r) < abs(y) let { var 1.. max(abs(lb(y)), abs(ub(y))): w = abs(y) } in w > r /\ w > -r; predicate int_times(var int: x, var int: y, var int: z) = if card(dom(x)) > card(dom(y)) then int_times(y,x,z) else let { set of int: s = lb(x)..ub(x), set of int: r = {lb(x)*lb(y), lb(x)*ub(y), ub(x)*lb(y), ub(x)*ub(y)}, array[s] of var min(r)..max(r): ady = array1d(s, [ d*y | d in s ]) } in ady[x] = z endif; %-----------------------------------------------------------------------------% % Array 'element' constraints predicate array_bool_element(var int: x, array[int] of bool: a, var bool: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_var_bool_element(var int: x, array[int] of var bool: a, var bool: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_int_element(var int: x, array[int] of int: a, var int: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_var_int_element(var int: x, array[int] of var int: a, var int: z) = x in index_set(a) /\ forall(d in index_set(a))( x = d -> a[d] = z ); predicate array_float_element(var int: x, array[int] of float: a, var float: z) = let { set of int: ix = index_set(a), array[ix] of var 0..1: x_eq_d } in sum(i in ix)( x_eq_d[i] ) = 1 /\ sum(i in ix)( i * x_eq_d[i] ) = x /\ sum(i in ix)( a[i] * int2float(x_eq_d[i]) ) = z; predicate array_var_float_element(var int: x, array[int] of var float: a, var float: z) = let { set of int: ix = index_set(a), array[ix] of var 0..1: x_eq_d } in sum(i in ix)( x_eq_d[i] ) = 1 /\ sum(i in ix)( i * x_eq_d[i] ) = x /\ forall(i in ix)( % x_eq_d[i] -> a[i] = a2[i] a[i] - z >= (lb(a[i])-ub(z))*int2float(1-x_eq_d[i]) /\ z - a[i] >= (lb(z)-ub(a[i]))*int2float(1-x_eq_d[i]) ); %-----------------------------------------------------------------------------% % Domain constraints % XXX only for a fixed set predicate set_in(var int: x, set of int: s) = if s = min(s)..max(s) then min(s) <= x /\ x <= max(s) else exists(e in s)( x = e ) endif; % XXX only for a fixed set predicate set_in_reif(var int: x, set of int: s, var bool: b) = b <-> exists(i in 1..length([ 0 | e in s where not (e - 1 in s) ]))( let { int: l = [ e | e in s where not (e - 1 in s) ][i], int: r = [ e | e in s where not (e + 1 in s) ][i] } in l <= x /\ x <= r ); % Alternative predicate alt_set_in_reif(var int: x, set of int: s, var bool: b) = b <-> if s = min(s)..max(s) then min(s) <= x /\ x <= max(s) else exists(e in s)( x = e ) endif; %-----------------------------------------------------------------------------% % Auxiliary: equality reified onto a 0/1 variable predicate aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q_458 } in aux_int_lt_if_0(x - p, y, q_458[1]) /\ aux_int_gt_if_0(x + p, y, q_458[2]) /\ sum(q_458) <= 2 - 2*p /\ sum(q_458) <= 1 + p; % Alternative 1 predicate alt_1_aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q } in aux_int_lt_if_0(x - p, y, q[1]) /\ aux_int_gt_if_0(x + p, y, q[2]) /\ q[1] <= 1 - p /\ q[2] <= 1 - p /\ sum(q) <= 1 + p; % Alternative 2 predicate alt_2_aux_int_eq_iff_1(var int: x, var int: y, var int: p) = let { array[1..2] of var 0..1: q } in aux_int_le_if_1(x, y, p) /\ aux_int_ge_if_1(x, y, p) /\ aux_int_lt_if_0(x, y, q[1]) /\ aux_int_gt_if_0(x, y, q[2]) /\ sum(q) <= p + 1; predicate aux_float_eq_iff_1(var float: x, var float: y, var float: p) = let { array[1..2] of var 0..1: q } in aux_float_le_if_1(x, y, p) /\ aux_float_ge_if_1(x, y, p) /\ aux_float_lt_if_0(x, y, int2float(q[1])) /\ aux_float_gt_if_0(x, y, int2float(q[2])) /\ int2float(sum(q)) <= 1.0 + p; %-----------------------------------------------------------------------------% % Auxiliary: indicator constraints % p -> x # 0 where p is a 0/1 variable and # is a comparison % Base cases predicate aux_int_le_zero_if_0(var int: x, var int: p) = x <= ub(x) * p; predicate aux_float_le_zero_if_0(var float: x, var float: p) = x <= ub(x) * p; predicate aux_float_lt_zero_if_0(var float: x, var float: p) = let { float: rho = 1e-02 * abs(ub(x)) } % same order of magnitude as ub(x) in x < (ub(x) + rho) * p; % Derived cases predicate aux_int_le_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, p); predicate aux_int_ge_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, p); predicate aux_int_le_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y, 1 - p); predicate aux_int_ge_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x, 1 - p); predicate aux_int_lt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, p); predicate aux_int_gt_if_0(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(y - x + 1, p); predicate aux_int_lt_if_1(var int: x, var int: y, var int: p) = aux_int_le_zero_if_0(x - y + 1, 1 - p); predicate aux_float_le_if_0(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(x - y, p); predicate aux_float_ge_if_0(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(y - x, p); predicate aux_float_le_if_1(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(x - y, 1.0 - p); predicate aux_float_ge_if_1(var float: x, var float: y, var float: p) = aux_float_le_zero_if_0(y - x, 1.0 - p); predicate aux_float_lt_if_0(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(x - y, p); predicate aux_float_gt_if_0(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(y - x, p); predicate aux_float_lt_if_1(var float: x, var float: y, var float: p) = aux_float_lt_zero_if_0(x - y, 1.0 - p); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% annotation bool_search(array[int] of var bool: x, ann:a1, ann:a2, ann:a3) = int_search([bool2int(x[i]) | i in index_set(x)],a1,a2,a3); predicate array_int_maximum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_float_maximum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_int_minimum(var int: m, array[int] of var int: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), int: ly = lb_array(x), int: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); predicate array_float_minimum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); mzn_opt_only_range_domains = true; libminizinc-2.5.3/share/minizinc/linear_old/linear/domain_encodings.mzn0000644000175000017500000000415313757304533025035 0ustar kaolkaol%-----------------------------------------------------------------------------% % Domain encodings %-----------------------------------------------------------------------------% % Linear equality encoding % Single variable: x = d <-> x_eq_d[d] predicate equality_encoding(var int: x, array[int] of var 0..1: x_eq_d) = x in index_set(x_eq_d) /\ sum(d in dom(x))( x_eq_d[d] ) = 1 /\ sum(d in dom(x))( d * x_eq_d[d] ) = x; % Array of variables: x[i] = d <-> x_eq_d[i,d] predicate equality_encoding(array[int] of var int: x, array[int, int] of var 0..1: x_eq_d) = forall(i in index_set(x))( x[i] in index_set_2of2(x_eq_d) /\ sum(d in index_set_2of2(x_eq_d))( x_eq_d[i,d] ) = 1 /\ sum(d in index_set_2of2(x_eq_d))( d * x_eq_d[i,d] ) = x[i] ); function var int: eq_new_var(var int: x, int: i) = if i in dom(x) then let { var 0..1: xi; } in xi else 0 endif; function array[int] of var 0..1: eq_encode(var int: x) ::promise_total = let { array[int] of var 0..1: y = array1d(lb(x)..ub(x),[eq_new_var(x,i) | i in lb(x)..ub(x)]); constraint equality_encoding(x,y); } in y; function array[int] of int: eq_encode(int: x) ::promise_total = array1d(lb(x)..ub(x),[ if i=x then 1 else 0 endif | i in lb(x)..ub(x)]); function array[int,int] of var int: eq_encode(array[int] of var int: x) ::promise_total = let { array[index_set(x),lb_array(x)..ub_array(x)] of var 0..1: y = array2d(index_set(x),lb_array(x)..ub_array(x), [ let { array[int] of var int: xi = eq_encode(x[i]) } in if j in index_set(xi) then xi[j] else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)] ) } in y; function array[int,int] of int: eq_encode(array[int] of int: x) ::promise_total = array2d(index_set(x),lb_array(x)..ub_array(x),[ if j=x[i] then 1 else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)]); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/linear/inverse.mzn0000644000175000017500000000132413757304533023205 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains two arrays of int variables to represent inverse functions. % All the values in each array must be within the index set of the other array. % % Linear version. %-----------------------------------------------------------------------------% include "domain_encodings.mzn"; predicate inverse(array[int] of var int: f, array[int] of var int: g) = let { array[int,int] of var 0..1: map_f = eq_encode(f); array[int,int] of var 0..1: map_g = eq_encode(g); } in forall (i in index_set(f), j in index_set(g)) (map_f[i,j] = map_g[j,i]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/linear/all_different_int.mzn0000644000175000017500000000132113757304533025177 0ustar kaolkaol%-----------------------------------------------------------------------------% % 'all_different' constrains an array of objects to be all different. % % Linear version: equality encoding; see e.g. [Refalo, CP 2000] % % For a given d in dom(x), at most one i with x_i = d can exist. %-----------------------------------------------------------------------------% include "domain_encodings.mzn"; predicate all_different_int(array[int] of var int: x) = let { array[int,int] of var 0..1: x_eq_d = eq_encode(x) } in ( forall(d in index_set_2of2(x_eq_d))( sum(i in index_set_1of2(x_eq_d))( x_eq_d[i,d] ) <= 1 ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/linear/redefinitions-2.0.mzn0000644000175000017500000000035613757304533024675 0ustar kaolkaolpredicate bool_clause_reif(array[int] of var bool: p, array[int] of var bool: n, var bool: c) = c = ( sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1 ); libminizinc-2.5.3/share/minizinc/linear_old/linear/redefinitions-2.0.2.mzn0000644000175000017500000000147113757304533025034 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.0.2 % that can be overridden by solvers. predicate symmetry_breaking_constraint(var bool: b) = b; predicate redundant_constraint(var bool: b) = b; %% Linearized element: just call without shifting predicate array_var_bool_element_nonshifted(var int: idx, array[int] of var bool: x, var bool: c) = array_var_bool_element(idx,x,c); predicate array_var_int_element_nonshifted(var int: idx, array[int] of var int: x, var int: c) = array_var_int_element(idx,x,c); predicate array_var_float_element_nonshifted(var int: idx, array[int] of var float: x, var float: c) = array_var_float_element(idx,x,c); predicate array_var_set_element_nonshifted(var int: idx, array[int] of var set of int: x, var set of int: c) = array_var_set_element(idx,x,c); libminizinc-2.5.3/share/minizinc/linear_old/linear/table_int.mzn0000644000175000017500000000160613757304533023476 0ustar kaolkaol%-----------------------------------------------------------------------------% % A 'table' constraint table(x, T) represents the constraint x in T where we % consider each row in T to be a tuple and T as a set of tuples. % % Linear version. % % See also the equality encoding of the 'element' constraint. %-----------------------------------------------------------------------------% predicate table_int(array[int] of var int: x, array[int, int] of int: t) = assert(index_set_2of2(t) = index_set(x), "The second dimension of the table must equal the number of " ++ "variables in the first argument", let { set of int: it = index_set_1of2(t), array[it] of var 0..1: lambda } in sum(lambda) = 1 /\ forall(j in index_set(x))( sum(i in it)( t[i,j]*lambda[i] ) = x[j] ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/domain_encodings.mzn0000644000175000017500000000415313757304533023563 0ustar kaolkaol%-----------------------------------------------------------------------------% % Domain encodings %-----------------------------------------------------------------------------% % Linear equality encoding % Single variable: x = d <-> x_eq_d[d] predicate equality_encoding(var int: x, array[int] of var 0..1: x_eq_d) = x in index_set(x_eq_d) /\ sum(d in dom(x))( x_eq_d[d] ) = 1 /\ sum(d in dom(x))( d * x_eq_d[d] ) = x; % Array of variables: x[i] = d <-> x_eq_d[i,d] predicate equality_encoding(array[int] of var int: x, array[int, int] of var 0..1: x_eq_d) = forall(i in index_set(x))( x[i] in index_set_2of2(x_eq_d) /\ sum(d in index_set_2of2(x_eq_d))( x_eq_d[i,d] ) = 1 /\ sum(d in index_set_2of2(x_eq_d))( d * x_eq_d[i,d] ) = x[i] ); function var int: eq_new_var(var int: x, int: i) = if i in dom(x) then let { var 0..1: xi; } in xi else 0 endif; function array[int] of var 0..1: eq_encode(var int: x) ::promise_total = let { array[int] of var 0..1: y = array1d(lb(x)..ub(x),[eq_new_var(x,i) | i in lb(x)..ub(x)]); constraint equality_encoding(x,y); } in y; function array[int] of int: eq_encode(int: x) ::promise_total = array1d(lb(x)..ub(x),[ if i=x then 1 else 0 endif | i in lb(x)..ub(x)]); function array[int,int] of var int: eq_encode(array[int] of var int: x) ::promise_total = let { array[index_set(x),lb_array(x)..ub_array(x)] of var 0..1: y = array2d(index_set(x),lb_array(x)..ub_array(x), [ let { array[int] of var int: xi = eq_encode(x[i]) } in if j in index_set(xi) then xi[j] else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)] ) } in y; function array[int,int] of int: eq_encode(array[int] of int: x) ::promise_total = array2d(index_set(x),lb_array(x)..ub_array(x),[ if j=x[i] then 1 else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)]); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/inverse.mzn0000644000175000017500000000132413757304533021733 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains two arrays of int variables to represent inverse functions. % All the values in each array must be within the index set of the other array. % % Linear version. %-----------------------------------------------------------------------------% include "domain_encodings.mzn"; predicate inverse(array[int] of var int: f, array[int] of var int: g) = let { array[int,int] of var 0..1: map_f = eq_encode(f); array[int,int] of var 0..1: map_g = eq_encode(g); } in forall (i in index_set(f), j in index_set(g)) (map_f[i,j] = map_g[j,i]); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/all_different_int.mzn0000644000175000017500000000132113757304533023725 0ustar kaolkaol%-----------------------------------------------------------------------------% % 'all_different' constrains an array of objects to be all different. % % Linear version: equality encoding; see e.g. [Refalo, CP 2000] % % For a given d in dom(x), at most one i with x_i = d can exist. %-----------------------------------------------------------------------------% include "domain_encodings.mzn"; predicate all_different_int(array[int] of var int: x) = let { array[int,int] of var 0..1: x_eq_d = eq_encode(x) } in ( forall(d in index_set_2of2(x_eq_d))( sum(i in index_set_1of2(x_eq_d))( x_eq_d[i,d] ) <= 1 ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/linear_old/redefinitions-2.0.mzn0000644000175000017500000000035613757304533023423 0ustar kaolkaolpredicate bool_clause_reif(array[int] of var bool: p, array[int] of var bool: n, var bool: c) = c = ( sum(i in index_set(p))( bool2int(p[i]) ) - sum(i in index_set(n))( bool2int(n[i]) ) + length(n) >= 1 ); libminizinc-2.5.3/share/minizinc/linear_old/redefinitions-2.0.2.mzn0000644000175000017500000000147113757304533023562 0ustar kaolkaol% This file contains redefinitions of standard builtins for version 2.0.2 % that can be overridden by solvers. predicate symmetry_breaking_constraint(var bool: b) = b; predicate redundant_constraint(var bool: b) = b; %% Linearized element: just call without shifting predicate array_var_bool_element_nonshifted(var int: idx, array[int] of var bool: x, var bool: c) = array_var_bool_element(idx,x,c); predicate array_var_int_element_nonshifted(var int: idx, array[int] of var int: x, var int: c) = array_var_int_element(idx,x,c); predicate array_var_float_element_nonshifted(var int: idx, array[int] of var float: x, var float: c) = array_var_float_element(idx,x,c); predicate array_var_set_element_nonshifted(var int: idx, array[int] of var set of int: x, var set of int: c) = array_var_set_element(idx,x,c); libminizinc-2.5.3/share/minizinc/linear_old/table_int.mzn0000644000175000017500000000160613757304533022224 0ustar kaolkaol%-----------------------------------------------------------------------------% % A 'table' constraint table(x, T) represents the constraint x in T where we % consider each row in T to be a tuple and T as a set of tuples. % % Linear version. % % See also the equality encoding of the 'element' constraint. %-----------------------------------------------------------------------------% predicate table_int(array[int] of var int: x, array[int, int] of int: t) = assert(index_set_2of2(t) = index_set(x), "The second dimension of the table must equal the number of " ++ "variables in the first argument", let { set of int: it = index_set_1of2(t), array[it] of var 0..1: lambda } in sum(lambda) = 1 /\ forall(j in index_set(x))( sum(i in it)( t[i,j]*lambda[i] ) = x[j] ) ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/g12_fd/0000755000175000017500000000000013757304533016464 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/g12_fd/all_different_int.mzn0000644000175000017500000000173713757304533022672 0ustar kaolkaol%-----------------------------------------------------------------------------% % Constrains the array of objects 'x' to be all different. %-----------------------------------------------------------------------------% predicate all_different_int(array[int] of var int: x) = g12fd_int_all_different(x); %-----------------------------------------------------------------------------% % The implementation of the all_different constraint in the G12/FD solver. % This should not be called directly, instead the definition above should % be used. predicate g12fd_int_all_different(array[int] of var int: x); % G12/FD doesn't provide a reified all_different so we use the following % definition if g12fd_int_all_different is called from a reified context. % predicate g12fd_int_all_different_reif(array[int] of var int: x, var bool: r) = r <-> forall(i,j in index_set(x) where i < j) ( x[i] != x[j] ); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/g12_fd/cumulative.mzn0000644000175000017500000000316213757304533021372 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that a set of tasks given by start times 's', durations 'd', and % resource requirements 'r', never require more than a global resource bound % 'b' at any one time. % Assumptions: % - forall i, d[i] >= 0 and r[i] >= 0 %-----------------------------------------------------------------------------% predicate cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = assert(index_set(s) == index_set(d) /\ index_set(s) == index_set(r), "cumulative: the 3 array arguments must have identical index sets", assert(lb_array(d) >= 0 /\ lb_array(r) >= 0, "cumulative: durations and resource usages must be non-negative", g12fd_cumulative(s, d, r, b))); %-----------------------------------------------------------------------------% % Optional parameters that can be used with the built-in G12/FD cumulative % constraint. % annotation energy_feasibility_check; annotation edge_finding_filtering; annotation ext_edge_finding_filtering; annotation histogram_filtering; annotation idempotent; %-----------------------------------------------------------------------------% % The implementation of the cumulative constraint in the G12/FD solver. % This should not be called directly, instead the definition above should % be used. predicate g12fd_cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b); %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/g12_fd/global_cardinality_low_up.mzn0000644000175000017500000000231113757304533024417 0ustar kaolkaol%-----------------------------------------------------------------------------% % Requires that for all 'i', the value 'cover[i]' appears at least 'lbound[i]' % and at most 'ubound[i]' times in the array 'x'. %-----------------------------------------------------------------------------% predicate global_cardinality_low_up(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound) = g12fd_global_cardinality_open(x, cover, lbound, ubound); %-----------------------------------------------------------------------------% % The implementation in the G12/FD solver. This should not be called directly; % instead the definition above should be used. predicate g12fd_global_cardinality_open(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound); %-----------------------------------------------------------------------------% %-----------------------------------------------------------------------------% libminizinc-2.5.3/share/minizinc/gecode_presolver/0000755000175000017500000000000013757304533020751 5ustar kaolkaollibminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_count_eq_reif.mzn0000644000175000017500000000322513757304533025200 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-08-14 10:15:14 +1000 (Tue, 14 Aug 2012) $ by $Author: tack $ % $Revision: 12979 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_count_reif(array[int] of var int: x, var int: y, var int: c, var bool: b); predicate fzn_count_eq_reif(array[int] of var int: x, var int: y, var int: c, var bool: b) = gecode_count_reif(x, y, c, b); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_int_set_channel.mzn0000644000175000017500000000377113757304533025521 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_int_set_channel(array[int] of var int: x, int: xoff, array[int] of var set of int: y, int: yoff); predicate fzn_int_set_channel(array[int] of var int: x, array[int] of var set of int: y) = if (min(index_set(x)) < 0 \/ min(index_set(y)) < 0) then forall(i in index_set(x)) (x[i] in index_set(y)) /\ forall(j in index_set(y)) (y[j] subset index_set(x)) /\ forall(i in index_set(x), j in index_set(y)) (x[i]=j <-> i in y[j]) else gecode_int_set_channel(x,min(index_set(x)),y,min(index_set(y))) endif; libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_bin_packing_capa.mzn0000644000175000017500000000340213757304533025603 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2010 % % Last modified: % $Date: 2013-07-19 10:50:31 +1000 (Fri, 19 Jul 2013) $ by $Author: tack $ % $Revision: 13902 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % include "bin_packing_load.mzn"; predicate fzn_bin_packing_capa(array[int] of int: c, array[int] of var int: bin, array[int] of int: w) = let { array[min(index_set(c))..max(index_set(c))] of var 0..ub_array(c): l } in ( forall( i in index_set(l) ) ( l[i] <= c[i] ) /\ bin_packing_load(l,bin,w) ); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_sum_pred.mzn0000644000175000017500000000325213757304533024174 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_set_weights(array[int] of int: csi,array[int] of int: cs, var set of int: x, var int: y); predicate fzn_sum_pred(var int: i, array[int] of set of int: sets, array[int] of int: cs, var int: s) = gecode_set_weights([j|j in index_set(cs)],cs,sets[i],s); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_value_precede_set.mzn0000644000175000017500000000310513757304533026031 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2013-07-19 22:10:52 +1000 (Fri, 19 Jul 2013) $ by $Author: schulte $ % $Revision: 13911 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_precede_set(array[int] of var set of int: x, int: s, int: t); predicate fzn_value_precede_set(int: s, int: t, array[int] of var set of int: x) = gecode_precede_set(x,s,t); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_regular.mzn0000644000175000017500000000301113757304533024010 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_regular(array[int] of var int: x, int: Q, int: S, array[int,int] of int: d, int: q0, set of int: F); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_bin_packing_load.mzn0000644000175000017500000000350213757304533025617 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2010 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_bin_packing_load(array[int] of var int: l, array[int] of var int: bin, array[int] of int: w, int: minIndex); predicate fzn_bin_packing_load(array[int] of var int: l, array[int] of var int: bin, array[int] of int: w) = gecode_bin_packing_load(l,bin,w,min(index_set(l))); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_lex_lesseq_bool.mzn0000644000175000017500000000321313757304533025532 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-04-11 14:59:27 +1000 (Wed, 11 Apr 2012) $ by $Author: tack $ % $Revision: 12730 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_array_bool_lq(array[int] of var bool: x, array[int] of var bool: y); predicate fzn_lex_lesseq_bool(array[int] of var bool: x, array[int] of var bool: y) = gecode_array_bool_lq(x,y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_lex_less_int.mzn0000644000175000017500000000320013757304533025037 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_array_int_lt(array[int] of var int: x, array[int] of var int: y); predicate fzn_lex_less_int(array[int] of var int: x, array[int] of var int: y) = gecode_array_int_lt(x,y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_at_least_set.mzn0000644000175000017500000000301613757304533025023 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_at_least_set(int: n, array[int] of var set of int: x, set of int: v) = bool_sum_ge([x[i] == v | i in index_set(x)], n); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_count_eq.mzn0000644000175000017500000000306113757304533024171 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-08-14 10:15:14 +1000 (Tue, 14 Aug 2012) $ by $Author: tack $ % $Revision: 12979 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_count(array[int] of var int: x, var int: y, var int: c); predicate fzn_count_eq(array[int] of var int: x, var int: y, var int: c) = gecode_count(x, y, c); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_increasing_bool.mzn0000644000175000017500000000267613757304533025524 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_increasing_bool(array[int] of var bool: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/redefinitions.mzn0000644000175000017500000000604613757304533024347 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-04-06 16:43:44 +1000 (Fri, 06 Apr 2012) $ by $Author: tack $ % $Revision: 12706 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % % Sums over Boolean variables predicate bool_lin_eq(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_lin_ne(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_lin_le(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_lin_lt(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_lin_ge(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_lin_gt(array[int] of int: a, array[int] of var bool: x, var int: c); predicate bool_sum_eq(array[int] of var bool: x, var int: c) = bool_lin_eq([1 | i in index_set(x)],x,c); predicate bool_sum_ne(array[int] of var bool: x, var int: c) = bool_lin_ne([1 | i in index_set(x)],x,c); predicate bool_sum_le(array[int] of var bool: x, var int: c) = bool_lin_le([1 | i in index_set(x)],x,c); predicate bool_sum_lt(array[int] of var bool: x, var int: c) = bool_lin_lt([1 | i in index_set(x)],x,c); predicate bool_sum_ge(array[int] of var bool: x, var int: c) = bool_lin_ge([1 | i in index_set(x)],x,c); predicate bool_sum_gt(array[int] of var bool: x, var int: c) = bool_lin_gt([1 | i in index_set(x)],x,c); predicate float_sinh(var float: a, var float: b) = b == (exp(a)-exp(-a))/2.0; predicate float_cosh(var float: a, var float: b) = b == (exp(a)+exp(-a))/2.0; predicate float_tanh(var float: a, var float: b) = let { var float: e2a = exp(2.0*a) } in b == (e2a-1.0)/(e2a+1.0); predicate float_ne_reif(var float: a, var float: b, var bool: c) = not c <-> a==b; libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_global_cardinality_low_up_closed.mzn0000644000175000017500000000325113757304533031116 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-05-19 04:08:39 +1000 (Thu, 19 May 2011) $ by $Author: tack $ % $Revision: 12007 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_global_cardinality_low_up_closed(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_diffn.mzn0000644000175000017500000000335013757304533023443 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-06-04 01:27:50 +1000 (Sat, 04 Jun 2011) $ by $Author: tack $ % $Revision: 12041 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_nooverlap(array[int] of var int: x, array[int] of var int: w, array[int] of var int: y, array[int] of var int: h); predicate fzn_diffn(array[int] of var int: x, array[int] of var int: y, array[int] of var int: dx, array[int] of var int: dy) = gecode_nooverlap(x,dx,y,dy); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_all_different_int.mzn0000644000175000017500000000363013757304533026026 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_all_different_int(array[int] of var int: x); %predicate all_different_int(array[int] of var int: x) = gecode_all_different_int(x); predicate fzn_all_different_int(array[int] of var int: xs) = let { set of int: cs = {fix(x) | x in xs where is_fixed(x)}; array[int] of var int: ys = [x | x in xs where not is_fixed(x)]; constraint forall(y in ys, c in cs) (y != c); } in if length(ys) <= 1 then true elseif length(ys) == 2 then ys[1] != ys[2] else gecode_all_different_int(ys) endif; libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_member_int_reif.mzn0000644000175000017500000000320013757304533025475 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_member_int_reif(array[int] of var int: x, var int: y, var bool: b); predicate member_int_reif(array[int] of var int: x, var int: y, var bool: b) = gecode_member_int_reif(x,y,b); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_decreasing_bool.mzn0000644000175000017500000000267413757304533025504 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-05-19 04:08:39 +1000 (Thu, 19 May 2011) $ by $Author: tack $ % $Revision: 12007 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_decreasing_bool(array[int] of var bool: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_increasing_int.mzn0000644000175000017500000000267413757304533025361 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_increasing_int(array[int] of var int: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_member_int.mzn0000644000175000017500000000270213757304533024476 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_member_int(array[int] of var int: x, var int: y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_exactly_int.mzn0000644000175000017500000000276413757304533024710 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % include "count.mzn"; predicate fzn_exactly_int(int: n, array[int] of var int: x, int: v) = count(x, v, n); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_bin_packing.mzn0000644000175000017500000000331713757304533024624 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2010 % % Last modified: % $Date: 2013-07-19 10:50:31 +1000 (Fri, 19 Jul 2013) $ by $Author: tack $ % $Revision: 13902 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % include "bin_packing_capa.mzn"; predicate fzn_bin_packing(int: c, array[int] of var int: bin, array[int] of int: w) = let { set of int: idx = lb_array(bin)..ub_array(bin), array[idx] of int: capa = array1d(idx, [c|i in idx]) } in bin_packing_capa(capa,bin,w); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_member_bool.mzn0000644000175000017500000000270513757304533024642 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_member_bool(array[int] of var bool: x, var bool: y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_link_set_to_booleans.mzn0000644000175000017500000000331513757304533026552 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_link_set_to_booleans(var set of int: s, array[int] of var bool: b, int: idx); predicate fzn_link_set_to_booleans(var set of int: s, array[int] of var bool: b) = if min(index_set(b)) < 0 then forall(i in index_set(b)) ( b[i] <-> i in s ) else gecode_link_set_to_booleans(s,b,min(index_set(b))) endif libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_among.mzn0000644000175000017500000000271413757304533023461 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-08-22 05:22:06 +1000 (Mon, 22 Aug 2011) $ by $Author: tack $ % $Revision: 12325 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_among(var int: n, array[int] of var int: x, set of int: v); libminizinc-2.5.3/share/minizinc/gecode_presolver/redefinitions-2.0.mzn0000644000175000017500000000227213757304533024641 0ustar kaolkaol% This file contains redefinitions of standard builtins that can be overridden % by solvers. predicate bool_clause_reif(array[int] of var bool: as, array[int] of var bool: bs, var bool: b) = clause(as,bs++[b]) /\ forall (i in index_set(as)) (as[i] -> b) /\ forall (i in index_set(bs)) (bs[i] \/ b); predicate array_int_maximum(var int: m, array[int] of var int: x); predicate array_float_maximum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == max(x[i],y[i-1]) ); predicate array_int_minimum(var int: m, array[int] of var int: x); predicate array_float_minimum(var float: m, array[int] of var float: x) = let { int: l = min(index_set(x)), int: u = max(index_set(x)), float: ly = lb_array(x), float: uy = ub_array(x), array[l..u] of var ly..uy: y } in y[l] = x[l] /\ m = y[u] /\ forall (i in l+1 .. u) ( y[i] == min(x[i],y[i-1]) ); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_distribute.mzn0000644000175000017500000000350313757304533024533 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-05-19 04:08:39 +1000 (Thu, 19 May 2011) $ by $Author: tack $ % $Revision: 12007 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_distribute(array[int] of var int: card, array[int] of var int: value, array[int] of var int: base) = assert(index_set(card) == index_set(value), "distribute: card and value arrays must have identical index sets", forall (i in index_set(card)) ( bool_sum_eq([value[i] == base[j] | j in index_set(base)], card[i]) ) ); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_member_bool_reif.mzn0000644000175000017500000000321513757304533025644 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_member_bool_reif(array[int] of var bool: x, var bool: y, var bool: b); predicate fzn_member_bool_reif(array[int] of var bool: x, var bool: y, var bool: b) = gecode_member_bool_reif(x,y,b); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_inverse.mzn0000644000175000017500000000330013757304533024023 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_inverse_offsets(array[int] of var int: f, int: foff, array[int] of var int: invf, int: invfoff); predicate fzn_inverse(array[int] of var int: f, array[int] of var int: invf) = gecode_inverse_offsets(f, min(index_set(invf)), invf, min(index_set(f))); libminizinc-2.5.3/share/minizinc/gecode_presolver/precedence.mzn0000644000175000017500000000314213757304533023574 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-07-12 21:52:11 +1000 (Tue, 12 Jul 2011) $ by $Author: tack $ % $Revision: 12175 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_precede(array[int] of var int: x, array[int] of int: c); predicate precedence(array[int] of var int: x) = forall (i in index_set(x)) (x[i] <= length(x)) /\ gecode_precede(x, [i|i in 1..length(x)]); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_at_most_set.mzn0000644000175000017500000000301513757304533024674 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_at_most_set(int: n, array[int] of var set of int: x, set of int: v) = bool_sum_le([x[i] == v | i in index_set(x)], n); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_at_least_int.mzn0000644000175000017500000000271213757304533025024 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_at_least_int(int: n, array[int] of var int: x, int: v); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_table_bool.mzn0000644000175000017500000000272513757304533024464 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_table_bool(array[int] of var bool: x, array[int, int] of bool: t); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_global_cardinality_low_up.mzn0000644000175000017500000000322013757304533027561 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2010-10-07 08:10:08 +1100 (Thu, 07 Oct 2010) $ by $Author: schulte $ % $Revision: 11466 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_global_cardinality_low_up(array[int] of var int: x, array[int] of int: cover, array[int] of int: lbound, array[int] of int: ubound); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_arg_min_int.mzn0000644000175000017500000000031213757304533024636 0ustar kaolkaolpredicate gecode_minimum_arg_int(array[int] of var int: x, var int: i); predicate fzn_minimum_arg_int(array[int] of var int: x, var int: i) = gecode_minimum_arg_int(x,(i-min(index_set(x)))::domain); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_nvalue.mzn0000644000175000017500000000267613757304533023661 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-08-18 17:42:10 +1000 (Thu, 18 Aug 2011) $ by $Author: tack $ % $Revision: 12312 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_nvalue(var int: n, array[int] of var int: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_all_equal_int.mzn0000644000175000017500000000267113757304533025173 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2010-03-31 19:18:34 +1100 (Wed, 31 Mar 2010) $ by $Author: tack $ % $Revision: 10618 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_all_equal_int(array[int] of var int: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_value_precede_int.mzn0000644000175000017500000000305713757304533026036 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2013-07-19 22:10:52 +1000 (Fri, 19 Jul 2013) $ by $Author: schulte $ % $Revision: 13911 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_precede(array[int] of var int: x, int: s, int: t); predicate fzn_value_precede_int(int: s, int: t, array[int] of var int: x) = gecode_precede(x,s,t); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_range.mzn0000644000175000017500000000403513757304533023452 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_range(array[int] of var int: x, int: xoff, var set of int: s, var set of int: t); predicate fzn_range(array[int] of var int: x, var set of int: s, var set of int: t) = assert(ub(s) subset index_set(x), "range: upper bound of 's' must be a subset of the index set of 'x'", if (min(index_set(x)) >= 0) then gecode_range(x,min(index_set(x)),s,t) else forall(i in ub(s)) (i in s -> x[i] in t) /\ forall(i in ub(t)) ( i in t -> exists(j in ub(s)) ( j in s /\ x[j] == i ) ) endif ); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_lex_lesseq_int.mzn0000644000175000017500000000320413757304533025371 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_array_int_lq(array[int] of var int: x, array[int] of var int: y); predicate fzn_lex_lesseq_int(array[int] of var int: x, array[int] of var int: y) = gecode_array_int_lq(x,y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_lex_less_bool.mzn0000644000175000017500000000317413757304533025212 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-04-11 14:59:27 +1000 (Wed, 11 Apr 2012) $ by $Author: tack $ % $Revision: 12730 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_array_bool_lt(array[int] of var bool: x, array[int] of var bool: y); predicate fzn_lex_less_bool(array[int] of var bool: x, array[int] of var bool: y) = gecode_array_bool_lt(x,y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_decreasing_int.mzn0000644000175000017500000000267213757304533025341 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2010-03-31 19:18:34 +1100 (Wed, 31 Mar 2010) $ by $Author: tack $ % $Revision: 10618 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_decreasing_int(array[int] of var int: x); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_exactly_set.mzn0000644000175000017500000000301513757304533024677 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_exactly_set(int: n, array[int] of var set of int: x, set of int: v) = bool_sum_eq([x[i] == v | i in index_set(x)], n); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_cumulative.mzn0000644000175000017500000000424713757304533024541 0ustar kaolkaol% % Main authors: % Guido Tack % Mikael lagerkvist % % Copyright: % Guido Tack, 2007 % Mikael Lagerkvist, 2009 % % Last modified: % $Date: 2011-03-08 19:54:48 +1100 (Tue, 08 Mar 2011) $ by $Author: tack $ % $Revision: 11787 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_cumulative(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b) = assert(index_set(s) == index_set(d) /\ index_set(s) == index_set(r), "cumulative: the 3 array arguments must have identical index sets", assert(lb_array(d) >= 0 /\ lb_array(r) >= 0, "cumulative: durations and resource usages must be non-negative", cumulatives(s, d, r, b) ) ); % Specialized cumulatives propagator is only for fixed bounds predicate cumulatives(array[int] of var int: s, array[int] of var int: d, array[int] of var int: r, var int: b); libminizinc-2.5.3/share/minizinc/gecode_presolver/gecode.mzn0000644000175000017500000001712613757304533022734 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2015-01-05 17:33:06 +1100 (Mon, 05 Jan 2015) $ by $Author: tack $ % $Revision: 14337 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % /*** @groupdef gecode Additional declarations for Gecode These annotations and predicates are available for the Gecode solver. In order to use them in a model, include the file "gecode.mzn". */ /*** @groupdef gecode.annotations Additional Gecode search annotations */ /** @group gecode.annotations Select variable with smallest accumulated failure count */ annotation afc_min; /** @group gecode.annotations Select variable with smallest accumulated failure count divided by domain size */ annotation afc_size_min; /** @group gecode.annotations Select variable with largest accumulated failure count */ annotation afc_max; /** @group gecode.annotations Select variable with largest accumulated failure count divided by domain size */ annotation afc_size_max; /** @group gecode.annotations Select variable with smallest activity count */ annotation activity_min; /** @group gecode.annotations Select variable with smallest activity count divided by domain size */ annotation activity_size_min; /** @group gecode.annotations Select variable with largest activity count */ annotation activity_max; /** @group gecode.annotations Select variable with largest activity count divided by domain size */ annotation activity_size_max; /** @group gecode.annotations Select random variable */ annotation random; /** @group gecode.annotations Specify default search strategy for integer variables to use variable selection strategy \a varsel, and value choice strategy \a valsel. */ annotation int_default_search(ann: varsel, ann: valsel); /** @group gecode.annotations Specify default search strategy for Boolean variables to use variable selection strategy \a varsel, and value choice strategy \a valsel. */ annotation bool_default_search(ann: varsel, ann: valsel); /** @group gecode.annotations Specify default search strategy for set variables to use variable selection strategy \a varsel, and value choice strategy \a valsel. */ annotation set_default_search(ann: varsel, ann: valsel); /** @group gecode.annotations Specify default search strategy for float variables to use variable selection strategy \a varsel, and value choice strategy \a valsel. */ annotation float_default_search(ann: varsel, ann: valsel); /** @group gecode.annotations Simple large neighbourhood search strategy: upon restart, for each variable in \a x, the probability of it being fixed to the previous solution is \a percentage (out of 100). */ annotation relax_and_reconstruct(array[int] of var int: x, int: percentage); /** @group gecode.annotations Simple large neighbourhood search strategy: upon restart, for each variable in \a x, the probability of it being fixed to the previous solution is \a percentage (out of 100). Start from an initial solution \a y. */ annotation relax_and_reconstruct(array[int] of var int: x, int: percentage, array[int] of int: y); /*** @groupdef gecode.constraints Additional Gecode constraints */ /** @group gecode.constraints Constrain \a z to be the intersection of all sets in \a y that are selected by \a x: \(i \in \a z \leftrightarrow \forall j \in \a x: (i \in \a y[j]) \) */ predicate gecode_array_set_element_intersect(var set of int: x, array[int] of var set of int: y, var set of int: z); /** @group gecode.constraints Constrain \a z to be the disjoint union of all sets in \a y that are selected by \a x: \(i \in \a z \leftrightarrow \exists j \in \a x: (i \in \a y[j]) \) and \( i \in \a x \land j \in \a x \land i\neq j \rightarrow \a y[i] \cap \a y[j]=\emptyset \) */ predicate gecode_array_set_element_partition(var set of int: x, array[int] of var set of int: y, var set of int: z); /** @group gecode.constraints Constrain \a z to be a subset of \a u, and \a z to be the intersection of all sets in \a y that are selected by \a x: \(i \in \a z \leftrightarrow \forall j \in \a x: (i \in \a y[j]) \) */ predicate gecode_array_set_element_intersect_in(var set of int: x, array[int] of var set of int: y, var set of int: z, set of int: u); predicate gecode_among_seq_int(array[int] of var int: x, set of int: S, int: l, int: m, int: n); predicate gecode_among_seq_bool(array[int] of var bool: x, bool: b, int: l, int: m, int: n); /** @group gecode.constraints Every subsequence of \a x of length \a l has at least \a m and at most \a n occurrences of the values in \a S */ predicate among_seq(array[int] of var int: x, set of int: S, int: l, int: m, int: n) = gecode_among_seq_int(x,S,l,m,n); /** @group gecode.constraints Every subsequence of \a x of length \a l has at least \a m and at most \a n occurrences of the values in \a S */ predicate among_seq(array[int] of var bool: x, bool: b, int: l, int: m, int: n) = gecode_among_seq_bool(x,b,l,m,n); predicate gecode_circuit_cost_array(array[int] of int: c, array[int] of var int: x, array[int] of var int: y, var int: z); predicate gecode_circuit_cost(array[int] of int: c, array[int] of var int: x, var int: z); /** @group gecode.constraints Constrains the elements of \a x to define a circuit where \a x[\p i] = \p j means that \p j is the successor of \p i. Additionally, constrain \a z to be the cost of the circuit. Each edge cost is defined by array \a c. The variables \a y[i] are constrained to be the edge cost of the node \a x[i]. */ predicate circuit_cost_array(array[int] of int: c, array[int] of var int: x, array[int] of var int: y, var int: z) = gecode_circuit_cost_array(c,[x[i]-min(index_set(x)) | i in index_set(x)], y,z); /** @group gecode.constraints Constrains the elements of \a x to define a circuit where \a x[\p i] = \p j means that \p j is the successor of \p i. Additionally, constrain \a z to be the cost of the circuit. Each edge cost is defined by array \a c. */ predicate circuit_cost(array[int] of int: c, array[int] of var int: x, var int: z) = gecode_circuit_cost(c, [x[i]-min(index_set(x)) | i in index_set(x)], z); predicate gecode_schedule_unary(array[int] of var int: x, array[int] of int: p); predicate gecode_schedule_unary_optional(array[int] of var int: x, array[int] of int: p, array[int] of var bool: m); predicate gecode_schedule_cumulative_optional(array[int] of var int: start, array[int] of int: duration, array[int] of int: usage, array[int] of var bool: m, int: capacity); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_global_cardinality_closed.mzn0000644000175000017500000000311613757304533027531 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2011-01-14 08:42:12 +1100 (Fri, 14 Jan 2011) $ by $Author: tack $ % $Revision: 11531 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_global_cardinality_closed(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_partition_set.mzn0000644000175000017500000000324513757304533025244 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_array_set_partition(array[int] of var set of int: S, set of int: universe); predicate fzn_partition_set(array[int] of var set of int: S, set of int: universe) = gecode_array_set_partition(S, universe); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_inverse_set.mzn0000644000175000017500000000404713757304533024707 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_inverse_set(array[int] of var set of int: f, array[int] of var set of int: invf, int: xoff, int: yoff); predicate fzn_inverse_set(array[int] of var set of int: f, array[int] of var set of int: invf) = forall(i in index_set(f)) ( f[i] subset index_set(invf) ) /\ forall(j in index_set(invf)) ( invf[j] subset index_set(f) ) /\ if (min(index_set(f)) >= 0 /\ min(index_set(invf)) >= 0) then gecode_inverse_set(f,invf,min(index_set(f)),min(index_set(invf))) else forall(i in index_set(f), j in index_set(invf)) ( (j in f[i] <-> i in invf[j]) ) endif; libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_arg_max_int.mzn0000644000175000017500000000031213757304533024640 0ustar kaolkaolpredicate gecode_maximum_arg_int(array[int] of var int: x, var int: i); predicate fzn_maximum_arg_int(array[int] of var int: x, var int: i) = gecode_maximum_arg_int(x,(i-min(index_set(x)))::domain); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_circuit.mzn0000644000175000017500000000322213757304533024015 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-10-22 09:04:10 +1100 (Mon, 22 Oct 2012) $ by $Author: tack $ % $Revision: 13159 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate gecode_circuit(int: offset, array[int] of var int: x); predicate fzn_circuit(array[int] of var int: x) = if min(index_set(x)) >= 0 then gecode_circuit(min(index_set(x)),x) else gecode_circuit(0,[x[i]-min(index_set(x)) | i in index_set(x)]) endif; libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_at_most_int.mzn0000644000175000017500000000271113757304533024675 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_at_most_int(int: n, array[int] of var int: x, int: v); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_disjoint.mzn0000644000175000017500000000270413757304533024202 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_disjoint(var set of int: s1, var set of int: s2); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_roots.mzn0000644000175000017500000000463613757304533023533 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2012-03-19 11:56:37 +1100 (Mon, 19 Mar 2012) $ by $Author: tack $ % $Revision: 12583 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % include "int_set_channel.mzn"; % i in z <-> exists (j in x) (i in y[j]) predicate gecode_array_set_element_union(var set of int: x, array[int] of var set of int: y, var set of int: z); predicate fzn_roots(array[int] of var int: x, var set of int: s, var set of int: t) = assert(ub(s) subset index_set(x), "roots: upper bound of 's' must be a subset of the index set of 'x'", if (min(index_set(x)) < 0 \/ min(ub(t)) < 1) then % All values in 's' must map to a value in 't'. forall(i in ub(s)) ( i in s -> x[i] in t ) /\ % All values in 't' must be mapped from a value in 's'. forall(i in ub(t)) ( i in t -> forall(j in index_set(x)) (x[j] == i -> j in s) ) else let { array[1..max(ub(t))] of var set of 0..max(index_set(x)): y, } in int_set_channel(x,y) /\ gecode_array_set_element_union(t,y,s) endif ); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_global_cardinality.mzn0000644000175000017500000000334613757304533026205 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2013-03-07 12:18:29 +1100 (Thu, 07 Mar 2013) $ by $Author: mears $ % $Revision: 13455 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_global_cardinality(array[int] of var int: x, array[int] of int: cover, array[int] of var int: counts); predicate global_cardinality_old(array[int] of var int: x, array[int] of var int: c) = global_cardinality(x,[i|i in index_set(c)],c); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_sort.mzn0000644000175000017500000000271413757304533023347 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_sort(array[int] of var int: x, array[int] of var int: y); libminizinc-2.5.3/share/minizinc/gecode_presolver/fzn_table_int.mzn0000644000175000017500000000307413757304533024321 0ustar kaolkaol% % Main authors: % Guido Tack % % Copyright: % Guido Tack, 2007 % % Last modified: % $Date: 2009-09-09 01:42:03 +1000 (Wed, 09 Sep 2009) $ by $Author: schulte $ % $Revision: 9689 $ % % This file is part of Gecode, the generic constraint % development environment: % http://www.gecode.org % % Permission is hereby granted, free of charge, to any person obtaining % a copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to % permit persons to whom the Software is furnished to do so, subject to % the following conditions: % % The above copyright notice and this permission notice shall be % included in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. % % predicate fzn_table_int(array[int] of var int: x, array[int, int] of int: t) = fzn_table_int(x, array1d(t)); predicate fzn_table_int(array[int] of var int: x, array[int] of int: t); libminizinc-2.5.3/CMakeLists.txt0000644000175000017500000000725713757304533015253 0ustar kaolkaolcmake_minimum_required(VERSION 3.4.0) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version") # Must be before project() # ------------------------------------------------------------------------------------------------------------------- # -- Project information and versioning. project(libminizinc VERSION 2.5.3 LANGUAGES CXX C) if(NOT BUILD_REF) set(BUILD_REF "") endif() # ------------------------------------------------------------------------------------------------------------------- # -- Project build options # Static vs. Dynamic linking option(CPlex_PLUGIN "Build CPLEX binding as a plugin" ON) option(Gurobi_PLUGIN "Build Gurobi binding as a plugin" ON) # Enforce non proprietary build option(USE_PROPRIETARY "Enable static linking of proprietary solvers" OFF) if(NOT USE_PROPRIETARY) set(CPLEX_PLUGIN ON) set(GUROBI_PLUGIN ON) endif() # CMake options default value option(CMAKE_POSITION_INDEPENDENT_CODE "Default value for POSITION_INDEPENDENT_CODE of targets" TRUE) # ------------------------------------------------------------------------------------------------------------------- # -- CMake initialisation include(GNUInstallDirs) # Fix library suffixes for Web Assembly platform include(cmake/support/emscripten_setup.cmake) # Try to find possible dependencies list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif(POLICY CMP0074) find_package(CPlex) find_package(Geas) find_package(Gecode 6.0 COMPONENTS Driver Float Int Kernel Minimodel Search Set Support) find_package(Gurobi) find_package(OsiCBC) find_package(SCIP) find_package(Xpress) # Set build type when none is selected set(DEFAULT_BUILD_TYPE "Release") if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() # ------------------------------------------------------------------------------------------------------------------- # -- Compiler configuration include(cmake/support/ccache_setup.cmake) include(cmake/support/compiler_setup.cmake) configure_file( ${PROJECT_SOURCE_DIR}/include/minizinc/config.hh.in ${PROJECT_BINARY_DIR}/include/minizinc/config.hh ) install( FILES ${PROJECT_BINARY_DIR}/include/minizinc/config.hh DESTINATION include/minizinc ) # ------------------------------------------------------------------------------------------------------------------- # -- MiniZinc compilation targets. find_package(Threads REQUIRED) include_directories(${PROJECT_SOURCE_DIR}/include) include_directories(${PROJECT_BINARY_DIR}/include) # Libraries include(cmake/targets/libmzn.cmake) # Executables include(cmake/targets/minizinc.cmake) include(cmake/targets/mzn2doc.cmake) # ------------------------------------------------------------------------------------------------------------------- # -- Platform Specific configuration include(cmake/support/config_emscripten.cmake) # ------------------------------------------------------------------------------------------------------------------- # -- CMake configuration generation include(cmake/support/config_export.cmake) include(cmake/support/config_output.cmake) # ------------------------------------------------------------------------------------------------------------------- # -- Support Actions include(cmake/support/format.cmake) libminizinc-2.5.3/.clang-tidy0000644000175000017500000000246713757304533014545 0ustar kaolkaol--- Checks: '-*, bugprone-*, modernize-deprecated-headers, modernize-loop-convert, modernize-pass-by-value, modernize-redundant-void-arg, modernize-use-auto, modernize-use-emplace, modernize-use-nullptr, modernize-use-override, performace-*, readability-*, -readability-magic-numbers, # Allow the usage of direct number literals in expressions ' WarningsAsErrors: '*' HeaderFilterRegex: 'include/minizinc/[A-Za-z].*' FormatStyle: file CheckOptions: - key: readability-identifier-naming.ClassCase value: CamelCase - key: readability-identifier-naming.StructCase value: CamelCase - key: readability-identifier-naming.MethodCase value: camelBack - key: readability-identifier-naming.ClassMethodCase value: camelBack - key: readability-identifier-naming.FunctionCase value: lower_case - key: readability-identifier-naming.MemberCase value: camelBack - key: readability-identifier-naming.PrivateMemberCase value: camelBack - key: readability-identifier-naming.PrivateMemberPrefix value: _ - key: readability-identifier-naming.ProtectedMemberCase value: camelBack - key: readability-identifier-naming.ProtectedMemberPrefix value: _ ... libminizinc-2.5.3/solvers/0000755000175000017500000000000013757304533014175 5ustar kaolkaollibminizinc-2.5.3/solvers/mzn/0000755000175000017500000000000013757304533015001 5ustar kaolkaollibminizinc-2.5.3/solvers/mzn/mzn_solverinstance.cpp0000644000175000017500000001461513757304533021437 0ustar kaolkaol/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include using namespace std; namespace MiniZinc { MZNSolverFactory::MZNSolverFactory() { SolverConfig sc("org.minizinc.mzn-mzn", MZN_VERSION_MAJOR "." MZN_VERSION_MINOR "." MZN_VERSION_PATCH); sc.name("Generic MiniZinc driver"); sc.mznlibVersion(1); sc.description("MiniZinc generic MiniZinc solver plugin"); sc.requiredFlags({"-m"}); sc.tags({"__internal__"}); sc.supportsFzn(false); sc.supportsMzn(true); sc.needsSolns2Out(false); SolverConfigs::registerBuiltinSolver(sc); } string MZNSolverFactory::getDescription(SolverInstanceBase::Options* /*opt*/) { string v = "MZN solver plugin, compiled " __DATE__ " " __TIME__; return v; } string MZNSolverFactory::getVersion(SolverInstanceBase::Options* /*opt*/) { return MZN_VERSION_MAJOR; } string MZNSolverFactory::getId() { return "org.minizinc.mzn-mzn"; } void MZNSolverFactory::printHelp(ostream& os) { os << "MZN-MZN plugin options:" << std::endl << " -m, --minizinc-cmd \n the backend solver filename.\n" << " --mzn-flags , --minizinc-flags , --backend-flags \n" " Specify option to be passed to the MiniZinc interpreter.\n" << " --mzn-flag